как изменить язык моего приложения во всех видах деятельности? - PullRequest
0 голосов
/ 06 мая 2018

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

Обратите внимание, что я использую следующий код для изменения языка

public static final String languageFile="language_file";
SharedPreferences myLang;

private Locale Language;
String defaultLanguage="en";
String language1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);

    myLang = getSharedPreferences(languageFile, Context.MODE_PRIVATE);
    language1=myLang.getString("language",defaultLanguage).toString();

    setLocale(language1);
}

public void setLocale(String lang) {

    Language = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = Language;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this,Welcome_Activity.class);
    startActivity(refresh);
    finish();
}

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

     public void changeLanguage(){
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
     builder
             // .setIcon(android.R.drawable.ic_dialog_alert)
              .setTitle(R.string.LanguageSelector)
              .setMessage(R.string.Pleaseselectyourlanguage)
              .setPositiveButton("English", new 
     DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int 
      which) {
                    setLocale("en");

      myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor=myLang.edit();
                    editor.putString("language", "en").apply();

                }
            })
            .setNegativeButton("عربي", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    setLocale("ar");
                    myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor=myLang.edit();
                    editor.putString("language", "ar").apply();


                }
            });
    AlertDialog alert = builder.create();
    alert.show();
    Button nbutton = alert.getButton(DialogInterface.BUTTON_NEGATIVE);
    nbutton.setTextColor(Color.BLACK);
    Button pbutton = alert.getButton(DialogInterface.BUTTON_POSITIVE);
    pbutton.setTextColor(Color.BLACK);
 }

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

public class MainActivity  extends BaseActivity  {

   @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

}


/**
 * @author Atif Abbasi .
 */

public class BaseActivity  extends AppCompatActivity {


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }




    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(LocaleHelper.wrap(newBase, AppClass.getLanguage(newBase)));

/**
*save value in sharedPrefrences 
*
*AppClass.getLanguage(newBase)
*
*
**/

    }


    /**
     * A locale helper class for updating app specific locale
     */
    private static class LocaleHelper extends ContextWrapper {

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

        public static ContextWrapper wrap(Context context, String language) {
            if (TextUtils.isEmpty(language.trim())) {
                return new LocaleHelper(context);
            }
            Configuration config = context.getResources().getConfiguration();
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                config.setLocale(locale);
            } else {
                //noinspection deprecation
                config.locale = locale;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                config.setLayoutDirection(locale);
                context = context.createConfigurationContext(config);
            } else {
                //noinspection deprecation
                context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
            }
            return new LocaleHelper(context);
        }

    } // LocaleHelper


}
0 голосов
/ 06 мая 2018

Следующие работы для меня:

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);
    getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics());
    invalidateOptionsMenu();
    recreate();
}
...