2009-08-07 14 views
14

Estoy trabajando en una aplicación localizada y todo funciona bien. El problema es que quiero permitir que el usuario seleccione específicamente el idioma para la aplicación específica, en la carpeta de configuración de la aplicación. Esto debería hacer que los usuarios tengan su teléfono configurado en un idioma (por ejemplo, francés) para configurar la aplicación para que funcione en inglés.Creando una aplicación de iPhone localizada pero permitiendo al usuario cambiar el idioma de la aplicación

Actualmente estoy usando NSLocalizedString para obtener una cadena localizada, pero al examinar todas las variaciones de la macro no encuentro una que me permita especificar el idioma.

¿Alguna idea de cómo hacerlo?

+0

¿Ha intentado utilizar 'initWithLocaleIdentifier:' para establecer la configuración usted mismo? Por ejemplo, para establecer la configuración regional en los Países Bajos, puede inicializar una configuración regional utilizando: NSLocale * locale = [[NSLocale alloc] initWithLocaleIdentifier: @ "nl_BE"]; – Dimitris

+0

Dudo que esto funcione, ya que solo crearía un objeto NSLocale para una configuración regional específica y no afectará la configuración regional "actual"/"activa" –

Respuesta

12

Hay una mejor manera de hacerlo. Puede forzar el idioma de este modo:

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

y deshacer esta configuración por:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

NB. normalmente tendrá que reiniciar la aplicación para que esto surta efecto.

considerar si es necesario llamar a [[NSUserDefaults standardUserDefaults] synchronize];

Estoy de acuerdo hay poca necesidad de permitir al usuario especificar un idioma. Sin embargo, la única excepción es poder anular el idioma y establecerlo en el idioma nativo del desarrollador. Si el usuario puede hablar el idioma del desarrollador (por ejemplo, inglés para mí), es posible que desee utilizar la aplicación en ese idioma, si las traducciones son incorrectas.

Hago referencia a esta respuesta: How to force NSLocalizedString to use a specific language (la respuesta en realidad no funciona para mí, pero siguiendo las ideas en los comentarios lo hice. Las cosas deshacer que resolví.

+1

Finalmente. Gracias –

1

La "experiencia de usuario" correcta es para que el usuario seleccione su idioma a través del panel de preferencias del sistema; no su aplicación (o el panel de configuraciones de su aplicación, etc.). No hay forma de anular este por aplicación y no queremos que ninguna aplicación cambie la configuración del sistema.

+0

Es un poco extraño querer ejecutar una aplicación en un idioma diferente de todas las otras aplicaciones. Me pregunto cuál es el razonamiento? –

+3

Acepto que, en general, usted es correcto, sin embargo, en un país multilingüe o para usuarios que hablan más de un idioma, a veces hay casos en los que me gustaría utilizar un idioma para una aplicación específica mientras el resto del teléfono está activado. Inglés. Un buen ejemplo podría ser un sitio como este desbordamiento de pila, que para mí debido al contenido aquí siempre querré ver en inglés en lugar de tal vez en Facebook, donde me quedaré con mi lengua materna. –

+0

Además, permitir un cambio de idioma en la aplicación es útil en escenarios de modo kiosco (lo cual tiene más sentido con las aplicaciones de iPad, no con las de iPhone. Pero aún así ...). –

15

Hay tres cuestiones aquí:

  • Cuerdas
  • Otros recursos (incluyendo ONE)
  • Los mensajes del sistema

el último es casi seguro que no puede arreglar, así que lo dejaremos ser. Aparecerán en el idioma del dispositivo.

Los otros dos son solucionables, pero tendrá que hacer más cosas a mano. En el caso de las cadenas, en lugar de crear una sola Localizable.strings y luego localizarla, cree tablas completamente separadas (English.strings, French.strings, etc.) Luego, use NSLocalizedStringFromTable(), pasando el idioma como la tabla.

Para NIB, hay dos enfoques. Puede colocar cada conjunto de NIB localizados en su propio Bundle y luego pasar ese Bundle en vez de nil a -initWithNibName:bundle:. Alternativamente, puede cargar manualmente los NIB después de encontrarlos con [NSBundle -pathForResource:ofType:inDirectory:forLocalization:].

+0

Gracias, esa es solo la respuesta aquí que en realidad es una respuesta a lo que pregunté. Su sugerencia parece lo suficientemente razonable y aprovecha el marco incorporado para la localización. Gracias –

+0

Esta es una respuesta fantástica. – Brandon

+1

Noté que la pregunta no dice nada acerca de hacer esto en tiempo de ejecución. La respuesta aprobada señala específicamente que requiere un reinicio de la aplicación. Esta respuesta le permite cambiar la configuración regional en tiempo de ejecución. Esto es exactamente lo que he estado buscando. Gracias. – Brandon

Cuestiones relacionadas