Android Nougat忽略位于res / values-zh-rTW中的字符串资源

时间:2017-02-28 10:04:20

标签: android localization android-7.0-nougat

应用程序支持3种语言:

  • 简体中文
  • 繁体中文

资源分别位于目录中:

  • RES /值
  • RES /值-ZH-RCN
  • RES /值-ZH-RTW

在Nougat之前的版本中,所有版本都在文档的相应页面上进行了描述 - https://developer.android.com/guide/topics/resources/providing-resources.html

目前在Nougat上,当用户将设备切换到任何简体中文语言时,使用来自values-zh-rCN的资源。但是,当用户将设备语言切换到繁体中文应用程序中的任何一个仍然使用来自values-zh-rCN的值时(如果假设缺少传统资源,则看起来像有效行为)。最后,如果我从项目中删除目录值-zh-rCN,应用程序将完全忽略传统资源并使用默认的英文资源。

有没有人遇到过这样的问题,除了向Google报告错误之外还有解决方案吗?

1 个答案:

答案 0 :(得分:1)

好的,我已经报告了这个错误 - https://code.google.com/p/android/issues/detail?id=235561 现在,我已经实现了这种解决方法,也许有人会发现它很有用。
首先,我们需要创建一个侦听系统语言更改的BroadcastReciever:

private class LanguageChangeReceiver extends BroadcastReceiver {

    public static boolean isNougatTraditionalChinese() {
    return isNougat() && Locale.getDefault().toLanguageTag().contains("zh-Hant");
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (!application.getConfiguration().isLanguageSet()) {
            if (isNougatTraditionalChinese()) {
                String[] supportedLangTags = context.getResources().getStringArray(R.array.language_values);
                application.getConfiguration().setLanguagePreference(supportedLangTags[2]);
                application.updateLanguage();
            }

        }
    }
}

...在应用程序语言更新中看起来大致相似......

private void updateLanguage(String langTag) {
    Locale myLocale = L10nUtils.createLocaleByTag(langTag);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

...并在上下文中注册BroadcastReciever ......

context.registerReceiver(new LanguageChangeReceiver(), new IntentFilter(Intent.ACTION_LOCALE_CHANGED));