-
Notifications
You must be signed in to change notification settings - Fork 284
Expand file tree
/
Copy pathLanguage.ts
More file actions
125 lines (108 loc) · 3.46 KB
/
Copy pathLanguage.ts
File metadata and controls
125 lines (108 loc) · 3.46 KB
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
import {
getLanguage as getConfiguredLanguage,
getFetchDefaultLanguage as getConfiguredFetchDefaultLanguage,
} from "../InitialConfiguration.js";
import { fireLanguageChange } from "../locale/languageChange.js";
import { reRenderAllUI5Elements } from "../Render.js";
import { DEFAULT_LANGUAGE } from "../generated/AssetParameters.js";
import { isBooted } from "../Boot.js";
import { attachConfigurationReset } from "./ConfigurationReset.js";
import { fireConfigChange, attachConfigChange, getSharedValue } from "./ConfigurationSync.js";
let curLanguage: string | undefined;
let fetchDefaultLanguage: boolean | undefined;
attachConfigurationReset(() => {
curLanguage = undefined;
fetchDefaultLanguage = undefined;
});
// Flag indicating that a language change is in progress and not yet complete.
// While this flag is true, language-aware components will not re-render.
// These components may rely on language-specific data (e.g., CLDR, language bundles),
// which might be unavailable during the loading phase.
// During this phase, all re-rendering is postponed.
// Once all necessary language data has been loaded, the language change
// will trigger a re-render of all language-aware components.
let languageChangePending = false;
attachConfigChange("language", (language: string) => {
curLanguage = language;
languageChangePending = true;
fireLanguageChange(language).then(() => {
languageChangePending = false;
if (isBooted()) {
reRenderAllUI5Elements({ languageAware: true });
}
});
});
const getLanguageChangePending = () => languageChangePending;
/**
* Returns the currently configured language, or the browser language as a fallback.
* @public
* @returns {string}
*/
const getLanguage = (): string | undefined => {
if (curLanguage === undefined) {
curLanguage = getSharedValue<string>("language") ?? getConfiguredLanguage();
}
return curLanguage;
};
/**
* Changes the current language, re-fetches all message bundles, updates all language-aware components
* and returns a promise that resolves when all rendering is done.
*
* @param {string} language
* @public
* @returns {Promise<void>}
*/
const setLanguage = async (language: string): Promise<void> => {
if (curLanguage === language) {
return;
}
languageChangePending = true;
curLanguage = language;
fireConfigChange("language", language);
await fireLanguageChange(language);
languageChangePending = false;
if (isBooted()) {
await reRenderAllUI5Elements({ languageAware: true });
}
};
/**
* Returns the default languague.
*
* Note: Default language might be different than the configurated one.
*
* @public
* @returns {string}
*/
const getDefaultLanguage = (): string => {
return DEFAULT_LANGUAGE;
};
/**
* Defines if the default language, that is inlined, should be
* fetched over the network instead of using the inlined one.
* **Note:** By default the language will not be fetched.
*
* @public
* @param {boolean} fetchDefaultLang
*/
const setFetchDefaultLanguage = (fetchDefaultLang: boolean) => {
fetchDefaultLanguage = fetchDefaultLang;
};
/**
* Returns if the default language, that is inlined, should be fetched over the network.
* @public
* @returns {boolean}
*/
const getFetchDefaultLanguage = (): boolean => {
if (fetchDefaultLanguage === undefined) {
fetchDefaultLanguage = getConfiguredFetchDefaultLanguage();
}
return fetchDefaultLanguage;
};
export {
getLanguage,
setLanguage,
getDefaultLanguage,
setFetchDefaultLanguage,
getFetchDefaultLanguage,
getLanguageChangePending,
};