【问题标题】:Android Nougat ignores string-resources located in res/values-zh-rTWAndroid Nougat 忽略位于 res/values-zh-rTW 中的字符串资源
【发布时间】:2017-02-28 10:04:19
【问题描述】:

一个应用程序支持 3 种语言:

  • 英语
  • 简体中文
  • 繁体中文

资源分别位于目录中:

  • 分辨率/值
  • res/values-zh-rCN
  • res/values-zh-rTW

在牛轧糖之前的版本中,所有工作都按照文档相应页面上的描述 - https://developer.android.com/guide/topics/resources/providing-resources.html

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

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

【问题讨论】:

    标签: android localization android-7.0-nougat


    【解决方案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));
    

    【讨论】:

    • 能否指定数组 R.array.language_values 和 createLocaleByTag 方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多