LVGL-C 实现LVGL多语言切换功能

实现功能描述:

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);
	
	
posted @ 2024-12-31 14:44  滴滴小码农~  阅读(1375)  评论(0)    收藏  举报