From ed982d3c95db95cae60d3fa1dff33311761eeb28 Mon Sep 17 00:00:00 2001 From: HW Date: Thu, 22 May 2014 22:47:14 +0200 Subject: [PATCH 1/3] Added a pure Lua gettext implementation --- frontend/gettext.lua | 92 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/frontend/gettext.lua b/frontend/gettext.lua index dd240f174..c1fbafc9c 100644 --- a/frontend/gettext.lua +++ b/frontend/gettext.lua @@ -1,16 +1,96 @@ -lua_gettext.init("./i18n", "koreader") +local DEBUG = require("dbg") -local GetText = {} -local GetText_mt = {} +local GetText = { + translation = {}, + current_lang = "C", + dirname = "l10n", + textdomain = "koreader" +} + +local GetText_mt = { + __index = {} +} function GetText_mt.__call(gettext, string) - return lua_gettext.translate(string) + return gettext.translation[string] or string end -function GetText.changeLang(new_lang) - lua_gettext.change_lang(new_lang) +local function c_escape(what) + if what == "\n" then return "" + elseif what == "a" then return "\a" + elseif what == "b" then return "\b" + elseif what == "f" then return "\f" + elseif what == "n" then return "\n" + elseif what == "r" then return "\r" + elseif what == "t" then return "\t" + elseif what == "v" then return "\v" + elseif what == "0" then return "\0" -- shouldn't happen, though + else + return what + end +end + +-- for PO file syntax, see +-- https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html +-- we only implement a sane subset for now + +function GetText_mt.__index.changeLang(new_lang) + GetText.translation = {} + GetText.current_lang = "C" + + -- the "C" locale disables localization alltogether + if new_lang == "C" then return end + + local file = GetText.dirname .. "/" .. new_lang .. "/" .. GetText.textdomain .. ".po" + local po = io.open(file, "r") + + if not po then + DEBUG("cannot open translation file " .. file) + return + end + + local data = {} + local what = nil + while true do + local line = po:read("*l") + if line == nil or line == "" then + if data.msgid and data.msgstr then + GetText.translation[data.msgid] = string.gsub(data.msgstr, "\\(.)", c_escape) + end + -- stop at EOF: + if line == nil then break end + data = {} + what = nil + else + -- comment + if not line:match("^#") then + -- new data item (msgid, msgstr, ... + local w, s = line:match("^%s*(%a+)%s+\"(.*)\"%s*$") + if w then + what = w + else + -- string continuation + s = line:match("^%s*\"(.*)\"%s*$") + end + if what and s then + data[what] = (data[what] or "") .. s + end + end + end + end + GetText.current_lang = new_lang end setmetatable(GetText, GetText_mt) +if os.getenv("LANGUAGE") then + GetText.changeLang(os.getenv("LANGUAGE")) +elseif os.getenv("LC_ALL") then + GetText.changeLang(os.getenv("LC_ALL")) +elseif os.getenv("LC_MESSAGES") then + GetText.changeLang(os.getenv("LC_MESSAGES")) +elseif os.getenv("LANG") then + GetText.changeLang(os.getenv("LANG")) +end + return GetText From 6bbfae389aedcc9cf3f29dee654eca11e6de1362 Mon Sep 17 00:00:00 2001 From: Hans-Werner Hilse Date: Fri, 23 May 2014 11:57:33 +0200 Subject: [PATCH 2/3] don't accept empty strings as valid translations --- frontend/gettext.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/gettext.lua b/frontend/gettext.lua index c1fbafc9c..895f8d56c 100644 --- a/frontend/gettext.lua +++ b/frontend/gettext.lua @@ -54,7 +54,7 @@ function GetText_mt.__index.changeLang(new_lang) while true do local line = po:read("*l") if line == nil or line == "" then - if data.msgid and data.msgstr then + if data.msgid and data.msgstr and data.msgstr ~= "" then GetText.translation[data.msgid] = string.gsub(data.msgstr, "\\(.)", c_escape) end -- stop at EOF: From 6acdf352396500df7f7676aca104a05bd4320588 Mon Sep 17 00:00:00 2001 From: Hans-Werner Hilse Date: Fri, 23 May 2014 12:04:01 +0200 Subject: [PATCH 3/3] don't build .mo files, we read .po now --- Makefile | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 320f765db..d8ac2c79b 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ VERSION=$(shell git describe HEAD) INSTALL_DIR=koreader-$(MACHINE) # files to link from main directory -INSTALL_FILES=reader.lua frontend resources defaults.lua \ +INSTALL_FILES=reader.lua frontend resources defaults.lua l10n \ git-rev README.md COPYING # for gettext @@ -20,10 +20,9 @@ DOMAIN=koreader TEMPLATE_DIR=l10n/templates KOREADER_MISC_TOOL=../misc XGETTEXT_BIN=$(KOREADER_MISC_TOOL)/gettext/lua_xgettext.py -MO_DIR=$(INSTALL_DIR)/koreader/i18n -all: $(KOR_BASE)/$(OUTPUT_DIR)/luajit po mo +all: $(KOR_BASE)/$(OUTPUT_DIR)/luajit po $(MAKE) -C $(KOR_BASE) echo $(VERSION) > git-rev mkdir -p $(INSTALL_DIR)/koreader @@ -126,12 +125,3 @@ pot: po: $(MAKE) -i -C l10n bootstrap update - -mo: - for po in `find l10n -iname '*.po'`; do \ - resource=`basename $$po .po` ; \ - lingua=`dirname $$po | xargs basename` ; \ - mkdir -p $(MO_DIR)/$$lingua/LC_MESSAGES/ ; \ - msgfmt -o $(MO_DIR)/$$lingua/LC_MESSAGES/$$resource.mo $$po ; \ - done -