UILocalNotification NSLocalizedSsortingng utilise la langue de l'appareil

Nous avons une application localisée. Beaucoup d'users aux Pays-Bas ont leur appareil en anglais et en tant que seconde langue au néerlandais. Nous avons un menu de sélection de la langue dans notre application, car 99,9% des users veulent des informations sur le trafic hollandais et non en anglais. Par conséquent, nous définissons la langue en néerlandais si l'une des langues préférées est le néerlandais.

Cela fonctionne très bien sauf pour UILocalNotifications et la langue de l'appareil est l'anglais (le second est le néerlandais). Notre langue d'application est le néerlandais (mais devrait être la même pour toute autre langue différente de la langue du système).

Voici comment nous définissons la langue dans une langue choisie, dans cet exemple le néerlandais (en utilisant la réponse de ce fil Comment forcer NSLocalizedSsortingng à utiliser un langage spécifique ):

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:language, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate 

Voici comment nous envoyons un UILocalNotification:

 UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = message; if(notificationCategory != NULL) localNotification.category = notificationCategory; if(referenceDic != NULL) localNotification.userInfo = referenceDic; if(title != nil && [localNotification respondsToSelector:@selector(setAlertTitle:)]) { [localNotification setAlertTitle:title]; } [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 

Le message var * NSSsortingng est un LocalizedSsortingng et lorsque le debugging de cette string est en néerlandais:

  (lldb) po localNotification <UIConcreteLocalNotification: 0x15ce32580>{fire date = (null), time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Wednesday 14 October 2015 at 09 h 56 min 47 s Central European Summer Time, user info = (null)} (lldb) po localNotification.alertBody Flitsmeister heeft geconstateerd dat je niet meer onderweg bent en is automatisch uitgeschakeld. (lldb) po localNotification.alertTitle nil 

Maintenant, l'iOS reçoit cette notification locale et essaie de traduire cela en anglais. Cette traduction fonctionne parce que la string est dans le file de localization.

Si le message ne se trouve pas dans le file de traduction (car il contient un numéro) ou si j'ajoute un espace à la fin du message, il ne trouve pas la string dans le file de localization et affiche une notification néerlandaise.

Il semble étrange que iOS essaye de traduire la LocalNotification dans la langue du système (anglais) et non dans la langue de l'application (néerlandais).

La documentation d'Apple dit ceci:

alertBody Property Le message affiché dans l'alerte de notification.

Affectez une string ou, de preference, une key de string localisée (en utilisant NSLocalizedSsortingng) comme valeur du message. Si la valeur de cette propriété est non nulle, une alerte est affichée. La valeur par défaut est nulle (pas d'alerte). Les caractères d'échappement de style Printf sont supprimés de la string avant l'affichage; Pour inclure un symbole de pourcentage (%) dans le message, utilisez deux symboles de pourcentage (%%).

https://developer.apple.com/library/ios/documentation/iPhone/Reference/UILocalNotification_Class/#//apple_ref/occ/instp/UILocalNotification/alertBody

iOS décide si c'est une string localisée ou juste une string, il n'y a pas de différence.

Question: comment puis-je m'assurer que toutes mes notifications locales sont dans la langue de l'user choisie (Néerlandais dans cet exemple) au lieu de la langue système quand la string existe dans le file de localization?

Solution de contournement (ajoutez simplement un espace à la string localisée):

 localNotification.alertTitle = [NSSsortingng ssortingngWithFormat:@"%@ ", NSLocalizedSsortingng(@"Some notifcation text", @"Notification text")]; 

Merci, ça a réglé mon problème. L'utilisation de [NSSsortingng ssortingngWithFormat:@"%@ " fonctionne vraiment!

 notifyAlarm.alertBody = [NSSsortingng ssortingngWithFormat: @ "% @", NSLocalizedSsortingng (@ "du text ici", néant)];