Изменить язык в приложении для Android (на хинди)

Создание поддержки нескольких языков для приложения с возможностью смены языка в настройках приложения.

На данный момент все нормально работает для английского, испанского, французского, русского языков, но не работает для хинди и китайского.

1) Я указываю название языка на языке оригинала, но в приложении вместо हिन्दी вижу "хинди".

\res\values-привет\arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string-array name="languages">
        <item name="english">English</item>
        <item name="russian">Русский</item>
        <item name="spanish">Espagnol</item>
        <item name="russian">Français</item>
        <item name="chineese">中国</item>
        <item name="hindi">हिन्दी</item>
    </string-array>
    <string-array name="languagesValues">
         <item name="english">en</item>
        <item name="russian">ru</item>
        <item name="spanish">es</item>
        <item name="russian">fr</item>
        <item name="chineese">zh-CN</item>
        <item name="hindi">hi</item>
    </string-array>

</resources>

2) Завершить после выбора "Хинди" - на самом деле выбирается по умолчанию (английский).
\res\values-hi\strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">लकी बीनने</string>
    <string name="score">0000</string>
    <string name="settings">सेटिंग</string>
    <string name="start_button">प्रारंभ</string>
    <string name="about_button">के बारे में</string>
    <string name="about">लियोनिद द्वारा बनाया गया</string>
    <string name="feedback">प्रतिक्रिया भेजें </string>
    <string name="high_score">उच्च स्कोर के</string>
    <string name="score_set">स्कोर निर्धारित किया गया है \r\nमें:</string>
    <string name="game_over">खेल खत्म</string>

....

Сохранение локали в настройках.

public class Settings extends PreferenceActivity {

    Locale myLocale;
    static boolean localeChanged;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);


        // language changing
        Preference langPreference = getPreferenceScreen().findPreference(
                "language");
        langPreference.setOnPreferenceChangeListener(languageChangeListener);
    }

    Preference.OnPreferenceChangeListener languageChangeListener = new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            switch (newValue.toString()) {
            case "en":
                setLocale("en");
                break;

            case "ru":
                setLocale("ru");
                break;

            case "fr":
                setLocale("fr");
                break;

            case "es":
                setLocale("es");
                break;

            case "zh-CN":
                setLocale("zh-CN");
                break;

            case "hi":
                setLocale("hi");
                break;

            }

            localeChanged = true;
            return true;
        }
    };

    // * manually changing locale/
    public void setLocale(String lang) {
        myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Intent refresh = new Intent(this, Settings.class);
        startActivity(refresh);
        finish();
    }

Что не так? Что-то не так в моем коде или в моем устройстве?


person Community    schedule 13.06.2015    source источник
comment
Далее, вкратце: вы должны поместить код изменения локали чуть выше setContentView в обратном вызове onCreate (похоже, вы нигде не использовали его для установки макета для своей деятельности). Это помогает системе правильно выбирать строковые ресурсы на основе локали, и в зависимости от локали вы можете правильно выбрать шрифт и применить его к setFontFace.   -  person Abhinav Saxena    schedule 25.10.2018
comment
Так же укажите пожалуйста марку и модель вашего телефона, почему значения-привет не берутся, даже при перезагрузке телефона или приложения, также смотрите комментарий выше?   -  person Abhinav Saxena    schedule 27.10.2018


Ответы (2)


Это зависит от устройства. Кроме того, проверьте, поддерживает ли ваше устройство языки Hindi и Chinese, выбрав Settings --> Language & input.

person Chandrakanth    schedule 13.06.2015
comment
@AbhinavSaxena Я полностью согласен с вашим ответом. Но решение проблемы полностью зависит от требования. У разработчика могут быть другие требования, например поддержка только тех языков, которые доступны на устройстве. В этом случае нам не нужно поддерживать разные шрифты для каждого языка. Просто нам нужно запросить доступную локаль (поддерживаемые языки) и показать параметры для выбора языка. Если у нас есть strings.xml, поддерживаемый для этого языка, он покажет уважаемый язык, в противном случае он покажет язык по умолчанию... cntd - person Chandrakanth; 26.10.2018
comment
@AbhinavSaxena..cntd ... Итак, какое решение следует использовать, полностью зависит от требований. Так что разработчику решать, каким методом он хочет следовать. И далее, я не хочу спорить, почему мой ответ правильный. Спасибо. :) - person Chandrakanth; 26.10.2018
comment
Видите, мой ответ защищен встречным вопросом, а что, если?. Что делать, если на одном устройстве нет языковой поддержки для китайского, испанского и хинди. На старых устройствах я вообще не мог видеть символы хинди. Поэтому, когда я реализовал решение ниже, оно сработало. Во многих учебниках и блогах вы не найдете пункт о том, что вы должны защищать резервные копии в настройках вашей локали с помощью ресурсов шрифтов, поэтому, по общему мнению, этого не произойдет. - person Abhinav Saxena; 27.10.2018

