最近又用到了 LVGL(V7.11),再次配合使用 NXP 的 GUI Guider 软件生成式代码,简化了许多步骤,但也遇到一个棘手bug,就是多页面切换有内存泄漏的问题,困扰良久,一直未能有效解决,好在实际使用可以避免大概率的崩溃,此事暂按下不表。本文主要想写的是怎样在 LVGL 中实现实现多国语言功能。
// ....
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];
}
/*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