TIP: Localisation et formats de date Unicode sur iOS

Sur les appareils avec iOS, comme sur Mac OS, les dates sont affichées en fonction des paramètres choisis par l’utilisateur.
On peut croire au premier abord que la date et l’heure sont formatées en fonction de la langue du téléphone. Faux. Ces informations sont en réalité conditionnées par le choix de la « région » par l’utilisateur.
Petit guide sur l’affichage des dates/heure localisées dans un format personnalisé.

Petit point sur la terminologie :
La « langue » indique dans quelle langue l’appareil fonctionne. Une langue peut être utilisée dans plusieurs pays.
Pour différencier les dialectes d’une même langue, nous utilisons des « locales » ou « régions ». Celles-ci nous aident, par exemple, à interpréter correctement l’anglais des Etats-Unis et celui du Royaume-Uni.

C’est à partir de cette locale que beaucoup de paramètres sont personnalisés pour l’affichage. On pense aux nombres (séparateurs, décimales), aux devises (symbole, position), à l’heure (12/24h, AM/PM) ou encore à la date (ordre des composants).
Aujourd’hui, nous nous intéressons à l’affichage de la date et de l’heure en utilisant la région de l’utilisateur.

Pour afficher une date localisée, vous utilisez certainement :

NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc] init];
[_dateFormatter setDateStyle:NSDateFormatterShortStyle];
[_dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[_dateFormatter setDoesRelativeDateFormatting:relativeDateFormatting];
NSString *s = [_dateFormatter stringFromDate:[NSDate date]];

La chaine retournée est alors automatiquement traduite dans la locale de l’appareil executant l’application.
Les différents formats de date/heure sont les suivants :
NSDateFormatterNoStyle Indique aucun style. Rien ne sera affiché.
NSDateFormatterShortStyle Style court, généralement numérique. Exemples: « 11/23/37 » ou « 3:30 PM ».
NSDateFormatterMediumStyle Style moyen, avec du texte abrégé. Exemples: « Nov 23, 1937 » ou « 3:30:32 PM ».
NSDateFormatterLongStyle Style long, abc texte complet. Exemples: « November 23, 1937 » ou « 3:30:32 PM PST ».
NSDateFormatterFullStyle Style complet, avec tous les détails. Exemples: « Tuesday, April 12, 1952 AD » ou « 3:30:42 PM Pacific Standard Time ».

Il est alors impossible, avec ces seules options, de pouvoir afficher le nom du jour de manière abrégée par exemple.
Il faut donc utiliser un format personnalisé (custom date format). Le code suivant permet d’utiliser un format personnalisé.

NSDateFormatter *dateFormatter = [NSDateFormatter new];
    dateFormatter.dateFormat = @"dMMMy";

En utilisant ce code, on obtiendra la date avec le format « 1 Sept ». Attention, cette date ne respecte pas entièrement la locale car le format de sortie est identique à celui décrit dans le paramètre dateFormat.

La dernière étape consiste alors à localiser le format pour qu’il respecte la région de l’appareil. La ligne suivante effectue cette action pour vous.

NSString *localeFormatString = [NSDateFormatter dateFormatFromTemplate:@"dMMMy" options:0 locale:dateFormatter.locale];

Code complet pour un format personnalisé de date :

NSDateFormatter *dateFormatter = [NSDateFormatter new];
NSString *localeFormatString = [NSDateFormatter dateFormatFromTemplate:@"dMMMy" options:0 locale:dateFormatter.locale];
dateFormatter.dateFormat = localeFormatString;
NSString *s = [dateFormatter stringFromDate:[NSDate date]];

Exemples de résultats :

Locale dMMMy Date
fr_FR d MMM y 1 janv. 2015
en_US MMM d, y Jan 1, 2015
es_ES d MMM y 1 ene 2015

La liste suivante détaille les principaux caractères utilisables dans les modèles de formats.
y pour l’année. 1 « y » pour l’année complète, 2 « y » pour l’année sur deux caractères.
M pour le mois. 1 « M » pour le numéro du mois, 3 « M » pour le mois abrégé, 4 « M » pour le mois complet.
d pour le numéro du jour dans le mois.
E pour le nom du jour abrégé. 4 « E » pour le nom complet.
H pour l’heure au format [0-23]. h pour l’heure au format [1-12].
m pour les minutes.
a pour les sigles AM ou PM.

A noter que les formats des heures restent spécifiques à la locale. Passer dans le format un « a » n’aura aucun effet en fr_FR par exemple. De la même manière, le format 12h/24h est respecté par la locale, peu importe le « h » passé.
Le détail complet des caractères pour le format de date est spécifié sur la documentation Unicode 35 (version 31 prise en charge par iOS 7 et ultérieur). La version 31 est à digérer sur UNICODE LDML 35 (Dates).

Auteur: Benoit DELDICQUE

Actuellement en poste sur Strasbourg, je suis en charge de la conception et la réalisation d'applications iOS pour iPhone, iPad et iPod touch.

Articles similaires

Commentaires fermés.