我有一个用于本地通知的 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
?
答案 0 :(得分:2)
如果默认值中的字符串没有键/值,它将返回您指定的相同字符串,因此,如果它们相等,则意味着您可以指定默认值
let possibleBody = NSString.localizedUserNotificationString(forKey: key, arguments: nil)
self.body = possibleBody == key ? "defaultValue" : possibleBody
答案 1 :(得分:0)
@Sh_Khan 提出的解决方案有一个小缺点。如果在创建通知时您没有用户首选语言之一的翻译,则将显示默认值。如果后来用户添加了您的应用支持的新语言,现有通知将不会像它应该与 localizedUserNotificationString
一起使用那样调整其字符串。
遗憾的是,Apple 似乎不支持像普通本地化字符串那样直接为本地化通知字符串提供默认值。
我建议尽可能使用默认值作为通知键。在不可能使用@Sh_Khan 的解决方案的地方。