187 lines
5.6 KiB
TypeScript
Executable File
187 lines
5.6 KiB
TypeScript
Executable File
// AOS i18n — German (default), English, Turkish (PRD §5.5)
|
||
// All UI strings keyed, no literals in components.
|
||
|
||
export type Locale = 'de' | 'en' | 'tr'
|
||
|
||
export const LOCALES: { id: Locale; label: string; flag: string }[] = [
|
||
{ id: 'de', label: 'Deutsch', flag: '🇩🇪' },
|
||
{ id: 'en', label: 'English', flag: '🇬🇧' },
|
||
{ id: 'tr', label: 'Türkçe', flag: '🇹🇷' },
|
||
]
|
||
|
||
type Dict = Record<string, string>
|
||
|
||
const de: Dict = {
|
||
// Nav groups
|
||
'nav.overview': 'Übersicht',
|
||
'nav.sales': 'Vertrieb',
|
||
'nav.delivery': 'Lieferung',
|
||
'nav.operations': 'Betrieb',
|
||
'nav.system': 'System',
|
||
// Nav items
|
||
'nav.dashboard': 'Dashboard',
|
||
'nav.calendar': 'Fristen',
|
||
'nav.reporting': 'Reporting',
|
||
'nav.crm': 'CRM',
|
||
'nav.leads': 'Leads Finder',
|
||
'nav.estimates': 'Angebote',
|
||
'nav.projects': 'Projekte',
|
||
'nav.support': 'Support',
|
||
'nav.licenses': 'Lizenzen',
|
||
'nav.agency': 'Reseller',
|
||
'nav.instances': 'Instanzen',
|
||
'nav.contracts': 'Verträge',
|
||
'nav.expenses': 'Ausgaben',
|
||
'nav.finance': 'Finanzen',
|
||
'nav.accounting': 'Buchhaltung',
|
||
'nav.audit': 'Audit-Protokoll',
|
||
'nav.kb': 'Wissensdatenbank',
|
||
'nav.api': 'API & Webhooks',
|
||
'nav.settings': 'Erweiterungen',
|
||
'nav.setup': 'Setup-Wizard',
|
||
'nav.settings_global': 'Einstellungen',
|
||
// Common
|
||
'common.search': 'Suchen…',
|
||
'common.new': 'Neu',
|
||
'common.save': 'Speichern',
|
||
'common.cancel': 'Abbrechen',
|
||
'common.close': 'Schließen',
|
||
'common.all': 'Alle',
|
||
'common.status': 'Status',
|
||
'common.actions': 'Aktion',
|
||
'common.date': 'Datum',
|
||
'common.amount': 'Betrag',
|
||
'common.customer': 'Kunde',
|
||
'common.loading': 'Lädt…',
|
||
// KPIs
|
||
'kpi.pipelineValue': 'Offene Pipeline',
|
||
'kpi.wonDeals': 'Gewonnene Deals',
|
||
'kpi.pendingLeads': 'Leads in Review',
|
||
'kpi.openProjects': 'Aktive Projekte',
|
||
'kpi.activeLicenses': 'Aktive Lizenzen',
|
||
'kpi.outstanding': 'Offene Forderungen',
|
||
'kpi.team': 'Team',
|
||
// Footer
|
||
'footer.compliance': 'GoBD / DSGVO',
|
||
'footer.selfHosted': 'self-hosted',
|
||
'footer.version': 'Version',
|
||
// Portal
|
||
'portal.title': 'Client-Portal',
|
||
'portal.selectCompany': 'Wähle dein Unternehmen',
|
||
'portal.isolated': 'projektbezogener Zugriff',
|
||
}
|
||
|
||
const en: Dict = {
|
||
'nav.overview': 'Overview',
|
||
'nav.sales': 'Sales',
|
||
'nav.delivery': 'Delivery',
|
||
'nav.operations': 'Operations',
|
||
'nav.system': 'System',
|
||
'nav.dashboard': 'Dashboard',
|
||
'nav.calendar': 'Fristen',
|
||
'nav.reporting': 'Reporting',
|
||
'nav.crm': 'CRM',
|
||
'nav.leads': 'Leads Finder',
|
||
'nav.estimates': 'Estimates',
|
||
'nav.projects': 'Projects',
|
||
'nav.support': 'Support',
|
||
'nav.licenses': 'Licenses',
|
||
'nav.agency': 'Resellers',
|
||
'nav.instances': 'Instances',
|
||
'nav.contracts': 'Contracts',
|
||
'nav.expenses': 'Expenses',
|
||
'nav.finance': 'Finance',
|
||
'nav.accounting': 'Accounting',
|
||
'nav.audit': 'Audit Log',
|
||
'nav.kb': 'Knowledge Base',
|
||
'nav.api': 'API & Webhooks',
|
||
'nav.settings': 'Extensions',
|
||
'nav.setup': 'Setup Wizard',
|
||
'nav.settings_global': 'Settings',
|
||
'common.search': 'Search…',
|
||
'common.new': 'New',
|
||
'common.save': 'Save',
|
||
'common.cancel': 'Cancel',
|
||
'common.close': 'Close',
|
||
'common.all': 'All',
|
||
'common.status': 'Status',
|
||
'common.actions': 'Action',
|
||
'common.date': 'Date',
|
||
'common.amount': 'Amount',
|
||
'common.customer': 'Customer',
|
||
'common.loading': 'Loading…',
|
||
'kpi.pipelineValue': 'Open Pipeline',
|
||
'kpi.wonDeals': 'Won Deals',
|
||
'kpi.pendingLeads': 'Leads in Review',
|
||
'kpi.openProjects': 'Active Projects',
|
||
'kpi.activeLicenses': 'Active Licenses',
|
||
'kpi.outstanding': 'Outstanding',
|
||
'kpi.team': 'Team',
|
||
'footer.compliance': 'GoBD / GDPR',
|
||
'footer.selfHosted': 'self-hosted',
|
||
'footer.version': 'Version',
|
||
'portal.title': 'Client Portal',
|
||
'portal.selectCompany': 'Select your company',
|
||
'portal.isolated': 'project-scoped access',
|
||
}
|
||
|
||
const tr: Dict = {
|
||
'nav.overview': 'Genel Bakış',
|
||
'nav.sales': 'Satış',
|
||
'nav.delivery': 'Teslimat',
|
||
'nav.operations': 'Operasyon',
|
||
'nav.system': 'Sistem',
|
||
'nav.dashboard': 'Panel',
|
||
'nav.calendar': 'Son Tarihler',
|
||
'nav.reporting': 'Raporlama',
|
||
'nav.crm': 'CRM',
|
||
'nav.leads': 'Müşteri Adayı Bulucu',
|
||
'nav.estimates': 'Teklifler',
|
||
'nav.projects': 'Projeler',
|
||
'nav.support': 'Destek',
|
||
'nav.licenses': 'Lisanslar',
|
||
'nav.agency': 'Bayiler',
|
||
'nav.instances': 'Sunucular',
|
||
'nav.contracts': 'Sözleşmeler',
|
||
'nav.expenses': 'Giderler',
|
||
'nav.finance': 'Finans',
|
||
'nav.accounting': 'Muhasebe',
|
||
'nav.audit': 'Denetim Günlüğü',
|
||
'nav.kb': 'Bilgi Bankası',
|
||
'nav.api': 'API & Webhook',
|
||
'nav.settings': 'Eklentiler',
|
||
'nav.setup': 'Kurulum Sihirbazı',
|
||
'nav.settings_global': 'Ayarlar',
|
||
'common.search': 'Ara…',
|
||
'common.new': 'Yeni',
|
||
'common.save': 'Kaydet',
|
||
'common.cancel': 'İptal',
|
||
'common.close': 'Kapat',
|
||
'common.all': 'Tümü',
|
||
'common.status': 'Durum',
|
||
'common.actions': 'İşlem',
|
||
'common.date': 'Tarih',
|
||
'common.amount': 'Tutar',
|
||
'common.customer': 'Müşteri',
|
||
'common.loading': 'Yükleniyor…',
|
||
'kpi.pipelineValue': 'Açık Pipeline',
|
||
'kpi.wonDeals': 'Kazanılan Anlaşmalar',
|
||
'kpi.pendingLeads': 'İncelemede Adaylar',
|
||
'kpi.openProjects': 'Aktif Projeler',
|
||
'kpi.activeLicenses': 'Aktif Lisanslar',
|
||
'kpi.outstanding': 'Açık Alacaklar',
|
||
'kpi.team': 'Ekip',
|
||
'footer.compliance': 'GoBD / KVKK',
|
||
'footer.selfHosted': 'self-hosted',
|
||
'footer.version': 'Sürüm',
|
||
'portal.title': 'Müşteri Portalı',
|
||
'portal.selectCompany': 'Şirketinizi seçin',
|
||
'portal.isolated': 'proje kapsamlı erişim',
|
||
}
|
||
|
||
const DICTS: Record<Locale, Dict> = { de, en, tr }
|
||
|
||
export function translate(key: string, locale: Locale): string {
|
||
return DICTS[locale]?.[key] ?? DICTS.de[key] ?? key
|
||
}
|