UILocalNotification NSLocalizedString 使用设备的语言

Posted

技术标签:

【中文标题】UILocalNotification NSLocalizedString 使用设备的语言【英文标题】:UILocalNotification NSLocalizedString uses language of device 【发布时间】:2015-10-14 08:59:15 【问题描述】:

我们有一个本地化的应用程序。荷兰的许多用户将他们的设备设置为英语,并将其设置为荷兰语的第二语言。我们的应用程序中有一个语言选择菜单,因为 99.9% 的用户想要荷兰语交通信息而不是英语。因此,如果首选语言之一是荷兰语,我们将语言设置为荷兰语。

这很好用,除了 UILocalNotifications 和设备语言是英语(第二个是荷兰语)。我们的应用语言是荷兰语(但对于与系统语言不同的任何其他语言都应该是相同的)。

这就是我们如何将语言设置为特定选择的语言,在本例中为荷兰语(通过使用来自此线程 How to force NSLocalizedString to use a specific language 的答案):

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

这就是我们发送 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];

NSString var *message 是一个 LocalizedString 并且在调试该字符串时是荷兰语:

 (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

现在 ios 接收到这个 localNotification 并尝试将它翻译成英文。此翻译有效,因为该字符串位于本地化文件中。

如果消息不在翻译文件中(因为它有一个数字),或者如果我在消息末尾添加一个空格,它将不会在本地化文件中找到字符串并显示荷兰语通知。

iOS 尝试将 LocalNotification 翻译为系统语言(英语)而不是应用程序语言(荷兰语)似乎很奇怪。

Apple 的文档是这样说的:

alertBody 属性通知警报中显示的消息。

分配一个字符串,或者最好是一个本地化字符串键(使用 NSLocalizedString) 作为消息的值。如果这个值 属性为非零时,将显示警报。默认值为 nil (没有警报)。 Printf 样式的转义字符从 显示前的字符串;在 消息,请使用两个百分比符号 (%%)。

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

iOS 决定它是本地化字符串还是只是一个字符串,没有区别。

问题:当本地化文件中存在字符串时,如何确保所有本地通知都使用所选的用户语言(在本例中为荷兰语)而不是系统语言?

解决方法(只需在本地化字符串中添加一个空格):

localNotification.alertTitle = [NSString stringWithFormat:@"%@ ", NSLocalizedString(@"Some notifcation text", @"Notification text")];

【问题讨论】:

【参考方案1】:

谢谢,它解决了我的问题。使用[NSString stringWithFormat:@"%@ " 真的很管用!

notifyAlarm.alertBody = [NSString stringWithFormat:@"%@", NSLocalizedString(@"some text here", nil)];

【讨论】:

以上是关于UILocalNotification NSLocalizedString 使用设备的语言的主要内容,如果未能解决你的问题,请参考以下文章

创建有声无振动的 UILocalNotification

将 UILocalNotification 同步到 Watch

UILocalNotification 动画两次[重复]

检测从哪个 UILocalNotification 打开应用程序

UILocalNotification 特殊字符警报正文

UILocalNotification 触发日期计算