diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 2fd50d5703..30ec2e1979 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -286,6 +286,9 @@ var out = translated; translatedArgs.forEach(function (arg, i) { var escaped = arg.replace(/%(?=\d)/g, '%').replace(/\\,/g, ','); + // fix double escaped translation keys, see https://github.com/NodeBB/NodeBB/issues/9206 + escaped = escaped.replace(/[/g, '[') + .replace(/]/g, ']'); out = out.replace(new RegExp('%' + (i + 1), 'g'), escaped); }); return out; diff --git a/test/translator.js b/test/translator.js index 1776c06b9b..bd6d0f0fbb 100644 --- a/test/translator.js +++ b/test/translator.js @@ -135,6 +135,16 @@ describe('new Translator(language)', function () { }); }); + it('should translate escaped translation arguments properly', function () { + // https://github.com/NodeBB/NodeBB/issues/9206 + var translator = Translator.create('en-GB'); + + var key = '[[notifications:upvoted_your_post_in, test1, error: Error: [[error:group-name-too-long]] on NodeBB Upgrade]]'; + return translator.translate(key).then(function (translated) { + assert.strictEqual(translated, 'test1 has upvoted your post in error: Error: [[error:group-name-too-long]] on NodeBB Upgrade.'); + }); + }); + it('should properly escape and ignore % and \\, in arguments', function () { var translator = Translator.create('en-GB');