HarmonyOS鸿蒙Next中如何使应用内的语言设置为跟随系统或者强制为中文或英文?

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

3 回复

真机效果:

cke_2186.gif

实现步骤:

1、定义资源文件

2、使用I18n.System.setAppPreferredLanguage()进行设置关联当前语言资源模块

3、使用commonEventManager来监听公共事件COMMON_EVENT_LOCALE_CHANGED可以感知系统语言、系统地区或系统区域变化

4、使用I18n.System.getSystemLanguage()获取当前系统语言

背景知识:

具体实现:

 1、定义资源文件

cke_15321.jpeg

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-CNen-US等子目录存放对应语言的字符串资源。应用启动时,系统自动加载与设备语言匹配的资源。若需强制指定语言,可在entry/src/main/resources/base/profile中配置"locale": "zh-CN"。也可在代码中动态设置,使用i18ngetInstance()方法获取实例并调用setLocale()切换语言。

在HarmonyOS Next中,应用内语言设置可通过ResourceManagerConfiguration实现。以下是核心方法:

1. 跟随系统语言

应用默认跟随系统语言,无需特殊设置。确保资源目录正确命名(如zh-CNen-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及以上版本,实际开发时需根据具体场景调整界面刷新逻辑。

回到顶部