Получение локали с выбранного языка

#android

#Android

Вопрос:

В моем тестовом проекте Android у меня есть следующие языки из ресурса stringArray:

 <resources>
    <string-array name="ueTTSLangSelectorSpinnerValues">
        <item>
            English
        </item>
        <item>
            Deutsch
        </item>
        <item>
            Français
        </item>
        <item>
            Italiano
        </item>
    </string-array>
    </resources>
 

, который подает указатель выбора языка. Итак, когда пользователь выбирает язык, мне нужно найти соответствующий языковой стандарт для выбранного языка:

 m_ueLangSelectorSpinner.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent,
                            View view,
                            int position,
                            long id)
    {
        // language has been selected, search for its VALID locale and prepare found locale for Text to Speech engine

        int ueSelectedLanguageIndex=m_ueLangSelectorSpinner.getSelectedItemPosition();  // get selected language index

        if(((ueSelectedLanguageIndex>=0)amp;amp;(ueSelectedLanguageIndex<m_ueLangSelectorSpinner.getCount())))
        {
            // selected language index is valid, fetch it

            String ueSelectedLanguage=m_ueAvailableLanguages[ueSelectedLanguageIndex];
            Locale ueSelectedLocale=Locale.forLanguageTag(ueSelectedLanguage);
        }   // if
    }   // onItemClick
});
 

, но я получаю недопустимую / пустую локаль. Почему?

Ответ №1:

Взгляните на документацию forLanguageTag , я думаю, что ваша проблема связана с неверно сформированными языковыми тегами, вы не можете просто использовать «английский» и «Немецкий» в качестве языковых тегов, правильным тегом будет что-то вроде «en-us» или что-то подобное (подробности см. В Документации)

Ответ №2:

Я нашел способ, выбрал язык (его строка из Spinner сокращается до первых двух символов, а затем в нижнем регистре. Результатом является код языка ISO 639-2, который может быть передан в один из конструкторов локали:

 m_ueLangSelectorSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
    /**
     * @brief Spinner selection click handler
     * @param parent
     * @param view
     * @param position
     * @param id
     */
    @Override
    public void onItemSelected(AdapterView<?> parent,
                               View view,
                               int position,
                               long id)
    {
        // Language has been selected, search for its VALID locale and prepare found locale for Text to Speech engine

        int ueSelectedLanguageIndex=m_ueLangSelectorSpinner.getSelectedItemPosition();  // get selected language index
        String ueSelectedLanguage;      // selected language
        String ueTTSSpeakButtonText;    // speak button text for selected language

        m_ueTTSTextEntryField.setText("");              // on language change, clear text
        m_ueTTSTextEntryField.setEnabled(false);        // disable button since text is empty
        m_ueTTSTextEntryField.setClickable(false);      // disables button clicking since text is empty

        if(((ueSelectedLanguageIndex>=0)amp;amp;(ueSelectedLanguageIndex<m_ueLangSelectorSpinner.getCount())))
        {
            // Selected language index is valid, fetch it and transforms it to locale name

            ueSelectedLanguage=m_ueAvailableLanguages[ueSelectedLanguageIndex];      // get selected language name

            if(ueSelectedLanguage.length()>=2)
            {
                // Size of selected language string is ok, transform it to locale name and create locale object

                ueTTSSpeakButtonText=m_ueAvailableTTSSpeakButtonTexts[ueSelectedLanguageIndex];  // get speak button text
                m_ueTSSSpeakButton.setText(ueTTSSpeakButtonText); // update button "speak" text
                m_ueSelectedLanguageLocale=new Locale(ueSelectedLanguage.substring(0,
                        2).toLowerCase());  // creates locale
            }   // if
        }   // if
    }   // onItemSelected