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

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

1) 3 папки для рисования drawable-es, drawable-pt, drawable.

2) 3 значения папки значений-es, values-pt, values.Change String.xml значения в соответствии с языками.

У меня есть imageView для выбора языка. При нажатии на него открывается меню, которое состоит из опции английский, испанский, португальский.

Я установил Locale внутри приложения на выбор опции по этому коду

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;


    }
         return super.onOptionsItemSelected(item);
}

Я заявляю в МанифестAndroid: configChanges = "локаль"

Это работает, но есть некоторые проблемы.

Проблема: -

1) Когда выбран язык, экран, который состоит из изображения выбора языка, не изменяется, а другие экраны меняются.

2) После изменения ориентации приложение восстанавливает язык в соответствии с локалью телефона.

 Parth Doshi16 окт. 2012 г., 08:13
Для второй проблемы попробуйте добавить:android:configChanges="locale" для вашей активности внутри AndroidManifest.xml
 mukesh16 окт. 2012 г., 08:14
я уже добавил в каждую деятельность в моем манифесте.
 caw30 авг. 2014 г., 18:07
Вы можете использовать следующую библиотеку, которая предоставляет список языков, предпочтения для экрана настроек и переопределяет язык в вашем приложении:github.com/delight-im/Android-Languages

Ответы на вопрос(6)

Вы должны либо удалитьandroid:configChanges="locale" из манифеста, что приведет к перезагрузке или переопределению активностиonConfigurationChanged метод:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
    // your code here, you can use newConfig.locale if you need to check the language
    // or just re-set all the labels to desired string resource
}
 portfoliobuilder20 сент. 2018 г., 03:01
Удаление android: configChanges = "locale" из манифеста не препятствует перезапуску приложения. Он будет перезапущен независимо от того, добавлено ли это в манифест или нет.
 Frane Poljak20 сент. 2018 г., 10:49
Я не говорю, что удаление android: configChanges = "locale" из манифеста не позволяет перезапустить приложение, я говорю прямо противоположное. Теперь, для случая, когда у нас есть android: configChanges = "locale" в манифесте, он использовался для предотвращения перезагрузки приложения во время написания этого ответа, я не могу точно сказать, что это так.

Создайте свой собственныйCustomContextWrapper расширение классаContextWrapper и используйте его, чтобы изменить настройку Locale для всего приложения.Вот ГИСТ с использованием.

А потом позвониCustomContextWrapper с сохраненным идентификатором локали, например'hi' для языка хинди в методе жизненного цикла деятельностиattachBaseContext, Использование здесь:

@Override
protected void attachBaseContext(Context newBase) {
//fetch from shared preference also save to the same when applying. default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language));
}

ссайни и Чираге Соланки, для повторного входа это не работает. Я пытаюсь вызвать код Udhay без перезапуска активности в onCreate (), перед super.onCreate (saveInstanceState) ;. Тогда все в порядке! Только небольшая проблема, строки меню по-прежнему не изменены в соответствии с установленным Locale.

    public void setLocale(String lang) { //call this in onCreate()
     Locale myLocale = new Locale(lang); 
     Resources res = getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
     //Intent refresh = new Intent(this, AndroidLocalize.class); 
     //startActivity(refresh); 
     //finish();
} 
 AlexS30 дек. 2018 г., 22:14
та же проблема со строками меню. Вы решаете проблему?
 AlexS02 янв. 2019 г., 15:31
ты имеешь в видуIntent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);?
 Fisher02 янв. 2019 г., 14:50
@AlexS, я не нашел способов исправить проблему в строке меню. Но при выходе из приложения и повторном входе строки меню обычно можно изменить на новую локаль.
 Fisher03 янв. 2019 г., 07:28
@AlexS, нет! добавление новых Intent () и startActivity () может заставить его вернуться к языку по умолчанию при перезапуске приложения. Я имею в виду, что если пользователи выходят из приложения и снова входят в него, строки меню можно изменить на новую локаль.

кто получает версию, попробуют этот код ..

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        android.content.res.Configuration config = new 
        android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
//restart base activaty 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }

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

 defaultConfig {

    resConfigs "en", "hi", "kn"

}

после этого все языки начали работать

Решение Вопроса

http://android.programmerguru.com/android-localization-at-runtime/

Изменить язык вашего приложения просто, когда пользователь выбирает его из списка языков. Используйте метод, подобный приведенному ниже, который принимает языковой стандарт как String (например, «en» для английского языка, «hi» для хинди), настройте языковой стандарт для своего приложения и обновите текущую активность, чтобы отразить изменение языка. Примененный языковой стандарт не будет изменен, пока вы не измените его вручную.

public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, AndroidLocalize.class); 
    startActivity(refresh); 
    finish();
} 

Убедитесь, что вы импортировали следующие пакеты:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

добавить в декларацию к деятельностиAndroid: configChanges = "локаль | ориентации"

 S.L. Barth18 окт. 2012 г., 14:38
+1 за предоставление выдержки.
 Sofiane Hassaini21 апр. 2016 г., 14:01
Привет, я сделал это, это работает, но когда я перезагружаю приложение, оно возвращается к языку по умолчанию ..
 Din Islam Milon11 мая 2017 г., 12:08
Конфигурация config = новая конфигурация (newConfig); config.locale = locale; В моем случае получаю это сообщение. язык устарел на уровне API 25
 Joel Teply09 июн. 2015 г., 00:03
Обязательно добавьте finish (), чтобы у вас не было двух копий ваших действий в стеке навигации.
 Mohammed Ali25 окт. 2015 г., 16:20
finish() нужно позвонить раньшеstartActivity(refresh), В противном случае приложение может выйти вместо перезапуска активности.

Ваш ответ на вопрос