Load all namespaces up-front (no indv. queries) (#2680)

* Move i18n app to settings (discoverability)

* Load all namespecas up-front (no indv. queries)
This commit is contained in:
Jaco Greeff 2020-05-03 08:53:59 +02:00 committed by GitHub
parent 437499e912
commit f21ae871f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 23 deletions

View File

@ -1,15 +1,12 @@
[
"app-123code.json",
"app-accounts.json",
"app-claims.json",
"app-contracts.json",
"app-council.json",
"app-dashboard.json",
"app-democracy.json",
"app-explorer.json",
"app-extrinsics.json",
"app-generic-asset.json",
"app-i18n.json",
"app-js.json",
"app-parachains.json",
"app-settings.json",
@ -23,9 +20,7 @@
"apps-config.json",
"apps-routing.json",
"apps.json",
"react-api.json",
"react-components.json",
"react-hooks.json",
"react-params.json",
"react-query.json",
"react-signer.json"

View File

@ -78,15 +78,13 @@ function Content ({ className }: Props): React.ReactElement<Props> {
export default React.memo(styled(Content)`
background: #f5f5f5;
display: flex;
flex-direction: column;
flex-grow: 1;
height: 100%;
min-height: 100vh;
overflow-x: hidden;
overflow-y: auto;
width: 100%;
padding: 0 2rem;
padding: 0 1.5rem;
@media(max-width: 768px) {
padding: 0 0.5rem;

View File

@ -6,26 +6,43 @@ import languageCache from './cache';
type Callback = (error: string | null, data: any) => void;
type LoadResult = [string | null, any];
const loaders: Record<string, Promise<LoadResult>> = {};
export default class Backend {
type = 'backend'
static type: 'backend' = 'backend'
async read (lng: string, _namespace: string, responder: Callback): Promise<void> {
if (!languageCache[lng]) {
try {
const response = await fetch(`locales/${lng}/translation.json`, {});
if (!response.ok) {
return responder(`i18n: failed loading ${lng}`, response.status >= 500 && response.status < 600);
}
languageCache[lng] = await response.json();
} catch (error) {
return responder(error.message, false);
}
if (languageCache[lng]) {
return responder(null, languageCache[lng]);
}
return responder(null, languageCache[lng]);
// eslint-disable-next-line @typescript-eslint/no-misused-promises
if (!loaders[lng]) {
loaders[lng] = this.createLoader(lng);
}
const [error, data] = await loaders[lng];
return responder(error, data);
}
async createLoader (lng: string): Promise<LoadResult> {
try {
const response = await fetch(`locales/${lng}/translation.json`, {});
if (!response.ok) {
return [`i18n: failed loading ${lng}`, response.status >= 500 && response.status < 600];
} else {
languageCache[lng] = await response.json();
return [null, languageCache[lng]];
}
} catch (error) {
return [error.message, false];
}
}
}

View File

@ -38,7 +38,39 @@ i18n
},
keySeparator: false,
load: 'languageOnly',
ns: ['translation'],
ns: [
'apps',
'apps-config',
'apps-routing',
'app-123code',
'app-accounts',
'app-claims',
'app-contracts',
'app-council',
'app-dashboard',
'app-democracy',
'app-explorer',
'app-extrinsics',
'app-generic-asset',
'app-i18n',
'app-js',
'app-parachains',
'app-settings',
'app-society',
'app-staking',
'app-storage',
'app-sudo',
'app-tech-comm',
'app-toolbox',
'app-treasury',
'react-api',
'react-components',
'react-hooks',
'react-params',
'react-query',
'react-signer',
'translation'
],
nsSeparator: false,
react: {
wait: true

View File

@ -7,6 +7,8 @@ const path = require('path');
const i18nRoot = path.join(__dirname, '../packages/apps/public/locales');
const SKIP_NS = ['app-123code', 'app-dashboard', 'app-i18n', 'translation'].map((f) => `${f}.json`);
function getEntries (langRoot) {
return fs
.readdirSync(langRoot)
@ -22,6 +24,7 @@ function getEntries (langRoot) {
function sortLanguage (lang) {
const langRoot = path.join(i18nRoot, lang);
const entries = getEntries(langRoot);
const hasKeys = {};
entries.forEach((entry) => {
const filename = path.join(langRoot, entry);
@ -32,13 +35,19 @@ function sortLanguage (lang) {
return result;
}, {});
hasKeys[entry] = Object.keys(sorted).length !== 0;
fs.writeFileSync(filename, JSON.stringify(sorted, null, 2));
});
if (lang === 'en') {
const filtered = entries
.filter((entry) => !SKIP_NS.includes(entry))
.filter((entry) => hasKeys[entry]);
fs.writeFileSync(
path.join(langRoot, 'index.json'),
JSON.stringify(entries.filter((entry) => !['translation.json'].includes(entry)), null, 2)
JSON.stringify(filtered, null, 2)
);
}
}