1
+ import { EventEmitter } from "../event-emitter.js" ;
1
2
import type { JsonObject } from "../json.js" ;
2
3
import { freeze , get } from "../objects.js" ;
3
4
import { defaultLanguage , type Language } from "./language.js" ;
4
5
5
6
/**
6
7
* Internalization provider, responsible for managing localizations and translating resources.
7
8
*/
8
- export class I18nProvider < T extends string > {
9
+ export class I18nProvider < T extends string > extends EventEmitter < I18nProviderEventMap < T > > {
9
10
/**
10
- * Map of localized resources, indexed by their language.
11
+ * Backing field for the default language.
11
12
*/
12
- readonly #translations: Map < Language < T > , JsonObject | null > = new Map ( ) ;
13
+ #language: Language < T > ;
13
14
14
15
/**
15
- * Default language of the provider .
16
+ * Map of localized resources, indexed by their language .
16
17
*/
17
- readonly #language: Language < T > ;
18
+ readonly #translations: Map < Language < T > , JsonObject | null > = new Map ( ) ;
18
19
19
20
/**
20
21
* Function responsible for providing localized resources for a given language.
@@ -27,18 +28,39 @@ export class I18nProvider<T extends string> {
27
28
* @param readTranslations Function responsible for providing localized resources for a given language.
28
29
*/
29
30
constructor ( language : Language < T > , readTranslations : TranslationsReader < T > ) {
31
+ super ( ) ;
32
+
30
33
this . #language = language ;
31
34
this . #readTranslations = readTranslations ;
32
35
}
33
36
37
+ /**
38
+ * The default language of the provider.
39
+ * @returns The language.
40
+ */
41
+ public get language ( ) : Language < T > {
42
+ return this . #language;
43
+ }
44
+
45
+ /**
46
+ * The default language of the provider.
47
+ * @param value The language.
48
+ */
49
+ public set language ( value : Language < T > ) {
50
+ if ( this . #language !== value ) {
51
+ this . #language = value ;
52
+ this . emit ( "languageChange" , value ) ;
53
+ }
54
+ }
55
+
34
56
/**
35
57
* Translates the specified {@link key}, as defined within the resources for the {@link language}.
36
58
* When the key is not found, the default language is checked. Alias of {@link I18nProvider.translate}.
37
59
* @param key Key of the translation.
38
60
* @param language Optional language to get the translation for; otherwise the default language.
39
61
* @returns The translation; otherwise the key.
40
62
*/
41
- public t ( key : string , language : Language < T > = this . # language) : string {
63
+ public t ( key : string , language : Language < T > = this . language ) : string {
42
64
return this . translate ( key , language ) ;
43
65
}
44
66
@@ -49,7 +71,7 @@ export class I18nProvider<T extends string> {
49
71
* @param language Optional language to get the translation for; otherwise the default language.
50
72
* @returns The translation; otherwise the key.
51
73
*/
52
- public translate ( key : string , language : Language < T > = this . # language) : string {
74
+ public translate ( key : string , language : Language < T > = this . language ) : string {
53
75
// Determine the languages to search for.
54
76
const languages = new Set < Language < T > > ( [
55
77
language ,
@@ -88,6 +110,16 @@ export class I18nProvider<T extends string> {
88
110
}
89
111
}
90
112
113
+ /**
114
+ * Events that can occur as part of the {@link I18nProvider}.
115
+ */
116
+ type I18nProviderEventMap < T extends string > = {
117
+ /**
118
+ * Occurs when the language changes.
119
+ */
120
+ languageChange : [ language : Language < T > ] ;
121
+ } ;
122
+
91
123
/**
92
124
* Function responsible for providing localized resources for a given language.
93
125
* @param language The language whose resources should be retrieved.
0 commit comments