我的应用程序只有波兰语字符串,它是应用程序的默认语言。 在这里,您可以看到放置在res / vaules下的示例复数:
<plurals name="number_of_vouchers">
<item quantity="one">%d kupon</item>
<item quantity="few">%d kupony</item>
<item quantity="many">%d kuponów</item>
<item quantity="other">%d kuponów</item>
</plurals>
这里有测试活动课程:
class DevTest : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dev_test)
val stb = StringBuilder()
for (j in 1..30) {
stb.append(resources.getQuantityString(R.plurals.number_of_vouchers, j, j) + "\n")
}
testTV.text = stb.toString()
}
}
在默认设置为波兰语语言的系统设置上,示例测试的样子如下所示: link
在默认设置为英语语言的系统设置上,示例测试的样子如下(即使应用仅使用波兰语也无法使用):
您可以看到,对于英语系统语言,它已被删除
<item quantity="few">%d kupony</item>
即使应用只有一种语言,也不是英语。
答案 0 :(得分:1)
根据Android官方文档here
很少:当语言需要对“小”数字进行特殊处理时 (如捷克语中的2、3和4;或以2、3或4结尾的数字,但不包括 波兰语中的12、13或14)。
因此,在Polish
中。如果数字以2,3,4(但不是12,13,14)结尾,则采用few
的复数形式。
---编辑-
对于您的应用程序,唯一的语言是波兰语。(在res/values
下)。现在,当您的系统语言完善时。这些复数将被视为波兰语。所以它按照我的意思显示。现在,当您将系统语言更改为英语时。相同的复数形式将被视为英语。因此在22,23,24没有变化。这是因为在未定义任何特定资源类型的情况下,res/values
的行为与系统默认语言相同。
答案 1 :(得分:1)
例如,解决此问题是使用覆盖的语言环境包装上下文。例如:
companion object {
fun wrap(context: Context?, language: String): ContextWrapper {
if(context == null)
return CustomContextWrapper(context)
val config = context.resources.configuration
val sysLocale: Locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
getSystemLocale(config)
} else {
getSystemLocaleLegacy(config)
}
if (language.isNotEmpty() && !sysLocale.language.equals(language)) {
val locale = Locale(language)
Locale.setDefault(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale)
} else {
setSystemLocaleLegacy(config, locale)
}
return CustomContextWrapper(context.createConfigurationContext(config))
}
return CustomContextWrapper(context)
}
private fun getSystemLocaleLegacy(config: Configuration): Locale {
return config.locale
}
@TargetApi(Build.VERSION_CODES.N)
private fun getSystemLocale(config: Configuration): Locale {
return config.locales.get(0)
}
private fun setSystemLocaleLegacy(config: Configuration, locale: Locale) {
config.locale = locale
}
@TargetApi(Build.VERSION_CODES.N)
private fun setSystemLocale(config: Configuration, locale: Locale) {
config.setLocale(locale)
}
}
并在Activity中调用,例如:
override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(CustomContextWrapper.wrap(newBase, "pl"))
}
已解决,感谢original fix link
我在Google的错误跟踪器上找不到该问题,因此我认为它可以正常工作。