HarmonyOS鸿蒙Next中如何使应用内的语言设置为跟随系统或者强制为中文或英文?
HarmonyOS鸿蒙Next中如何使应用内的语言设置为跟随系统或者强制为中文或英文? 附带演示效果及代码片段
真机效果:

实现步骤:
1、定义资源文件
2、使用I18n.System.setAppPreferredLanguage()进行设置关联当前语言资源模块
3、使用commonEventManager来监听公共事件COMMON_EVENT_LOCALE_CHANGED可以感知系统语言、系统地区或系统区域变化
4、使用I18n.System.getSystemLanguage()获取当前系统语言
背景知识:
- [@ohos.i18n(国际化-I18n)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-i18n):该模块提供系统相关的或者增强的国际化能力,包括区域管理、电话号码处理、日历等。
- setAppPreferredLanguage:设置应用偏好语言。设置后,应用将优先加载应用偏好语言对应的资源。设置偏好语言为’default’后,应用语言将跟随系统语言,应用启动后生效。
具体实现:
1、定义资源文件

base & zh_CN→element→string.json
{
"string": [
{
"name": "module_desc",
"value": "模块描述"
},
{
"name": "language_button",
"value": "语言切换"
}
]
}
en_US→element→string.json
{
"string": [
{
"name": "module_desc",
"value": "module description"
},
{
"name": "language_button",
"value": "Change Language"
}
]
}
2、使用I18n.System.setAppPreferredLanguage()进行设置关联当前语言资源模块
I18n.System.setAppPreferredLanguage('zh-Hans'); //设置应用内语言为中文
| 参数名 | 对应模块 | 说明 |
|---|---|---|
| zh-Hans | zh_CN | 中文 |
| en-Latn-US | en_US | 英文 |
| default | base | 跟随系统设置 |
3、使用commonEventManager来监听公共事件COMMON_EVENT_LOCALE_CHANGED可以感知系统语言、系统地区或系统区域变化
let subscriber: commonEventManager.CommonEventSubscriber; // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
// 通过监听公共事件COMMON_EVENT_LOCALE_CHANGED可以感知系统语言、系统地区或系统区域变化
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: [commonEventManager.Support.COMMON_EVENT_LOCALE_CHANGED]
};
// 创建订阅者
commonEventManager.createSubscriber(subscribeInfo)
.then((commonEventSubscriber: commonEventManager.CommonEventSubscriber) => {
subscriber = commonEventSubscriber;
commonEventManager.subscribe(subscriber, (err, data) => {
if (err) {
return;
}
//监听回调成功:获取当前系统语言并进行应用内设置
//...
})
})
.catch((err: BusinessError) => {
});
4、使用I18n.System.getSystemLanguage()获取当前系统语言
I18n.System.getSystemLanguage()
完整代码:
import I18n from '[@ohos](/user/ohos).i18n';
import { BusinessError,commonEventManager } from '@kit.BasicServicesKit';
@Component
export struct ChangeLanguage {
@State languageCnStr: string = '默认'
aboutToAppear(): void {
let subscriber: commonEventManager.CommonEventSubscriber; // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
// 通过监听公共事件COMMON_EVENT_LOCALE_CHANGED可以感知系统语言、系统地区或系统区域变化
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: [commonEventManager.Support.COMMON_EVENT_LOCALE_CHANGED]
};
// 创建订阅者
commonEventManager.createSubscriber(subscribeInfo)
.then((commonEventSubscriber: commonEventManager.CommonEventSubscriber) => {
console.info("CreateSubscriber");
subscriber = commonEventSubscriber;
commonEventManager.subscribe(subscriber, (err, data) => {
if (err) {
console.error(`Failed to subscribe common event. error code: ${err.code}, message: ${err.message}.`);
return;
}
console.info("The subscribed event has occurred."); // 系统语言、系统地区或系统区域变化时执行
this.setSystemLanguage()
})
})
.catch((err: BusinessError) => {
console.error(`CreateSubscriber failed, code is ${err.code}, message is ${err.message}`);
});
this.setSystemLanguage()
}
setSystemLanguage(){
switch (I18n.System.getSystemLanguage()) {
case "zh-Hans":
this.languageCnStr = '中文'
I18n.System.setAppPreferredLanguage('zh-Hans');
break
case "en-Latn-US":
this.languageCnStr = '英文'
I18n.System.setAppPreferredLanguage('en-Latn-US');
break
}
}
@Builder
btn(btnStr: string, languageStr: string = "default"){
Button(btnStr).onClick(() => {
I18n.System.setAppPreferredLanguage(languageStr);
}).margin({top: 15,bottom: 15})
}
build() {
Column() {
// 获取应用偏好语言
Text(`默认语言为:${this.languageCnStr}`).margin({bottom:15});
Row(){
Text('app.string.module_desc:')
Text($r('app.string.module_desc'));
}.justifyContent(FlexAlign.Start)
this.btn('语言设置为跟随系统')
this.btn('语言设置为中文','zh-Hans')
this.btn('语言设置为英文', 'en-Latn-US')
}
}
}
//...组件引用
@Entry
@Component
struct Index {
build() {
Column() {
ChangeLanguage()
}.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
}
更多关于HarmonyOS鸿蒙Next中如何使应用内的语言设置为跟随系统或者强制为中文或英文?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,应用内语言设置可通过i18n模块实现。在resources目录下创建zh-CN和en-US等子目录存放对应语言的字符串资源。应用启动时,系统自动加载与设备语言匹配的资源。若需强制指定语言,可在entry/src/main/resources/base/profile中配置"locale": "zh-CN"。也可在代码中动态设置,使用i18n的getInstance()方法获取实例并调用setLocale()切换语言。
在HarmonyOS Next中,应用内语言设置可通过ResourceManager和Configuration实现。以下是核心方法:
1. 跟随系统语言
应用默认跟随系统语言,无需特殊设置。确保资源目录正确命名(如zh-CN、en-US)即可自动匹配。
2. 强制指定语言
通过修改应用配置实现语言强制设置:
import { BusinessError } from '@ohos.base';
import { I18n } from '@ohos.i18n';
import { common } from '@ohos.app.ability.common';
// 获取资源管理器
let context: common.UIAbilityContext = ...; // 获取UIAbilityContext
let resMgr = context.resourceManager;
// 设置语言(示例:强制英文)
try {
let sysLocale: I18n.Locale = I18n.Locale.forLanguageTag('en-US');
let configuration: Configuration = {
locale: sysLocale.toString()
};
resMgr.updateConfiguration(configuration);
} catch (error) {
console.error(`强制设置语言失败,错误码: ${(error as BusinessError).code}`);
}
3. 动态切换示例
结合界面按钮实现语言切换:
// 切换至中文
switchToChinese(): void {
this.setAppLocale('zh-CN');
}
// 切换至英文
switchToEnglish(): void {
this.setAppLocale('en-US');
}
// 公共设置方法
private setAppLocale(localeTag: string): void {
let sysLocale: I18n.Locale = I18n.Locale.forLanguageTag(localeTag);
let configuration: Configuration = {
locale: sysLocale.toString()
};
this.resMgr.updateConfiguration(configuration);
// 刷新界面(需自行实现页面重载逻辑)
this.reloadPage();
}
4. 资源文件结构
resources/
├── base/ # 默认资源
├── zh-CN/ # 中文资源
└── en-US/ # 英文资源
注意事项:
- 强制设置语言仅影响当前应用
- 语言变更后需手动刷新界面显示
- 系统语言切换时,未强制设置的应用会自动同步更新
此方案适用于HarmonyOS Next API 9及以上版本,实际开发时需根据具体场景调整界面刷新逻辑。

