Files
cloudron-box/src/translation.js
2020-11-21 18:32:38 -08:00

93 lines
2.8 KiB
JavaScript

'use strict';
exports = module.exports = {
translate,
getTranslations,
getLanguages
};
var assert = require('assert'),
debug = require('debug')('box:translation'),
fs = require('fs'),
path = require('path'),
paths = require('./paths.js'),
settings = require('./settings.js');
const TRANSLATION_FOLDER = path.join(paths.DASHBOARD_DIR, 'translation');
// to be used together with getTranslations() => { translations, fallback }
function translate(input, translations, fallbackTranslations) {
assert.strictEqual(typeof input, 'string');
assert.strictEqual(typeof translations, 'object');
assert.strictEqual(typeof fallbackTranslations, 'object');
var tokens = input.match(/{{(.*?)}}/gm);
if (!tokens) return input;
var output = input;
tokens.forEach(function (token) {
var key = token.slice(2).slice(0, -2).trim();
var value = key.split('.').reduce(function (acc, cur) {
if (acc === null) return null;
return typeof acc[cur] !== 'undefined' ? acc[cur] : null;
}, translations);
// try fallback
if (value === null) value = key.split('.').reduce(function (acc, cur) {
if (acc === null) return null;
return typeof acc[cur] !== 'undefined' ? acc[cur] : null;
}, fallbackTranslations);
if (value === null) value = token;
output = output.replace(token, value);
});
return output;
}
function getTranslations(callback) {
assert.strictEqual(typeof callback, 'function');
var fallback = {};
try {
fallback = JSON.parse(fs.readFileSync(path.join(TRANSLATION_FOLDER, 'en.json'), 'utf8'));
} catch (e) {
debug('getTranslations: Fallback language en not found', e);
}
settings.getLanguage(function (error, lang) {
if (error) return callback(error);
var translations = {};
try {
translations = JSON.parse(fs.readFileSync(path.join(TRANSLATION_FOLDER, lang + '.json'), 'utf8'));
} catch (e) {
debug(`getTranslations: Requested language ${lang} not found`, e);
}
return callback(null, { translations, fallback });
});
}
function getLanguages(callback) {
assert.strictEqual(typeof callback, 'function');
// we always return english to avoid dashboard breakage
var languages = ['en'];
fs.readdir(TRANSLATION_FOLDER, function (error, result) {
if (error) {
debug('getLanguages: Failed to list translations', error);
return callback(null, languages);
}
var jsonFiles = result.filter(function (file) { return path.extname(file) === '.json'; });
languages = jsonFiles.map(function (file) { return path.basename(file, '.json'); });
debug('Languages found:', jsonFiles);
callback(null, languages);
});
}