Skip to content

Commit 72ab9b8

Browse files
committed
refactor(framework): fetch default language (#2175)
After the change all languages would be fetched over the network, including the defaultLanguage, that we have inlined. This will be the default behaviour. However, there is a new configuration option to stop fetching the default language, called "useDefaultLanguage". When the "useDefaultLanguage" is enabled, the inlined texts will be used instead. Related to: #2169
1 parent 647ae84 commit 72ab9b8

File tree

5 files changed

+85
-15
lines changed

5 files changed

+85
-15
lines changed

packages/base/src/InitialConfiguration.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ let initialConfig = {
1212
calendarType: null,
1313
noConflict: false, // no URL
1414
formatSettings: {},
15+
useDefaultLanguage: false,
1516
};
1617

1718
/* General settings */
@@ -35,6 +36,16 @@ const getLanguage = () => {
3536
return initialConfig.language;
3637
};
3738

39+
/**
40+
* Returns if the default language, that is inlined build time,
41+
* should be used, instead of trying fetching the language over the network.
42+
* @returns {Boolean}
43+
*/
44+
const getUseDefaultLanguage = () => {
45+
initConfiguration();
46+
return initialConfig.useDefaultLanguage;
47+
};
48+
3849
const getNoConflict = () => {
3950
initConfiguration();
4051
return initialConfig.noConflict;
@@ -125,6 +136,7 @@ export {
125136
getTheme,
126137
getRTL,
127138
getLanguage,
139+
getUseDefaultLanguage,
128140
getNoConflict,
129141
getCalendarType,
130142
getFormatSettings,

packages/base/src/asset-registries/i18n.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { fetchTextOnce } from "../util/FetchHelper.js";
55
import normalizeLocale from "../locale/normalizeLocale.js";
66
import nextFallbackLocale from "../locale/nextFallbackLocale.js";
77
import { DEFAULT_LANGUAGE } from "../generated/AssetParameters.js";
8+
import { getUseDefaultLanguage } from "../config/Language.js";
89

910
const bundleData = new Map();
1011
const bundleURLs = new Map();
@@ -58,13 +59,14 @@ const fetchI18nBundle = async packageName => {
5859

5960
const language = getLocale().getLanguage();
6061
const region = getLocale().getRegion();
61-
62+
const useDefaultLanguage = getUseDefaultLanguage();
6263
let localeId = normalizeLocale(language + (region ? `-${region}` : ``));
64+
6365
while (localeId !== DEFAULT_LANGUAGE && !bundlesForPackage[localeId]) {
6466
localeId = nextFallbackLocale(localeId);
6567
}
6668

67-
if (!bundlesForPackage[localeId]) {
69+
if (useDefaultLanguage && localeId === DEFAULT_LANGUAGE) {
6870
setI18nBundleData(packageName, null); // reset for the default language (if data was set for a previous language)
6971
return;
7072
}

packages/base/src/config/Language.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { getLanguage as getConfiguredLanguage } from "../InitialConfiguration.js";
1+
import {
2+
getLanguage as getConfiguredLanguage,
3+
getUseDefaultLanguage as getConfiguredUseDefaultLanguage,
4+
} from "../InitialConfiguration.js";
25
import { fireLanguageChange } from "../locale/languageChange.js";
36
import RenderScheduler from "../RenderScheduler.js";
47

58
let language;
9+
let useDefaultLanguage;
610

711
/**
812
* Returns the currently configured language, or the browser language as a fallback
@@ -35,7 +39,32 @@ const setLanguage = async newLanguage => {
3539
return RenderScheduler.whenFinished();
3640
};
3741

42+
/**
43+
* Defines if the default language, that is inlined, should be used,
44+
* instead of fetching the language over the network.
45+
* <b>Note:</b> By default the language will be fetched.
46+
*
47+
* @param {Boolean} useDefaultLanguage
48+
*/
49+
const setUseDefaultLanguage = useDefaultLang => {
50+
useDefaultLanguage = useDefaultLang;
51+
};
52+
53+
/**
54+
* Returns if the default language, that is inlined, should be used.
55+
* @returns {Boolean}
56+
*/
57+
const getUseDefaultLanguage = () => {
58+
if (useDefaultLanguage === undefined) {
59+
setUseDefaultLanguage(getConfiguredUseDefaultLanguage());
60+
}
61+
62+
return useDefaultLanguage;
63+
};
64+
3865
export {
3966
getLanguage,
4067
setLanguage,
68+
setUseDefaultLanguage,
69+
getUseDefaultLanguage,
4170
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/html">
3+
4+
<head>
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta charset="utf-8">
7+
8+
<title>i18n default language test page</title>
9+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
10+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
11+
<meta charset="utf-8">
12+
13+
<!-- The "useDefaultLanguage" is enabled,
14+
the configured default language won't be fetched over the network
15+
-->
16+
<script data-ui5-config type="application/json">{"useDefaultLanguage": true}</script>
17+
18+
<script src="../../webcomponentsjs/webcomponents-loader.js"></script>
19+
<script src="../../resources/bundle.esm.js" type="module"></script>
20+
<script nomodule src="../../resources/bundle.es5.js"></script>
21+
</head>
22+
<body style="background-color: var(--sapBackgroundColor);">
23+
24+
<ui5-textarea
25+
maxlength="20"
26+
placeholder="Max length"
27+
show-exceeded-text
28+
></ui5-textarea>
29+
</body>
30+
</html>

packages/tools/lib/generate-json-imports/i18n.js

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
const fs = require("fs");
22
const path = require('path');
33
const mkdirp = require("mkdirp");
4-
const assets = require("../../assets-meta.js");
54

65
const packageName = JSON.parse(fs.readFileSync("package.json")).name;
76

87
const inputFolder = path.normalize(process.argv[2]);
98
const outputFile = path.normalize(`${process.argv[3]}/i18n.js`);
109

11-
const defaultLanguage = assets.languages.default;
12-
1310
// All languages present in the file system
1411
const files = fs.readdirSync(inputFolder);
1512
const languages = files.map(file => {
16-
const matches = file.match(/messagebundle_(.+?).json$/);
17-
return matches ? matches[1] : undefined;
18-
}).filter(key => !!key && key !== defaultLanguage);
13+
const matches = file.match(/messagebundle_(.+?).json$/);
14+
return matches ? matches[1] : undefined;
15+
}).filter(key => !!key);
1916

2017
let content;
2118

@@ -25,14 +22,14 @@ if (languages.length === 0) {
2522
// There is i18n - generate the full file
2623
} else {
2724

28-
// Keys for the array
29-
const languagesKeysString = languages.map(key => `${key},`).join("\n\t");
25+
// Keys for the array
26+
const languagesKeysString = languages.map(key => `${key},`).join("\n\t");
3027

31-
// Actual imports for json assets
32-
const assetsImportsString = languages.map(key => `import ${key} from "../assets/i18n/messagebundle_${key}.json";`).join("\n");
28+
// Actual imports for json assets
29+
const assetsImportsString = languages.map(key => `import ${key} from "../assets/i18n/messagebundle_${key}.json";`).join("\n");
3330

34-
// Resulting file content
35-
content = `import { registerI18nBundle } from "@ui5/webcomponents-base/dist/asset-registries/i18n.js";
31+
// Resulting file content
32+
content = `import { registerI18nBundle } from "@ui5/webcomponents-base/dist/asset-registries/i18n.js";
3633
3734
${assetsImportsString}
3835

0 commit comments

Comments
 (0)