LVGL多国语言显示方案的实现

最近又用到了 LVGL(V7.11),再次配合使用 NXPGUI 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

在实际使用多语言的时候,如果涉及有像使用上面中文字符串时,会因为编译器兼容性的问题会报告一些异常:
report

  • 可以在编译器中做一些设置:
    • 1.因本字体使用unicode编码,所以在用到文字的.c文件,需保存为UTF-8编码,可使用记事本打开.c文件,文件另存,选UTF-8编码即可。
      LVGL多国语言显示方案的实现_第1张图片

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

    • 3.若是MDK工程,打开Edit选项卡,在Editor->Encoding里面选择UTF-8
      LVGL多国语言显示方案的实现_第2张图片

你可能感兴趣的:(嵌入式开发笔记,LVGL,多国语言显示,MCU,N32,单片机)