iOS 通知中的本地化?

Posted

技术标签:

【中文标题】iOS 通知中的本地化?【英文标题】:localization in iOS notifications? 【发布时间】:2011-01-05 21:36:34 【问题描述】:

我的应用运行良好,它使用本地通知。

我决定现在将应用程序国际化,并且一切正常,除了在更改设备语言之前设置为语言的通知。

我从包含本地化字符串的数组中填充通知中的消息,所以我认为当用户更改设备的语言时,通知中的字符串也会改变,但我错了。

如何最好地解决这个问题?我的 NSString 文本也应该是 NSLocalizationString 吗?

我的通知代码:

UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
return;
localNotif.fireDate = [alertTimes objectAtIndex:i];
localNotif.timeZone = [NSTimeZone defaultTimeZone];

NSString *text = [alertText objectAtIndex:i];

// Notification details
localNotif.alertBody = text;
// Set the action button
localNotif.alertAction = @"View";

localNotif.soundName = UILocalNotificationDefaultSoundName;
localNotif.applicationIconBadgeNumber = 1;

// Specify custom data for the notification
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
localNotif.userInfo = infoDict;

// Schedule the notification
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];

【问题讨论】:

我想补充一点,除了用以前的语言创建的本地通知外,所有字符串都在本地化。如果我发送新通知,它将使用新语言,但尚未触发的旧通知将使用旧通知。这是大多数用户不会遇到的问题,因为人们不会经常更改他们的语言,但那些更新到本地化版本的人会。 【参考方案1】:

我的 NSString 文本也应该是 NSLocalizationString 吗?

是的,我会这样做。

[alertTimes objectAtIndex:i] 替换为NSLocalizedString(@"alertTimes",[alertTimes objectAtIndex:i])。我假设您将字符串存储在与本地化字符串匹配的 alertTimes 数组中。

【讨论】:

只是为了澄清本地化文本的正确方法是 NSString *text = [NSString stringWithFormat:NSLocalizedString(@"alertTimes",@"%@"),[alertTimes objectAtIndex:i]];但这不是问题所在。除了以先前语言创建的本地通知外,所有字符串都在本地化。如果我发送新通知,它将使用新语言,但尚未发生的旧通知将使用旧通知。这是大多数用户不会遇到的问题,因为人们不会经常更改他们的语言,但那些更新到本地化版本的人会。 是的,您似乎无能为力来改变这一点。我建议在启动时检查语言环境并重新创建在以前的语言环境中创建的通知。 是的,这将是解决方法,我认为可能有一个适当的程序。【参考方案2】:

刚刚遇到同样的问题,发现 UNMutableNotificationContent 的 Apple Docs 说要使用 NSString. localizedUserNotificationString(forKey:arguments:) 函数,该函数会延迟加载本地化字符串,直到出现通知。这样,即使用户在安排通知和发送通知之间更改语言,字符串也会正确本地化。

“您在通知警报中显示的字符串应该针对当前用户进行本地化。虽然您可以使用 NSLocalizedString 宏从应用程序的资源文件中加载字符串,但更好的选择是使用 localizedUserNotificationString(forKey: NSString 的 arguments:) 方法。localizedUserNotificationString(forKey:arguments:) 方法延迟本地化字符串的加载,直到传递通知。因此,如果用户在传递通知之前更改语言设置,则警报文本将更新为用户的当前语言,而不是安排通知时设置的语言。"`

【讨论】:

这似乎是继 ios 13 和引入 per-app Preferred Language 之后的另一个问题。 NSString.localizedUserNotificationString(forKey:argument:) 的当前行为基于设备语言进行本地化,而不是应用程序的首选语言。我假设由于通知是应用内容的一部分,它应该根据应用的首选语言而不是设备语言进行本地化。【参考方案3】:

在本地化本地通知时始终使用localizedUserNotificationString(forKey:arguments:)。

本地化的“陷阱”是来自NSLocalizedString 的静态字符串无法正常工作,因为用户可能会在安排通知后切换语言。这会导致通知警报中显示错误的语言。

例如,在en-US 中安排了一个通知,并设置了英文复制字符串,在触发通知之前,用户将语言切换为jp,因为使用NSLocalizedString 生成了一个静态字符串,这是不可能的可以在触发通知之前更改。

localizedUserNotificationString(forKey: arguments:) 应该用于本地化通知内容的字符串文本,https://developer.apple.com/documentation/foundation/nsstring/1649585-localizedusernotificationstring。当通知即将显示时,从本地化字符串资源动态创建本地化字符串值。

【讨论】:

请查看我对@ben-patch 答案的评论,让我知道您的想法。

以上是关于iOS 通知中的本地化?的主要内容,如果未能解决你的问题,请参考以下文章

iOS为目录中的本地通知分配声音

Swift 中的本地通知在 iOS 7 上崩溃

iOS 13 中的本地通知 didReceive

iOS-Unity 中的计划本地通知

iOS 10 中的新 UserNotifications 是不是仍有 ~64 个本地通知限制?

iOS8中的本地通知触发代码可以吗?