Files
f.bosin.ch/src/lib/data/language.ts
2023-08-28 22:47:55 +02:00

71 lines
2.0 KiB
TypeScript

import { writable, derived, type Writable } from "svelte/store";
export const language: Writable<TranslationKey> = writable('de');
const translations: Record<TranslationKey, Record<string, string>> = {
de: {
'gallery': 'Galerie',
'gallery-description': 'Fotogalerie von Luca Bosin',
'album': 'Album',
'albums': 'Alben',
'photo': 'Foto',
'photos': 'Fotos',
'photo-description': 'Foto von Luca Bosin',
'video': 'Video',
'videos': 'Videos',
'back': 'Zurück',
'small': 'Klein',
'medium': 'Mittel',
'large': 'Groß',
'open': 'Öffnen',
'open-name': '{0} öffnen',
'download': 'Herunterladen',
'download-all': 'Alle herunterladen',
'author': 'Autor',
'authors': 'Autoren',
'license': 'Lizenz',
},
en: {
'gallery': 'Gallery',
'gallery-description': 'Photo gallery by Luca Bosin',
'album': 'Album',
'albums': 'Albums',
'photo': 'Photo',
'photos': 'Photos',
'photo-description': 'Photo by Luca Bosin',
'video': 'Video',
'videos': 'Videos',
'back': 'Back',
'small': 'Small',
'medium': 'Medium',
'large': 'Large',
'open': 'Open',
'open-name': 'Open {0}',
'download': 'Download',
'download-all': 'Download all',
'author': 'Author',
'authors': 'Authors',
'license': 'License',
}
};
export const str = derived(language, $language => {
function translate(key: string, ...args: any[]) {
const str = translations[$language][key];
if (str === undefined) return key;
return str.replace(/\{(\d+)\}/g, (_, i) => args[i]);
}
return translate;
});
export const strf = derived(language, $language => {
function translate(translations: Translation | string | undefined, ...args: any[]) {
if (translations === undefined) return undefined;
if (typeof translations === 'string') return translations;
const str = translations[$language];
if (str === undefined) return translations.de;
return str.replace(/\{(\w+)\}/g, (_, i) => args[i]);
}
return translate;
});