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');