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:复数和自定义语言环境的主要内容,如果未能解决你的问题,请参考以下文章