搭建开发环境
安装node.js
安装node.js,点击进入官网地址
 ![![[Pasted image 20250423155031.png]]](https://i-blog.csdnimg.cn/direct/f5a8b908f9744286bca908d1f33ed5cb.png)
安装lv_i18n
- lv_i18n项目地址:Github:https://github.com/lvgl/lv_i18n
- git运行命令安装lv_i18n:npm i lv_i18n -g。测试命令:lv_i18n -h
  
搭建过程报错

npm error code CERT_HAS_EXPIRED
npm error errno CERT_HAS_EXPIRED
npm error request to https://registry.npm.taobao.org/lv_i18n failed, reason: certificate has expired
npm error Log files were not written due to an error writing to the directory: C:\Program Files\nodejs\node_cache\_logs
npm error You can rerun the command with `--loglevel=verbose` to see the logs in your terminal
原因:你配置的 npm registry 镜像(https://registry.npm.taobao.org)证书已经过期,npm 拒绝访问不安全的 HTTPS 资源。
 更换为官方镜像
npm config set registry https://registry.npmjs.org/
然后再执行安装命令:
npm install lv_i18n -g
![![[Pasted image 20250422184512.png]]](https://i-blog.csdnimg.cn/direct/0bd8f4edde0f441a8bf14465432b5cce.png)
这是 权限不足 导致的错误,Windows 拒绝了 npm 在 C:\Program Files\nodejs\ 目录下写入缓存文件,因为这个目录通常需要管理员权限。
 ![![[Pasted image 20250422184628.png]]](https://i-blog.csdnimg.cn/direct/2d1e98a3a1194766b27e3080e81428ca.png)
以管理员身份运行后成功。采用lv_i18n -h验证是否安装成功。
 ![![[Pasted image 20250423091418.png]]](https://i-blog.csdnimg.cn/direct/a4fbfb8c40b54af99033a38a89d5620e.png)
生成lv_i18n文件
lv_i18n.c中保存着lvgl多语言的初始化以及文本之间的映射等函数接口,想要使用多语言,必须具备lv_i18n.c/.h
操作步骤
- 安装上述开发环境说明的node.js和lv_i18n
- 用到多语言展示的LVGL的代码中,采用_("hello")的方式编写代码
- 在ui文件夹下新建⽬录translations,在其中创建yml⽂件其命名格式:locale codes.yml,有多少个语⾔就创建多少个,每个yml⽂件都要统⼀格式的开头locale codes:,点击获取locale codes,内容如下所示。如简体中文就创建zh-cn.yml,文件开头输入zh-cn:
 ![![[Pasted image 20250423152801.png]]](https://i-blog.csdnimg.cn/direct/4fce6fbfa977474d926140b950f9c6fa.png) 
![![[Pasted image 20250423153110.png]]](https://i-blog.csdnimg.cn/direct/4be7a15fa5fa44939c1527dbff91e28a.png)
- 在 translations ⽬录下执⾏该命令会根据第⼆步中编写的代码,填充yml⽂件: lv_i18n extract -s '../**/*.c' -t './*.yml'
- 此时所有的yml⽂件的翻译都是~,这个意思是我们要⾃⼰添加翻译,打开每个yml⽂件添加翻译。注意,⼀般将英⽂作为默认语⾔,默认语⾔保持~即可,不需要翻译。
- 执⾏该命令会将翻译集成到c代码中(lv_i18n.c/h):
 一般先采用优化编译即可,如果优化编译失败,则采用一般用法。- ⼀般⽤法:lv_i18n compile -t "./*.yml" -o .
- 指 定 默 认 语 ⾔:lv_i18n compile -l <language-code> -t "./*.yml" -o .,比如lv_i18n compile -l zh-cn -t "./*.yml" -o .
- 优化编译:lv_i18n compile -t "./*.yml" -optimize -o .
 
- ⼀般⽤法:
- 最后,要确保我们使⽤的LVGL字体已经包含了所有翻译使⽤到的⽂字。
使用过程遇到的问题
![![[Pasted image 20250423155259.png]]](https://i-blog.csdnimg.cn/direct/6902d1f50c814c5bbd4407ed2620f638.png)
这个问题目前还不太明白是什么原因导致的,可能是lv_i18n这个库的问题。遇到这个问题后,需要将所有的yml语言文件清空,只剩下首行的language:(如zh-cn:),然后按下列步骤执行。
 目前测试下列所展示的步骤不会出现问题:
- 将screens文件删剩一个文件,这个时候执行lv_i18n extract -s '../**/*.c' -t './*.yml',这时候一般能够抓取成功。
- 然后撤回之前删除的文件,再次执行lv_i18n extract -s '../**/*.c' -t './*.yml',一般也能够抓取成功。
- 全部抓取成功之后,再次执行lv_i18n extract -s '../**/*.c' -t './*.yml',一般就会报上图所显示的错误,目前不知如何解决,只能按照第1、2步骤再次操作一遍。
重命名关键字
如何重命名翻译关键字:lv_i18n rename -t "./*.yml" --from 'test3' --to 'test2'
 这个重名名关键字的意思是重命名yml中的关键字名称。
 为什么重命名?原因是如果不重命名的话:在代码中改文本信息后,采用lv_i18n extract -s '../**/*.c' -t './*.yml'重新抓取后,未使用的关键字不会删除,会导致翻译文件比较冗余。
未重命名
原本yml所拥有的关键字如下图所示:
 ![![[Pasted image 20250423154006.png]]](https://i-blog.csdnimg.cn/direct/8b669203ade54a2ca521f4d115208eb7.png)
修改文件中的text文本,然后重新拉取。
 ![![[Pasted image 20250423154026.png]]](https://i-blog.csdnimg.cn/direct/bc7ed05611324685a81c0e5ba5124f4b.png)
 可以发现原本的关于设备并不会被删除,虽然没有使用,但是还是存在在该文件中。
 ![![[Pasted image 20250423154401.png]]](https://i-blog.csdnimg.cn/direct/8735215f562b4a41b64cf4ea4603caf7.png)
重命名
![![[Pasted image 20250423154632.png]]](https://i-blog.csdnimg.cn/direct/a3092c19ad8b419cae83e57bc116d95b.png)
首先采用lv_i18n rename -t "./*.yml" --from '关于设备' --to '关于设备2'
 ![![[Pasted image 20250423154651.png]]](https://i-blog.csdnimg.cn/direct/cb617e3723f5462bbd0a20078965a968.png)
然后修改文件中想要修改的文本为关于设备2。
 ![![[Pasted image 20250423154737.png]]](https://i-blog.csdnimg.cn/direct/a29b2aac1253471c8f0ee0bedff64404.png)
最后重新拉取,结果如下所示,原本的关于设备被删除了。
 ![![[Pasted image 20250423154845.png]]](https://i-blog.csdnimg.cn/direct/42af6dc4333842c3abbde6a3a19dc6c6.png)
lv_i18n的使用
- 初始化:lv_i18n_init(lv_i18n_language_pack);
- 设置默认语言:lv_i18n_set_locale("zh-cn");
- 需要用到多语言这样写即可:lv_label_set_text(ui_MainInter_CastScrLab, _("投屏"));
 注意:在代码中如果需要动态切换语言的话,必须在lv_i18n_set_locale设置切换后的语言后,在重新执行一下lv_label_set_text,否则不生效,原因是lv_label_set_text内部会使用lv_realloc分配一个空间存储文本,因此需要重新设置文本才会生效。
 ![![[Pasted image 20250423162741.png]]](https://i-blog.csdnimg.cn/direct/0a6e295d730d48d280845e288786a161.png) 
其中第2步也可以不设置,代码中默认设置lv_i18n_language_pack中的第一个成员为默认语言。
 ![![[Pasted image 20250423161545.png]]](https://i-blog.csdnimg.cn/direct/e2ee5b7b448a486d8d9babf2a5ee7f73.png)