在HarmonyOS NEXT开发中Navigation的 .menus()方法中传入的value值(菜单名称)如何实现文字本地化?

在HarmonyOS NEXT开发中Navigation的 .menus()方法中传入的value值(菜单名称)如何实现文字本地化?目前尝试给Navigation的 .menus()方法中传入的value值使用string资源
代码:value: $r(‘app.string.Page_close’)
报错:Type ‘Resource’ is not assignable to type ‘string’. <ArkTSCheck>
示例代码:

build() { 
  Navigation() { 
    Web({ src: this.webUrl, controller: this.controller }) 
      .backgroundColor($r('app.color.start_window_background'))// .darkMode(WebDarkMode.Auto) 
      .darkMode(this.mode)//深色适配3 
      .forceDarkAccess(this.access)//深色适配4 
        //Web过滚动模式开启 
      .overScrollMode(OverScrollMode.ALWAYS)// 否允许加载超文本传输协议(HTTP)和超文本传输安全协议(HTTPS)混合内容,默认不允许加载HTTP和HTTPS混合内容。 
      .mixedMode(MixedMode.Compatible) 
      .onPageBegin((event) => { 
        this.pageEnd = false 
      }) 
      .onPageEnd(() => { 
        this.pageEnd = true 
        if (this.webTitle == '') { 
          this.webTitle = this.controller.getTitle() 
        } 
      }) 
    if (!(this.pageEnd)) { 
      LodingView() //等待指示器 
    } 
  } 
  .width('100%') 
  .height('100%') 
  .title(this.NavigationTitle) 
  .titleMode(NavigationTitleMode.Mini) 
  .hideBackButton(true) 
  .menus([{ 
    value: '上一页', icon: 'resources/base/media/web_back.png', action: () => { 
      this.controller.backward() 
    } 
  }, 
    { 
      value: '下一页', icon: 'resources/base/media/web_next.png', action: () => { 
      this.controller.forward() 
    } 
    }, 
    { 
      value: '刷新', icon: 'resources/base/media/web_refresh.png', action: () => { 
      this.controller.refresh(); 
    } 
    }, 
    { 
      value: $r('app.string.Page_close'), icon: 'resources/base/media/web_close.png', action: () => { 
      router.back(); 
    } 
    } 
  ]) 
 
}
阅读 1.2k
avatarAI BotBETA

在 HarmonyOS NEXT 中实现 Navigation.menus() 的 value 本地化,需要改用 $rawfile 方式引用字符串资源。正确写法如下:

value: $rawfile('app.string.Page_close')

错误原因分析:
$r() 返回的是 Resource 类型,而 menus() 的 value 需要 string 类型。ArkTS 的类型检查会阻止这种类型不匹配的情况。

完整解决方案:

  1. resources/zh-CN/element/string.json 中添加:

    {
      "string": [
     {
       "name": "Page_close",
       "value": "关闭页面"
     }
      ]
    }
  2. 修改菜单项写法:

    {
      value: $rawfile('app.string.Page_close'),
      icon: 'resources/base/media/web_close.png',
      action: () => {
     router.back();
      }
    }

其他注意事项:

  1. 确保资源文件路径和键名正确
  2. 不同语言版本要在对应目录下创建 string.json
  3. $rawfile 会自动处理当前系统语言的资源加载
  4. 如果使用动态值,可通过 this.context.resourceManager.getStringValue() 获取

类型验证:

  • $rawfile() 返回 string 类型
  • $r() 返回 Resource 类型
  • menus() 的 value 要求 string 类型

这种写法既满足类型检查要求,又能实现文本本地化效果。

1 个回答

你可以将Resource类型转为资源对应的真实类型比如在string.json中定义了一个{“name”: “module_desc”,“value”: “module description”}的资源
可以通过$r(‘app.string.module_desc’)获取到Resource,也可以使用对应的方法如getStringByName获取到Resource对应的值(也就是"module description"字符串)参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...