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编码即可。
      UTF8

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

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

相关推荐

  1. 微信小程序开发中语言支持和国际化

    2024-01-20 14:16:04       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 14:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 14:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 14:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 14:16:04       18 阅读

热门阅读

  1. 2024 前端高频面试题之 Vue 篇

    2024-01-20 14:16:04       27 阅读
  2. 126 对称的二叉树

    2024-01-20 14:16:04       21 阅读
  3. Spring中的IOC与AOP的理解(1)

    2024-01-20 14:16:04       30 阅读
  4. Go 常见报错 - VsCode运行go:go.mod file not found

    2024-01-20 14:16:04       31 阅读
  5. redisson-spring-boot-starter 自动化配置源码解析

    2024-01-20 14:16:04       29 阅读
  6. Android13预装APP到data分区

    2024-01-20 14:16:04       41 阅读
  7. 【issue-halcon例程学习】ball.hdev

    2024-01-20 14:16:04       29 阅读
  8. 动态sql,关联查询

    2024-01-20 14:16:04       32 阅读