#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