iOS:复数和自定义区域设置

时间:2015-01-15 20:39:09

标签: ios iphone ios7 localization nslocale

我正在开发支持“en”和“ru”语言的应用,用户可以在应用内选择语言。

如果默认手机的语言环境设置为“en”,但内部app选择了“ru”语言,那么当尝试本地化复数句子时忽略'many'/'few'形式。所以它是由英国复数规则本地化的。

定义:

<key>%d files</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@files@</string>
        <key>files</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>один файл</string>
            <key>many</key>
            <string>%d файлов</string>
            <key>other</key>
            <string>%d файла</string>
        </dict>
    </dict>

本地化代码(手动创建'ru'语言环境):

let locale = NSLocale(localeIdentifier: "ru_RU")
String(format: NSLocalizedString("%d files", comment: ""),
                    locale: locale,
                    count)

作为输出我得到:
对于count = 1:“одинфайл” - 这是对的 对于count = 2:“2файла” - 它也是对的(来自“其他”类别)
对于count = 6:“6файла” - 错误,也来自“其他”类别,但应取自“很多”

如果我将手机的语言切换为俄语,则所有语言都正确本地化。

2 个答案:

答案 0 :(得分:0)

您应该使用密钥:

一个表示1 =одинфайл

少数 2-4 =2файла

所有其他情况

其他

答案 1 :(得分:0)

这是一个很老的问题,但是我也遇到了同样的问题,这就是我如何解决此问题:

let path = Bundle.main.path(forResource: "ru", ofType: "lproj")!
let bundle = Bundle(path: path)!
let localizedString = String(format: NSLocalizedString("%d files", bundle: bundle, comment: ""),
                                     locale: NSLocale(localeIdentifier: "ru_RU"),
                                     count)

主要思想是使NSLocalizedString以特定于语言的捆绑搜索。