Improve i18n to support locale normalization

This commit is contained in:
Samy Pessé
2015-02-09 11:08:46 +01:00
parent 1337858fe6
commit b318f2fe94
4 changed files with 71 additions and 14 deletions
+2 -1
View File
@@ -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);
};
+6 -13
View File
@@ -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"
}));
});
+63
View File
@@ -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
};