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

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

, который снабжает Spinner селектором языка. Поэтому, когда пользователь выбирает язык, мне нужно найти корреспондента Locale для выбранного язык :

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)&&(ueSelectedLanguageIndex<m_ueLangSelectorSpinner.getCount())))
        {
            // selected language index is valid, fetch it

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

, но я получаю неверный / пустой язык. Зачем?

0
KernelPanic 17 Апр 2019 в 22:20

2 ответа

Лучший ответ

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

1
jackz314 17 Апр 2019 в 20:54

Я нашел способ, выбранный язык (его строка из 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)&&(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
0
KernelPanic 17 Апр 2019 в 23:15