实现功能描述:
LVGL对语言切换的功能不是很友好,首先安装nodejs和npm,然后通过lv_i18n_g安装并使用工具生成语言文件。整个过程太繁琐。所以还是采用简单实用的方法。不过前提是依赖的字体库要支持所切换的语言显示。
创建代码文件:language.h language.c
1. 数据结构的结构体封装
点击查看代码
#include <intrin.h>
// 语言类型定义
typedef enum
{
LANG_CHINESE,
LANG_ENGLISH
// ... 其他语言
} language_t;
//语言信息结构体 根据key 获取对应的语言字符串
typedef struct
{
// 首页界面国际化语言
const char *main_setting_bt_key;
// 设置界面国际化语言
const char *setting_menu_key;
const char *setting_turn_off_key;
const char *setting_language_key;
const char *setting_touch_screen_key;
const char *setting_back_key;
// ...追加其他字符串Key(与部件相关联的)
} language_data_t;
2. 相关函数申明
点击查看代码
// 中文语言数据
static const language_data_t language_chinese = {
.main_setting_bt_key = "设置",
.setting_menu_key = "菜单",
.setting_turn_off_key = "关机",
.setting_language_key = "语言",
.setting_touch_screen_key = "触摸屏",
.setting_back_key = "返回",
// ... 其他字符串
};
// 英语语言数据
static const language_data_t language_english = {
.main_setting_bt_key = "Setting",
.setting_menu_key = "Menu",
.setting_turn_off_key = "Turn Off",
.setting_language_key = "Language",
.setting_touch_screen_key = "Touch Screen",
.setting_back_key = "Back",
// ... 其他字符串
};
// 根据语言类型获取语言数据的函数指针数组
static const language_data_t *const languages[] = {
[LANG_CHINESE] = &language_chinese,
[LANG_ENGLISH] = &language_english,
//... 其他语言数据
};
language_t current_language;//全局当前语言
//根据key获取对应的语言字符串
const char *get_string_for_language(language_t lang, const char *key);
3. 相关函数定义
点击查看代码
#include "language.h"
// 获取指定语言的字符串
const char *get_string_for_language(language_t lang, const char *key)
{
const language_data_t *lang_data = languages[lang];
if (lang_data == NULL)
{
return NULL; // 未找到对应语言或未初始化
}
if (key == NULL)
{
return NULL; // 未指定字符串键值
}
if (strcmp(key, "main_setting_bt_key") == 0)
{
return lang_data->main_setting_bt_key;
}
if (strcmp(key, "setting_menu_key") == 0)
{
return lang_data->setting_menu_key;
}
else if (strcmp(key, "setting_turn_off_key") == 0)
{
return lang_data->setting_turn_off_key;
}
else if (strcmp(key, "setting_language_key") == 0)
{
return lang_data->setting_language_key;
}
else if (strcmp(key, "setting_touch_screen_key") == 0)
{
return lang_data->setting_touch_screen_key;
}
else if (strcmp(key, "setting_back_key") == 0)
{
return lang_data->setting_back_key;
}
// ... 其他字符串匹配
return NULL; // 未找到对应字符串
}
4. 初始化,函数调用示例
点击查看代码
// 获取当前语言
current_language = atoi(getConfigItem(LANGUAGE_KEY).value);
PRINT("current_language = %d \n\n", current_language);
//获取当前控件的语言字符串并绑定
char *settingBt_str = get_string_for_language(current_language, "main_setting_bt_key");
lv_label_set_text(goto_setting_bt_label, settingBt_str);