Add HAPI API to get all plugins translation files

This commit is contained in:
Martin Hickey 2016-06-30 17:08:28 +01:00
parent 66d051bed3
commit c3403e7530
6 changed files with 135 additions and 15 deletions

View file

@ -121,6 +121,49 @@ var getAllRegisteredPluginsLanguageTranslations = function (language, callback)
});
};
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) {
var jsonToWrite = [];
if (fs.existsSync(translationFullFileName)) {
@ -199,3 +242,4 @@ module.exports.getAllRegisteredPluginsLanguageTranslations = getAllRegisteredPlu
module.exports.getPluginTranslationDetails = getPluginTranslationDetails;
module.exports.getRegisteredPluginStoragePath = getRegisteredPluginStoragePath;
module.exports.getRegisteredPluginLanguages = getRegisteredPluginLanguages;
module.exports.getAllRegisteredPluginsCommonSupportedLanguages = getAllRegisteredPluginsCommonSupportedLanguages;

View file

@ -8,14 +8,13 @@ const DEFAULT_LANGUAGE = 'en';
export default function (server) {
server.route({
path: '/api/i18n/translations/{plugin}',
path: '/api/i18n/translations',
method: 'GET',
handler(req, reply) {
var pluginName = req.params.plugin;
var acceptLanguage = req.headers['accept-language'];
var languages = langParser.parse(acceptLanguage);
getPluginLanguageTranslations(pluginName, languages, function (err, translations) {
getAllPluginsLanguageTranslations(languages, function (err, translations) {
if (err) {
reply(Boom.internal(err));
return;
@ -27,27 +26,29 @@ export default function (server) {
};
function getPluginLanguageTranslations(pluginName, acceptLanguages, cb) {
function getAllPluginsLanguageTranslations(acceptLanguages, cb) {
getPluginSupportedLanguage(pluginName, acceptLanguages, function (err, language) {
getAllPluginsSupportedLanguage(acceptLanguages, function (err, language) {
if (err) {
return cb (err);
return cb(err);
}
i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, translationJson) {
i18n.getAllRegisteredPluginsLanguageTranslations(language, function (err, translationsJson) {
if (err) {
return cb (err);
return cb(err);
} else {
return cb (null, translationJson);
return cb(null, translationsJson);
}
});
});
}
function getPluginSupportedLanguage(pluginName, acceptLanguages, cb) {
i18n.getRegisteredPluginLanguages(pluginName, function (err, languages) {
function getAllPluginsSupportedLanguage(acceptLanguages, cb) {
var langStr = DEFAULT_LANGUAGE;
i18n.getAllRegisteredPluginsCommonSupportedLanguages(function (err, pluginCommonLanguages) {
if (err) {
return cb (err);
return cb(err);
}
var foundLang = false;
@ -58,7 +59,7 @@ function getPluginSupportedLanguage(pluginName, acceptLanguages, cb) {
} else {
langStr = language.code;
}
if (languages.indexOf(langStr) > -1) {
if (pluginCommonLanguages.indexOf(langStr) > -1) {
foundLang = true;
return true;
} else {
@ -71,7 +72,7 @@ function getPluginSupportedLanguage(pluginName, acceptLanguages, cb) {
acceptLanguages.some(function partialMatch(language) {
langStr = language.code;
languages.some(function (lang) {
pluginCommonLanguages.some(function (lang) {
if (lang.match('^' + langStr)) {
langStr = lang;
foundLang = true;
@ -93,5 +94,4 @@ function getPluginSupportedLanguage(pluginName, acceptLanguages, cb) {
return cb (null, DEFAULT_LANGUAGE);
});
}

View file

@ -254,6 +254,34 @@ 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) {
var result = true;
var expectedCommonLanguages = ['en'];
i18n.getAllRegisteredPluginsCommonSupportedLanguages(function (err, actualCommonLanguages) {
if (err) {
console.log(err);
result = false;
}
if (actualCommonLanguages.length !== expectedCommonLanguages.length) {
result = false;
} else {
var index = actualCommonLanguages.length;
actualCommonLanguages.sort();
expectedCommonLanguages.sort();
while (index--) {
if (actualCommonLanguages[index] !== expectedCommonLanguages[index]) {
result = false;
break;
}
}
}
expect(result).to.be(true);
done();
});
});
after(function (done) {
var translationPluginStorePath = i18n.getRegisteredPluginStoragePath('test_plugin_1');
process.execSync('rm -rf ' + translationPluginStorePath);

View file

@ -3,6 +3,7 @@ define({
'test/unit/api/ingest/index',
'test/unit/api/search/index',
'test/unit/api/scripts/index'
'test/unit/api/i18n/index'
],
excludeInstrumentation: /(fixtures|node_modules)\//,
loaderOptions: {

View file

@ -0,0 +1,21 @@
define(function (require) {
var Promise = require('bluebird');
var expect = require('intern/dojo/node!expect.js');
return function (bdd, scenarioManager, request) {
bdd.describe('GET translations', function postIngest() {
bdd.beforeEach(function () {
return scenarioManager.reload('emptyKibana');
});
bdd.it('should return 200 for an valid payload', function validPayload() {
return Promise.all([
request.get('/i18n/translations').expect(200),
]);
});
//TODO (hickeyma): Extend test cases once I have refactored the module and hapi APIs after feedback on removeing plugin namd and language from API
});
};
});

View file

@ -0,0 +1,26 @@
define(function (require) {
var bdd = require('intern!bdd');
var serverConfig = require('intern/dojo/node!../../../server_config');
var ScenarioManager = require('intern/dojo/node!../../../fixtures/scenario_manager');
var request = require('intern/dojo/node!supertest-as-promised');
var url = require('intern/dojo/node!url');
var _ = require('intern/dojo/node!lodash');
var expect = require('intern/dojo/node!expect.js');
var get = require('./_get');
bdd.describe('i18n API', function () {
var scenarioManager = new ScenarioManager(url.format(serverConfig.servers.elasticsearch));
request = request(url.format(serverConfig.servers.kibana) + '/api');
console.log('i18n bdd request: ', request);
bdd.before(function () {
return scenarioManager.load('emptyKibana');
});
bdd.after(function () {
return scenarioManager.unload('emptyKibana');
});
get(bdd, scenarioManager, request);
});
});