Internacionalización base iOS: cambie el idioma en time de ejecución

Sabemos que esta es una pregunta antigua y dolorosa.

Si no lo sabes, déjame describir brevemente el problema. Supongamos que tenemos una aplicación y queremos usar la localización integrada xcode usando NSLocalizedString (), la forma estándar recomendada por Apple. Todo bien hasta que quieras cambiar el idioma en time de ejecución. No hay forma de forzar que la aplicación use otro idioma, Apple recomienda usar siempre el lenguaje del sistema o cargar y administrar manualmente los resources (por supuesto que no queremos hacerlo).

Desde aquí tienes muy pocas alternativas.

1) Pnetworkingeterminado del usuario

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

Esta key no está documentada pero está autorizada a hacerlo. El problema con este método es que el idioma se configurará solo después de reiniciar la aplicación. Desafortunadamente no puedes reiniciar la aplicación por ti mismo, deberás pedirle al usuario que lo haga.

2) Utilice algunas macros personalizadas como en este ejemplo . El problema con este método es que tendrás que adaptar toda tu base de código, los storyboards y los files nib no serán traducidos, la localización no funcionará en general porque la utilidad genstring que utiliza XCode reconoce solo las macros NSLocalizedStringXXX o terminarás ejecutando manualmente el genstring con algún paso posterior a la construcción.

3) Solución que intenté implementar, ajustando dentro de NSBundle. La idea es que anule el método localizedStringForKey en la instancia del object NSBundle y luego invoque este método en un package diferente con un idioma diferente. Ejemplo de uso:

 #import "BundleLocalization.h" ... [[BundleLocalization shanetworkingInstance] setLanguage:@"fr"]; 

o

 [BundleLocalization shanetworkingInstance].language = @"de"; NSLog(@"Application language: %@", [BundleLocalization shanetworkingInstance].language); 

Funciona, simple y elegante, totalmente compatible con todo tipo de resources. El código se puede encontrar aquí .

¿Alguien puede comentar sobre el aspecto legal de este enfoque con respecto a la política de Apple?