2016-05-26 4 views
4

Я хочу программно изменить язык.Как программно менять язык?

Итак, я создал два xml-файла.

values-it 
-->string.xml 

values-en 
-->string.xml 

Это код в MainActivity изменить язык всего приложения:

// ИТАЛЬЯНСКИЙ

Resources res = getApplicationContext().getResources(); 
DisplayMetrics dm = res.getDisplayMetrics(); 
android.content.res.Configuration conf = res.getConfiguration(); 
conf.locale = new Locale("it"); 
res.updateConfiguration(conf, dm); 

// ENGLISH

Resources res2 = getApplicationContext().getResources(); 
DisplayMetrics dm2 = res2.getDisplayMetrics(); 
android.content.res.Configuration conf2 = res2.getConfiguration(); 
conf2.locale = new Locale("en"); 
res2.updateConfiguration(conf2, dm2); 

Теперь, если я поставил на английском языке (например) код выполняется без ошибок, но метка не меняет его текст.
Если я изменил ориентацию своего устройства, метка правильно изменит его текст.

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

+0

попытайтесь позвонить вашему коду в onResume(). – Mehta

+1

Привет, здесь вы являетесь ссылкой о том, как перезагрузить изменения, не закрывая действия: http://stackoverflow.com/questions/2644377/changing-locale-force-activity-to-reload-resources –

+0

Возможный дубликат [How для обновления активности после изменения языка (локали) внутри приложения] (http://stackoverflow.com/questions/8049207/how-to-refresh-activity-after-changing-language-locale-inside-application) –

ответ

5
AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this); 
      builder.setTitle(R.string.languages); 
      // Add the buttons 
      builder.setPositiveButton(R.string.english, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        String languageToLoad = "en"; // your language 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, 
          getBaseContext().getResources().getDisplayMetrics()); 
        dialog.dismiss(); 
        rEditor.putString("language", languageToLoad); 
        rEditor.commit(); 



        Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class); 
        startActivity(refresh); 
        finish(); 

       } 
      }); 
      builder.setNegativeButton(R.string.gujarati, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 

        String languageToLoad = "gu"; // your language 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, 
          getBaseContext().getResources().getDisplayMetrics()); 
        dialog.dismiss(); 
        rEditor.putString("language", languageToLoad); 
        rEditor.commit(); 


        Intent refresh = new Intent(DashboardActivity.this, DashboardActivity.class); 
        startActivity(refresh); 
        finish(); 

       } 
      }); 

      builder.create().show(); 

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

+0

что такое 'rEditor'? – Choletski

+0

sharedPreference Editor для сохранения данных.https: //developer.android.com/training/basics/data-storage/shared-preferences.html –

+0

resource.updateConfiguration устарел. Теперь что такое альтернатива? –

3

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

private void restartActivity() { 
Intent intent = getIntent(); 
finish(); 
startActivity(intent); 
} 
2

Лучшим способом было бы положить все TextView.setText() в методе. Вызовите этот метод в своем onResume();, чтобы установить его в первый раз. Затем вспомните этот метод, когда вы сбросили язык. (Активность идет корыто onStart()onResume() и т.д., когда вы меняете ориентацию)

+0

это не просто строки ... иногда тоже важны направления, RTL или LTR –

+0

Хороший звонок, это, кажется, хороший способ справиться с этим: http://stackoverflow.com/questions/10964488/how-to -make-the-text-direction-from-right-to-left – Flummox

+0

действительно выкопал еще немного и нашел правильное решение и поставил его в основу: https://gist.github.com/muhammad-naderi/ 0ff264e6cc07df904bc88a9f7efbe57d –

-4

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

Стройте многоязычный поддерживаемый пример приложения для Android. Я нашел его от here

1

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

mSwitch = (Switch) findViewById(R.id.language_switch); 

    mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       if (isChecked){ 
        mSwitch.setTextColor(Color.GRAY); 
        String languageToLoad = "es"; 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration configuration = new Configuration(); 
        configuration.setLocale(locale); 
        Toast.makeText(getApplicationContext(), "spanish is set", Toast.LENGTH_SHORT).show(); 
        getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); 
       } else { 
        String languageToLoad = "en"; 
        Locale locale = new Locale(languageToLoad); 
        Locale.setDefault(locale); 
        Configuration configuration = new Configuration(); 
        configuration.setLocale(locale); 
        Toast.makeText(getApplicationContext(), "english is set", Toast.LENGTH_SHORT).show(); 
        getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); 
       } 
     } 
    }); 
Смежные вопросы