From 7c697759e9da678cee23561ce413da0d75f7bc64 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak <p.jaszkow@gmail.com>
Date: Thu, 1 Dec 2016 17:06:53 -0700
Subject: [PATCH] Escape and ignore `%` and `\,` in translator args

---
 public/src/modules/translator.js | 5 +++--
 test/translator.js               | 7 +++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js
index a876dba44c..e60385ed79 100644
--- a/public/src/modules/translator.js
+++ b/public/src/modules/translator.js
@@ -105,7 +105,7 @@
 					} else if (text.slice(i, i + 2) === ']]') {
 						level -= 1;
 						i += 1;
-					} else if (level === 0 && text[i] === ',') {
+					} else if (level === 0 && text[i] === ',' && text[i - 1] !== '\\') {
 						arr.push(text.slice(brk, i).trim());
 						i += 1;
 						brk = i;
@@ -260,7 +260,8 @@
 				}
 				var out = translated;
 				translatedArgs.forEach(function (arg, i) {
-					out = out.replace(new RegExp('%' + (i + 1), 'g'), arg);
+					var escaped = arg.replace(/%/g, '&#37;').replace(/\\,/g, '&#44;');
+					out = out.replace(new RegExp('%' + (i + 1), 'g'), escaped);
 				});
 				return out;
 			});
diff --git a/test/translator.js b/test/translator.js
index 91fbf8f696..f52fd7c79c 100644
--- a/test/translator.js
+++ b/test/translator.js
@@ -127,14 +127,13 @@ describe('new Translator(language)', function () {
 			});
 		});
 
-		it('should properly escape % and ,', function (done) {
+		it('should properly escape and ignore % and \\, in arguments', function (done) {
 			var translator = Translator.create('en-GB');
 
-			var title = 'Test 1, 2, 3 % salmon';
-			title = title.replace(/%/g, '&#37;').replace(/,/g, '&#44;');
+			var title = 'Test 1\\, 2\\, 3 % salmon';
 			var key = "[[topic:composer.replying_to, " + title + "]]";
 			translator.translate(key).then(function (translated) {
-				assert.strictEqual(translated, 'Replying to Test 1, 2, 3 % salmon');
+				assert.strictEqual(translated, 'Replying to Test 1&#44; 2&#44; 3 &#37; salmon');
 				done();
 			});
 		});