ios locale nsdateformatter ios11

NSDateFormatter y el idioma actual en iOS11



locale (3)

Parece que el comportamiento predeterminado para NSDateFormatter se ha cambiado en iOS11. Este código solía funcionar y producía un formateador de fecha según el idioma del iPhone / iPad seleccionado actualmente antes de iOS11:

_dateFormatterInstance = [[NSDateFormatter alloc] init]; _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];

Parece que en iOS11 tenemos que especificar explícitamente la propiedad del entorno:

_dateFormatterInstance = [[NSDateFormatter alloc] init]; _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone]; _dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];

¿Alguien puede confirmar mis conclusiones?


En realidad, esto parece ser más un error que un cambio intencional en el comportamiento en iOS 11. Si solo tiene un conjunto de idiomas, este comportamiento no está presente ya que Locale.current siempre devuelve el idioma y la región correctos, incluso si su aplicación no lo está. T Localizado a ese idioma .

Sin embargo, si tiene más de un idioma, como el francés y el inglés, entonces iOS 11 parece que siempre favorece el inglés o el idioma compatible más cercano en su aplicación cuando usa Locale.current .

Locale.preferredLanguages parece devolver la información correcta de la región del idioma, por lo que es posible que pueda usarla en su lugar.

A continuación se muestra un ejemplo que muestra la salida de Locale.current y Locale.preferredLanguages , que muestra las inconsistencias.

Esto se generó a partir de una aplicación que solo admite inglés. En el dispositivo, el francés se configuró como idioma principal y región, con el inglés (Australia) establecido como idioma secundario en el primer ejemplo.

(Incorrecto) Locale.current con varios idiomas: observe cómo inglés es el idioma, cuándo debería ser francés y, por lo tanto, fr_FR

- identifier : "en_FR" - kind : "current"

(Correcto) Locale.preferredLanguages con varios idiomas

- 0 : "fr-FR" - 1 : "en-AU"

(Correcto) Locale.current con el francés como único idioma

- 0 : "fr-FR"

(Correcto) Locale.preferredLanguages con el francés como único idioma

- identifier : "fr_FR" - kind : "current"


Esto no es un problema con NSDateFormatter , es un cambio en la forma en que iOS 11 admite la localización.

Bajo iOS 11, [NSLocale currentLocale] solo devuelve los idiomas admitidos por las localizaciones de su aplicación. Si su aplicación solo es compatible con el inglés (como la localización base), no importa qué idioma seleccione el usuario en el dispositivo, currentLocale siempre devolverá el inglés.

Bajo iOS 10 y versiones anteriores, currentLocale representaría directamente el idioma y la región elegidos por el usuario, independientemente de las localizaciones que admita su aplicación.

Clases como NSDateFormatter predeterminadas para usar NSLocale currentLocale . Por lo tanto, independientemente del idioma que su aplicación realmente admita a través de su localización, clases como NSDateFormatter mostrarían el texto en el idioma establecido en el dispositivo, incluso si era diferente del idioma que usa su aplicación.

iOS 11 corrige esta inconsistencia. Si bien se podría argumentar que este cambio rompe muchas aplicaciones que solo admiten un idioma (o solo algunos), en realidad hace que la aplicación sea más consistente.

Para aclarar todo esto, considere un ejemplo. Se crea una aplicación de prueba simple con una localización base en inglés. Si ejecuta su aplicación con iOS 10 y el idioma del dispositivo está configurado en inglés, obviamente verá el texto en inglés y verá las fechas en formato inglés. Si ahora cambia el idioma del dispositivo a francés y reinicia la aplicación, el usuario ahora ve texto en inglés en la aplicación (ya que esa es su única localización) pero las fechas ahora aparecen con los nombres de los días en francés y los días de la semana.

Ahora ejecute la misma aplicación en iOS 11. Al igual que con iOS 10, si el idioma del dispositivo es el inglés, verá todo en inglés. Si luego cambia el idioma del dispositivo a francés y ejecuta la aplicación, iOS 11 verá que su aplicación solo admite inglés y currentLocale devuelve el inglés, no el francés. Así que ahora el usuario ve texto en inglés (debido a la localización de la aplicación) y las fechas ahora también están en inglés.


Sí, el comportamiento predeterminado se cambia en iOS11 exactamente como lo describe @rmaddy.

En mi caso, tengo un proyecto con un idioma de desarrollo de base establecido en inglés , pero en iOS11, cuando cambié el idioma del dispositivo a cualquier otro idioma (por ejemplo, sueco), las fechas todavía se mostrarían como, por ejemplo, el Monday 6 November . Esto sucedió porque mi aplicación no admitía ninguna localización.

La solución fue simple: para que la aplicación mostrara las fechas en sueco, simplemente tuve que agregar un archivo Strings.strings vacío y luego, en la configuración de proyectos, agregué la localización sueca. Aunque el archivo de cadenas está vacío, la aplicación se localizó en sueco, así que al cambiar el idioma, en Configuración, a sueco, podríamos ver la misma fecha que måndag 6 november , logrando así el caso de uso deseado de iOS10.

Nota: si haces algo como esto y no funciona para ti, al agregar un idioma en la Configuración del proyecto, asegúrate de ir a "Otro" y elegir un idioma desde allí (en lugar de elegir uno de la lista desplegable de primer nivel). ).