我有Localizable.stringsdict如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>archived_template</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>Note archived</string>
<key>other</key>
<string>%1$d archived</string>
</dict>
</dict>
<key>clear_lock_message_template</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>u</string>
<key>one</key>
<string>%u locked note will be permanently deleted!!!</string>
<key>other</key>
<string>%u locked notes will be permanently deleted!!!</string>
</dict>
</dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
%#@VARIABLE@令我惊讶的是,即使提供相同的输入String.localizedStringWithFormat,它也能够产生不同的输出。
//
// CASE 1: clear_lock_message_template
//
var formatString : String = NSLocalizedString("clear_lock_message_template", comment: "")
print("formatString : " + formatString)
var resultString : String = String.localizedStringWithFormat(formatString, 1)
print("resultString : " + resultString)
print()
formatString = NSLocalizedString("clear_lock_message_template", comment: "")
print("formatString : " + formatString)
resultString = String.localizedStringWithFormat(formatString, 2)
print("resultString : " + resultString)
print()
//
// CASE 2: archived_template
//
formatString = NSLocalizedString("archived_template", comment: "")
print("formatString : " + formatString)
resultString = String.localizedStringWithFormat(formatString, 1)
print("resultString : " + resultString)
print()
formatString = NSLocalizedString("archived_template", comment: "")
print("formatString : " + formatString)
resultString = String.localizedStringWithFormat(formatString, 2)
print("resultString : " + resultString)
Run Code Online (Sandbox Code Playgroud)
输出
formatString : %#@VARIABLE@
resultString : 1 locked note will be permanently deleted!!!
formatString : %#@VARIABLE@
resultString : 2 locked notes will be permanently deleted!!!
formatString : %#@VARIABLE@
resultString : Note archived
formatString : %#@VARIABLE@
resultString : 2 archived
Run Code Online (Sandbox Code Playgroud)
对于情况 1:clear_lock_message_template和情况 2:archived_template,我们使用%#@VARIABLE@作为String.localizedStringWithFormat输入。
但是,为什么它们能够产生不同的正确输出呢?
谢谢。
所有值的描述都是相同的。formatString但它们不是同一个对象。通过查看.stringsdict从 NSLocalizedString 返回的值不仅仅是一个字符串!它实际上是一个秘密对象类型,一个__NSLocalizedString\xe2\x80\x94,或者我喜欢称之为 NSLocalizedString。
让我们检查一下你的一个(使用 Objective-C):
\n\n这是什么???事实证明,在幕后, NSLocalizedString 携带了整个.stringsdict对应的<dict>条目。你可以明白为什么。这样,内部键名称(即)可用于在该字典中VARIABLE查找所需的信息。
因此,您的格式字符串之一有效地在其内部携带了整个字典:
\n<dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%#@VARIABLE@</string>\n <key>VARIABLE</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>u</string>\n <key>one</key>\n <string>Note archived</string>\n <key>other</key>\n <string>%1$d archived</string>\n </dict>\n</dict>\nRun Code Online (Sandbox Code Playgroud)\n与此同时,另一个则携带着一本完全不同的字典,即:
\n<dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%#@VARIABLE@</string>\n <key>VARIABLE</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>u</string>\n <key>one</key>\n <string>%u locked note will be permanently deleted!!!</string>\n <key>other</key>\n <string>%u locked notes will be permanently deleted!!!</string>\n </dict>\n</dict>\nRun Code Online (Sandbox Code Playgroud)\n在 Swift 中你无法用 simple 看到这个信息print,因为这个对象伪装成一个 String。然而,正如我们所看到的,它本身保存了这些额外的信息。所以结果是,当你打电话时String.localizedStringWithFormat使用该“格式字符串”(NSLocalizedString 对象)进行调用时,该调用只会直接查找该内部字典以查找 VARIABLE 键的相应信息。
这种架构除了巧妙之外,也是一件好事,因为否则每个内部键名称都必须是唯一的!
\n| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |