var _ = require('lodash'); var path = require('path'); var fs = require('fs'); var i18n = require('i18n'); var I18N_PATH = path.resolve(__dirname, '../../theme/i18n/'); var DEFAULT_LANGUAGE = 'en'; var LOCALES = _.map(fs.readdirSync(I18N_PATH), function(lang) { return path.basename(lang, '.json'); }); i18n.configure({ locales: LOCALES, directory: I18N_PATH, defaultLocale: DEFAULT_LANGUAGE, updateFiles: false }); function compareLocales(lang, locale) { var langMain = _.first(lang.split('-')); var langSecond = _.last(lang.split('-')); var localeMain = _.first(locale.split('-')); var localeSecond = _.last(locale.split('-')); if (locale == lang) return 100; if (localeMain == langMain) return 50; if (localeSecond == langSecond) return 20; return 0; } var normalizeLanguage = _.memoize(function(lang) { var language = _.chain(LOCALES) .values() .map(function(locale) { return { locale: locale, score: compareLocales(lang, locale) }; }) .filter(function(lang) { return lang.score > 0; }) .sortBy('score') .pluck('locale') .last() .value(); return language || lang; }); function translate(locale, phrase) { var args = Array.prototype.slice.call(arguments, 2); return i18n.__.apply({}, [{ locale: locale, phrase: phrase }].concat(args)); } function getCatalog(locale) { locale = normalizeLanguage(locale); return i18n.getCatalog(locale); } function getLocales() { return LOCALES; } function hasLocale(locale) { return _.contains(LOCALES, locale); } module.exports = { __: translate, normalizeLanguage: normalizeLanguage, getCatalog: getCatalog, getLocales: getLocales, hasLocale: hasLocale };