Idioma predeterminado no inglés para la aplicación iOS

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) .

Existe un problema cuando el dispositivo no está configurado en uno de los idiomas que admitimos, por ejemplo, en mi teléfono 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 garantizar que la aplicación tenga el idioma predeterminado para los idiomas no compatibles? Usé este tutorial para configurar las configuraciones regionales para el proyecto. Esto incluye eliminar la configuración regional “inglesa” predeterminada que se crea cuando localiza por primera vez un archivo. En el archivo del proyecto, he agregado:

developmentRegion = de; 

Además, en Info.plist, tengo

 CFBundleDevelopmentRegion de 

Sin éxito

¡Cualquier idea sería apreciada!

La predeterminación de 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 de idioma establecida por el usuario.

Como no desea admitir el inglés, pero desarrolló la aplicación en inglés, lo más fácil que puede hacer es deshacerse de en.lproj inmediatamente después de comstackr. 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 para eliminar una localización específica :

Deje que Xcode cree la aplicación con todas las localizaciones actuales y justo antes de que se inicie la firma del código, elimine la carpeta en.lproj y todos los archivos localizados para ese idioma hayan desaparecido. Puede hacer esto fácilmente agregando una fase de comstackción Ejecutar script al destino, que contiene esta línea de código (es un script Bash):

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

La firma de código siempre entra en acción después de que se hayan completado todas las fases de comstackción, así que simplemente ponga esa fase de comstackción al final de sus fases actuales.

Tenga en cuenta que esto aumenta el tiempo de creació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 ti.


En cuanto a “la aplicación debe recurrir a alemán en el caso de que no exista una localización adecuada” :

La 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.

No me gusta publicar esta respuesta, ya que funciona en contra de las Pautas de interfaz humana de Apple. 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 manera de forzar a iOS usando ciertos idiomas en cierto orden. 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 se establece 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 actuales y decidir de forma predeterminada al alemán de la siguiente manera:

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

Tenga en cuenta que debe hacer esto en main.m antes de UIApplicationMain ; de lo contrario, debe reiniciar la aplicación para que este cambio surta efecto.

No puedo decir lo suficiente como para que nadie haga esto 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 usa un idioma predeterminado, el usuario no tiene la opción de cambiar su elección.

Pruebe esto en su función didFinishLaunchingWithOptions ()

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