Форум программистов, компьютерный форум CyberForum.ru

Локализация приложения - Android

Восстановить пароль Регистрация
 
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
19.04.2016, 19:15     Локализация приложения #1
Сделать локализацию приложения на двух языках: русский и английский с возможностью переключения языка из приложения (без привязки к языку устройства). После перезагрузки приложения выбранный язык должен сохраняться.

Сделал меню с checked-пунктом. Вроде вычитал что нужно сохранять в sharedPreferences, но ЧТО сохранять??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aydarhub
2 / 2 / 0
Регистрация: 31.01.2016
Сообщений: 19
19.04.2016, 21:12     Локализация приложения #2
Я, конечно, только начинаю изучать андроид, ель что то мне подсказывает, что нужно сделать так: если русский, то language =ru, если английский, то language = en. Поправьте меня, если написал бред.
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
20.04.2016, 09:26  [ТС]     Локализация приложения #3
если бы не было условия "без привязки к языку устройства", то вопросов нет.
Alexvp
107 / 71 / 8
Регистрация: 03.08.2014
Сообщений: 344
20.04.2016, 10:17     Локализация приложения #4
В префе сохраняете метку языка, выбранного пользователем. Способом, какой вам больше нравится.
При запуске приложения считываете эту метку, определяете какой язык выбран и считываете нужные вам файлы ресурсов под выбранный язык.
Паблито
не спать!
1876 / 1610 / 497
Регистрация: 12.05.2014
Сообщений: 5,819
Завершенные тесты: 1
20.04.2016, 11:00     Локализация приложения #5
Java
1
2
3
4
        Configuration configuration = getResources().getConfiguration();
        configuration.locale = Locale.GERMAN; // или любая другая, на которую надо переключиться
        getResources().updateConfiguration(configuration, null);
        String str = getResources().getString(R.string.my_ololo_string);
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
21.04.2016, 17:25  [ТС]     Локализация приложения #6
Паблито, а не могли бы вы прокомментировать эти строки?..
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
23.04.2016, 14:02  [ТС]     Локализация приложения #7
Возможно я задал не корректный вопрос. Подскажите где почитать теорию об этом?
Паблито
не спать!
1876 / 1610 / 497
Регистрация: 12.05.2014
Сообщений: 5,819
Завершенные тесты: 1
25.04.2016, 10:36     Локализация приложения #8
меня просо небыло
да что там комментировать

первая строчка - создается объект класса Configuration, который описывает конфигурацию устройства (с) кэп (текущая локаль, экран и все такое)

вторая строка - назначаем текущую локаль, например в программе два языка - русский и английский
где-то пользователь выбирает переключение языка и в зависимости от его выбора назначаем одну из двух
Java
1
2
        Locale locale = new Locale("ru");
        configuration.locale = locale;
Java
1
configuration.locale = Locale.ENGLISH;
третяя строка - применяем новую конфигурацию к ресурсам
четвертая - все как обычно, например берем строку из ресурсов, она будет в той локали, которую применили в 3-й строке
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
25.04.2016, 15:01  [ТС]     Локализация приложения #9
У меня выбор языка через главное меню. Так - верно?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
   Configuration configuration = getResources().getConfiguration();
 
   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.lang){
            item.setChecked(!item.isChecked());
            preferenceHelper.putBoolean(PreferenceHelper.LANG, item.isChecked());
            configuration.locale = Locale.ENGLISH;
        } else  configuration.locale = Locale.RUSSIAN;
        getResources().updateConfiguration(configuration, null);
        return super.onOptionsItemSelected(item);
    }
У меня непонятка. Где сохранится значение выбора языка?
Текст как всегда будет браться из strings-ru и string-en?
Паблито
не спать!
1876 / 1610 / 497
Регистрация: 12.05.2014
Сообщений: 5,819
Завершенные тесты: 1
25.04.2016, 15:11     Локализация приложения #10
Цитата Сообщение от goodi_tomsk Посмотреть сообщение
Где сохранится значение выбора языка?
я бы хранил его в SharedPreferences и при старте приложения читал и применял как в примере
Цитата Сообщение от goodi_tomsk Посмотреть сообщение
Текст как всегда будет браться из strings-ru и string-en?
по идее да, только я не помню там надо en писать или es
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
25.04.2016, 17:07  [ТС]     Локализация приложения #11
на данный момент у меня такое вот имеется:
Класс для работы с SharedPreferences
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import android.content.Context;
import android.content.SharedPreferences;
 
