news 2026/7/14 18:21:53

HarmonyOS7 资源管理与国际化:多语言适配配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS7 资源管理与国际化:多语言适配配置

文章目录

    • 前言
    • 资源目录结构
      • 代码实现
    • 在 string.json 里定义文案
    • 代码里引用:用 $r
    • 动态切换语言
      • 核心代码
    • 图片/布局也能分语言
    • 常见坑
    • 常见误区(小白必踩)
    • 完整可运行示例:多语言适配
      • 完整示例
      • 代码解析
    • 写在最后

前言

你的 app 想卖到海外,或者只是想支持"简体/繁体"切换,就得做国际化(i18n)。HarmonyOS 的资源管理体系把这件事变得很规范。

核心思路一句话:别把文字写死在代码里,全放进资源文件,按语言分目录。这篇文章我把资源配置、多语言切换、以及常见陷阱讲清。

资源目录结构

HarmonyOS 用resources/下的base(默认)和带限定词(如zh_CNen_US)的目录来区分语言:

代码实现

resources/ ├── base/element/string.json # 默认(兜底)文案 ├── zh_CN/element/string.json # 简体中文 └── en_US/element/string.json # 英文

系统会根据设备语言自动选对应目录。找不到才用base兜底。

在 string.json 里定义文案

// base/element/string.json{"string":[{"name":"hello","value":"Hello"},{"name":"login","value":"Login"}]}// zh_CN/element/string.json{"string":[{"name":"hello","value":"你好"},{"name":"login","value":"登录"}]}

每个文案用name作键,不同语言目录里name一致、value不同。

代码里引用:用 $r

Text($r('app.string.hello'))// 自动按当前语言取对应文案Button($r('app.string.login'))
  • $r('app.string.xxx'):引用string.jsonname=xxx的值。
  • 不要在代码里写Text('你好')这种字面值,否则切换语言它不会变。

动态切换语言

用户想手动切语言(而不依赖系统),需要改配置并重启资源上下文:

核心代码

import{i18n}from'@kit.LocalizationKit'functionchangeToEnglish(){i18n.setAppPreferredLanguage('en')// 设为英文// 通常还需重新加载页面或重启 Ability 让资源生效}
  • i18n.setAppPreferredLanguage('en'):设置 app 偏好语言。
  • 切换后建议引导用户重启 app 或重新加载当前页,资源才会刷新。

图片/布局也能分语言

不止文字,连图片、布局都能按语言分目录:在zh_CN/media/en_US/media/放同名不同图,引用时一样用$r('app.media.logo'),系统自动选。

常见坑

现象解决
文案写死在代码切换语言不变一律用$r引用
name 拼写不一致取不到报找不到多语言目录 name 必须一致
忘了 base 兜底某种语言缺字段崩base 放完整默认文案
切换不生效资源没重载切换后重启上下文

常见误区(小白必踩)

误区说明
文案写死在代码Text('你好')切换语言不变,必须一律用$r('app.string.xxx')引用。
多语言name不一致不同语言目录里name要对齐,否则取不到报找不到。
忘了base兜底某种语言缺字段直接崩,base 放完整默认文案。
切换不重载动态切语言后记得重启上下文让资源刷新。

下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。

完整可运行示例:多语言适配

Resource引用字符串,切换系统语言自动变。

完整示例

// 资源引用:中文/英文各一份,系统语言自动选@Entry@Componentstruct I18nDemo{build(){Column({space:16}){// $r 会按系统语言取对应资源Text($r('app.string.hello'))Text($r('app.string.welcome'))}.padding(20)}}

配套资源(resources/base/element/string.json 与 resources/en_US/element/string.json):

代码解析

{"string":[{"name":"hello","value":"你好"}]}// 中文{"string":[{"name":"hello","value":"Hello"}]}// 英文

你会看到什么:系统切到英文时,界面文字自动变成Hello,无需改代码——所有文案都走$r('app.string.xxx')资源引用。

动手改一改

  • 新增zh_TW资源目录,体验繁体适配。
  • $plurals处理「1 条消息 / 3 条消息」复数。
  • ResourceManager在 JS 逻辑里取字符串(不止 UI)。

写在最后

国际化三步走:文案进 string.json(不写死)、按语言分目录、代码用$r引用。图片、布局同理可分目录。再配合i18n动态切换,多语言就齐活了。

记住一条铁律:代码里出现任何用户可见的中文字符串,都是国际化的 bug。现在就回去扫一遍你的项目,把硬编码文案搬进资源文件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 18:21:16

YOLOV5 核显加速:OpenVINO异步推理实战与性能调优(附源码)

1. 为什么需要核显加速YOLOv5?在目标检测领域,YOLOv5凭借其出色的速度和精度平衡成为许多开发者的首选。但很多人在实际部署时会遇到一个尴尬问题:独立显卡(如NVIDIA GPU)往往被其他计算任务占用,而CPU推理…

作者头像 李华
网站建设 2026/7/14 18:17:35

嵌入式向量数据库:Zvec、ObjectBox、SQLite-Vector、SatoriDB

概述 偶然间看到嵌入式向量数据库,秃然对这个主题产生兴趣,于是产出此文。 说到嵌入式数据库,不严谨地说,大抵有两种形式,要么内存,要么文件。一般而言,几乎所有嵌入数据库,都支持…

作者头像 李华
网站建设 2026/7/14 18:14:19

点云深度学习系列博客(八): 面向自动驾驶场景的点云数据增强实战

1. 自动驾驶场景下的点云数据增强挑战激光雷达点云在自动驾驶系统中扮演着关键角色,但原始数据往往存在稀疏性、遮挡和动态场景适应三大核心问题。我在处理KITTI数据集时发现,单帧点云中车辆目标的平均有效点数不足200个,而行人的点云密度更低…

作者头像 李华
网站建设 2026/7/14 18:11:48

基于倍福控制系统和WPF构建工控安全监控系统的完整方案

一、系统架构设计 graph LR A[WPF上位机] -->|ADS通信| B(倍福PLC) B --> C[运动控制器] B --> D[安全门传感器] B --> E[温度变送器] C --> F[伺服驱动器] D --> G[门状态反馈] E --> H[加热器]二、核心功能实现 运动控制安全逻辑 IF 急停信号=TRUE OR …

作者头像 李华
网站建设 2026/7/14 18:11:22

小白程序员必看:大模型AI应用开发5年就业市场红利与入行指南

文章分析了大模型AI应用开发赛道的长期发展逻辑,指出未来五年人才缺口将超300万,岗位增速连年翻倍,薪资大幅领先传统技术岗。文章区分了底层大模型研发与落地应用开发赛道,强调后者适合普通人入局。 预判大模型AI应用开发未来五年…

作者头像 李华
网站建设 2026/7/14 18:09:29

Astro Theme Pure插件开发教程:如何扩展主题功能

Astro Theme Pure插件开发教程:如何扩展主题功能 【免费下载链接】astro-theme-pure ⭐ A simple, fast and powerful blog & document theme built by Astro 项目地址: https://gitcode.com/gh_mirrors/as/astro-theme-pure Astro Theme Pure是一款简单…

作者头像 李华