summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-02-09 11:08:46 +0100
committerSamy Pessé <samypesse@gmail.com>2015-02-09 11:08:46 +0100
commitb318f2fe94bb8663b4b5d3ef5a02c7efd21884ff (patch)
tree6bddc8679d8202ff2762b68210112b36f0cb466d /lib
parent1337858fe6ade3b7c9aca6c6d81fa450d689248f (diff)
downloadgitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.zip
gitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.tar.gz
gitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.tar.bz2
Improve i18n to support locale normalization
Diffstat (limited to 'lib')
-rw-r--r--lib/configuration.js3
-rw-r--r--lib/generators/website.js19
-rw-r--r--lib/utils/i18n.js63
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
+};