NSDateFormatter et la langue en cours dans iOS11
Il semble que le comportement par défaut de NSDateFormatter
a été modifié dans iOS11. Ce code utilisé pour travailler et produire date formatter selon le langage iPhone / iPad actuellement sélectionné avant iOS11:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
Ressemble à iOS11 nous avons à spécifier explicitement les paramètres régionaux de la propriété:
_dateFormatterInstance = [[NSDateFormatter alloc] init];
_dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
_dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];
quelqu'un Peut-il confirmer mes conclusions?
3 réponses
Ce n'est pas un problème avec NSDateFormatter
, c'est un changement dans la façon dont iOS 11 supporte la localisation.
Under iOS 11,[NSLocale currentLocale]
renvoie uniquement les langues supportées par les localisations de votre application. Si votre application ne supporte que l'anglais (comme la localisation de base), alors peu importe la langue que l'utilisateur sélectionne sur le périphérique, currentLocale
retournera toujours en anglais.
moins de 10 ans et plus tôt,currentLocale
représenteraient directement la langue et la région choisies par l'utilisateur, localisations supportées par votre application.
Classes telles que NSDateFormatter
par défaut à utiliser NSLocale currentLocale
. Donc, peu importe la langue que votre application supporte réellement par sa localisation, les classes comme NSDateFormatter
afficher le texte dans la langue définie sur l'appareil, même si elle était différente de la langue utilisée par votre application.
iOS 11 corrige cette incohérence. Alors que l'on pourrait soutenir que ce changement casse beaucoup d'applications qui ne prennent en charge qu'une (ou quelques) langue, il fait en fait application plus cohérente.
pour clarifier tout cela, considérons un exemple. Vous créez une application de test simple avec une localisation de base en anglais. Si vous lancez votre application avec iOS 10 et que la langue de l'appareil est réglée sur l'anglais, vous voyez évidemment du texte anglais et des dates formatées pour l'anglais. Si vous changez maintenant la langue de l'appareil au français et redémarrez l'application, l'utilisateur voit maintenant le texte anglais dans l'application (puisque c'est sa seule localisation) mais les dates montrent maintenant avec le français mois et en semaine, des noms.
maintenant lancez la même application sous iOS 11. Comme avec iOS 10, si la langue de l'appareil est l'anglais vous voyez tout en anglais. Si vous changez la langue de l'appareil en français et lancez l'application, iOS 11 voit que votre application ne supporte que l'anglais et currentLocale
retourne l'anglais, pas le français. Donc maintenant l'utilisateur voit le texte anglais (en raison de la localisation de l'application) et les dates sont maintenant aussi toujours en anglais.
cela semble en fait être plus un bug qu'un changement intentionnel de comportement dans iOS 11. Si vous n'avez qu'un seul jeu de langue, ce comportement n'est pas Locale.current
renvoie toujours la bonne langue et la bonne région même si votre application n'est pas localisée dans cette langue.
cependant, si vous avez plus d'une langue - comme le français et l'anglais-alors iOS 11 semble toujours favoriser l'anglais ou la langue supportée la plus proche dans votre application lorsque vous utilisez Locale.current
.
Locale.preferredLanguages
semble renvoyer la bonne information de langue-région, donc vous pourriez être en mesure de l'utiliser à la place.
voici un exemple montrant la sortie de Locale.current
et Locale.preferredLanguages
, montrant les incohérences.
ceci a été généré à partir d'une application qui ne supportait que l'anglais. Sur l'appareil, le français a été défini à la fois comme langue primaire et région, l'Anglais (Australie) étant défini comme langue secondaire dans la première exemple.
(Incorrect)Locale.current
avec plusieurs langues - notez comment l'anglais est la langue, quand il devrait être français et donc fr_FR
- identifier : "en_FR"
- kind : "current"
(Correct)Locale.preferredLanguages
avec plusieurs langues
- 0 : "fr-FR"
- 1 : "en-AU"
(Correct)Locale.current
avec le français comme seule langue
- 0 : "fr-FR"
(Correct)Locale.preferredLanguages
avec le français comme seule langue
- identifier : "fr_FR"
- kind : "current"
Oui, le comportement par défaut est modifié dans iOS11 exactement comme @rmaddy décrit.
dans mon cas, j'ai un projet avec un langage de développement de base défini à anglais mais, sur iOS11, quand j'ai changé la langue de l'appareil à n'importe quelle autre langue (par exemple le suédois) les dates seraient toujours affichées comme, par exemple,Monday 6 November
. Cela s'est produit parce que mon application ne supporte aucune localisation.
LA solution était simple: pour que l'application affiche les dates en suédois, j'ai juste eu à ajouter un vide Strings.strings
fichier et puis, dans les paramètres de projets, j'ai ajouté la localisation suédoise. Bien que le fichier strings soit vide, l'application est alors devenue localisée en Suédois donc en changeant la langue, dans les paramètres, en Suédois, nous pourrions voir la même date que