Skip to content

Commit 7b2ec11

Browse files
authored
Merge pull request #33 from chbndrhnns/i18n
Add german translation
2 parents d6a4a1b + 02a90da commit 7b2ec11

File tree

8 files changed

+266
-0
lines changed

8 files changed

+266
-0
lines changed

backend/src/i18n/locales/de.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"invoiceTitle": "Rechnung",
3+
"invoiceNumberLabel": "Rechnungsnummer",
4+
"invoiceNumberShortLabel": "Rechnung #",
5+
"invoiceDateLabel": "Rechnungsdatum",
6+
"dateLabel": "Datum",
7+
"dueDateLabel": "Fällig am",
8+
"dueShortLabel": "Fällig",
9+
"referenceLabel": "Referenz",
10+
"billToHeading": "Rechnung an",
11+
"itemsHeading": "Rechnungsdetails",
12+
"itemHeaderDescription": "Beschreibung",
13+
"itemHeaderQuantity": "Menge",
14+
"itemHeaderQuantityShort": "Menge",
15+
"itemHeaderUnitPrice": "Einzelpreis",
16+
"itemHeaderUnitPriceShort": "Preis",
17+
"itemHeaderAmount": "Betrag",
18+
"itemHeaderTax": "Steuer",
19+
"summaryHeading": "Rechnungsübersicht",
20+
"subtotalLabel": "Zwischensumme",
21+
"discountLabel": "Rabatt",
22+
"taxLabel": "Steuer",
23+
"totalLabel": "Gesamt",
24+
"statusLabel": "Status",
25+
"taxSummaryHeading": "Steuerübersicht",
26+
"taxableLabel": "Steuerpflichtig",
27+
"taxAmountLabel": "Steuerbetrag",
28+
"taxIdLabel": "Steuer-ID",
29+
"outstandingBalanceLabel": "Offener Saldo",
30+
"paymentInformationHeading": "Zahlungsinformationen",
31+
"paymentMethodsLabel": "Zahlungsmethoden",
32+
"paymentMethodsPrefix": "Methoden:",
33+
"bankAccountLabel": "Bankkonto",
34+
"bankAccountPrefix": "Bank:",
35+
"paymentTermsLabel": "Zahlungsbedingungen",
36+
"notesHeading": "Notizen",
37+
"thankYouNote": "Vielen Dank für Ihr Vertrauen!"
38+
}

backend/src/i18n/translations.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import enRaw from "./locales/en.json" with { type: "json" };
22
import nlRaw from "./locales/nl.json" with { type: "json" };
3+
import deRaw from "./locales/de.json" with { type: "json" };
34

