diff --git a/src/cloudron.js b/src/cloudron.js index 9513b5f69..5f2fc22d9 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -5,6 +5,7 @@ exports = module.exports = { uninitialize, getConfig, getLogs, + getLanguages, reboot, isRebootRequired, @@ -279,6 +280,12 @@ function getLogs(unit, options, callback) { return callback(null, transformStream); } +function getLanguages(callback) { + assert.strictEqual(typeof callback, 'function'); + + callback(null, ['en', 'de', 'fr', 'it']); +} + function prepareDashboardDomain(domain, auditSource, callback) { assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof auditSource, 'object'); diff --git a/src/routes/cloudron.js b/src/routes/cloudron.js index 6867e550f..02b097d87 100644 --- a/src/routes/cloudron.js +++ b/src/routes/cloudron.js @@ -20,6 +20,7 @@ exports = module.exports = { prepareDashboardDomain, renewCerts, getServerIp, + getLanguages, syncExternalLdap }; @@ -313,3 +314,11 @@ function getServerIp(req, res, next) { next(new HttpSuccess(200, { ip })); }); } + +function getLanguages(req, res, next) { + cloudron.getLanguages(function (error, languages) { + if (error) return next(new BoxError.toHttpError(error)); + + next(new HttpSuccess(200, { languages })); + }); +} diff --git a/src/routes/test/cloudron-test.js b/src/routes/test/cloudron-test.js index 38784475a..f7e5a98ef 100644 --- a/src/routes/test/cloudron-test.js +++ b/src/routes/test/cloudron-test.js @@ -558,5 +558,17 @@ describe('Cloudron API', function () { }); }); }); + + describe('languages', function () { + it('succeeds', function (done) { + superagent.get(SERVER_URL + '/api/v1/cloudron/languages') + .end(function (error, result) { + expect(result.statusCode).to.equal(200); + expect(result.body.languages).to.be.an('array'); + expect(result.body.languages.indexOf('en')).to.not.equal(-1); + done(); + }); + }); + }); }); }); diff --git a/src/server.js b/src/server.js index b39e9174e..1959dec40 100644 --- a/src/server.js +++ b/src/server.js @@ -90,6 +90,7 @@ function initializeExpressSync() { router.post('/api/v1/cloudron/restore', json, routes.provision.restore); // only available until activated router.post('/api/v1/cloudron/activate', json, routes.provision.activate); router.get ('/api/v1/cloudron/status', routes.provision.getStatus); + router.get ('/api/v1/cloudron/languages', routes.cloudron.getLanguages); router.get ('/api/v1/cloudron/avatar', routes.branding.getCloudronAvatar); // this is a public alias for /api/v1/branding/cloudron_avatar // login/logout routes diff --git a/src/settings.js b/src/settings.js index acfcee9d2..1ebaa1497 100644 --- a/src/settings.js +++ b/src/settings.js @@ -123,6 +123,7 @@ var addons = require('./addons.js'), assert = require('assert'), backups = require('./backups.js'), BoxError = require('./boxerror.js'), + cloudron = require('./cloudron.js'), constants = require('./constants.js'), cron = require('./cron.js'), CronJob = require('cron').CronJob, @@ -202,9 +203,6 @@ let gDefaults = (function () { let gCache = {}; -// Keep in sync with dashboard -const gSupportedLanguages = ['en', 'de', 'fr', 'it']; - function notifyChange(key, value) { assert.strictEqual(typeof key, 'string'); // value is a variant @@ -672,14 +670,18 @@ function setLanguage(language, callback) { assert.strictEqual(typeof language, 'string'); assert.strictEqual(typeof callback, 'function'); - if (gSupportedLanguages.indexOf(language) === -1) return callback(new BoxError(BoxError.NOT_FOUND)); - - settingsdb.set(exports.LANGUAGE_KEY, language, function (error) { + cloudron.getLanguages(function (error, languages) { if (error) return callback(error); - notifyChange(exports.LANGUAGE_KEY, language); + if (languages.indexOf(language) === -1) return callback(new BoxError(BoxError.NOT_FOUND)); - callback(null); + settingsdb.set(exports.LANGUAGE_KEY, language, function (error) { + if (error) return callback(error); + + notifyChange(exports.LANGUAGE_KEY, language); + + callback(null); + }); }); }