zitadel/site/src/i18n.js
Max Peintner b5a7263124
docs(site): i18n handler, prettier code blocks and highlighting (#951)
* fix: sirv, commonjs plugin, add rollup sig

* replace deprecated rollup plugins

* remove dollarsign

* fix i18n setting, code snippet styling, lng switch

* fix segment, rm unused styles
2020-11-11 16:12:09 +01:00

83 lines
2.5 KiB
JavaScript

import { getLocaleFromNavigator, init, locale as $locale, register } from 'svelte-i18n';
import { LANGUAGES } from '../config.js';
import { getCookie, setCookie } from './modules/cookie.js';
export const INIT_OPTIONS = {
fallbackLocale: 'en',
initialLocale: 'en',
loadingDelay: 200,
formats: {},
warnOnMissingMessages: true,
localeOptions: LANGUAGES,
};
let currentLocale = null;
register('en', () => import('./messages/en.json'));
register('de', () => import('./messages/de.json'));
$locale.subscribe((value) => {
if (value == null) return;
currentLocale = value;
// if running in the client, save the language preference in a cookie
if (typeof window !== 'undefined') {
setCookie('locale', value);
}
});
// initialize the i18n library in client
export function startClient() {
console.log('nav', getLocaleFromNavigator());
init({
...INIT_OPTIONS,
initialLocale: getCookie('locale') || INIT_OPTIONS.localeOptions.find(option => option == cropCountryCode(getLocaleFromNavigator())) || INIT_OPTIONS.initialLocale,
});
}
const DOCUMENT_REGEX = /^([^.?#@]+)?([?#](.+)?)?$/;
// initialize the i18n library in the server and returns its middleware
export function i18nMiddleware() {
// initialLocale will be set by the middleware
init(INIT_OPTIONS);
return (req, res, next) => {
const isDocument = DOCUMENT_REGEX.test(req.originalUrl);
// get the initial locale only for a document request
if (!isDocument) {
next();
return;
}
let locale = getCookie('locale', req.headers.cookie);
// no cookie, let's get the first accepted language
if (locale == null) {
if (req.headers['accept-language']) {
const headerLngs = req.headers['accept-language'].split(',');
const headerLngCodes = headerLngs.map(lng => lng.split(';')[0].trim());
const headerLang = headerLngCodes.find(code => {
return INIT_OPTIONS.localeOptions.find(option => option == code);
});
if (headerLang) {
locale = headerLang;
}
} else {
locale = INIT_OPTIONS.initialLocale || INIT_OPTIONS.fallbackLocale;
}
}
if (locale != null && locale !== currentLocale) {
$locale.set(locale);
}
next();
};
}
function cropCountryCode(code) {
return code.split('-')[0].trim();
}