45
export type InvoiceLabels = {
56
invoiceTitle: string;
@@ -95,6 +96,7 @@ function coerceLabels(locale: string, raw: unknown): InvoiceLabels {
9596
const catalogs: Record<string, InvoiceLabels> = Object.freeze({
9697
en: coerceLabels("en", enRaw),
9798
nl: coerceLabels("nl", nlRaw),
99+
de: coerceLabels("de", deRaw),
98100
});
99101

100102
function normalizeLocale(locale?: string): string {

frontend/components/settings.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ export default function SettingsPage(props: PageProps<Data & { demoMode: boolean
190190
const localeOptions = [
191191
{ value: "en", label: "English" },
192192
{ value: "nl", label: "Nederlands" },
193+
{ value: "de", label: "Deutsch" },
193194
];
194195
// Use demoMode from backend /demo-mode route
195196
const demoMode = props.data.demoMode;

frontend/i18n/locales/de.json

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
{
2+
"Invio": "Invio",
3+
"Dashboard": "Übersicht",
4+
"Invoices": "Rechnungen",
5+
"Customers": "Kunden",
6+
"Settings": "Einstellungen",
7+
"Logout": "Abmelden",
8+
"New Invoice": "Neue Rechnung",
9+
"New Customer": "Neuer Kunde",
10+
"Create Customer": "Kunden anlegen",
11+
"Address": "Adresse",
12+
"City": "Stadt",
13+
"Postal Code": "Postleitzahl",
14+
"Create Invoice": "Rechnung erstellen",
15+
"Edit Invoice": "Rechnung bearbeiten",
16+
"Cancel": "Abbrechen",
17+
"Save": "Speichern",
18+
"Select customer": "Kunden auswählen",
19+
"Invoice Number": "Rechnungsnummer",
20+
"Invoice number placeholder": "z. B. INV-2025-001",
21+
"Invoice number already exists": "Rechnungsnummer ist bereits vergeben",
22+
"Issue Date": "Rechnungsdatum",
23+
"Due Date": "Fälligkeitsdatum",
24+
"Items": "Positionen",
25+
"Ctrl+Enter to add": "Strg+Enter zum Hinzufügen",
26+
"Add item": "Position hinzufügen",
27+
"Add at least one item with a description.": "Fügen Sie mindestens eine Position mit Beschreibung hinzu.",
28+
"Description": "Beschreibung",
29+
"Quantity": "Menge",
30+
"Price": "Preis",
31+
"Tax %": "MwSt %",
32+
"Notes": "Notizen",
33+
"Drag to reorder": "Zum Neuordnen ziehen",
34+
"Remove item": "Position entfernen",
35+
"Per-line tax rate (%)": "Steuersatz pro Zeile (%)",
36+
"Subtotal": "Zwischensumme",
37+
"Tax Mode": "Steuermodus",
38+
"Invoice total": "Rechnungssumme",
39+
"Per line": "Pro Zeile",
40+
"Tax Rate (%)": "Steuersatz (%)",
41+
"Payment terms placeholder": "z. B. Zahlbar in 30 Tagen",
42+
"Sign in": "Anmelden",
43+
"Demo credentials:": "Demo-Zugangsdaten:",
44+
"username": "Benutzername",
45+
"password": "Passwort",
46+
"Missing credentials": "Benutzername und Passwort sind erforderlich",
47+
"Invalid credentials": "Ungültige Zugangsdaten",
48+
"Server error. Please try again later.": "Serverfehler. Bitte versuchen Sie es später erneut.",
49+
"Unable to connect to server. Please check your connection and try again.": "Keine Verbindung zum Server möglich. Bitte Verbindung prüfen und erneut versuchen.",
50+
"Username": "Benutzername",
51+
"Password": "Passwort",
52+
"Login": "Anmelden",
53+
"Dashboard Overview": "Dashboard-Übersicht",
54+
"Invoices count": "Rechnungen",
55+
"Customers count": "Kunden",
56+
"Open Invoices": "Offene Rechnungen",
57+
"Version": "Version",
58+
"Total Billed": "Gesamtrechnungen",
59+
"Outstanding": "Offen",
60+
"Paid": "Bezahlt",
61+
"Draft": "Entwurf",
62+
"Sent": "Gesendet",
63+
"Overdue": "Überfällig",
64+
"Recent Invoices": "Aktuelle Rechnungen",
65+
"View all": "Alle anzeigen",
66+
"Search": "Suchen",
67+
"Customer, ID or number": "Kunde, ID oder Nummer",
68+
"Apply": "Anwenden",
69+
"Clear": "Zurücksetzen",
70+
"All": "Alle",
71+
"Invoices list summary": "Es werden {{visible}} von {{total}} Rechnungen angezeigt",
72+
"No invoices match your filters.": "Keine Rechnungen entsprechen Ihren Filtern.",
73+
"Clear filters": "Filter zurücksetzen",
74+
"No invoices yet.": "Noch keine Rechnungen.",
75+
"Create your first invoice": "Erstellen Sie Ihre erste Rechnung",
76+
"Invoice #": "Rechnung #",
77+
"Customer": "Kunde",
78+
"Name": "Name",
79+
"Date": "Datum",
80+
"Status": "Status",
81+
"Total": "Summe",
82+
"Open": "Öffnen",
83+
"Settings heading": "Einstellungen",
84+
"Demo mode warning": "Demo-Modus: Die App ist voll funktionsfähig, jedoch wird die Datenbank dieser gehosteten Instanz alle 30 Minuten zurückgesetzt. Ihre Änderungen sind nicht dauerhaft.",
85+
"Company": "Unternehmen",
86+
"Branding": "Branding",
87+
"Appearance": "Darstellung",
88+
"Templates": "Vorlagen",
89+
"Payments": "Zahlungen",
90+
"Tax": "Steuern",
91+
"Numbering": "Nummerierung",
92+
"XML Export": "XML-Export",
93+
"Export": "Export",
94+
"Localization": "Lokalisierung",
95+
"Save Changes": "Änderungen speichern",
96+
"Company Information": "Unternehmensinformationen",
97+
"Company Name": "Unternehmensname",
98+
"Currency": "Währung",
99+
"Company Address": "Unternehmensadresse",
100+
"Email": "E-Mail",
101+
"Phone": "Telefon",
102+
"Tax ID": "Steuer-ID",
103+
"Country Code (ISO alpha-2)": "Ländercode (ISO alpha-2)",
104+
"Branding Settings": "Branding-Einstellungen",
105+
"Default Template": "Standardvorlage",
106+
"Highlight Color": "Akzentfarbe",
107+
"Logo": "Logo",
108+
"Upload Logo Image": "Logo-Bild hochladen",
109+
"Select an image file to upload (PNG, JPG, SVG, etc.) - max 5MB": "Bilddatei auswählen (PNG, JPG, SVG, etc.) – max. 5 MB",
110+
"Invalid logo URL or data URI": "Ungültige Logo-URL oder Daten-URI",
111+
"Suggested accent colors from logo:": "Vorgeschlagene Akzentfarben aus dem Logo:",
112+
"Appearance heading": "Darstellung",
113+
"Theme": "Thema",
114+
"Toggle light/dark theme": "Hell-/Dunkelmodus umschalten",
115+
"Switch between Light and Dark (DaisyUI)": "Zwischen Hell und Dunkel wechseln (DaisyUI)",
116+
"Date Format": "Datumsformat",
117+
"Display dates as": "Datumsdarstellung",
118+
"Choose how dates are displayed in invoices": "Wählen Sie, wie Datumsangaben in Rechnungen dargestellt werden",
119+
"Number Formatting": "Zahlenformat",
120+
"Thousands separator": "Tausendertrennzeichen",
121+
"Controls currency formatting everywhere, including PDFs": "Steuert die Währungsformatierung überall, auch in PDFs",
122+
"Comma (1,000.00)": "Komma (1.000,00)",
123+
"Period (1.000,00)": "Punkt (1.000,00)",
124+
"Invoice Language": "Rechnungssprache",
125+
"Render invoices in": "Rechnungen darstellen in",
126+
"Applies to invoice headings and status labels": "Gilt für Rechnungstitel und Statusbezeichnungen",
127+
"English": "Englisch",
128+
"Dutch": "Niederländisch",
129+
"German": "Deutsch",
130+
"Nederlands": "Niederländisch",
131+
"Country code placeholder": "z. B. DE, AT, CH",
132+
"Professional Modern": "Professional Modern",
133+
"Minimalist Clean": "Minimalist Clean",
134+
"Logo placeholder": "https://beispiel.de/logo.png oder data:image/png;base64,...",
135+
"Logo preview alt": "Logo-Vorschau",
136+
"Localization settings heading": "Lokalisierungs-Einstellungen",
137+
"Interface language heading": "Sprache der Benutzeroberfläche",
138+
"Interface language label": "Sprache der Benutzeroberfläche auswählen",
139+
"Interface language helper": "Ändert die Sprache der Anwendungsoberfläche.",
140+
"YYYY-MM-DD (2025-01-15)": "YYYY-MM-DD (2025-01-15)",
141+
"DD.MM.YYYY (15.01.2025)": "DD.MM.YYYY (15.01.2025)",
142+
"Manage your invoice templates": "Verwalten Sie Ihre Rechnungsvorlagen",
143+
"Default": "Standard",
144+
"Set default": "Als Standard festlegen",
145+
"Update": "Aktualisieren",
146+
"Delete": "Löschen",
147+
"Built-in templates note": "Eingebaute Vorlagen sind geschützt und können nicht gelöscht werden. Aktualisieren ist für Vorlagen verfügbar, die über ein Manifest installiert wurden.",
148+
"Payment Settings": "Zahlungseinstellungen",
149+
"Payment Methods": "Zahlungsmethoden",
150+
"Bank Transfer": "Banküberweisung",
151+
"Bank Account": "Bankkonto",
152+
"Payment Terms": "Zahlungsbedingungen",
153+
"Due in 30 days": "Fällig in 30 Tagen",
154+
"Default Notes": "Standardnotizen",
155+
"Tax Settings": "Steuereinstellungen",
156+
"Default tax rate (%)": "Standardsteuersatz (%)",
157+
"Prices include tax?": "Preise inklusive Steuer?",
158+
"Rounding mode": "Rundungsmodus",
159+
"No": "Nein",
160+
"Yes": "Ja",
161+
"Round per line": "Pro Zeile runden",
162+
"Round on totals": "Auf Gesamtsumme runden",
163+
"Invoice Numbering": "Rechnungsnummerierung",
164+
"Enable advanced numbering pattern": "Erweitertes Nummerierungsmuster aktivieren",
165+
"Invoice numbering toggle helper": "Wenn deaktiviert, wird das Nummerierungsmuster ignoriert und die alte Nummerierung verwendet.",
166+
"Invoice Number Pattern": "Rechnungsnummer-Muster",
167+
"Invoice number pattern placeholder": "z. B. INV-{YYYY}-{SEQ} oder {YYYY}{MM}{SEQ}",
168+
"Invoice numbering tokens help": "Tokens: {YYYY} volles Jahr, {YY} kurzes Jahr, {MM} Monat (01-12), {DD} Tag, {DATE} = {YYYY}{MM}{DD}, {RAND4} zufällige alphanumerische 4 Zeichen, {SEQ} automatisch fortlaufende Nummer (wird jährlich zurückgesetzt, wenn {YYYY} im Muster enthalten ist). Leer lassen, um die alte Einstellung für Präfix/Jahr/Polsterung zu verwenden.",
169+
"XML Export Settings": "XML-Export-Einstellungen",
170+
"Default XML Profile": "Standard-XML-Profil",
171+
"UBL 2.1 (PEPPOL BIS)": "UBL 2.1 (PEPPOL BIS)",
172+
"Factur-X / ZUGFeRD 2.2 (BASIC)": "Factur-X / ZUGFeRD 2.2 (BASIC)",
173+
"FatturaPA 1.9": "FatturaPA 1.9",
174+
"Embed XML in PDF": "XML in PDF einbetten",
175+
"Adds selected XML as a PDF attachment": "Fügt das ausgewählte XML als PDF-Anhang hinzu",
176+
"Embed XML in HTML": "XML in HTML einbetten",
177+
"Adds selected XML as an HTML attachment": "Fügt das ausgewählte XML als HTML-Anhang hinzu",
178+
"XML profiles helper": "Profile sind derzeit nur eingebaut verfügbar. UBL 2.1 ist Standard und bevorzugt für E-Invoicing-Netzwerke (PEPPOL). Das Stub-Profil ist für interne Tests.",
179+
"Home": "Startseite",
180+
"New": "Neu",
181+
"Edit": "Bearbeiten",
182+
"HTML": "HTML",
183+
"PDF": "PDF",
184+
"Enter a manifest URL": "Manifest-URL eingeben",
185+
"Install from Manifest URL": "Aus Manifest-URL installieren",
186+
"Manifest URL placeholder": "https://.../manifest.yaml",
187+
"Install": "Installieren",
188+
"Demo mode install blocked": "Demo-Modus: Installation ist blockiert (schreibgeschützt)",
189+
"Template install failed with status {{status}}": "Vorlageninstallation fehlgeschlagen mit Status {{status}}",
190+
"Preparing export...": "Export wird vorbereitet...",
191+
"Please enter username and password.": "Bitte Benutzername und Passwort eingeben.",
192+
"Export failed with status {{status}}": "Export fehlgeschlagen mit Status {{status}}",
193+
"Export downloaded.": "Export heruntergeladen.",
194+
"Export failed: {{message}}": "Export fehlgeschlagen: {{message}}",
195+
"Export data heading": "Daten exportieren",
196+
"Export all data intro": "Exportieren Sie alle Daten als komprimiertes Archiv. Zur Bestätigung werden Sie aufgefordert, Ihre Admin-Zugangsdaten erneut einzugeben.",
197+
"Include database file": "Datenbankdatei einschließen",
198+
"Include JSON dump": "JSON-Export einschließen",
199+
"Include template assets": "Vorlagen-Assets einschließen",
200+
"Re-enter admin username": "Admin-Benutzernamen erneut eingeben",
201+
"Re-enter admin password": "Admin-Passwort erneut eingeben",
202+
"Admin username placeholder": "admin",
203+
"Admin password placeholder": "********",
204+
"Export all data": "Alle Daten exportieren",
205+
"Export disabled in demo mode": "Demo-Modus: Export ist deaktiviert (schreibgeschützt)",
206+
"Exporting...": "Export läuft...",
207+
"Copy link": "Link kopieren",
208+
"Copied!": "Kopiert!",
209+
"Are you sure?": "Sind Sie sicher?",
210+
"Add new customer": "Neuen Kunden hinzufügen",
211+
"New customer details": "Details neuer Kunde",
212+
"Inline customer helper": "Wir fügen diese Informationen automatisch zu Ihrer Kundenliste hinzu.",
213+
"Please select a customer.": "Bitte wählen Sie einen Kunden aus.",
214+
"Please enter a customer name.": "Bitte geben Sie einen Kundennamen ein.",
215+
"Click to set highlight color to {{color}}": "Klicken, um die Akzentfarbe auf {{color}} zu setzen",
216+
"Please select a valid image file.": "Bitte wählen Sie eine gültige Bilddatei.",
217+
"File size must be less than 5MB.": "Dateigröße muss kleiner als 5 MB sein.",
218+
"Dark": "Dunkel",
219+
"Light": "Hell"
220+
}

frontend/i18n/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
"Applies to invoice headings and status labels": "Applies to invoice headings and status labels",
127127
"English": "English",
128128
"Dutch": "Dutch",
129+
"German": "German",
129130
"Nederlands": "Nederlands",
130131
"Country code placeholder": "e.g. US, NL, DE",
131132
"Professional Modern": "Professional Modern",

frontend/i18n/locales/nl.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
"Applies to invoice headings and status labels": "Van toepassing op factuurtitels en statuslabels",
127127
"English": "Engels",
128128
"Dutch": "Nederlands",
129+
"German": "Duits",
129130
"Nederlands": "Nederlands",
130131
"Country code placeholder": "bijv. NL, BE, DE",
131132
"Professional Modern": "Professional Modern",

frontend/i18n/mod.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import enMessages from "./locales/en.json" with { type: "json" };
22
import nlMessages from "./locales/nl.json" with { type: "json" };
3+
import deMessages from "./locales/de.json" with { type: "json" };
34

45
export type UiMessages = Record<string, string>;
56
export type TranslateParams = Record<string, string | number>;
67

78
const catalogs: Record<string, UiMessages> = {
89
en: enMessages as UiMessages,
910
nl: nlMessages as UiMessages,
11+
de: deMessages as UiMessages,
1012
};
1113

1214
const DEFAULT_LOCALE = "en";

frontend/routes/settings.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ export default function SettingsPage(props: PageProps<Data & { demoMode: boolean
214214
const localeOptions = [
215215
{ value: "en", labelKey: "English" },
216216
{ value: "nl", labelKey: "Dutch" },
217+
{ value: "de", labelKey: "German" },
217218
];
218219
// Use demoMode from backend /demo-mode route
219220
const demoMode = props.data.demoMode;

0 commit comments

Comments
 (0)