Update register translations API to be independent of plugin name and language

The register API is updated to be independent of plugin name and language. The API will now
traverse the path given and create language bundles as per language files it traverses.
The translations files structure has also been simplified to be just key/value objects.

To be done:
 - Add hapi API to get translations
 - Extend the API tests to test responses
This commit is contained in:
Martin Hickey 2016-07-01 17:09:33 +01:00
parent c3403e7530
commit 0f4902d98d
19 changed files with 196 additions and 333 deletions

View file

@ -4,22 +4,8 @@
---
## development
The main goal is to manage translations for all views in Kibana.
See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. Once you have completed that, use the following npm tasks.
The i18n plugin provides an API for plugins to register translations. This API takes top level directory of where the plugin translations reside and then concatenates thes translations into a translation bundle per language. The translation files need to be a valid JSON object of key, value elements. The IDs need to be unique so it is recommended to use plugin name as a prefix.
<dl>
<dt><code>npm start</code></dt>
<dd>Start kibana and have it include this plugin</dd>
<dt><code>npm run build</code></dt>
<dd>Build a distributable archive</dd>
<dt><code>npm run test:browser</code></dt>
<dd>Run the browser tests in a real web browser</dd>
<dt><code>npm run test:server</code></dt>
<dd>Run the server tests using mocha</dd>
</dl>
For more information about any of these commands run `npm run ${task} -- --help`.
The i18n plugin provides an additional API to get registered translations for a language. This return a JSON object of all the translations elements iregistered for that language.

View file

