Skip to content

Commit

Permalink
Add REST API for getting translations of a language for a plugin
Browse files Browse the repository at this point in the history
To be done:
 - Add algorithm to decide on the language for a plugin by comparing the accept languages
from the REST call and the plugin supported languages
 - Add REST API tests
  • Loading branch information
hickeyma committed Dec 13, 2016
1 parent b37e4f8 commit ec6d2b1
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 15 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
29 changes: 21 additions & 8 deletions src/plugins/i18n/server/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
53 changes: 51 additions & 2 deletions src/plugins/i18n/server/route.js
Original file line number Diff line number Diff line change
@@ -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);
});

}
40 changes: 35 additions & 5 deletions src/plugins/i18n/server/tests/i18n_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,23 +93,23 @@ 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';

it('Translation plugin bundle for English' , function (done) {
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;
} else {
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;
Expand All @@ -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();
});
Expand Down

0 comments on commit ec6d2b1

Please sign in to comment.