実行時に、どのリソース言語がアプリに埋め込まれているかを知ることはできますか?
つまり、このフォルダの存在:
values-en
values-de
values-fr
...
実行時に、どのリソース言語がアプリに埋め込まれているかを知ることはできますか?
つまり、このフォルダの存在:
values-en
values-de
values-fr
...
名前の付いたフォルダがあっても、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
AssetManager.getLocales() は実際にこれを行う方法です。ただし、パブリック API から作成するすべての AssetManager には、検索パスに含まれるフレームワーク リソースもあります。そのため、AssetManager.getLocales() を呼び出すと、フレームワーク リソースの一部であるすべてのロケールも表示されます。SDK でこれを回避する方法はありません。申し訳ありません。
これらの res-lang は実際にはロケールに依存するため、デバイスからロケールを取得する必要があり、ロケールからどの言語が表示されているかを取得できます。
Locale myPhoneLocale = Locale.getDefault();
その後、 getDisplayLanguage() を呼び出して、表示されている言語を知ることができます。
参考:ロケール
これについて話しているのですか?
String language = Locale.getDefault().getDisplayLanguage();
電話してみてくださいAssetManager.getLocales()
:
このアセット マネージャーのデータが含まれているロケールを取得します。
または、 を使用してリストを取得できるかどうかを試すことができますlist()
。
指定されたパスにあるすべてのアセットの文字列配列を返します。
@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 を設定するために使用する場合です。
つまり:
String[] locales = getAssets().getLocales();
これにより、デバイスの言語を取得できます。