-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
/
LocaleStore.js
124 lines (105 loc) · 2.8 KB
/
LocaleStore.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
"use strict";
var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var util = require('../util');
var EventEmitter = require('events').EventEmitter;
var ActionTypes = AppConstants.ActionTypes;
var DEFAULT_LOCALE = 'en_US';
// resolve the messy mapping between browser language
// and our supported locales
var langLocaleMap = {
en: 'en_US',
zh: 'zh_CN',
ja: 'ja',
ko: 'ko',
es: 'es_AR',
fr: 'fr_FR',
de: 'de_DE',
pt: 'pt_BR',
ru: 'ru_RU',
uk: 'uk',
vi: 'vi',
sl: 'sl_SI',
pl: 'pl',
it: 'it_IT',
ta: 'ta_IN'
};
var headerLocaleMap = {
'zh-CN': 'zh_CN',
'zh-TW': 'zh_TW',
'pt-BR': 'pt_BR',
'es-MX': 'es_MX',
'es-ES': 'es_ES',
'it-IT': 'it_IT',
'sl-SI': 'sl_SI'
};
var supportedLocalesList = Object.values(langLocaleMap)
.concat(Object.values(headerLocaleMap))
.filter(function (value, index, self) { return self.indexOf(value) === index;});
function _getLocaleFromHeader(langString) {
var languages = langString.split(',');
var desiredLocale;
for (var i = 0; i < languages.length; i++) {
var header = languages[i].split(';')[0];
// first check the full string raw
if (headerLocaleMap[header]) {
desiredLocale = headerLocaleMap[header];
break;
}
var lang = header.slice(0, 2);
if (langLocaleMap[lang]) {
desiredLocale = langLocaleMap[lang];
break;
}
}
return desiredLocale;
}
var _locale = DEFAULT_LOCALE;
var LocaleStore = Object.assign(
{},
EventEmitter.prototype,
AppConstants.StoreSubscribePrototype,
{
getDefaultLocale: function() {
return DEFAULT_LOCALE;
},
getLangLocaleMap: function() {
return Object.assign({}, langLocaleMap);
},
getHeaderLocaleMap: function() {
return Object.assign({}, headerLocaleMap);
},
getLocale: function() {
return _locale;
},
getSupportedLocales: function() {
return supportedLocalesList.slice();
},
dispatchToken: AppDispatcher.register(function(payload) {
var action = payload.action;
var shouldInform = false;
var oldLocale = _locale;
switch (action.type) {
case ActionTypes.CHANGE_LOCALE:
_locale = action.locale;
shouldInform = true;
break;
case ActionTypes.CHANGE_LOCALE_FROM_HEADER:
var value = _getLocaleFromHeader(action.header);
if (value) {
_locale = value;
shouldInform = true;
}
break;
}
if (util.isBrowser() && oldLocale !== _locale) {
var url = new URL(document.location.href);
url.searchParams.set('locale', _locale);
window.history.replaceState({}, '', url.href);
}
if (shouldInform) {
LocaleStore.emit(AppConstants.CHANGE_EVENT);
}
})
});
module.exports = LocaleStore;