NSDateFormatter et la langue actuelle dans iOS11

Il semble que le comportement par défaut de NSDateFormatter a été modifié dans iOS11. Ce code utilisé pour travailler et produit le formatting de date selon le langage iPhone / iPad actuellement sélectionné avant iOS11:

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

On dirait que dans iOS11 nous devons explicitement spécifier la propriété locale pour cela:

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

Quelqu'un peut-il confirmer mes conclusions?

Ce n'est pas un problème avec NSDateFormatter , c'est un changement dans la façon dont iOS 11 prend en charge la localization.

Sous iOS 11, [NSLocale currentLocale] ne renvoie que les langues sockets en charge par les localizations de votre application. Si votre application prend uniquement en charge l'anglais (en tant que localization de base), quelle que soit la langue sélectionnée par l'user sur l'appareil, currentLocale renvoie toujours l'anglais.

Sous iOS 10 et currentLocale antérieures, currentLocale représente directement la langue et la région de l'user, quelles que soient les localizations sockets en charge par votre application.

Les classs telles que NSDateFormatter par défaut NSLocale currentLocale . Ainsi, peu importe la langue que votre application prend en charge grâce à sa localization, des classs comme NSDateFormatter affichent du text dans la langue définie sur l'appareil, même si elle est différente de la langue utilisée par votre application.

iOS 11 corrige cette incohérence. Bien que l'on puisse prétendre que cette modification brise de nombreuses applications qui ne prennent en charge qu'un seul langage (ou seulement quelques-uns), elle rend l'application plus cohérente.

Pour rendre tout cela clair, considérons un exemple. Vous créez une application de test simple avec une localization de base en anglais. Si vous exécutez votre application avec iOS 10 et que la langue de l'appareil est définie sur Anglais, vous voyez évidemment le text en anglais et vous voyez des dates au format anglais. Si vous changez maintenant la langue de l'appareil en français et redémarrez l'application, l'user voit maintenant le text en anglais dans l'application (puisque c'est sa seule localization) mais les dates s'affichent maintenant avec les noms des mois et des jours de semaine.

Maintenant, exécutez 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 prend en charge que l'anglais et que currentLocale renvoie l'anglais, et non le français. Alors maintenant, l'user voit le text en anglais (en raison de la localization de l'application) et les dates sont maintenant encore en anglais.

Oui, le comportement par défaut est modifié dans iOS11 exactement comme @rmaddy décrit.

Dans mon cas, j'ai un projet avec une langue de développement basique en anglais mais, sur iOS11, quand je changeais la langue de l'appareil en n'importe quelle autre langue (disons suédois) les dates seraient toujours affichées comme, par exemple, le Monday 6 November . Cela est arrivé parce que mon application ne supportait aucune localization.

La solution était simple: pour que l'application affiche les dates en suédois, je devais simplement append un file Ssortingngs.ssortingngs vide puis, dans les parameters des projets, j'ai ajouté la localization suédoise. Bien que le file de strings soit vide, l'application est alors devenue localisée en suédois, donc en changeant la langue, dans les parameters, en suédois, on pouvait voir la même date que le måndag 6 november , atteignant ainsi le cas d'utilisation souhaité.

Remarque: si vous faites quelque chose comme ça et que cela ne fonctionne pas pour vous, lorsque vous ajoutez une langue dans les parameters du projet, allez dans "Autre" et choisissez une langue à partir de là (au lieu de simplement en choisir une dans le drop down menu). ).