温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

OpenHarmony菜单如何做国际化

发布时间:2026-10-10 06:52:50 来源:亿速云 阅读:92 作者:小樊 栏目:软件技术

在 OpenHarmony(ArkUI / eTS 或 JS) 中,菜单(Menu、ContextMenu、自定义菜单等)做国际化(i18n),核心思路是:文案不硬编码,统一走资源文件 + 语言切换机制。

下面按推荐做法一步步说明。


一、OpenHarmony 国际化基础

OpenHarmony 使用 资源(resources) 来做多语言:

resources/
 ├─ base/
 │   └─ element/
 │      └─ string.json
 ├─ en_US/
 │   └─ element/
 │      └─ string.json
 ├─ zh_CN/
 │   └─ element/
 │      └─ string.json

示例

zh_CN/element/string.json

{
  "menu_copy": "复制",
  "menu_delete": "删除",
  "menu_share": "分享"
}

en_US/element/string.json

{
  "menu_copy": "Copy",
  "menu_delete": "Delete",
  "menu_share": "Share"
}

二、在代码中引用字符串(重点)

ArkTS(推荐)

import { Resource } from '@ohos.base';

@Entry
@Component
struct MenuExample {
  @State menuItems: Array<string> = [
    $r('app.string.menu_copy'),
    $r('app.string.menu_delete'),
    $r('app.string.menu_share')
  ]

  build() {
    Column() {
      Button('Show Menu')
        .onClick((event) => {
          let menu = new Menu()
          this.menuItems.forEach((item) => {
            menu.addItem(item)
          })
          menu.show()
        })
    }
  }
}

$r('app.string.xxx') 会自动根据系统语言加载对应资源


三、ContextMenu(右键 / 长按菜单)国际化

Image($r('app.media.icon'))
  .bindContextMenu({
    items: [
      { text: $r('app.string.menu_copy') },
      { text: $r('app.string.menu_delete') }
    ],
    onSelect: (index) => {
      console.log(index.toString())
    }
  })

✅ 菜单文字会随系统语言自动切换


四、自定义菜单(推荐可控性最强)

@Entry
@Component
struct CustomMenu {
  @State showMenu: boolean = false

  build() {
    Stack() {
      Button('Menu')
        .onClick(() => this.showMenu = true)

      if (this.showMenu) {
        Column() {
          Text($r('app.string.menu_copy')).fontSize(16)
          Text($r('app.string.menu_delete')).fontSize(16)
          Text($r('app.string.menu_share')).fontSize(16)
        }
        .padding(10)
        .backgroundColor('#FFFFFF')
      }
    }
  }
}

五、动态切换语言(不依赖系统)

如果需要 App 内切换语言(如设置页):

1️⃣ 使用 i18n 模块

import i18n from '@ohos.i18n'

i18n.setLanguage('en-US')

⚠️ 注意:

  • 系统级语言 ≠ App 级语言
  • $r() 通常跟随系统语言

2️⃣ 推荐做法:自己封装 i18n 工具

// i18n.ts
const messages = {
  'zh-CN': {
    copy: '复制',
    delete: '删除'
  },
  'en-US': {
    copy: 'Copy',
    delete: 'Delete'
  }
}

export function t(key: string) {
  const lang = AppStorage.Get('language') || 'zh-CN'
  return messages[lang][key]
}

使用:

Text(t('copy'))

六、菜单国际化最佳实践

✅ 用 $r() 处理系统语言
✅ 用资源文件而不是写死字符串
✅ App 内切换语言 → 自定义 i18n
✅ 菜单结构(顺序、图标)与文案分离


七、常见坑

❌ 菜单写死中文
❌ 用 if (lang === 'en') 判断
❌ 忘记配置 resources/en_US


如果你愿意,我可以:

  • 给你一个 完整 Menu + i18n 示例工程
  • 讲 OpenHarmony 3.x / 4.x 差异
  • 讲 Stage 模型 vs FA 模型国际化区别

你用的是 OpenHarmony 几?ArkTS 还是 JS?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手