2015-08-28 2 views
0

Задача состоит из следующего: необходимо предоставить возможность изменения языка интерфейса приложения (ru, en, uk, well и по умолчанию будет выбрано en) пользователю. Для реализации этого функционала было выполнено:Локализация приложения вручную

1) были созданы папки ресурсов: значения, значения - uk, values ​​- ru, values ​​- en, где файлы strings.xml с переводом контента.

2) с помощью Spinner выдается и записывается в идентификаторе языка SharedPreferences.

3) В начале применения в OnCreate локализации используется:

SharedPreferences preferences = context.getSharedPreferences(Constants.APP_PREFERENCES, Context.MODE_PRIVATE); 
String lang = preferences.getString(Constants.LANGUAGE, "default"); 
    if (lang.equals("default")) { 
    lang=context.getResources().getConfiguration().locale.getCountry(); 
    } 
    Locale locale = new Locale(lang); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    Log.i("Lang change", "Locale=" + locale); 
    context.getResources().updateConfiguration(config, 
    context.getResources().getDisplayMetrics()); 

Почти все тянет вверх и применяет, но не все. А именно, в некоторых местах (в некоторых диалогах и BaseAdapters, NavigationDrawer) вытаскивает локализацию именно языка системы. Например, на устройстве украинская локализация, по умолчанию - английский, а русский выбран в приложении, то в общей сложности в приложении в выше указанных местах подтягивает украинский контент помимо основного русского.

прорвали обрабатывать в onConfigurationChanged():

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    locale = new Locale(lang); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, null); 
} 

и очищают от каждой активности в manifest.xml андроид: configChanges = "локаль".

Не помогло.

В чем проблема?

ответ

0

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

//get sharedPreferences 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    //get default local for first initialization 
    String defaultLanguage = this.getResources().getConfiguration().locale.getLanguage(); 
    Configuration configuration = new Configuration(); 
    //check language preference everytime onCreate of all activities, if there is no choise set default language 
    Locale newLocaleLanguage = new Locale(sharedPreferences.getString("newLanguagePref",defaultLanguage)); 
    //finally setdefault language/locale according to newLocaleLanguage. 
    Locale.setDefault(newLocaleLanguage); 
    configuration.locale = newLocaleLanguage; 
    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); 

Вы должны написать этот код для всех видов деятельности в OnCreate method.And вы должны написать свое sharedPreferences с newLanguagePref тегом на странице настроек.

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