diff --git a/package.json b/package.json index d4e0d209b3b203..c8986ab0f0e76c 100644 --- a/package.json +++ b/package.json @@ -169,6 +169,7 @@ }, "devDependencies": { "@elastic/eslint-config-kibana": "0.2.1", + "accept-language-parser": "1.1.2", "angular-mocks": "1.4.7", "auto-release-sinon": "1.0.3", "babel-eslint": "6.1.2", diff --git a/src/plugins/i18n/server/i18n.js b/src/plugins/i18n/server/i18n.js index 4bd72f931771fe..266824ee39618b 100644 --- a/src/plugins/i18n/server/i18n.js +++ b/src/plugins/i18n/server/i18n.js @@ -17,14 +17,26 @@ var getPluginTranslationDetails = function (pluginTranslationPath, translationFi return callback(null); }; -var getPluginTranslationStoragePath = function (pluginName) { +var getRegisteredPluginStoragePath = function (pluginName) { return TRANSLATION_STORE_PATH + '/' + pluginName; }; -var storePluginLanguageTranslations = function (pluginName, pluginTranslationPath, language, cb) { +var getRegisteredPluginLanguages = function (pluginName, cb) { var translationFiles = []; var languageList = []; - var translationStorePluginPath = module.exports.getPluginTranslationStoragePath(pluginName); + var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName); + try { + getTranslationDetailsFromDirectory(translationStorePluginPath, translationFiles, languageList); + } catch (err) { + return cb(err); + } + return cb(null, languageList); +}; + +var registerPluginLanguageTranslations = function (pluginName, pluginTranslationPath, language, cb) { + var translationFiles = []; + var languageList = []; + var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName); var translationstorePluginLanguageTranslationsFileName = language + '.' + TRANSLATION_FILE_EXTENSION; var translationFileName = language + '.' + TRANSLATION_FILE_EXTENSION; @@ -63,8 +75,8 @@ var storePluginLanguageTranslations = function (pluginName, pluginTranslationPat return cb(null); }; -var getPluginLanguageTranslation = function (pluginName, language, callback) { - var translationStorePluginPath = getPluginTranslationStoragePath(pluginName); +var getRegisteredPluginLanguageTranslations = function (pluginName, language, callback) { + var translationStorePluginPath = getRegisteredPluginStoragePath(pluginName); var translationFileName = language + '.' + TRANSLATION_FILE_EXTENSION; var translationFile = translationStorePluginPath + '/' + translationFileName; fs.readFile(translationFile, function (err, translationStr) { @@ -136,7 +148,8 @@ function getFileName(fullPath) { return fullPath.replace(/^.*[\\\/]/, ''); } -module.exports.storePluginLanguageTranslations = storePluginLanguageTranslations; -module.exports.getPluginLanguageTranslation = getPluginLanguageTranslation; +module.exports.registerPluginLanguageTranslations = registerPluginLanguageTranslations; +module.exports.getRegisteredPluginLanguageTranslations = getRegisteredPluginLanguageTranslations; module.exports.getPluginTranslationDetails = getPluginTranslationDetails; -module.exports.getPluginTranslationStoragePath = getPluginTranslationStoragePath; +module.exports.getRegisteredPluginStoragePath = getRegisteredPluginStoragePath; +module.exports.getRegisteredPluginLanguages = getRegisteredPluginLanguages; diff --git a/src/plugins/i18n/server/route.js b/src/plugins/i18n/server/route.js index 5960afa4198b1d..3f0cbd49eea80c 100644 --- a/src/plugins/i18n/server/route.js +++ b/src/plugins/i18n/server/route.js @@ -1,12 +1,61 @@ +import Boom from 'boom'; + +var i18n = require('./i18n'); +var langParser = require('accept-language-parser'); + +const DEFAULT_LANGUAGE = 'en'; + export default function (server) { server.route({ - path: '/api/i18n/default', + path: '/api/i18n/translations/{plugin}', method: 'GET', handler(req, reply) { - reply('Hello World!'); + var pluginName = req.params.plugin; + var acceptLanguage = req.headers['accept-language']; + var languages = langParser.parse(acceptLanguage); + + getPluginLanguageTranslations(pluginName, languages, function (err, translations) { + if (err) { + reply(Boom.internal(err)); + } + reply(translations); + }); } }); }; +function getPluginLanguageTranslations(pluginName, acceptLanguages, cb) { + + getPluginSupportedLanguage(pluginName, acceptLanguages, function (err, language) { + if (err) { + return cb (err); + } + + if (!language) { + language = DEFAULT_LANGUAGE; + } + + i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, translationJson) { + if (err) { + return cb (err); + } else { + return cb (null, translationJson); + } + }); + }); +} + +function getPluginSupportedLanguage(pluginName, acceptLanguages, cb) { + i18n.getRegisteredPluginLanguages(pluginName, function (err, languages) { + if (err) { + return cb (err); + } + + //TODO: Algorithm which returns a languages based on the accept languages + //from the client and languages supported by the plugin + return cb (null, null); + }); + +} diff --git a/src/plugins/i18n/server/tests/i18n_tests.js b/src/plugins/i18n/server/tests/i18n_tests.js index 3f6b4a35f39602..f0c1edc9ba0226 100644 --- a/src/plugins/i18n/server/tests/i18n_tests.js +++ b/src/plugins/i18n/server/tests/i18n_tests.js @@ -93,7 +93,7 @@ describe('Test plugin translations details for test_plugin_1', function () { }); }); -describe('Test storing translations for test_plugin_1', function () { +describe('Test registering translations for test_plugin_1', function () { var pluginName = 'test_plugin_1'; var pluginTranslationPath = __dirname + '/' + pluginName + '/translations'; @@ -101,7 +101,7 @@ describe('Test storing translations for test_plugin_1', function () { var result = true; var language = 'en'; - i18n.storePluginLanguageTranslations(pluginName, pluginTranslationPath, language, function (err) { + i18n.registerPluginLanguageTranslations(pluginName, pluginTranslationPath, language, function (err) { if (err) { console.log(err); result = false; @@ -109,7 +109,7 @@ describe('Test storing translations for test_plugin_1', function () { var expectedTranslationJsonFile = __dirname + '/data/reference/' + pluginName + '/' + language + '.json'; var expectedTranslationJson = require(expectedTranslationJsonFile); expectedTranslationJson = JSON.stringify(expectedTranslationJson); - i18n.getPluginLanguageTranslation(pluginName, language, function (err, actualTranslationJson) { + i18n.getRegisteredPluginLanguageTranslations(pluginName, language, function (err, actualTranslationJson) { if (err) { console.log(err); result = false; @@ -126,8 +126,38 @@ describe('Test storing translations for test_plugin_1', function () { }); }); - afterEach(function (done) { - var translationPluginStorePath = i18n.getPluginTranslationStoragePath('test_plugin_1'); + it('Languages are registered', function (done) { + var expectedLanguages = ['en']; + var result = true; + + i18n.getRegisteredPluginLanguages(pluginName, function (err, actualLanguages) { + if (err) { + console.log(err); + result = false; + } + + console.log('Expected langs: ' + expectedLanguages); + console.log('Actual langs: ' + actualLanguages); + 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(true); + done(); + }); + }); + + after(function (done) { + var translationPluginStorePath = i18n.getRegisteredPluginStoragePath('test_plugin_1'); process.execSync('rm -rf ' + translationPluginStorePath); done(); });