gpt4 book ai didi

android - 如何遍历所有字符串、所有模块和所有语言?

转载 作者:搜寻专家 更新时间:2023-11-01 09:36:25 26 4
gpt4 key购买 nike

背景

我知道可以迭代给定 R java 文件的所有字符串,使用反射本身(基于 here ):

    for (Field field : R.string.class.getDeclaredFields()) {
if (Modifier.isStatic(field.getModifiers()) && !Modifier.isPrivate(field.getModifiers()) && field.getType().equals(int.class)) {
try {
int stringResId = field.getInt(null);
Log.d("AppLog", field.getName() + ":" + getResources().getString(stringResId));
} catch (IllegalArgumentException | IllegalAccessException e) {
Log.e("AppLog", e.toString());
}
}
}

这将使用当前语言环境显示应用中使用的所有字符串,包括所有模块(它们已合并)。

问题

是否可以遍历特定模块的所有字符串(或除特定模块之外的所有字符串),并以所有支持的语言遍历它们?

最佳答案

Is it possible to iterate over all strings of specific modules (or all except specific ones

没有。资源没有“模块”的概念。

正如您已经注意到的,这些都合并到一个 R 中。因此,您唯一的机会是使键唯一(即带前缀),然后在您的步行过程中跳过所有没有前缀的键,或者您可以创建单独的元素来保存给定模块中字符串的所有键并稍后处理它,这应该是比全部迭代更快,维护起来仍然很痛苦。或者您可以将两者结合起来,并在启动时基于前缀构建这样的过滤数组,然后在您需要多次访问它时对其进行处理。

编辑

For example, iterate over both English and German strings ?

首先,请注意,对于大多数条目,您将使用相同的键(这很明显,但很容易被忽视)。要迭代两者,您需要获得正确的资源上下文:

Resources rsrc = getResources();
Configuration config = new Configuration(rsrc.getConfiguration());
config.locale = Locale.US; //
Resources localeResources = new Resources(rsrc.getAssets(), rsrc.getDisplayMetrics(), config);

然后照常阅读。然后在配置中重复设置 Locale.GERMAN

编辑 2

also iterate over them in all supported languages

理论上 AssetManager 的特点 getLocales() :

Get the locales that this asset manager contains data for.

但是当您意识到“包含数据用于”不是您的意思时,事情就变得棘手了。包括也提供希腊语翻译的外部库就足够了,也可以返回希腊语。

因此,最简单的方法可能只是将受支持语言的索引保留为代码的一部分,无论是直接在代码中还是作为资源中的数组,只要您想知道您的应用程序支持哪些语言,就可以依赖它。这应该易于维护,你甚至可以创建小的 gradle 任务来让你拥有这个在构建时生成。

关于android - 如何遍历所有字符串、所有模块和所有语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806443/

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