diff --git a/package.json b/package.json index 6ad7ea2..580f27c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,8 @@ "zh-CN", "en-US", "fr-FR", - "es" + "es", + "de" ], "showNameOnTiles": true, "setBuildNumber": true @@ -64,7 +65,8 @@ "zh_CN", "en", "fr", - "es" + "es", + "de" ] }, "mas": { diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 96b2b8e..7633a1d 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -107,6 +107,7 @@ class AppTab extends React.Component { { key: "es", text: "Español"}, { key: "fr-FR", text: "Français"}, { key: "zh-CN", text: "中文(简体)"}, + { key: "de", text: "Deutsch"} ] toggleStatus = () => { diff --git a/src/scripts/i18n/README.md b/src/scripts/i18n/README.md index 7558739..b229378 100644 --- a/src/scripts/i18n/README.md +++ b/src/scripts/i18n/README.md @@ -8,5 +8,6 @@ Currently, Fluent Reader supports the following languages. | es | Español | [@kant](https://github.com/kant) | | fr-FR | Français | [@Toinane](https://github.com/Toinane) | | zh-CN | 中文(简体) | [@yang991178](https://github.com/yang991178) | +| de | Deutsch | [@NoNamePro0](https://github.com/NoNamePro0) | Refer to the repo of [react-intl-universal](https://github.com/alibaba/react-intl-universal) to get started on internationalization. diff --git a/src/scripts/i18n/_locales.ts b/src/scripts/i18n/_locales.ts index fcdb929..28f2b93 100644 --- a/src/scripts/i18n/_locales.ts +++ b/src/scripts/i18n/_locales.ts @@ -1,12 +1,14 @@ import en_US from "./en-US.json" import zh_CN from "./zh-CN.json" import fr_FR from "./fr-FR.json" +import de from "./de.json" import es from "./es.json" const locales = { "en-US": en_US, "zh-CN": zh_CN, "fr-FR": fr_FR, + "de": de, "es": es, } diff --git a/src/scripts/i18n/de.json b/src/scripts/i18n/de.json new file mode 100644 index 0000000..40b87bd --- /dev/null +++ b/src/scripts/i18n/de.json @@ -0,0 +1,227 @@ +{ + "allArticles": "Alle Artikel", + "add": "Hinzufügen", + "create": "Erstellen", + "icon": "Icon", + "name": "Name", + "openExternal": "Extern öffnen", + "emptyName": "Dieses Feld darf nicht leer sein.", + "emptyField": "Dieses Feld darf nicht leer sein.", + "edit": "Berarbeiten", + "delete": "Entfernen", + "followSystem": "Folge System", + "more": "Mehr", + "close": "Schließen", + "search": "Suchen", + "loadMore": "Lade mehr", + "dangerButton": "Bestätige {action}?", + "confirmMarkAll": "Möchtest Du wirklich alle Artikel als gelesen markieren?", + "confirm": "Bestätigen", + "cancel": "Abbrechen", + "time": { + "now": "gerade eben", + "m": " Minuten", + "h": "h", + "d": " Tage", + "minute": "{m, plural, =1 {# minute} other {# minutes}}", + "hour": "{h, plural, =1 {# hour} other {# hours}}", + "day": "{d, plural, =1 {# day} other {# days}}" + }, + "log": { + "empty": "Keine Benachrichtigungen", + "fetchFailure": "Fehler beim laden von \"{name}\".", + "fetchSuccess": "Erfolgreich {count, plural, =1 {# article} other {# articles}} geladen.", + "networkError": "Netzwerk-Fehler aufgetreten.", + "parseError": "Fehler beim laden des XML Feeds.", + "syncFailure": "Fehler beim syncronisieren" + }, + "nav": { + "menu": "Menü", + "refresh": "Neu laden", + "markAllRead": "Makiere alles als gelesen", + "notifications": "Benachrichtigungen", + "view": "Ansicht", + "settings": "Einstellungen", + "minimize": "Minimieren", + "maximize": "Maximieren" + }, + "menu": { + "close": "Menü schließen", + "subscriptions": "Abonennten" + }, + "article": { + "error": "Fehler beim laden des Artikels.", + "reload": "Neu laden?", + "empty": "Keine Artikel vorhanden", + "untitled": "(Unbenannt)", + "hide": "Artikel ausblenden", + "unhide": "Artikel wieder anzeigen", + "markRead": "Makiere als gelesen", + "markUnread": "Makiere als ungelesen", + "markAbove": "Makiere darüber als gelesen", + "markBelow": "Makiere darunter als gelesen", + "star": "Favorisieren", + "unstar": "Favorit entfernen", + "fontSize": "Schritgröße", + "loadWebpage": "Lade Internetseite", + "loadFull": "Lade kompletten Inhalt", + "notify": "Benachrechtige wenn im Hintergrund erhalten", + "dontNotify": "Nicht benachrechtigen" + }, + "context": { + "share": "Teilen", + "read": "Lesen", + "copyTitle": "Kopiere Title", + "copyURL": "Kopiere URL Link", + "copy": "Kompieren", + "search": "Suche \"{text}\" auf {engine}", + "view": "Ansicht", + "cardView": "Karten-Ansicht", + "listView": "List-Ansicht", + "magazineView": "Magazine-Ansicht", + "compactView": "Kompakte Ansicht", + "filter": "Filter", + "unreadOnly": "Nur ungelesene", + "starredOnly": "Nur Favoriten", + "fullSearch": "Suche im kompletten Text", + "showHidden": "Zeige ausgeblendete Artikel an", + "manageSources": "Verwalte Feeds", + "saveImageAs": "Speichere Bild unter …", + "copyImage": "Kopiere Bild", + "copyImageURL": "Kopiere Bild Link", + "caseSensitive": "Case-Sensitive" + }, + "searchEngine": { + "name": "Suchmachine", + "google": "Google", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo" + }, + "settings": { + "writeError": "Fehler beim schreiben der Datei", + "name": "Einstellungen", + "fetching": "Aktualliesiere Feeds, bitte warten …", + "exit": "Schließe Einstellungen", + "sources": "Feeds", + "grouping": "Gruppen", + "rules": "Regeln", + "service": "Server", + "app": "Einstellungen", + "about": "Info", + "version": "Version", + "shortcuts": "Verknüpfungen", + "openSource": "Open Source", + "feedback": "Feedback" + }, + "sources": { + "serviceWarning": "Feeds die importiert oder hinzugefügt wurden, werden nicht syncroniesiert mit ihrem Server.", + "serviceManaged": "Dieser Feed wird verwaltet von ihrem Server.", + "untitled": "Feed", + "errorAdd": "Ein Fehler ist aufgetreten beim hinzufügen von ihrem Server.", + "errorParse": "Ein Fehler ist aufgetreten beim parsen der OPML Datei.", + "errorParseHint": "Bitte überprüfe, ob die Datei mit UTF-8 formatiert ist.", + "errorImport": "Fehler beim importieren von {count, plural, =1 {# source} other {# sources}}.", + "exist": "Dieser Server existiert bereits", + "opmlFile": "OPML Datei", + "name": "Server Name", + "editName": "Bearbeite Name", + "fetchFrequency": "Frequenzbegrenzung abrufen", + "unlimited": "Unbegrenzt", + "openTarget": "Standard Öffnungs-Ziel für Artikel", + "delete": "Server entfernen", + "add": "Server hinzufügen", + "import": "Importieren", + "export": "Exportieren", + "rssText": "RSS voll Text", + "loadWebpage": "Lade Internetseite", + "inputUrl": "Feed-URL", + "badIcon": "Falsches Icon", + "badUrl": "Falsche URL", + "deleteWarning": "Der Server und alle gespeicherten Artikel werden entfernt.", + "selected": "Ausgewählter Server", + "selectedMulti": "Ausgewählte Server" + }, + "groups": { + "exist": "Diese Gruppe existiert bereits", + "type": "Typ", + "group": "Gruppe", + "source": "Server", + "capacity": "Kapazität", + "exitGroup": "Zurück zu Gruppen", + "deleteSource": "Entfernen von Gruppen", + "sourceHint": "Drag and drop um zu sortieren.", + "create": "Gruppe erstelllen", + "selectedGroup": "Ausgeählte Gruppe", + "selectedSource": "Ausgewählte Feeds", + "enterName": "Namen", + "editName": "Bearbeite Name", + "deleteGroup": "Entgerne Gruppe", + "chooseGroup": "Wählen sie ein Gruppe aus", + "addToGroup": "Hinzufügen zu ...", + "groupHint": "Doppelklicke auf die Gruppe um Feeds zu bearbeiten. Drag and drop zum sortieren." + }, + "rules": { + "intro": "Automatisch markieren von ArtikelA oder senden von Benachrechtigungen mit regulärer Ausdruck.", + "help": "Erfahre mehr", + "source": "Feeds", + "selectSource": "Wähle Feed aus", + "new": "Neue Regel", + "if": "Wenn", + "then": "Dann", + "title": "Title", + "content": "Inhalt", + "fullSearch": "Titel oder Inhalt", + "match": "trifft", + "notMatch": "trifft nicht", + "regex": "regulärer Ausdruck", + "badRegex": "Falscher regulärer Ausdruck.", + "action": "Aktionen", + "selectAction": "Wähle Aktionen", + "hint": "Regeln werden in Reihenfolge verwendet. Drag and drop zum sortieren.", + "test": "Teste Regeln" + }, + "service": { + "intro": "Syncronisiere über mehrere Geräten mit RSS Server.", + "select": "Wähle ein Server aus", + "suggest": "Schlage einen Server vor", + "overwriteWarning": "Lokale Feeds werden gelöscht wenn sie schon auf dem Server existieren.", + "groupsWarning": "Gruppen werden nicht automarisch mit dem Server syncronisiert.", + "endpoint": "Endpoint", + "username": "Username", + "password": "Passwort", + "unchanged": "Unverändert", + "fetchLimit": "Syncronisation-Limit", + "fetchLimitNum": "{count} Artikel", + "importGroups": "Importiere Gruppe", + "failure": "Fehler beim verbinden zum Server", + "failureHint": "Bite überprüfen sie die Server-Konfiguaration oder ihren Netzwerk-Status." + }, + "app": { + "cleanup": "Aufräumen", + "cache": "Cache leeren", + "cacheSize": "{size} Daten gecachet", + "deleteChoices": "Entferne Artikel von vor ... Tagen", + "confirmDelete": "Löschen", + "daysAgo": "vor {days} Tagen", + "deleteAll": "Entferne alle Artikel", + "calculatingSize": "Berechne Größe...", + "itemSize": "Umgefähr {size} lokaler Speicher wird für Artikel genutzt.", + "confirmImport": "Möchtest du wirklich deine Daten neu importieren? Deine aktuellen Daten werden gelöscht.", + "data": "App-Daten", + "backup": "Backup", + "restore": "Restore", + "frData": "Fluent Reader Daten", + "language": "Anzeige Sprache", + "theme": "Theme", + "lightTheme": "Hell", + "darkTheme": "Dunkel", + "enableProxy": "Aktiviere Proxy", + "badUrl": "Falsche URL", + "pac": "PAC Addresse", + "setPac": "Setze PAC Addresse", + "pacHint": "For Socks proxies, it is recommended for PAC to return \"SOCKS5\" for proxy-side DNS. Turning off proxy requires restart.", + "fetchInterval": "Interval zwischen dem Abrufen der Daten", + "never": "Nie" + } +} \ No newline at end of file