首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在处理Localizable.stringsdict时,为什么String.localizedStringWithFormat能够用相同的输入产生不同的输出?

在处理Localizable.stringsdict时,为什么String.localizedStringWithFormat能够用相同的输入产生不同的输出?
EN

Stack Overflow用户
提问于 2021-06-07 03:28:27
回答 1查看 159关注 0票数 0

我有一个Localizable.stringsdict,如下所示

代码语言:javascript
运行
复制
<?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>

我感到惊讶的是,即使向%#@VARIABLE@提供相同的输入String.localizedStringWithFormat,它也能够产生不同的输出。

代码语言:javascript
运行
复制
//
// 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)

输出量

代码语言:javascript
运行
复制
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

对于CASE 1: clear_lock_message_templateCASE 2: archived_template,我们使用%#@VARIABLE@作为String.localizedStringWithFormat输入。

但是,为什么它们能够产生不同的正确产出呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-07 06:11:50

所有formatString值的描述都是相同的。但它们不是同一个对象。通过查看NSLocalizedString从.stringsdict中得到的值不仅仅是字符串!实际上,它是一个秘密对象类型,一个__NSLocalizedString --或者,我喜欢称之为NSLocalizedString。

让我们检查一下您的一个(使用目标C):

这是什么?结果是,在遮罩下,一个NSLocalizedString在其内部携带了整个.stringsdict对应的<dict>条目。你也能明白为什么。这样,可以使用内部密钥名(即VARIABLE)在该字典中查找所需的信息。

因此,您的格式字符串之一有效地承载了整个字典的内部:

代码语言:javascript
运行
复制
<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>

与此同时,另一本字典则完全不同,即:

代码语言:javascript
运行
复制
<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>

您无法在Swift中使用简单的print看到这些信息,因为这个对象假装是字符串。然而,正如我们所看到的,它本身包含着这个额外的信息。因此,当您使用该“格式字符串”( String.localizedStringWithFormat对象)调用NSLocalizedString时,该调用将直接查找该内部字典,以查找变量键的相应信息。

这种架构,除了巧妙的聪明之外,也是一件好事,因为否则每个内部键名都必须是唯一的!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67865613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档