HarmonyOS 鸿蒙Next 如何动态更改resources下的string.json内容

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何动态更改resources下的string.json内容 App支持国际化,将词条默认配置各个限定词的string.json文件里,应种种情况,现在想新增或者修改一些词条的值,能否在运行时主动修改string.json里面的内容。这样就可以做到不必重新打包即可在线更新词条。

9 回复

string.json

{
  "name": "message",
  "value": "共有%s条数据。"
},
Text($r('app.string.message', this.message))

%s可以根据this.message的值改变。

更多关于HarmonyOS 鸿蒙Next 如何动态更改resources下的string.json内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不是哥,怎么没有解决办法

目前实现的方案就是重新写一个类,专门用来存储解析网络请求来的词条,所有词条都适用这个类提供的方法,没有使用系统的 $()方法。

貌似没有这种操作,资源基本是编译后是静态只读的。况且字符串存在于多个版本的string.json文件中,非一对一,API文档中resourceManager也只是一堆get。

如想动态替换可考虑提前附加判断方法,对下载数据和资源路径进行对比替换。

目前实现的方案的确是重新写了一些方法读取网络请求来的词条(并存储到沙盒),但是这样就不好使用系统自带的 $r() 方法了,使用不是和方便。

想过利用 aspect hook 一下 $r() 方法,但是需要这个方法的所在目标类 targetClass,而它又是一个全局的方法。没有想到有什么好的方案。

可用判断方式照用,定义好下载词条的格式,如:this.term 变量两种形式

资源:'app.string.name',网络词条:'net.string.xxx'

Text(this.term.includes('net') ? this.term.replace('net.string.', '') : $r(this.term))

或者统一搞个函数专门处理变量形式不同时的返回值,给需要的地方直接用,代码好看些。

现在的方案差不多就是这样的,只不过为了调用书写简便一些,我在类似的基础上再封装了一个全局方法。

在HarmonyOS(鸿蒙)系统中,直接动态更改resources目录下的string.json内容是不被支持的。鸿蒙系统的资源管理机制要求资源文件(如字符串资源)在编译时被打包进应用程序,并在运行时从资源包中读取,因此不允许在运行时直接修改这些文件。

如果你需要在应用中动态更改字符串资源,可以考虑以下几种替代方案:

  1. 使用内存中的数据结构:将需要动态更改的字符串存储在内存中的数据结构(如Map或Dictionary)中,而不是硬编码在string.json中。在运行时,你可以根据需要修改这些数据结构的内容。

  2. 动态加载资源:如果你的应用需要支持多语言或根据用户偏好更改资源,可以考虑使用鸿蒙系统提供的资源加载机制,在运行时根据条件加载不同的资源包。

  3. 持久化存储:对于需要在应用重启后仍然保留的更改,可以将更改后的字符串存储到持久化存储(如文件系统、数据库或SharedPreferences)中,并在应用启动时重新加载它们。

请注意,这些方案都需要在开发过程中进行适当的设计和编码。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部