diff --git a/customize.dist/messages.js b/customize.dist/messages.js
index 65b306f42..16128df9c 100755
--- a/customize.dist/messages.js
+++ b/customize.dist/messages.js
@@ -43,7 +43,7 @@ define(req, function(Util, Default, Language) {
messages._checkTranslationState = function (cb) {
if (typeof(cb) !== "function") { return; }
- var missing = [];
+ var allMissing = [];
var reqs = [];
Object.keys(map).forEach(function (code) {
if (code === defaultLanguage) { return; }
@@ -54,37 +54,60 @@ define(req, function(Util, Default, Language) {
Object.keys(map).forEach(function (code, i) {
if (code === defaultLanguage) { return; }
var translation = langs[i];
- var updated = {};
- Object.keys(Default).forEach(function (k) {
- if (/^updated_[0-9]+_/.test(k) && !translation[k]) {
- var key = k.split('_').slice(2).join('_');
- // Make sure we don't already have an update for that key. It should not happen
- // but if it does, keep the latest version
- if (updated[key]) {
- var ek = updated[key];
- if (parseInt(ek.split('_')[1]) > parseInt(k.split('_')[1])) { return; }
+ var missing = [];
+ var checkInObject = function (ref, translated, path) {
+ var updated = {};
+ Object.keys(ref).forEach(function (k) {
+ if (/^updated_[0-9]+_/.test(k) && !translated[k]) {
+ var key = k.split('_').slice(2).join('_');
+ // Make sure we don't already have an update for that key. It should not happen
+ // but if it does, keep the latest version
+ if (updated[key]) {
+ var ek = updated[key];
+ if (parseInt(ek.split('_')[1]) > parseInt(k.split('_')[1])) { return; }
+ }
+ updated[key] = k;
}
- updated[key] = k;
- }
- });
- Object.keys(Default).forEach(function (k) {
- if (/^_/.test(k) || k === 'driveReadme') { return; }
- if (!translation[k] || updated[k]) {
- if (updated[k]) {
- missing.push([code, k, 2, 'out.' + updated[k]]);
- return;
+ });
+ Object.keys(ref).forEach(function (k) {
+ if (/^_/.test(k) || k === 'driveReadme') { return; }
+ var nPath = path.slice();
+ nPath.push(k);
+ if (!translated[k] || updated[k]) {
+ if (updated[k]) {
+ var uPath = path.slice();
+ uPath.unshift('out');
+ missing.push([code, nPath, 2, uPath.join('.') + '.' + updated[k]]);
+ return;
+ }
+ return void missing.push([code, nPath, 1]);
}
- missing.push([code, k, 1]);
- }
- });
- Object.keys(translation).forEach(function (k) {
- if (/^_/.test(k) || k === 'driveReadme') { return; }
- if (typeof Default[k] === "undefined") {
- missing.push([code, k, 0]);
- }
+ if (typeof ref[k] !== typeof translated[k]) {
+ return void missing.push([code, nPath, 3]);
+ }
+ if (typeof ref[k] === "object" && !Array.isArray(ref[k])) {
+ checkInObject(ref[k], translated[k], nPath);
+ }
+ });
+ Object.keys(translated).forEach(function (k) {
+ if (/^_/.test(k) || k === 'driveReadme') { return; }
+ var nPath = path.slice();
+ nPath.push(k);
+ if (typeof ref[k] === "undefined") {
+ missing.push([code, nPath, 0]);
+ }
+ });
+ };
+ checkInObject(Default, translation, []);
+ // Push the removals at the end
+ missing.sort(function (a, b) {
+ if (a[2] === 0 && b[2] !== 0) return 1;
+ if (a[2] !== 0 && b[2] === 0) return -1;
+ return 0;
});
+ Array.prototype.push.apply(allMissing, missing); // Destructive concat
});
- cb(missing);
+ cb(allMissing);
});
};
diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js
index 32c61825f..d5c628f8c 100644
--- a/customize.dist/translations/messages.js
+++ b/customize.dist/translations/messages.js
@@ -22,8 +22,7 @@ define(function () {
out.button_newslide = 'New Presentation';
out.button_newwhiteboard = 'New Whiteboard';
- // NOTE: We want to update the 'common_connectionLost' key.
- // Please do not add a new 'updated_common_connectionLostAndInfo' but change directly the value of 'common_connectionLost'
+ // NOTE: Remove updated_0_ if we need an updated_1_
out.updated_0_common_connectionLost = "Server Connection Lost
You're now in read-only mode until the connection is back.";
out.common_connectionLost = out.updated_0_common_connectionLost;
diff --git a/www/assert/translations/main.js b/www/assert/translations/main.js
index 9a5397c73..db005ce0a 100644
--- a/www/assert/translations/main.js
+++ b/www/assert/translations/main.js
@@ -1,8 +1,9 @@
define([
'jquery',
- '/common/cryptpad-common.js',
+ '/common/common-util.js',
+ '/customize/messages.js',
'/customize/translations/messages.js',
-], function ($, Cryptpad, English) {
+], function ($, Util, Messages, English) {
var $body = $('body');
@@ -11,38 +12,40 @@ define([
};
var todo = function (missing) {
- var str = "";
- var need = 1;
+ var currentLang = "";
+ var currentState = 1;
if (missing.length) {
$body.append(pre(missing.map(function (msg) {
var res = "";
- var code = msg[0];
- var key = msg[1];
- var needed = msg[2];
+ var lang = msg[0];
+ var key = msg[1]; // Array
+ var state = msg[2]; // 0 === toDelete, 1 === missing, 2 === updated, 3 === invalid (wrong type)
var value = msg[3] || '""';
- if (str !== code) {
- if (str !== "")
+ if (currentLang !== lang) {
+ if (currentLang !== "")
{
res += '\n';
}
- str = code;
- res += '/*\n *\n * ' + code + '\n *\n */\n\n';
+ currentLang = lang;
+ res += '/*\n *\n * ' + lang + '\n *\n */\n\n';
}
- if (need !== needed) {
- need = needed;
- if (need === 0)
+ if (currentState !== state) {
+ currentState = state;
+ if (currentState === 0)
{
- res += '\n// TODO: These keys are not needed anymore and should be removed ('+ code + ')\n\n';
+ res += '\n// TODO: These keys are not needed anymore and should be removed ('+ lang + ')\n\n';
}
}
- res += (need ? '' : '// ') + 'out.' + key + ' = ' + value + ';';
- if (need === 1) {
- res += ' // ' + JSON.stringify(English[key]);
- } else if (need === 2) {
- res += ' // TODO: Key updated --> make sure the updated key "'+ value +'" exists and is translated before that one.';
+ res += (currentState ? '' : '// ') + 'out.' + key.join('.') + ' = ' + value + ';';
+ if (currentState === 1) {
+ res += ' // ' + JSON.stringify(Util.find(English, key));
+ } else if (currentState === 2) {
+ res += ' // TODO: Key updated --> make sure the updated key "'+ value +'" exists and is translated before this one.';
+ } else if (currentState === 3) {
+ res += ' // NOTE: this key has an invalid type! Original value: ' + JSON.stringify(Util.find(English, key));
}
return res;
}).join('\n')));
@@ -50,5 +53,5 @@ define([
$body.text('// All keys are present in all translations');
}
};
- Cryptpad.Messages._checkTranslationState(todo);
+ Messages._checkTranslationState(todo);
});