14

我需要在使用 Swift 用 Xcode 编写的 iOS 应用程序中添加多语言支持。我需要本地化

  1. 静态字符串
  2. 带占位符的字符串
  3. 复数(数量字符串)

例如下面在 Android 中我们在 XML 文件中添加命名字符串和复数形式:

<string name="static_string">Hello world!</string>
<string name="placeholder_string">You have %2$d new messages.</string>
<plurals name="plural_string">
    <item quantity="one">You have a new message.</item>
    <item quantity="other">You have %2$d new messages.</item>
</plurals>

并遵循 Java 以编程方式获取字符串:

res.getString(R.string.placeholder_string, mailCount)
res.getQuantityString(R.plurals.plural_string, mailCount, mailCount)

我正在寻找对应于 Swift (iOS) 的解决方案

4

2 回答 2

16

安装项目Localizations,如屏幕截图所示,该项目有英语和俄语两种语言。

在此处输入图像描述

1:创建一个名为Localizable.strings并添加以下行的文件

static_string="Hello world!";
placeholder_string="You have %d new messages.";

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">

<!-- FIRST PLURAL STRING -->
<dict>
    <key>plural_string</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>

<!-- NEXT PLURAL STRING -->
</plist>

接下来,本地化Localizable.stringsdict文件,如屏幕截图所示,该文件已本地化为英语和俄语:

在此处输入图像描述

用法:

NSLocalizedString("static_string", comment: "") // Hello world!

String(format: NSLocalizedString("placeholder_string", comment: ""), 5) // You have 5 new messages.

let plural = NSLocalizedString("plural_string", comment: "")
String(format: plural, 1) // You have a new message.
String(format: plural, 2) // You have 2 new messages.

复数规则:在 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

如果您不熟悉字符串格式https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html ,这篇文章也会有所帮助

于 2016-08-24T15:23:33.650 回答
4

这个博客非常详细地解释了复数的含义。带有IOS的代码示例。

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

为了方便起见,iOS 将不同的复数类型分类如下:

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

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

并非所有语言都需要指定所有类别,因为所有类别的工作方式不同。乍一看,英语似乎需要零、一和多的规则。但是,英语的复数规则将指定为 one 和 other,因为除 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)

再次感谢昆汀

于 2016-08-23T15:28:26.183 回答