如何动态地将所有预定义的语言添加到ListPreference中?

时间:2018-12-02 21:08:09

标签: android translation

我具有用于选择语言的ListPreference。如图中所示,当前的声音定义在它们自己的strings.xml中。为了填充首选项列表,我将string-array元素包括在主要的strings.xml中,使其成为静态配置。

问题:是否有办法通过遍历所有strings.xml并从它们中提取语言环境信息(在运行时如何运行)来使Language ListPreference动态化?

这是当前的静态设置:

values / strings / strings.xml

<resources>

<!-- Preferences -->
<string name="pref_language">Language</string>
<string-array name="pref_language_list">
    <item>English</item>
    <item>Svenska</item>
    <item>Deutsch</item>
    <item>Français</item>
    <item>Português</item>
    <item>Español</item>
    <item>Pусский</item>
</string-array>
<string-array name="pref_language_values">
    <item>en</item>
    <item>se</item>
    <item>de</item>
    <item>fr</item>
    <item>pt</item>
    <item>es</item>
    <item>ba</item>
</string-array>
</resources>

xml / pref_general.xml

  <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <ListPreference
            android:entries="@array/pref_language_list"
            android:entryValues="@array/pref_language_values"
            android:key="language"
            android:title="@string/pref_language"
            android:icon="@drawable/language"
            />
    </PreferenceScreen>

Strings structure

1 个答案:

答案 0 :(得分:1)

entriesentryValues应该可以工作。

虽然我不理解这些无用的字符串定义和字符串分配...

将它们直接添加到数组中;进入values/arrays.xml;具有属性translatable="false"

并且这些语言标签也与资源文件的位置不匹配。

<resources>

    <string-array name="pref_language_list" translatable="false">
        <item>English</item>
        <item>Svenska</item>
        <item>Deutsch</item>
        <item>Français</item>
        <item>Português</item>
        <item>Español</item>
        <item>Pусский</item>
    </string-array>

    <string-array name="pref_language_values" translatable="false">
        <item>en</item>
        <item>se-rSE</item>
        <item>de-rDE</item>
        <item>fr-rFR</item>
        <item>pt-rPT</item>
        <item>es-rES</item>
        <item>ba-rRU</item>
    </string-array>

</resources>