24

実行時に、どのリソース言語がアプリに埋め込まれているかを知ることはできますか?

つまり、このフォルダの存在:

values-en
values-de
values-fr
...
4

11 に答える 11

13

名前の付いたフォルダがあっても、values-deそこにリソースがあるとは限らないため、複雑です。あなたがそれを持っstring.xmlている場合、あなたがvalues-deそこに文字列値を持っているという意味ではありません。

値:

<resources>
    <string name="app_name">LocTest</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
</resources>

値-de:

<resources>
    <string name="hello_world">Hallo Welt!</string>
</resources>

特定のロケールのリソースがデフォルトと異なるかどうかをテストできます。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources r = getResources();
Configuration c = r.getConfiguration();
String[] loc = r.getAssets().getLocales();
for (int i = 0; i < loc.length; i++) {
    Log.d("LOCALE", i + ": " + loc[i]);

    c.locale = new Locale(loc[i]);
    Resources res = new Resources(getAssets(), metrics, c);
    String s1 = res.getString(R.string.hello_world);
    c.locale = new Locale("");
    Resources res2 = new Resources(getAssets(), metrics, c);
    String s2 = res2.getString(R.string.hello_world);

    if(!s1.equals(s2)){
        Log.d("DIFFERENT LOCALE", i + ": "+ s1+" "+s2 +" "+ loc[i]);
    }
}

障害が1つあります。1つの値に変換があるかどうかを確認できます。

上記のダーティコードは次のように出力されます。

LOCALE(5667):51:en_NZ LOCALE(5667):52:uk_UA LOCALE(5667):53:nl_BE LOCALE(5667):54:de_DE DIFFERENT LOCALE(5667):54:Hallo Welt!こんにちは世界!de_DE LOCALE(5667):55:ka_GE LOCALE(5667):56:sv_SE LOCALE(5667):57:bg_BG LOCALE(5667):58:de_CH DIFFERENT LOCALE(5667):58:Hallo Welt!こんにちは世界!de_CH LOCALE(5667):59:fr_CH LOCALE(5667):60:fi_FI

于 2012-07-26T17:27:05.650 に答える
10

AssetManager.getLocales() は実際にこれを行う方法です。ただし、パブリック API から作成するすべての AssetManager には、検索パスに含まれるフレームワーク リソースもあります。そのため、AssetManager.getLocales() を呼び出すと、フレームワーク リソースの一部であるすべてのロケールも表示されます。SDK でこれを回避する方法はありません。申し訳ありません。

于 2012-08-01T01:46:05.237 に答える
1

これらの res-lang は実際にはロケールに依存するため、デバイスからロケールを取得する必要があり、ロケールからどの言語が表示されているかを取得できます。

Locale myPhoneLocale = Locale.getDefault();

その後、 getDisplayLanguage() を呼び出して、表示されている言語を知ることができます。

参考:ロケール

于 2012-07-23T10:53:01.067 に答える
0

これについて話しているのですか?

String language = Locale.getDefault().getDisplayLanguage();
于 2012-07-23T10:52:14.700 に答える
0

電話してみてくださいAssetManager.getLocales()

このアセット マネージャーのデータが含まれているロケールを取得します。

または、 を使用してリストを取得できるかどうかを試すことができますlist()

指定されたパスにあるすべてのアセットの文字列配列を返します。

于 2012-07-25T18:01:37.947 に答える
0

@Injecteer のコードに触発されて、次のことを行いました。

アプリがサポートする言語のリストについては、検出できないため、デフォルトの言語を渡す必要があります。

public static Map<String,String> getAppLanguages(Context context, String appDefaultLang) {
    Map<String, String> listAppLocales = new LinkedHashMap<>();

    listAppLocales.put("default","Auto");

    DisplayMetrics metrics = new DisplayMetrics();
            Resources res = context.getResources();
    Configuration conf = res.getConfiguration();
    String[] listLocates = res.getAssets().getLocales();

    for (String locate : listLocates) {

        conf.locale = new Locale(locate);
        Resources res1 = new Resources(context.getAssets(), metrics, conf);
        String s1 = res1.getString(R.string.title_itinerary);
        String value = ucfirst(conf.locale.getDisplayName());

        conf.locale = new Locale("");
        Resources res2 = new Resources(context.getAssets(), metrics, conf);
        String s2 = res2.getString(R.string.title_itinerary);

        if (!s1.equals(s2)) {
            listAppLocales.put(locate, value);
        } else if (locate.equals(appDefaultLang)) {
            listAppLocales.put(locate, value);
        }
    }
    return listAppLocales;
}

結果は、アプリケーションでサポートされている言語のリストmap<key,value>です。最初のことは、listPreference を設定するために使用する場合です。

于 2016-05-18T12:11:12.177 に答える
-1

つまり:

String[] locales = getAssets().getLocales();  

これにより、デバイスの言語を取得できます。

于 2012-07-26T00:37:32.527 に答える