搭建开发环境
安装node.js
安装node.js,点击进入官网地址
安装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
这是 权限不足 导致的错误,Windows 拒绝了 npm
在 C:\Program Files\nodejs\
目录下写入缓存文件,因为这个目录通常需要管理员权限。
以管理员身份运行后成功。采用lv_i18n -h
验证是否安装成功。
生成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:
- 在 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字体已经包含了所有翻译使⽤到的⽂字。
使用过程遇到的问题
这个问题目前还不太明白是什么原因导致的,可能是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所拥有的关键字如下图所示:
修改文件中的text文本,然后重新拉取。
可以发现原本的关于设备并不会被删除,虽然没有使用,但是还是存在在该文件中。
重命名
首先采用lv_i18n rename -t "./*.yml" --from '关于设备' --to '关于设备2'
然后修改文件中想要修改的文本为关于设备2。
最后重新拉取,结果如下所示,原本的关于设备被删除了。
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
分配一个空间存储文本,因此需要重新设置文本才会生效。
其中第2步也可以不设置,代码中默认设置lv_i18n_language_pack
中的第一个成员为默认语言。