From d62343a699117a23721cea474567c3a33a17db14 Mon Sep 17 00:00:00 2001
From: Katarzyna Kwiatkowska <kkwiatkowska@pl.sii.eu>
Date: Tue, 4 Jul 2017 01:12:01 +0200
Subject: [PATCH] 16465: Plural forms handling added to buildUpLang function;
 minor fixes and improvements

---
 .gitignore                                    |   3 +
 js/dss/dss-components/dss-action-selector.js  |   6 +-
 .../dss-components/dss-condition-selector.js  |   6 +-
 js/dss/dss-datamodel.js                       | 107 +++++++++++-------
 4 files changed, 73 insertions(+), 49 deletions(-)

diff --git a/.gitignore b/.gitignore
index aea2b7dc..c64a0449 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,6 @@
 thumbs.db
 .DS_Store
 /.project
+
+responsive-ui/node_modules/*
+responsive-ui/bower_components/*
diff --git a/js/dss/dss-components/dss-action-selector.js b/js/dss/dss-components/dss-action-selector.js
index 7843c971..06ef3583 100644
--- a/js/dss/dss-components/dss-action-selector.js
+++ b/js/dss/dss-components/dss-action-selector.js
@@ -1591,10 +1591,8 @@ Ext.define('DSS.component.ActionConfigurator', {
             },
             listeners : {
                 datachanged : function(store, eOpts) {
-                	if (store.getCount()==1)
-                		me.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} activity'), {count:''+store.getCount()}), false);
-                	else
-                		me.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} activites'), {count:''+store.getCount()}), false);
+                    var ct = store.getCount();
+                	me.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} activity', '{count} activites', ct), { count: '' + ct }), false);
                 }
             }
         });
diff --git a/js/dss/dss-components/dss-condition-selector.js b/js/dss/dss-components/dss-condition-selector.js
index db940e91..8769d74c 100644
--- a/js/dss/dss-components/dss-condition-selector.js
+++ b/js/dss/dss-components/dss-condition-selector.js
@@ -701,7 +701,8 @@ Ext.define('DSS.component.ConditionConfigurator', {
             },
             listeners : {
                 datachanged : function(store, eOpts) {
-                    me.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} condition', '{count} conditions', store.getCount()), {count:''+store.getCount()}), false);
+                    var ct = store.getCount();
+                    me.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} condition', '{count} conditions', ct), { count: '' + ct }), false);
                 },
                 clear : function(store, eOpts) {
                     me.lblSelectorAnzeige.setText(_('no condition'), false);
@@ -3579,7 +3580,8 @@ Ext.define('DSS.component.ConditionConfigurator', {
                     mThis.oButtonDelete.setDisabled(true);
                     mThis.oButtonUp.setDisabled(true);
                     mThis.oButtonDown.setDisabled(true);
-                    mThis.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} condition', '{count} conditions', view.store.getCount(), {count:''+view.store.getCount()})), false);
+                    var ct = view.store.getCount();
+                    mThis.lblSelectorAnzeige.setText(Ext.String.format2(_('{count} condition', '{count} conditions', ct), { count: '' + ct }), false);
                 }
                 if ( mThis.macPanel.collapsed) {
                 	//mThis.oActualValue = mThis.getSelectedMainRecord();
diff --git a/js/dss/dss-datamodel.js b/js/dss/dss-datamodel.js
index 502d3d35..4cbdd583 100644
--- a/js/dss/dss-datamodel.js
+++ b/js/dss/dss-datamodel.js
@@ -4331,13 +4331,13 @@ dss.buildUpLang = function(oLangDefinitions, languageSuffix) {
 	 */
 
 	var params = {
-		domain : "dss-addon-framework",
-		locale_data : {}
+		domain: 'dss-addon-framework',
+		locale_data: {}
 	};
 
 	if (languageSuffix == null) {
 		var oLang = Ext.JSON.decode(dss.ajaxSyncRequest('/json/property/query', {
-			query : '/system/language(locale)'
+			query: '/system/language(locale)'
 		}));
 		if (oLang != null)
 			if (oLang.ok && (oLang.result.language[0] !== undefined)) {
@@ -4346,70 +4346,91 @@ dss.buildUpLang = function(oLangDefinitions, languageSuffix) {
 				languageSuffix = "en_US";
 			}
 	}
-	if (languageSuffix == null)
+	if (languageSuffix == null) {
 		languageSuffix = 'de_DE';
+    }
 	dss.staticDataModel.activeLanguage = languageSuffix;
-	if (oLangDefinitions == null)
+	if (oLangDefinitions == null) {
 		oLangDefinitions = [];
+    }
 
 	oLangDefinitions.splice(0, 0, '/framework/locale/{languageSuffix}/dss-addon-framework.po');
-	locale_ = {};
-	for (var lIndex = 0; lIndex < oLangDefinitions.length; lIndex++) {
+	for (var l = 0, langLen = oLangDefinitions.length; l < langLen; l++) {
 		var sDomain = params.domain;
 
-		var sURL = Ext.String.format2(oLangDefinitions[lIndex], {
-			'languageSuffix' : dss.staticDataModel.activeLanguage
+		var sURL = Ext.String.format2(oLangDefinitions[l], {
+			'languageSuffix': dss.staticDataModel.activeLanguage
 		}, false);
 
-		if (params.locale_data[sDomain] == null)
+		if (params.locale_data[sDomain] == null) {
 			params.locale_data[sDomain] = {};
+        }
 
 		var sString = dss.ajaxSyncRequest(sURL, {});
 
 		var oArray = sString.split('\n');
+        var sTempString;
 		var iState = 0;
-		var sMSGID = null;
 		var msgid;
-		var msgstr;
+        var msgidPlural;
+		var msgstr;   // array: [ msgidPlural, msgstr, msgstrPlural, msgstrPluralN ]
+        var match;
+        var pluralIndex;
 		function ltrim(sString) {
 			return sString.replace(/^\s+/, '');
 		}
-		for (var iIndex = 0; iIndex < oArray.length; iIndex++) {
-			if (oArray[iIndex][0] == '#') {
+		for (var i = 0, len = oArray.length; i < len; i++) {
+			if (oArray[i][0] === '#') {
 				iState = 0;
-			} else if (oArray[iIndex].indexOf("msgid") > -1) {
+                msgidPlural = null;
+                msgstr = [];
+                pluralIndex = null;
+            } else if (oArray[i].indexOf("msgid_plural") > -1) {
+                iState = 2;
+                msgidPlural = oArray[i].substr(oArray[i].indexOf('"') + 1);
+				msgidPlural = msgidPlural.substr(0, msgidPlural.lastIndexOf('"'));
+			} else if (oArray[i].indexOf("msgid") > -1) {
 				iState = 1;
-				msgid = oArray[iIndex].substr(oArray[iIndex].indexOf('"') + 1);
+				msgid = oArray[i].substr(oArray[i].indexOf('"') + 1);
 				msgid = msgid.substr(0, msgid.lastIndexOf('"'));
-			} else if (oArray[iIndex].indexOf("msgstr") > -1) {
-				if (iState == 1) {
-					iState = 2;
-					msgstr = oArray[iIndex].substr(oArray[iIndex].indexOf('"') + 1);
-					msgstr = msgstr.substr(0, msgstr.lastIndexOf('"'));
-					params.locale_data[sDomain][msgid] = [ null, msgstr ];
+            } else if (iState >= 2 && oArray[i].indexOf("msgstr[") > -1) {
+                iState = 3;
+                match = oArray[i].match(/^msgstr\[(\d+)\]/g);
+                pluralIndex = parseInt(match[0].slice(7, -1), 10);
+                sTempString = oArray[i].substr(oArray[i].indexOf('"') + 1);
+                sTempString = sTempString.substr(0, sTempString.lastIndexOf('"'));
+                msgstr[0] = msgidPlural;
+                msgstr[pluralIndex + 1] = sTempString;
+                params.locale_data[sDomain][msgid] = msgstr;
+			} else if (oArray[i].indexOf("msgstr") > -1) {
+				if (iState >= 0) {
+					iState = 3;
+                    pluralIndex = 0;
+					sTempString = oArray[i].substr(oArray[i].indexOf('"') + 1);
+                    msgstr[0] = msgidPlural;
+					msgstr[pluralIndex + 1] = sTempString.substr(0, sTempString.lastIndexOf('"'));
+					params.locale_data[sDomain][msgid] = msgstr;
 				}
 			} else {
-				if (iState == 1) {
-					var sTempString = oArray[iIndex];
-					sTempString = ltrim(sTempString);
-					if (sTempString[0] == '"') {
-						sTempString = sTempString.substr(1);
-						sTempString = sTempString.substr(0, sTempString.lastIndexOf('"'));
-						msgid += sTempString;
-					}
-				}
-				if (iState == 2) {
-					var sTempString = oArray[iIndex];
-					sTempString = ltrim(sTempString);
-					if (sTempString[0] == '"') {
-						sTempString = sTempString.substr(1);
-						sTempString = sTempString.substr(0, sTempString.lastIndexOf('"'));
-						msgstr += sTempString;
-						params.locale_data[sDomain][msgid] = [ null, msgstr ];
-					} else {
-						oState = 0;
-					}
-				}
+                sTempString = ltrim(oArray[i]);
+                if (sTempString[0] === '"') {
+                    sTempString = sTempString.substr(1);
+                    sTempString = sTempString.substr(0, sTempString.lastIndexOf('"'));
+
+    				if (iState === 1) {  // msgid continues for more than one line
+    					msgid += sTempString;
+    				} else if (iState === 2) {  // msgid_plural continues for more than one line
+    					msgidPlural += sTempString;
+    				} else if (iState === 3) {  // msgstr continues for more than one line
+						msgstr[pluralIndex + 1] += sTempString;
+						params.locale_data[sDomain][msgid] = msgstr;
+    				}
+                } else {
+                    iState = 0;
+                    msgidPlural = null;
+                    msgstr = [];
+                    pluralIndex = null;
+                }
 			}
 		}
 	}
-- 
GitLab