Skip to content

Commit aa0cd2a

Browse files
committed
feat: allow default language to be changed
1 parent f57a777 commit aa0cd2a

File tree

1 file changed

+39
-7
lines changed

1 file changed

+39
-7
lines changed

src/i18n/provider.ts

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1+
import { EventEmitter } from "../event-emitter.js";
12
import type { JsonObject } from "../json.js";
23
import { freeze, get } from "../objects.js";
34
import { defaultLanguage, type Language } from "./language.js";
45

56
/**
67
* Internalization provider, responsible for managing localizations and translating resources.
78
*/
8-
export class I18nProvider<T extends string> {
9+
export class I18nProvider<T extends string> extends EventEmitter<I18nProviderEventMap<T>> {
910
/**
10-
* Map of localized resources, indexed by their language.
11+
* Backing field for the default language.
1112
*/
12-
readonly #translations: Map<Language<T>, JsonObject | null> = new Map();
13+
#language: Language<T>;
1314

1415
/**
15-
* Default language of the provider.
16+
* Map of localized resources, indexed by their language.
1617
*/
17-
readonly #language: Language<T>;
18+
readonly #translations: Map<Language<T>, JsonObject | null> = new Map();
1819

1920
/**
2021
* Function responsible for providing localized resources for a given language.
@@ -27,18 +28,39 @@ export class I18nProvider<T extends string> {
2728
* @param readTranslations Function responsible for providing localized resources for a given language.
2829
*/
2930
constructor(language: Language<T>, readTranslations: TranslationsReader<T>) {
31+
super();
32+
3033
this.#language = language;
3134
this.#readTranslations = readTranslations;
3235
}
3336

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+
3456
/**
3557
* Translates the specified {@link key}, as defined within the resources for the {@link language}.
3658
* When the key is not found, the default language is checked. Alias of {@link I18nProvider.translate}.
3759
* @param key Key of the translation.
3860
* @param language Optional language to get the translation for; otherwise the default language.
3961
* @returns The translation; otherwise the key.
4062
*/
41-
public t(key: string, language: Language<T> = this.#language): string {
63+
public t(key: string, language: Language<T> = this.language): string {
4264
return this.translate(key, language);
4365
}
4466

@@ -49,7 +71,7 @@ export class I18nProvider<T extends string> {
4971
* @param language Optional language to get the translation for; otherwise the default language.
5072
* @returns The translation; otherwise the key.
5173
*/
52-
public translate(key: string, language: Language<T> = this.#language): string {
74+
public translate(key: string, language: Language<T> = this.language): string {
5375
// Determine the languages to search for.
5476
const languages = new Set<Language<T>>([
5577
language,
@@ -88,6 +110,16 @@ export class I18nProvider<T extends string> {
88110
}
89111
}
90112

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+
91123
/**
92124
* Function responsible for providing localized resources for a given language.
93125
* @param language The language whose resources should be retrieved.

0 commit comments

Comments
 (0)