¿Cómo cambiar el idioma de la aplicación de iPhone durante el tiempo de ejecución?

¿Hay alguna manera de cambiar el idioma de la aplicación durante el tiempo de ejecución?

Entonces, después del cambio, NSLocalizedString inmediatamente devuelve la cadena para el nuevo idioma.

Lo que estoy haciendo ahora es cambiar el idioma usando el siguiente código:

 - (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); } 

El idioma cambiará pero solo después de reiniciar la aplicación.

Dudo que puedas hacer esto, incluso la aplicación de Configuración no puede hacerlo.

(Cuando cambias el idioma en la aplicación Configuración, la pantalla se pone negra y muestra “idioma de configuración …” y una rueda de progreso. Después de una larga espera, vuelves a Springboard. Parece que el teléfono se reinicia).

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

El truco para usar un lenguaje específico al seleccionarlo de la aplicación es forzar a NSLocalizedString a usar un paquete específico dependiendo del idioma seleccionado,

aquí está la publicación que he escrito para este http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

y aquí está el código de una aplicación de ejemplo https://github.com/object2dot0/Advance-Localization-in-ios-apps

Puedes hacerlo . Aquí está el camino http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html

  1. En resumen, descargue y agregue 2 archivos al proyecto

    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 Después de configurar el idioma como se indica arriba

 AMLocalizedString(@"Key", nil) 

Eso es todo .

Se me ocurrió una solución que le permite usar NSLocalizedString . Creo una categoría de NSBundle llamada NSBundle+RunTimeLanguage . La interfaz es así.

 // 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 

La implementación es así.

 // 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 

Simplemente agregue la importación NSBundle+RunTimeLanguage.h en los archivos que usan NSLocalizedString .

Como puede ver, guardo mi AppDelegate de idioma en una propiedad de AppDelegate . Esto podría guardarse en cualquier lugar que desee.

Lo único que no me gusta es una advertencia de que NSLocalizedString marco redefinido. Quizás alguien podría ayudarme a arreglar esta parte.

Simplemente agregue estas líneas:

  #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, @""); 

intente esto: object_setClass ([NSBundle mainBundle], [MyBundle class]);

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