From cdce25374ff1464296aa3e91d69740d51a9ba99e Mon Sep 17 00:00:00 2001
From: Steffen van Bergerem <svbergerem@omgsrsly.net>
Date: Sat, 12 Nov 2016 22:49:07 +0100
Subject: [PATCH] Reduce i18n.load side effects

closes #7184
---
 Changelog.md                           |  1 +
 app/assets/javascripts/helpers/i18n.js |  2 +-
 spec/javascripts/helpers/i18n_spec.js  | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/Changelog.md b/Changelog.md
index e35adc2cc4..d5df0dfd4b 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -2,6 +2,7 @@
 
 ## Refactor
 * Use string-direction gem for rtl detection [#7181](https://github.com/diaspora/diaspora/pull/7181)
+* Reduce i18n.load side effects [#7184](https://github.com/diaspora/diaspora/pull/7184)
 
 ## Bug fixes
 * Fix fetching comments after fetching likes [#7167](https://github.com/diaspora/diaspora/pull/7167)
diff --git a/app/assets/javascripts/helpers/i18n.js b/app/assets/javascripts/helpers/i18n.js
index 42bd7a8864..e6db0f2e18 100644
--- a/app/assets/javascripts/helpers/i18n.js
+++ b/app/assets/javascripts/helpers/i18n.js
@@ -18,7 +18,7 @@ Diaspora.I18n = {
   },
 
   updateLocale: function(locale, data) {
-    locale.data = $.extend(locale.data, data);
+    locale.data = $.extend({}, locale.data, data);
 
     var rule = locale.data.pluralization_rule;
     if (typeof rule !== "undefined") {
diff --git a/spec/javascripts/helpers/i18n_spec.js b/spec/javascripts/helpers/i18n_spec.js
index 79dfabe27f..0190a454f3 100644
--- a/spec/javascripts/helpers/i18n_spec.js
+++ b/spec/javascripts/helpers/i18n_spec.js
@@ -45,6 +45,28 @@ describe("Diaspora.I18n", function() {
 
       expect(Diaspora.I18n.locale.data).toEqual(extended);
     });
+
+    it("overrides existing translations", function() {
+      var oldLocale = {name: "Bob"};
+      var newLocale = {name: "Alice"};
+      Diaspora.I18n.load(oldLocale, "en");
+      expect(Diaspora.I18n.locale.data.name).toBe("Bob");
+      Diaspora.I18n.load(newLocale, "en");
+      expect(Diaspora.I18n.locale.data.name).toBe("Alice");
+
+      Diaspora.I18n.reset(oldLocale);
+      expect(Diaspora.I18n.locale.data.name).toBe("Bob");
+      Diaspora.I18n.load(newLocale, "en");
+      expect(Diaspora.I18n.locale.data.name).toBe("Alice");
+    });
+
+    it("doesn't change locale objects given in ealier calls", function() {
+      var oldLocale = {name: "Bob"};
+      var newLocale = {name: "Alice"};
+      Diaspora.I18n.reset(oldLocale);
+      Diaspora.I18n.load(newLocale, "en");
+      expect(oldLocale.name).toBe("Bob");
+    });
   });
 
   describe("::t", function() {
-- 
GitLab