luci-base: add support for plural translations and contexts in Lua api
authorJo-Philipp Wich <jo@mein.io>
Thu, 23 Jan 2020 20:53:26 +0000 (21:53 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 7 May 2020 17:40:49 +0000 (19:40 +0200)
commit8fe8bfcc16d568f851dd0f2ef9c836f749259244
treed6d03ddf1eaeff2a8f7b215871bbe1542df53a7c
parentaf17f7ef0984e8634068702e70ab431c7acffde9
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>
(cherry picked from commit 9939fc5a26d07da4756497bb6a7dc51dcf379e98)
.gitignore
build/i18n-scan.pl
modules/luci-base/src/Makefile
modules/luci-base/src/contrib/lemon.c [new file with mode: 0644]
modules/luci-base/src/contrib/lempar.c [new file with mode: 0644]
modules/luci-base/src/plural_formula.y [new file with mode: 0644]
modules/luci-base/src/template_lmo.c
modules/luci-base/src/template_lmo.h
modules/luci-base/src/template_lualib.c
modules/luci-base/src/template_utils.c