【问题标题】:Replacing @string/stringId in Android dynamically动态替换Android中的@string/stringId
【发布时间】:2020-06-16 03:35:00
【问题描述】:

我想动态获取android布局xml文件中的字符串翻译,所以基本上在XML文件中使用@string/stringId的任何地方,都应该为这个字符串Id调用一个java函数来获取相应的翻译。

这可能吗?

【问题讨论】:

  • 不是直接的。 Android R 提供了一个ResourceLoader 来帮助解决这类问题,我希望AppCompatActivity 将来某个时候能提供一个向后移植。
  • 你的意思是从远程资源获取翻译?
  • @CommonWare,您能详细说明一下吗?如何使用 ResourceLoader 以便在布局 xml 中使用 @string/ 的任何位置调用我的函数?我可以修改注释以将字符串 Ids 传递给我的函数,但是如何使用 xml 调用资源加载器?
  • @Cory Roy,是的。只有字符串 ID 将存储在应用程序中,根据共享首选项或输入中的用户区域设置,将获取翻译。

标签: android xml


【解决方案1】:

在 XML 文件中

android:text="@string/app_name"

将 app_name 替换为您的字符串

在 Java 文件中

TextView t;
t.setText.(getString(R.string.YOUR_STRING_NAME));

【讨论】:

  • 嗨,我无法直接在 XML 文件中替换,因为我在编译期间只有 stringIds。我将在运行时通过调用我的 API 来填充我的地图,然后我可以使用这个地图来获取翻译。
【解决方案2】:

我确信这是可能的,但听起来完全没有必要。

您是否阅读过: https://developer.android.com/guide/topics/resources/localization

通常,每种语言都有一个单独的 XML 文件,使用相同的字符串键,但位于由其语言环境命名的目录中。

例子:

假设您的应用的默认语言是英语。还假设 您想将应用程序中的所有文本本地化为法语,并且大多数 将应用中的文本(除应用标题外的所有内容)改成日语。 在这种情况下,您可以创建三个替代的 strings.xml 文件, 每个都存储在特定于语言环境的资源目录中:

res/values/strings.xml 包含所有字符串的英文文本 应用程序使用,包括名为标题的字符串的文本。 res/values-fr/strings.xml 包含所有字符串的法语文本, 包括标题。 res/values-ja/strings.xml 包含日语文本 除了标题之外的所有字符串。如果您的基于 Java 的代码是指 R.string.title,这是运行时发生的情况:

如果设备设置为法语以外的任何语言,Android 会加载 res/values/strings.xml 文件中的标题。如果设备设置为 法语,Android 从res/values-fr/strings.xml 文件加载标题。

然后你可以选择在你的xml布局文件中硬编码stringId(通过@string/title)或者在java中通过(view.setText(R.string.title))以编程方式分配字符串

【讨论】:

  • 您好,这些字符串静态存储在 XML 文件中,我的要求是在运行时动态获取字符串,这就是为什么要将 @string 注释替换为会调用我在运行时填充的 Map 的原因
  • @Sahil 我做了一个实现,我们将在本地缓存服务器本地化。如果这些字符串的变化不是太快,您也许可以预取它们,将它们存储在房间或共享首选项中以便在绑定视图时抓取?
  • 在代码中绑定视图并设置字符串是很费功夫的。我将采用创建自定义视图的方法,在该视图中我的地图将被调用以获取翻译。因此,@string/string_id 在自定义视图中被 string_id 替换,我将在覆盖的 setText 方法中替换为翻译。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2012-10-04
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多