更改系统语言时,Android复数无法正常工作

时间:2018-07-31 06:09:44

标签: android string

我的应用程序只有波兰语字符串,它是应用程序的默认语言。 在这里,您可以看到放置在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

在默认设置为英语语言的系统设置上,示例测试的样子如下(即使应用仅使用波兰语也无法使用): enter image description here

您可以看到,对于英语系统语言,它已被删除

<item quantity="few">%d kupony</item>

即使应用只有一种语言,也不是英语。

2 个答案:

答案 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的行为与系统默认语言相同。

还请查看官方文档How Android finds the best-matching resource

答案 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的错误跟踪器上找不到该问题,因此我认为它可以正常工作。