背景

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);

LVGL使用i18n庫配置多語言的方法_lvgl 多語言_fuso_#define

要求

使用多語言的時候C文件的編碼格式必須是UNICODE編譯
且必須要支持相關語言的字體

遇到的問題

下面的問題是遇到過的,看法可能不太對

  • 比如作為基礎的查找標識,似乎只能用英文,必須要有一個英文的yml定義,且文字還有要求,en,en-GB,en-US,不然將工作不正常,js裏面有這樣的判定
  • 對複數的定義,針對不同語言似乎,也有一定的限制,不可以隨便定義,zh-CN使用one參數的時候,就一直提示報錯

總結

lv_i18n是官方提供的一種多語言方案,使用起來也比較方便,
如果只有兩種語言切換,自己設計配套的語言對應該數組也可以,但再增加可能也需要一些時間設計
用官方提供的方案是還是一種很實用的方案,只需要管理翻譯對照表就可以了,用工具自動生成C代碼