-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
161 lines (147 loc) · 3.88 KB
/
index.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
var IntlMessageFormat = require("intl-messageformat").default;
function create() {
var namespaces = {
_defaults: {},
_all: {},
};
var formaters = {};
/**
* @param {Object} object
* @param {string} prop
*/
function get(object, prop) {
if (object && object.hasOwnProperty(prop)) {
return object[prop];
}
}
function getTemplate(messages, locale, message) {
var template = get(messages, message);
if (template) return template;
if (namespaces._all[locale]) {
template = get(namespaces._all[locale], message);
}
return template;
}
/**
* translate message
* @param {string} locale
* @param {string|string[]} message
* @param {string} [namespace]
* @param {Object} [values]
* @param {Object} [formats]
*/
function _t(locale, message, namespace, values, formats) {
if (namespace && typeof namespace === "object") {
// 没有设置 namespace 但设置了 values
formats = values;
values = namespace;
namespace = "";
}
var locales = namespaces[namespace] || namespaces._all;
if (!locale) {
if (Array.isArray(message)) {
return message[message.length - 1];
}
return message;
}
var messages = get(locales, locale) || get(namespaces._all, locale);
var template;
if (Array.isArray(message)) {
var msg;
for (var i in message) {
msg = message[i];
template = getTemplate(messages, locale, msg);
if (template) break;
}
if (!template) return msg;
} else {
template = getTemplate(messages, locale, message);
if (!template) return message;
}
if (!values) return template;
var formater = get(formaters, template);
if (!formater) {
formater = new IntlMessageFormat(template, locale, formats);
formaters[template] = formater;
}
return formater.format(values);
}
/**
* translate message
* @param {string|string[]} message
* @param {string} [namespace]
* @param {Object} [values]
* @param {Object} [formats]
*/
function t(message, namespace, values, formats) {
var locale = t.getLocale();
return _t(locale, message, namespace, values, formats);
}
function setNamespace(langs, namespace, isDefault) {
for (var locale in langs) {
if (!namespaces[namespace]) {
namespaces[namespace] = {};
}
if (!namespaces[namespace][locale]) {
namespaces[namespace][locale] = {};
}
if (!namespaces._defaults[locale]) {
namespaces._defaults[locale] = {};
}
var messages = namespaces[namespace][locale];
var defaultMessages = namespaces._defaults[locale];
var lang = langs[locale];
for (var key in lang) {
if (isDefault) {
defaultMessages[key] = lang[key];
} else if (
defaultMessages.hasOwnProperty(key) &&
messages.hasOwnProperty(key)
) {
continue;
}
messages[key] = lang[key];
}
}
}
/**
* learn (set) languages
* @param {Object} langs languages group
* @param {string} [namespace] namespace name
*/
t.learn = function (langs, namespace) {
setNamespace(langs, "_all", !namespace);
if (namespace) {
setNamespace(langs, namespace, false);
}
};
/**
* Set current locale
* @param {string} locale locale name
*/
t.setLocale = function (locale) {
t._locale = locale;
};
/**
* Get current locale
* @returns {string}
*/
t.getLocale = function () {
if (t._locale) return t._locale;
for (var locale in namespaces._all) {
return locale;
}
return "";
};
/**
* @param {string} locale
*/
t.locale = function (locale) {
return function (message, namespace, values, formats) {
return _t(locale, message, namespace, values, formats);
};
};
t.create = create;
return t;
}
module.exports = create();