ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/10/6 6:00:53 拓冰建站 浏览量
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

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

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

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

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