Existe um equivalente Swift de NSLocalizedString(...)
? Em Objective-C
, geralmente usamos:
NSString *string = NSLocalizedString(@"key", @"comment");
Como posso conseguir o mesmo no Swift? Eu encontrei uma função:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
No entanto, é muito longo e nada conveniente.
ios
swift
localization
nslocalizedstring
RaffAl
fonte
fonte
NSLocalizedString("Cancel", comment: "Cancel button title")
aproveitar os valores padrão. É conveniente, eu acho.Respostas:
Eu uso a próxima solução:
1) criar extensão:
2) no arquivo Localizable.strings :
3) exemplo de uso:
desfrutar! ;)
--upd: -
para o caso de comentários, você pode usar esta solução:
1) Extensão:
2) no arquivo .strings:
3) usando:
fonte
genstrings
utilitário para gerar seus arquivos .strings.func localized(comment: String = "") -> String
assim torna-se menor e com comentários opcionais :)genstrings
isso?genstrings
só funciona em cadeias literais passadas para o NSLocalizedString. Com essa solução inteligente, você perde a capacidade de atualizar seus arquivos .strings usando agenstrings
ferramenta e, pelo menos para mim, isso significa que não poderei usar essa abordagem simplificada.O
NSLocalizedString
também existe no mundo do Swift.A
tableName
,bundle
evalue
os parâmetros são marcados com umadefault
palavra-chave que significa que podemos omitir esses parâmetros ao chamar a função. Nesse caso, seus valores padrão serão usados.Isso leva à conclusão de que a chamada do método pode ser simplificada para:
Swift 5 - nenhuma mudança, ainda funciona assim.
fonte
Wrap in NSLocalizedString
opção que facilita muito as coisas, apenas destacando o texto, clicando com o botão direito do mouse e selecionando o item de menu.Uma variação das respostas existentes:
Swift 5.1:
Você pode simplesmente usá-lo com ou sem comentário:
Observe que
genstrings
não funcionará com esta solução.fonte
Usando esta maneira, é possível criar uma implementação diferente para diferentes tipos (por exemplo, Int ou classes personalizadas como CurrencyUnit, ...). Também é possível procurar esse método usando o utilitário genstrings. Basta adicionar o sinalizador de rotina ao comando
extensão:
uso:
fonte
Versão Swift 3:) ...
fonte
Na verdade, você pode usar duas fases para traduzir seus textos em projetos Swift:
1) A primeira fase é usar a maneira antiga de criar todas as suas strings traduzíveis:
1.1) Então você deve usar genstrings para gerar Localizable.strings:
2) Depois, você deve usar esta resposta .
2.1) Use a opção "Localizar e substituir" do XCode com base na expressão regular. Quanto ao exemplo dado (se você não tiver comentários), a expressão regular será:
e substitua-o por
ou (se você tiver comentários)
e substitua-o por
Você é livre para jogar com regex e diferentes combinações de extensões, conforme desejar. A maneira geral é dividir todo o processo em duas fases. Espero que ajude.
fonte
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
parece menos rápido do que deveria parecer.String.localized
por outro lado, parece mais Swifty, mas você não pode usar ogesntrings
utilitário com ele, que é comumente usado para facilitar seu trabalho com a internacionalização. Meu argumento é que é muito fácil combinar as duas abordagens. Então, principalmente, é uma questão de legibilidade.genstrings
? Você substituir volta tudo.localized
porNSLocalizedString
?Criou um pequeno método auxiliar para casos em que "comentário" é sempre ignorado. Menos código é mais fácil de ler:
Coloque-o em qualquer lugar (fora de uma classe) e o Xcode encontrará esse método global.
fonte
Provavelmente, o melhor caminho é esse aqui .
e
então você pode usá-lo assim
para mim este é o melhor porque
fonte
static var Hello: String = { return NSLocalizedString("Hello") }
Quando você está desenvolvendo um SDK. Você precisa de alguma operação extra.
1) crie Localizable.strings como de costume no YourLocalizeDemoSDK.
2) crie as mesmas Localizable.strings em YourLocalizeDemo.
3) encontre o caminho do pacote do YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
ajuda a encontrar o pacote configurável no YourLocalizeDemoSDK. Se você usarBundle.main
, em vez disso, obterá um valor errado (na verdade, será a mesma string que a chave).Mas se você quiser usar a extensão String mencionada pelo dr OX . Você precisa fazer um pouco mais. A extensão de origem se parece com isso.
Como sabemos, estamos desenvolvendo um SDK,
Bundle.main
que receberá o pacote do pacote YourLocalizeDemo. Não é isso que queremos. Precisamos do pacote em YourLocalizeDemoSDK. Este é um truque para encontrá-lo rapidamente.Execute o código abaixo em uma instância NSObject em YourLocalizeDemoSDK. E você receberá o URL do YourLocalizeDemoSDK.
Imprima os dois URLs, você descobrirá que podemos criar a base bundleURLofSDK em mainBundleURL. Nesse caso, será:
E a extensão String será:
Espero que ajude.
fonte
Eu criei meu próprio tipo de ferramenta para gerar extrações de strings usando uma função de tradução personalizada
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Ele analisará todos os seus arquivos rápidos e exportará as seqüências de caracteres e os comentários no seu código para um arquivo .strings.
Provavelmente não é a maneira mais fácil de fazer isso, mas é possível.
fonte
Embora isso não responda ao problema de encurtamento, mas me ajudou a organizar as mensagens, criei uma estrutura para mensagens de erro como abaixo
Dessa forma, você pode organizar as mensagens e fazer com que as gerações funcionem.
E este é o comando genstrings usado
fonte
Útil para uso em testes de unidade:
Esta é uma versão simples que pode ser estendida a diferentes casos de uso (por exemplo, com o uso de tableNames).
Use-o assim:
Ou assim com um comentário:
fonte
Esta é uma melhoria na abordagem ".localized". Comece adicionando a extensão de classe, pois isso ajudará em todas as strings que você estava configurando programaticamente:
Exemplo de uso para seqüências de caracteres definidas programaticamente:
Agora, os arquivos de tradução de storyboard do Xcode tornam o gerenciador de arquivos confuso e também não lidam bem com atualizações no storyboard. Uma abordagem melhor é criar uma nova classe básica de etiquetas e atribuí-la a todos os seus rótulos de storyboard:
Agora, todos os marcadores que você adicionar e fornecer o padrão padrão no storyboard serão traduzidos automaticamente, desde que você tenha fornecido uma tradução para ele.
Você pode fazer o mesmo com o UIButton:
fonte
Quando você traduz, digamos, do inglês, onde uma frase é a mesma, para outro idioma em que é diferente (por causa do sexo, conjugações verbais ou declinação), a forma mais simples do NSString no Swift que funciona em todos os casos é os três argumentos. . Por exemplo, a frase em inglês "previous was" é traduzida de forma diferente para o russo no caso de "weight" ("предыдущ ий был") e para "cintura" ("предыдущ ая был а ").
Nesse caso, você precisa de duas traduções diferentes para uma fonte (em termos da ferramenta XLIFF recomendada na WWDC 2018). Você não pode consegui-lo com dois argumentos NSLocalizedString, onde "anterior era" será o mesmo para a "chave" e a tradução em inglês (ou seja, para o valor). A única maneira é usar a forma de três argumentos
onde chaves ("previousWasFeminine" e "previousWasMasculine") são diferentes.
Eu sei que o conselho geral é traduzir a frase como um todo, no entanto, às vezes é muito demorado e inconveniente.
fonte
Localização com idioma padrão:
fonte