2010-11-01 17 views
34

Estoy desarrollando una aplicación para un cliente en Europa. Soy un hablante de inglés en los Estados Unidos. Nuestra aplicación admite varios idiomas, pero no inglés. Tengo todas las cadenas en nuestra aplicación en archivos traducidos de Localized.strings, configurados correctamente para los diferentes idiomas, y todos funcionan bien cuando el dispositivo está configurado en el idioma correcto (el idioma del dispositivo es alemán = la aplicación está correctamente localizada para el alemán) .Idioma predeterminado no inglés para la aplicación iOS?

Existe un problema cuando el dispositivo no está configurado en uno de los idiomas que admitimos, por ejemplo, en mi teléfono que está configurado en inglés. Queremos que el teléfono vuelva al alemán en casos como este, pero eso no está sucediendo. Lo que estamos viendo es que el teléfono está utilizando el idioma que aparece más alto en la lista Idioma en la sección Internacional de Settings.app. Para mi teléfono, el idioma que no está en inglés más alto de la lista es el francés, de modo que cuando ejecuto la aplicación, está localizado en francés. Si cambio mi teléfono al alemán y luego al inglés (lo que cambia el orden en la lista de idiomas), la aplicación se ubica en alemán.

¿Cómo puedo asegurarme de que la aplicación tenga por defecto el alemán para los idiomas no admitidos? Usé this tutorial para configurar las configuraciones regionales del proyecto. Esto incluye eliminar la configuración regional "inglesa" predeterminada que se crea cuando localiza por primera vez un archivo. En el archivo de proyecto, he añadido:

developmentRegion = de; 

Además, en el Info.plist, tengo

<key>CFBundleDevelopmentRegion</key> 
<string>de</string> 

sin éxito.

¡Cualquier idea sería apreciada!

Respuesta

42

La predeterminación a un idioma en particular no es lo que debe esforzarse. Supongamos que un usuario japonés que vive en Francia y que habla con fluidez francés tiene su teléfono configurado en japonés. Su aplicación tendría el valor predeterminado en alemán, a pesar de tener una traducción al francés; Supongo que eso no es lo que quieres y ciertamente no es lo que el usuario quiere.

Por esta razón, sugiero respetar la priorización del idioma establecida por el usuario.

Dado que no desea admitir inglés, pero ha desarrollado la aplicación en inglés, lo más fácil que puede hacer es deshacerse de en.lproj justo después de compilar. Esto dejará la aplicación solo con los idiomas que planea admitir, y el iPhone elegirá el idioma más adecuado para el usuario, como se establece en los valores predeterminados de iPhone.


Hay una solución bastante sencilla a eliminación de una localización específica:

Let Xcode construir la aplicación con todos los presentes localizaciones y momentos antes de firma de código se activa elimina la carpeta en.lproj y todos localizada los archivos para ese idioma ya no están. Usted puede hacer esto mediante la adición de una secuencia de comandos Ejecutar construir fase a la meta, que contiene esta una línea de código (que es un script bash):

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

firma de código siempre se activa después de todo, construir fases se han completado, por lo que sólo pon esa fase de construcción al final de tus fases actuales.

Nota: Esto aumenta el tiempo de construcción porque Xcode recrea todos los archivos en inglés, por lo que es posible que desee deshabilitar este paso durante la prueba.

Espero que sea una solución viable para usted.


En cuanto "la aplicación debe caer de nuevo a Alemania en el caso de que una localización apropiada no existe":

pregunta es ¿qué es una localización apropiada? Si la tercera opción del usuario es el francés (después de 2 idiomas no admitidos), esta solución hará que la aplicación vuelva al francés, que es una localización adecuada. Más apropiado que configurar la quinta opción del usuario, alemán, a mano.

Lo que sucede cuando se inicia una aplicación es simple: el sistema operativo desciende la lista de idiomas de los usuarios, como se establece en Preferencias, hasta que encuentra una localización coincidente, y utiliza este idioma. La razón por la que muchas aplicaciones son por defecto en inglés y no en alemán es simplemente porque el inglés aparece en la mayoría de las listas de idiomas de los usuarios por encima del alemán. No hay una preferencia de idioma inherente al sistema. Si elimina la traducción al inglés, solo se incluyen los idiomas que desea admitir, y de estos idiomas se toma el que figura más arriba en la lista de un usuario.

+0

