KernelPanic
KernelPanic

Reputation: 2432

Get locale from selected language

In my test Android project, I have following languages from StringArray resource:

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

, which is feeding Spinner language selector. So, when the user selects language, I need to find correspondent Locale for selected language:

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
});

, but I get invalid/empty locale. Why?

Upvotes: 0

Views: 142

Answers (2)

KernelPanic
KernelPanic

Reputation: 2432

I have found a way, selected language (its String from Spinner is reduced to first two characters and then lowercased. The result is ISO 639-2 language code, which can be passed to one of Locale's constructor:

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

Upvotes: 0

Jack
Jack

Reputation: 5614

Take a look at the documentation for forLanguageTag, I think your problem is having ill-formed language tags, you can't just use "English" and "German" as language tags, a proper tag would be something like "en-us" or something similar (refer to the documentation for details)

Upvotes: 1

Related Questions