From 6e96c732da24545ab941de3fce64e78e0c12c176 Mon Sep 17 00:00:00 2001 From: jettpackx Date: Sun, 15 Sep 2024 12:13:11 +0000 Subject: [PATCH 1/2] add features: de language support --- locales/app/de.json | 206 ++++++++++++++++++++ locales/common/de.json | 28 +++ locales/external/de.json | 42 ++++ locales/lang/de.json | 10 + locales/settings/de.json | 196 +++++++++++++++++++ locales/shortcuts/de.json | 24 +++ scripts/generate-i18n-locale.ts | 1 + src/renderer/src/@types/constants.ts | 3 +- src/renderer/src/@types/default-resource.ts | 3 + 9 files changed, 512 insertions(+), 1 deletion(-) create mode 100644 locales/app/de.json create mode 100644 locales/common/de.json create mode 100644 locales/external/de.json create mode 100644 locales/lang/de.json create mode 100644 locales/settings/de.json create mode 100644 locales/shortcuts/de.json diff --git a/locales/app/de.json b/locales/app/de.json new file mode 100644 index 0000000000..e5ef1daaea --- /dev/null +++ b/locales/app/de.json @@ -0,0 +1,206 @@ +{ + "ai_daily.title": "Top Nachrichten - {{title}}", + "ai_daily.tooltip.content": "Hier sind Nachrichten, die von der KI aus Ihrer Timeline ausgewählt wurden ( - ), die für Sie wichtig sein könnten.", + "ai_daily.tooltip.update_schedule": "Aktualisierung täglich um 8 Uhr und 20 Uhr.", + "app.copy_logo_svg": "Logo SVG kopieren", + "app.toggle_sidebar": "Seitenleiste umschalten", + "discover.any_url_or_keyword": "Jede URL oder Schlüsselwort", + "discover.default_option": " (Standard)", + "discover.feed_description": "Die Beschreibung dieses Feeds lautet wie folgt. Sie können das Parameterformular mit den relevanten Informationen ausfüllen.", + "discover.feed_maintainers": "Dieser Feed wird von RSSHub bereitgestellt, mit Dank an ", + "discover.import.click_to_upload": "Klicken Sie hier, um die OPML-Datei hochzuladen", + "discover.popular": "Beliebt", + "discover.preview": "Vorschau", + "discover.rss_hub_route": "RSSHub-Route", + "discover.rss_url": "RSS-URL", + "discover.select_placeholder": "Auswählen", + "early_access": "Früher Zugriff", + "entry_actions.copy_link": "Link kopieren", + "entry_actions.failed_to_save_to_eagle": "Speichern in Eagle fehlgeschlagen.", + "entry_actions.failed_to_save_to_instapaper": "Speichern in Instapaper fehlgeschlagen.", + "entry_actions.failed_to_save_to_readwise": "Speichern in Readwise fehlgeschlagen.", + "entry_actions.link_copied": "Link in die Zwischenablage kopiert.", + "entry_actions.mark_as_read": "Als gelesen markieren", + "entry_actions.mark_as_unread": "Als ungelesen markieren", + "entry_actions.open_in_browser": "Im Browser öffnen", + "entry_actions.save_media_to_eagle": "Medien in Eagle speichern", + "entry_actions.save_to_instapaper": "In Instapaper speichern", + "entry_actions.save_to_readwise": "In Readwise speichern", + "entry_actions.saved_to_eagle": "In Eagle gespeichert.", + "entry_actions.saved_to_instapaper": "In Instapaper gespeichert.", + "entry_actions.saved_to_readwise": "In Readwise gespeichert.", + "entry_actions.share": "Teilen", + "entry_actions.star": "Favorit", + "entry_actions.starred": "Favorisiert.", + "entry_actions.tip": "Tipp", + "entry_actions.unstar": "Entfavorisieren", + "entry_actions.unstarred": "Entfavorisiert.", + "entry_column.refreshing": "Neue Einträge werden aktualisiert...", + "entry_content.ai_summary": "KI-Zusammenfassung", + "entry_content.fetching_content": "Originalinhalt wird abgerufen und verarbeitet...", + "entry_content.header.play_tts": "TTS abspielen", + "entry_content.header.readability": "Lesbarkeit", + "entry_content.no_content": "Kein Inhalt", + "entry_content.readability_notice": "Dieser Inhalt wird von Lesbarkeit bereitgestellt. Bei typografischen Anomalien besuchen Sie bitte die Quellseite, um den Originalinhalt anzuzeigen.", + "entry_content.render_error": "Renderfehler:", + "entry_content.report_issue": "Problem melden", + "entry_content.web_app_notice": "Vielleicht unterstützt die Web-App diesen Inhaltstyp nicht. Sie können jedoch die Desktop-App herunterladen.", + "entry_list.zero_unread": "Keine ungelesenen Nachrichten", + "entry_list_header.daily_report": "Täglicher Bericht", + "entry_list_header.hide_no_image_items": "Einträge ohne Bilder ausblenden", + "entry_list_header.items": "Einträge", + "entry_list_header.new_entries_available": "Neue Einträge verfügbar", + "entry_list_header.refetch": "Erneut abrufen", + "entry_list_header.refresh": "Aktualisieren", + "entry_list_header.show_all": "Alle anzeigen", + "entry_list_header.show_all_items": "Alle Einträge anzeigen", + "entry_list_header.show_unread_only": "Nur ungelesene anzeigen", + "entry_list_header.switch_to_grid": "Zum Raster wechseln", + "entry_list_header.switch_to_masonry": "Zur Maueransicht wechseln", + "entry_list_header.unread": "ungelesen", + "feed_claim_modal.choose_verification_method": "Es gibt drei Möglichkeiten zur Auswahl, Sie können eine davon zur Verifizierung wählen.", + "feed_claim_modal.claim_button": "Beanspruchen", + "feed_claim_modal.content_instructions": "Kopieren Sie den folgenden Inhalt und posten Sie ihn in Ihren neuesten RSS-Feed.", + "feed_claim_modal.description_current": "Aktuelle Beschreibung:", + "feed_claim_modal.description_instructions": "Kopieren Sie den folgenden Inhalt und fügen Sie ihn in das -Feld Ihres RSS-Feeds ein.", + "feed_claim_modal.failed_to_load": "Beanspruchungsnachricht konnte nicht geladen werden", + "feed_claim_modal.rss_format_choice": "RSS-Generatoren haben in der Regel zwei Formate zur Auswahl. Bitte kopieren Sie das XML- und JSON-Format nach Bedarf.", + "feed_claim_modal.rss_instructions": "Kopieren Sie den untenstehenden Code und fügen Sie ihn in Ihren RSS-Generator ein.", + "feed_claim_modal.rss_json_format": "JSON-Format", + "feed_claim_modal.rss_xml_format": "XML-Format", + "feed_claim_modal.rsshub_notice": "Dieser Feed wird von RSSHub bereitgestellt und hat eine Cache-Zeit von 1 Stunde. Bitte erlauben Sie bis zu 1 Stunde, damit Änderungen nach der Veröffentlichung angezeigt werden.", + "feed_claim_modal.tab_content": "Inhalt", + "feed_claim_modal.tab_description": "Beschreibung", + "feed_claim_modal.tab_rss": "RSS-Tag", + "feed_claim_modal.verify_ownership": "Um diesen Feed als Ihren eigenen zu beanspruchen, müssen Sie die Inhaberschaft verifizieren.", + "feed_form.add_follow": "Folgen hinzufügen", + "feed_form.category": "Kategorie", + "feed_form.category_description": "Standardmäßig werden Ihre Feeds nach Website gruppiert.", + "feed_form.error_fetching_feed": "Fehler beim Abrufen des Feeds.", + "feed_form.feed_not_found": "Feed nicht gefunden.", + "feed_form.feedback": "Feedback", + "feed_form.follow": "Folgen", + "feed_form.followed": "🎉 Gefolgt.", + "feed_form.private_follow": "Privates Folgen", + "feed_form.private_follow_description": "Ob dieses Folgen öffentlich auf Ihrer Profilseite sichtbar ist.", + "feed_form.retry": "Erneut versuchen", + "feed_form.title": "Titel", + "feed_form.title_description": "Benutzerdefinierter Titel für diesen Feed. Lassen Sie es leer, um den Standardtitel zu verwenden.", + "feed_form.unfollow": "Entfolgen", + "feed_form.update": "Aktualisieren", + "feed_form.update_follow": "Folgen aktualisieren", + "feed_form.updated": "🎉 Aktualisiert.", + "feed_form.view": "Ansehen", + "feed_item.claimed_by_owner": "Dieser Feed wird beansprucht von", + "feed_item.claimed_by_unknown": "seinem Besitzer.", + "feed_item.claimed_by_you": "Von Ihnen beansprucht", + "feed_item.claimed_feed": "Beanspruchter Feed", + "feed_item.error_since": "Fehler seit", + "feed_item.not_publicly_visible": "Nicht öffentlich auf Ihrer Profilseite sichtbar", + "feed_view_type.articles": "Artikel", + "feed_view_type.audios": "Audios", + "feed_view_type.notifications": "Benachrichtigungen", + "feed_view_type.pictures": "Bilder", + "feed_view_type.social_media": "Soziale Medien", + "feed_view_type.videos": "Videos", + "mark_all_read_button.auto_confirm_info": "Wird nach 3 Sekunden automatisch bestätigt.", + "mark_all_read_button.confirm": "Bestätigen", + "mark_all_read_button.confirm_mark_all": "{{which}} als gelesen markieren?", + "mark_all_read_button.confirm_mark_all_info": "Bestätigen, dass alles als gelesen markiert wird?", + "mark_all_read_button.mark_all_as_read": "Alle als gelesen markieren", + "mark_all_read_button.mark_as_read": "{{which}} als gelesen markieren", + "mark_all_read_button.undo": "Rückgängig", + "player.back_10s": "10s zurück", + "player.close": "Schließen", + "player.download": "Herunterladen", + "player.exit_full_screen": "Vollbildmodus beenden", + "player.forward_10s": "10s vorwärts", + "player.full_screen": "Vollbild", + "player.mute": "Stumm", + "player.open_entry": "Eintrag öffnen", + "player.pause": "Pause", + "player.play": "Abspielen", + "player.playback_rate": "Wiedergabegeschwindigkeit", + "player.unmute": "Ton an", + "player.volume": "Lautstärke", + "search.empty.no_results": "Keine Ergebnisse gefunden.", + "search.group.entries": "Einträge", + "search.group.feeds": "Feeds", + "search.options.all": "Alle", + "search.options.entries": "Einträge", + "search.options.feeds": "Feeds", + "search.options.search_type": "Suchtyp", + "search.placeholder": "Suchen...", + "search.result_count_local_mode": "(Lokaler Modus)", + "search.tooltip.local_search": "Diese Suche umfasst lokal verfügbare Daten. Versuchen Sie einen erneuten Abruf, um die neuesten Daten einzuschließen.", + "shortcuts.guide.title": "Kurzanleitung", + "sidebar.category_remove_dialog.cancel": "Abbrechen", + "sidebar.category_remove_dialog.continue": "Fortsetzen", + "sidebar.category_remove_dialog.description": "Dieser Vorgang löscht Ihre Kategorie, aber die darin enthaltenen Feeds bleiben erhalten und werden nach Website gruppiert.", + "sidebar.category_remove_dialog.title": "Kategorie entfernen", + "sidebar.feed_actions.claim": "Beanspruchen", + "sidebar.feed_actions.claim_feed": "Feed beanspruchen", + "sidebar.feed_actions.copy_feed_id": "Feed-ID kopieren", + "sidebar.feed_actions.copy_feed_url": "Feed-URL kopieren", + "sidebar.feed_actions.edit": "Bearbeiten", + "sidebar.feed_actions.edit_feed": "Feed bearbeiten", + "sidebar.feed_actions.feed_owned_by_you": "Dieser Feed gehört Ihnen", + "sidebar.feed_actions.mark_all_as_read": "Alle als gelesen markieren", + "sidebar.feed_actions.navigate_to_feed": "Zum Feed navigieren", + "sidebar.feed_actions.open_feed_in_browser": "Feed im Browser öffnen", + "sidebar.feed_actions.open_site_in_browser": "Seite im Browser öffnen", + "sidebar.feed_actions.unfollow": "Entfolgen", + "sidebar.feed_actions.unfollow_feed": "Feed entfolgen", + "sidebar.feed_column.context_menu.change_to_other_view": "Zu anderer Ansicht wechseln", + "sidebar.feed_column.context_menu.delete_category": "Kategorie löschen", + "sidebar.feed_column.context_menu.delete_category_confirmation": "Kategorie {{folderName}} löschen?", + "sidebar.feed_column.context_menu.mark_as_read": "Als gelesen markieren", + "sidebar.feed_column.context_menu.rename_category": "Kategorie umbenennen", + "sidebar.select_sort_method": "Sortiermethode auswählen", + "signin.continue_with_github": "Mit GitHub fortfahren", + "signin.continue_with_google": "Mit Google fortfahren", + "signin.sign_in_to": "Anmelden bei", + "sync_indicator.disabled": "Aus Sicherheitsgründen ist die Synchronisation deaktiviert.", + "sync_indicator.offline": "Offline", + "sync_indicator.synced": "Mit Server synchronisiert", + "tip_modal.amount": "Betrag", + "tip_modal.claim_feed": "Diesen Feed beanspruchen", + "tip_modal.create_wallet": "Kostenlos erstellen", + "tip_modal.feed_owner": "Feed-Besitzer", + "tip_modal.low_balance": "Ihr Guthaben reicht nicht aus, um diesen Tipp zu senden. Bitte passen Sie den Betrag an.", + "tip_modal.no_wallet": "Sie haben noch kein Wallet. Bitte erstellen Sie ein Wallet, um einen Tipp zu geben.", + "tip_modal.tip_amount_sent": "wurde an den Autor gesendet.", + "tip_modal.tip_now": "Jetzt einen Tipp geben", + "tip_modal.tip_sent": "Tipp erfolgreich gesendet! Vielen Dank für Ihre Unterstützung.", + "tip_modal.tip_support": "⭐ Geben Sie einen Tipp, um Ihre Unterstützung zu zeigen!", + "tip_modal.unclaimed_feed": "Dieser Feed wurde noch von niemandem beansprucht. Der erhaltene Power wird sicher im Blockchain-Vertrag gehalten, bis er beansprucht wird.", + "user_button.account": "Konto", + "user_button.download_desktop_app": "Desktop-App herunterladen", + "user_button.log_out": "Abmelden", + "user_button.power": "Power", + "user_button.preferences": "Einstellungen", + "user_button.profile": "Profil", + "user_profile.close": "Schließen", + "user_profile.edit": "Bearbeiten", + "user_profile.loading": "Laden", + "user_profile.share": "Teilen", + "user_profile.toggle_item_style": "Artikelstil umschalten", + "words.add": "Hinzufügen", + "words.confirm": "Bestätigen", + "words.discover": "Entdecken", + "words.email": "E-Mail", + "words.import": "Importieren", + "words.items": "Einträge", + "words.language": "Sprache", + "words.load_archived_entries": "Archivierte Einträge laden", + "words.login": "Anmelden", + "words.rss": "RSS", + "words.rss3": "RSS3", + "words.rsshub": "RSSHub", + "words.search": "Suchen", + "words.starred": "Favorisiert", + "words.unread": "Ungelesen", + "words.user": "Benutzer", + "words.which.all": "alle", + "words.zero_items": "Keine Einträge" +} diff --git a/locales/common/de.json b/locales/common/de.json new file mode 100644 index 0000000000..fabe9e645e --- /dev/null +++ b/locales/common/de.json @@ -0,0 +1,28 @@ +{ + "app.copied_to_clipboard": "In die Zwischenablage kopiert", + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "ok": "OK", + "quantifier.piece": "", + "time.last_night": "Letzte Nacht", + "time.the_night_before_last": "Vorgestern Nacht", + "time.today": "Heute", + "time.yesterday": "Gestern", + "tips.load-lng-error": "Laden des Sprachpakets fehlgeschlagen", + "words.back": "Zurück", + "words.copy": "Kopieren", + "words.edit": "Bearbeiten", + "words.entry": "Eintrag", + "words.id": "ID", + "words.items_one": "Element", + "words.items_other": "Elemente", + "words.local": "lokal", + "words.record": "Aufzeichnung", + "words.record_one": "Aufzeichnung", + "words.record_other": "Aufzeichnungen", + "words.result": "Ergebnis", + "words.result_one": "Ergebnis", + "words.result_other": "Ergebnisse", + "words.space": " ", + "words.which.all": "Alle" +} diff --git a/locales/external/de.json b/locales/external/de.json new file mode 100644 index 0000000000..a105cf79cc --- /dev/null +++ b/locales/external/de.json @@ -0,0 +1,42 @@ +{ + "feed": { + "follow_one": "Folgen", + "follow_other": "Follows", + "followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} mit {{readCount}} {{readNoun}} auf {{appName}}", + "read_one": "Lesen", + "read_other": "Lesungen" + }, + "header": { + "app": "App", + "download": "Herunterladen" + }, + "invitation": { + "activate": "Aktivieren", + "codeOptions": { + "1": "Suche nach einem Alpha-Testbenutzer, der dich einlädt.", + "2": "Treten Sie unserem Discord-Server bei, um gelegentliche Giveaways zu erhalten.", + "3": "Folgen Sie unserem X-Konto für gelegentliche Giveaways." + }, + "earlyAccess": "Follow befindet sich derzeit in der Early-Access-Phase und erfordert einen Einladungscode.", + "earlyAccessMessage": "😰 Entschuldigung, Follow befindet sich derzeit in der Early-Access-Phase und erfordert einen Einladungscode.", + "generateButton": "Neuen Code generieren", + "generateCost": "Sie können {{INVITATION_PRICE}} Power ausgeben, um einen Einladungscode für Ihre Freunde zu generieren.", + "getCodeMessage": "Sie können auf folgende Weise einen Einladungscode erhalten:", + "title": "Einladungscode" + }, + "login": { + "backToWebApp": "Zurück zur Web-App", + "continueWithGitHub": "Mit GitHub fortfahren", + "continueWithGoogle": "Mit Google fortfahren", + "logInTo": "Anmelden bei ", + "openApp": "App öffnen", + "redirecting": "Weiterleitung", + "welcomeTo": "Willkommen bei " + }, + "redirect": { + "continueInBrowser": "Im Browser fortfahren", + "instruction": "Jetzt ist es an der Zeit, {{APP_NAME}} zu öffnen und diese Seite sicher zu schließen.", + "openApp": "{{APP_NAME}} öffnen", + "successMessage": "Sie haben sich erfolgreich mit dem {{APP_NAME}}-Konto verbunden." + } +} diff --git a/locales/lang/de.json b/locales/lang/de.json new file mode 100644 index 0000000000..31712565ef --- /dev/null +++ b/locales/lang/de.json @@ -0,0 +1,10 @@ +{ + "langs.de": "Deutsch", + "langs.en": "English", + "langs.fr": "Français", + "langs.ja": "日本語", + "langs.pt": "Português", + "langs.zh-CN": "简体中文", + "langs.zh-TW": "繁體中文", + "name": "Deutsch" +} diff --git a/locales/settings/de.json b/locales/settings/de.json new file mode 100644 index 0000000000..5ca6d6179f --- /dev/null +++ b/locales/settings/de.json @@ -0,0 +1,196 @@ +{ + "about.changelog": "Änderungsprotokoll", + "about.feedbackInfo": "{{appName}} ({{commitSha}}) befindet sich in der frühen Entwicklungsphase. Wenn Sie Feedback oder Vorschläge haben, öffnen Sie ein Issue auf unserer GitHub-Seite.", + "about.iconLibrary": "Die verwendete Symbolbibliothek ist urheberrechtlich geschützt von und darf nicht weitervertrieben werden.", + "about.licenseInfo": "{{appName}} ist und wird immer ein freies und quelloffenes Projekt sein. Es steht unter der Lizenz {{license}}.", + "about.sidebar_title": "Über", + "about.socialMedia": "Soziale Medien", + "actions.actionName": "Aktion {{number}}", + "actions.action_card.add": "Hinzufügen", + "actions.action_card.all": "Alle", + "actions.action_card.block_rules": "Blockregeln", + "actions.action_card.custom_filters": "Benutzerdefinierte Filter", + "actions.action_card.enable_readability": "Lesbarkeit aktivieren", + "actions.action_card.entry_options.all": "Alle", + "actions.action_card.entry_options.author": "Autor", + "actions.action_card.entry_options.content": "Inhalt", + "actions.action_card.entry_options.order": "Reihenfolge", + "actions.action_card.entry_options.title": "Titel", + "actions.action_card.entry_options.url": "URL", + "actions.action_card.feed_options.category": "Kategorie", + "actions.action_card.feed_options.feed_url": "Feed-URL", + "actions.action_card.feed_options.site_url": "Seiten-URL", + "actions.action_card.feed_options.title": "Titel", + "actions.action_card.feed_options.view": "Ansicht", + "actions.action_card.field": "Feld", + "actions.action_card.from": "Von", + "actions.action_card.generate_summary": "Zusammenfassung mit KI generieren", + "actions.action_card.name": "Name", + "actions.action_card.operation_options.contains": "enthält", + "actions.action_card.operation_options.does_not_contain": "enthält nicht", + "actions.action_card.operation_options.is_equal_to": "ist gleich", + "actions.action_card.operation_options.is_greater_than": "ist größer als", + "actions.action_card.operation_options.is_less_than": "ist kleiner als", + "actions.action_card.operation_options.is_not_equal_to": "ist nicht gleich", + "actions.action_card.operation_options.matches_regex": "entspricht Regex", + "actions.action_card.operator": "Operator", + "actions.action_card.rewrite_rules": "Umschreibregeln", + "actions.action_card.then_do": "Dann mache…", + "actions.action_card.to": "Zu", + "actions.action_card.translate_into": "Übersetzen in", + "actions.action_card.value": "Wert", + "actions.action_card.when_feeds_match": "Wenn Feeds übereinstimmen…", + "actions.newRule": "Neue Regel", + "actions.save": "Speichern", + "actions.saveSuccess": "🎉 Aktionen gespeichert.", + "actions.sidebar_title": "Aktionen", + "actions.title": "Aktionen", + "appearance.code_highlight_theme": "Code-Hervorhebungsthema", + "appearance.content": "Inhalt", + "appearance.content_font": "Inhalts-Schriftart", + "appearance.custom_font": "Benutzerdefinierte Schriftart", + "appearance.fonts": "Schriftarten", + "appearance.general": "Allgemein", + "appearance.guess_code_language.description": "Wichtige Programmiersprachen, die Modelle verwenden, um nicht gekennzeichnete Codeblöcke zu erkennen", + "appearance.guess_code_language.label": "Code-Sprache erraten", + "appearance.misc": "Sonstiges", + "appearance.modal_overlay.description": "Modales Overlay anzeigen", + "appearance.modal_overlay.label": "Modales Overlay anzeigen", + "appearance.opaque_sidebars.label": "Opake Seitenleisten", + "appearance.reader_render_inline_style.description": "Ermöglicht das Rendern des Inline-Stils des ursprünglichen HTML.", + "appearance.reader_render_inline_style.label": "Inline-Stil rendern", + "appearance.reduce_motion.description": "Reduziert die Bewegung von Elementen, um die Leistung zu verbessern und den Energieverbrauch zu senken", + "appearance.reduce_motion.label": "Bewegung reduzieren", + "appearance.save": "Speichern", + "appearance.show_dock_badge.label": "Als Dock-Symbol anzeigen", + "appearance.sidebar_show_unread_count.label": "Im Seitenbereich anzeigen", + "appearance.sidebar_title": "Aussehen", + "appearance.text_size": "Textgröße", + "appearance.theme.dark": "Dunkel", + "appearance.theme.label": "Thema", + "appearance.theme.light": "Hell", + "appearance.theme.system": "System", + "appearance.title": "Aussehen", + "appearance.ui_font": "UI-Schriftart", + "appearance.unread_count": "Ungelesene Anzahl", + "general.app": "App", + "general.data_persist.description": "Daten lokal speichern, um den Offline-Zugriff und die lokale Suche zu ermöglichen.", + "general.data_persist.label": "Daten für die Offline-Nutzung speichern", + "general.group_by_date.description": "Einträge nach Datum gruppieren.", + "general.group_by_date.label": "Nach Datum gruppieren", + "general.language": "Sprache", + "general.launch_at_login": "Beim Login starten", + "general.mark_as_read.hover.description": "Einträge automatisch als gelesen markieren, wenn sie angehoben werden.", + "general.mark_as_read.hover.label": "Beim Überfahren als gelesen markieren", + "general.mark_as_read.render.description": "Einzelne Einträge (z. B. Social-Media-Beiträge, Bilder, Videowiedergaben) automatisch als gelesen markieren, wenn sie in den View gelangen.", + "general.mark_as_read.render.label": "Als gelesen markieren, wenn in der Ansicht", + "general.mark_as_read.scroll.description": "Einträge automatisch als gelesen markieren, wenn sie aus dem View herausgescrollt werden.", + "general.mark_as_read.scroll.label": "Beim Scrollen als gelesen markieren", + "general.privacy_data": "Datenschutz & Daten", + "general.rebuild_database.button": "Neu aufbauen", + "general.rebuild_database.description": "Wenn Sie auf Darstellungsprobleme stoßen, kann der Neuaufbau der Datenbank diese beheben.", + "general.rebuild_database.label": "Datenbank neu aufbauen", + "general.rebuild_database.title": "Datenbank neu aufbauen", + "general.rebuild_database.warning.line1": "Der Neuaufbau der Datenbank wird alle Ihre lokalen Daten löschen.", + "general.rebuild_database.warning.line2": "Sind Sie sicher, dass Sie fortfahren möchten?", + "general.send_anonymous_data.description": "Durch das Senden anonymisierter Telemetriedaten tragen Sie zur Verbesserung der Benutzererfahrung von Follow bei.", + "general.send_anonymous_data.label": "Anonyme Daten senden", + "general.show_unread_on_launch.description": "Ungelesenen Inhalt beim Start anzeigen", + "general.show_unread_on_launch.label": "Ungelesenen Inhalt beim Start anzeigen", + "general.sidebar_title": "Allgemein", + "general.timeline": "Zeitleiste", + "general.unread": "Ungelesen", + "general.voices": "Stimmen", + "integration.eagle.enable.description": "Schaltfläche 'Medien in Eagle speichern' anzeigen, wenn verfügbar.", + "integration.eagle.enable.label": "Aktivieren", + "integration.eagle.title": "Eagle", + "integration.instapaper.enable.description": "'Zu Instapaper speichern' Schaltfläche anzeigen, wenn verfügbar.", + "integration.instapaper.enable.label": "Aktivieren", + "integration.instapaper.password.label": "Instapaper-Passwort", + "integration.instapaper.title": "Instapaper", + "integration.instapaper.username.label": "Instapaper-Benutzername", + "integration.readwise.enable.description": "'Zu Readwise speichern' Schaltfläche anzeigen, wenn verfügbar.", + "integration.readwise.enable.label": "Aktivieren", + "integration.readwise.title": "Readwise", + "integration.readwise.token.description": "Sie können es hier erhalten: readwise.io/access_token.", + "integration.readwise.token.label": "Readwise-Zugangstoken", + "integration.sidebar_title": "Integration", + "integration.tip": "Tipp: Ihre sensiblen Daten werden lokal gespeichert und nicht auf den Server hochgeladen.", + "integration.title": "Integration", + "invitation.activate": "Aktivieren", + "invitation.codeOptions.betaUser": "1. Finden Sie einen Beta-Benutzer, der Sie einlädt.", + "invitation.codeOptions.discord": "2. Treten Sie unserem Discord-Server bei und erhalten Sie gelegentlich Geschenke.", + "invitation.codeOptions.xAccount": "3. Folgen Sie unserem X-Konto und erhalten Sie von Zeit zu Zeit Geschenke.", + "invitation.confirmModal.cancel": "Abbrechen", + "invitation.confirmModal.confirm": "Möchten Sie fortfahren?", + "invitation.confirmModal.continue": "Fortfahren", + "invitation.confirmModal.message": "Das Generieren eines Einladungscodes kostet Sie {{INVITATION_PRICE}} Power.", + "invitation.confirmModal.title": "Bestätigen", + "invitation.earlyAccess": "Follow ist derzeit im Frühzugang und erfordert einen Einladungscode zur Nutzung.", + "invitation.earlyAccessMessage": "😰 Entschuldigung, Follow ist derzeit im Frühzugang und erfordert einen Einladungscode zur Nutzung.", + "invitation.generateButton": "Neuen Code generieren", + "invitation.generateCost": "Sie können {{INVITATION_PRICE}} Power ausgeben, um einen Einladungscode für Ihre Freunde zu generieren.", + "invitation.getCodeMessage": "Sie können einen Einladungscode über folgende Methoden erhalten:", + "invitation.limitationMessage": "Basierend auf Ihrer Nutzungszeit können Sie bis zu {{limitation}} Einladungscodes generieren.", + "invitation.newInvitationSuccess": "🎉 Neue Einladung generiert, Einladungs-Code wurde kopiert", + "invitation.noInvitations": "Keine Einladungen", + "invitation.notUsed": "Nicht verwendet", + "invitation.sidebar_title": "Einladungen", + "invitation.tableHeaders.code": "Code", + "invitation.tableHeaders.creationTime": "Erstellungszeit", + "invitation.tableHeaders.usedBy": "Verwendet von", + "invitation.title": "Einladungscode", + "profile.avatar.label": "Avatar", + "profile.handle.description": "Ihr eindeutiger Bezeichner.", + "profile.handle.label": "Bezeichner", + "profile.name.description": "Ihr öffentlicher Anzeigename.", + "profile.name.label": "Anzeigename", + "profile.sidebar_title": "Profil", + "profile.submit": "Einreichen", + "profile.title": "Profileinstellungen", + "profile.updateSuccess": "Profil aktualisiert.", + "titles.about": "Über", + "titles.actions": "Aktionen", + "titles.appearance": "Aussehen", + "titles.general": "Allgemein", + "titles.integration": "Integration", + "titles.invitations": "Einladungen", + "titles.power": "Power", + "titles.profile": "Profil", + "titles.shortcuts": "Shortcuts", + "wallet.address.title": "Ihre Adresse", + "wallet.balance.title": "Ihr Guthaben", + "wallet.balance.withdrawable": "Abhebbar", + "wallet.balance.withdrawableTooltip": "Abhebbare Power beinhaltet sowohl die Trinkgelder, die Sie erhalten haben, als auch die Power, die Sie aufgeladen haben.", + "wallet.claim.button.claim": "Tägliche Power beanspruchen", + "wallet.claim.button.claimed": "Heute beansprucht", + "wallet.claim.tooltip.alreadyClaimed": "Sie haben heute bereits beansprucht.", + "wallet.claim.tooltip.canClaim": "Beanspruchen Sie jetzt Ihre {{amount}} tägliche Power!", + "wallet.create.button": "Wallet erstellen", + "wallet.create.description": "Erstellen Sie eine kostenlose Wallet, um Power zu erhalten, die zum Belohnen von Erstellern verwendet werden kann und auch für Ihre Inhaltsbeiträge belohnt wird.", + "wallet.power.dailyClaim": "Sie können täglich {{amount}} kostenlose Power beanspruchen, die verwendet werden kann, um RSS-Einträge auf Follow zu belohnen.", + "wallet.power.description": "Power ist ein ERC-20-Token auf der {{blockchainName}}-Blockchain.", + "wallet.sidebar_title": "Power", + "wallet.transactions.amount": "Betrag", + "wallet.transactions.date": "Datum", + "wallet.transactions.from": "Von", + "wallet.transactions.noTransactions": "Keine Transaktionen", + "wallet.transactions.title": "Transaktionen", + "wallet.transactions.to": "An", + "wallet.transactions.tx": "Tx", + "wallet.transactions.type": "Typ", + "wallet.transactions.types.burn": "verbrennen", + "wallet.transactions.types.mint": "prägen", + "wallet.transactions.types.purchase": "kaufen", + "wallet.transactions.types.tip": "Trinkgeld", + "wallet.transactions.types.withdraw": "abheben", + "wallet.transactions.you": "Sie", + "wallet.withdraw.addressLabel": "Ihre Ethereum-Adresse", + "wallet.withdraw.amountLabel": "Betrag", + "wallet.withdraw.availableBalance": "Sie haben abhebbare Power in Ihrer Wallet.", + "wallet.withdraw.button": "Abheben", + "wallet.withdraw.error": "Abhebung fehlgeschlagen: {{error}}", + "wallet.withdraw.modalTitle": "Power abheben", + "wallet.withdraw.submitButton": "Einreichen", + "wallet.withdraw.success": "Abhebung erfolgreich!" +} diff --git a/locales/shortcuts/de.json b/locales/shortcuts/de.json new file mode 100644 index 0000000000..9017743a80 --- /dev/null +++ b/locales/shortcuts/de.json @@ -0,0 +1,24 @@ +{ + "keys.audio.playPause": "Abspielen/Pause (Wenn der Audioplayer geöffnet ist)", + "keys.entries.markAllAsRead": "Alle als gelesen markieren", + "keys.entries.next": "Nächster Eintrag", + "keys.entries.previous": "Vorheriger Eintrag", + "keys.entries.refetch": "Erneut abrufen", + "keys.entries.toggleUnreadOnly": "Nur Ungelesene umschalten", + "keys.entry.copyLink": "Link kopieren", + "keys.entry.openInBrowser": "Im Browser öffnen", + "keys.entry.openInNewTab": "In neuem Tab öffnen", + "keys.entry.scrollDown": "Nach unten scrollen", + "keys.entry.scrollUp": "Nach oben scrollen", + "keys.entry.share": "Teilen", + "keys.entry.tip": "Power Tipp", + "keys.entry.toggleRead": "Gelesen umschalten", + "keys.entry.toggleStarred": "Favorisiert umschalten", + "keys.entry.tts": "TTS abspielen", + "keys.feeds.add": "Abonnement hinzufügen", + "keys.feeds.switchBetweenViews": "Zwischen Ansichten wechseln", + "keys.feeds.switchToView": "Zur Ansicht wechseln", + "keys.layout.showShortcuts": "Shortcuts anzeigen/ausblenden", + "keys.layout.toggleSidebar": "Feed-Seitenleiste ein-/ausblenden", + "sidebar_title": "Shortcuts" +} diff --git a/scripts/generate-i18n-locale.ts b/scripts/generate-i18n-locale.ts index 12045bd219..03035d33e5 100644 --- a/scripts/generate-i18n-locale.ts +++ b/scripts/generate-i18n-locale.ts @@ -36,6 +36,7 @@ const locales = [ "da-at", "da-ch", "da", + "de", "dv", "el", diff --git a/src/renderer/src/@types/constants.ts b/src/renderer/src/@types/constants.ts index 4747c6e4e4..03753257e4 100644 --- a/src/renderer/src/@types/constants.ts +++ b/src/renderer/src/@types/constants.ts @@ -1,4 +1,4 @@ -const langs = ["en", "ja", "zh-CN", "zh-TW", "pt", "fr"] +const langs = ["en", "ja", "zh-CN", "zh-TW", "pt", "fr", "de"] export const currentSupportedLanguages = langs.sort() export const dayjsLocaleImportMap = { en: ["en", () => import("dayjs/locale/en")], @@ -7,6 +7,7 @@ export const dayjsLocaleImportMap = { ["fr"]: ["fr", () => import("dayjs/locale/fr")], ["pt"]: ["pt", () => import("dayjs/locale/pt")], ["zh-TW"]: ["zh-tw", () => import("dayjs/locale/zh-tw")], + ["de"]: ["de", () => import("dayjs/locale/de")], } export const ns = ["app", "common", "lang", "settings", "shortcuts"] as const export const defaultNS = "app" as const diff --git a/src/renderer/src/@types/default-resource.ts b/src/renderer/src/@types/default-resource.ts index 118cf751a1..e82bdd8e67 100644 --- a/src/renderer/src/@types/default-resource.ts +++ b/src/renderer/src/@types/default-resource.ts @@ -1,4 +1,5 @@ import en from "../../../../locales/app/en.json" +import common_de from "../../../../locales/common/de.json" import common_en from "../../../../locales/common/en.json" import common_fr from "../../../../locales/common/fr.json" import common_ja from "../../../../locales/common/ja.json" @@ -6,6 +7,7 @@ import common_pt from "../../../../locales/common/pt.json" import common_zhCN from "../../../../locales/common/zh-CN.json" import common_zhTW from "../../../../locales/common/zh-TW.json" import external_en from "../../../../locales/external/en.json" +import lang_de from "../../../../locales/lang/de.json" import lang_en from "../../../../locales/lang/en.json" import lang_fr from "../../../../locales/lang/fr.json" import lang_ja from "../../../../locales/lang/ja.json" @@ -41,4 +43,5 @@ export const defaultResources = { }, fr: { lang: lang_fr, common: common_fr }, pt: { lang: lang_pt, common: common_pt }, + de: { lang: lang_de, common: common_de }, } From a21ee767c7e61bd9a8a1b369261632e29fa1015d Mon Sep 17 00:00:00 2001 From: jettpackx Date: Mon, 16 Sep 2024 02:04:16 +0000 Subject: [PATCH 2/2] Update translation files with German language option --- locales/lang/en.json | 1 + locales/lang/fr.json | 1 + locales/lang/ja.json | 1 + locales/lang/pt.json | 1 + locales/lang/zh-CN.json | 1 + locales/lang/zh-TW.json | 1 + 6 files changed, 6 insertions(+) diff --git a/locales/lang/en.json b/locales/lang/en.json index 0e085ed5a5..a4ecb1a47a 100644 --- a/locales/lang/en.json +++ b/locales/lang/en.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "English", "langs.fr": "Français", "langs.ja": "日本語", diff --git a/locales/lang/fr.json b/locales/lang/fr.json index 51acafabdf..a88a70a733 100644 --- a/locales/lang/fr.json +++ b/locales/lang/fr.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "Anglais", "langs.fr": "Français", "langs.ja": "Japonais", diff --git a/locales/lang/ja.json b/locales/lang/ja.json index f8beccbee8..ef089cc1ba 100644 --- a/locales/lang/ja.json +++ b/locales/lang/ja.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "English", "langs.fr": "Français", "langs.ja": "日本語", diff --git a/locales/lang/pt.json b/locales/lang/pt.json index fcb92f1197..d790917f84 100644 --- a/locales/lang/pt.json +++ b/locales/lang/pt.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "English", "langs.ja": "日本語", "langs.pt": "Português", diff --git a/locales/lang/zh-CN.json b/locales/lang/zh-CN.json index 69d8fe02ce..414a6c917b 100644 --- a/locales/lang/zh-CN.json +++ b/locales/lang/zh-CN.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "English", "langs.fr": "Français", "langs.ja": "日本語", diff --git a/locales/lang/zh-TW.json b/locales/lang/zh-TW.json index 909996a479..0bbab40f99 100644 --- a/locales/lang/zh-TW.json +++ b/locales/lang/zh-TW.json @@ -1,4 +1,5 @@ { + "langs.de": "Deutsch", "langs.en": "English", "langs.ja": "日本語", "langs.zh-CN": "簡體中文",