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:
2024-05-29 08:05:39 +02:00
parent fdc43aa699
commit 18eb59ff2a
8 changed files with 155 additions and 29 deletions

63
src/i18n/utils.ts Normal file
View 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}`;
}