Изменить язык приложения программно в Android - PullRequest
385 голосов
/ 25 мая 2010

Можно ли программно изменить язык приложения, все еще используя ресурсы Android?

Если нет, можно ли запросить ресурс на определенном языке?чтобы позволить пользователю изменить язык приложения из приложения.

Ответы [ 30 ]

2 голосов
/ 27 марта 2012

Ответ Алексея Волового работает только для меня, если используется метод действия onCreate.

Ответ, который работает во всех методах, находится в другой теме

Изменение языка программно в Android

Вот адаптация кода



    Resources standardResources = getBaseContext().getResources();

    AssetManager assets = standardResources.getAssets();

    DisplayMetrics metrics = standardResources.getDisplayMetrics();

    Configuration config = new Configuration(standardResources.getConfiguration());

    config.locale = new Locale(languageToLoad);

    Resources defaultResources = new Resources(assets, metrics, config);

Надеюсь, что это поможет.

1 голос
/ 19 сентября 2017
private void setLanguage(String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        config.setLocale(locale);
    } else {
        config.locale = locale;
    }
    getResources().updateConfiguration(config,
            getResources().getDisplayMetrics());

}
1 голос
/ 03 апреля 2017

Это работает, когда я нажимаю кнопку, чтобы изменить язык текста моего TextView. (Strings.xml в папке values-de)

String languageToLoad = "de"; // your language
Configuration config = getBaseContext().getResources().getConfiguration();
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
recreate();
0 голосов
/ 02 декабря 2013

Просто обработайте в методе

@Override public void onConfigurationChanged(android.content.res.Configuration newConfig).

Перейдите по ссылке

Я думаю, что это полезно

0 голосов
/ 10 января 2018

Например, мы установили английский язык:

 Configuration config = GetBaseContext().getResources().getConfiguration();
 Locale locale = new Locale("en");
 Locale.setDefault(locale);
 config.locale = locale;
 GetBaseContext().getResources().updateConfiguration(config, 
            GetBaseContext().getResources().getDisplayMetrics());

Пожалуйста, помните, что это работает только в том случае, если язык обнаружен и в Системе устройства, не только в приложении

0 голосов
/ 09 марта 2017

аналогично принятой версии с ответом, но версии 2017 года и добавленному перезапуску (без перезапуска, иногда следующее действие по-прежнему отображает английский):

// Inside some activity...
private void changeDisplayLanguage(String langCode) {
// Step 1. Change the locale in the app's configuration
    Resources res = getResources();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.setLocale(currentLocale);
    createConfigurationContext(conf);
// Step 2. IMPORTANT! you must restart the app to make sure it works 100%
    restart();
}
private void restart() {
    PackageManager packageManager = getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
    ComponentName componentName = intent.getComponent();
    Intent mainIntent = IntentCompat.makeRestartActivityTask(componentName);
    mainIntent.putExtra("app_restarting", true);
    PrefUtils.putBoolean("app_restarting", true);
    startActivity(mainIntent);
    System.exit(0);
}
0 голосов
/ 16 января 2015

Я столкнулся с той же проблемой: мне нужно было установить мой язык на язык, выбранный в моем приложении.

Мое исправление было таким:

  1. Сохраняйте свои строки в своем XML-файле, не извлекайте его в ресурсы
  2. Сделайте точную копию вашего XML и переименуйте его в _languagecode, например _fr (используйте строчные буквы!)
  3. Исправьте ваши переводы в вашей копии XML
  4. В коде вы проверяете язык своего приложения и раздуваете XML

Пример:

 String languageInitials = MyAppconfig.currentLanguageInitials();
        if (languageInitials.equals("NL")) {
            view = inflater.inflate(R.layout.mylayout_nl, container, false);
        } else {
            view = inflater.inflate(R.layout.fragment_mylayout_fr, container, false);
        }

Из этих XML вы все равно можете извлечь необходимые строки в ресурсы.

0 голосов
/ 08 октября 2015

Есть несколько шагов, которые вы должны реализовать

Во-первых, вам нужно изменить локаль вашей конфигурации

Resources resources = context.getResources();

Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale(language);

resources.updateConfiguration(configuration, resources.getDisplayMetrics());

Во-вторых, если вы хотите, чтобы ваши изменения применялись непосредственно к отображаемому макету, вы можете либо обновить представления напрямую, либо просто вызвать action.recreate (), чтобы перезапустить текущее действие.

А также вы должны сохранить ваши изменения, потому что после того, как пользователь закроет ваше приложение, вы потеряете изменение языка.

Я объяснил более подробное решение в своем блоге Программное изменение языка в Android

По сути, вы просто вызываете LocaleHelper.onCreate () для своего класса приложения, и если вы хотите изменить локаль на лету, вы можете вызвать LocaleHelper.setLocale ()

0 голосов
/ 02 июля 2019

Извините за мой английский. Ни одно из решений, перечисленных здесь, не помогло мне.

Язык не включал Android> = 7.0, если AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)

Этот LoaleUtils работает просто отлично: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe

LocaleUtils

public class LocaleUtils {

public static final String LAN_SPANISH      = "es";
public static final String LAN_PORTUGUESE   = "pt";
public static final String LAN_ENGLISH      = "en";

private static Locale sLocale;

public static void setLocale(Locale locale) {
    sLocale = locale;
    if(sLocale != null) {
        Locale.setDefault(sLocale);
    }
}

public static void updateConfig(ContextThemeWrapper wrapper) {
    if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = new Configuration();
        configuration.setLocale(sLocale);
        wrapper.applyOverrideConfiguration(configuration);
    }
}

public static void updateConfig(Application app, Configuration configuration) {
    if(sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //Wrapping the configuration to avoid Activity endless loop
        Configuration config = new Configuration(configuration);
        config.locale = sLocale;
        Resources res = app.getBaseContext().getResources();
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
}
}

Добавлен этот код в приложение

public class App extends Application {
public void onCreate(){
    super.onCreate();

    LocaleUtils.setLocale(new Locale("iw"));
    LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleUtils.updateConfig(this, newConfig);
}
}

Код в Деятельности

public class BaseActivity extends AppCompatActivity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }
}
0 голосов
/ 23 марта 2017

Сначала вы создаете значения имени каталога - «Имя языка», например, хинди, затем пишете «hi» и копируете имя файла с той же строкой в ​​этом каталоге и изменяете значение, не меняя параметр после установленного ниже кода в вашем действии, как кнопка и т. Д. .

Locale myLocale = new Locale("hi");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(Home.this, Home.class);
startActivity(refresh);
finish(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...