iOS:复数和自定义语言环境

Posted

技术标签:

【中文标题】iOS:复数和自定义语言环境【英文标题】:iOS: plurals and custom locale 【发布时间】:2015-01-15 20:39:09 【问题描述】:

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

如果默认手机的语言环境设置为“en”,但在应用程序内部选择“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)

作为我得到的输出: 计数 = 1: "один файл" - 没错 for count = 2: "2 файла" - 也是正确的(来自“其他”类别) 对于 count = 6: "6 файла" - 错误,也来自“其他”类别,但应该来自“许多”

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

【问题讨论】:

【参考方案1】:

你应该使用钥匙:

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

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

其他适用于所有其他情况

【讨论】:

我知道应该如何填写 :) 它在默认情况下可以正常工作,但是在使用与系统语言不匹配的自定义语言环境时会出现问题(例如,如果系统语言 = 'en',但是我使用的是语言环境'ru',它有不同的规则,那么我会得到错误的结果)【参考方案2】:

这是一个很老的问题,但我也遇到过同样的问题,这就是我解决这个问题的方法:

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在特定语言的包中搜索。

【讨论】:

以上是关于iOS:复数和自定义语言环境的主要内容,如果未能解决你的问题,请参考以下文章

英语单词复数形式的Java API

vue 全局环境变量配置和自定义全局变量

SpringBoot2——指标监控actuator多环境切换Profile和自定义starter

XAML和自定义类

XAML和自定义类

XAML和自定义类