Add '@n' escape sequences and some documentation on translated strings.
authorNathanaƫl Courant <Ekdohibs@users.noreply.github.com>
Sat, 26 Aug 2017 07:43:08 +0000 (09:43 +0200)
committerGitHub <noreply@github.com>
Sat, 26 Aug 2017 07:43:08 +0000 (09:43 +0200)
builtin/common/misc_helpers.lua
doc/lua_api.txt
src/translation.cpp

index 67eda11f3c9c446a9363069903a87f4d75aa9230..5fc589b72f3164b0429d9d2563a4be1fcca5ba1b 100644 (file)
@@ -704,6 +704,8 @@ function core.translate(textdomain, str, ...)
                        end
                        arg_index = arg_index + 1
                        return ESCAPE_CHAR .. "F" .. arg[a] .. ESCAPE_CHAR .. "E"
+               elseif matched == "n" then
+                       return "\n"
                else
                        return matched
                end
index 6ff9c9433695f7b3f451332d8c1979a4ce146dae..152da5985241bb89ac1d16521f2e143f7bb6fc05 100644 (file)
@@ -2199,6 +2199,15 @@ Two functions are provided to translate strings: `minetest.translate` and `minet
 
   this will be displayed as "Laine Rouge" on clients with a French locale.
 
+### Operations on translated strings
+
+The output of `minetest.translate` is a string, with escape sequences adding additional information to that string
+so that it can be translated on the different clients. In particular, you can't expect operations like string.length
+to work on them like you would expect them to, or string.gsub to work in the expected manner. However, string
+concatenation will still work as expected (note that you should only use this for things like formspecs; do not
+translate sentences by breaking them into parts; arguments should be used instead), and operations such as
+`minetest.colorize` which are only concatenation under the hood as well.
+
 ### Translation file format
 A translation file has the suffix `.[lang].tr`, where `[lang]` is the language it corresponds to.
 The file should be a text file, with the following format:
@@ -2221,6 +2230,7 @@ Strings that need to be translated can contain several escapes, preceded by `@`.
   files to avoid begin confused with the `=` separating the original from the translation.
 * `@\n` (where the `\n` is a literal newline) acts as a literal newline. As with `@=`, this escape is not required
   in strings given to `minetest.translate`, but is in translation files.
+* `@n` acts as a literal newline as well.
 
 `minetest` namespace reference
 ------------------------------
index e8582f3286e3481ede2df829726488b5a92be73b..31efca41eaa457a01701800120153d57085b023e 100644 (file)
@@ -80,6 +80,8 @@ void Translations::loadTranslation(const std::string &data)
                                if (i + 1 < wline.length()) {
                                        if (wline[i + 1] == L'=') {
                                                word1.put(L'=');
+                                       } else if (wline[i + 1] == L'n') {
+                                               word1.put(L'\n');
                                        } else {
                                                word1.put(L'@');
                                                word1.put(wline[i + 1]);
@@ -113,6 +115,8 @@ void Translations::loadTranslation(const std::string &data)
                                if (i + 1 < wline.length()) {
                                        if (wline[i + 1] == L'=') {
                                                word2.put(L'=');
+                                       } else if (wline[i + 1] == L'n') {
+                                               word2.put(L'\n');
                                        } else {
                                                word2.put(L'@');
                                                word2.put(wline[i + 1]);