代码之家  ›  专栏  ›  技术社区  ›  Ufkoku

设置默认区域设置

  •  0
  • Ufkoku  · 技术社区  · 7 年前

    我们的应用程序中默认有一个英语版本,以及其他几种语言的翻译版本。 当用户启动应用程序时,我们调用 Locale.setDefault() 将其设置为我们翻译的语言环境。例如,电话是用西班牙语运行的,但我们没有西班牙语翻译 Locale.setDefault(Locale.US) . 我们需要这个来设置时间格式,因为libs使用 Locale.getDefault() . 在android 24之前,它都能完美工作。Android 24“忽略” 场所setDefault() . 所有日期的格式都是设备语言,而不是应用程序语言。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ufkoku    7 年前

    因此,解决方案不仅是更改语言环境,而且还要更改配置内部的语言环境。

    在应用程序类中

    @Override
    protected void attachBaseContext(Context base) {
        LocaleUtil.getInstance().invalidateCurrentLocale(base);
        super.attachBaseContext(base);
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleUtil.getInstance().invalidateCurrentLocale(this);
    }
    

    这是LocaleUtil方法

    public void invalidateCurrentLocale(Context context) {
        updateResources(context,
                        getLocaleOrDefault(getConfigLocale(context.getResources().getConfiguration())));
    }
    
    public Locale getConfigLocale(Configuration configuration) {
        if (Build.VERSION.SDK_INT < 24) {
            return configuration.locale;
        } else {
            return configuration.getLocales().get(0);
        }
    }
    
    private Locale getLocaleOrDefault(Locale locale) {
        if (AVAILABLE_LOCALES.contains(locale)) {
            return locale;
        }
        return DEFAULT_LOCALE;
    }
    
    private void updateResources(Context context, Locale locale) {
        Locale.setDefault(locale);
    
        Resources res = context.getResources();
        Configuration config = new Configuration(res.getConfiguration());
        config.setLocale(locale);
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
    
        2
  •  1
  •   Stanislav Bondar    7 年前

    API 24中添加了新方法 setDefault (Locale.Category category,Locale newLocale) 使用 oficial docks