Сохранить язык, выбранный пользователем, Android

Как я могу изменить string.xml по умолчанию? Я могу изменить свое приложение на пять разных языков, но всякий раз, когда я закрываю приложение и снова открываю его. Он возвращается к английскому по умолчанию.

Можно ли как-то изменить папку по умолчанию "values". Например, из значений (английский), который используется по умолчанию, в values-pt (португальский).

Любая помощь высоко ценится!


person Silvio Li    schedule 27.09.2015    source источник


Ответы (4)


вы можете использовать следующие

public void loadLocale() {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        String language = prefs.getString(langPref, "");
        changeLang(language);
    }

public void changeLang(String lang) {
        if (lang.equalsIgnoreCase(""))
            return;
        myLocale = new Locale(lang);
        saveLocale(lang);
        Locale.setDefault(myLocale);
        android.content.res.Configuration config = new android.content.res.Configuration();
        config.locale = myLocale;
        getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());

    }

public void saveLocale(String lang) {
        String langPref = "Language";
        SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(langPref, lang);
        editor.commit();
    }

и в onCreate()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_change_language);
        loadLocale();
    }
person Ganpat Kaliya    schedule 28.09.2015
comment
Привет, Ганпат, я попробовал твое решение, и оно вроде как сработало. Главное меню и другие действия на другом языке, но кнопки и текстовые представления основного действия по-прежнему на английском языке. Довольно странно. Это похоже на то, как приложение загружает основное действие (текстовые представления и кнопки) на английском языке по умолчанию, а затем меняет язык на любой, выбранный пользователем (португальский-pt). Так что все остальное португальское. - person Silvio Li; 28.09.2015
comment
Я думаю, что исправил, но не уверен, что это лучший способ. Я ставлю loadLocale(); перед super.onCreate(сохраненоInstanceState); Спасибо за помощь. - person Silvio Li; 28.09.2015

Вы можете попробовать это:

Изменить:

public void changeLanguage(String language) {
    locale = new Locale(language);
    saveLocale(language);
    Locale.setDefault(locale);
    conf.locale = locale;
    getBaseContext().getResources().updateConfiguration(conf, null);
    updateText();
}

Сохранить:

    public void saveLocale(String language) {
    SharedPreferences sharedPreferences = getSharedPreferences("com.example.myapp.PREFERENCES", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("USER_LANGUAGE", language);
    editor.commit();
}

Обновить:

    private void updateText() {
    btn_chat.setText(R.string.live_chat);
}

Загружать:

public void LoadLanguage(){
    SharedPreferences shp = getSharedPreferences(
            "com.example.myapp.PREFERENCES",Context.MODE_PRIVATE);
    String language = shp.getString("USER_LANGUAGE","");
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
}

В MainActivity вы можете проверить язык по умолчанию, который использует приложение:

language = getResources().getString(R.string.lang);

Затем, если язык является языком, который вы хотите проверить с помощью инструкции, вы должны выполнить функцию updateText():

if (language.equals("zh")) {
        btn_lang.setText(R.string.someName);
        updateText();
    }

Не забудьте выполнить LoadLanguage() в MainActivity, чтобы загрузить сохраненный пользователем язык.

person Julfikar    schedule 15.12.2016

Вот код, который работает для меня:

public class  MainActivity extends AppCompatActivity {
public static String storeLang;

@Override
protected void onCreate(Bundle savedInstanceState) {

    SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);
    storeLang = shp.getString(getString(R.string.key_lang), "");

    // Create a new Locale object
    Locale locale = new Locale(storeLang);

    // Create a new configuration object
    Configuration config = new Configuration();
    // Set the locale of the new configuration
    config.locale = locale;
    // Update the configuration of the Accplication context
    getResources().updateConfiguration(
            config,
            getResources().getDisplayMetrics()
    );

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

Источник: https://blog.lokalise.co/android-app-localization/

person Til Schweiger    schedule 27.07.2018
comment
Извините, видимо, я неправильно перевел вопрос с английского - person Til Schweiger; 27.07.2018

Вы можете писать, а затем читать из SharedPreferences, чтобы управлять выбранным пользователем языком.

Сохранить:

SharedPreferences shp = getSharedPreferences(
        "com.example.yourapp.PREFERENCES",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putString("USER_LANGUAGE", language);
editor.commit();

Загружать:

SharedPreferences shp = getSharedPreferences(
        "com.example.yourapp.PREFERENCES",Context.MODE_PRIVATE);
String language = shp.getString("USER_LANGUAGE","en");

Когда вы загружаете язык, измените языковой стандарт, чтобы использовать его

Locale locale = new Locale(language);  
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
person Andrew Brooke    schedule 27.09.2015
comment
Привет, Эндрю, я хотел бы сохранить, как вы показали мне, используя SharedPreferences. Но после его сохранения он автоматически выберет новый язык по умолчанию при повторном открытии приложения. Например, если я перейду на португальский, при повторном открытии приложения все строки будут автоматически извлечены из values-pt, string.xml. - person Silvio Li; 28.09.2015
comment
Спасибо за помощь Андрей. Я исправил свою проблему с помощью решения Ganpta. - person Silvio Li; 28.09.2015