Локализация андроид приложения. Ресурсы одной строки для нескольких стран

У меня такой вопрос: у меня есть активность входа/регистрации, которая по умолчанию использует русскую версию strings.xml. Итак, когда пользователь заходит в приложение - он видит текст на русском языке. Но в этом действии есть кнопка для выбора другого языка. Когда он нажимает эту кнопку, я открываю другое действие, в котором он может выбрать, какой язык использовать (английский/испанский/немецкий/и т. д.). Когда он выбирает язык (скажем, немецкий). Как я могу с этого момента показать пользователю текст, который теперь следует использовать из немецкой версии strings.xml? И еще - как сделать так: если локаль пользователя из России, Украины, Грузии --- то использовать русскую версию strings.xml, а если локаль пользователя из любой другой страны - пользовательскую английскую версию strings.xml? Спасибо.


person yozhik    schedule 14.08.2018    source источник
comment
Возможный дубликат Как я могу изменить язык всего приложения одним щелчком мыши?   -  person Markus Kauppinen    schedule 14.08.2018
comment
Возможный дубликат программно изменить язык приложения в Android   -  person Saurabh Bhandari    schedule 14.08.2018


Ответы (2)


Я настоятельно рекомендую использовать localise.

У нас есть приложение с 6 вкусами и более чем на 16 языках. Это был бы кошмар, если бы этой библиотеки не существовало.

У них есть руководство по использованию пользовательской локали: но вкратце:

    // Create a new Locale object
    Locale locale = new Locale("ru");
    Locale.setDefault(locale);
    // Create a new configuration object
    Configuration config = new Configuration();
    // Set the locale of the new configuration
    config.locale = locale;
    // Update the configuration of the Accplication context
    getResources().updateConfiguration(
        config, 
        getResources().getDisplayMetrics()
    );
person egorikem    schedule 14.08.2018
comment
Спасибо, а не могли бы вы дать ссылку на ваше приложение в плеймаркете, чтобы попробовать его протестировать на разных локалях? - person yozhik; 14.08.2018
comment
@yozhik К сожалению, не могу: мы не распространяем через GooglePlay, так как это букмекерская контора, что запрещено политиками Google. Посмотреть можно здесь: fonbet.ru/get/?android (начнется скачивание автоматически) - person egorikem; 14.08.2018
comment
Георгий, у меня есть еще один вопрос: будет ли этот обходной путь с настройкой локали пользователя работать вне класса Application (мне нужно использовать его в Activity). Я имею в виду, если я переключусь на другую локаль в текущей активности и вызову: getResources().updateConfiguration(). Будут ли изменения применены немедленно? Или мне нужно воссоздать только это действие, или мне нужно убить приложение и запустить его снова, сохраняя при этом локаль, ранее сохраненную в общих настройках? - person yozhik; 14.08.2018
comment
@yozhik Да и нет. Он изменится немедленно, однако вам придется перезагрузить текущий экран или вернуться назад/к другому экрану, чтобы эти изменения вступили в силу. Может быть несколько обходных путей для этого ограничения, например. отображение полностью прозрачного фрагмента и его немедленное закрытие, чтобы приложение отображалось корректно - person egorikem; 14.08.2018

Что вы хотите сделать, это:

  1. Имейте список переводов контента с учетом языка/региона в формате пар ключ-значение. Вы можете добиться этого в одном файле или иметь отдельные файлы и называть их в соответствии с комбинацией язык-локаль. Я предпочитаю последнюю версию, более простую в обслуживании.

  2. Далее во время запуска приложения вы хотите прочитать текущую локаль телефона с помощью

    Locale current = getResources().getConfiguration().locale;
    

    Сопоставьте это значение с файлами содержимого (в зависимости от фреймворка), созданными выше, и вы получите мгновенную локализацию.

person Vikrant Siwach    schedule 14.08.2018
comment
Итак, мне нужно создать strings-RU.xml, strings-UA.xml, strings-GE.xml(в котором будет русский текст) и strings.xml в котором будет английский текст, и strings-SP.xml в котором будет Испания текст? Правильно? Но я не понял, как получить строковые ресурсы на основе текущей локали. Не могли бы вы предоставить код и где мне нужно написать его относительно моей активности LoginRegistration, которая начинается сразу после активности Splash? - person yozhik; 14.08.2018
comment
Вы можете проверить локаль в самой активности заставки. - person Vikrant Siwach; 18.08.2018