Swift(iOS)中带占位符和多个支持的动态字符串

Aam*_*irR 9 ios swift

我是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>
Run Code Online (Sandbox Code Playgroud)

借助上述XML和以下Java:

res.getString(R.string.name, mailCount)

res.getQuantityString(R.plurals.name, mailCount, mailCount)
Run Code Online (Sandbox Code Playgroud)

这项工作是在Android中完成的,我正在寻找与Swift(iOS)相对应的解决方案

Aam*_*irR 11

1:安装项目Localizations,如截图所示项目有英语和俄语.

在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)

3:为每种语言本地化以上文件,请参见截图,该文件已本地化为英语和俄语语言:

在此输入图像描述

用法:

String(format: NSLocalizedString("NumberOfMessages", comment: ""), 1)
Run Code Online (Sandbox Code Playgroud)

输出:您有一条新消息.

String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)
Run Code Online (Sandbox Code Playgroud)

输出:您有2条新消息.

复数规则:在XML代码,通知<key>one</key><key>other</key>,在这里你可以使用zero,one,two,few,many,other取决于语言和您的要求.

有关语言特定复数规则的更多信息,请使用以下链接:http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html


Tom*_*per 5

该博客详细解释了复数的含义。带有IOS的代码示例。

在某些语言中,复数的作用方式与英语不同。某些语言不表示复数(例如日语),而其他语言则根据数量而定(例如俄语)。

为了使事情变得容易一些,iOS对不同的复数类型进行了如下分类:

  • 零。用于表示0数量。
  • 一。用于表示正好为1的数量。
  • 二。用于表示正好为2的数量。
  • 很少 用于表示大于2的少量,但这取决于语言。
  • 许多。用于指示大量数字,但这也取决于语言。

其他。用于表示上述类别未涵盖的每个数字。

并非所有语言都需要指定所有类别,因为所有类别的工作方式都不同。乍一看,英语似乎要求规则为零,一和多。但是,英语的复数规则将用一个或另一个来指定,因为除1以外的所有数字均被同等对待。

若要指定复数规则,您需要使用字符串字典(Localizable.stringsdict)而不是常规的Localizable.strings文件。实际上,您需要仍然存在.strings文件,以使.stringsdict工作,即使它为空。

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

<?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>number_of_days</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>%d day remaining</string>
                <key>other</key>
                <string>%d days remaining</string>
            </dict>
        </dict>
    </dict>  
    </plist> 
Run Code Online (Sandbox Code Playgroud)

这是如何在代码中引用复数:

let format = NSLocalizedString("number_of_days", comment: "")
let message = String.localizedStringWithFormat(format, numDays)
Run Code Online (Sandbox Code Playgroud)

再次感谢昆汀