HarmonyOS 鸿蒙Next 如何动态更改resources下的string.json内容
HarmonyOS 鸿蒙Next 如何动态更改resources下的string.json内容 App支持国际化,将词条默认配置各个限定词的string.json文件里,应种种情况,现在想新增或者修改一些词条的值,能否在运行时主动修改string.json里面的内容。这样就可以做到不必重新打包即可在线更新词条。
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
{name: value:}
不是哥,怎么没有解决办法
目前实现的方案就是重新写一个类,专门用来存储解析网络请求来的词条,所有词条都适用这个类提供的方法,没有使用系统的 $()方法。
貌似没有这种操作,资源基本是编译后是静态只读的。况且字符串存在于多个版本的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))
或者统一搞个函数专门处理变量形式不同时的返回值,给需要的地方直接用,代码好看些。
现在的方案差不多就是这样的,只不过为了调用书写简便一些,我在类似的基础上再封装了一个全局方法。