diff options
Diffstat (limited to 'server/sonar-web/src/main/js/helpers/l10nBundle.ts')
-rw-r--r-- | server/sonar-web/src/main/js/helpers/l10nBundle.ts | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/helpers/l10nBundle.ts b/server/sonar-web/src/main/js/helpers/l10nBundle.ts new file mode 100644 index 00000000000..fc1a4414d57 --- /dev/null +++ b/server/sonar-web/src/main/js/helpers/l10nBundle.ts @@ -0,0 +1,93 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import { fetchL10nBundle } from '../api/l10n'; +import { L10nBundle, L10nBundleRequestParams } from '../types/l10nBundle'; +import { toNotSoISOString } from './dates'; + +const DEFAULT_LOCALE = 'en'; +const DEFAULT_MESSAGES = { + // eslint-disable-next-line camelcase + default_error_message: 'The request cannot be processed. Try again later.' +}; + +export function getMessages() { + return getL10nBundleFromCache().messages ?? DEFAULT_MESSAGES; +} + +export function getCurrentLocale() { + return getL10nBundleFromCache().locale; +} + +export function getCurrentL10nBundle() { + return getL10nBundleFromCache(); +} + +export async function loadL10nBundle() { + const browserLocale = getPreferredLanguage(); + const cachedBundle = getL10nBundleFromCache(); + + const params: L10nBundleRequestParams = {}; + + if (browserLocale) { + params.locale = browserLocale; + + if ( + cachedBundle.locale && + browserLocale.startsWith(cachedBundle.locale) && + cachedBundle.timestamp && + cachedBundle.messages + ) { + params.ts = cachedBundle.timestamp; + } + } + + const { effectiveLocale, messages } = await fetchL10nBundle(params).catch(response => { + if (response && response.status === 304) { + return { + effectiveLocale: cachedBundle.locale || browserLocale || DEFAULT_LOCALE, + messages: cachedBundle.messages ?? {} + }; + } + throw new Error(`Unexpected status code: ${response.status}`); + }); + + const bundle = { + timestamp: toNotSoISOString(new Date()), + locale: effectiveLocale, + messages + }; + + persistL10nBundleInCache(bundle); + + return bundle; +} + +function getPreferredLanguage() { + return window.navigator.languages ? window.navigator.languages[0] : window.navigator.language; +} + +function getL10nBundleFromCache() { + return ((window as unknown) as any).sonarQubeL10nBundle ?? {}; +} + +function persistL10nBundleInCache(bundle: L10nBundle) { + ((window as unknown) as any).sonarQubeL10nBundle = bundle; +} |