feat: Allow Lua widget translations (#2275)

This commit is contained in:
David PHAM-VAN
2022-09-07 21:18:50 +10:00
committed by GitHub
parent 3b2f07ae85
commit 4ed4f218b4
5 changed files with 67 additions and 4 deletions
+1 -1
View File
@@ -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:
+1
View File
@@ -77,6 +77,7 @@ struct ZoneOption
ZoneOptionValue deflt;
ZoneOptionValue min;
ZoneOptionValue max;
const char * displayName;
};
struct ZoneOptionValueTyped
+54 -2
View File
@@ -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);
}
+3
View File
@@ -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;
};
+8 -1
View File
@@ -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);
}
}