diff --git a/radio/src/gui/colorlcd/widget_settings.cpp b/radio/src/gui/colorlcd/widget_settings.cpp index 2803fbffc..5465a7730 100644 --- a/radio/src/gui/colorlcd/widget_settings.cpp +++ b/radio/src/gui/colorlcd/widget_settings.cpp @@ -57,7 +57,7 @@ WidgetSettings::WidgetSettings(Window* parent, Widget* widget) : auto line = form->newLine(&grid); auto option = *optPtr; - new StaticText(line, rect_t{}, option.name, 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, option.displayName ? option.displayName : option.name, 0, COLOR_THEME_PRIMARY1); switch (option.type) { case ZoneOption::Integer: diff --git a/radio/src/gui/colorlcd/zone.h b/radio/src/gui/colorlcd/zone.h index 6f184cba4..688c3422c 100644 --- a/radio/src/gui/colorlcd/zone.h +++ b/radio/src/gui/colorlcd/zone.h @@ -77,6 +77,7 @@ struct ZoneOption ZoneOptionValue deflt; ZoneOptionValue min; ZoneOptionValue max; + const char * displayName; }; struct ZoneOptionValueTyped diff --git a/radio/src/lua/lua_widget_factory.cpp b/radio/src/lua/lua_widget_factory.cpp index f2bf4bb80..73badb12f 100644 --- a/radio/src/lua/lua_widget_factory.cpp +++ b/radio/src/lua/lua_widget_factory.cpp @@ -40,11 +40,26 @@ LuaWidgetFactory::LuaWidgetFactory(const char* name, ZoneOption* widgetOptions, createFunction(createFunction), updateFunction(0), refreshFunction(0), - backgroundFunction(0) + backgroundFunction(0), + translateFunction(0) { } -LuaWidgetFactory::~LuaWidgetFactory() { unregisterWidget(this); } +LuaWidgetFactory::~LuaWidgetFactory() { + unregisterWidget(this); + + if (displayName) { + delete displayName; + } + + auto option = getOptions(); + while (option && option->name != nullptr) { + if (option->displayName) { + delete option->displayName; + } + option++; + } +} Widget* LuaWidgetFactory::create(Window* parent, const rect_t& rect, Widget::PersistentData* persistentData, @@ -90,3 +105,40 @@ Widget* LuaWidgetFactory::create(Window* parent, const rect_t& rect, if (err) lw->setErrorMessage("create()"); return lw; } + + +void LuaWidgetFactory::translateOptions(ZoneOption * options) +{ + if (lsWidgets == 0) return; + + // No translations provided + if (!translateFunction) return; + + auto lang = TRANSLATIONS; + + auto option = options; + while (option && option->name != nullptr) { + lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, translateFunction); + lua_pushstring(lsWidgets, option->name); + lua_pushstring(lsWidgets, lang); + bool err = lua_pcall(lsWidgets, 2, 1, 0); + if (!err) { + auto dn = lua_tostring(lsWidgets, -1); + if (dn) option->displayName = strdup(dn); + } + lua_pop(lsWidgets, 1); + + option++; + } + + // Widget display name + lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, translateFunction); + lua_pushstring(lsWidgets, name); + lua_pushstring(lsWidgets, lang); + bool err = lua_pcall(lsWidgets, 2, 1, 0); + if (!err) { + auto dn = lua_tostring(lsWidgets, -1); + if (dn) displayName = strdup(dn); + } + lua_pop(lsWidgets, 1); +} diff --git a/radio/src/lua/lua_widget_factory.h b/radio/src/lua/lua_widget_factory.h index 5a646194b..b8d97f832 100644 --- a/radio/src/lua/lua_widget_factory.h +++ b/radio/src/lua/lua_widget_factory.h @@ -38,8 +38,11 @@ class LuaWidgetFactory : public WidgetFactory bool init = true) const override; protected: + void translateOptions(ZoneOption * options); + int createFunction; int updateFunction; int refreshFunction; int backgroundFunction; + int translateFunction; }; diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 5f1e56e27..88b054f2d 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -144,6 +144,7 @@ ZoneOption *createOptionsArray(int reference, uint8_t maxOptions) luaL_checktype(lsWidgets, -2, LUA_TNUMBER); // key is number luaL_checktype(lsWidgets, -1, LUA_TSTRING); // value is string option->name = lua_tostring(lsWidgets, -1); + option->displayName = nullptr; // TRACE("name = %s", option->name); break; case 1: @@ -224,7 +225,7 @@ void luaLoadWidgetCallback() const char * name=NULL; int widgetOptions = 0, createFunction = 0, updateFunction = 0, - refreshFunction = 0, backgroundFunction = 0; + refreshFunction = 0, backgroundFunction = 0, translateFunction = 0; luaL_checktype(lsWidgets, -1, LUA_TTABLE); @@ -253,6 +254,10 @@ void luaLoadWidgetCallback() backgroundFunction = luaL_ref(lsWidgets, LUA_REGISTRYINDEX); lua_pushnil(lsWidgets); } + else if (!strcmp(key, "translate")) { + translateFunction = luaL_ref(lsWidgets, LUA_REGISTRYINDEX); + lua_pushnil(lsWidgets); + } } if (name && createFunction) { @@ -262,6 +267,8 @@ void luaLoadWidgetCallback() factory->updateFunction = updateFunction; factory->refreshFunction = refreshFunction; factory->backgroundFunction = backgroundFunction; // NOSONAR + factory->translateFunction = translateFunction; + factory->translateOptions(options); TRACE("Loaded Lua widget %s", name); } }