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

时间:2019-05-16 14:30:08

标签: ios swift nsstring default-value localizable.strings

我有一个用于本地通知的 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"

我期望的行为是,如果使用 localizable.strings 默认字符串分配给通知的主体>,如下所示:

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

我知道可以使用NSLocalizedString初始化器之一来实现,但是这样做,我会放弃使用NSString.localizedUserNotificationString的好处,而我不想这样做。有没有办法实现我想要的行为而无需使用NSLocalizedString

2 个答案:

答案 0 :(得分:2)

如果默认值中的字符串没有键/值,它将返回您指定的相同字符串,因此,如果它们相等,则意味着您可以指定默认值

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

答案 1 :(得分:0)

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

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

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