Pascal tiene la respuesta correcta: La aplicación volverá a caer a la siguiente localización más razonable; esto es por diseño, y es la forma en que se supone que todas las aplicaciones en iOS y Mac OS X funcionan. Tu aplicación no es especial. –

+2

Todavía estoy reflexionando sobre esta respuesta. Si bien esta es obviamente una respuesta bien pensada, al final del día, el requisito comercial sigue siendo que la aplicación debe volver al alemán en el caso de que no exista una localización adecuada; esto no es negociable con el cliente Lo que es interesante, y lo que estoy aludiendo en el título de mi pregunta, es que si la carpeta English.lproj se mantiene en el proyecto, se usa como un respaldo cuando no hay otra localización disponible.Si no puedo entender nada más, simplemente mantendré esa carpeta y copiaré los activos "de" allí. –

+2

No, el inglés tampoco es un valor predeterminado del sistema. Es simple, el sistema operativo tiene una lista de localizaciones, como se establece en las preferencias. Al iniciar una aplicación, busca las carpetas * .lproj correspondientes y utiliza la primera que coincide con un idioma de la lista. Es por eso que usa el inglés cuando no hay nada más cerca. ;) Pero sé otro truco, formulará una nueva respuesta ... – Pascal

13

No me gusta publicar esta respuesta ya que se ejecuta contra Directrices de interfaz humana de manzanas. Las localizaciones son algo que el usuario debe establecer, no es algo que la administración debe decidir, por lo que los gerentes que requieren un determinado idioma predeterminado no entienden nada y deben cambiar de negocio.

Dicho esto, hay una forma de obligar a iOS a usar ciertos idiomas en un orden determinado. Principalmente uso esto para depurar localizaciones sin la necesidad de configurar el idioma del dispositivo en otra cosa, si es posible usar esto para resolver el problema inexistente en esta pregunta, no puedo decirlo.

Hay una clave AppleLanguages en los valores predeterminados del usuario que dicta el orden de los idiomas que se utilizarán, normalmente establecido en el orden que el usuario establece en las preferencias de iOS. Si cambia este orden, la aplicación intentará encontrar localizaciones en ese orden primero. Lo que podría hacer es leer las preferencias de idioma actual y decidir por defecto a alemán como sigue:

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

Tenga en cuenta que lo que necesita hacer esto en main.m antes UIApplicationMain, de lo contrario, es necesario reiniciar la aplicación para que este cambio tenga efecto.

No puedo decir lo suficiente como para que nadie lo haga en una aplicación real, a menos que vaya por completo e implemente una configuración de preferencias que le permita al usuario cambiar el idioma manualmente. Si solo elige un idioma predeterminado, el usuario no tiene la opción de cambiar su elección.

+3

Tenemos un ejemplo del mundo real que no rompe ningún HIG o en absoluto. Además agradezco a Pascal por responder (aunque después de un exuso). Odio cuando las personas responden con una sugerencia/consejo/orientación que no es pertinente para la pregunta tecnológica: o responden, o no ... de todos modos, el caso: estamos desarrollando una aplicación para el mercado internacional (por lo tanto, está en inglés), pero tenemos que proporcionar una versión personalizada para un cliente italiano. La base de código es la misma, y ​​queremos ** forzar ** (según la solicitud del cliente) la versión personalizada en italiano. Independientemente de la configuración del usuario (es decir, en mi iPad de desarrollo) – zontar

+1

Esto es útil, pero si tengo la pantalla de inicio de lanzamiento con internacionalización, esto no aplica la imagen correcta, incluso si puse el código en main.m, ¿sabes cómo? puede arreglarlo? Gracias – JERC

+0

El HIG es un conjunto de Pautas (no Reglas) por una razón. En mi caso, la aplicación es una aplicación empresarial de punto de venta y necesita hacer negocios en la moneda de la ubicación de la tienda. Los precios recuperados de una base de datos de servidor son IN Euro, USD, Yen o lo que sea. Si el usuario establece la configuración regional en otra cosa, suceden cosas malas. Lamentablemente, mi aplicación no puede obtener el entorno local de la tienda (servidor a.k. hasta que ya pasamos de main.m. ¿Tengo alguna otra opción que no sea comparar la configuración regional del dispositivo con la que requiere la tienda y mostrar una alerta? –

-1

Pruebe esto en sus didFinishLaunchingWithOptions() la función

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
Cuestiones relacionadas