summaryrefslogtreecommitdiffhomepage
path: root/build/i18n-scan.pl
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-01-23 21:53:26 +0100
committerJo-Philipp Wich <jo@mein.io>2020-01-25 23:21:35 +0100
commit9939fc5a26d07da4756497bb6a7dc51dcf379e98 (patch)
treee79785f03912d2cec48fdf59f132a42528bd4c6f /build/i18n-scan.pl
parent6f6f3e84ca0bc04cd69433f723371fdd3416add9 (diff)
luci-base: add support for plural translations and contexts in Lua api
- Introduce a new luci.template.parser.ntranslate() function which takes a count, a singular and a plural translation string as well as an optional context argument and returns the appropriate, language specific plural translation. - Introduce an optional translation context argument in the existing luci.template.parser.translate() function - Support translation contexts in LuCI template directives. Translation messages are split on the first unescaped pipe character and the reamining string after the pipe is treated as context. Examples: - `string.format(p.ntranslate(n, "1 apple", "%d apples"), n)` will return an appropriate plural translation for the given amount. - `translate("Load", "The system load")` will return an appropiate translation for `Load`, using `The system load` as disambiguation context (a `msgctxt` directive in *.po files). - Likewise `<%:Load|The system load%>` will translate the word `Load` while using the remainder of the string as context. - To use pipes in translations strings literally, they must be escaped: `<%:Use the "\|" character%>` will translate the literal string `Use the "|" character`. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'build/i18n-scan.pl')
-rwxr-xr-xbuild/i18n-scan.pl14
1 files changed, 12 insertions, 2 deletions
diff --git a/build/i18n-scan.pl b/build/i18n-scan.pl
index ddec094ca..e46863942 100755
--- a/build/i18n-scan.pl
+++ b/build/i18n-scan.pl
@@ -124,14 +124,24 @@ sub preprocess_htm($$) {
'=' => '(%s)',
'_' => 'translate([==[%s]==])',
':' => 'translate([==[%s]==])',
- '+' => 'include([==[%s]==)',
+ '+' => 'include([==[%s]==])',
'#' => '--[==[%s]==]',
'' => '%s'
};
# Translate the .htm source into a valid Lua source using bracket quotes
# to avoid the need for complex escaping.
- $source =~ s|<%-?([=_:+#]?)(.*?)-?%>|sprintf "]==]; $sub->{$1}; [==[", $2|sge;
+ $source =~ s!<%-?([=_:+#]?)(.*?)-?%>!
+ my $t = $1;
+ my $s = $2;
+
+ # Split translation expressions on first non-escaped pipe.
+ if ($t eq ':' || $t eq '_') {
+ $s =~ s/^((?:[^\|\\]|\\.)*)\|(.*)$/$1]==],[==[$2/;
+ }
+
+ sprintf "]==]; $sub->{$t}; [==[", $s
+ !sge;
# Discover expressions like "lng.translate(...)" or "luci.i18n.translate(...)"
# and return them as extra keyword so that xgettext recognizes such expressions