ghost-portal/packages/react-components/src/i18n/Backend.ts
Jaco e23c8cf152
Bump pjs deps (#9794)
* Bump pjs deps

* Some cleanups

* Additional fixes

* Additional fixes

* kilt

* Additional fixes

* Headers

* Additional headers

* Additional

* Additional

* Additional

* Additional

* It seems to lint... locally.

* It seems to build... locally.

* Review adjustments
2023-08-19 09:38:42 +03:00

48 lines
1.3 KiB
TypeScript

// Copyright 2017-2023 @polkadot/react-components authors & contributors
// SPDX-License-Identifier: Apache-2.0
import languageCache from './cache.js';
type Callback = (error: string | null, data: any) => void;
type LoadResult = [string | null, Record<string, string> | boolean];
const loaders: Record<string, Promise<LoadResult>> = {};
export default class Backend {
type = 'backend' as const;
static type = 'backend' as const;
async read (lng: string, _namespace: string, responder: Callback): Promise<void> {
if (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() as Record<string, string>;
return [null, languageCache[lng]];
}
} catch (error) {
return [(error as Error).message, false];
}
}
}