目录

应用界面如何显示系统语言之外的语言

问题现象

系统设置中语言支持简体中文、繁体中文、英文、维吾尔文、藏文、俄文等语言,应用如何显示系统预置语言之外的其他语言?

背景知识

解决方案

应用可以通过在resources目录下添加限定词目录,如日语ja_JP、德语de_DE,增加不同语言资源文件后,在应用运行时,通过指定资源配置方式,让应用展示不同国家语言。

参考示例:

在Index.ets中,分别获取三种语言的资源并显示在文本框中,运行设备当前系统语言为中文,示例代码:

import { common } from '@kit.AbilityKit';


@Entry
@Component
struct Index {
  @State englishString: string = '';
  @State jpString: string = '';


  getString(): string {
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    let resMgr = context.resourceManager;
    let resId = $r('app.string.language').id;
    // 获取符合当前系统语言地区、颜色模式、分辨率等配置的资源
    let currentLanguageString = resMgr.getStringSync(resId);
    // 获取符合当前系统颜色模式、分辨率等配置的英文资源
    let overrideConfig = resMgr.getOverrideConfiguration();
    overrideConfig.locale = 'en_US'; // 指定资源的语言为英语,地区为美国
    let overrideResMgr = resMgr.getOverrideResourceManager(overrideConfig);
    this.englishString = overrideResMgr.getStringSync(resId);
    // 获取符合当前系统颜色模式、分辨率等配置的日文资源
    overrideConfig.locale = 'ja_JP'; // 指定资源的语言为日文,地区为日本
    overrideResMgr.updateOverrideConfiguration(overrideConfig); // 等效于resMgr.updateOverrideConfiguration(overrideConfig)
    this.jpString = overrideResMgr.getStringSync(resId);
    return currentLanguageString;
  }


  build() {
    Row() {
      Column() {
        Text(this.getString())
          .fontSize(45)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 10 });
        Text(this.englishString)
          .fontSize(45)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 10 });
        Text(this.jpString)
          .fontSize(45)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 10 });
      }
      .width('100%');
    }
    .height('100%');
  }
}