2016-08-26 1 views
-2

Я хочу изменить язык приложения (язык) приложения, чтобы изменить программно, когда пользователь хочет переключиться между хинди и английским языком с помощью кнопки изменения языка.Android - изменить локализацию приложения вручную при нажатии кнопки

У меня есть код для изменения языка на месте, но он работает только при входе в onCreate() для действия перед методом setContentView().

Любая помощь очень ценится.

+0

Неужели вам по существу нужно перезапустить мероприятие? Как только вы измените локаль, это не просто сразу обновит весь текст приложения. –

+0

@ cricket_007 Да, это то, что я делаю, но я думал, что может быть лучшее решение для этого. – User16119012

+0

Не знаю, что я знаю, без ручного вызова метода setText на все –

ответ

2

Смотрите здесь мой ответ

Android Font in more then one langauge on single screen

, например, если вы хотите, чтобы ваше приложение для поддержки как на английском и арабские строки (в дополнение к строк по умолчанию), вы можете просто создать два дополнительных ресурса каталоги под названием /res/values-en (для английских строк.xml) и /res/values-ar (для арабских строк.xml).

В файлах strings.xml имена ресурсов совпадают.

Например, файл может /res/values-en/strings.xml выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">Hello in English!</string> 
</resources> 

Принимая во внимание, /res/values-ar/strings.xml файл будет выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">مرحبا في اللغة الإنجليزية</string> 
</resources> 

также , файл /res/values-ur_IN/strings.xml будет выглядеть так для урду:

ur_IN для india ur_PK для pakisthan

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="hello">انگریزی میں خوش!!</string> 
</resources> 

файл макета по умолчанию в/RES/директории макета, который отображает строку ссылается на строку имя переменной @ строки/привет, без учета языковой или директории строка ресурса находится.

Операционная система Android определяет, какая версия для загрузки во время выполнения (французский, английский или по умолчанию).Компоновка с управлением TextView для отображения строки может выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="@string/hello" > 
</LinearLayout> 

Строка доступ программно обычным способом:

String str = getString(R.string.hello); 

Для изменения языка необходимо нравится, что изменение lang ..

btn_english.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       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, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show(); 

      } 
     }); 



btn_arbice.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Locale locale = new Locale("ar"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
        Toast.makeText(this, getResources().getString(R.string.lbl_langSelecURdu), Toast.LENGTH_SHORT).show(); 

      } 
     }); 


btn_urdu.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Locale locale = new Locale("ur_IN"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
        Toast.makeText(HomeActivity.this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show(); 

      } 
     }); 
+0

, но какие альтернативы для config.locale и updateConfiguration, потому что они устарели – ruselli

1

Попробуйте эту функцию при нажатии кнопки.

public void changeLocale() 
{ 
     Resources res = getResources(); 
     // Change locale settings in the app. 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     android.content.res.Configuration conf = res.getConfiguration(); 
     conf.locale = new Locale("hi_IN"); 
     res.updateConfiguration(conf, dm); 

     setContentView(R.layout.xxx); 
} 
1

Используйте SharedPrefrences, чтобы сохранить prefrences пользователей и называющие локаль в OnStart() не на OnCreate(). Это работало отлично для меня Определить значение по умолчанию, так что ваше приложение обыкновения наличных

public static final String Default="en"; //so if value isn't found then english language will be used. 


protected void onStart() { 
    SharedPreferences sharedPreferences = this.getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE); 
    String pine = sharedPreferences.getString("language", DEFAULT); 
    String languageToLoad = pine; 
    Locale locale = new Locale(languageToLoad);//Set Selected Locale 
    Locale.setDefault(locale);//set new locale as default 
    Configuration config = new Configuration();//get Configuration 
    config.locale = locale;//set config locale as selected locale 
    this.getResources().updateConfiguration(config, this.getResources().getDisplayMetrics()); 
    invalidateOptionsMenu(); 
    setTitle(R.string.app_name); 
    super.onStart(); 
} 

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

aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 

      if (aSwitch.isChecked()) { 
       SharedPreferences hisharedPreferences = getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE); 
       SharedPreferences.Editor hieditor = npsharedPreferences.edit(); 
       npeditor.putString("language","hi"); 
       npeditor.commit(); 
       aSwitch.setChecked(true); 
       Toast.makeText(Settings.this, "Hindi Language Selected", Toast.LENGTH_LONG).show(); 

      } else { 
       SharedPreferences ensharedPreferences = getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE); 
       SharedPreferences.Editor eneditor = ensharedPreferences.edit(); 
       eneditor.putString("language","en"); 
       eneditor.commit(); 
       Toast.makeText(Settings.this, "English Language Selected", Toast.LENGTH_LONG).show(); 
       aSwitch.setChecked(false); 
      } 
     } 
    }); 

Надеюсь, это помогло! Не стесняйтесь спрашивать меня, если вы застряли на любом шагу!

Смежные вопросы