И. Прежде всего:

В вашем сообщении много логических и орфографических ошибок. Lint будет сообщать об ошибках и предупреждениях, и код не будет компилироваться.

Пожалуйста, посмотрите исправления:

Создание поддержки нескольких языков для приложения с возможностью смены языка в настройках приложения.

На данный момент все нормально работает для английского, испанского, French, русского языков, но не работает для хинди и Chinese.

1) Я указываю название языка на языке оригинала, но в приложении вместо हिन्दी вижу "хинди".

\res\values-привет\arrays.xml

<string-array name="languages">
    <item name="english">English</item>
    <item name="russian">Русский</item>
    <item name="spanish">Espagnol</item>
    <item name="french">Français</item>
    <item name="chinese">中国</item>
    <item name="hindi">हिन्दी</item>
</string-array>
<string-array name="languagesValues">
     <item name="english">en</item>
    <item name="russian">ru</item>
    <item name="spanish">es</item>
    <item name="french">fr</item>
    <item name="chinese">zh-CN</item>
    <item name="hindi">hi</item>
</string-array>

[COMMENTS]

  1. Орфографические ошибки: в словах китайский, французский.

  2. Логическая ошибка: повтор в ключе русский, в обоих массивах, где на втором повторе должен быть французский.

II. Улучшения для ответа @Chandrakanth:

Это зависит от устройства, и ваше устройство кажется старым, а ваш код правильный. Давая вам причины, почему:

Начиная с моего ответа, я хочу процитировать ваш вопрос:

As for now everything works fine for English, Spanish, French, Russian    
languages, but doesn't work for Hindi and Chinese.

Когда вы используете китайский и хинди, вы используете следующие локали из ваших строковых ресурсов:

<item name="chineese">zh-CN</item>
<item name="hindi">hi</item>

Пожалуйста, реорганизуйте его, чтобы:

<item name="chinese">zh</item>
<item name="hindi">hi</item>

Таким образом, вы должны использовать папки значений как:

values-zh and values-hi

Если вышесказанное верно, ваше приложение не принимает или не распознает values-zh и values-hi на каком-то старом устройстве.

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

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

  3. Пожалуйста, вызовите метод, в котором он изменяет локаль, непосредственно перед вызовом "setContentView" внутри обратного вызова "onCreate".

  4. Возможно, вы можете проверить, поддерживает ли ваше устройство хинди и китайский языки, выбрав Settings --> Language & input.

У меня есть устройства, которые не имеют Hindi и Chinese в настройках устройства, но все же локали hi и zh распознаются в приложении, хотя мне нужно установить соответствующие шрифты, чтобы предотвратить откат.

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

Убедитесь, что ваш код работает на других новых устройствах. Если нет, то вы должны выполнить шаги ниже. Сначала есть некоторые основные понятия:

Во-первых, если вы измените locale в device settings, это не повлияет на application level locale settings. То есть, если ваш device locale установлен на Spanish, а ваш параметр Application level locale установлен на Hindi, Hindi должен продолжать отображаться на каждом fragment/activity вашего application, если каждый из этих компонентов содержит строки localized. Теперь, если вы измените свой locale с Spanish на Chinese, а ваш application или устройство перезагрузится, поскольку zh хранится в ваших настройках, ваш метод изменит языковой стандарт на Chinese на Application load и продолжит отображать текст в Chinese.

Во-вторых, если ваш language зависит, например, от font: поскольку в вашем приложении есть поддержка языковых стандартов English, Hindi и Chinese, вы должны иметь все TTF fonts в своем asset folder и применить Font-face на TextView, EditText, Radio Buttons, Check Box, Spinners и т. д. соответственно, когда вы меняете язык с application settings. Здесь Hindi и Chinese локали требуют наличия TTF шрифтов для каждой в папке assets и должны использоваться в каждой component's font-face, как указано выше.

В-третьих, и это самое главное, лучше всего изменить языковой стандарт непосредственно перед вызовом setContentView(layout_id) из activity в методе onCreate(Bundle restoreState). Поэтому, как только locale изменится, вы должны отправить управление обратно на ваш экран dashboard/home, чтобы сразу увидеть эффект.

См. Активность получения хостинга Android из представления

Вы также можете узнать, как использовать ресурсы шрифта с помощью ресурсов XML в Android

и Использование стилей для ваших компонентов в Android

Удачного кодирования :-)

person Abhinav Saxena    schedule 13.10.2018