i18n translator

This commit is contained in:
jysperm
2014-10-03 00:20:07 +08:00
parent 7e2aa01956
commit 25b701de17
4 changed files with 59 additions and 22 deletions

View File

@@ -2,15 +2,12 @@ path = require 'path'
fs = require 'fs' fs = require 'fs'
_ = require 'underscore' _ = require 'underscore'
acceptLanguage = require 'accept-language'
stringify = require 'json-stable-stringify' stringify = require 'json-stable-stringify'
utils = require './utils' utils = require './utils'
cache = require './cache' cache = require './cache'
config = require '../config' config = require '../config'
acceptLanguage.default config.i18n.default_language.replace('_', '-')
i18n_data = {} i18n_data = {}
for lang in config.i18n.available_language for lang in config.i18n.available_language
@@ -23,29 +20,68 @@ exports.loadForPlugin = (plugin) ->
if fs.existsSync path if fs.existsSync path
i18n_data[lang]['plugins'][plugin.name] = require lang i18n_data[lang]['plugins'][plugin.name] = require lang
exports.translate = (name, lang) -> exports.parseLanguageCode = parseLanguageCode = (language) ->
unless lang [lang, country] = language.replace('-', '_').split '_'
lang = config.i18n.default_language
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 = name.split '.'
keys.unshift lang keys.unshift language
result = i18n_data result = i18n_data
for item in keys for item in keys
unless result[item] == undefined if result[item] == undefined
return undefined
else
result = result[item] result = result[item]
if result == undefined and lang != config.i18n.default_language return result
return exports.translate name, config.i18n.default_language
else if _.isObject result
return name
else
return result
exports.getTranslator = (lang) -> exports.translate = (name, req) ->
return (name) -> priority_order = exports.calcLanguagePriority req
return exports.translate name, lang
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) -> exports.initI18nData = (req, res, next) ->
timezone_mapping = timezone_mapping =

View File

@@ -1,5 +1,6 @@
$ -> $ ->
$('#service-switch button').click -> $('#service-switch button').click ->
# TODO: refactor
is_enable = if $(@).hasClass 'btn-success' then true else false is_enable = if $(@).hasClass 'btn-success' then true else false
$.post "/plugin/#{$(@).data('name')}/switch/", JSON.stringify $.post "/plugin/#{$(@).data('name')}/switch/", JSON.stringify
enable: is_enable enable: is_enable
@@ -15,11 +16,11 @@ $ ->
if window.confirm 'Are you sure?' if window.confirm 'Are you sure?'
request '/billing/leave_plan/', request '/billing/leave_plan/',
plan: $(@).parents('tr').data 'name' plan: $(@).parents('tr').data 'name'
, (result) -> , ->
location.reload() location.reload()
$('.action-join-plan').click -> $('.action-join-plan').click ->
request '/billing/join_plan/', request '/billing/join_plan/',
plan: $(@).parents('tr').data 'name' plan: $(@).parents('tr').data 'name'
, (result) -> , ->
location.reload() location.reload()

View File

@@ -5,12 +5,12 @@ $ ->
request '/ticket/reply/', request '/ticket/reply/',
id: id id: id
content: $('.input-content').val() content: $('.input-content').val()
, (result) -> , ->
location.reload() location.reload()
$('.action-update-status').click -> $('.action-update-status').click ->
request '/ticket/update_status/', request '/ticket/update_status/',
id: id id: id
status: $(@).data 'status' status: $(@).data 'status'
, (result) -> , ->
location.reload() location.reload()

View File

@@ -25,7 +25,7 @@
"rp-clean": "./bin/rp-clean.coffee" "rp-clean": "./bin/rp-clean.coffee"
}, },
"dependencies": { "dependencies": {
"accept-language": "^1.2.0", "negotiator": "^0.4.8",
"async": "^0.9.0", "async": "^0.9.0",
"coffee-script": "^1.7.1", "coffee-script": "^1.7.1",
"connect": "^2.17.3", "connect": "^2.17.3",