Create i18n blog posts
Content stored in /src/content/blog/[slug]/<lang>.md TODO: fix missing content in language TODO: main blog page
This commit is contained in:
63
src/i18n/utils.ts
Normal file
63
src/i18n/utils.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import { dictionary } from "./dictionary";
|
||||
|
||||
export const DEFAULT_LANG = 'en'
|
||||
export const LANGUAGES = {
|
||||
'en': "English",
|
||||
'de': "German",
|
||||
'fr': "Français",
|
||||
'cs': "Česky"
|
||||
}
|
||||
|
||||
var ui = dictionary
|
||||
|
||||
export type UiType = keyof typeof ui;
|
||||
|
||||
export function getLangFromUrl(url: URL) {
|
||||
const [, lang] = url.pathname.split("/");
|
||||
if (lang in ui) return lang as UiType;
|
||||
return DEFAULT_LANG;
|
||||
}
|
||||
|
||||
export function useTranslations(lang?: UiType) {
|
||||
return function t(
|
||||
key: keyof (typeof ui)[typeof DEFAULT_LANG],
|
||||
...args: any[]
|
||||
) {
|
||||
let translation = ui[lang ?? DEFAULT_LANG][key] || ui[DEFAULT_LANG][key];
|
||||
if (args.length > 0) {
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
// @ts-ignore
|
||||
translation = translation.replace(`{${i}}`, args[i]);
|
||||
}
|
||||
}
|
||||
return translation;
|
||||
};
|
||||
}
|
||||
|
||||
export function pathNameIsInLanguage(pathname: string, lang: UiType) {
|
||||
return pathname.startsWith(`/${lang}`) || (lang === DEFAULT_LANG && !pathNameStartsWithLanguage(pathname));
|
||||
}
|
||||
|
||||
function pathNameStartsWithLanguage(pathname: string) {
|
||||
let startsWithLanguage = false;
|
||||
const languages = Object.keys(LANGUAGES);
|
||||
|
||||
for (let i = 0; i < languages.length; i++) {
|
||||
const lang = languages[i];
|
||||
if (pathname.startsWith(`/${lang}`)) {
|
||||
startsWithLanguage = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return startsWithLanguage;
|
||||
}
|
||||
|
||||
export function getLocalizedPathname(pathname: string, lang: UiType) {
|
||||
if (pathNameStartsWithLanguage(pathname)) {
|
||||
const availableLanguages = Object.keys(LANGUAGES).join('|');
|
||||
const regex = new RegExp(`^\/(${availableLanguages})`);
|
||||
return pathname.replace(regex, `/${lang}`);
|
||||
}
|
||||
return `/${lang}${pathname}`;
|
||||
}
|
Reference in New Issue
Block a user