LVGL 多语言
如何提取字体可以参考之前的博客lvgl显示中文和自定义图标。
官方最近的版本也增加了多语言方案,但是还没有仔细研究,这里是个人使用的一种方法,如果有更好的方案可以告诉笔者。
c
extern const lv_font_t font16;
#define _LANGUAGES \
DEF_X(eLanguageChinese = 0, "中文简体") \
DEF_X(eLanguageEnglish, "English")
#define _BTN_NAMES \
DEF_X(eBtnInfo = 0, "信息", "Info") \
DEF_X(eBtnSetting, "设置", "Setting")
typedef enum
{
#define DEF_X(a,b,...) a,
_LANGUAGES
#undef DEF_X
eLanguageMax,
}Language_e;
typedef enum
{
#define DEF_X(a,b,...) a,
_BTN_NAMES
#undef DEF_X
eBtnMax,
}Btn_e;
static char* s_cBtnNamesStr[eLanguageMax][eBtnMax] =
{
{
#define DEF_X(a,b,c,...) b,
_BTN_NAMES
#undef DEF_X
},
{
#define DEF_X(a,b,c,...) c,
_BTN_NAMES
#undef DEF_X
}
};
static char* s_cLanguageStr =
{
#define DEF_X(a,b,...) b"\n"
_LANGUAGES
#undef DEF_X
};
static lv_obj_t* s_tBtns[eBtnMax];
static void dropdown_cb(lv_event_t* e)
{
lv_obj_t* dropdown = lv_event_get_target(e);
Language_e language = (Language_e)lv_dropdown_get_selected(dropdown);
/* 修改语言 */
for (int i = 0; i < eBtnMax; i++)
{
lv_label_set_text(lv_obj_get_child(s_tBtns[i], -1), s_cBtnNamesStr[language][i]);
}
}
void languageTest(void)
{
for (int i = 0; i < eBtnMax; i++)
{
s_tBtns[i] = lv_btn_create(lv_scr_act());
lv_obj_t* lab = lv_label_create(s_tBtns[i]);
lv_label_set_text(lab, s_cBtnNamesStr[eLanguageChinese][i]);
lv_obj_set_style_text_font(lab, &font16, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_align(s_tBtns[i], LV_ALIGN_CENTER, i*100, 0);
}
lv_obj_t* dropdown = lv_dropdown_create(lv_scr_act());
lv_obj_set_style_text_font(lv_dropdown_get_list(dropdown), &font16, LV_STATE_DEFAULT);
lv_obj_set_style_text_font(dropdown, &font16, LV_STATE_DEFAULT);
lv_obj_set_style_text_font(dropdown, LV_FONT_DEFAULT, LV_PART_INDICATOR);
lv_dropdown_set_options(dropdown, s_cLanguageStr);
lv_obj_align(dropdown, LV_ALIGN_CENTER, 0, 60);
lv_obj_add_event_cb(dropdown, dropdown_cb, LV_EVENT_VALUE_CHANGED, NULL);
}