-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
I18n.ts
130 lines (112 loc) · 2.56 KB
/
I18n.ts
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
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { I18nOptions } from './types';
import { ConsoleLogger as Logger } from '../Logger';
const logger = new Logger('I18n');
/**
* Language transition class
*/
export class I18n {
/**
* @private
*/
_options: I18nOptions = null;
/**
* @private
*/
_lang = null;
/**
* @private
*/
_dict = {};
/**
* @constructor
* Initialize with configurations
* @param {Object} options
*/
constructor(options: I18nOptions) {
this._options = Object.assign({}, options);
this._lang = this._options.language;
if (
!this._lang &&
typeof window !== 'undefined' &&
window &&
window.navigator
) {
this._lang = window.navigator.language;
}
logger.debug(this._lang);
}
/**
* @method
* Explicitly setting language
* @param {String} lang
*/
setLanguage(lang: string) {
this._lang = lang;
}
/**
* @method
* Get value
* @param {String} key
* @param {String} defVal - Default value
*/
get(key, defVal = undefined) {
if (!this._lang) {
return typeof defVal !== 'undefined' ? defVal : key;
}
const lang = this._lang;
let val = this.getByLanguage(key, lang);
if (val) {
return val;
}
if (lang.indexOf('-') > 0) {
val = this.getByLanguage(key, lang.split('-')[0]);
}
if (val) {
return val;
}
return typeof defVal !== 'undefined' ? defVal : key;
}
/**
* @method
* Get value according to specified language
* @param {String} key
* @param {String} language - Specified langurage to be used
* @param {String} defVal - Default value
*/
getByLanguage(key, language, defVal = null) {
if (!language) {
return defVal;
}
const lang_dict = this._dict[language];
if (!lang_dict) {
return defVal;
}
return lang_dict[key];
}
/**
* @method
* Add vocabularies for one language
* @param {String} language - Language of the dictionary
* @param {Object} vocabularies - Object that has key-value as dictionary entry
*/
putVocabulariesForLanguage(language, vocabularies) {
let lang_dict = this._dict[language];
if (!lang_dict) {
lang_dict = this._dict[language] = {};
}
this._dict[language] = { ...lang_dict, ...vocabularies };
}
/**
* @method
* Add vocabularies for one language
* @param {Object} vocabularies - Object that has language as key,
* vocabularies of each language as value
*/
putVocabularies(vocabularies) {
Object.keys(vocabularies).map(key => {
this.putVocabulariesForLanguage(key, vocabularies[key]);
});
}
}