Administrator
发布于 2026-09-01 / 91 阅读
0
0

鸿蒙应用国际化:多语言资源、RTL 适配与动态切换

系列文章《鸿蒙开发从入门到专家》第 30 篇 · 高级

应用出海或者服务多语言用户时,国际化(i18n)不是简单翻译几段文案。它涉及资源组织、文本排版、日期数字格式、甚至界面布局方向。鸿蒙在这块提供了比较完整的资源管理机制,本文把关键用法串起来。

一、多语言资源组织

鸿蒙应用的多语言资源放在 resources/ 目录下,按语言和地区分文件夹:

resources/
  base/
    element/
      string.json
  zh_CN/
    element/
      string.json
  en_US/
    element/
      string.json
  ar_SA/
    element/
      string.json

base 是默认资源,当系统找不到当前语言对应的资源时回退到 base。建议在 base 里放英文或中文,保证至少有一套兜底。

string.json 示例:

{
  "string": [
    {
      "name": "app_name",
      "value": "MyApp"
    },
    {
      "name": "welcome_message",
      "value": "Welcome to MyApp"
    }
  ]
}

代码中引用:

Text($r('app.string.welcome_message'))

二、图片与布局的国际化

文案翻译只是第一步。不同语言的文案长度差异很大,按钮、标签可能因此截断。建议:

  • 文本容器使用 maxLines 和 textOverflow 做兜底。

  • 按钮宽度不要写死,优先用 padding 控制。

  • 图片资源如果包含文字,也要按语言拆分,放在对应目录。

Image($r('app.media.logo'))
  .width(120)
  .objectFit(ImageFit.Contain)

只要把 logo.png 放到 zh_CN/media/ 和 en_US/media/ 下,系统会根据当前语言自动选择。

三、日期、数字与货币格式化

硬编码日期格式是国际化常见坑。不同地区习惯完全不同:

  • 中国:2026-09-01

  • 美国:09/01/2026

  • 德国:01.09.2026

鸿蒙通过 @kit.LocalizationKit 提供格式化能力:

import { i18n } from '@kit.LocalizationKit';

const date = new Date();
const formatter = new i18n.DateTimeFormat('zh-CN', {
  dateStyle: 'medium',
});
console.info(formatter.format(date));

数字和货币:

const numberFormatter = new i18n.NumberFormat('en-US');
console.info(numberFormatter.format(1234567.89)); // 1,234,567.89

const currencyFormatter = new i18n.NumberFormat('zh-CN', {
  style: 'currency',
  currency: 'CNY',
});
console.info(currencyFormatter.format(100)); // ¥100.00

四、RTL 布局适配

阿拉伯语、希伯来语等语言从右向左排版。鸿蒙 ArkUI 支持 direction: Direction.Rtl,但很多细节需要手动处理。

Column() {
  Text('مرحبا')
}
.direction(Direction.Rtl)

更关键的是图标和箭头方向。一个指向右侧的“下一步”箭头,在 RTL 下应该镜像指向左侧。建议:

  • 使用对称图标,避免方向性歧义。

  • 必须带方向的图标准备 RTL 版本,放到 ar_SA/media/。

  • 列表的 leading/trailing 图标根据 isRtl 动态切换。

import { i18n } from '@kit.LocalizationKit';
const isRtl = i18n.getSystemLocale().startsWith('ar');

五、动态语言切换

系统语言切换会由系统通知应用重建。但有些应用希望用户在内置设置里独立切换语言,不重启系统。

鸿蒙支持通过 Context 配置语言:

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

const context = getContext(this);
context.config.language = 'zh'; // 或 'en'
context.updateConfiguration(context.config);

动态切换后,已经创建的页面不会自动刷新,需要应用自己重建当前页面或重启 Ability。常见做法是切换后调用 abilityContext.restart() 或跳转到启动页重新加载。

六、实战:设置页的多语言切换

一个标准的语言设置页:

  1. 列出支持的语言列表。

  2. 用户选择后保存偏好到 Preferences。

  3. 下次启动时读取偏好,调用 context.config.language 设置。

  4. 提供“跟随系统”选项,清空偏好,使用系统默认。

注意:不要把语言偏好存到 RDB 里再用异步查询,启动阶段可能还没初始化完。Preferences 更适合这种启动即读的配置。

小结

国际化是细节密集型工作,上线前必须做真机多语言测试:

  • 文案走资源文件,不要硬编码。

  • 日期、数字、货币用系统格式化 API。

  • RTL 语言要检查图标方向和布局镜像。

  • 语言切换偏好用 Preferences 存储,启动时尽早生效。

到本篇为止,《鸿蒙开发从入门到专家》已经完成 30 篇。我们从 DevEco Studio 起步,经过 ArkTS、ArkUI、数据、网络、权限、性能、分布式,再到车机、手表、IoT 和国际化,基本覆盖了鸿蒙应用开发的完整技能树。下一批将进入更专精的工程化与性能调优主题。


评论