OpenHarmony滑杆多语言切换实现
一 实现思路
二 资源与目录结构
resources/
└── base/
└── element/
└── strings.json // 默认语言
└── zh-CN/
└── element/
└── strings.json // 中文
└── en-US/
└── element/
└── strings.json // 英文
{
"name": "string",
"strings": [
{ "name": "volume", "value": "音量" },
{ "name": "brightness", "value": "亮度" },
{ "unit_percent", "value": "%" }
]
}
三 示例代码 ETS 与 JS FA 两种实现
// 语言资源键(与 strings.json 保持一致)
const STR = {
volume: $r('app.string.volume'),
brightness: $r('app.string.brightness'),
unitPercent: $r('app.string.unit_percent')
}
@Entry
@Component
struct MainPage {
@State volume: number = 50
@State brightness: number = 70
@State lang: string = 'zh-CN' // 持久化读取后初始化
build() {
Column({ space: 12 }) {
Text(STR.volume).fontSize(16)
Slider({
value: this.volume,
min: 0, max: 100, step: 1
})
.showTips(true)
.onChange((v: number) => { this.volume = v })
Text(STR.brightness).fontSize(16)
Slider({
value: this.brightness,
min: 0, max: 100, step: 5
})
.showTips(true)
.onChange((v: number) => { this.brightness = v })
Text(`${this.volume}${STR.unitPercent}`)
Text(`${this.brightness}${STR.unitPercent}`)
Picker({ range: ['zh-CN', 'en-US'] })
.selected(this.lang)
.onChange((lang: string) => this.changeLang(lang))
}
.padding(16)
}
private async changeLang(lang: string) {
this.lang = lang
// 1) 持久化
// Preferences.putSync('user_lang', lang)
// 2) 更新资源配置
const ctx = getContext(this) as common.UIAbilityContext
const resMgr = ctx.resourceManager
const newCfg: resource.Configuration = { locale: lang }
await resMgr.updateConfiguration(newCfg)
// 3) 刷新当前页面(API 9+ 可用热更新;低版本可重启 Ability)
ctx.startAbility({
bundleName: 'com.example.myapp',
abilityName: 'MainAbility',
action: 'action.reload' // 需在目标 Ability 的 config.json 声明
})
}
}
// index.js
export default {
data: {
volume: 50,
brightness: 70,
lang: 'zh-CN',
STR: {
volume: $r('app.string.volume'),
brightness: $r('app.string.brightness'),
unitPercent: $r('app.string.unit_percent')
}
},
changeLang(lang) {
this.lang = lang
// 1) 持久化
// preferences.putSync('user_lang', lang)
// 2) 更新资源配置
const ctx = this.$context
const rm = ctx.resourceManager
const cfg = { locale: lang }
rm.updateConfiguration(cfg).then(() => {
// 3) 刷新当前页面(API 9+ 热更新;低版本重启)
ctx.startAbility({
bundleName: 'com.example.myapp',
abilityName: 'MainAbility',
action: 'action.reload'
})
}).catch(console.error)
}
}
四 进阶与注意事项
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。