Reputation: 2432
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
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
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