feat: Allow Lua widget translations (#2275)
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -77,6 +77,7 @@ struct ZoneOption
|
||||
ZoneOptionValue deflt;
|
||||
ZoneOptionValue min;
|
||||
ZoneOptionValue max;
|
||||
const char * displayName;
|
||||
};
|
||||
|
||||
struct ZoneOptionValueTyped
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user