Swift(iOS)中带有占位符和复数支持的动态字符串

Swift(iOS)中带有占位符和复数支持的动态字符串,ios,swift,Ios,Swift,我是Swift和iOS编程新手,我遇到了一个关于Swift中带有占位符和复数支持的动态字符串的问题 例如,如果您有一个多语言应用程序,并且不想硬编码字符串、标签和消息等 我可以在Android中轻松完成此操作,在不同文件夹的XML文件中使用以下代码,Android设备将根据当前区域设置查找字符串: <string name="name">You have %2$d new messages.</string> <plurals name="name">

我是Swift和iOS编程新手,我遇到了一个关于Swift中带有占位符和复数支持的动态字符串的问题

例如,如果您有一个多语言应用程序,并且不想硬编码字符串、标签和消息等

我可以在Android中轻松完成此操作,在不同文件夹的XML文件中使用以下代码,Android设备将根据当前区域设置查找字符串:

<string name="name">You have %2$d new messages.</string>
<plurals name="name">
    <item quantity="one">You have a new message.</item>
    <item quantity="other">You have %2$d new messages.</item>
</plurals>
这项工作是在安卓系统中完成的,我正在寻找对应于Swift(iOS)的解决方案。

详细介绍了复数的含义。提供了IOS的代码示例

在某些语言中,复数形式的工作方式与汉语不同 英语。有些语言不表示复数(如日语), 而对于其他人来说,这个词会根据数量而变化(例如 如俄文)

为了让事情变得简单一点,iOS对不同的复数进行了分类 类型如下:

  • 零。用于表示0数量
  • 一个。用于表示正好为1的数量
  • 两个。用于表示正好为2的数量
  • 很少。用于表示大于2的小数量,但这取决于语言
  • 很多。用于表示大数字,但这也取决于语言
其他的。用于指示上面未包含的每个数字 类别

并非所有语言都需要所有类别 指定,因为所有的工作方式都不同。乍一看,它会 看来英语需要零、一、多规则。 然而,英语的复数规则将以一和二指定 其他,因为除1之外的所有数字都被同等对待

要指定复数规则,需要使用字符串字典 (Localizable.stringsdict)而不是常规的Localizable.strings 文件实际上,您需要保留.strings文件 为.stringsdict工作而演示,即使它是空的

在Xcode中,创建一个新的Plist文件,并将其命名 本地化.stringsdict。填充后,Plist中的原始数据 将如下所示:


同样,归功于

1:Setup project
本地化
,如屏幕截图所示,该项目使用英语和俄语

2:创建一个名为
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>NumberOfMessages</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@value@</string>
        <key>value</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>You have a new message.</string>
            <key>other</key>
            <string>You have %d new messages.</string>
        </dict>
    </dict>
</dict>
</plist>
输出:您有一条新消息

String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)
输出:您有两条新消息

复数规则:在XML代码中,请注意
one
other
,根据语言和您的要求,您可以在这里使用
zero
one
two
month
other


有关特定语言复数规则的更多信息,请使用以下链接:

很少免费转换代码,请自己尝试一下,如果遇到问题,我们将在这里提供帮助。Apple文档中的“复数规则属性”:如果占位符是另一个字符串而不是复数计数器,该怎么办?我在这里问了这个问题:这个解决方案在iOS 14中不起作用
let format = NSLocalizedString("number_of_days", comment: "")
let message = String.localizedStringWithFormat(format, numDays)
<?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>NumberOfMessages</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@value@</string>
        <key>value</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>You have a new message.</string>
            <key>other</key>
            <string>You have %d new messages.</string>
        </dict>
    </dict>
</dict>
</plist>
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 1)
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)