可本地化的字符串和默认值

Localizable strings and default values

我有一个 struct 用于我的本地通知,其中 init 进入 localizable.strings 并且将 key 对应的值分配给通知的正文:

struct Notification {
    let identifier: String
    let body: String

init(withKey: String) {
    self.id = key
    self.body = NSString.localizedUserNotificationString(forKey: key, arguments: nil)
}

所以如果我的 localizable.strings 看起来像这样:

"testKey" = "Test Notification";

然后初始化一个新的 Notification 对象将产生以下结果:

let notification = Notification(withKey: "testKey")
print(notification.body)                        // prints "Test Notification"

但是,如果我用打字错误初始化通知,正文将只是打错的键:

let mistypedNotification = Notification(withKey: "tstKey")
print(mistypedNotification.body)                 // prints "tstKey"

我希望的行为是,如果初始化程序使用 [=33= 中当前不存在的键调用,则将 默认 字符串分配给通知正文]localizable.strings,如下:

let desiredNotification = Notification(withKey: "keyNotCurrentlyInLocalizableFile")
print(desiredNotification.body)           // prints "default string"

我知道这可以使用 NSLocalizedString 初始值设定项之一来实现,但在这样做时,我会放弃使用 NSString.localizedUserNotificationString 的好处,我不想这样做。有什么方法可以在不进入 NSLocalizedString 的情况下实现我想要的行为?

当 defaults 中的字符串没有 key/value 时,它 returns 与您指定的字符串相同,因此如果它们相等,则意味着您可以指定默认值

let possibleBody =  NSString.localizedUserNotificationString(forKey: key, arguments: nil) 
self.body = possibleBody == key ? "defaultValue" : possibleBody

@Sh_Khan 提出的解决方案有一个小缺点。如果您在创建通知时没有用户首选语言之一的翻译,则将显示默认值。如果稍后用户添加了您的应用程序支持的新语言,现有通知将不会调整其字符串以适应它,因为它应该与 localizedUserNotificationString.

一起使用

遗憾的是,Apple 似乎不支持为本地化通知字符串提供默认值的直接方式,就像它为普通本地化字符串所做的那样。

我建议尽可能使用您的默认值作为通知键。在不可能的地方使用 @Sh_Khan.

的解决方案