cargando imágenes del package correcto al ubicar storyboards

Estoy tratando de agregar una opción para que el usuario cambie entre el idioma árabe e inglés desde el interior de la aplicación (sin tener que volver a configurar el idioma de todo el iPhone), he logrado hacerlo correctamente mediante este método en AppDelegate Archivo .m:

-(void)switchTolanguage:(NSString *)lang{ [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:lang] forKey:@"AppleLanguages"]; NSBundle *bnd = [NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:lang ofType:@"lproj" ]]; UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:bnd]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; self.window.rootViewController = initViewController; } 

UIButtons dos UIButtons en uno de los controlleres de vista en la aplicación para probar el método y funcionó bien: todos los UILabels , cadenas, etc. en el nuevo guión gráfico cargado (localizado) aparecen con el idioma correcto seleccionado pero con una exception : el nuevo guión gráfico cargado no toma (carga) sus imágenes localizadas, toma las imágenes del guión gráfico antiguo (antiguo package), es decir, si la aplicación se ejecuta actualmente en el package inglés y el usuario pulsó el button que cambia el idioma al árabe, la aplicación aparecerá con los controles y cadenas arábigos correctos, pero con imágenes en inglés, volver al inglés todo estará bien (cadenas, tags e imágenes en inglés …)

así es como se encuentra mi storyboard:

introduzca la descripción de la imagen aquí

y así es como se localiza cada image:

introduzca la descripción de la imagen aquí

¿Cómo puedo cargar las imágenes correctas del package cuando el usuario cambia el idioma de la aplicación?

ACTUALIZAR:
Aquí hay un enlace a un proyecto de ejemplo para lo que quiero decir, ejecute la muestra y notará cuándo cambia el idioma desde dentro de la aplicación, notará que la image no se puede cambiar … y también se dará count de que el storyboard localizado no carga la image correcta en su editor de layout …

PD no agrego comentarios de por qué utilizo este escenario para cambiar de idioma, porque es un requisito del cliente.

Tuve el mismo problema 🙁 .. y lo que funcionó para mí (para tales situaciones cambiar el idioma) ..

Tienes 2 posibilidades …

1) Si desea cambiar el guión gráfico (cambio dynamic), debe modificar todas sus salidas en cada Storyboard. Elija en su storyboard la image deseada ( con diferentes nombres ), tags, etc. Para mí, con imágenes localizadas (el mismo nombre), solo funcionó después del reinicio de la aplicación. Para el mismo nombre de img, intenté … "llamar" a la image específica … desde la carpeta específica de lproj (languageBundle) … pero no funcionó al cambiar el guión gráfico de AppDelegate ..

2) Puedes tener solo un storyboard … y cambiar solo las tags, la image, etc. … (según Localizable.strings), algo relacionado con esto … https://stackoverflow.com/a/12149553/1702413 También , debe tener un nombre de file diferente para las imágenes (para "cambiar en caliente")

No sé si un error … o qué es …

UPD

Tienes un pequeño proyecto https://dl.dropbox.com/u/19438780/test5%20copy2.zip con ambos …

Si está cambiando el guión gráfico (como usted), tendrá la misma ruta para languageBundle hasta que reinicie la aplicación. Entonces … debes hacer el cambio correcto en tu storyboard …

Por el segundo … puedes cambiar / recuperar salidas … desde languageBundle específico (carpetas lproj) ..

Para 1) … encontré un "truco" para sobrescribir el lenguajeBundle hasta el reinicio:

 -(id) initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; Lang2 = [languages objectAtIndex:0]; //NSString } return self; } 

e inicie los Outlets:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; NSString *path; if([Lang2 isEqualToString: @"ro"]) { path = [[NSBundle mainBundle] pathForResource:@"ro" ofType:@"lproj"]; NSLog(@"enc ro"); } else{ path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; NSLog(@"enc en"); } NSBundle* languageBundle = [NSBundle bundleWithPath:path]; //find and return the desinetworking string self.label.text=[languageBundle localizedStringForKey:@"kLabelText" value:@"" table:nil]; self.img.image = [UIImage imageNamed:[languageBundle localizedStringForKey:@"myImage" value:@"" table:nil]]; } 

Tienes que volver a cargar todas las vistas que contienen text multilingüe que no se pueden hacer como si la vista hiciera reference a objects en el controller, entonces el resultado es desconocido y muy probablemente se bloquee.

Un enfoque correcto y eficiente será tener un dictionary para cada idioma que pueda cambiar según el idioma seleccionado. Dibuja todo el text estático de esta manera, puedes volver a dibujarlo fácilmente cuando cambie el idioma. En el cambio de idioma publica una notificación a los controlleres para volver a dibujar la vista. Para las imágenes, puedes dibujarlas de forma similar o hacer reference a ellas que puedes cambiar.

Una cosa que puede hacer para las imágenes es tener una class de vista de image personalizada que también observe la notificación de cambio de idioma y automáticamente cargue la image adecuada. Lo mismo que puedes hacer para las tags.

Puedo codificar algo para ti si necesitas un ejemplo.

 NSBundle *bundle = [LocalizationSystem shanetworkingBundle]; //this get your current bundle NSString *imgPath = [bundle pathForResource:@"btn-Image" ofType:@"png" inDirectory:nil]; [self.btnTest setImage:[UIImage imageWithContentsOfFile:imgPath] forState:UIControlStateNormal];