public class PreferenceHelper {
    private static PreferenceHelper instance;
    private Context context;
    private SharedPreferences preferences;
    public static final String LANG = "lang_is_eng";
 
    private PreferenceHelper(){
    }
 
    public static PreferenceHelper getInstance(){
        if (instance == null){
            instance = new PreferenceHelper();
        }
        return instance;
    }
 
    public void init(Context context){
        this.context = context;
        preferences = context.getSharedPreferences("preferences", Context.MODE_PRIVATE);
    }
 
    public void putBoolean (String key, boolean value){
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean(key, value);
        editor.apply();
    }
 
    public boolean getBoolean (String key){
        return preferences.getBoolean(key, false);
    }
}
А в MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuItem menuItem = menu.findItem(R.id.lang);
        menuItem.setChecked(preferenceHelper.getBoolean(PreferenceHelper.LANG));
        return super.onCreateOptionsMenu(menu);
    }
 
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.lang){
            item.setChecked(!item.isChecked());
            preferenceHelper.putBoolean(PreferenceHelper.LANG, item.isChecked());
        }
        return super.onOptionsItemSelected(item);
    }
Добавлено через 1 час 49 минут
вот и как/куда использовать предложенный код - не соображу
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
28.04.2016, 09:00  [ТС]     Локализация приложения #12
Паблито, подскажи мне плз
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 714
28.04.2016, 10:57     Локализация приложения #13
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   Configuration configuration = getResources().getConfiguration();
 
   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.lang){
            item.setChecked(!item.isChecked());
            preferenceHelper.putBoolean(PreferenceHelper.LANG, item.isChecked());
            configuration.locale = Locale.ENGLISH;
preferenceHelper.putBoolean(PreferenceHelper.LANG, true);
        } else  configuration.locale = Locale.RUSSIAN;
preferenceHelper.putBoolean(PreferenceHelper.LANG, false);
        getResources().updateConfiguration(configuration, null);
        return super.onOptionsItemSelected(item);
    }
должен сохранить тру если инглишь, ну и фолс если русский
public static final String LANG = "lang";
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
03.05.2016, 20:47  [ТС]     Локализация приложения #14
Valakin, спасибо! я попробую
А есть где-то толковый материал на русском чтобы изучить и понять configuration и locale?
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
13.05.2016, 15:59  [ТС]     Локализация приложения #15
Valakin, Сделал так. Не работает. Где промазал?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class MainActivity extends AppCompatActivity {
 
    PreferenceHelper preferenceHelper;
    public static final String LANG = "ru";
    Configuration config;
    private Locale locale = null;
 
    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if (locale != null)
        {
            newConfig.locale = locale;
            Locale.setDefault(locale);
            getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
        }
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        PreferenceHelper.getInstance().init(getApplicationContext());
        preferenceHelper = PreferenceHelper.getInstance();
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
 
        config = getBaseContext().getResources().getConfiguration();
 
        String lang = settings.getString(LANG, "");
        if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
        {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
 
    //создание главного меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuItem menuItem = menu.findItem(R.id.lang);
        menuItem.setChecked(preferenceHelper.getBoolean(PreferenceHelper.LANG));
        return super.onCreateOptionsMenu(menu);
    }
//обработка нажатия пункта главного меню
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
 
        int id = item.getItemId();
        if (id == R.id.lang){
            item.setChecked(!item.isChecked());
            preferenceHelper.putBoolean(PreferenceHelper.LANG, item.isChecked());
            config.locale = Locale.ENGLISH;
            preferenceHelper.putBoolean(PreferenceHelper.LANG, true);
        } else  config.locale = Locale.forLanguageTag(LANG);
        preferenceHelper.putBoolean(PreferenceHelper.LANG, false);
        getResources().updateConfiguration(config, null);
        return super.onOptionsItemSelected(item);
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2016, 08:51     Локализация приложения
Еще ссылки по теме:

Перевод приложения Android
Локализация картинок Android
Android Из приложения А проверить наличие установленного на устройстве приложения В
Android Локализация приложения
Программная локализация приложения Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 714
16.05.2016, 08:51     Локализация приложения #16
Цитата Сообщение от goodi_tomsk Посмотреть сообщение
Не работает
что не работает?
логи
пишите всем
Yandex
Объявления
16.05.2016, 08:51     Локализация приложения
Ответ Создать тему
Опции темы

Текущее время: 08:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru