LVGL多国语言显示方案的实现
最近又用到了 LVGL(V7.11),再次配合使用 NXP 的 GUI Guider 软件生成式代码,简化了许多步骤,但也遇到一个棘手bug,就是多页面切换有内存泄漏的问题,困扰良久,一直未能有效解决,好在实际使用可以避免大概率的崩溃,此事暂按下不表。本文主要想写的是怎样在 LVGL 中实现实现多国语言功能。
- 实现的方法比较简单:
就是对于 LVGL 中要显示的文本内容 TEXT ,我们可以使用 LANG(TEXT) 宏模式来表达.然后对这个 LANG 宏做逻辑处理。
- 如下案例:
// ....ui->about_page_lb_about_mdl = lv_label_create(ui->about_page, NULL);lv_label_set_text(ui->about_page_lb_about_mdl, LANG(TEXT_MODEL)); //"MODEL"lv_label_set_long_mode(ui->about_page_lb_about_mdl, LV_LABEL_LONG_EXPAND);lv_label_set_align(ui->about_page_lb_about_mdl, LV_LABEL_ALIGN_LEFT);// ....
- 实现框架如下
#include "xlang.h"/*多国语言支持的翻译文本词条库*/
const char *multi_lang_text_tab[LANG_TYPE_MAX_NUM][TEXT_MAX_NUM] =
{/*EN*/ LANG_EN_TEXT_TAB,/*DE*/ LANG_DE_TEXT_TAB,/*IT*/ LANG_IT_TEXT_TAB,/*CN*/ LANG_CN_TEXT_TAB,//...
};/*
** 设置当前语言类型
*/
void lang_type_set_to_flash(const unsigned char lang_type)
{ }/*
** 当前设置的语言类型获取
*/
unsigned char lang_type_get_from_flash(void)
{unsigned char lang_type = 0;// 读取语言标志return lang_type;
}/*多国语言文本匹配*/
const char *multi_lang_text_match(const lang_txt_em txt_num)
{unsigned char lang_type = lang_type_get_from_flash();//读取设置的语言标志if (LANG_LIST_CHECK(lang_type)) // 语言不支持{LOG_ERROR("######## Lang err(Code:%02XH),Use default lang !########\r\n",lang_type);lang_type = LANG_DEF_USE; // 缺省语言lang_type_set_to_flash(lang_type);}if (TEXT_MAX_NUM <= txt_num){LOG_ERROR("######## Err(Code:%02XH),No This Word ! ########\r\n",txt_num);return NULL;}return multi_lang_text_tab[lang_type][txt_num];
}
- xlang.h:
/*Mutil Language*/
#ifndef __XLANG_H__
#define __XLANG_H__// 语言支持类型
enum
{LANG_EN = 0, /*英语*/LANG_DE, /*德语*/LANG_IT, /*意大利*/LANG_CN, /*中文*///...LANG_TYPE_MAX_NUM,
};/************************设备文本词条支持****************************/
typedef enum
{TEXT_BRAND= 0,TEXT_MODEL,TEXT_SN,TEXT_SOFTWARE_VERSION,TEXT_MAX_NUM
} lang_txt_em;/************************************多语言对应文本词条****************************************/
#define LANG_EN_TEXT_TAB \
{ \"BRAND", \"MODEL", \"SN", \"SOFTWARE VERSION", \
} /*英文文本*/
#define LANG_DE_TEXT_TAB \
{ \/*BRAND*/ "Marke", \/*MODEL*/ "Modellnummer", \/*SN*/ "Seriennummer", \/*SOFTWARE VERSION*/ "Software-Version", \
} /*德文文本*/
#define LANG_IT_TEXT_TAB \
{ \/*BRAND*/ "MARCA", \/*MODEL*/ "MODELLO", \/*SN*/ "NUMERO DI SERIE", \/*SOFTWARE VERSION*/ "VERSIONE SOFTWARE", \
} /*意大利文文本*/
#define LANG_CN_TEXT_TAB \
{ \/*BRAND*/ "设备品牌", \/*MODEL*/ "设备型号", \/*SN*/ "设备编号", \/*SOFTWARE VERSION*/ "软件版本", \
} /*中文文本*//******************************************************************************/
/*多国语言支持检查*/
#define LANG_LIST_CHECK(LANG_TYPE) ( \(LANG_TYPE != LANG_EN) && \(LANG_TYPE != LANG_DE) && \(LANG_TYPE != LANG_IT) && \(LANG_TYPE != LANG_CN))/******************************************************************************/extern const char *multi_lang_text_tab[LANG_TYPE_MAX_NUM][TEXT_MAX_NUM];void lang_type_set_to_flash(const unsigned char);
unsigned char lang_type_get_from_flash(void);
const char *multi_lang_text_match(const lang_txt_em);/*多国语言匹配宏控制*/
#define LANG_DEF_USE (LANG_EN) // 缺省语言设置
#define LANG_DEF(txt) (multi_lang_text_tab[LANG_DEF_USE][txt]) // 使用缺省语言显示文本词条
#define LANG(txt) (multi_lang_text_match(txt)) // 匹配当前语言显示文本词条
#define LANG_SET(lang) (lang_type_set_to_flash(lang)) // 设置当前语言(保存非易失性标志)#endif
在实际使用多语言的时候,如果涉及有像使用上面中文字符串时,会因为编译器兼容性的问题会报告一些异常:

- 可以在编译器中做一些设置:
-
1.因本字体使用unicode编码,所以在用到文字的.c文件,需保存为UTF-8编码,可使用记事本打开.c文件,文件另存,选UTF-8编码即可。

-
2.因.c文件保存为UTF-8编码后,MDK编译可能出错,打开配置工程,切换C/C++选项卡,在Misc Controns里面追加–locale=english即可。

-
3.若是MDK工程,打开Edit选项卡,在Editor->Encoding里面选择UTF-8

-