diff --git a/api/graphql/generated.go b/api/graphql/generated.go index 7c02b830..93539f96 100644 --- a/api/graphql/generated.go +++ b/api/graphql/generated.go @@ -1849,6 +1849,7 @@ enum LanguageTranslation { Danish, Spanish, Polish, + German, } type UserPreferences { diff --git a/api/graphql/models/generated.go b/api/graphql/models/generated.go index 79c81d3f..4741dd70 100644 --- a/api/graphql/models/generated.go +++ b/api/graphql/models/generated.go @@ -78,6 +78,7 @@ const ( LanguageTranslationDanish LanguageTranslation = "Danish" LanguageTranslationSpanish LanguageTranslation = "Spanish" LanguageTranslationPolish LanguageTranslation = "Polish" + LanguageTranslationGerman LanguageTranslation = "German" ) var AllLanguageTranslation = []LanguageTranslation{ @@ -88,11 +89,12 @@ var AllLanguageTranslation = []LanguageTranslation{ LanguageTranslationDanish, LanguageTranslationSpanish, LanguageTranslationPolish, + LanguageTranslationGerman, } func (e LanguageTranslation) IsValid() bool { switch e { - case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish, LanguageTranslationSpanish, LanguageTranslationPolish: + case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish, LanguageTranslationSpanish, LanguageTranslationPolish, LanguageTranslationGerman: return true } return false diff --git a/api/graphql/schema.graphql b/api/graphql/schema.graphql index 86686ff6..89e08244 100644 --- a/api/graphql/schema.graphql +++ b/api/graphql/schema.graphql @@ -229,6 +229,7 @@ enum LanguageTranslation { Danish, Spanish, Polish, + German, } type UserPreferences { diff --git a/ui/__generated__/globalTypes.ts b/ui/__generated__/globalTypes.ts index 3d05a575..ad705708 100644 --- a/ui/__generated__/globalTypes.ts +++ b/ui/__generated__/globalTypes.ts @@ -11,6 +11,7 @@ export enum LanguageTranslation { Danish = 'Danish', English = 'English', French = 'French', + German = 'German', Italian = 'Italian', Polish = 'Polish', Spanish = 'Spanish', diff --git a/ui/babel.config.js b/ui/babel.config.js index a1f44813..6a120520 100644 --- a/ui/babel.config.js +++ b/ui/babel.config.js @@ -13,7 +13,7 @@ module.exports = function (api) { plugins.push([ 'i18next-extract', { - locales: ['en', 'da', 'fr', 'sv', 'es', 'it', 'pl'], + locales: ['en', 'da', 'fr', 'sv', 'es', 'it', 'pl', 'de'], defaultValue: null, }, ]) diff --git a/ui/extractedTranslations/de/translation.json b/ui/extractedTranslations/de/translation.json new file mode 100644 index 00000000..4be024b9 --- /dev/null +++ b/ui/extractedTranslations/de/translation.json @@ -0,0 +1,254 @@ +{ + "album_filter": { + "only_favorites": "Nur Favoriten anzeigen", + "sort_by": "Sortieren nach", + "sorting_options": { + "date_imported": "Importdatum", + "date_shot": "Aufnahmedatum", + "title": "Titel", + "type": "Typ" + } + }, + "albums_page": { + "title": "Alben" + }, + "general": { + "action": { + "add": "Hinzufügen", + "cancel": "Abbrechen", + "delete": "Löschen", + "more": "Mehr", + "remove": "Entfernen", + "save": "Speichern" + }, + "loading": { + "album": "Lade Album", + "default": "Lade...", + "media": "Lade Medien", + "page": "Lade Seite", + "paginate": { + "faces": "Lade mehr Personen", + "media": "Lade mehr Medien" + }, + "shares": "Lade Freigaben...", + "timeline": "Lade Timeline" + } + }, + "header": { + "search": { + "loading": "Lade Ergebnisse...", + "no_results": "Keine Ergebnisse gefunden", + "placeholder": "Suche", + "result_type": { + "albums": "Alben", + "photos": "Fotos" + } + } + }, + "login_page": { + "field": { + "password": "Passwort", + "submit": "Einloggen", + "username": "Benutzername" + }, + "initial_setup": { + "field": { + "photo_path": { + "label": "Foto Pfad", + "placeholder": "/pfad/zu/fotos" + }, + "submit": "Photoview einrichten" + }, + "title": "Einrichtung" + }, + "welcome": "Willkommen zu Photoview" + }, + "meta": { + "description": "Einfache und nutzerfreundliche Fotogallerie für Homeserver" + }, + "people_page": { + "face_group": { + "label_placeholder": "Zuordnung", + "unlabeled": "Nicht zugeordnet" + }, + "recognize_unlabeled_faces_button": "Nicht zugeordnete Gesichter erkennen" + }, + "photos_page": { + "title": "Fotos" + }, + "places_page": { + "title": "Orte" + }, + "routes": { + "page_not_found": "Seite nicht gefunden" + }, + "settings": { + "concurrent_workers": { + "description": "Die maximale erlaubte Anzahl an gleichzeitig laufenden Scanner Jobs", + "title": "Anzahl an Workern" + }, + "logout": "Ausloggen", + "periodic_scanner": { + "checkbox_label": "Kontinuierlichen Scanner aktivieren", + "field": { + "description": "Intervall, in dem automatische Scans aller Nutzer wiederholt werden", + "label": "Intervall - kontinuierlicher Scanner" + }, + "interval_unit": { + "days": "Tage", + "hour": "Stunden", + "minutes": "Minuten", + "months": "Monate", + "seconds": "Sekunden" + }, + "title": "Kontinuierlicher Scanner" + }, + "scanner": { + "description": "Neue und aktualisierte Medien aller Benutzer scannen", + "scan_all_users": "Alle Benutzer scannen", + "title": "Scanner" + }, + "user_preferences": { + "change_language": { + "description": "Ändert die Spracheinstellungen der Website für diesen Benutzer", + "label": "Sprache" + }, + "language_selector": { + "placeholder": "Sprache auswählen" + }, + "title": "Persönliche Einstelungen" + }, + "users": { + "add_user": { + "submit": "Benutzer hinzufügen" + }, + "confirm_delete_user": { + "action": "Lösche {{user}}", + "description": "<0>Du bist dabei, den Nutzer <1> endgültig zu löschen.

Diese Aktion kann nicht rückgängig gemacht werden. Bist du sicher?

", + "title": "Benutzer löschen" + }, + "password_reset": { + "description": "Passwort von Benutzer <1> aktualisieren", + "form": { + "label": "Neues Passwort", + "placeholder": "Passwort", + "submit": "Passwört aktualisieren" + }, + "title": "Passwort aktualisieren" + }, + "table": { + "column_names": { + "action": "Aktion", + "admin": "Administrator", + "photo_path": "Pfad der Medien", + "username": "Benutzername" + }, + "new_user": "Neuer Benutzer", + "row": { + "action": { + "change_password": "Passwort aktualisieren", + "delete": "Löschen", + "edit": "Bearbeiten", + "scan": "Scannen" + } + } + }, + "title": "Benutzer" + } + }, + "share_page": { + "media": { + "title": "Freigegebene Medien" + }, + "protected_share": { + "description": "Diese Freigabe ist passwortgeschützt.", + "title": "Passwortgeschützte Freigabe" + }, + "share_not_found": "Freigabe nicht gefunden", + "share_not_found_description": "Möglicherweise ist die Freigabe abgelaufen oder wurde gelöscht.", + "wrong_password": "Falsches Passwort, bitte erneut probieren." + }, + "sidebar": { + "album": { + "title": "Album Optionen" + }, + "download": { + "filesize": { + "byte": "{{count}} Byte", + "byte_plural": "{{count}} Bytes", + "giga_byte": "{{count}} GB", + "kilo_byte": "{{count}} KB", + "mega_byte": "{{count}} MB", + "tera_byte": "{{count}} TB" + }, + "table_columns": { + "dimensions": "Dimension", + "file_size": "Dateigröße", + "file_type": "Typ", + "name": "Name" + }, + "title": "Download" + }, + "media": { + "exif": { + "exposure_program": { + "action_program": "Action (kurze Verschlusszeit)", + "aperture_priority": "Blende Priorität", + "bulb": "Glühbirne", + "creative_program": "Creative (lange Verschlusszeit)", + "landscape_mode": "Querformat", + "manual": "Manuell", + "normal_program": "Normalprogramm", + "not_defined": "Nicht definiert", + "portrait_mode": "Hochformat", + "shutter_priority": "Verschlusszeit Priorität" + }, + "flash": { + "auto": "Auto", + "did_not_fire": "Nicht gezündet", + "fired": "Gezündet", + "no_flash": "Kein Blitz", + "no_flash_function": "Keine Blitz Funktionalität", + "off": "Aus", + "on": "An", + "red_eye_reduction": "Rote-Augen-Korrektur", + "return_detected": "Reflektion erkannt", + "return_not_detected": "Reflektion nicht erkannt" + }, + "name": { + "aperture": "Blende", + "camera": "Kamera", + "date_shot": "Aufnahmedatum", + "exposure": "Belichtung", + "exposure_program": "Programm", + "flash": "Blitz", + "focal_length": "Brennweite", + "iso": "ISO", + "lens": "Objektiv", + "maker": "Hersteller" + } + } + }, + "sharing": { + "add_share": "Freigabe hinzufügen", + "copy_link": "Link kopieren", + "no_shares_found": "Keine Freigaben gefunden", + "public_link": "Öffentlicher Link", + "table_header": "Öffentliche Freigabe", + "title": "Freigabeoptionen" + } + }, + "sidemenu": { + "albums": "Alben", + "people": "Personen", + "photos": "Fotos", + "places": "Orte", + "settings": "Einstellungen" + }, + "title": { + "loading_album": "Lade Album", + "login": "Login", + "people": "Personen", + "settings": "Einstellungen" + } +} diff --git a/ui/src/Pages/SettingsPage/UserPreferences.tsx b/ui/src/Pages/SettingsPage/UserPreferences.tsx index d7caccca..e573fb80 100644 --- a/ui/src/Pages/SettingsPage/UserPreferences.tsx +++ b/ui/src/Pages/SettingsPage/UserPreferences.tsx @@ -24,6 +24,7 @@ const languagePreferences = [ { key: 5, text: 'Español', flag: 'es', value: LanguageTranslation.Spanish }, { key: 6, text: 'polski', flag: 'pl', value: LanguageTranslation.Polish }, { key: 7, text: 'Italiano', flag: 'it', value: LanguageTranslation.Italian }, + { key: 8, text: 'Deutsch', flag: 'de', value: LanguageTranslation.German }, ] const CHANGE_USER_PREFERENCES = gql` diff --git a/ui/src/localization.ts b/ui/src/localization.ts index 4f6cba06..6d1b640c 100644 --- a/ui/src/localization.ts +++ b/ui/src/localization.ts @@ -100,6 +100,12 @@ export const loadTranslations = () => { i18n.changeLanguage('pl') }) return + case LanguageTranslation.German: + import('../extractedTranslations/de/translation.json').then(german => { + i18n.addResourceBundle('de', 'translation', german) + i18n.changeLanguage('de') + }) + return } exhaustiveCheck(language)