159 votos

¿Cómo NSLocalizedString a utilizar un lenguaje específico de la fuerza

en el iPhone NSLocalizedString devuelve la cadena en el lenguaje del iPhone. ¿Es posible obligar a NSLocalizedString a usar un lenguaje específico para tener la aplicación en un idioma diferente que el dispositivo?

175voto

Brian Webster Puntos 7516

NSLocalizedString() (y variantes de los mismos) acceder a la "AppleLanguages" llave en NSUserDefaults para determinar cuál es la configuración del usuario para los idiomas preferidos. Este devuelve un array con los códigos de idioma, siendo la primera de ellas la establecida por el usuario para su teléfono, y los sucesivos se usan como alternativas si el recurso no está disponible en el idioma preferido. (en el escritorio, el usuario puede especificar varios idiomas con una medida de pedidos en Preferencias del Sistema)

Se puede reemplazar la configuración global para su propia aplicación si desea mediante el uso de la setObject:forKey: método para establecer su propia lista de idiomas. Esta prevalecerá sobre el nivel global del conjunto de valor y ser devuelto a cualquier código en la aplicación que está realizando la localización. El código sería algo como:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate

Esto haría que el alemán el idioma preferido para su aplicación, con el inglés y el francés como alternativas. Se desea llamar a esto en algún momento temprano en la aplicación de inicio. Usted puede leer más acerca de language/locale preferencias aquí: la Internacionalización Temas de Programación: el inicio de la Actual Regional y de Idioma

111voto

Mauro Delrio Puntos 943

Generalmente hago esto de esta manera, pero usted debe tener todos los archivos de localización en su proyecto.

@implementation Language

static NSBundle *bundle = nil;

+(void)initialize {
 NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
 NSArray* languages = [defs objectForKey:@"AppleLanguages"];
 NSString *current = [[languages objectAtIndex:0] retain];
 [self setLanguage:current];

}

/*
  example calls:
  [Language setLanguage:@"it"];
  [Language setLanguage:@"de"];
*/
+(void)setLanguage:(NSString *)l {
 NSLog(@"preferredLang: %@", l);
 NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
 bundle = [[NSBundle bundleWithPath:path] retain];
}

+(NSString *)get:(NSString *)key alter:(NSString *)alternate {
 return [bundle localizedStringForKey:key value:alternate table:nil];
}

@end

36voto

Tudorizer Puntos 2647

He encontrado otra solución que permite actualizar las cuerdas de la lengua, sin reiniciar el app y compatible con genstrings:

Ponga esta macro en el Prefix.pch:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]

y donde alguna vez necesita una localizada uso de cuerdas:

NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"")

Para establecer el uso de la lengua:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];

Funciona incluso con el lenguaje consecutivo saltando como:

NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));

30voto

object2.0 Puntos 673

El truco para utilizar el lenguaje específico mediante la selección de la aplicación es la fuerza de la NSLocalizedString para uso específico de lote dependiendo del idioma seleccionado ,

aquí está el post que he escrito para este el aprendizaje de avanzar en la localización de aplicaciones de ios

y aquí está el código de una aplicación de muestra de anticipación de localización en aplicaciones de ios

30voto

Como decía anteriormente, haz:

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"el", nil] forKey:@"AppleLanguages"];

Pero para evitar tener que reiniciar la aplicación, colocar la línea en el método principal de main.m , antes UIApplicationMain (...).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X