项目需要一个切换显示语言的功能,发现LVGL官方已经提供了,但是没有例程,于是自学了一下。
以下内容根据lv_i18n官方readme GitHub - lvgl/lv_i18n: Internationalization (i18n) for LVGL
第0步:配置环境
因为lv_i18n库基于一个js脚本,所以我们要先安装好node.js环境。然后在命令行输入
npm i lv_i18n -g
官方还提供了其他两种安装方法,我只用了第一种,所以不再赘述。
第1步:准备词条文件
1. 准备好你的词条、语言代码和别名,默默的记在心里或者写在本子上
- 词条就是你想让它显示的东西,比如"Hello World!"。
- 语言代码就是这个词条的语言,比如英语-大不列颠就是en-GB。这里要注意,语言代码必须符合i18n规范,也就是“语言-地区”的格式,具体可以到ISO language codes | Andiamo! The Language Professionals 查阅对应的语言代码。
- 别名类似变量名,就是这个词条的名字,比如"hello"。
2. 在项目文件夹内为每一种语言创建词条文件,比如我有两种语言en-GB和de,那么我创建了en-GB.yml和de.yml。(理论上可以把多种语言合并到同一文件,但是我没有试过)
3. 其实官方提供了一个extract命令创建示例,但是我们可以跳过,直接上手编写文件。我的文件是这样的:
en-GB:
title1: Main menu
title2: Sub menu
user_logged_in:
one: One user is logged in
other: '%d users are logged in'
下面分别按照每一级讲解
- 第一级:语言代码
- 第二级:词条别名和词条
- 第三级:内置的关键字,目前只能使用one和other,作用是根据另一个变量实时更改显示的字段,这个后面在代码会使用到
如法炮制编写de.yml
de:
title1: Hauptmenü
title2: Untermenü
user_logged_in:
one: Ein Benutzer ist angemeldet
other: '%d benutzer ist angemeldet'
第3步:编译成c文件
在命令行运行(注意路径)
lv_i18n compile -t 'translations/*.yml' -o 'src/lv_i18n'
会生成lv_i18n.c和lv_i18n.h文件,将它添加进你的项目里就可以使用了。
其中词条是以结构体数组的形式存储在c里的,就像
static lv_i18n_phrase_t de_plurals_one[] = {
{"user_logged_in", "Ein Benutzer ist angemeldet"},
{NULL, NULL} // End mark
};
可以自己研究
第4步:在自己的项目里使用
1. 初始化
lv_i18n_init(lv_i18n_language_pack);
2. 选择语言(默认是en-GB)
lv_i18n_set_locale("en-GB");
3. 显示字符有两种方法,对应有两个宏,分别是"_"和"_p",这两个宏定义在lv_i18n.h里
#define _(text) lv_i18n_get_text(text)
#define _p(text, num) lv_i18n_get_text_plural(text, num)
_就是普通的按照别名查找词条字符串:
lv_label_set_text(label1, _("title1"));
_p有两个输入,一个是词条,一个是数字,这个数字的用法是,当num=1时,输出词条one,当num!=1时,输出词条other。例子在这:
sprintf(buf, _p("user_logged_in", user_cnt)), user_cnt);
一切以官方教程为准