@ -7,7 +7,7 @@ var path = require('path');
var process = require('child_process');
const TRANSLATION_FILE_EXTENSION = 'json';
const TRANSLATION_STORE_PATH = kibanaPackage.__dirname + '/data/store_translations';
const TRANSLATION_STORE_PATH = kibanaPackage.__dirname + '/data/translations';
var getPluginTranslationDetails = function (pluginTranslationPath, translationFiles, languageList, callback) {
try {
@ -19,54 +19,40 @@ var getPluginTranslationDetails = function (pluginTranslationPath, translationFi
};
//TODO(hickeyma): Update to use https://github.com/elastic/kibana/pull/7562
var getRegisteredPluginStoragePath = function (pluginName) {
return TRANSLATION_STORE_PATH + '/' + pluginName;
var getTranslationStoragePath = function () {
return TRANSLATION_STORE_PATH;
};
var getRegisteredPluginLanguages = function (pluginName, cb) {
var getRegisteredTranslationLanguages = function (cb) {
var translationFiles = [];
var languageList = [];
var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName);
var translationStorePath = getTranslationStoragePath();
try {
getTranslationDetailsFromDirectory(translationStorePluginPath, translationFiles, languageList);
getTranslationDetailsFromDirectory(translationStorePath, translationFiles, languageList);
} catch (err) {
return cb(err);
}
return cb(null, languageList);
};
var registerPluginLanguageTranslations = function (pluginName, pluginTranslationPath, language, cb) {
var registerTranslations = function (pluginTranslationPath, cb) {
var translationFiles = [];
var languageList = [];
var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName);
var translationstorePluginLanguageTranslationsFileName = language + '.' + TRANSLATION_FILE_EXTENSION;
var translationFileName = language + '.' + TRANSLATION_FILE_EXTENSION;
var translationStorePath = getTranslationStoragePath();
getPluginTranslationDetails(pluginTranslationPath, translationFiles, languageList, function (err) {
if (err) return cb (err);
var langSupported = false;
for (var langIndx in languageList) {
if (language === languageList[langIndx]) {
langSupported = true;
break;
}
}
if (!langSupported) {
return cb(Error(language + ' language is not supported in ' + pluginName + ' plugin.'));
}
if (err) return cb(err);
try {
if (!fs.existsSync(translationStorePluginPath)) {
mkdirp.sync(translationStorePluginPath);
if (!fs.existsSync(translationStorePath)) {
mkdirp.sync(translationStorePath);
}
for (var fileIndx in translationFiles) {
if (!translationFiles.hasOwnProperty(fileIndx)) continue;
var translationFile = translationFiles[fileIndx];
var pluginTranslationFileName = getFileName(translationFile);
if (pluginTranslationFileName !== translationFileName) continue;
var translationFileName = getFileName(translationFile);
var translationJson = require(translationFile);
var fileToWrite = translationStorePluginPath + '/' + translationFileName;
var fileToWrite = translationStorePath + '/' + translationFileName;
saveTranslationToFile(fileToWrite, translationJson);
}
} catch (err) {
@ -77,102 +63,38 @@ var registerPluginLanguageTranslations = function (pluginName, pluginTranslation
return cb(null);
};
var getRegisteredPluginLanguageTranslations = function (pluginName, language, callback) {
var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName);
var getRegisteredLanguageTranslations = function (language, callback) {
var translationStorePath = getTranslationStoragePath();
var translationFileName = language + '.' + TRANSLATION_FILE_EXTENSION;
var translationFile = translationStorePluginPath + '/' + translationFileName;
var translationFile = translationStorePath + '/' + translationFileName;
fs.readFile(translationFile, function (err, translationStr) {
if (err) return callback(err);
var translationJson = [];
try {
translationJson = JSON.parse(translationStr);
} catch (e) {
return callback('Bad ' + language + ' translation strings for plugin ' + pluginName + '. Error: ' + err);
return callback('Bad ' + language + ' translation strings. Error: ' + err);
}
return callback(null, translationJson);
});
};
var getAllRegisteredPluginsLanguageTranslations = function (language, callback) {
var registeredPlugins = [];
var allPluginsTranslationsJson = [];
try {
registeredPlugins = getAllRegisteredPlugins();
} catch (err) {
return callback(err);
}
async.each(registeredPlugins, function (pluginName, eachCB) {
getRegisteredPluginLanguageTranslations(pluginName, language, function (err, translationJson) {
if (err) {
return eachCB(err);
} else {
allPluginsTranslationsJson = allPluginsTranslationsJson.concat(translationJson);
return eachCB(null);
}
});
}, function (eachErr) {
if (eachErr) {
return callback(eachErr);
} else {
return callback(null, allPluginsTranslationsJson);
}
});
};
var getAllRegisteredPluginsCommonSupportedLanguages = function (callback) {
var registeredPlugins = [];
var allPluginsLanguages = [];
var firstRun = true;
try {
registeredPlugins = getAllRegisteredPlugins();
} catch (err) {
return callback(err);
}
async.each(registeredPlugins, function (pluginName, eachCB) {
getRegisteredPluginLanguages(pluginName, function (err, pluginLangs) {
if (err) {
return eachCB(err);
} else {
var tmpCommonLangs = [];
var tmpIndx = 0;
var allLangLength = allPluginsLanguages.length;
for (var i = 0; i < allLangLength; i++) {
if (pluginLangs.indexOf(allPluginsLanguages[i]) !== -1) {
tmpCommonLangs[tmpIndx++] = allPluginsLanguages[i];
}
}
if (firstRun) {
allPluginsLanguages = pluginLangs;
firstRun = false;
} else {
allPluginsLanguages = tmpCommonLangs;
}
return eachCB(null);
}
});
}, function (eachErr) {
if (eachErr) {
return callback(eachErr);
} else {
return callback(null, allPluginsLanguages);
}
});
};
function saveTranslationToFile(translationFullFileName, translationJson) {
function saveTranslationToFile(translationFullFileName, translationToAddJson) {
var jsonToWrite = [];
if (fs.existsSync(translationFullFileName)) {
var prevTranslationJson = require(translationFullFileName);
jsonToWrite = prevTranslationJson.concat(translationJson);
var currentTranslationJson = require(translationFullFileName);
jsonToWrite = currentTranslationJson;
for (var key in translationToAddJson) {
if (translationToAddJson.hasOwnProperty(key)) {
var attrName = key;
var attrValue = translationToAddJson[key];
jsonToWrite[attrName] = attrValue;
}
}
} else {
jsonToWrite = translationJson;
jsonToWrite = translationToAddJson;
}
fs.writeFileSync(translationFullFileName, JSON.stringify(jsonToWrite, null, 4));
fs.writeFileSync(translationFullFileName, JSON.stringify(jsonToWrite));
}
function getFilesRecursivelyFromTopDir(topDir, translationFiles, languageList) {
@ -221,25 +143,8 @@ function getFileName(fullPath) {
return fullPath.replace(/^.*[\\\/]/, '');
}
function getAllRegisteredPlugins() {
var pluginNamesList = [];
var topDir = TRANSLATION_STORE_PATH;
var dirs = fs.readdirSync(topDir);
for (var i in dirs) {
if (!dirs.hasOwnProperty(i)) continue;
var name = topDir + '/' + dirs[i];
if (fs.statSync(name).isDirectory()) {
pluginNamesList.push(dirs[i]);
}
}
return pluginNamesList;
}
module.exports.registerPluginLanguageTranslations = registerPluginLanguageTranslations;
module.exports.getRegisteredPluginLanguageTranslations = getRegisteredPluginLanguageTranslations;
module.exports.getAllRegisteredPluginsLanguageTranslations = getAllRegisteredPluginsLanguageTranslations;
module.exports.registerTranslations = registerTranslations;
module.exports.getRegisteredLanguageTranslations = getRegisteredLanguageTranslations;
module.exports.getTranslationStoragePath = getTranslationStoragePath;
module.exports.getRegisteredTranslationLanguages = getRegisteredTranslationLanguages;
module.exports.getPluginTranslationDetails = getPluginTranslationDetails;
module.exports.getRegisteredPluginStoragePath = getRegisteredPluginStoragePath;
module.exports.getRegisteredPluginLanguages = getRegisteredPluginLanguages;
module.exports.getAllRegisteredPluginsCommonSupportedLanguages = getAllRegisteredPluginsCommonSupportedLanguages;

View file

@ -14,7 +14,7 @@ export default function (server) {
var acceptLanguage = req.headers['accept-language'];
var languages = langParser.parse(acceptLanguage);
getAllPluginsLanguageTranslations(languages, function (err, translations) {
getRegisteredLanguageTranslations(languages, function (err, translations) {
if (err) {
reply(Boom.internal(err));
return;
@ -26,14 +26,14 @@ export default function (server) {
};
function getAllPluginsLanguageTranslations(acceptLanguages, cb) {
function getRegisteredLanguageTranslations(acceptLanguages, cb) {
getAllPluginsSupportedLanguage(acceptLanguages, function (err, language) {
getRegisteredTranslationLanguages(acceptLanguages, function (err, language) {
if (err) {
return cb(err);
}
i18n.getAllRegisteredPluginsLanguageTranslations(language, function (err, translationsJson) {
i18n.getRegisteredLanguageTranslations(language, function (err, translationsJson) {
if (err) {
return cb(err);
} else {
@ -43,10 +43,10 @@ function getAllPluginsLanguageTranslations(acceptLanguages, cb) {
});
}
function getAllPluginsSupportedLanguage(acceptLanguages, cb) {
function getRegisteredTranslationLanguages(acceptLanguages, cb) {
var langStr = DEFAULT_LANGUAGE;
i18n.getAllRegisteredPluginsCommonSupportedLanguages(function (err, pluginCommonLanguages) {
i18n.getRegisteredTranslationLanguages(function (err, registeredLanguages) {
if (err) {
return cb(err);
}
@ -59,7 +59,7 @@ function getAllPluginsSupportedLanguage(acceptLanguages, cb) {
} else {
langStr = language.code;
}
if (pluginCommonLanguages.indexOf(langStr) > -1) {
if (registeredLanguages.indexOf(langStr) > -1) {
foundLang = true;
return true;
} else {
@ -72,7 +72,7 @@ function getAllPluginsSupportedLanguage(acceptLanguages, cb) {
acceptLanguages.some(function partialMatch(language) {
langStr = language.code;
pluginCommonLanguages.some(function (lang) {
registeredLanguages.some(function (lang) {
if (lang.match('^' + langStr)) {
langStr = lang;
foundLang = true;

View file

@ -0,0 +1,4 @@
{
"test_plugin_1-NO_SSL": "Dont run the DE dev server using HTTPS",
"test_plugin_1-DEV": "Run the DE server with development mode defaults"
}

View file

@ -0,0 +1,10 @@
{
"test_plugin_1-NO_SSL": "Dont run the dev server using HTTPS",
"test_plugin_1-DEV": "Run the server with development mode defaults",
"test_plugin_1-NO_RUN_SERVER": "Dont run the dev server",
"test_plugin_1-HOME": "Run along home now!",
"test_plugin_2-XXXXXX": "This is XXXXXX string",
"test_plugin_2-YYYY_PPPP": "This is YYYY_PPPP string",
"test_plugin_2-FFFFFFFFFFFF": "This is FFFFFFFFFFFF string",
"test_plugin_2-ZZZ": "This is ZZZ string"
}

View file

@ -1,6 +1,4 @@
[
{
"NO_SSL": "Dont run the DE dev server using HTTPS",
"DEV": "Run the DE server with development mode defaults"
"test_plugin_1-NO_SSL": "Dont run the DE dev server using HTTPS",
"test_plugin_1-DEV": "Run the DE server with development mode defaults"
}
]

View file

@ -1,9 +1,6 @@
[{
"NO_SSL": "Dont run the dev server using HTTPS",
"DEV": "Run the server with development mode defaults"
},
{
"NO_RUN_SERVER": "Dont run the dev server",
"HOME": "Run along home now!"
"test_plugin_1-NO_SSL": "Dont run the dev server using HTTPS",
"test_plugin_1-DEV": "Run the server with development mode defaults",
"test_plugin_1-NO_RUN_SERVER": "Dont run the dev server",
"test_plugin_1-HOME": "Run along home now!"
}
]

View file

@ -1,10 +1,6 @@
[
{
"XXXXXX": "This is XXXXXX string",
"YYYY_PPPP": "This is YYYY_PPPP string"
},
{
"FFFFFFFFFFFF": "This is FFFFFFFFFFFF string",
"ZZZ": "This is ZZZ string"
}
]
{
"XXXXXX": "This is XXXXXX string",
"YYYY_PPPP": "This is YYYY_PPPP string",
"FFFFFFFFFFFF": "This is FFFFFFFFFFFF string",
"ZZZ": "This is ZZZ string"
}

View file

@ -0,0 +1,4 @@
{
"test_plugin_1-NO_SSL": "Dont run the DE dev server using HTTPS",
"test_plugin_1-DEV": "Run the DE server with development mode defaults"
}

View file

@ -0,0 +1,4 @@
{
"test_plugin_1-NO_SSL": "Dont run the dev server using HTTPS",
"test_plugin_1-DEV": "Run the server with development mode defaults"
}

View file

@ -0,0 +1,4 @@
{
"test_plugin_1-NO_RUN_SERVER": "Dont run the dev server",
"test_plugin_1-HOME": "Run along home now!"
}

View file

@ -0,0 +1,4 @@
{
"test_plugin_2-XXXXXX": "This is XXXXXX string",
"test_plugin_2-YYYY_PPPP": "This is YYYY_PPPP string"
}

View file

@ -0,0 +1,4 @@
{
"test_plugin_2-FFFFFFFFFFFF": "This is FFFFFFFFFFFF string",
"test_plugin_2-ZZZ": "This is ZZZ string"
}

View file

@ -5,9 +5,9 @@ var i18n = require('../i18n');
describe('Test plugin translations details for test_plugin_1', function () {
var pluginName = 'test_plugin_1';
var pluginTranslationPath = __dirname + '/' + pluginName + '/translations';
var pluginTranslationPath = __dirname + '/data/translations/' + pluginName;
it('2 translation languages exist', function (done) {
it('Translation languages exist', function (done) {
var result = true;
var expectedLanguages = ['en', 'de'];
getPluginTranslationLanguages(pluginName, pluginTranslationPath, function (err, actualLanguages) {
@ -34,33 +34,6 @@ describe('Test plugin translations details for test_plugin_1', function () {
});
});
it('2 translation languages exist and wrongly expecting 1', function (done) {
var result = true;
var expectedLanguages = ['de'];
getPluginTranslationLanguages(pluginName, pluginTranslationPath, function (err, actualLanguages) {
if (err) {
console.log(err);
result = false;
} else {
if (actualLanguages.length !== expectedLanguages.length) {
result = false;
} else {
var index = actualLanguages.length;
actualLanguages.sort();
expectedLanguages.sort();
while (index--) {
if (actualLanguages[index] !== expectedLanguages[index]) {
result = false;
break;
}
}
}
}
expect(result).to.be(false);
done();
});
});
it('Translation files exist', function (done) {
var result = true;
var expectedFiles = [
@ -95,42 +68,65 @@ describe('Test plugin translations details for test_plugin_1', function () {
describe('Test registering translations for test_plugin_1', function () {
var pluginName = 'test_plugin_1';
var pluginTranslationPath = __dirname + '/' + pluginName + '/translations';
var pluginTranslationPath = __dirname + '/data/translations/' + pluginName;
it('Translation plugin bundle for English' , function (done) {
it('Register translations' , function (done) {
var result = true;
var language = 'en';
i18n.registerPluginLanguageTranslations(pluginName, pluginTranslationPath, language, function (err) {
i18n.registerTranslations(pluginTranslationPath, function (err) {
if (err) {
console.log(err);
result = false;
} else {
var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
expectedTranslationJson = JSON.stringify(expectedTranslationJson);
i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
actualTranslationJson = JSON.stringify(actualTranslationJson);
if (actualTranslationJson !== expectedTranslationJson) {
result = false;
}
}
});
}
expect(result).to.be(true);
done();
});
});
it('Languages are registered', function (done) {
var expectedLanguages = ['en'];
it('EN translations are registered' , function (done) {
var result = true;
var language = 'en';
var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
i18n.getRegisteredLanguageTranslations(language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
if (!compareTranslations(actualTranslationJson, expectedTranslationJson)) {
result = false;
}
}
expect(result).to.be(true);
done();
});
});
it('DE translations are registered' , function (done) {
var result = true;
var language = 'de';
var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
i18n.getRegisteredLanguageTranslations(language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
if (!compareTranslations(actualTranslationJson, expectedTranslationJson)) {
result = false;
}
}
expect(result).to.be(true);
done();
});
});
it('Translation languages are registered', function (done) {
var expectedLanguages = ['en', 'de'];
var result = true;
i18n.getRegisteredPluginLanguages(pluginName, function (err, actualLanguages) {
i18n.getRegisteredTranslationLanguages(function (err, actualLanguages) {
if (err) {
console.log(err);
result = false;
@ -155,97 +151,53 @@ describe('Test registering translations for test_plugin_1', function () {
});
after(function (done) {
var translationPluginStorePath = i18n.getRegisteredPluginStoragePath('test_plugin_1');
process.execSync('rm -rf ' + translationPluginStorePath);
var translationStorePath = i18n.getTranslationStoragePath();
process.execSync('rm -rf ' + translationStorePath);
done();
});
});
describe('Test registering and retrieving all translations for test_plugin_1 and test_plugin_2', function () {
it('Translation English bundle for test_plugin_1' , function (done) {
describe('Test registering translations for test_plugin_1 and test_plugin_2', function () {
it('Register translations for test_plugin_1' , function (done) {
var result = true;
var language = 'en';
var pluginName = 'test_plugin_1';
var pluginTranslationPath = __dirname + '/' + pluginName + '/translations';
i18n.registerPluginLanguageTranslations(pluginName, pluginTranslationPath, language, function (err) {
var pluginTranslationPath = __dirname + '/data/translations/' + pluginName;
i18n.registerTranslations(pluginTranslationPath, function (err) {
if (err) {
console.log(err);
result = false;
} else {
var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
expectedTranslationJson = JSON.stringify(expectedTranslationJson);
i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
actualTranslationJson = JSON.stringify(actualTranslationJson);
if (actualTranslationJson !== expectedTranslationJson) {
result = false;
}
}
});
}
expect(result).to.be(true);
done();
});
});
it('Translation English bundle for test_plugin_2' , function (done) {
it('Register translations for test_plugin_2' , function (done) {
var result = true;
var language = 'en';
var pluginName = 'test_plugin_2';
var pluginTranslationPath = __dirname + '/' + pluginName + '/translations';
i18n.registerPluginLanguageTranslations(pluginName, pluginTranslationPath, language, function (err) {
var pluginTranslationPath = __dirname + '/data/translations/' + pluginName;
i18n.registerTranslations(pluginTranslationPath, function (err) {
if (err) {
console.log(err);
result = false;
} else {
var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
expectedTranslationJson = JSON.stringify(expectedTranslationJson);
i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
actualTranslationJson = JSON.stringify(actualTranslationJson);
if (actualTranslationJson !== expectedTranslationJson) {
result = false;
}
}
});
}
expect(result).to.be(true);
done();
});
});
it('Compare registerd translations for test_plugin_1 and test_plugin_2' , function (done) {
it('EN translations are registered' , function (done) {
var result = true;
var language = 'en';
var expectedTranslationJson = [
{'NO_SSL':'Dont run the dev server using HTTPS',
'DEV':'Run the server with development mode defaults'},
{'NO_RUN_SERVER':'Dont run the dev server',
'HOME':'Run along home now!'},
{'XXXXXX':'This is XXXXXX string',
'YYYY_PPPP':'This is YYYY_PPPP string'},
{'FFFFFFFFFFFF':'This is FFFFFFFFFFFF string',
'ZZZ':'This is ZZZ string'}];
var expectedTranslationJsonFile = __dirname + '/data/reference/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
i18n.getAllRegisteredPluginsLanguageTranslations(language, function (err, actualTranslationJson) {
i18n.getRegisteredLanguageTranslations(language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
actualTranslationJson = actualTranslationJson.sort(compareLists);
expectedTranslationJson = expectedTranslationJson.sort(compareLists);
if (JSON.stringify(actualTranslationJson) !== JSON.stringify(expectedTranslationJson)) {
if (!compareTranslations(actualTranslationJson, expectedTranslationJson)) {
result = false;
}
}
@ -254,24 +206,44 @@ describe('Test registering and retrieving all translations for test_plugin_1 and
});
});
it('Common supported plugin languages for test_plugin_1 and test_plugin_2' , function (done) {
it('DE translations are registered' , function (done) {
var result = true;
var expectedCommonLanguages = ['en'];
var language = 'de';
var expectedTranslationJsonFile = __dirname + '/data/reference/' + language + '.json';
var expectedTranslationJson = require(expectedTranslationJsonFile);
i18n.getAllRegisteredPluginsCommonSupportedLanguages(function (err, actualCommonLanguages) {
i18n.getRegisteredLanguageTranslations(language, function (err, actualTranslationJson) {
if (err) {
console.log(err);
result = false;
} else {
if (!compareTranslations(actualTranslationJson, expectedTranslationJson)) {
result = false;
}
}
expect(result).to.be(true);
done();
});
});
it('Translation languages are registered', function (done) {
var expectedLanguages = ['en', 'de'];
var result = true;
i18n.getRegisteredTranslationLanguages(function (err, actualLanguages) {
if (err) {
console.log(err);
result = false;
}
if (actualCommonLanguages.length !== expectedCommonLanguages.length) {
if (actualLanguages.length !== expectedLanguages.length) {
result = false;
} else {
var index = actualCommonLanguages.length;
actualCommonLanguages.sort();
expectedCommonLanguages.sort();
var index = actualLanguages.length;
actualLanguages.sort();
expectedLanguages.sort();
while (index--) {
if (actualCommonLanguages[index] !== expectedCommonLanguages[index]) {
if (actualLanguages[index] !== expectedLanguages[index]) {
result = false;
break;
}
@ -283,10 +255,8 @@ describe('Test registering and retrieving all translations for test_plugin_1 and
});
after(function (done) {
var translationPluginStorePath = i18n.getRegisteredPluginStoragePath('test_plugin_1');
process.execSync('rm -rf ' + translationPluginStorePath);
translationPluginStorePath = i18n.getRegisteredPluginStoragePath('test_plugin_2');
process.execSync('rm -rf ' + translationPluginStorePath);
var translationStorePath = i18n.getTranslationStoragePath();
process.execSync('rm -rf ' + translationStorePath);
done();
});
});
@ -309,12 +279,19 @@ function getPluginTranslationFiles(pluginName, pluginTranslationPath, cb) {
});
}
function compareLists(a, b) {
if (Object.keys(a)[0] > Object.keys(b)[0]) {
return 1;
function compareTranslations(actual, expected) {
var equal = true;
for (var key in expected) {
if (!actual.hasOwnProperty(key)) {
equal = false;
break;
}
if (actual[key] !== expected[key]) {
equal = false;
break;
}
}
if (Object.keys(a)[0] < Object.keys(b)[0]) {
return -1;
}
return 0;
return equal;
}

View file

@ -1,6 +0,0 @@
[
{
"NO_SSL": "Dont run the DE dev server using HTTPS",
"DEV": "Run the DE server with development mode defaults"
}
]

View file

@ -1,6 +0,0 @@
[
{
"NO_SSL": "Dont run the dev server using HTTPS",
"DEV": "Run the server with development mode defaults"
}
]

View file

@ -1,6 +0,0 @@
[
{
"NO_RUN_SERVER": "Dont run the dev server",
"HOME": "Run along home now!"
}
]

View file

@ -1,6 +0,0 @@
[
{
"XXXXXX": "This is XXXXXX string",
"YYYY_PPPP": "This is YYYY_PPPP string"
}
]

View file

@ -1,6 +0,0 @@
[
{
"FFFFFFFFFFFF": "This is FFFFFFFFFFFF string",
"ZZZ": "This is ZZZ string"
}
]