X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libs%2Fweb%2Fluasrc%2Fi18n.lua;h=816d90310af692298b830b6cbbd8be47ebc1eaae;hb=70706cf388f8ac100778831e9ef9d7b1eb74c752;hp=5f0ee8a0110de4c412ff168637ad00afd1db6dfa;hpb=5b43543226fa29dc7d899e9fc82f0179aefcb56b;p=oweals%2Fluci.git diff --git a/libs/web/luasrc/i18n.lua b/libs/web/luasrc/i18n.lua index 5f0ee8a01..816d90310 100644 --- a/libs/web/luasrc/i18n.lua +++ b/libs/web/luasrc/i18n.lua @@ -12,9 +12,9 @@ Copyright 2008 Steven Barth Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at +You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -26,10 +26,11 @@ limitations under the License. --- LuCI translation library. module("luci.i18n", package.seeall) -require("luci.sys") +require("luci.util") +require("lmo") table = {} -i18ndir = luci.sys.libpath() .. "/i18n/" +i18ndir = luci.util.libpath() .. "/i18n/" loaded = {} context = luci.util.threadlocal() default = "en" @@ -45,13 +46,24 @@ end -- @param force Force reload even if already loaded (optional) -- @return Success status function load(file, lang, force) - lang = lang or "" + lang = lang and lang:gsub("_", "-") or "" if force or not loaded[lang] or not loaded[lang][file] then - local f = loadfile(i18ndir .. file .. "." .. lang .. ".lua") + local f = lmo.open(i18ndir .. file .. "." .. lang .. ".lmo") if f then - table[lang] = table[lang] or {} - setfenv(f, table[lang]) - f() + if not table[lang] then + table[lang] = { f } + setmetatable(table[lang], { + __index = function(tbl, key) + for i = 1, #tbl do + local s = rawget(tbl, i):lookup(key) + if s then return s end + end + end + }) + else + table[lang][#table[lang]+1] = f + end + loaded[lang] = loaded[lang] or {} loaded[lang][file] = true return true @@ -69,30 +81,50 @@ end -- @param force Force reload even if already loaded (optional) function loadc(file, force) load(file, default, force) + if context.parent then load(file, context.parent, force) end return load(file, context.lang, force) end --- Set the context default translation language. -- @param lang Two-letter language code function setlanguage(lang) - context.lang = lang + context.lang = lang:gsub("_", "-") + context.parent = (context.lang:match("^([a-z][a-z])_")) end --- Return the translated value for a specific translation key. --- @param key Translation key --- @param def Default translation +-- @param key Default translation text -- @return Translated string -function translate(key, def) +function translate(key) return (table[context.lang] and table[context.lang][key]) + or (table[context.parent] and table[context.parent][key]) or (table[default] and table[default][key]) - or def + or key end --- Return the translated value for a specific translation key and use it as sprintf pattern. --- @param key Translation key --- @param default Default translation +-- @param key Default translation text -- @param ... Format parameters -- @return Translated and formatted string -function translatef(key, default, ...) - return translate(key, default):format(...) -end \ No newline at end of file +function translatef(key, ...) + return tostring(translate(key)):format(...) +end + +--- Return the translated value for a specific translation key +-- and ensure that the returned value is a Lua string value. +-- This is the same as calling tostring(translate(...)) +-- @param key Default translation text +-- @return Translated string +function string(key) + return tostring(translate(key)) +end + +--- Return the translated value for a specific translation key and use it as sprintf pattern. +-- Ensure that the returned value is a Lua string value. +-- This is the same as calling tostring(translatef(...)) +-- @param key Default translation text +-- @param ... Format parameters +-- @return Translated and formatted string +function stringf(key, ...) + return tostring(translate(key)):format(...) +end