2017-11-23 12 views
2

ローカルに対処するときにはexceptionsが多くありますので、システムのLocale.getAvailableLocales()を使用して、そのデバイスで利用可能なすべてのローカルを一覧表示することをお勧めします。リソース文字列のローカルリストを取得する方法

しかし、私はすべての地方自治体の翻訳を提供していないので、特定の文字列リソースが利用できる地元の人だけを与える方法を見つけたいと思います(例:R.strings.welcome)。

どうすればできますか?

答えて

0

編集:

を私はループと、検索文字列リソースは、答えの一つだと思います。

List<Pair<Locale, String>> stringLocals = getAvailableLocales(R.string.example); 

方法は次のとおりです。

private List<Pair<Locale, String>> getAvailableLocales(@StringRes int example) { 
    List<Pair<Locale, String>> results = new ArrayList<>(); 
    Locale[] locales = Locale.getAvailableLocales(); 

    for (Locale locale : locales) { 
     if (isLocaleStringAvailable(example, locale)) { 
      String string = getLocaleString(example, locale); 
      results.add(new Pair<Locale, String>(locale, string)); 
     } 
    } 

    return results; 
} 

しかし、(600以上)のループに非常に多くのロケールがあるので、それは、非常に高速ではないようです。したがって、この設定を使用してループが多すぎないようにしてください。

defaultConfig { 

    def locales = ["en", "it", "pl", "fr", "es", "de", "ru"] 

    buildConfigField "String[]", "TRANSLATION_ARRAY", "new String[]{\""+locales.join("\",\"")+"\"}" 
    resConfigs locales 
} 

https://stackoverflow.com/a/45884682/850347


あなたはロケールによって文字列を取得するために、このコードを使用することができます。

List<String> strings = getAvailableStrings(Locale.KOREA); 

および方法はありません:

private List<String> getAvailableStrings(Locale locale) { 
    List<Integer> stringIds = getAllStringIds(); 
    List<String> strings = getAllStrings(); 

    List<String> results = new ArrayList<>(); 

    for (int i = 0; i < stringIds.size(); i++) { 
     boolean result = isLocaleStringAvailable(stringIds.get(i), locale); 
     if (result == true) { 
      results.add(strings.get(i)); 
     } 
    } 

    return results; 
} 

private List<Integer> getAllStringIds() { 
    Field[] fields = R.string.class.getFields(); 
    List<Integer> ids = new ArrayList<>(); 
    for (int i = 0; i < fields.length; i++) { 
     try { 
      int resno = fields[i].getInt(null); 
      ids.add(resno); 
     } catch (IllegalAccessException e) { 
      // Catch exception 
     } 
    } 
    return ids; 
} 

private List<String> getAllStrings() { 
    Field[] fields = R.string.class.getFields(); 
    List<String> ids = new ArrayList<>(); 
    for (int i = 0; i < fields.length; i++) { 
     String res = fields[i].getName(); 
     ids.add(res); 
    } 
    return ids; 
} 

private boolean isLocaleStringAvailable(@StringRes int id, Locale locale) { 
    String globalString = getLocaleString(id, Locale.ENGLISH); // Modify if your default language is not english. 
    String localeString = getLocaleString(id, locale); 
    return !globalString.equalsIgnoreCase(localeString); 
} 

public String getLocaleString(@StringRes int id, Locale locale) { 
    Configuration conf = getResources().getConfiguration(); 
    conf.locale = locale; 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    Resources resources = new Resources(getAssets(), metrics, conf); 
    return resources.getString(id); 
} 
+0

ん男、私は反対のことをしたいです、私はspのすべてのロケールを取得したいecific R.string id –

+0

ああそうです。よかった。 –

関連する問題