Localization中的复数处理

Localization 之 复数(Plural)变化

处理本地化文本中,需要处理不同语言的复数情况,在iOS7中引入了stringsdict来处理这种情况。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>Remove</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@variable_0@</string>
            <key>variable_0</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>zero</key>
                <string>remove NO file</string>
                <key>one</key>
                <string>remove the file</string>
                <key>two</key>
                <string>remove %d files</string>
                <key>few</key>
                <string>remove %d files</string>
                <key>many</key>
                <string>remove %d files</string>
                <key>other</key>
                <string>remove %d files</string>
            </dict>
        </dict>
    </dict>
</plist>

Remove是用于NSLocalizedString的输入参数,它的值是一个 Dictionary。该Dictionary 包含2个或多个key:

  • NSStringLocalizedFormatKey: 用于声明变量,变量都以%#@开始,以@结束
  • 变量: 以NSStringLocalizedFormatKey中定义的变量名为key

接下来说明变量作为key时的value值:

  • NSStringFormatSpecTypeKey: 值必须为 NSStringPluralRuleType
  • NSStringFormatValueTypeKey: 声明变量的类型,如%d, %lu等
  • zero: 变量为0时的文字说明
  • one: 变量为1时的文字说明
  • few,many: 有些语言可以设置
  • other: 该值必须有,包含所有没有列举的情形

注意:

  1. other是必须的
  2. 英文系统中只需要 one, other
  3. stringsdict 文件本地化后,需要清理缓存,并有可能需要删除后方能

官方文档:StringsdictFileFormat