与本地人打交道时有很多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);
}