summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2018-10-17 12:57:34 +0200
committerJo-Philipp Wich <jo@mein.io>2018-11-05 11:01:45 +0100
commit62102f4f0e8a88ffbdf44517f4ff737049a3f3bf (patch)
tree014bf7a3f47798a05bcdede54da8779f7a4e8491
parent4623a58394b1cc71ddf24865a2f0639ee2119470 (diff)
luci-base: template: add translation iterator function
Introduce a new luci.template.parser.get_translations() function which will iterate all loaded translation entries and pass the to the given callback function. This is useful to expose the loaded translations in other formats, e.g. for wrapping them into JSON feeds. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--modules/luci-base/src/template_lmo.c16
-rw-r--r--modules/luci-base/src/template_lmo.h2
-rw-r--r--modules/luci-base/src/template_lualib.c19
3 files changed, 36 insertions, 1 deletions
diff --git a/modules/luci-base/src/template_lmo.c b/modules/luci-base/src/template_lmo.c
index 3d1eaf4e0..cd4c609a7 100644
--- a/modules/luci-base/src/template_lmo.c
+++ b/modules/luci-base/src/template_lmo.c
@@ -216,7 +216,7 @@ int lmo_load_catalog(const char *lang, const char *dir)
if (!_lmo_active_catalog)
_lmo_active_catalog = cat;
- return 0;
+ return cat->archives ? 0 : -1;
err:
if (dh) closedir(dh);
@@ -301,6 +301,20 @@ int lmo_translate(const char *key, int keylen, char **out, int *outlen)
return -1;
}
+void lmo_iterate(lmo_iterate_cb_t cb, void *priv)
+{
+ unsigned int i;
+ lmo_entry_t *e;
+ lmo_archive_t *ar;
+
+ if (!_lmo_active_catalog)
+ return;
+
+ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
+ for (i = 0, e = &ar->index[0]; i < ar->length; e = &ar->index[++i])
+ cb(ntohl(e->key_id), ar->mmap + ntohl(e->offset), ntohl(e->length), priv);
+}
+
void lmo_close_catalog(const char *lang)
{
lmo_archive_t *ar, *next;
diff --git a/modules/luci-base/src/template_lmo.h b/modules/luci-base/src/template_lmo.h
index f251c63dd..587884ea3 100644
--- a/modules/luci-base/src/template_lmo.h
+++ b/modules/luci-base/src/template_lmo.h
@@ -73,6 +73,7 @@ struct lmo_catalog {
typedef struct lmo_catalog lmo_catalog_t;
+typedef void (*lmo_iterate_cb_t)(uint32_t, const char *, int, void *);
uint32_t sfh_hash(const char *data, int len);
uint32_t lmo_canon_hash(const char *data, int len);
@@ -87,6 +88,7 @@ extern lmo_catalog_t *_lmo_active_catalog;
int lmo_load_catalog(const char *lang, const char *dir);
int lmo_change_catalog(const char *lang);
int lmo_translate(const char *key, int keylen, char **out, int *outlen);
+void lmo_iterate(lmo_iterate_cb_t cb, void *priv);
void lmo_close_catalog(const char *lang);
#endif
diff --git a/modules/luci-base/src/template_lualib.c b/modules/luci-base/src/template_lualib.c
index d5c8dd6b4..fbab2ccf6 100644
--- a/modules/luci-base/src/template_lualib.c
+++ b/modules/luci-base/src/template_lualib.c
@@ -129,6 +129,24 @@ static int template_L_change_catalog(lua_State *L) {
return 1;
}
+static void template_L_get_translations_cb(uint32_t key, const char *val, int len, void *priv) {
+ lua_State *L = priv;
+ char hex[9];
+
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ snprintf(hex, sizeof(hex), "%08x", key);
+
+ lua_pushvalue(L, 1);
+ lua_pushstring(L, hex);
+ lua_pushlstring(L, val, len);
+ lua_call(L, 2, 0);
+}
+
+static int template_L_get_translations(lua_State *L) {
+ lmo_iterate(template_L_get_translations_cb, L);
+ return 0;
+}
+
static int template_L_translate(lua_State *L) {
size_t len;
char *tr;
@@ -168,6 +186,7 @@ static const luaL_reg R[] = {
{ "load_catalog", template_L_load_catalog },
{ "close_catalog", template_L_close_catalog },
{ "change_catalog", template_L_change_catalog },
+ { "get_translations", template_L_get_translations },
{ "translate", template_L_translate },
{ "hash", template_L_hash },
{ NULL, NULL }