系列文章《鸿蒙开发从入门到专家》第 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() 或跳转到启动页重新加载。
六、实战:设置页的多语言切换
一个标准的语言设置页:
列出支持的语言列表。
用户选择后保存偏好到 Preferences。
下次启动时读取偏好,调用
context.config.language设置。提供“跟随系统”选项,清空偏好,使用系统默认。
注意:不要把语言偏好存到 RDB 里再用异步查询,启动阶段可能还没初始化完。Preferences 更适合这种启动即读的配置。
小结
国际化是细节密集型工作,上线前必须做真机多语言测试:
文案走资源文件,不要硬编码。
日期、数字、货币用系统格式化 API。
RTL 语言要检查图标方向和布局镜像。
语言切换偏好用 Preferences 存储,启动时尽早生效。
到本篇为止,《鸿蒙开发从入门到专家》已经完成 30 篇。我们从 DevEco Studio 起步,经过 ArkTS、ArkUI、数据、网络、权限、性能、分布式,再到车机、手表、IoT 和国际化,基本覆盖了鸿蒙应用开发的完整技能树。下一批将进入更专精的工程化与性能调优主题。