summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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 }