initial production version
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import { translations, type LanguageCode } from '$lib/i18n/translations';
|
||||
import type { Translation } from '$lib/i18n/translations/en';
|
||||
|
||||
const LANGUAGE_KEY = 'preferred-language';
|
||||
|
||||
function getStoredLanguage(): LanguageCode {
|
||||
if (typeof window === 'undefined') return 'en';
|
||||
|
||||
const stored = localStorage.getItem(LANGUAGE_KEY);
|
||||
if (stored && (stored === 'en' || stored === 'da')) {
|
||||
return stored as LanguageCode;
|
||||
}
|
||||
|
||||
// Try to detect from browser
|
||||
const browserLang = navigator.language.toLowerCase();
|
||||
if (browserLang.startsWith('da')) {
|
||||
return 'da';
|
||||
}
|
||||
|
||||
return 'en';
|
||||
}
|
||||
|
||||
class LanguageStore {
|
||||
private _current = $state<LanguageCode>(getStoredLanguage());
|
||||
|
||||
get current(): LanguageCode {
|
||||
return this._current;
|
||||
}
|
||||
|
||||
set current(value: LanguageCode) {
|
||||
this._current = value;
|
||||
if (typeof window !== 'undefined') {
|
||||
localStorage.setItem(LANGUAGE_KEY, value);
|
||||
}
|
||||
}
|
||||
|
||||
get t(): Translation {
|
||||
return translations[this._current];
|
||||
}
|
||||
|
||||
setLanguage(lang: LanguageCode) {
|
||||
this.current = lang;
|
||||
}
|
||||
}
|
||||
|
||||
export const languageStore = new LanguageStore();
|
||||
|
||||
// Helper function to get nested translation value
|
||||
export function t(path: string): string {
|
||||
const keys = path.split('.');
|
||||
let value: any = languageStore.t;
|
||||
|
||||
for (const key of keys) {
|
||||
if (value && typeof value === 'object' && key in value) {
|
||||
value = value[key];
|
||||
} else {
|
||||
console.warn(`Translation key not found: ${path}`);
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
return typeof value === 'string' ? value : path;
|
||||
}
|
||||
Reference in New Issue
Block a user