gpt4 book ai didi

android - 如何获取资源字符串的本地列表

转载 作者:行者123 更新时间:2023-11-29 02:35:17 26 4
gpt4 key购买 nike

有很多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;
}

但是好像没那么快,因为要循环的locale太多了(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);
}

关于android - 如何获取资源字符串的本地列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47463766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com