Android根据设备语言设置应用程序语言

时间:2020-10-17 09:26:08

标签: android locale

我有一个应用程序,如果用户的设备语言设置为“ Slovak”,则该应用程序的语言为“ Slovak”,否则为EN。因此,语言不会在应用程序中发生变化,而是来自安装SK或EN。

 String languageToLoad  = Resources.getSystem().getConfiguration().locale.getLanguage();
 String lng = "sk".equals(languageToLoad) ? "sk" : "en";

 Locale locale = new Locale(lng);Locale.setDefault(locale);
 Configuration config = new Configuration();config.locale = locale;
 getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

我注意到,Configuration N中的语言环境已被弃用,Resources中的updateConfiguration(Configuration,DisplayMetrics)也已被android N弃用(我认为)。

但是由于某些原因,它仍然可以在更高版本的Android上使用,但Android Studio表示已弃用。

所以我试图分离代码:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        String languageToLoad  = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();
        String lng = "sk".equals(languageToLoad) ? "sk" : "en";
        Locale locale = new Locale(lng);Locale.setDefault(locale);
        Configuration config = new Configuration();config.setLocale(locale);
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    } else {
  String languageToLoad  = Resources.getSystem().getConfiguration().locale.getLanguage();
  String lng = "sk".equals(languageToLoad) ? "sk" : "en";

  Locale locale = new Locale(lng);Locale.setDefault(locale);
  Configuration config = new Configuration();config.locale = locale;
  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}

,但第一个条件(对于> = N)不正确,我不确定如何替换当前代码。仍然说updateConfiguration已过时。

即使我尝试getBaseContext().createConfigurationContext(config);也不会改变语言

2 个答案:

答案 0 :(得分:1)

当API> = N时,替换为:

getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

由此:

context.createConfigurationContext(config);

但是,您必须创建一个自定义上下文包装器,并确保重新启动活动。查看下一个接受的答案:

Android N change language programmatically

答案 1 :(得分:0)

好,所以我这样解决了:

在单独的java文件中创建了一个ContextWrapper:

public class ContextWrapper extends android.content.ContextWrapper {

public ContextWrapper(Context base) {
    super(base);
}

public static ContextWrapper wrap(Context context, Locale newLocale) {
    Resources res = context.getResources();
    Configuration configuration = res.getConfiguration();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        configuration.setLocale(newLocale);

        LocaleList localeList = new LocaleList(newLocale);
        LocaleList.setDefault(localeList);
        configuration.setLocales(localeList);

        context = context.createConfigurationContext(configuration);

    }  else {
        configuration.locale = newLocale;
        res.updateConfiguration(configuration, res.getDisplayMetrics());
    }

    return new ContextWrapper(context);
}

}

然后在我的MainActivity中像这样使用它:

     @Override
       protected void attachBaseContext(Context newBase) {

        String languageToLoad;
        String lng;
        Locale locale;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             languageToLoad = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();
        }
else {  languageToLoad  = Resources.getSystem().getConfiguration().locale.getLanguage();
        }

         lng = "sk".equals(languageToLoad) ? "en" : "sk";
         locale = new Locale(lng);Locale.setDefault(locale);

        Context context = ContextWrapper.wrap(newBase, locale);
        super.attachBaseContext(context);
    }

现在看起来工作正常