lvgl 官方lv_i18n中英文-多语言方案

背景

GUI界面显示有多语言的需要比如中英文切换,当然使用LVGL的时候肯定也会有这样的需求
且由于LVGL是面向众多区域使用的,有时需要更多的语言显示。
针对于此使用的场景,官方提供一种方便使用的多语言实现方案

lv_i18n

官方提供的多语言方案

原理

GUI需要使用不同的文字时,但二进制代码肯定不会自动识别不同语言的表述。而官方提供的多语言工具lv_i18n,是方便设计人员使用。
那么肯定会存这样一个过程,将人使用的语言表述成机器可以识别的方式,而官方提供的工具,相当于是自动帮人实现一个语言描述到C语言代码的一个过程
在工程中将这个多语言的C代码编译进软件,并用一定的方式去调用相应的C代码实现界面的多语言,接口使用语言定义的标识去寻找相应的多语言C代码

依赖

lv_i18n可以理解成是一个脚本,目前的版本是js写的依赖于node.js,npm(node.js自带)
安装好node.js之后调用npm命令来安装lv_i18n,安装命令有很多种,没有都试全,采用官方推荐的第一个命令,测试过是可以用的,其他命令可参考官方的说明网址

npm i lv_i18n -g

安装完之后就可以使lv_i18n这个命令,添加相应的参数来完成语言描述到C语言代码的转换
进入相应的yml文件的目录来生成相应C代码lv_i18n.h,lv_i18n.c,这个输出是在当前目录下,如果需要在其他目录下,需要修改相应命令参数里的路径

lv_i18n compile -t *.yml -o .

yml 文件编辑

官方例子以英文跟饿文为例,这时改英文跟中文
en-GB.yml

en-GB:
  s_en_only: english only
  s_translated: s translated
  s_untranslated: ~
  chinese: Chinese
  p_i_have_dogs:
    one: I have %d dog
    other: I have %d dogs

zh-CN.yml

zh-CN:
  s_en_only: 仅英文
  s_translated: 翻译
  s_untranslated: 不翻译
  chinese: 中文
  p_i_have_dogs:
    other: 我有 %d 只狗

脚本生成C代码命令

使用上面提到的这个生成C代码的命令

lv_i18n compile -t *.yml -o .

这样就可以生成需要转换的C代码了

使用

调用的步骤很方便,初始化,设置语言,直接调用就可以,如下

    lv_i18n_init(lv_i18n_language_pack); //初始化
    app_view_set_language("zh-CN"); //设置语言
    disp_text(_("s_translated")); // 这样就可以显示中文了
#define _(text) lv_i18n_get_text(text) //正常文字
#define _p(text, num) lv_i18n_get_text_plural(text, num) //复数形式

_(),_p(),这是多语言的接口,将lv_i18n的API重新进行了定义,其实就是通过描述里的英文标识作为查找ID,再找出相关语言的文字编码

例子

    uint16_t lcd_width, lcd_height;
    lcd_width = lv_obj_get_width(lv_scr_act());
    lcd_height = lv_obj_get_height(lv_scr_act());

    ui_handler = lv_obj_create(lv_scr_act());
    lv_obj_set_size(ui_handler, lcd_width, lcd_height);

    lv_label_t *label = lv_label_create(ui_handler);
    lv_label_set_text(label, _("chinese"));
    lv_obj_set_style_text_font(label, &song_font_24, 0);
    lv_obj_center(label);

c9da2019-8f07-4e14-916b-dad3e5a937a2

要求

使用多语言的时候C文件的编码格式必须是UNICODE编译
且必须要支持相关语言的字体

遇到的问题

下面的问题是遇到过的,看法可能不太对

  • 比如作为基础的查找标识,似乎只能用英文,必须要有一个英文的yml定义,且文字还有要求,en,en-GB,en-US,不然将工作不正常,js里面有这样的判定
  • 对复数的定义,针对不同语言似乎,也有一定的限制,不可以随便定义,zh-CN使用one参数的时候,就一直提示报错

总结

lv_i18n是官方提供的一种多语言方案,使用起来也比较方便,
如果只有两种语言切换,自己设计配套的语言对应该数组也可以,但再增加可能也需要一些时间设计
用官方提供的方案是还是一种很实用的方案,只需要管理翻译对照表就可以了,用工具自动生成C代码

posted @ 2025-12-12 09:06  cau_par  阅读(994)  评论(0)    收藏  举报