-
Notifications
You must be signed in to change notification settings - Fork 18
/
i18n.js
118 lines (99 loc) · 2.4 KB
/
i18n.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
just-i18n package for Meteor.js
author: Hubert OG <[email protected]>
*/
var maps = {};
var language = '';
var defaultLanguage = 'en';
var missingTemplate = '';
var showMissing = false;
var dep = new Deps.Dependency();
/*
Convert key to internationalized version
*/
i18n = function() {
dep.depend();
var label;
var args = _.toArray(arguments);
/* remove extra parameter added by blaze */
if(typeof args[args.length-1] === 'object') {
args.pop();
}
var label = args[0];
args.shift();
if(typeof label !== 'string') return '';
var str = (maps[language] && maps[language][label]) ||
(maps[defaultLanguage] && maps[defaultLanguage][label]) ||
(showMissing && _.template(missingTemplate, {language: language, defaultLanguage: defaultLanguage, label: label})) ||
'';
str = replaceWithParams(str, args)
return str;
};
/*
Register handlebars helper
*/
if(Meteor.isClient) {
if(UI) {
UI.registerHelper('i18n', function () {
return i18n.apply(this, arguments);
});
} else if(Handlebars) {
Handlebars.registerHelper('i18n', function () {
return i18n.apply(this, arguments);
});
}
}
function replaceWithParams(string, params) {
var formatted = string;
params.forEach(function(param , index){
var pos = index + 1;
formatted = formatted.replace("{$" + pos + "}", param);
});
return formatted;
};
/*
Settings
*/
i18n.setLanguage = function(lng) {
language = lng;
dep.changed();
};
i18n.setDefaultLanguage = function(lng) {
defaultLanguage = lng;
dep.changed();
};
i18n.getLanguage = function() {
dep.depend();
return language;
};
i18n.showMissing = function(template) {
if(template) {
if(typeof template === 'string') {
missingTemplate = template;
} else {
missingTemplate = '[<%= label %>]';
}
showMissing = true;
} else {
missingTemplate = '';
showMissing = false;
}
};
/*
Register map
*/
i18n.map = function(language, map) {
if(!maps[language]) maps[language] = {};
registerMap(language, '', false, map);
dep.changed();
};
var registerMap = function(language, prefix, dot, map) {
if(typeof map === 'string') {
maps[language][prefix] = map;
} else if(typeof map === 'object') {
if(dot) prefix = prefix + '.';
_.each(map, function(value, key) {
registerMap(language, prefix + key, true, value);
});
}
};