diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/configuration.js | 3 | ||||
-rw-r--r-- | lib/generators/website.js | 19 | ||||
-rw-r--r-- | lib/utils/i18n.js | 63 |
3 files changed, 71 insertions, 14 deletions
diff --git a/lib/configuration.js b/lib/configuration.js index f60dc83..bedf266 100644 --- a/lib/configuration.js +++ b/lib/configuration.js @@ -5,6 +5,7 @@ var semver = require('semver'); var pkg = require('../package.json'); var fs = require("./utils/fs"); +var i18n = require("./utils/i18n"); // Default plugins added to each books var defaultsPlugins = []; @@ -124,7 +125,7 @@ Configuration.prototype.getStructure = function(name) { // Return normalized language Configuration.prototype.normalizeLanguage = function() { - return _.first(this.options.language.split("-")).toLowerCase(); + return i18n.normalizeLanguage(this.options.language); }; diff --git a/lib/generators/website.js b/lib/generators/website.js index bedf1af..01df98c 100644 --- a/lib/generators/website.js +++ b/lib/generators/website.js @@ -12,6 +12,7 @@ var fs = require("../utils/fs"); var BaseGenerator = require("../generator"); var links = require("../utils/links"); var pageUtil = require("../utils/page"); +var i18n = require("../utils/i18n"); var pkg = require("../../package.json"); @@ -74,20 +75,12 @@ Generator.prototype.prepareTemplates = function() { Generator.prototype.prepareTemplateEngine = function() { var that = this; - return fs.readdir(path.resolve(__dirname, "../../theme/i18n")) - .then(function(locales) { + return Q() + .then(function() { var language = that.book.config.normalizeLanguage(); - locales = _.chain(locales) - .map(function(local) { - local = path.basename(local, ".json"); - return [local, require("../../theme/i18n/"+local)]; - }) - .object() - .value(); - - if (!_.contains(_.keys(locales), language) && language != "en") { - that.book.log.warn.ln("Language '"+language+"' is not available as a layout locales (en, "+_.keys(locales).join(", ")+")"); + if (!i18n.getByLanguage(language) && language != "en") { + that.book.log.warn.ln("Language '"+language+"' is not available as a layout locales (en, "+i18n.getLanguages().join(", ")+")"); } var folders = _.chain(that.templates) @@ -114,7 +107,7 @@ Generator.prototype.prepareTemplateEngine = function() { that.env.addExtension('FilterExtension', new FilterExtension(that.env)); that.env.addExtension('I18nExtension', new I18nExtension({ env: that.env, - translations: locales, + translations: i18n.getLocales(), locale: "language" })); }); diff --git a/lib/utils/i18n.js b/lib/utils/i18n.js new file mode 100644 index 0000000..3ef1557 --- /dev/null +++ b/lib/utils/i18n.js @@ -0,0 +1,63 @@ +var _ = require("lodash"); +var path = require("path"); +var fs = require("fs"); + +var I18N_PATH = path.resolve(__dirname, "../../theme/i18n/") + +var getLocales = _.memoize(function() { + var locales = fs.readdirSync(I18N_PATH); + return _.chain(locales) + .map(function(local) { + local = path.basename(local, ".json"); + return [local, _.extend(require(path.join(I18N_PATH, local)), { + id: local + })]; + }) + .object() + .value(); +}); + +var getLanguages = function() { + return _.keys(getLocales()); +}; + +var getByLanguage = function(lang) { + lang = normalizeLanguage(lang); + var locales = getLocales(); + return locales[lang]; +}; + +var compareLocales = function(lang, locale) { + var langMain = _.first(lang.split("-")); + var localeMain = _.first(locale.split("-")); + + if (locale == lang) return 100; + if (localeMain == langMain) return 50; + return 0; +}; + +var normalizeLanguage = _.memoize(function(lang) { + var locales = getLocales(); + var language = _.chain(locales) + .values() + .map(function(locale) { + locale = locale.id; + + return { + locale: locale, + score: compareLocales(lang, locale) + } + }) + .sortBy("score") + .pluck("locale") + .last() + .value(); + return language || lang; +}); + +module.exports = { + getLocales: getLocales, + getLanguages: getLanguages, + getByLanguage: getByLanguage, + normalizeLanguage: normalizeLanguage +}; |