Spaces:
Sleeping
Sleeping
| /** | |
| * Simple i18n system for Learn Pathophysiology | |
| * Supports: English (en) and Croatian (hr) | |
| */ | |
| export type Lang = 'en' | 'hr' | |
| export const LANG_STORAGE_KEY = 'lp_lang' | |
| export function getStoredLang(): Lang { | |
| const stored = localStorage.getItem(LANG_STORAGE_KEY) | |
| if (stored === 'en' || stored === 'hr') return stored | |
| return 'hr' // default to Croatian | |
| } | |
| export function storeLang(lang: Lang) { | |
| localStorage.setItem(LANG_STORAGE_KEY, lang) | |
| } | |
| const translations = { | |
| // ---- Login Page ---- | |
| 'login.title': { | |
| en: 'Learn Pathophysiology', | |
| hr: 'Learn Pathophysiology', | |
| }, | |
| 'login.subtitle': { | |
| en: 'AI assistant for learning pathophysiology', | |
| hr: 'AI asistent za učenje patofiziologije', | |
| }, | |
| 'login.prompt': { | |
| en: 'Sign in to continue', | |
| hr: 'Prijavi se za pristup', | |
| }, | |
| 'login.loading': { | |
| en: 'Signing in...', | |
| hr: 'Prijava u tijeku...', | |
| }, | |
| 'login.error.gsi': { | |
| en: 'Failed to load Google Sign-In. Check your internet connection.', | |
| hr: 'Greška pri učitavanju Google prijave. Provjeri internet vezu.', | |
| }, | |
| 'login.error.failed': { | |
| en: 'Google sign-in failed. Please try again.', | |
| hr: 'Google prijava nije uspjela. Pokušaj ponovo.', | |
| }, | |
| 'login.iframe.hint': { | |
| en: 'If login doesn\'t work, open the app directly:', | |
| hr: 'Ako prijava ne radi, otvori aplikaciju direktno:', | |
| }, | |
| 'login.footer.powered': { | |
| en: 'Powered by Gemini AI', | |
| hr: 'Powered by Gemini AI', | |
| }, | |
| 'login.footer.edition': { | |
| en: 'WC3 Edition', | |
| hr: 'WC3 Edition', | |
| }, | |
| // ---- App Header ---- | |
| 'app.title': { | |
| en: 'Learn Pathophysiology', | |
| hr: 'Learn Pathophysiology', | |
| }, | |
| 'app.subtitle': { | |
| en: 'AI assistant for learning pathophysiology', | |
| hr: 'AI asistent za ucenje patofiziologije', | |
| }, | |
| 'app.loading': { | |
| en: 'Loading...', | |
| hr: 'Učitavanje...', | |
| }, | |
| // ---- Tabs ---- | |
| 'tab.chat': { | |
| en: 'Chat', | |
| hr: 'Chat', | |
| }, | |
| 'tab.image': { | |
| en: 'Image Analysis', | |
| hr: 'Analiza slike', | |
| }, | |
| // ---- Sidebar ---- | |
| 'sidebar.selectModel': { | |
| en: 'Select model', | |
| hr: 'Odaberi model', | |
| }, | |
| 'sidebar.theme': { | |
| en: 'Theme', | |
| hr: 'Tema', | |
| }, | |
| 'sidebar.options': { | |
| en: 'Options', | |
| hr: 'Opcije', | |
| }, | |
| 'sidebar.showSources': { | |
| en: 'Show sources', | |
| hr: 'Prikazi izvore', | |
| }, | |
| 'sidebar.newChat': { | |
| en: 'New conversation', | |
| hr: 'Novi razgovor', | |
| }, | |
| 'sidebar.knowledgeBase': { | |
| en: 'Knowledge Base', | |
| hr: 'Baza znanja', | |
| }, | |
| 'sidebar.documents': { | |
| en: 'documents', | |
| hr: 'dokumenata', | |
| }, | |
| 'sidebar.logout': { | |
| en: 'Sign out', | |
| hr: 'Odjavi se', | |
| }, | |
| 'sidebar.language': { | |
| en: 'Language', | |
| hr: 'Jezik', | |
| }, | |
| // ---- Chat ---- | |
| 'chat.welcome': { | |
| en: 'Welcome!', | |
| hr: 'Dobrodosli!', | |
| }, | |
| 'chat.welcomeHint': { | |
| en: 'Ask a question about pathophysiology.', | |
| hr: 'Postavi pitanje o patofiziologiji.', | |
| }, | |
| 'chat.placeholder': { | |
| en: 'Ask a question about pathophysiology...', | |
| hr: 'Postavi pitanje o patofiziologiji...', | |
| }, | |
| 'chat.send': { | |
| en: 'Send', | |
| hr: 'Posalji', | |
| }, | |
| 'chat.generating': { | |
| en: 'Generating response', | |
| hr: 'Generiranje odgovora', | |
| }, | |
| 'chat.error': { | |
| en: 'Error sending message', | |
| hr: 'Greska pri slanju poruke', | |
| }, | |
| // ---- Image ---- | |
| 'image.dropHint': { | |
| en: 'Click or drag an image here', | |
| hr: 'Klikni ili povuci sliku ovdje', | |
| }, | |
| 'image.uploadHint': { | |
| en: 'Upload a page for analysis', | |
| hr: 'Uploadaj stranicu za analizu', | |
| }, | |
| 'image.questionPlaceholder': { | |
| en: 'Ask a question about the image (optional)...', | |
| hr: 'Postavi pitanje o slici (opcionalno)...', | |
| }, | |
| 'image.analyze': { | |
| en: 'Analyze image', | |
| hr: 'Analiziraj sliku', | |
| }, | |
| 'image.analyzing': { | |
| en: 'Analyzing...', | |
| hr: 'Analiziram...', | |
| }, | |
| 'image.analyzingStatus': { | |
| en: 'Analyzing', | |
| hr: 'Analiziranje', | |
| }, | |
| 'image.error': { | |
| en: 'Error analyzing image', | |
| hr: 'Greska pri analizi slike', | |
| }, | |
| // ---- Citations ---- | |
| 'citations.sources': { | |
| en: 'Sources', | |
| hr: 'Izvori', | |
| }, | |
| 'citations.page': { | |
| en: 'p.', | |
| hr: 'str.', | |
| }, | |
| } as const | |
| export type TranslationKey = keyof typeof translations | |
| export function t(key: TranslationKey, lang: Lang): string { | |
| const entry = translations[key] | |
| if (!entry) return key | |
| return entry[lang] || entry['en'] || key | |
| } | |