Files
Ai/TrafagSalesExporter/Services/UiTextService.cs
T

675 lines
54 KiB
C#

namespace TrafagSalesExporter.Services;
public interface IUiTextService
{
string CurrentLanguage { get; }
event Action? Changed;
void SetLanguage(string language);
string Text(string german, string english);
}
public sealed class UiTextService : IUiTextService
{
private string _currentLanguage = "de";
private static readonly HashSet<string> SupportedLanguages = new(StringComparer.OrdinalIgnoreCase)
{
"de",
"en",
"es",
"it",
"hi"
};
private static readonly IReadOnlyDictionary<string, IReadOnlyDictionary<string, string>> Translations =
new Dictionary<string, IReadOnlyDictionary<string, string>>(StringComparer.OrdinalIgnoreCase)
{
["es"] = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["Trafag Finance/Sales Management Cockpit"] = "Trafag Cockpit de finanzas y ventas",
["Finance Cockpit"] = "Cockpit financiero",
["Finance Cockpit ist geschuetzt. Bitte separat anmelden."] = "El cockpit financiero está protegido. Inicie sesión por separado.",
["Finance-Cockpit-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in FinanceCockpitAccess konfigurieren."] = "El acceso al cockpit financiero aún no está configurado. Configure Username y PasswordHash en FinanceCockpitAccess.",
["Export Dashboard"] = "Panel de exportación",
["Management Analyse"] = "Análisis de gestión",
["Soll/Ist Vergleich"] = "Comparación real/referencia",
["Finance Schulung"] = "Formación financiera",
["Manuelle Importe"] = "Importaciones manuales",
["Admin"] = "Administración",
["Standorte"] = "Sitios",
["Transformationen"] = "Transformaciones",
["Finance Regeln"] = "Reglas financieras",
["Settings"] = "Configuración",
["Logs"] = "Registros",
["Finance sperren"] = "Bloquear finanzas",
["HR KPI (Login)"] = "KPI RR. HH. (login)",
["HR Dashboard"] = "Panel HR",
["HR KPI Schulung"] = "Formación HR KPI",
["HR KPI enthaelt sensible Personaldaten. Bitte separat anmelden."] = "HR KPI contiene datos personales sensibles. Inicie sesión por separado.",
["HR-KPI-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in HrKpiAccess konfigurieren."] = "El acceso a HR KPI aún no está configurado. Configure Username y PasswordHash en HrKpiAccess.",
["HR KPI entsperren"] = "Desbloquear HR KPI",
["HR-KPI-Anmeldung fehlgeschlagen."] = "Error al iniciar sesión en HR KPI.",
["Name"] = "Nombre",
["Passwort"] = "Contraseña",
["Finance Cockpit entsperren"] = "Desbloquear cockpit financiero",
["Finance-Jahr"] = "Año financiero",
["Finance Summary laden"] = "Cargar resumen financiero",
["Finance Summary"] = "Resumen financiero",
["Net Sales Actual"] = "Ventas netas reales",
["gefiltertes Endergebnis"] = "resultado final filtrado",
["Enthaltene Zeilen"] = "Filas incluidas",
["Finance Include = TRUE"] = "Finance Include = TRUE",
["Finance-Regeln"] = "Reglas financieras",
["Laender / Waehrungen"] = "Países / monedas",
["Summen wie im Excel-Blatt Finance Summary"] = "Totales como en la hoja Excel Finance Summary",
["Keine Finance-Summary-Daten fuer diese Filter."] = "No hay datos de resumen financiero para estos filtros.",
["Jahresvergleich mit aktuellem Filter"] = "Comparación anual con el filtro actual",
["Rohdaten Diagnose"] = "Diagnóstico de datos brutos",
["Diese Analyse ist eine Plausibilitaets- und Rohdatensicht. Fuer den verbindlichen Finance-Abgleich bitte `Soll/Ist Vergleich` oder im Endexcel die `Finance | ...`-Spalten verwenden."] = "Este análisis es una vista de plausibilidad y datos brutos. Para la reconciliación financiera vinculante, use `Comparación real/referencia` o las columnas `Finance | ...` en el Excel final.",
["Diese Regeln wirken nur auf die Finance-Sicht im zentralen Excel und im Abgleich. Rohdaten und Spaltenmapping bleiben unveraendert."] = "Estas reglas solo afectan la vista financiera en el Excel consolidado y en la reconciliación. Los datos brutos y el mapeo de columnas no cambian.",
["Finance-Cockpit-Anmeldung fehlgeschlagen."] = "Error al iniciar sesión en el cockpit financiero.",
["Alle exportieren"] = "Exportar todo",
["Zentrale Datei neu erzeugen"] = "Reconstruir archivo consolidado",
["Aktualisieren"] = "Actualizar",
["Lade..."] = "Cargando...",
["Speichern"] = "Guardar",
["Schliessen"] = "Cerrar",
["Regel hinzufuegen"] = "Añadir regla",
["Alle speichern"] = "Guardar todo",
["Code anzeigen"] = "Mostrar código",
["Land"] = "País",
["Laender"] = "Países",
["Aktiv"] = "Activo",
["Aktionen"] = "Acciones",
["Status"] = "Estado",
["Basis"] = "Base",
["Quelle"] = "Fuente",
["Schema"] = "Esquema",
["Server"] = "Servidor",
["Zeilen"] = "Filas",
["Rechnungen"] = "Facturas",
["Waehrung"] = "Moneda",
["Differenz"] = "Diferencia",
["Berechnung"] = "Cálculo",
["Varianten"] = "Variantes",
["Referenz"] = "Referencia",
["Ist 2025"] = "Real 2025",
["Ampel"] = "Estado",
["Ohne Ist"] = "Sin valores reales vacíos",
["Varianten anzeigen"] = "mostrar variantes",
["Abgrenzung"] = "Alcance",
["Wert"] = "Valor",
["Jahr"] = "Año",
["Monat"] = "Mes",
["Tag"] = "Día",
["Hinweise"] = "Notas",
["Enthalten"] = "Incluido",
["Ausgeschlossen"] = "Excluido",
["Gefiltert"] = "Filtrado",
["Global"] = "Global",
["Top Kunden"] = "Clientes principales",
["Top Produktgruppen"] = "Grupos de productos principales",
["Datenqualitaet"] = "Calidad de datos",
["Management Aussagen"] = "Declaraciones de gestión",
["Nicht umgerechnet"] = "No convertido",
["Jahreswerte"] = "Valores anuales",
["Monatswerte"] = "Valores mensuales",
["Werte nach Quelle"] = "Valores por fuente",
["Werte nach Land"] = "Valores por país",
["Rohdaten Diagnose"] = "Diagnóstico de datos brutos",
["Vorhandene Excel-Datei"] = "Archivo Excel disponible",
["Summenfeld"] = "Campo de valor",
["Anzeige-Waehrung"] = "Moneda de visualización",
["Dateien laden"] = "Cargar archivos",
["Cockpit erzeugen"] = "Crear cockpit",
["Zentrale Auswertung laden"] = "Cargar análisis central",
["Datei / SharePoint-Ordner"] = "Archivo / carpeta SharePoint",
["Letzter Upload"] = "Última carga",
["Pfad pruefen"] = "Comprobar ruta",
["Importdateien"] = "Archivos de importación",
["Anleitung"] = "Guía",
["Excel bereitstellen"] = "Preparar Excel",
["Speichern und aktivieren"] = "Guardar y activar",
["Standort exportieren"] = "Exportar sitio",
["Zentrale Excel erzeugen"] = "Crear Excel consolidado",
["Finance pruefen"] = "Comprobar finanzas",
["Datei hochladen oder SharePoint-/UNC-Pfad eintragen."] = "Cargue un archivo o introduzca una ruta de SharePoint/UNC.",
["Pfad pruefen, Standort aktiv setzen und speichern."] = "Compruebe la ruta, active el sitio y guarde.",
["Im Export Dashboard den Standort starten. Die Daten landen in CentralSalesRecords."] = "Inicie el sitio en el panel de exportación. Los datos se escriben en CentralSalesRecords.",
["Danach `Zentrale Datei neu erzeugen` ausfuehren."] = "Después ejecute `Reconstruir archivo consolidado`.",
["Im Endexcel `Finance | ...` oder im Reiter `Soll/Ist Vergleich` kontrollieren."] = "Compruebe las columnas `Finance | ...` en el Excel final o la pestaña `Comparación real/referencia`.",
["Richtige Reihenfolge"] = "Orden correcto",
["Ein Standortexport aktualisiert die Datenbasis. Die zentrale Excel muss danach neu erzeugt werden."] = "Una exportación de sitio actualiza la base de datos. Después debe reconstruirse el Excel consolidado.",
["DE bleibt fachlich offen"] = "DE sigue pendiente a nivel funcional",
["Alphaplan ist technisch importierbar. Kundenlaender und Filter fuer den offiziellen DE-Istwert muessen noch bestaetigt werden."] = "Alphaplan puede importarse técnicamente. Los países de cliente y filtros para el valor real oficial de DE aún deben confirmarse.",
["Server-Hinweis"] = "Nota del servidor",
["Der Server braucht kein Microsoft Excel. XLSX/CSV wird direkt von der Anwendung gelesen."] = "El servidor no necesita Microsoft Excel. La aplicación lee XLSX/CSV directamente.",
["Datei hochgeladen."] = "Archivo cargado.",
["Upload fehlgeschlagen"] = "Error de carga",
["Speichern fehlgeschlagen"] = "Error al guardar",
["Ueberblick"] = "Resumen",
["Fluktuation"] = "Rotación",
["Austritte"] = "Salidas",
["Austritte nach Austrittsart"] = "Salidas por tipo",
["Austritte nach Organisation"] = "Salidas por organización",
["Absenzen"] = "Ausencias",
["Absenzen nach Organisation"] = "Ausencias por organización",
["Krankheitstage"] = "Días de enfermedad",
["Absenzen je Mitarbeiter"] = "Ausencias por empleado",
["Personalnr."] = "N.º personal",
["Organisation"] = "Organización",
["Kurz"] = "Corto",
["Lang"] = "Largo",
["Gesamt"] = "Total",
["Quote"] = "Tasa",
["Zeit / Ferien"] = "Tiempo / vacaciones",
["Kritische Restferien"] = "Vacaciones restantes críticas",
["Rest"] = "Restante",
["Ausstehend"] = "Pendiente",
["Mitarbeitende"] = "Empleados",
["Datenstatus"] = "Estado de datos",
["Headcount nach Organisation"] = "Plantilla por organización",
["HR-Ampel"] = "Estado RR. HH.",
["Schwere"] = "Gravedad",
["Bereich"] = "Área",
["Pruefpunkt"] = "Comprobación",
["Anzahl"] = "Cantidad",
["Hinweis"] = "Nota",
["Gruppe"] = "Grupo",
["Hoechste Absenzen"] = "Ausencias más altas",
["Kritische GLZ-Saldi"] = "Saldos horarios críticos",
["Saldo"] = "Saldo",
["Austritt"] = "Salida",
["Austrittsart"] = "Tipo de salida",
["Ausschlussgruende"] = "Motivos de exclusión",
["Grund"] = "Motivo",
["Kostenstelle"] = "Centro de coste",
["Alter"] = "Edad",
["Dienstjahre"] = "Años de servicio",
["Typ"] = "Tipo",
["Dateistatus"] = "Estado de archivos",
["Stand"] = "Modificado",
["Rexx exportieren"] = "Exportar desde Rexx",
["Die benoetigten Rexx-Abfragen manuell herunterladen. Excel/XLSX verwenden, nicht PDF."] = "Descargue manualmente las consultas Rexx necesarias. Use Excel/XLSX, no PDF.",
["Dateien ablegen"] = "Guardar archivos",
["Downloads in den Datenordner kopieren und exakt wie unten benennen."] = "Copie las descargas en la carpeta de datos y nómbrelas exactamente como se indica abajo.",
["Cockpit laden"] = "Cargar cockpit",
["Im HR-KPI-Cockpit den Datenordner kontrollieren und Laden klicken."] = "En el cockpit HR KPI, compruebe la carpeta de datos y haga clic en Cargar.",
["Datenstatus pruefen"] = "Comprobar estado de datos",
["Im Reiter Datenstatus muessen die erwarteten Dateien gruen erscheinen."] = "En la pestaña Estado de datos, los archivos esperados deben aparecer en verde.",
["Datenordner"] = "Carpeta de datos",
["Der Standardordner ist konfigurierbar. Fuer einen anderen Ordner oben im HR-KPI-Filter den Datenordner anpassen und neu laden."] = "La carpeta predeterminada es configurable. Para usar otra carpeta, cambie la carpeta de datos en el filtro HR KPI superior y vuelva a cargar.",
["HR-Dateien enthalten Personendaten. Nicht per E-Mail weiterleiten und keine Kopien in ungeschuetzten Ordnern liegen lassen."] = "Los archivos de HR contienen datos personales. No los reenvíe por correo electrónico ni deje copias en carpetas no protegidas.",
["Neue Auswertungen im Cockpit"] = "Nuevas vistas en el cockpit",
["Managementsicht anonymisiert Personendaten fuer Fuehrungsberichte."] = "La vista de gestión anonimiza los datos personales para informes directivos.",
["Dateistatus zeigt Pfad, Zeilen, Aenderungsdatum, Alter und Frische."] = "El estado de archivos muestra ruta, filas, fecha de modificación, antigüedad y frescura.",
["HR-Ampel fasst Fluktuation, Krankheit, GLZ, Restferien und Datenqualitaet zusammen."] = "El estado HR resume rotación, enfermedad, saldo horario, vacaciones restantes y calidad de datos.",
["GLZ- und Restferien-Ampeln koennen gefiltert werden."] = "Los estados de saldo horario y vacaciones restantes pueden filtrarse.",
["Periodenvergleich zeigt die wichtigsten Vorjahreswerte, soweit Daten vorhanden sind."] = "La comparación de periodos muestra los valores clave del año anterior cuando hay datos disponibles.",
["Datenqualitaet markiert fehlende Dateien, alte Dateien und auffaellige Werte."] = "La calidad de datos marca archivos faltantes, archivos antiguos y valores llamativos.",
["Austritte werden nach Austrittsart und Organisation gruppiert."] = "Las salidas se agrupan por tipo de salida y organización.",
["Absenzen werden nach Organisation ausgewertet."] = "Las ausencias se evalúan por organización.",
["Top-Absenzen und kritische Detailtabellen helfen bei der operativen Pruefung."] = "Las ausencias principales y tablas críticas ayudan en la revisión operativa.",
["Drucken/PDF erzeugt eine weitergebbare Ansicht aus dem Browser."] = "Imprimir/PDF crea una vista compartible desde el navegador.",
["Erwartete Dateien"] = "Archivos esperados",
["Inhalt"] = "Contenido",
["Datei/Pfad"] = "Archivo/ruta",
["gefunden"] = "encontrado",
["fehlt"] = "falta",
["Source Viewer"] = "Visor de código",
["Zurueck zur Transformation"] = "Volver a transformaciones",
["Datei:"] = "Archivo:",
["Klasse:"] = "Clase:",
["bei Zeile"] = "en línea",
["Kein Dateipfad angegeben."] = "No se indicó ninguna ruta de archivo.",
["Ungueltiger Dateipfad."] = "Ruta de archivo no válida.",
["Transformer Ansicht"] = "Vista de transformaciones",
["Transformationscode"] = "Código de transformación",
["Keine Beschreibung."] = "Sin descripción.",
["Optionales Argument."] = "Argumento opcional."
},
["it"] = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["Trafag Finance/Sales Management Cockpit"] = "Cockpit Trafag finanza e vendite",
["Finance Cockpit"] = "Cockpit finance",
["Finance Cockpit ist geschuetzt. Bitte separat anmelden."] = "Il cockpit finance è protetto. Effettuare un accesso separato.",
["Finance-Cockpit-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in FinanceCockpitAccess konfigurieren."] = "L'accesso al cockpit finance non è ancora configurato. Configurare Username e PasswordHash in FinanceCockpitAccess.",
["Export Dashboard"] = "Dashboard esportazioni",
["Management Analyse"] = "Analisi di gestione",
["Soll/Ist Vergleich"] = "Confronto consuntivo/riferimento",
["Finance Schulung"] = "Formazione finance",
["Manuelle Importe"] = "Import manuali",
["Admin"] = "Amministrazione",
["Standorte"] = "Sedi",
["Transformationen"] = "Trasformazioni",
["Finance Regeln"] = "Regole finance",
["Settings"] = "Impostazioni",
["Logs"] = "Log",
["Finance sperren"] = "Blocca finance",
["HR KPI (Login)"] = "KPI HR (login)",
["HR Dashboard"] = "Dashboard HR",
["HR KPI Schulung"] = "Formazione KPI HR",
["HR KPI enthaelt sensible Personaldaten. Bitte separat anmelden."] = "HR KPI contiene dati personali sensibili. Effettuare un accesso separato.",
["HR-KPI-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in HrKpiAccess konfigurieren."] = "L'accesso a HR KPI non è ancora configurato. Configurare Username e PasswordHash in HrKpiAccess.",
["HR KPI entsperren"] = "Sblocca HR KPI",
["HR-KPI-Anmeldung fehlgeschlagen."] = "Accesso a HR KPI non riuscito.",
["Name"] = "Nome",
["Passwort"] = "Password",
["Finance Cockpit entsperren"] = "Sblocca cockpit finance",
["Finance-Jahr"] = "Anno finance",
["Finance Summary laden"] = "Carica riepilogo finance",
["Finance Summary"] = "Riepilogo finance",
["Net Sales Actual"] = "Vendite nette consuntive",
["gefiltertes Endergebnis"] = "risultato finale filtrato",
["Enthaltene Zeilen"] = "Righe incluse",
["Finance Include = TRUE"] = "Finance Include = TRUE",
["Finance-Regeln"] = "Regole finance",
["Laender / Waehrungen"] = "Paesi / valute",
["Summen wie im Excel-Blatt Finance Summary"] = "Totali come nel foglio Excel Finance Summary",
["Keine Finance-Summary-Daten fuer diese Filter."] = "Nessun dato di riepilogo finance per questi filtri.",
["Jahresvergleich mit aktuellem Filter"] = "Confronto annuale con filtro attuale",
["Rohdaten Diagnose"] = "Diagnosi dati grezzi",
["Diese Analyse ist eine Plausibilitaets- und Rohdatensicht. Fuer den verbindlichen Finance-Abgleich bitte `Soll/Ist Vergleich` oder im Endexcel die `Finance | ...`-Spalten verwenden."] = "Questa analisi è una vista di plausibilità e dati grezzi. Per la riconciliazione finance vincolante usare `Confronto consuntivo/riferimento` o le colonne `Finance | ...` nell'Excel finale.",
["Diese Regeln wirken nur auf die Finance-Sicht im zentralen Excel und im Abgleich. Rohdaten und Spaltenmapping bleiben unveraendert."] = "Queste regole agiscono solo sulla vista finance nell'Excel consolidato e nella riconciliazione. Dati grezzi e mapping colonne restano invariati.",
["Finance-Cockpit-Anmeldung fehlgeschlagen."] = "Accesso al cockpit finance non riuscito.",
["Alle exportieren"] = "Esporta tutto",
["Zentrale Datei neu erzeugen"] = "Ricrea file consolidato",
["Aktualisieren"] = "Aggiorna",
["Lade..."] = "Caricamento...",
["Speichern"] = "Salva",
["Schliessen"] = "Chiudi",
["Regel hinzufuegen"] = "Aggiungi regola",
["Alle speichern"] = "Salva tutto",
["Code anzeigen"] = "Mostra codice",
["Land"] = "Paese",
["Laender"] = "Paesi",
["Aktiv"] = "Attivo",
["Aktionen"] = "Azioni",
["Status"] = "Stato",
["Basis"] = "Base",
["Quelle"] = "Fonte",
["Schema"] = "Schema",
["Server"] = "Server",
["Zeilen"] = "Righe",
["Rechnungen"] = "Fatture",
["Waehrung"] = "Valuta",
["Differenz"] = "Differenza",
["Berechnung"] = "Calcolo",
["Varianten"] = "Varianti",
["Referenz"] = "Riferimento",
["Ist 2025"] = "Consuntivo 2025",
["Ampel"] = "Stato",
["Ohne Ist"] = "Senza consuntivi vuoti",
["Varianten anzeigen"] = "mostra varianti",
["Abgrenzung"] = "Ambito",
["Wert"] = "Valore",
["Jahr"] = "Anno",
["Monat"] = "Mese",
["Tag"] = "Giorno",
["Hinweise"] = "Note",
["Enthalten"] = "Incluso",
["Ausgeschlossen"] = "Escluso",
["Gefiltert"] = "Filtrato",
["Global"] = "Globale",
["Top Kunden"] = "Clienti principali",
["Top Produktgruppen"] = "Gruppi prodotto principali",
["Datenqualitaet"] = "Qualità dati",
["Management Aussagen"] = "Indicazioni management",
["Nicht umgerechnet"] = "Non convertito",
["Jahreswerte"] = "Valori annuali",
["Monatswerte"] = "Valori mensili",
["Werte nach Quelle"] = "Valori per fonte",
["Werte nach Land"] = "Valori per paese",
["Rohdaten Diagnose"] = "Diagnosi dati grezzi",
["Vorhandene Excel-Datei"] = "File Excel disponibile",
["Summenfeld"] = "Campo valore",
["Anzeige-Waehrung"] = "Valuta visualizzata",
["Dateien laden"] = "Carica file",
["Cockpit erzeugen"] = "Crea cockpit",
["Zentrale Auswertung laden"] = "Carica analisi centrale",
["Datei / SharePoint-Ordner"] = "File / cartella SharePoint",
["Letzter Upload"] = "Ultimo upload",
["Pfad pruefen"] = "Controlla percorso",
["Importdateien"] = "File di importazione",
["Anleitung"] = "Guida",
["Excel bereitstellen"] = "Prepara Excel",
["Speichern und aktivieren"] = "Salva e attiva",
["Standort exportieren"] = "Esporta sede",
["Zentrale Excel erzeugen"] = "Crea Excel consolidato",
["Finance pruefen"] = "Controlla finance",
["Datei hochladen oder SharePoint-/UNC-Pfad eintragen."] = "Caricare un file o inserire un percorso SharePoint/UNC.",
["Pfad pruefen, Standort aktiv setzen und speichern."] = "Controllare il percorso, attivare la sede e salvare.",
["Im Export Dashboard den Standort starten. Die Daten landen in CentralSalesRecords."] = "Avviare la sede nel dashboard esportazioni. I dati vengono scritti in CentralSalesRecords.",
["Danach `Zentrale Datei neu erzeugen` ausfuehren."] = "Poi eseguire `Ricrea file consolidato`.",
["Im Endexcel `Finance | ...` oder im Reiter `Soll/Ist Vergleich` kontrollieren."] = "Controllare le colonne `Finance | ...` nell'Excel finale o la scheda `Confronto consuntivo/riferimento`.",
["Richtige Reihenfolge"] = "Sequenza corretta",
["Ein Standortexport aktualisiert die Datenbasis. Die zentrale Excel muss danach neu erzeugt werden."] = "L'esportazione di una sede aggiorna la base dati. L'Excel consolidato deve poi essere ricreato.",
["DE bleibt fachlich offen"] = "DE resta aperta sul piano funzionale",
["Alphaplan ist technisch importierbar. Kundenlaender und Filter fuer den offiziellen DE-Istwert muessen noch bestaetigt werden."] = "Alphaplan è tecnicamente importabile. Paesi cliente e filtri per il valore consuntivo ufficiale DE devono ancora essere confermati.",
["Server-Hinweis"] = "Nota server",
["Der Server braucht kein Microsoft Excel. XLSX/CSV wird direkt von der Anwendung gelesen."] = "Il server non richiede Microsoft Excel. XLSX/CSV viene letto direttamente dall'applicazione.",
["Datei hochgeladen."] = "File caricato.",
["Upload fehlgeschlagen"] = "Upload non riuscito",
["Speichern fehlgeschlagen"] = "Salvataggio non riuscito",
["Ueberblick"] = "Panoramica",
["Fluktuation"] = "Turnover",
["Austritte"] = "Uscite",
["Austritte nach Austrittsart"] = "Uscite per tipo",
["Austritte nach Organisation"] = "Uscite per organizzazione",
["Absenzen"] = "Assenze",
["Absenzen nach Organisation"] = "Assenze per organizzazione",
["Krankheitstage"] = "Giorni di malattia",
["Absenzen je Mitarbeiter"] = "Assenze per collaboratore",
["Personalnr."] = "N. personale",
["Organisation"] = "Organizzazione",
["Kurz"] = "Breve",
["Lang"] = "Lungo",
["Gesamt"] = "Totale",
["Quote"] = "Tasso",
["Zeit / Ferien"] = "Tempo / ferie",
["Kritische Restferien"] = "Ferie residue critiche",
["Rest"] = "Residuo",
["Ausstehend"] = "Aperto",
["Mitarbeitende"] = "Collaboratori",
["Datenstatus"] = "Stato dati",
["Headcount nach Organisation"] = "Organico per organizzazione",
["HR-Ampel"] = "Stato HR",
["Schwere"] = "Gravità",
["Bereich"] = "Area",
["Pruefpunkt"] = "Controllo",
["Anzahl"] = "Numero",
["Hinweis"] = "Nota",
["Gruppe"] = "Gruppo",
["Hoechste Absenzen"] = "Assenze più alte",
["Kritische GLZ-Saldi"] = "Saldi orari critici",
["Saldo"] = "Saldo",
["Austritt"] = "Uscita",
["Austrittsart"] = "Tipo di uscita",
["Ausschlussgruende"] = "Motivi di esclusione",
["Grund"] = "Motivo",
["Kostenstelle"] = "Centro di costo",
["Alter"] = "Età",
["Dienstjahre"] = "Anni di servizio",
["Typ"] = "Tipo",
["Dateistatus"] = "Stato file",
["Stand"] = "Modificato",
["Rexx exportieren"] = "Esporta da Rexx",
["Die benoetigten Rexx-Abfragen manuell herunterladen. Excel/XLSX verwenden, nicht PDF."] = "Scaricare manualmente le query Rexx necessarie. Usare Excel/XLSX, non PDF.",
["Dateien ablegen"] = "Archivia file",
["Downloads in den Datenordner kopieren und exakt wie unten benennen."] = "Copiare i download nella cartella dati e denominarli esattamente come indicato sotto.",
["Cockpit laden"] = "Carica cockpit",
["Im HR-KPI-Cockpit den Datenordner kontrollieren und Laden klicken."] = "Nel cockpit HR KPI controllare la cartella dati e fare clic su Carica.",
["Datenstatus pruefen"] = "Controlla stato dati",
["Im Reiter Datenstatus muessen die erwarteten Dateien gruen erscheinen."] = "Nella scheda Stato dati i file attesi devono apparire in verde.",
["Datenordner"] = "Cartella dati",
["Der Standardordner ist konfigurierbar. Fuer einen anderen Ordner oben im HR-KPI-Filter den Datenordner anpassen und neu laden."] = "La cartella predefinita è configurabile. Per usare un'altra cartella, modificare la cartella dati nel filtro HR KPI in alto e ricaricare.",
["HR-Dateien enthalten Personendaten. Nicht per E-Mail weiterleiten und keine Kopien in ungeschuetzten Ordnern liegen lassen."] = "I file HR contengono dati personali. Non inoltrarli via e-mail e non lasciare copie in cartelle non protette.",
["Neue Auswertungen im Cockpit"] = "Nuove viste nel cockpit",
["Managementsicht anonymisiert Personendaten fuer Fuehrungsberichte."] = "La vista management anonimizza i dati personali per i report direzionali.",
["Dateistatus zeigt Pfad, Zeilen, Aenderungsdatum, Alter und Frische."] = "Lo stato file mostra percorso, righe, data modifica, età e freschezza.",
["HR-Ampel fasst Fluktuation, Krankheit, GLZ, Restferien und Datenqualitaet zusammen."] = "Lo stato HR riassume turnover, malattia, saldo orario, ferie residue e qualità dati.",
["GLZ- und Restferien-Ampeln koennen gefiltert werden."] = "Gli stati di saldo orario e ferie residue possono essere filtrati.",
["Periodenvergleich zeigt die wichtigsten Vorjahreswerte, soweit Daten vorhanden sind."] = "Il confronto periodi mostra i principali valori dell'anno precedente quando disponibili.",
["Datenqualitaet markiert fehlende Dateien, alte Dateien und auffaellige Werte."] = "La qualità dati segnala file mancanti, file vecchi e valori anomali.",
["Austritte werden nach Austrittsart und Organisation gruppiert."] = "Le uscite sono raggruppate per tipo di uscita e organizzazione.",
["Absenzen werden nach Organisation ausgewertet."] = "Le assenze sono analizzate per organizzazione.",
["Top-Absenzen und kritische Detailtabellen helfen bei der operativen Pruefung."] = "Le assenze principali e le tabelle critiche supportano il controllo operativo.",
["Drucken/PDF erzeugt eine weitergebbare Ansicht aus dem Browser."] = "Stampa/PDF crea dal browser una vista condivisibile.",
["Erwartete Dateien"] = "File attesi",
["Inhalt"] = "Contenuto",
["Datei/Pfad"] = "File/percorso",
["gefunden"] = "trovato",
["fehlt"] = "manca",
["Source Viewer"] = "Visualizzatore sorgente",
["Zurueck zur Transformation"] = "Torna alle trasformazioni",
["Datei:"] = "File:",
["Klasse:"] = "Classe:",
["bei Zeile"] = "alla riga",
["Kein Dateipfad angegeben."] = "Nessun percorso file indicato.",
["Ungueltiger Dateipfad."] = "Percorso file non valido.",
["Transformer Ansicht"] = "Vista trasformazioni",
["Transformationscode"] = "Codice trasformazione",
["Keine Beschreibung."] = "Nessuna descrizione.",
["Optionales Argument."] = "Argomento opzionale."
},
["hi"] = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["Trafag Finance/Sales Management Cockpit"] = "Trafag वित्त और बिक्री प्रबंधन कॉकपिट",
["Finance Cockpit"] = "वित्त कॉकपिट",
["Finance Cockpit ist geschuetzt. Bitte separat anmelden."] = "वित्त कॉकपिट सुरक्षित है. कृपया अलग से साइन इन करें.",
["Finance-Cockpit-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in FinanceCockpitAccess konfigurieren."] = "वित्त कॉकपिट एक्सेस अभी कॉन्फ़िगर नहीं है. कृपया FinanceCockpitAccess में Username और PasswordHash सेट करें.",
["Export Dashboard"] = "निर्यात डैशबोर्ड",
["Management Analyse"] = "प्रबंधन विश्लेषण",
["Soll/Ist Vergleich"] = "वास्तविक/संदर्भ तुलना",
["Finance Schulung"] = "वित्त प्रशिक्षण",
["Manuelle Importe"] = "मैनुअल आयात",
["Admin"] = "प्रशासन",
["Standorte"] = "साइटें",
["Transformationen"] = "रूपांतरण",
["Finance Regeln"] = "वित्त नियम",
["Settings"] = "सेटिंग्स",
["Logs"] = "लॉग",
["Finance sperren"] = "वित्त लॉक करें",
["HR KPI (Login)"] = "HR KPI (लॉगिन)",
["HR Dashboard"] = "HR डैशबोर्ड",
["HR KPI Schulung"] = "HR KPI प्रशिक्षण",
["HR KPI enthaelt sensible Personaldaten. Bitte separat anmelden."] = "HR KPI में संवेदनशील कर्मचारी डेटा है. कृपया अलग से साइन इन करें.",
["HR-KPI-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in HrKpiAccess konfigurieren."] = "HR KPI एक्सेस अभी कॉन्फ़िगर नहीं है. कृपया HrKpiAccess में Username और PasswordHash सेट करें.",
["HR KPI entsperren"] = "HR KPI अनलॉक करें",
["HR-KPI-Anmeldung fehlgeschlagen."] = "HR KPI साइन-इन विफल.",
["Name"] = "नाम",
["Passwort"] = "पासवर्ड",
["Finance Cockpit entsperren"] = "वित्त कॉकपिट अनलॉक करें",
["Finance-Jahr"] = "वित्त वर्ष",
["Finance Summary laden"] = "वित्त सारांश लोड करें",
["Finance Summary"] = "वित्त सारांश",
["Net Sales Actual"] = "वास्तविक शुद्ध बिक्री",
["gefiltertes Endergebnis"] = "फ़िल्टर किया अंतिम परिणाम",
["Enthaltene Zeilen"] = "शामिल पंक्तियां",
["Finance Include = TRUE"] = "Finance Include = TRUE",
["Finance-Regeln"] = "वित्त नियम",
["Laender / Waehrungen"] = "देश / मुद्राएं",
["Summen wie im Excel-Blatt Finance Summary"] = "Excel शीट Finance Summary जैसे कुल",
["Keine Finance-Summary-Daten fuer diese Filter."] = "इन फ़िल्टरों के लिए कोई वित्त सारांश डेटा नहीं है.",
["Jahresvergleich mit aktuellem Filter"] = "वर्तमान फ़िल्टर के साथ वार्षिक तुलना",
["Rohdaten Diagnose"] = "कच्चे डेटा का निदान",
["Diese Analyse ist eine Plausibilitaets- und Rohdatensicht. Fuer den verbindlichen Finance-Abgleich bitte `Soll/Ist Vergleich` oder im Endexcel die `Finance | ...`-Spalten verwenden."] = "यह विश्लेषण विश्वसनीयता और कच्चे डेटा की दृश्य है. बाध्यकारी वित्त मिलान के लिए `वास्तविक/संदर्भ तुलना` या अंतिम Excel में `Finance | ...` कॉलम उपयोग करें.",
["Diese Regeln wirken nur auf die Finance-Sicht im zentralen Excel und im Abgleich. Rohdaten und Spaltenmapping bleiben unveraendert."] = "ये नियम केवल केंद्रीय Excel और मिलान की वित्त दृश्य पर लागू होते हैं. कच्चा डेटा और कॉलम मैपिंग अपरिवर्तित रहते हैं.",
["Finance-Cockpit-Anmeldung fehlgeschlagen."] = "वित्त कॉकपिट साइन-इन विफल.",
["Alle exportieren"] = "सभी निर्यात करें",
["Zentrale Datei neu erzeugen"] = "केंद्रीय फ़ाइल फिर बनाएं",
["Aktualisieren"] = "ताज़ा करें",
["Lade..."] = "लोड हो रहा है...",
["Speichern"] = "सहेजें",
["Schliessen"] = "बंद करें",
["Regel hinzufuegen"] = "नियम जोड़ें",
["Alle speichern"] = "सभी सहेजें",
["Code anzeigen"] = "कोड दिखाएं",
["Land"] = "देश",
["Laender"] = "देश",
["Aktiv"] = "सक्रिय",
["Aktionen"] = "कार्रवाई",
["Status"] = "स्थिति",
["Basis"] = "आधार",
["Quelle"] = "स्रोत",
["Schema"] = "स्कीमा",
["Server"] = "सर्वर",
["Zeilen"] = "पंक्तियां",
["Rechnungen"] = "चालान",
["Waehrung"] = "मुद्रा",
["Differenz"] = "अंतर",
["Berechnung"] = "गणना",
["Varianten"] = "वेरिएंट",
["Referenz"] = "संदर्भ",
["Ist 2025"] = "वास्तविक 2025",
["Ampel"] = "स्थिति",
["Ohne Ist"] = "खाली वास्तविक मानों के बिना",
["Varianten anzeigen"] = "वेरिएंट दिखाएं",
["Abgrenzung"] = "सीमा",
["Wert"] = "मूल्य",
["Jahr"] = "वर्ष",
["Monat"] = "महीना",
["Tag"] = "दिन",
["Hinweise"] = "नोट्स",
["Enthalten"] = "शामिल",
["Ausgeschlossen"] = "बहिष्कृत",
["Gefiltert"] = "फ़िल्टर किया गया",
["Global"] = "वैश्विक",
["Top Kunden"] = "शीर्ष ग्राहक",
["Top Produktgruppen"] = "शीर्ष उत्पाद समूह",
["Datenqualitaet"] = "डेटा गुणवत्ता",
["Management Aussagen"] = "प्रबंधन कथन",
["Nicht umgerechnet"] = "परिवर्तित नहीं",
["Jahreswerte"] = "वार्षिक मान",
["Monatswerte"] = "मासिक मान",
["Werte nach Quelle"] = "स्रोत के अनुसार मान",
["Werte nach Land"] = "देश के अनुसार मान",
["Rohdaten Diagnose"] = "कच्चे डेटा का निदान",
["Vorhandene Excel-Datei"] = "उपलब्ध Excel फ़ाइल",
["Summenfeld"] = "मान फ़ील्ड",
["Anzeige-Waehrung"] = "प्रदर्शन मुद्रा",
["Dateien laden"] = "फ़ाइलें लोड करें",
["Cockpit erzeugen"] = "कॉकपिट बनाएं",
["Zentrale Auswertung laden"] = "केंद्रीय विश्लेषण लोड करें",
["Datei / SharePoint-Ordner"] = "फ़ाइल / SharePoint फ़ोल्डर",
["Letzter Upload"] = "अंतिम अपलोड",
["Pfad pruefen"] = "पथ जांचें",
["Importdateien"] = "आयात फ़ाइलें",
["Anleitung"] = "गाइड",
["Excel bereitstellen"] = "Excel तैयार करें",
["Speichern und aktivieren"] = "सहेजें और सक्रिय करें",
["Standort exportieren"] = "साइट निर्यात करें",
["Zentrale Excel erzeugen"] = "केंद्रीय Excel बनाएं",
["Finance pruefen"] = "वित्त जांचें",
["Datei hochladen oder SharePoint-/UNC-Pfad eintragen."] = "फ़ाइल अपलोड करें या SharePoint/UNC पथ दर्ज करें.",
["Pfad pruefen, Standort aktiv setzen und speichern."] = "पथ जांचें, साइट सक्रिय करें और सहेजें.",
["Im Export Dashboard den Standort starten. Die Daten landen in CentralSalesRecords."] = "निर्यात डैशबोर्ड में साइट शुरू करें. डेटा CentralSalesRecords में लिखा जाएगा.",
["Danach `Zentrale Datei neu erzeugen` ausfuehren."] = "इसके बाद `केंद्रीय फ़ाइल फिर बनाएं` चलाएं.",
["Im Endexcel `Finance | ...` oder im Reiter `Soll/Ist Vergleich` kontrollieren."] = "अंतिम Excel में `Finance | ...` कॉलम या `वास्तविक/संदर्भ तुलना` टैब जांचें.",
["Richtige Reihenfolge"] = "सही क्रम",
["Ein Standortexport aktualisiert die Datenbasis. Die zentrale Excel muss danach neu erzeugt werden."] = "साइट निर्यात डेटा आधार अपडेट करता है. इसके बाद केंद्रीय Excel फिर बनाना होगा.",
["DE bleibt fachlich offen"] = "DE कार्यात्मक रूप से अभी खुला है",
["Alphaplan ist technisch importierbar. Kundenlaender und Filter fuer den offiziellen DE-Istwert muessen noch bestaetigt werden."] = "Alphaplan तकनीकी रूप से आयात योग्य है. आधिकारिक DE वास्तविक मान के लिए ग्राहक देश और फ़िल्टर अभी पुष्टि करने हैं.",
["Server-Hinweis"] = "सर्वर नोट",
["Der Server braucht kein Microsoft Excel. XLSX/CSV wird direkt von der Anwendung gelesen."] = "सर्वर को Microsoft Excel की आवश्यकता नहीं है. एप्लिकेशन XLSX/CSV सीधे पढ़ता है.",
["Datei hochgeladen."] = "फ़ाइल अपलोड हुई.",
["Upload fehlgeschlagen"] = "अपलोड विफल",
["Speichern fehlgeschlagen"] = "सहेजना विफल",
["Ueberblick"] = "अवलोकन",
["Fluktuation"] = "टर्नओवर",
["Austritte"] = "निकास",
["Austritte nach Austrittsart"] = "निकास प्रकार के अनुसार",
["Austritte nach Organisation"] = "संगठन के अनुसार निकास",
["Absenzen"] = "अनुपस्थिति",
["Absenzen nach Organisation"] = "संगठन के अनुसार अनुपस्थिति",
["Krankheitstage"] = "बीमारी के दिन",
["Absenzen je Mitarbeiter"] = "कर्मचारी के अनुसार अनुपस्थिति",
["Personalnr."] = "कर्मचारी संख्या",
["Organisation"] = "संगठन",
["Kurz"] = "छोटा",
["Lang"] = "लंबा",
["Gesamt"] = "कुल",
["Quote"] = "दर",
["Zeit / Ferien"] = "समय / छुट्टी",
["Kritische Restferien"] = "महत्वपूर्ण बची छुट्टी",
["Rest"] = "शेष",
["Ausstehend"] = "बकाया",
["Mitarbeitende"] = "कर्मचारी",
["Datenstatus"] = "डेटा स्थिति",
["Headcount nach Organisation"] = "संगठन के अनुसार हेडकाउंट",
["HR-Ampel"] = "HR स्थिति",
["Schwere"] = "गंभीरता",
["Bereich"] = "क्षेत्र",
["Pruefpunkt"] = "जांच बिंदु",
["Anzahl"] = "संख्या",
["Hinweis"] = "नोट",
["Gruppe"] = "समूह",
["Hoechste Absenzen"] = "सबसे अधिक अनुपस्थिति",
["Kritische GLZ-Saldi"] = "महत्वपूर्ण समय शेष",
["Saldo"] = "शेष",
["Austritt"] = "निकास",
["Austrittsart"] = "निकास प्रकार",
["Ausschlussgruende"] = "बहिष्करण कारण",
["Grund"] = "कारण",
["Kostenstelle"] = "लागत केंद्र",
["Alter"] = "आयु",
["Dienstjahre"] = "सेवा वर्ष",
["Typ"] = "प्रकार",
["Dateistatus"] = "फ़ाइल स्थिति",
["Stand"] = "संशोधित",
["Rexx exportieren"] = "Rexx से निर्यात करें",
["Die benoetigten Rexx-Abfragen manuell herunterladen. Excel/XLSX verwenden, nicht PDF."] = "ज़रूरी Rexx क्वेरी मैन्युअल रूप से डाउनलोड करें. Excel/XLSX इस्तेमाल करें, PDF नहीं.",
["Dateien ablegen"] = "फ़ाइलें रखें",
["Downloads in den Datenordner kopieren und exakt wie unten benennen."] = "डाउनलोड को डेटा फ़ोल्डर में कॉपी करें और नीचे दिए गए नामों से ही सहेजें.",
["Cockpit laden"] = "कॉकपिट लोड करें",
["Im HR-KPI-Cockpit den Datenordner kontrollieren und Laden klicken."] = "HR-KPI कॉकपिट में डेटा फ़ोल्डर जांचें और लोड पर क्लिक करें.",
["Datenstatus pruefen"] = "डेटा स्थिति जांचें",
["Im Reiter Datenstatus muessen die erwarteten Dateien gruen erscheinen."] = "डेटा स्थिति टैब में अपेक्षित फ़ाइलें हरी दिखनी चाहिए.",
["Datenordner"] = "डेटा फ़ोल्डर",
["Der Standardordner ist konfigurierbar. Fuer einen anderen Ordner oben im HR-KPI-Filter den Datenordner anpassen und neu laden."] = "डिफ़ॉल्ट फ़ोल्डर कॉन्फ़िगर किया जा सकता है. दूसरा फ़ोल्डर उपयोग करने के लिए ऊपर HR KPI फ़िल्टर में डेटा फ़ोल्डर बदलें और फिर लोड करें.",
["HR-Dateien enthalten Personendaten. Nicht per E-Mail weiterleiten und keine Kopien in ungeschuetzten Ordnern liegen lassen."] = "HR फ़ाइलों में व्यक्तिगत डेटा होता है. इन्हें ई-मेल से आगे न भेजें और असुरक्षित फ़ोल्डरों में कॉपी न छोड़ें.",
["Neue Auswertungen im Cockpit"] = "कॉकपिट में नई दृश्यावलियां",
["Managementsicht anonymisiert Personendaten fuer Fuehrungsberichte."] = "प्रबंधन दृश्य रिपोर्टों के लिए व्यक्तिगत डेटा को अनाम करता है.",
["Dateistatus zeigt Pfad, Zeilen, Aenderungsdatum, Alter und Frische."] = "फ़ाइल स्थिति पथ, पंक्तियां, संशोधन तिथि, आयु और ताजगी दिखाती है.",
["HR-Ampel fasst Fluktuation, Krankheit, GLZ, Restferien und Datenqualitaet zusammen."] = "HR स्थिति टर्नओवर, बीमारी, समय शेष, छुट्टी शेष और डेटा गुणवत्ता को सारांशित करती है.",
["GLZ- und Restferien-Ampeln koennen gefiltert werden."] = "समय शेष और छुट्टी शेष स्थितियों को फ़िल्टर किया जा सकता है.",
["Periodenvergleich zeigt die wichtigsten Vorjahreswerte, soweit Daten vorhanden sind."] = "अवधि तुलना उपलब्ध डेटा के अनुसार पिछले वर्ष के मुख्य मान दिखाती है.",
["Datenqualitaet markiert fehlende Dateien, alte Dateien und auffaellige Werte."] = "डेटा गुणवत्ता गुम फ़ाइलें, पुरानी फ़ाइलें और असामान्य मान चिह्नित करती है.",
["Austritte werden nach Austrittsart und Organisation gruppiert."] = "निकासों को निकास प्रकार और संगठन के अनुसार समूहित किया जाता है.",
["Absenzen werden nach Organisation ausgewertet."] = "अनुपस्थितियों का मूल्यांकन संगठन के अनुसार किया जाता है.",
["Top-Absenzen und kritische Detailtabellen helfen bei der operativen Pruefung."] = "शीर्ष अनुपस्थितियां और महत्वपूर्ण विवरण तालिकाएं संचालन जांच में मदद करती हैं.",
["Drucken/PDF erzeugt eine weitergebbare Ansicht aus dem Browser."] = "प्रिंट/PDF ब्राउज़र से साझा करने योग्य दृश्य बनाता है.",
["Erwartete Dateien"] = "अपेक्षित फ़ाइलें",
["Inhalt"] = "सामग्री",
["Datei/Pfad"] = "फ़ाइल/पथ",
["gefunden"] = "मिला",
["fehlt"] = "गुम",
["Source Viewer"] = "स्रोत दर्शक",
["Zurueck zur Transformation"] = "रूपांतरण पर वापस",
["Datei:"] = "फ़ाइल:",
["Klasse:"] = "क्लास:",
["bei Zeile"] = "पंक्ति पर",
["Kein Dateipfad angegeben."] = "कोई फ़ाइल पथ नहीं दिया गया.",
["Ungueltiger Dateipfad."] = "अमान्य फ़ाइल पथ.",
["Transformer Ansicht"] = "रूपांतरण दृश्य",
["Transformationscode"] = "रूपांतरण कोड",
["Keine Beschreibung."] = "कोई विवरण नहीं.",
["Optionales Argument."] = "वैकल्पिक तर्क."
}
};
public string CurrentLanguage => _currentLanguage;
public event Action? Changed;
public void SetLanguage(string language)
{
var normalized = NormalizeLanguage(language);
if (string.Equals(_currentLanguage, normalized, StringComparison.OrdinalIgnoreCase))
return;
_currentLanguage = normalized;
Changed?.Invoke();
}
public string Text(string german, string english)
{
if (string.Equals(_currentLanguage, "de", StringComparison.OrdinalIgnoreCase))
return german;
if (string.Equals(_currentLanguage, "en", StringComparison.OrdinalIgnoreCase))
return english;
return Translations.TryGetValue(_currentLanguage, out var languageTranslations) &&
languageTranslations.TryGetValue(german, out var translated)
? translated
: english;
}
private static string NormalizeLanguage(string language)
{
var normalized = (language ?? string.Empty).Trim().ToLowerInvariant();
if (normalized is "in" or "ind" or "india" or "hindi")
normalized = "hi";
return SupportedLanguages.Contains(normalized) ? normalized : "de";
}
}