与本地人打交道时有很多exceptions,因此我认为使用系统Locale.getAvailableLocales()列出设备可用的所有本地人会很好。

但是我不提供所有本地语言的翻译,因此我想找到一种方法,该方法将仅向我提供具有特定字符串资源的本地语言(例如:R.strings.welcome)。

怎么做到呢?

最佳答案

编辑:

我认为循环查找字符串资源是答案之一。

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);
}

10-08 06:38
查看更多