summaryrefslogtreecommitdiffstats
path: root/lib/utils
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/utils
parent1337858fe6ade3b7c9aca6c6d81fa450d689248f (diff)
downloadgitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.zip
gitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.tar.gz
gitbook-b318f2fe94bb8663b4b5d3ef5a02c7efd21884ff.tar.bz2
Improve i18n to support locale normalization
Diffstat (limited to 'lib/utils')
-rw-r--r--lib/utils/i18n.js63
1 files changed, 63 insertions, 0 deletions
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
+};