HarmonyOS 鸿蒙Next中如何配置应用的多语言支持?

HarmonyOS 鸿蒙Next中如何配置应用的多语言支持? 如何配置应用的多语言支持?

7 回复

看看这个:应用内语言切换

更多关于HarmonyOS 鸿蒙Next中如何配置应用的多语言支持?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


主要分为两步:1. 创建资源文件2. 在UI中引用资源


核心步骤与示例

第1步:创建多语言资源文件

在项目的 resources 目录下,你需要为每种支持的语言创建一个子目录,并在其中放置名为 string.json 的文件。

项目资源结构预览:

src/main/resources/
│
├── base/
│   └── element/                 # 默认资源(如:英文)
│       ├── string.json
│       └── ...
│
├── en_US/
│   └── element/                 # 美式英语资源
│       ├── string.json
│       └── ...
│
└── zh_CN/
    └── element/                 # 简体中文资源
        ├── string.json
        └── ...

1. 默认资源文件 (base/element/string.json): 通常将英文作为默认资源。如果系统语言找不到匹配的资源,就会回退到这里。

{
  "string": [
    {
      "name": "welcome_message",
      "value": "Hello World!"
    },
    {
      "name": "user_greeting",
      "value": "Hello, {%s}!"
    }
  ]
}

2. 中文资源文件 (zh_CN/element/string.json):

{
  "string": [
    {
      "name": "welcome_message",
      "value": "你好,世界!"
    },
    {
      "name": "user_greeting",
      "value": "你好,{%s}!"
    }
  ]
}

关键点:

  • name 是资源的键(Key),在所有语言文件中必须保持一致。
  • value 是资源的值(Value),即对应语言的翻译文本。
  • {%s}占位符,用于在运行时动态插入内容(如用户名)。

第2步:在ArkUI组件中引用资源

在ArkTS的UI描述(build()方法)中,使用 $r('app.string.xxx') 来引用资源。

  • $r: 是访问资源的专用函数。
  • 'app.string.xxx': 是资源的路径。
    • app: 代表从当前应用的资源中查找。
    • string: 代表资源类型是字符串。
    • xxx: 对应 string.json 中定义的 name

示例:一个简单的欢迎页面

// pages/Index.ets

@Entry
@Component
struct Index {
  // 定义一个状态变量,用于存储用户名
  @State userName: string = "Alice"

  build() {
    Column() {
      // 1. 直接引用一个简单的字符串资源
      // 系统会根据设备语言自动选择显示 "Hello World!" 或 "你好,世界!"
      Text($r('app.string.welcome_message'))
        .fontSize(30)
        .margin(10)

      // 2. 引用带有占位符的资源,并传入参数
      // 第二个参数是占位符的替换值数组
      // 会显示 "Hello, Alice!" 或 "你好,Alice!"
      Text($r('app.string.user_greeting', this.userName))
        .fontSize(20)
        .margin(10)

    }
    .width('100%')
    .height('100%')
  }
}

效果

当用户设备的系统语言切换时,你的应用无需重启,界面就会自动显示对应语言的文本。

  • 当系统语言为英文时,屏幕显示:

    Hello World!
    Hello, Alice!
    
  • 当系统语言为中文时,屏幕显示:

    你好,世界!
    你好,Alice!
    

高级用法:以编程方式获取资源字符串

有时你可能需要在非UI的代码逻辑中获取字符串,可以使用 ResourceManager API。

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

// 假设在某个函数中
try {
  // 1. 获取资源管理器实例
  const context: common.UIAbilityContext = ...; // 获取你的UIAbilityContext
  const resMgr = context.resourceManager;

  // 2. 获取资源对象
  let strValue = await resMgr.getString($r('app.string.welcome_message').id);
  console.log(strValue); // 打印出当前语言下的 "welcome_message" 值

} catch (error) {
  console.error(`Failed to get string. Code: ${error.code}, message: ${error.message}`);
}

总结

步骤 操作 说明
1 resources 下按语言创建目录 zh_CN/element/string.json
2 在所有 string.json 中定义相同 name 的键 保持Key一致,翻译Value
3 在UI中使用 $r('app.string.xxx') 引用 系统自动匹配当前语言

整个过程就像为你的应用准备了很多本不同语言的词典,你只需要在写代码时指明要查哪个词(Key),系统就会自动选择正确的那本词典(语言)并把结果(Value)给你。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

// resources/zh/element/string.json (中文)
{
  "string": [
    {
      "name": "welcome_message",
      "value": "%{userName},欢迎来到%{city}!"
    }
  ]
}
// resources/en-US/element/string.json (英文)
{
  "string": [
    {
      "name": "welcome_message",
      "value": "Welcome to %{city}, %{userName}!"
    }
  ]
}

请问对于这种有顺序的怎么办呢? %s不够用,

没事了,已解决,

在HarmonyOS Next中配置多语言支持,需在AppScope/resources目录下创建对应语言的element/string.json文件。例如中文配置:zh_CN/element/string.json;英文配置:en_US/element/string.json。每个文件需包含相同ID的字符串资源,如{"string":[{"name":"app_name","value":"MyApp"}]}。系统将根据设备语言环境自动匹配对应资源。若未匹配到对应语言,则默认使用base目录下的资源文件。

在HarmonyOS Next中配置多语言支持,主要通过以下步骤实现:

  1. 创建资源文件
    resources目录下按语言代码建立子目录(如zh_CNen_US),每个目录中创建element/string.json文件,定义对应语言的字符串资源。例如:

    // zh_CN/string.json
    { "message": "你好,世界!" }
    
    // en_US/string.json  
    { "message": "Hello World!" }
    
  2. 引用多语言资源
    在代码或布局文件中通过$r('app.string.message')动态获取当前系统语言对应的字符串。

  3. 适配系统语言切换
    使用ResourceManager监听语言变化,通过updateConfiguration更新应用上下文配置,触发界面刷新:

    import i18n from '[@ohos](/user/ohos).i18n';
    // 获取当前语言并设置资源
    
  4. 注意事项

    • 默认语言资源放在base目录中,作为备选。
    • 支持区域细分(如zh_Hans_CN),系统会自动匹配最接近的语言资源。
    • 可通过i18n.getSystemLanguage()获取系统当前语言。

通过以上配置,应用可根据系统语言自动切换显示文本,无需手动干预。

回到顶部