在 OpenHarmony(ArkUI / eTS 或 JS) 中,菜单(Menu、ContextMenu、自定义菜单等)做国际化(i18n),核心思路是:文案不硬编码,统一走资源文件 + 语言切换机制。
下面按推荐做法一步步说明。
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"
}
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')会自动根据系统语言加载对应资源
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 内切换语言(如设置页):
import i18n from '@ohos.i18n'
i18n.setLanguage('en-US')
⚠️ 注意:
$r() 通常跟随系统语言// 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
如果你愿意,我可以:
你用的是 OpenHarmony 几?ArkTS 还是 JS?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。