J'ai une application de synthèse vocale où l'utilisateur peut sélectionner une langue et également sélectionner une voix masculine ou féminine. Le problème est que, pour chaque langue, il existe différentes chaînes appelées voix masculine et féminine, mais dans ma préférence, je n'ai que deux options (homme et femme).
<string-array name="Language">
<item>English (US)</item>
<item>English (UK)</item>
<item>French (France)</item>
<item>Spanish (Spain)</item>
<item>Italian</item>
</string-array>
<string-array name="languageAlias">
<item>"en-US"</item>
<item>"en-GB"</item>
<item>"fr-FR"</item>
<item>"es-ES"</item>
<item>"it-IT"</item>
</string-array>
<string-array name="Voice">
<item>Male</item>
<item>Female</item>
</string-array>
<string-array name="VoiceAlias">
<item>"usenglishmale"</item>
<item>"usenglishfemale"</item>
<item>"ukenglishmale"</item>
<item>"ukenglishfemale"</item>
<item>"eurfrenchmale"</item>
<item>"eurfrenchfemale"</item>
<item>"eurspanishmale"</item>
<item>"eurspanishfemale"</item>
<item>"euritalianmale"</item>
<item>"euritalianfemale"</item>
</string-array>
J'essaie de trouver un moyen de référencer uniquement les alias vocaux masculins et féminins pertinents en fonction de la langue sélectionnée. Est-il possible de le faire ici ou dois-je écrire du code qui modifie les valeurs du tableau voiceAlias en fonction de la langue sélectionnée?
Merci d'avance
Ok, vous pouvez accomplir cela avec deux ListPreference
et un OnPreferenceChangeListener
pour chacun. D'abord le XML:
<ListPreference
Android:key="language_preference"
Android:title="Language"
Android:entries="@array/Language"
Android:entryValues="@array/languageAlias"/>
<ListPreference
Android:key="gender_preference"
Android:title="Gender"
Android:entries="@array/Voice"
Android:entryValues="@array/VoiceData"/>
Faisons une nouvelle entrée dans res/values / array.xml:
<string-array name="VoiceData">
<item>0</item>
<item>1</item>
</string-array>
Et maintenant, dans votre extension de PreferenceActivity
, nous allons prendre les valeurs de chaîne qui persistent dans votre SharedPreferences
et en créer une toute nouvelle entrée dans le SharedPreferences
qui obtient sa valeur de "VoiceAlias".
SharedPreferences shareprefs = getPreferenceManager().getSharedPreferences();
Resources resources = YourContext.getResources();
private void makeVoiceData() {
String languageData = shareprefs.getString("language_preference", "en-US");
int genderData = Integer.parseInt(shareprefs.getString("gender_preference", "0"));
String[] voiceAlias = resources.getStringArray(R.array.VoiceAlias);
int a = 0
String[] languageAlias = resources.getStringArray(R.array.languageAlias);
for (a ; a < languageAlias.length ; a++) {
if (languageAlias[a].equals(languageData)) {
break;
}
}
shareprefs.putString("VoiceAlias", voiceAlias[(2 * a) + genderData]);
}
ListPreference language_preference = getPreference("language_preference");
ListPreference gender_preference = getPreference("gender_preference");
language_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChanged(Preference preference, Object newValue) {
shareprefs.putString("language_preference", (String) newValue);
makeVoiceData();
}
});
gender_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChanged(Preference preference, Object newValue) {
shareprefs.putString("gender_preference", (String) newValue);
makeVoiceData();
}
});
Les tableaux de chaînes peuvent utiliser des ressources de chaîne. Il s'agit de la manière la plus simple (et probablement la plus simple) de traduire les valeurs utilisateur.
<string-array name="user_values">
<item>@string/value_1</item>
<item>@string/value_2</item>
</string-array>