diff --git a/apps/renderer/src/@types/constants.ts b/apps/renderer/src/@types/constants.ts
index 41ef8937a7..97890d747a 100644
--- a/apps/renderer/src/@types/constants.ts
+++ b/apps/renderer/src/@types/constants.ts
@@ -2,6 +2,7 @@
// DONT EDIT THIS FILE MANUALLY
export const currentSupportedLanguages = [
"en",
+ "de",
"ja",
"zh-CN",
"zh-TW",
@@ -39,6 +40,7 @@ export const dayjsLocaleImportMap = {
["ar-KW"]: ["ar-kw", () => import("dayjs/locale/ar-kw")],
["ar-TN"]: ["ar-tn", () => import("dayjs/locale/ar-tn")],
["zh-HK"]: ["zh-hk", () => import("dayjs/locale/zh-hk")],
+ ["de"]: ["de", () => import("dayjs/locale/de")],
["ko"]: ["ko", () => import("dayjs/locale/ko")],
["tr"]: ["tr", () => import("dayjs/locale/tr")],
}
diff --git a/apps/renderer/src/@types/default-resource.ts b/apps/renderer/src/@types/default-resource.ts
index da0f599fb0..7b938577d7 100644
--- a/apps/renderer/src/@types/default-resource.ts
+++ b/apps/renderer/src/@types/default-resource.ts
@@ -7,6 +7,7 @@ import common_arkw from "../../../../locales/common/ar-KW.json"
import common_arma from "../../../../locales/common/ar-MA.json"
import common_arsa from "../../../../locales/common/ar-SA.json"
import common_artn from "../../../../locales/common/ar-TN.json"
+import common_de from "../../../../locales/common/de.json"
import common_en from "../../../../locales/common/en.json"
import common_es from "../../../../locales/common/es.json"
import common_fi from "../../../../locales/common/fi.json"
@@ -28,6 +29,7 @@ import lang_arkw from "../../../../locales/lang/ar-KW.json"
import lang_arma from "../../../../locales/lang/ar-MA.json"
import lang_arsa from "../../../../locales/lang/ar-SA.json"
import lang_artn from "../../../../locales/lang/ar-TN.json"
+import lang_de from "../../../../locales/lang/de.json"
import lang_en from "../../../../locales/lang/en.json"
import lang_es from "../../../../locales/lang/es.json"
import lang_fi from "../../../../locales/lang/fi.json"
@@ -86,6 +88,7 @@ export const defaultResources = {
"ar-IQ": { lang: lang_ariq, common: common_ariq },
"ar-KW": { lang: lang_arkw, common: common_arkw },
"ar-TN": { lang: lang_artn, common: common_artn },
+ de: { lang: lang_de, common: common_de },
ko: { lang: lang_ko, common: common_ko },
tr: { lang: lang_tr, common: common_tr },
}
diff --git a/locales/app/de.json b/locales/app/de.json
new file mode 100644
index 0000000000..be19d1219f
--- /dev/null
+++ b/locales/app/de.json
@@ -0,0 +1,210 @@
+{
+ "ai_daily.title": "Top-Nachrichten - {{title}}",
+ "ai_daily.tooltip.content": "Hier sind Nachrichten, die von der KI aus Ihrer Zeitleiste ausgewählt wurden ( - ), die für Sie wichtig sein könnten.",
+ "ai_daily.tooltip.update_schedule": "Täglich um 8 Uhr und 20 Uhr aktualisiert.",
+ "app.copy_logo_svg": "Logo-SVG kopieren",
+ "app.toggle_sidebar": "Seitenleiste umschalten",
+ "discover.any_url_or_keyword": "Beliebige URL oder Stichwort",
+ "discover.default_option": " (Standard)",
+ "discover.feed_description": "Die Beschreibung dieses Feeds lautet wie folgt. Sie können das Parameterformular mit den entsprechenden Informationen ausfüllen.",
+ "discover.feed_maintainers": "Dieser Feed wird von RSSHub bereitgestellt, mit Dank an ",
+ "discover.import.click_to_upload": "Klicken, 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": "Favorisieren",
+ "entry_actions.starred": "Favorisiert.",
+ "entry_actions.tip": "Trinkgeld",
+ "entry_actions.unstar": "Favorisierung entfernen",
+ "entry_actions.unstarred": "Favorisierung entfernt.",
+ "entry_column.filtered_content_tip": "Sie haben gefilterte Inhalte ausgeblendet.",
+ "entry_column.filtered_content_tip_2": "Zusätzlich zu den oben angezeigten Einträgen gibt es auch gefilterte Inhalte.",
+ "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": "Keine Medien verfügbar",
+ "entry_content.readability_notice": "Dieser Inhalt wird von Readability bereitgestellt. Wenn Sie typografische Fehler feststellen, besuchen Sie bitte die Quellseite, um den Originalinhalt anzuzeigen.",
+ "entry_content.render_error": "Render-Fehler:",
+ "entry_content.report_issue": "Problem melden",
+ "entry_content.support_amount": "{{amount}} Personen haben den Ersteller dieses Feeds unterstützt.",
+ "entry_content.support_creator": "Ersteller unterstützen",
+ "entry_content.web_app_notice": "Möglicherweise unterstützt die Web-App diesen Inhaltstyp nicht. Sie können jedoch die Desktop-App herunterladen.",
+ "entry_list.zero_unread": "Keine ungelesenen",
+ "entry_list_header.daily_report": "Tagesbericht",
+ "entry_list_header.hide_no_image_items": "Einträge ohne Bilder ausblenden.",
+ "entry_list_header.items": "Elemente",
+ "entry_list_header.new_entries_available": "Neue Einträge verfügbar",
+ "entry_list_header.refetch": "Neu laden",
+ "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": "Zu Rasteransicht wechseln",
+ "entry_list_header.switch_to_masonry": "Zur Kachelansicht wechseln",
+ "entry_list_header.unread": "ungelesen",
+ "feed_claim_modal.choose_verification_method": "Es gibt drei Verifikationsmethoden. Wählen Sie eine aus, um die Eigentümerschaft zu bestätigen.",
+ "feed_claim_modal.claim_button": "Beanspruchen",
+ "feed_claim_modal.content_instructions": "Kopieren Sie den folgenden Inhalt und veröffentlichen Sie ihn in Ihrem 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": "Fehler beim Laden der Anspruchsnachricht",
+ "feed_claim_modal.rss_format_choice": "RSS-Generatoren bieten in der Regel zwei Formate zur Auswahl an. Bitte kopieren Sie die unten aufgeführten XML- und JSON-Formate nach Bedarf.",
+ "feed_claim_modal.rss_instructions": "Kopieren Sie den unten stehenden 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 mit einer Cache-Zeit von 1 Stunde bereitgestellt. Bitte erlauben Sie bis zu 1 Stunde, bis Änderungen nach der Veröffentlichung von Inhalten 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 das Eigentum verifizieren.",
+ "feed_form.add_follow": "Follow hinzufügen",
+ "feed_form.category": "Kategorie",
+ "feed_form.category_description": "Standardmäßig werden Ihre Follows 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 Follow ö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 das Feld leer, um den Standardwert zu verwenden.",
+ "feed_form.unfollow": "Entfolgen",
+ "feed_form.update": "Aktualisieren",
+ "feed_form.update_follow": "Follow aktualisieren",
+ "feed_form.updated": "🎉 Aktualisiert.",
+ "feed_form.view": "Ansehen",
+ "feed_item.claimed_by_owner": "Dieser Feed wurde 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": "Möchten Sie alle als gelesen markieren?",
+ "mark_all_read_button.mark_all_as_read": "Alles 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 verlassen",
+ "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": "Stummschaltung aufheben",
+ "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": "Suche...",
+ "search.result_count_local_mode": "(Lokaler Modus)",
+ "search.tooltip.local_search": "Diese Suche deckt nur lokal verfügbare Daten ab. Versuchen Sie, eine Neuladen durchzuführen, um die neuesten Daten einzubeziehen.",
+ "shortcuts.guide.title": "Kurzanleitung",
+ "sidebar.category_remove_dialog.cancel": "Abbrechen",
+ "sidebar.category_remove_dialog.continue": "Fortfahren",
+ "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": "Alles als gelesen markieren",
+ "sidebar.feed_actions.navigate_to_feed": "Zu Feed navigieren",
+ "sidebar.feed_actions.open_feed_in_browser": "Feed im Browser öffnen",
+ "sidebar.feed_actions.open_site_in_browser": "Website 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 Synchronisierung 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": "Kostenloses Wallet erstellen",
+ "tip_modal.feed_owner": "Feed-Besitzer",
+ "tip_modal.low_balance": "Ihr Guthaben reicht nicht aus, um dieses Trinkgeld zu geben. Bitte passen Sie den Betrag an.",
+ "tip_modal.no_wallet": "Sie haben noch kein Wallet. Bitte erstellen Sie ein Wallet, um Trinkgelder zu geben.",
+ "tip_modal.tip_amount_sent": "wurde an den Autor gesendet.",
+ "tip_modal.tip_now": "Jetzt Trinkgeld geben",
+ "tip_modal.tip_sent": "Trinkgeld erfolgreich gesendet! Vielen Dank für Ihre Unterstützung.",
+ "tip_modal.tip_support": "⭐ Geben Sie ein Trinkgeld, um Ihre Unterstützung zu zeigen!",
+ "tip_modal.unclaimed_feed": "Dieser Feed wurde noch von niemandem beansprucht. Das erhaltene Power wird sicher im Blockchain-Vertrag gehalten, bis es 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": "Wird geladen",
+ "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": "Elemente",
+ "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": "Suche",
+ "words.starred": "Favorisiert",
+ "words.unread": "Ungelesen",
+ "words.user": "Benutzer",
+ "words.which.all": "alle",
+ "words.zero_items": "Keine Elemente"
+}
diff --git a/locales/common/de.json b/locales/common/de.json
new file mode 100644
index 0000000000..2070b16c67
--- /dev/null
+++ b/locales/common/de.json
@@ -0,0 +1,29 @@
+{
+ "app.copied_to_clipboard": "In die Zwischenablage kopiert",
+ "cancel": "Abbrechen",
+ "close": "Schließen",
+ "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": "Fehler beim Laden des Sprachpakets",
+ "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/errors/de.json b/locales/errors/de.json
new file mode 100644
index 0000000000..503ff9847b
--- /dev/null
+++ b/locales/errors/de.json
@@ -0,0 +1,29 @@
+{
+ "1000": "Nicht autorisiert",
+ "1001": "Erstellung der Sitzung fehlgeschlagen",
+ "1002": "Ungültiger Parameter",
+ "1003": "Ungültige Einladung",
+ "2000": "Nur Administratoren können Feeds aktualisieren",
+ "2001": "Feed nicht gefunden",
+ "2002": "feedId oder URL erforderlich",
+ "2003": "Fehler beim Abrufen des Feeds",
+ "2004": "Feed konnte nicht analysiert werden",
+ "2010": "Besitznachweis fehlgeschlagen",
+ "2011": "Abonnementlimit überschritten",
+ "3000": "Eintrag nicht gefunden",
+ "3001": "Eintrag gehört nicht zum Benutzer",
+ "4000": "Bereits beansprucht",
+ "4001": "Fehler in der Benutzer-Wallet",
+ "4002": "Unzureichendes Guthaben",
+ "4003": "Nicht ausreichendes verfügbares Guthaben im Feed",
+ "4004": "Fehler in der Zielbenutzer-Wallet",
+ "5000": "Einladungslimit überschritten. Bitte versuchen Sie es in ein paar Tagen erneut.",
+ "5001": "Einladung existiert bereits.",
+ "5002": "Einladungscode wurde bereits verwendet.",
+ "5003": "Einladungscode existiert nicht.",
+ "6000": "Benutzer nicht gefunden",
+ "7000": "Einstellung nicht gefunden",
+ "7001": "Ungültiger Einstellungs-Tab",
+ "7002": "Ungültige Einstellungsdaten",
+ "7003": "Einstellungsdaten sind zu groß"
+}
diff --git a/locales/external/de.json b/locales/external/de.json
new file mode 100644
index 0000000000..44ea6c279a
--- /dev/null
+++ b/locales/external/de.json
@@ -0,0 +1,42 @@
+{
+ "feed": {
+ "follow_one": "follow",
+ "follow_other": "followers",
+ "followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} {{readNoun}} on {{appName}}",
+ "read_one": "read",
+ "read_other": "reads"
+ },
+ "header": {
+ "app": "App",
+ "download": "Download"
+ },
+ "invitation": {
+ "activate": "Activate",
+ "codeOptions": {
+ "1": "Looking for an alpha test user to invite you.",
+ "2": "Join our Discord server for occasional giveaways.",
+ "3": "Follow our X account for occasional giveaways."
+ },
+ "earlyAccess": "Follow is currently in early access and requires an invitation code to use.",
+ "earlyAccessMessage": "😰 Sorry, Follow is currently in early access and requires an invitation code to use.",
+ "generateButton": "Generate new code",
+ "generateCost": "You can spend {{INVITATION_PRICE}} Power to generate an invitation code for your friends.",
+ "getCodeMessage": "You can get an invitation code through the following ways:",
+ "title": "Invitation Code"
+ },
+ "login": {
+ "backToWebApp": "Back to the web app",
+ "continueWithGitHub": "Continue with GitHub",
+ "continueWithGoogle": "Continue with Google",
+ "logInTo": "Log in to ",
+ "openApp": "Open app",
+ "redirecting": "Redirecting",
+ "welcomeTo": "Welcome to "
+ },
+ "redirect": {
+ "continueInBrowser": "Continue in browser",
+ "instruction": "It is time to open {{APP_NAME}} and safely close this page.",
+ "openApp": "Open {{APP_NAME}}",
+ "successMessage": "You have successfully connected to {{APP_NAME}} account."
+ }
+}
diff --git a/locales/lang/de.json b/locales/lang/de.json
new file mode 100644
index 0000000000..e15cc9b495
--- /dev/null
+++ b/locales/lang/de.json
@@ -0,0 +1,21 @@
+{
+ "langs.ar-DZ": "العربية (الجزائر)",
+ "langs.ar-IQ": "العربية (العراق)",
+ "langs.ar-KW": "العربية (الكويت)",
+ "langs.ar-MA": "العربية (المغرب)",
+ "langs.ar-SA": "العربية (السعودية)",
+ "langs.ar-TN": "العربية (تونس)",
+ "langs.de": "Deutsch",
+ "langs.en": "English",
+ "langs.es": "Español",
+ "langs.fi": "Suomi",
+ "langs.fr": "Français",
+ "langs.it": "Italiano",
+ "langs.ja": "日本語",
+ "langs.pt": "Português",
+ "langs.ru": "Русский",
+ "langs.zh-CN": "简体中文",
+ "langs.zh-HK": "繁體中文(香港)",
+ "langs.zh-TW": "繁體中文(台灣)",
+ "name": "Deutsch"
+}
diff --git a/locales/native/de.json b/locales/native/de.json
new file mode 100644
index 0000000000..09f3c72014
--- /dev/null
+++ b/locales/native/de.json
@@ -0,0 +1,64 @@
+{
+ "contextMenu.copy": "Kopieren",
+ "contextMenu.copyImage": "Bild kopieren",
+ "contextMenu.copyImageAddress": "Bildadresse kopieren",
+ "contextMenu.copyLink": "Link kopieren",
+ "contextMenu.copyVideoAddress": "Videoadresse kopieren",
+ "contextMenu.cut": "Ausschneiden",
+ "contextMenu.inspect": "Element untersuchen",
+ "contextMenu.learnSpelling": "Rechtschreibung lernen",
+ "contextMenu.lookUpSelection": "Auswahl nachschlagen",
+ "contextMenu.openImageInBrowser": "Bild im Browser öffnen",
+ "contextMenu.openLinkInBrowser": "Link im Browser öffnen",
+ "contextMenu.paste": "Einfügen",
+ "contextMenu.saveImage": "Bild speichern",
+ "contextMenu.saveImageAs": "Bild speichern unter...",
+ "contextMenu.saveLinkAs": "Link speichern unter...",
+ "contextMenu.saveVideo": "Video speichern",
+ "contextMenu.saveVideoAs": "Video speichern unter...",
+ "contextMenu.searchWithGoogle": "Mit Google suchen",
+ "contextMenu.selectAll": "Alles auswählen",
+ "contextMenu.services": "Dienste",
+ "menu.about": "Über {{name}}",
+ "menu.actualSize": "Tatsächliche Größe",
+ "menu.bringAllToFront": "Alle nach vorne bringen",
+ "menu.checkForUpdates": "Nach Updates suchen",
+ "menu.close": "Schließen",
+ "menu.copy": "Kopieren",
+ "menu.cut": "Ausschneiden",
+ "menu.debug": "Debug",
+ "menu.delete": "Löschen",
+ "menu.discover": "Entdecken",
+ "menu.edit": "Bearbeiten",
+ "menu.file": "Datei",
+ "menu.followReleases": "Veröffentlichungen folgen",
+ "menu.forceReload": "Neuladen erzwingen",
+ "menu.front": "In den Vordergrund bringen",
+ "menu.help": "Hilfe",
+ "menu.hide": "{{name}} ausblenden",
+ "menu.hideOthers": "Andere ausblenden",
+ "menu.minimize": "Minimieren",
+ "menu.openLogFile": "Protokolldatei öffnen",
+ "menu.paste": "Einfügen",
+ "menu.pasteAndMatchStyle": "Einfügen und Stil anpassen",
+ "menu.quickAdd": "Schnell hinzufügen",
+ "menu.quit": "{{name}} beenden",
+ "menu.quitAndInstallUpdate": "Debug: Beenden und Update installieren",
+ "menu.redo": "Wiederholen",
+ "menu.reload": "Neu laden",
+ "menu.search": "Suchen",
+ "menu.selectAll": "Alles auswählen",
+ "menu.services": "Dienste",
+ "menu.settings": "Einstellungen...",
+ "menu.speech": "Sprachausgabe",
+ "menu.startSpeaking": "Sprechen starten",
+ "menu.stopSpeaking": "Sprechen stoppen",
+ "menu.toggleDevTools": "Entwicklertools umschalten",
+ "menu.toggleFullScreen": "Vollbild umschalten",
+ "menu.undo": "Rückgängig machen",
+ "menu.view": "Ansicht",
+ "menu.window": "Fenster",
+ "menu.zoom": "Zoom",
+ "menu.zoomIn": "Vergrößern",
+ "menu.zoomOut": "Verkleinern"
+}
diff --git a/locales/settings/de.json b/locales/settings/de.json
new file mode 100644
index 0000000000..512e8684c8
--- /dev/null
+++ b/locales/settings/de.json
@@ -0,0 +1,237 @@
+{
+ "about.changelog": "Änderungsprotokoll",
+ "about.feedbackInfo": "{{appName}} ({{commitSha}}) befindet sich in den frühen Entwicklungsstadien. Wenn Sie Feedback oder Vorschläge haben, können Sie gerne ein Issue auf GitHub eröffnen .",
+ "about.iconLibrary": "Die verwendete Icon-Bibliothek ist urheberrechtlich geschützt von und darf nicht weiterverteilt werden.",
+ "about.licenseInfo": "{{appName}} ist und wird immer ein kostenloses und Open-Source-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": "Website-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 erstellen",
+ "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": "Schriftart für Inhalte",
+ "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": "Zeige modale Überlagerung",
+ "appearance.modal_overlay.label": "Modale Überlagerung anzeigen",
+ "appearance.opaque_sidebars.label": "Undurchsichtige 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": "Reduzierung der Bewegung von Elementen zur Leistungsverbesserung und Energieeinsparung",
+ "appearance.reduce_motion.label": "Bewegung reduzieren",
+ "appearance.save": "Speichern",
+ "appearance.show_dock_badge.label": "Als Dock-Abzeichen anzeigen",
+ "appearance.sidebar_show_unread_count.label": "Im Seitenmenü 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",
+ "appearance.use_pointer_cursor.description": "Ändert den Cursor zu einem Zeiger, wenn über ein interaktives Element geschwebt wird.",
+ "appearance.use_pointer_cursor.label": "Zeiger-Cursor verwenden",
+ "common.give_star": "Lieben Sie unser Produkt? Geben Sie uns einen Stern auf GitHub!",
+ "feeds.claimTips": "Um Ihre Feeds zu beanspruchen und Tipps zu erhalten, klicken Sie mit der rechten Maustaste auf den Feed in Ihrer Abonnementliste und wählen Sie „Beanspruchen“.",
+ "feeds.noFeeds": "Keine beanspruchten Feeds",
+ "feeds.tableHeaders.entryCount": "Einträge",
+ "feeds.tableHeaders.name": "Name",
+ "feeds.tableHeaders.subscriptionCount": "Abonnements",
+ "feeds.tableHeaders.tipAmount": "Erhaltene Tipps",
+ "general.app": "App",
+ "general.data_persist.description": "Daten lokal speichern, um Offline-Zugriff und lokale Suche zu ermöglichen.",
+ "general.data_persist.label": "Daten für 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 Start ausführen",
+ "general.mark_as_read.hover.description": "Einträge automatisch als gelesen markieren, wenn darüber geschwebt wird.",
+ "general.mark_as_read.hover.label": "Als gelesen markieren, wenn darüber geschwebt wird",
+ "general.mark_as_read.render.description": "Einträge auf einer Ebene (z. B. Social-Media-Posts, Bilder, Videoansichten) automatisch als gelesen markieren, wenn sie in den Ansichtsbereich 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 Ansichtsbereich gescrollt werden.",
+ "general.mark_as_read.scroll.label": "Als gelesen markieren, wenn gescrollt wird",
+ "general.network": "Netzwerk",
+ "general.privacy_data": "Datenschutz & Daten",
+ "general.proxy.description": "Proxy für Netzwerkverkehrsrouting einrichten, z.B. socks://proxy.beispiel.de:1080",
+ "general.proxy.label": "Proxy",
+ "general.rebuild_database.button": "Neu aufbauen",
+ "general.rebuild_database.description": "Wenn Sie Rendering-Probleme haben, kann das Neuaufbauen der Datenbank diese beheben.",
+ "general.rebuild_database.label": "Datenbank neu aufbauen",
+ "general.rebuild_database.title": "Datenbank neu aufbauen",
+ "general.rebuild_database.warning.line1": "Das Neuaufbauen der Datenbank löscht alle Ihre lokalen Daten.",
+ "general.rebuild_database.warning.line2": "Sind Sie sicher, dass Sie fortfahren möchten?",
+ "general.send_anonymous_data.description": "Wenn Sie sich für das Senden anonymisierter Telemetriedaten entscheiden, tragen Sie zur Verbesserung der Benutzererfahrung von Follow bei.",
+ "general.send_anonymous_data.label": "Anonyme Daten senden",
+ "general.show_unread_on_launch.description": "Ungelesene Inhalte beim Start anzeigen",
+ "general.show_unread_on_launch.label": "Ungelesene Inhalte beim Start anzeigen",
+ "general.sidebar_title": "Allgemein",
+ "general.timeline": "Zeitleiste",
+ "general.unread": "Ungelesen",
+ "general.voices": "Stimmen",
+ "integration.eagle.enable.description": "Zeige den Button „Medien zu Eagle speichern“, wenn verfügbar.",
+ "integration.eagle.enable.label": "Aktivieren",
+ "integration.eagle.title": "Eagle",
+ "integration.instapaper.enable.description": "Zeige den Button „Zu Instapaper speichern“, 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": "Zeige den Button „Zu Readwise speichern“, 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 befindet sich derzeit im Early Access und erfordert einen Einladungscode zur Nutzung.",
+ "invitation.earlyAccessMessage": "😰 Entschuldigung, Follow befindet sich derzeit im Early Access 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 auf folgende Weise erhalten:",
+ "invitation.limitationMessage": "Basierend auf Ihrer Nutzungszeit können Sie bis zu {{limitation}} Einladungscodes generieren.",
+ "invitation.newInvitationSuccess": "🎉 Neuer Einladungscode generiert, Einladungscode wurde kopiert",
+ "invitation.noInvitations": "Keine Einladungen",
+ "invitation.notUsed": "Nicht benutzt",
+ "invitation.sidebar_title": "Einladungen",
+ "invitation.tableHeaders.code": "Code",
+ "invitation.tableHeaders.creationTime": "Erstellungszeit",
+ "invitation.tableHeaders.usedBy": "Verwendet von",
+ "invitation.title": "Einladungscode",
+ "lists.create": "Neue Liste erstellen",
+ "lists.created.error": "Liste konnte nicht erstellt werden.",
+ "lists.created.success": "Liste erfolgreich erstellt!",
+ "lists.description": "Beschreibung",
+ "lists.edit.error": "Bearbeitung der Liste fehlgeschlagen.",
+ "lists.edit.label": "Bearbeiten",
+ "lists.edit.success": "Liste erfolgreich bearbeitet!",
+ "lists.fee.description": "Die Gebühr, die andere zahlen müssen, um diese Liste zu abonnieren.",
+ "lists.fee.label": "Gebühr",
+ "lists.feeds.actions": "Aktionen",
+ "lists.feeds.add.error": "Feed konnte nicht zur Liste hinzugefügt werden.",
+ "lists.feeds.add.label": "Hinzufügen",
+ "lists.feeds.add.success": "Feed zur Liste hinzugefügt.",
+ "lists.feeds.delete.error": "Feed konnte nicht aus der Liste entfernt werden.",
+ "lists.feeds.delete.success": "Feed aus der Liste entfernt.",
+ "lists.feeds.id": "Feed-ID",
+ "lists.feeds.label": "Feeds",
+ "lists.feeds.manage": "Feeds verwalten",
+ "lists.feeds.owner": "Eigentümer",
+ "lists.feeds.search": "Feed suchen",
+ "lists.feeds.title": "Titel",
+ "lists.image": "Bild",
+ "lists.info": "Listen sind Sammlungen von Feeds, die Sie teilen oder verkaufen können, damit andere sie abonnieren können. Abonnenten werden alle Feeds in der Liste synchronisieren und darauf zugreifen.",
+ "lists.noLists": "Keine Listen",
+ "lists.submit": "Absenden",
+ "lists.title": "Titel",
+ "lists.view": "Ansehen",
+ "profile.avatar.label": "Avatar",
+ "profile.handle.description": "Ihre eindeutige Kennung.",
+ "profile.handle.label": "Handle",
+ "profile.name.description": "Ihr öffentlicher Anzeigename.",
+ "profile.name.label": "Anzeigename",
+ "profile.sidebar_title": "Profil",
+ "profile.submit": "Absenden",
+ "profile.title": "Profileinstellungen",
+ "profile.updateSuccess": "Profil aktualisiert.",
+ "titles.about": "Über",
+ "titles.actions": "Aktionen",
+ "titles.appearance": "Aussehen",
+ "titles.feeds": "Feeds",
+ "titles.general": "Allgemein",
+ "titles.integration": "Integration",
+ "titles.invitations": "Einladungen",
+ "titles.lists": "Listen",
+ "titles.power": "Power",
+ "titles.profile": "Profil",
+ "titles.shortcuts": "Verknüpfungen",
+ "wallet.address.title": "Ihre Adresse",
+ "wallet.balance.title": "Ihr Guthaben",
+ "wallet.balance.withdrawable": "Abhebbar",
+ "wallet.balance.withdrawableTooltip": "Abhebbare Power umfasst sowohl die erhaltenen Tipps als auch die aufgeladene Power.",
+ "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 verwendet werden kann, um Ersteller zu belohnen und auch für Ihre Inhaltsbeiträge belohnt zu werden.",
+ "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": "Kauf",
+ "wallet.transactions.types.tip": "Tipp",
+ "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": "Absenden",
+ "wallet.withdraw.success": "Abhebung erfolgreich!"
+}
diff --git a/locales/shortcuts/de.json b/locales/shortcuts/de.json
new file mode 100644
index 0000000000..ae0909d3ab
--- /dev/null
+++ b/locales/shortcuts/de.json
@@ -0,0 +1,24 @@
+{
+ "keys.audio.playPause": "Wiedergabe/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 anzeigen",
+ "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": "Trinkgeld geben",
+ "keys.entry.toggleRead": "Gelesen/Ungelesen umschalten",
+ "keys.entry.toggleStarred": "Markierung umschalten",
+ "keys.entry.tts": "Text-to-Speech abspielen",
+ "keys.feeds.add": "Abonnement hinzufügen",
+ "keys.feeds.switchBetweenViews": "Zwischen Ansichten wechseln",
+ "keys.feeds.switchToView": "Zur Ansicht wechseln",
+ "keys.layout.showShortcuts": "Kurzbefehle anzeigen/ausblenden",
+ "keys.layout.toggleSidebar": "Seitenleiste anzeigen/ausblenden",
+ "sidebar_title": "Kurzbefehle"
+}