Como alterar o idioma do aplicativo do iPhone durante o tempo de execução?

Existe uma maneira de alterar o idioma do aplicativo durante o tempo de execução?

Então, após a mudança, NSLocalizedString retorna imediatamente a string para o novo idioma.

O que estou fazendo agora é mudar o idioma usando o código abaixo:

 - (void)onChangeLanguage: (id)sender { NSArray *lang = [NSArray arrayWithObjects:((InfoWhatever *)sender).language, nil]; [[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *languages = [defaults objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languages objectAtIndex:0]; NSLog(@"Current language: %@", currentLanguage); } 

O idioma vai mudar, mas só depois de reiniciar o aplicativo.

Eu duvido que você possa fazer isso, até mesmo o aplicativo Configurações não pode fazê-lo.

(Quando você altera o idioma no aplicativo Configurações, a canvas fica preta e exibe “configuração de idioma …” e uma roda de progresso. Depois de uma longa espera, você está de volta no Springboard. Parece que o telefone é reinicializado.)

 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* languages = [userDefaults objectForKey:@"AppleLanguages"]; [languages insertObject:@"de" atIndex:0]; // ISO639-1 [[NSUserDefaults standardUserDefaults] synchronize]; 

O truque para usar um idioma específico selecionando-o no aplicativo é forçar o NSLocalizedString a usar um pacote específico, dependendo do idioma selecionado.

aqui está o post que escrevi para este http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

e aqui está o código de uma amostra de aplicativo https://github.com/object2dot0/Advance-Localization-in-ios-apps

Você consegue . Aqui está o caminho http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html

  1. Em resumo Baixe e adicione 2 arquivos ao projeto

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.h

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.m

2
#import "LocalizationSystem.h"

3

 - (IBAction)btnEnglishClicked:(id)sender { LocalizationSetLanguage(@"en"); } 

4 Depois de definir o idioma como acima

 AMLocalizedString(@"Key", nil) 

É isso .

Eu NSLocalizedString uma solução que permite usar o NSLocalizedString . Eu crio uma categoria de NSBundle chamada NSBundle+RunTimeLanguage . A interface é assim.

 // NSBundle+RunTimeLanguage.h #import  @interface NSBundle (RunTimeLanguage) #define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil] - (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName; @end 

A implementação é assim.

 // NSBundle+RunTimeLanguage.m #import "NSBundle+RunTimeLanguage.h" #import "AppDelegate.h" @implementation NSBundle (RunTimeLanguage) - (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName { AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"]; NSBundle *languageBundle = [NSBundle bundleWithPath:path]; NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil]; return localizedString; } @end 

Que apenas adicionar import NSBundle+RunTimeLanguage.h nos arquivos que usam NSLocalizedString .

Como você pode ver, eu armazeno meu languageCode em uma propriedade do AppDelegate . Isso pode ser armazenado em qualquer lugar que você quiser.

Esta única coisa que eu não gosto sobre isso é um aviso que NSLocalizedString marco redefinido. Talvez alguém possa me ajudar a consertar essa parte.

Simplesmente adicione estas linhas:

  #define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]] 1. NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@[@"en"] forKey:@"AppleLanguages"]; [defaults synchronize]; 2. _label.text = NSLocalizedStringFromTableInBundle(@"Key", nil, currentLanguageBundle, @""); 

tente isto: object_setClass ([NSBundle mainBundle], [MyBundle class]);

https://github.com/maximbilan/ios_language_manager/blob/master/README.md