No iPhone, NSLocalizedString
retorna a sequência no idioma do iPhone. É possível forçar o NSLocalizedString
uso de um idioma específico para ter o aplicativo em um idioma diferente do dispositivo?
263
No iPhone, NSLocalizedString
retorna a sequência no idioma do iPhone. É possível forçar o NSLocalizedString
uso de um idioma específico para ter o aplicativo em um idioma diferente do dispositivo?
Respostas:
NSLocalizedString()
(e variantes dos mesmos) acessam a tecla "AppleLanguages"NSUserDefaults
para determinar quais são as configurações do usuário para os idiomas preferidos. Isso retorna uma matriz de códigos de idioma, sendo o primeiro o definido pelo usuário para o telefone e os subsequentes usados como fallbacks se um recurso não estiver disponível no idioma preferido. (na área de trabalho, o usuário pode especificar vários idiomas com um pedido personalizado em Preferências do sistema)Você pode substituir a configuração global do seu próprio aplicativo, se desejar, usando o método setObject: forKey: para definir sua própria lista de idiomas. Isso terá precedência sobre o valor definido globalmente e será retornado para qualquer código em seu aplicativo que esteja executando a localização. O código para isso seria algo como:
Isso tornaria o alemão o idioma preferido para o seu aplicativo, com inglês e francês como substitutos. Você gostaria de chamar isso algum dia no início da inicialização do seu aplicativo. Você pode ler mais sobre as preferências de idioma / localidade aqui: Tópicos de programação de internacionalização: obtendo o idioma e o local atuais
fonte
Tive o mesmo problema recentemente e não queria iniciar e corrigir todo o meu NSLocalizedString nem forçar o aplicativo a reiniciar para que o novo idioma funcionasse. Eu queria que tudo funcionasse como está.
Minha solução foi alterar dinamicamente a classe do pacote principal e carregar o pacote apropriado lá:
Arquivo de cabeçalho
Implementação
Então, basicamente, quando seu aplicativo iniciar e antes de carregar seu primeiro controlador, basta ligar para:
Quando o usuário alterar o idioma preferido na tela de configurações, basta chamá-lo novamente:
Para redefinir os padrões do sistema, basta passar nulo:
Aproveitar...
Para quem precisa de uma versão Swift:
fonte
Normalmente faço isso dessa maneira, mas você DEVE ter todos os arquivos de localização no seu projeto.
fonte
Não use no iOS 9. Isso retorna nulo para todas as strings passadas por ele.
Encontrei outra solução que permite atualizar as seqüências de idiomas, sem reiniciar o aplicativo e compatível com os geradores:
Coloque essa macro no Prefix.pch:
e sempre que você precisar de uma string localizada, use:
Para definir o idioma, use:
Funciona mesmo com salto de idioma consecutivo, como:
fonte
Como dito anteriormente, basta fazer:
Mas para evitar ter que reiniciar o aplicativo, coloque a linha no método principal de
main.m
, pouco antesUIApplicationMain
(...).fonte
NSAutoreleasePool * pool ..
ou alguns objetos liberados automaticamente vazarão.[[NSBundle mainBundle] URLForResource:withExtension:]
antes.O truque para usar um idioma específico, selecionando-o no aplicativo, é forçar o
NSLocalizedString
uso de um pacote específico, dependendo do idioma selecionado,aqui está o post que escrevi para esta localização de avanço de aprendizado em aplicativos iOS
e aqui está o código de uma localização avançada de exemplo de aplicativo em aplicativos iOS
fonte
O que você acha dessa solução para o Swift 3?
Uso simples:
fonte
Como Brian Webster menciona, o idioma precisa ser definido "em algum momento no início da inicialização do aplicativo". Pensei
applicationDidFinishLaunching:
doAppDelegate
deve ser um local adequado para fazê-lo, já que é onde eu faço todos os outros inicialização.Mas, como William Denniss menciona, isso parece ter efeito apenas depois que o aplicativo é reiniciado, o que é meio inútil.
Parece funcionar bem se eu colocar o código na função principal, no entanto:
Eu gostaria de receber comentários sobre isso.
fonte
[[NSUserDefaults standardUserDefaults] synchronize];
após ligarsetObject:forKey:
Eu gosto do melhor método de Mauro Delrio. Também adicionei o seguinte no meu Project_Prefix.pch
Portanto, se você quiser usar o método padrão (que usa NSLocalizedString), poderá fazer uma substituição rápida da sintaxe em todos os arquivos.
fonte
NSLocalizedString()
lê o valor da chaveAppleLanguages
nos padrões padrão do usuário ([NSUserDefaults standardUserDefaults]
). Ele usa esse valor para escolher uma localização apropriada entre todas as localizações existentes no tempo de execução. Quando a Apple cria o dicionário de padrões do usuário no lançamento do aplicativo, eles pesquisam o (s) idioma (s) preferido (s) nas preferências do sistema e copiam o valor a partir daí. Isso também explica, por exemplo, por que a alteração das configurações de idioma no OS X não afeta a execução de aplicativos, apenas nos aplicativos iniciados a partir de então. Uma vez copiado, o valor não é atualizado apenas porque as configurações são alteradas. É por isso que o iOS reinicia todos os aplicativos se você alterar o idioma.No entanto, todos os valores do dicionário de padrões do usuário podem ser substituídos pelos argumentos da linha de comando. Veja a
NSUserDefaults
documentação noNSArgumentDomain
. Isso inclui até mesmo os valores carregados no arquivo de preferências do aplicativo (.plist). É muito bom saber se você deseja alterar um valor apenas uma vez para o teste .Portanto, se você deseja alterar o idioma apenas para teste, provavelmente não deseja alterar seu código (se esquecer de removê-lo mais tarde ...), em vez disso, diga ao Xcode para iniciar seu aplicativo com parâmetros de linha de comando ( por exemplo, use a localização em espanhol):
Não é necessário tocar no seu código. Basta criar esquemas diferentes para idiomas diferentes e você pode iniciar o aplicativo rapidamente uma vez em um idioma e outra em outro, apenas alternando o esquema.
fonte
Options
como nas versões mais recentes do Xcode, que a Apple oferece: também.Eu vim com uma solução que permite que você use
NSLocalizedString
. Eu crio uma categoria deNSBundle
chamadaNSBundle+RunTimeLanguage
. A interface é assim.A implementação é assim.
Do que apenas adicionar importação
NSBundle+RunTimeLanguage.h
nos arquivos que usamNSLocalizedString
.Como você pode ver, eu armazeno meu languageCode em uma propriedade de
AppDelegate
. Isso pode ser armazenado em qualquer lugar que você desejar.A única coisa de que não gosto é um aviso que o
NSLocalizedString
marco redefiniu. Talvez alguém possa me ajudar a consertar essa parte.fonte
#undef NSLocalizedString
pouco antes#define
para desativar o avisoVersão rápida:
fonte
Em poucas palavras:
Localize seu aplicativo
É a primeira coisa que você precisa fazer para localizar seu aplicativo com pelo menos dois idiomas (inglês e francês neste exemplo).
Substituir NSLocalizedString
No seu código, em vez de usar
NSLocalizedString(key, comment)
, use uma macroMYLocalizedString(key, comment)
definida assim:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
Este
MYLocalizationSystem
singleton:Definir idioma do usuário
Quando o usuário alterou o idioma do aplicativo em francês, ligue para
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
Neste exemplo, esse método define o pacote localizado como fr.lproj
Retornar string localizada
Depois de definir o pacote localizado, você poderá obter a string localizada correta com este método:
Espero que isso ajude você.
Você encontrará mais detalhes neste artigo em NSWinery.io
fonte
Swift 3 extensões:
Uso:
fonte
No arquivo .pch para definir:
fonte
Talvez você deva complementar isso (no arquivo .pch após #import):
fonte
Solução Swift 3:
Deu alguns exemplos de códigos de idioma que podem ser usados. Espero que isto ajude
fonte
Você pode criar um subconjunto com o conjunto de cadeias localizadas com as quais deseja fazer isso e usá
NSLocalizedStringFromTableInBundle()
-las para carregá-las. (Suponho que esse conteúdo seja separado da localização normal da interface do usuário que você pode estar fazendo no aplicativo.)fonte
para o meu caso, eu tenho dois arquivos localizados, ja e en
e eu gostaria de forçá-lo a en se o idioma preferido no sistema nem en ou ja
vou editar o arquivo main.m
vou verificar se o primeiro preferido é en ou ja; caso contrário, alterarei o segundo idioma preferido para en.
fonte
Você pode fazer algo assim:
fonte
Com base na resposta do Tudorizer para alterar o idioma sem sair ou reiniciar o aplicativo.
Em vez de uma macro, use uma classe para acessar o idioma preferido para verificar se um código de idioma específico está presente.
Abaixo está uma classe usada para obter o pacote de idiomas atual que está funcionando no iOS 9:
Use a classe acima para referenciar um arquivo / imagem / vídeo / etc:
Altere o idioma in-line como abaixo ou atualize o método "changeCurrentLanguage" na classe acima para obter um parâmetro de string referente ao novo idioma.
fonte
No swift 4, eu o resolvi sem precisar reiniciar ou usar as bibliotecas.
Depois de tentar muitas opções, encontrei esta função, na qual você transmite a stringToLocalize (de Localizable.String, o arquivo de strings) que deseja traduzir e o idioma em que deseja traduzi-lo, e o que ele retorna é o valor para essa String que você possui no arquivo Strings:
Levando em conta essa função, criei essa função em um arquivo Swift:
Para acessar de todo o aplicativo e em cada sequência do restante dos ViewControllers, em vez de colocar:
Eu substituí-o por
Não sei se é o melhor caminho, mas achei muito simples e funciona para mim, espero que ajude!
fonte
Esta função tentará obter uma string localizada para o idioma atual e, se não for encontrada, a obterá no idioma inglês.
fonte
Eu queria adicionar suporte para um idioma que não é oficialmente suportado pelo iOS (não listado na seção Idioma nas configurações do sistema). Seguindo o Tutorial de internacionalização da Apple e algumas dicas aqui de Brian Webster e Geon, vim com esse pedaço de código (coloque-o em main.m):
Isso funciona bem para o código do Storyboard e do NSLocalizedString. O código pressupõe que o usuário terá a opção de alterar manualmente o idioma dentro do aplicativo posteriormente.
Obviamente, não esqueça de adicionar traduções apropriadas do Storyboard e traduções Localizable.strings (consulte o link para a página da Apple acima para saber como fazer isso).
fonte
Aqui está uma solução decente para esse problema e não requer a reinicialização do aplicativo.
https://github.com/cmaftuleac/BundleLocalization
Essa implementação funciona aprimorando o NSBundle. A idéia é que você substitua o método localizedStringForKey na instância do objeto NSBundle e chame esse método em um pacote diferente com um idioma diferente. Simples e elegante totalmente compatível com todos os tipos de recursos.
fonte
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
faça o que fizer, a melhor maneira é usar o short_name para o idioma especificado, ou seja: fr, en, nl, de, it, etc ... e atribuir o mesmo a um valor global.
faça com que uma exibição de selecionador apareça como um menu suspenso (combinação de um botão ao clicar no qual uma exibição de selecionador aparece abaixo com uma lista de idiomas) e selecione o idioma desejado. deixe o nome abreviado ser armazenado internamente. crie um arquivo .h + .m chamado LocalisedString.
Defina o valor global de short_name como igual ao valor obtido em LocalisedString.m Quando o idioma necessário for selecionado, atribua o NSBundlePath para criar subdiretórios do projeto para o idioma necessário. por exemplo, nl.proj, en.proj.
Quando a pasta específica do projetor for selecionada, chame a sequência localizada para o respectivo idioma e altere o idioma dinamicamente.
sem regras quebradas.
fonte
Para o Swift, você pode substituir o
main.swift
arquivo e definir a string UserDefaults antes de executar o aplicativo. Dessa forma, você não precisa reiniciar o aplicativo para ver o efeito desejado.emparelhado com a remoção do
@UIApplicationMain
seuAppDelegate.swift
arquivo.fonte