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

时间:2015-05-13 06:42:05

标签: 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>

借助上述XML并遵循Java:

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

res.getQuantityString(R.plurals.name, mailCount, mailCount)

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

2 个答案:

答案 0 :(得分:9)

1:设置项目Localizations,如截图中显示的项目有英语和俄语。

enter image description here

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>

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

enter image description here

用法:

String(format: NSLocalizedString("NumberOfMessages", comment: ""), 1)

输出:您有新消息。

String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)

输出:您有2条新消息。

多个规则:在XML代码中,请注意<key>one</key><key>other</key>,在这里您可以使用zeroone,{{1} },twofewmany取决于语言和您的要求。

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

答案 1 :(得分:3)

This blog explains非常详细地说复数是什么。使用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> 

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

let format = NSLocalizedString("number_of_days", comment: "")
let message = String.localizedStringWithFormat(format, numDays)

再次,信用转到Quentin