From 25b701de177e76124a20311b3edf7c9ce693ac1c Mon Sep 17 00:00:00 2001 From: jysperm Date: Fri, 3 Oct 2014 00:20:07 +0800 Subject: [PATCH] i18n translator --- core/i18n.coffee | 70 ++++++++++++++++++++------- core/static/script/panel.coffee | 5 +- core/static/script/ticket/view.coffee | 4 +- package.json | 2 +- 4 files changed, 59 insertions(+), 22 deletions(-) diff --git a/core/i18n.coffee b/core/i18n.coffee index 1db5462..516983b 100644 --- a/core/i18n.coffee +++ b/core/i18n.coffee @@ -2,15 +2,12 @@ path = require 'path' fs = require 'fs' _ = require 'underscore' -acceptLanguage = require 'accept-language' stringify = require 'json-stable-stringify' utils = require './utils' cache = require './cache' config = require '../config' -acceptLanguage.default config.i18n.default_language.replace('_', '-') - i18n_data = {} for lang in config.i18n.available_language @@ -23,29 +20,68 @@ exports.loadForPlugin = (plugin) -> if fs.existsSync path i18n_data[lang]['plugins'][plugin.name] = require lang -exports.translate = (name, lang) -> - unless lang - lang = config.i18n.default_language +exports.parseLanguageCode = parseLanguageCode = (language) -> + [lang, country] = language.replace('-', '_').split '_' + return { + language: language + lang: lang.toLowerCase() + country: country.toUpperCase() + } + +exports.calcLanguagePriority = (req) -> + negotiator = new Negotiator req + language_info = parseLanguageCode req.cookies.language + + result = _.filter config.i18n.available_language, (i) -> + return i.language == language_info.language + + result = _.union result, _.filter config.i18n.available_language, (i) -> + return parseLanguageCode(i).lang == language_info.lang + + result = _.union result, _.filter config.i18n.available_language, (i) -> + return parseLanguageCode(i).lang in negotiator.languages() + + result.push config.i18n.default_language + + result = _.union result, config.i18n.available_language + + return result + +exports.translateByLanguage = (name, language) -> keys = name.split '.' - keys.unshift lang + keys.unshift language result = i18n_data for item in keys - unless result[item] == undefined + if result[item] == undefined + return undefined + else result = result[item] - if result == undefined and lang != config.i18n.default_language - return exports.translate name, config.i18n.default_language - else if _.isObject result - return name - else - return result + return result -exports.getTranslator = (lang) -> - return (name) -> - return exports.translate name, lang +exports.translate = (name, req) -> + priority_order = exports.calcLanguagePriority req + + for language in priority_order + result = exports.translateByLanguage name, language + + if result != undefined + return result + + return name + +exports.getTranslator = (req) -> + return (name, payload) -> + result = exports.translate name, req + + if _.isObject payload + for k, v of payload + result = result.replace new RegExp("__#{k}__", 'g'), v + + return result exports.initI18nData = (req, res, next) -> timezone_mapping = diff --git a/core/static/script/panel.coffee b/core/static/script/panel.coffee index f38ef81..d9a0263 100644 --- a/core/static/script/panel.coffee +++ b/core/static/script/panel.coffee @@ -1,5 +1,6 @@ $ -> $('#service-switch button').click -> + # TODO: refactor is_enable = if $(@).hasClass 'btn-success' then true else false $.post "/plugin/#{$(@).data('name')}/switch/", JSON.stringify enable: is_enable @@ -15,11 +16,11 @@ $ -> if window.confirm 'Are you sure?' request '/billing/leave_plan/', plan: $(@).parents('tr').data 'name' - , (result) -> + , -> location.reload() $('.action-join-plan').click -> request '/billing/join_plan/', plan: $(@).parents('tr').data 'name' - , (result) -> + , -> location.reload() diff --git a/core/static/script/ticket/view.coffee b/core/static/script/ticket/view.coffee index 5536eda..9322071 100644 --- a/core/static/script/ticket/view.coffee +++ b/core/static/script/ticket/view.coffee @@ -5,12 +5,12 @@ $ -> request '/ticket/reply/', id: id content: $('.input-content').val() - , (result) -> + , -> location.reload() $('.action-update-status').click -> request '/ticket/update_status/', id: id status: $(@).data 'status' - , (result) -> + , -> location.reload() diff --git a/package.json b/package.json index 41569c1..e1fbbab 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "rp-clean": "./bin/rp-clean.coffee" }, "dependencies": { - "accept-language": "^1.2.0", + "negotiator": "^0.4.8", "async": "^0.9.0", "coffee-script": "^1.7.1", "connect": "^2.17.3",