diff --git a/app/Http/Middleware/SettingsMiddleware.php b/app/Http/Middleware/SettingsMiddleware.php index c903e580..257cca99 100644 --- a/app/Http/Middleware/SettingsMiddleware.php +++ b/app/Http/Middleware/SettingsMiddleware.php @@ -25,6 +25,10 @@ public function handle($request, Closure $next) config(['app.timezone' => $user_timezone]); } + if ($userLocale = usersettings('locale')) { + app()->setLocale($userLocale); + } + return $next($request); } } diff --git a/app/Http/Requests/UserSettingsUpdateRequest.php b/app/Http/Requests/UserSettingsUpdateRequest.php index 23849b01..1b1600d5 100644 --- a/app/Http/Requests/UserSettingsUpdateRequest.php +++ b/app/Http/Requests/UserSettingsUpdateRequest.php @@ -31,6 +31,7 @@ public function authorize(Request $request) public function rules() { return [ + 'locale' => 'required', 'timezone' => 'required', ]; } diff --git a/config/app.php b/config/app.php index 137f7508..a596f784 100644 --- a/config/app.php +++ b/config/app.php @@ -82,6 +82,12 @@ 'locale' => 'en_US', + 'available_locales' => [ + 'en_US' => 'English', + 'de_DE' => 'Deutsch', + 'zh_CN' => '简体中文', + ], + /* |-------------------------------------------------------------------------- | Application Fallback Locale diff --git a/resources/lang/de_DE/auth.php b/resources/lang/de_DE/auth.php new file mode 100644 index 00000000..8fa1944b --- /dev/null +++ b/resources/lang/de_DE/auth.php @@ -0,0 +1,19 @@ + 'Diese Zugangsdaten stimmen nicht mit unseren Datensätzen überein.', + 'throttle' => 'Zu viele fehlgeschlagene Anmeldeversuche. Bitte versuche es erneut in :seconds Sekunden.', + +]; diff --git a/resources/lang/de_DE/export.php b/resources/lang/de_DE/export.php new file mode 100644 index 00000000..eaacf6f4 --- /dev/null +++ b/resources/lang/de_DE/export.php @@ -0,0 +1,10 @@ + 'Export', + 'start_export_html' => 'Als HTML exportieren', + 'start_export_csv' => 'Als CSV exportieren', + + 'export_help' => 'Wenn Sie den Export ausführen, werden alle vorhandenen Lesezeichen in einer Lesezeichen-kompatiblen Datei oder in einer CSV-Datei gespeichert.', + + 'export_csv_error' => 'Beim Versuch, eine CSV-Datei zu erzeugen, ist ein Fehler aufgetreten. Bitte überprüfen Sie die Protokolldateien für weitere Details.', +]; diff --git a/resources/lang/de_DE/import.php b/resources/lang/de_DE/import.php new file mode 100644 index 00000000..13d378ec --- /dev/null +++ b/resources/lang/de_DE/import.php @@ -0,0 +1,14 @@ + 'Import', + 'start_import' => 'Import starten', + 'import_running' => 'Import läuft...', + 'import_file' => 'Datei für den Import', + + 'import_help' => 'Sie können hier Ihre vorhandenen Lesezeichen importieren. Normalerweise werden Lesezeichen von Ihrem Browser in eine .html Datei exportiert. Wählen Sie die Datei hier aus und starten Sie den Import.
Abhängig von der Anzahl der Lesezeichen kann dieser Prozess einige Zeit in Anspruch nehmen.', + + 'import_networkerror' => 'Beim Importieren der Lesezeichen ist ein Fehler aufgetreten. Bitte überprüfen Sie die Konsole des Browsers oder die Logs der Anwendung für Details.', + 'import_error' => 'Beim Importieren der Lesezeichen ist ein Fehler aufgetreten. Bitte prüfen Sie die Logs der Anwendung.', + 'import_empty' => 'Konnte keine Lesezeichen importieren. Entweder ist die hochgeladene Datei beschädigt oder leer.', + 'import_successfully' => ':imported Links erfolgreich importiert, :skipped übersprungen.', +]; diff --git a/resources/lang/de_DE/link.php b/resources/lang/de_DE/link.php new file mode 100644 index 00000000..37755a7e --- /dev/null +++ b/resources/lang/de_DE/link.php @@ -0,0 +1,64 @@ + 'Link', + 'links' => 'Links', + 'all_links' => 'Alle Links', + 'recent_links' => 'Letzte Links', + 'no_links' => 'Keine Links', + + 'add' => 'Link hinzufügen', + 'add_quick' => 'Link schnell hinzufügen', + 'show' => 'Link anzeigen', + 'details' => 'Link-Details', + 'edit' => 'Link bearbeiten', + 'update' => 'Link aktualisieren', + 'delete' => 'Link löschen', + + 'private' => 'Privater Link', + + 'history' => 'Verlauf', + 'history_added' => ':newvalue zu :fieldname hinzugefügt.', + 'history_changed' => ':fieldname von :oldvalue zu :newvalue geändert', + 'history_removed' => ':oldvalue von :fieldname entfernt.', + 'history_deleted' => 'Link wurde gelöscht', + 'history_restored' => 'Link wurde wiederhergestellt', + 'history_created' => 'Link wurde erstellt', + + 'url' => 'URL', + 'title' => 'Titel', + 'description' => 'Beschreibung', + 'revtags' => 'Tags', + 'revlists' => 'Listen', + 'is_private' => 'Privater Status', + + 'status' => [ + '1' => 'Funktionierend', + '2' => 'Verschoben', + '3' => 'Kaputt', + ], + + 'author' => 'von :user', + + 'external_link' => 'Externer Link', + 'wayback' => 'Archiv @ Wayback Machine', + + 'check_disable' => 'Prüfung deaktivieren', + 'check_disabled' => 'Prüfung ist deaktiviert', + 'check_enable' => 'Prüfung aktivieren', + 'check_enabled' => 'Prüfung ist aktiviert', + + 'added_successfully' => 'Link erfolgreich hinzugefügt.', + 'added_connection_error' => 'Der Link wurde hinzugefügt, aber beim Zugriff auf die URL ist ein Verbindungsfehler aufgetreten. Details finden Sie in den Logs.', + 'added_request_error' => 'Der Link wurde hinzugefügt, aber ein Fehler trat auf, wenn versucht wurde, die URL anzufordern, zum Beispiel ein ungültiges Zertifikat. Details finden Sie in den Logs.', + 'updated_successfully' => 'Link erfolgreich aktualisiert.', + 'deleted_successfully' => 'Link erfolgreich gelöscht.', + 'deletion_error' => 'Link konnte nicht gelöscht werden.', + + 'duplicates_found' => 'LinkAce hat mögliche Duplikate der URL gefunden:', + + 'notifications.linkcheck.errors' => 'LinkAce hat Fehler beim Überprüfen Ihrer Links gefunden.', + 'notifications.linkcheck.errors.moved' => '⚠ Die folgenden Links wurden an einen neuen Ort verschoben:', + 'notifications.linkcheck.errors.broken' => '🚫 Die folgenden Links sind nicht mehr erreichbar oder geben einen Fehler zurück:', + + 'happy_bookmarking' => 'Happy Bookmarking', +]; diff --git a/resources/lang/de_DE/linkace.php b/resources/lang/de_DE/linkace.php new file mode 100644 index 00000000..53efb78c --- /dev/null +++ b/resources/lang/de_DE/linkace.php @@ -0,0 +1,52 @@ + 'LinkAce', + + 'user' => 'Benutzer', + 'username' => 'Benutzername', + 'email' => 'E-Mail', + 'password' => 'Passwort', + 'password_confirm' => 'Passwort bestätigen', + 'login' => 'Anmelden', + 'logout' => 'Abmelden', + 'remember_me' => 'Angemeldet bleiben', + 'go_to_dashboard' => 'Zur Übersicht gehen', + + 'reset_password' => 'Passwort zurücksetzen', + 'send_reset_email' => 'E-Mail zum Zurücksetzen des Passworts senden', + 'forgot_password_link' => 'Passwort vergessen? Hier Zurücksetzen', + + 'added' => 'Hinzugefügt', + 'added_at' => 'Hinzugefügt am', + 'updated_at' => 'Aktualisiert am', + 'last_update' => 'Letzte Aktualisierung', + 'deleted_at' => 'Gelöscht am', + + 'add' => 'Hinzufügen', + 'show' => 'Anzeigen', + 'edit' => 'Bearbeiten', + 'update' => 'Aktualisieren', + 'delete' => 'Löschen', + + 'menu' => 'Menü', + 'entries' => 'Einträge', + + 'continue_adding' => 'Weiter hinzufügen', + + 'private' => 'Privat', + 'is_private' => 'ist privat', + + 'yes' => 'Ja', + 'no' => 'Nein', + 'more' => 'Mehr', + + 'no_results_found' => 'Keine :model gefunden.', + + 'bookmarklet_close' => 'Das Bookmarklet-Fenster schließt automatisch in 5 Sekunden.', + 'open_linkace' => 'LinkAce öffnen', + + 'demo_login_hint' => 'Du kannst dich sofort einloggen. Bitte beachte, dass diese Demo alle 2 Stunden zurückgesetzt wird.', + + 'project_of' => 'Linkace ist ein Projekt von', + 'version' => 'Aktuelle Version: :version', +]; diff --git a/resources/lang/de_DE/list.php b/resources/lang/de_DE/list.php new file mode 100644 index 00000000..d1f3f4b3 --- /dev/null +++ b/resources/lang/de_DE/list.php @@ -0,0 +1,28 @@ + 'Liste', + 'lists' => 'Listen', + 'all_lists' => 'Alle Listen', + + 'add' => 'Liste hinzufügen', + 'show' => 'Liste anzeigen', + 'edit' => 'Liste bearbeiten', + 'update' => 'Liste aktualisieren', + 'delete' => 'Liste löschen', + + 'private' => 'Private Liste', + + 'name' => 'Name der Liste', + 'description' => 'Listenbeschreibung', + + 'author' => 'von :user', + + 'no_lists' => 'Keine Listen', + + 'number_links' => ':number Link in dieser Liste|:number Links in dieser Liste', + + 'added_successfully' => 'Liste erfolgreich hinzugefügt.', + 'updated_successfully' => 'Liste erfolgreich aktualisiert.', + 'deleted_successfully' => 'Liste erfolgreich gelöscht.', + 'deletion_error' => 'Liste konnte nicht gelöscht werden.', +]; diff --git a/resources/lang/de_DE/note.php b/resources/lang/de_DE/note.php new file mode 100644 index 00000000..8b212a4d --- /dev/null +++ b/resources/lang/de_DE/note.php @@ -0,0 +1,20 @@ + 'Notiz', + 'notes' => 'Notizen', + + 'add' => 'Notiz hinzufügen', + 'show' => 'Notiz anzeigen', + 'edit' => 'Notiz bearbeiten', + 'update' => 'Notiz aktualisieren', + 'delete' => 'Notiz löschen', + + 'private' => 'Private Notiz', + + 'note_content' => 'Notiz Inhalt', + + 'added_successfully' => 'Notiz erfolgreich hinzugefügt.', + 'updated_successfully' => 'Notiz erfolgreich aktualisiert.', + 'deleted_successfully' => 'Notiz erfolgreich gelöscht.', + 'deletion_error' => 'Notiz konnte nicht gelöscht werden.', +]; diff --git a/resources/lang/de_DE/pagination.php b/resources/lang/de_DE/pagination.php new file mode 100644 index 00000000..a08736d9 --- /dev/null +++ b/resources/lang/de_DE/pagination.php @@ -0,0 +1,19 @@ + '« Zurück', + 'next' => 'Weiter »', + +]; diff --git a/resources/lang/de_DE/passwords.php b/resources/lang/de_DE/passwords.php new file mode 100644 index 00000000..7472cdbb --- /dev/null +++ b/resources/lang/de_DE/passwords.php @@ -0,0 +1,22 @@ + 'Passwörter müssen mindestens sechs Zeichen lang sein und übereinstimmen.', + 'reset' => 'Ihr Passwort wurde zurückgesetzt!', + 'sent' => 'Wir haben Ihren Link zum Zurücksetzen des Passworts per E-Mail gesendet!', + 'token' => 'Das Passwort Reset Token ist ungültig.', + 'user' => "Wir konnten keinen Benutzer mit dieser E-Mail-Adresse finden.", + +]; diff --git a/resources/lang/de_DE/placeholder.php b/resources/lang/de_DE/placeholder.php new file mode 100644 index 00000000..c7acbe01 --- /dev/null +++ b/resources/lang/de_DE/placeholder.php @@ -0,0 +1,17 @@ + 'maxmustermann', + 'email' => 'max@mustermann.de', + 'password' => 'Passwort', + 'password_confirmed' => 'Passwort wiederholen', + + 'link_url' => 'https://github.com/Kovah/LinkAce', + 'link_title' => 'Titel der Webseite', + + 'list_select' => 'Liste auswählen', + 'tags_select' => 'Tags auswählen', + + 'list_name' => 'Name der Liste', + 'tag_name' => 'Name des Tags', + +]; diff --git a/resources/lang/de_DE/search.php b/resources/lang/de_DE/search.php new file mode 100644 index 00000000..dfe8cd63 --- /dev/null +++ b/resources/lang/de_DE/search.php @@ -0,0 +1,27 @@ + 'Suche', + 'results' => 'Ergebnisse', + + 'filter_by_list' => 'Filtern nach Liste(n)', + 'filter_by_tag' => 'Filtern nach Tag(s)', + 'query' => 'Suchen nach...', + 'search_title' => 'Titel durchsuchen', + 'search_description' => 'Beschreibung durchsuchen', + 'private_only' => 'Nur private Links', + 'broken_links' => 'Nur kaputte Links', + + 'order_by' => 'Sortieren nach', + 'order_by.title:asc' => 'Titel aufsteigend', + 'order_by.title:desc' => 'Titel absteigend', + 'order_by.url:asc' => 'URL aufsteigend', + 'order_by.url:desc' => 'URL absteigend', + 'order_by.created_at:asc' => 'Erstellungsdatum aufsteigend', + 'order_by.created_at:desc' => 'Erstellungsdatum absteigend', + + 'no_results' => 'Keine Ergebnisse gefunden.', + + 'validation_query_missing' => 'Eine Suchabfrage muss vorhanden sein, wenn keine Listen oder Tags angegeben wurden.', + 'validation_lists_missing' => 'Eine Liste muss vorhanden sein, wenn keine Abfrage oder einige Tags angegeben wurden.', + 'validation_tags_missing' => 'Ein Tag muss vorhanden sein, wenn keine Abfrage oder einige Listen angegeben wurden.', +]; diff --git a/resources/lang/de_DE/settings.php b/resources/lang/de_DE/settings.php new file mode 100644 index 00000000..f01747b6 --- /dev/null +++ b/resources/lang/de_DE/settings.php @@ -0,0 +1,89 @@ + 'Einstellungen', + 'user_settings' => 'Benutzereinstellungen', + 'account_settings' => 'Kontoeinstellungen', + 'app_settings' => 'Anwendungseinstellungen', + 'system_settings' => 'Systemeinstellungen', + + 'language' => 'Sprache', + 'timezone' => 'Zeitzone', + 'date_format' => 'Datumsformat', + 'time_format' => 'Zeitformat', + 'listitem_count' => 'Anzahl der Elemente in Listen', + + 'links_new_tab' => 'Externe Links in neuen Tabs öffnen', + + 'privacy' => 'Privatsphäre', + 'links_private_default' => 'Standardmäßig private Links', + 'links_private_default_help' => 'Aktivieren wird alle neuen Links standardmäßig privat machen', + 'notes_private_default' => 'Standardmäßig private Notizen', + 'notes_private_default_help' => 'Aktivieren macht alle neuen Notizen standardmäßig privat', + 'tags_private_default' => 'Standardmäßig private Tags', + 'tags_private_default_help' => 'Aktivieren macht alle neuen Tags standardmäßig privat', + 'lists_private_default' => 'Standardmäßig private Listen', + 'lists_private_default_help' => 'Aktivieren macht alle neuen Listen standardmäßig privat', + + 'archive_backups' => 'Internet Archive Backups', + 'archive_backups_help' => 'Wenn aktiviert, teilt LinkAce dem Internet Archive mit, den Link zu sichern. Durch die Nutzung des Internet Archive erhalten Benutzer eine kostenlose Off-Site Backup-Lösung für den Inhalt ihrer Lesezeichen. Bitte spenden Sie an das Internet Archive.', + 'archive_backups_enabled' => 'Sicherungen aktivieren', + 'archive_backups_enabled_help' => 'Wenn aktiviert, werden nicht-private Links vom Internet Archive gespeichert.', + 'archive_private_backups_enabled' => 'Sicherungen für private Links aktivieren', + 'archive_private_backups_enabled_help' => 'Wenn aktiviert, werden auch private Links gespeichert. Sicherungen müssen aktiviert sein.', + + 'display_mode' => 'Links anzeigen als', + 'display_mode_list_detailed' => 'Liste mit vielen Details', + 'display_mode_list_simple' => 'Liste mit wenigen Details', + 'display_mode_cards' => 'Karten mit weniger Details', + + 'sharing' => 'Link Sharing', + 'sharing_help' => 'Aktivieren Sie alle Dienste, die Sie für Links anzeigen möchten, um sie mit einem Klick einfach teilen zu können.', + 'sharing_toggle' => 'Alle de-/aktivieren', + + 'darkmode' => 'Dark Mode', + 'darkmode_help' => 'Kann entweder permanent oder basierend auf den Geräteeinstellungen aktiviert werden. (Überprüfen Sie hier, ob Ihr Browser die automatische Erkennung unterstützt)', + 'darkmode_disabled' => 'Deaktiviert', + 'darkmode_auto' => 'Automatisch', + 'darkmode_permanent' => 'Permanent', + + 'save_settings' => 'Einstellungen speichern', + 'settings_saved' => 'Einstellungen erfolgreich aktualisiert!', + + 'bookmarklet' => 'Bookmarklet', + 'bookmarklet_button' => 'Ziehen Sie dies zu Ihren Lesezeichen oder klicken Sie mit der rechten Maustaste und speichern Sie es als Lesezeichen', + 'bookmarklet_help' => 'Fügen Sie dieses Bookmarklet Ihrem Browser hinzu, um schnell Links von den besuchten Seiten hinzuzufügen, ohne LinkAce manuell öffnen zu müssen.', + + 'change_password' => 'Passwort ändern', + 'old_password' => 'Altes Passwort', + 'new_password' => 'Neues Passwort', + 'new_password2' => 'Neues Passwort wiederholen', + 'password_updated' => 'Passwort erfolgreich geändert!', + 'old_password_invalid' => 'Das alte Passwort ist ungültig!', + + 'api_token' => 'API Token', + 'api_token_generate' => 'Token generieren', + 'api_token_generate_confirm' => 'Wollen Sie wirklich einen neuen Token erstellen?', + 'api_token_help' => 'Der API-Token kann verwendet werden, um auf LinkAce von anderen Anwendungen oder Skripten aus zuzugreifen.', + 'api_token_generate_info' => 'Achtung: Wenn Sie bereits über ein API-Token verfügen, wird die Generierung eines neuen API-Token alle bestehenden Integrationen unterbrechen!', + 'api_token_generate_failure' => 'Ein neuer API-Token konnte nicht generiert werden. Bitte überprüfen Sie Ihre Browserkonsole und Anwendungsprotokolle für weitere Informationen.', + + 'sys_page_title' => 'Seitentitel', + 'sys_guest_access' => 'Gastzugang aktivieren', + 'sys_guest_access_help' => 'Wenn aktiviert, können Gäste alle Links sehen, die nicht privat sind.', + + 'cron_token' => 'Cron-Token', + 'cron_token_generate' => 'Token generieren', + 'cron_token_generate_confirm' => 'Wollen Sie wirklich einen neuen Token erstellen?', + 'cron_token_help' => 'Der cron-Token wird benötigt, um den cron Dienst auszuführen, der Links überprüft und Sicherungen durchführt.', + 'cron_token_url' => 'Zeigen Sie Ihren Cron auf die folgende URL: :route', + 'cron_token_generate_info' => 'Achtung: Wenn Sie bereits einen Cron-Token haben, wird der aktuell eingerichtete Cron Job unterbrochen!', + 'cron_token_generate_failure' => 'Ein neuer Cron-Token konnte nicht generiert werden. Bitte überprüfen Sie Ihre Browser-Konsole und Anwendungsprotokolle für weitere Informationen.', + 'cron_token_auth_failure' => 'Der angegebene Cron-Token ist ungültig', + 'cron_execute_successful' => 'Cron erfolgreich ausgeführt', + + 'update_check' => 'Updateprüfung', + 'update_check_running' => 'Suche nach Updates...', + 'update_check_version_found' => 'Update gefunden. Version #VERSION# ist verfügbar.', + 'update_check_success' => 'Kein Update gefunden.', + 'update_check_failed' => 'Konnte nicht nach Updates suchen.', +]; diff --git a/resources/lang/de_DE/setup.php b/resources/lang/de_DE/setup.php new file mode 100644 index 00000000..61e48680 --- /dev/null +++ b/resources/lang/de_DE/setup.php @@ -0,0 +1,51 @@ + 'Setup', + 'continue' => 'Weiter', + 'try_again' => 'Erneut versuchen', + + 'welcome' => 'Willkommen zum LinkAce Setup', + 'intro' => 'In den folgenden Schritten werden Sie LinkAce so einrichten, dass Sie es verwenden können.', + 'intro.step1' => 'Überprüfen Sie, ob alle Anforderungen erfüllt sind.', + 'intro.step2' => 'Richten Sie eine Datenbank ein und prüfen Sie, ob die Verbindung erfolgreich ist.', + 'intro.step3' => 'Erstellen Sie Ihr Benutzerkonto.', + + 'check_requirements' => 'Anforderungen prüfen', + 'requirements.php_version' => 'PHP Version >= 7.2.0', + 'requirements.extension_bcmath' => 'PHP Extension: BCMath', + 'requirements.extension_ctype' => 'PHP Extension: Ctype', + 'requirements.extension_json' => 'PHP Extension: JSON', + 'requirements.extension_mbstring' => 'PHP Extension: Mbstring', + 'requirements.extension_openssl' => 'PHP Extension: OpenSSL', + 'requirements.extension_pdo_mysql' => 'PHP Extension: PDO', + 'requirements.extension_tokenizer' => 'PHP Extension: Tokenizer', + 'requirements.extension_xml' => 'PHP Extension: XML', + 'requirements.env_writable' => '.env Datei ist vorhanden und beschreibbar', + + 'database_configuration' => 'Datenbankkonfiguration', + 'database_configure' => 'Datenbank konfigurieren', + 'database.intro' => 'Wenn Sie bereits die Datenbankdaten in Ihrer .env-Datei konfiguriert haben, sollten die Eingabefelder vorausgefüllt sein. Andernfalls füllen Sie die Felder mit den entsprechenden Informationen für Ihre Datenbank.', + 'database.config_error' => 'Datenbank konnte nicht konfiguriert werden. Bitte überprüfen Sie Ihre Verbindungsdetails. Details:', + 'database.db_host' => 'Datenbank-Host', + 'database.db_port' => 'Datenbank-Port', + 'database.db_name' => 'Name der Datenbank', + 'database.db_user' => 'Datenbank-Benutzer', + 'database.db_password' => 'Datenbank-Passwort', + 'database.complete_hint' => 'Das Speichern der Datenbankkonfiguration und die Vorbereitung für die Verwendung der App kann ein paar Sekunden dauern, bitte haben Sie Geduld.', + + 'database.data_present' => 'Achtung! Wir haben Daten in der von Ihnen angegebenen Datenbank gefunden! Bitte stellen Sie sicher, dass Sie eine Sicherung dieser Datenbank haben und bestätigen Sie die Löschung aller Daten.', + 'database.overwrite_data' => 'Ich bestätige, dass alle Daten mit einer neuen LinkAce Datenbank gelöscht und überschrieben werden sollen', + + 'account_setup' => 'Kontoeinrichtung', + 'account_setup.intro' => 'Bevor Sie beginnen können, müssen Sie Ihr Benutzerkonto anlegen.', + 'account_setup.name' => 'Bitte geben Sie Ihren Namen ein', + 'account_setup.email' => 'Geben Sie Ihre E-Mail-Adresse ein', + 'account_setup.password' => 'Ein starkes Passwort eingeben', + 'account_setup.password_requirements' => 'Mindestlänge: 10 Zeichen', + 'account_setup.password_confirmed' => 'Passwort bestätigen', + 'account_setup.create' => 'Konto erstellen', + + 'complete' => 'Setup abgeschlossen!', + 'outro' => 'Sie haben das Setup abgeschlossen und können jetzt LinkAce benutzen! Sie sind eingeloggt und können sofort das Bookmarking starten.', +]; diff --git a/resources/lang/de_DE/sharing.php b/resources/lang/de_DE/sharing.php new file mode 100644 index 00000000..29c6c84e --- /dev/null +++ b/resources/lang/de_DE/sharing.php @@ -0,0 +1,33 @@ + 'Ich habe diesen tollen Link gefunden, schau dir ihn an: #URL#', + 'subject' => 'Sieh dir diesen coolen Link an', + 'share' => 'Link über :service teilen', + 'share_link' => 'Diesen Link teilen', + 'service' => [ + 'email' => 'E-Mail', + 'print' => 'Drucken', + 'facebook' => 'Facebook', + 'twitter' => 'Twitter', + 'reddit' => 'Reddit', + 'pinterest' => 'Pinterest', + 'whatsapp' => 'WhatsApp', + 'telegram' => 'Telegram', + 'fb-messenger' => 'Facebook Messenger', + 'wechat' => 'WeChat', + 'sms' => 'SMS', + 'slack' => 'Slack', + 'skype' => 'Skype', + 'hackernews' => 'Hacker News', + 'discord' => 'Discord', + 'mastodon' => 'Mastodon', + 'pocket' => 'Pocket', + 'flipboard' => 'Flipboard', + 'evernote' => 'Evernote', + 'trello' => 'Trello', + 'buffer' => 'Buffer', + 'tumblr' => 'Tumblr', + 'xing' => 'Xing', + 'linkedin' => 'LinkedIn', + ], +]; diff --git a/resources/lang/de_DE/stats.php b/resources/lang/de_DE/stats.php new file mode 100644 index 00000000..fb56555b --- /dev/null +++ b/resources/lang/de_DE/stats.php @@ -0,0 +1,12 @@ + 'Statistiken', + 'total_links' => 'Gesamte Links', + 'total_lists' => 'Gesamte Listen', + 'total_tags' => 'Gesamte Tags', + 'total_notes' => 'Gesamte Notizen', + 'total_broken_links' => 'Kaputte Links', + +]; diff --git a/resources/lang/de_DE/tag.php b/resources/lang/de_DE/tag.php new file mode 100644 index 00000000..daf5f580 --- /dev/null +++ b/resources/lang/de_DE/tag.php @@ -0,0 +1,25 @@ + 'Tag', + 'tags' => 'Tags', + 'all_tags' => 'Alle Tags', + + 'add' => 'Tag hinzufügen', + 'show' => 'Tag anzeigen', + 'edit' => 'Tag bearbeiten', + 'update' => 'Tag aktualisieren', + 'delete' => 'Tag löschen', + + 'private' => 'Privater Tag', + + 'name' => 'Name das Tags', + + 'author' => 'von :user', + + 'no_tags' => 'Keine Tags', + + 'added_successfully' => 'Tag erfolgreich hinzugefügt.', + 'updated_successfully' => 'Tag erfolgreich aktualisiert.', + 'deleted_successfully' => 'Tag erfolgreich gelöscht.', + 'deletion_error' => 'Tag konnte nicht gelöscht werden.', +]; diff --git a/resources/lang/de_DE/trash.php b/resources/lang/de_DE/trash.php new file mode 100644 index 00000000..4f33b553 --- /dev/null +++ b/resources/lang/de_DE/trash.php @@ -0,0 +1,31 @@ + 'Papierkorb', + + 'deleted_links' => 'Löschte Links', + 'deleted_lists' => 'Gelöschte Listen', + 'deleted_tags' => 'Gelöschte Tags', + 'deleted_notes' => 'Gelöschte Notizen', + + 'restore' => 'Eintrag wiederherstellen', + + 'clear_trash' => 'Papierkorb leeren', + 'delete_warning' => 'Dauerhaft gelöschte Einträge können nicht wiederhergestellt werden!', + 'delete_no_entries' => 'Keine Einträge zu löschen.', + + 'delete_success.links' => 'Alle Links dauerhaft gelöscht.', + 'delete_success.lists' => 'Alle Listen dauerhaft gelöscht.', + 'delete_success.tags' => 'Alle Tags dauerhaft gelöscht.', + 'delete_success.notes' => 'Alle Notizen dauerhaft gelöscht.', + + 'restore.link' => 'Link wurde aus dem Papierkorb wiederhergestellt.', + 'restore.list' => 'Liste wurde aus dem Papierkorb wiederhergestellt.', + 'restore.tag' => 'Tag wurde aus dem Papierkorb wiederhergestellt.', + 'restore.note' => 'Notiz wurde aus dem Papierkorb wiederhergestellt.', + + 'restore.not_found' => 'Das wiederherzustellende Element konnte nicht gefunden werden.', + 'restore.not_allowed' => 'Sie sind nicht berechtigt, dieses Element wiederherzustellen.', + +]; diff --git a/resources/lang/de_DE/user.php b/resources/lang/de_DE/user.php new file mode 100644 index 00000000..5dd9440e --- /dev/null +++ b/resources/lang/de_DE/user.php @@ -0,0 +1,10 @@ + 'Benutzer', + 'users' => 'Benutzer', + + 'username' => 'Benutzername', + 'email' => 'E-Mail', + + 'hello' => 'Hallo :user!', +]; diff --git a/resources/lang/de_DE/validation.php b/resources/lang/de_DE/validation.php new file mode 100644 index 00000000..d163bb19 --- /dev/null +++ b/resources/lang/de_DE/validation.php @@ -0,0 +1,146 @@ + ':attribute muss akzeptiert werden.', + 'active_url' => ':attribute ist keine gültige URL.', + 'after' => ':attribute muss ein Datum nach dem :date sein.', + 'after_or_equal' => 'Das Attribut: muss ein Datum nach oder gleich: date sein.', + 'alpha' => ':attribute darf nur aus Buchstaben bestehen.', + 'alpha_dash' => ':attribute darf nur Buchstaben, Zahlen, Bindestriche und Unterstriche enthalten.', + 'alpha_num' => ':attribute darf nur aus Buchstaben und Zahlen bestehen.', + 'array' => ':attribute muss ein Array sein.', + 'before' => ':attribute muss ein Datum vor :date sein.', + 'before_or_equal' => ':attribute muss ein Datum vor oder gleich :date sein.', + 'between' => [ + 'numeric' => ':attribute muss zwischen :min und :max liegen.', + 'file' => ':attribute muss zwischen :min und :max Kilobytes sein.', + 'string' => ':attribute muss zwischen :min und :max Zeichen haben.', + 'array' => ':attribute muss zwischen :min und :max Elemente haben.', + ], + 'boolean' => ':attribute muss wahr oder falsch sein.', + 'confirmed' => ':attribute Bestätigung stimmt nicht überein.', + 'date' => ':attribute ist kein gültiges Datum.', + 'date_format' => ':attribute entspricht nicht dem Format :format.', + 'different' => ':attribute und :other müssen unterschiedlich sein.', + 'digits' => ':attribute muss :digits Zeichen enthalten.', + 'digits_between' => ':attribute muss zwischen :min und :max Zeichen haben.', + 'dimensions' => ':attribute hat ungültige Bildgrößen.', + 'distinct' => ':attribute Feld hat einen doppelten Wert.', + 'email' => ':attribute muss eine gültige E-Mail-Adresse sein.', + 'exists' => ':attribute ist ungültig.', + 'file' => ':attribute muss eine Datei sein.', + 'filled' => ':attribute Feld muss einen Wert haben.', + 'gt' => [ + 'numeric' => ':attribute muss größer als :value sein.', + 'file' => ':attribute muss größer als :value Kilobytes sein.', + 'string' => ':attribute muss größer als :value sein.', + 'array' => ':attribute muss mehr als :value Elemente haben.', + ], + 'gte' => [ + 'numeric' => ':attribute muss größer oder gleich :value sein.', + 'file' => ':attribute muss größer als oder gleich :value Kilobytes sein.', + 'string' => ':attribute muss größer als oder gleich :value sein.', + 'array' => ':attribute muss :value oder mehr Einträge haben.', + ], + 'image' => ':attribute muss ein Bild sein.', + 'in' => 'Das ausgewählte :attribute ist ungültig.', + 'in_array' => 'Das Feld :attribute existiert nicht in :other.', + 'integer' => ':attribute muss eine Ganzzahl sein.', + 'ip' => ':attribute muss eine gültige IP-Adresse sein.', + 'ipv4' => ':attribute muss eine gültige IPv4-Adresse sein.', + 'ipv6' => ':attribute muss eine gültige IPv6-Adresse sein.', + 'json' => ':attribute muss ein gültiger JSON-String sein.', + 'lt' => [ + 'numeric' => ':attribute muss kleiner als :value sein.', + 'file' => ':attribute muss kleiner als :value Kilobytes sein.', + 'string' => ':attribute muss weniger als :value Zeichen enthalten.', + 'array' => ':attribute muss weniger als :value Elemente haben.', + ], + 'lte' => [ + 'numeric' => ':attribute muss kleiner oder gleich :value sein.', + 'file' => ':attribute muss kleiner oder gleich :value Kilobytes sein.', + 'string' => ':attribute muss kleiner oder gleich :value sein.', + 'array' => ':attribute darf nicht mehr als :value Elemente haben.', + ], + 'max' => [ + 'numeric' => ':attribute darf nicht größer als :max sein.', + 'file' => ':attribute darf nicht größer als :max Kilobytes sein.', + 'string' => ':attribute darf nicht größer als :max Zeichen sein.', + 'array' => ':attribute darf nicht mehr als :max Elemente haben.', + ], + 'mimes' => ':attribute muss eine Datei des Typs :values sein.', + 'mimetypes' => ':attribute muss eine Datei des Typs :values sein.', + 'min' => [ + 'numeric' => ':attribute muss mindestens :min sein.', + 'file' => ':attribute muss mindestens :min Kilobytes sein.', + 'string' => ':attribute muss mindestens :min Zeichen enthalten.', + 'array' => ':attribute muss mindestens :min Elemente haben.', + ], + 'not_in' => 'Das ausgewählte :attribute ist ungültig.', + 'not_regex' => ':attribute Format ist ungültig.', + 'numeric' => ':attribute muss eine Zahl sein.', + 'present' => ':attribute muss vorhanden sein.', + 'regex' => ':attribute Format ist ungültig.', + 'required' => ':attribute Feld ist erforderlich.', + 'required_if' => ':attribute muss angegeben werden, wenn :other :value ist.', + 'required_unless' => ':attribute Feld ist erforderlich, sofern :other nicht in :values ist.', + 'required_with' => ':attribute muss angegeben werden, wenn :values vorhanden ist.', + 'required_with_all' => ':attribute muss angegeben werden, wenn :values vorhanden ist.', + 'required_without' => ':attribute muss angegeben werden, wenn :values nicht vorhanden ist.', + 'required_without_all' => ':attribute muss angegeben werden, wenn kein :values vorhanden ist.', + 'same' => ':attribute und :other müssen übereinstimmen.', + 'size' => [ + 'numeric' => ':attribute muss :size sein.', + 'file' => ':attribute muss :size kilobytes sein.', + 'string' => ':attribute muss :size Zeichen haben.', + 'array' => ':attribute muss :size Elemente enthalten.', + ], + 'string' => ':attribute muss ein String sein.', + 'timezone' => ':attribute muss eine gültige Zone sein.', + 'unique' => ':attribute ist bereits vergeben.', + 'uploaded' => ':attribute konnte nicht hochgeladen werden.', + 'url' => ':attribute Format ist ungültig.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'benutzerdefinierte Nachricht', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/lang/en_US/settings.php b/resources/lang/en_US/settings.php index 0b8703bc..e73515a4 100644 --- a/resources/lang/en_US/settings.php +++ b/resources/lang/en_US/settings.php @@ -6,6 +6,7 @@ 'app_settings' => 'Application Settings', 'system_settings' => 'System Settings', + 'language' => 'Language', 'timezone' => 'Timezone', 'date_format' => 'Date Format', 'time_format' => 'Time Format', diff --git a/resources/lang/zh_CN/auth.php b/resources/lang/zh_CN/auth.php new file mode 100644 index 00000000..7ebcf694 --- /dev/null +++ b/resources/lang/zh_CN/auth.php @@ -0,0 +1,19 @@ + '您输入的信息与我们的记录不匹配。', + 'throttle' => '登录失败次数过多,请 :seconds 秒后再试。', + +]; diff --git a/resources/lang/zh_CN/export.php b/resources/lang/zh_CN/export.php new file mode 100644 index 00000000..a426bd11 --- /dev/null +++ b/resources/lang/zh_CN/export.php @@ -0,0 +1,10 @@ + '导出', + 'start_export_html' => '导出至HTML', + 'start_export_csv' => '导出至 CSV', + + 'export_help' => '运行导出将会将所有现有书签保存到一个普通书签兼容的文件,或者如果您想要的话,将会保存到一个 CSV 文件。', + + 'export_csv_error' => '尝试生成 CSV 文件时发生错误。请检查日志文件的详细信息。', +]; diff --git a/resources/lang/zh_CN/import.php b/resources/lang/zh_CN/import.php new file mode 100644 index 00000000..e706f4c0 --- /dev/null +++ b/resources/lang/zh_CN/import.php @@ -0,0 +1,14 @@ + '导入', + 'start_import' => '开始导入', + 'import_running' => '正在运行导入...', + 'import_file' => '从文件中导入', + + 'import_help' => '您可以在此处导入现有的浏览器书签。通常,您可以用浏览器将书签导出至 .html 文件中。在此处选择文件并开始导入。
根据书签的数量,导入过程可能需要一些时间。', + + 'import_networkerror' => '试图导入书签时出错。请检查您的浏览器控制台的详细信息或查看应用程序日志。', + 'import_error' => '试图导入书签时出错。请查询应用程序日志。', + 'import_empty' => '无法导入任何书签。上传的文件可能已损坏或为空。', + 'import_successfully' => ':imported 个链接导入成功, :skipped 个跳过.', +]; diff --git a/resources/lang/zh_CN/link.php b/resources/lang/zh_CN/link.php new file mode 100644 index 00000000..1d1a8ba9 --- /dev/null +++ b/resources/lang/zh_CN/link.php @@ -0,0 +1,64 @@ + '链接', + 'links' => '网址', + 'all_links' => '所有链接', + 'recent_links' => '最近的链接', + 'no_links' => '无链接', + + 'add' => '添加链接', + 'add_quick' => '快速添加链接', + 'show' => '显示链接', + 'details' => '链接详情', + 'edit' => '编辑链接', + 'update' => '更新链接', + 'delete' => '删除链接', + + 'private' => '私人链接', + + 'history' => '历史', + 'history_added' => '添加 :newvalue 到 :fieldname', + 'history_changed' => ':fieldname 从 :oldvalue 更改为 :newvalue', + 'history_removed' => '从 :fieldname 中删除 :oldvalue。', + 'history_deleted' => '链接已删除', + 'history_restored' => '链接已恢复', + 'history_created' => '链接已创建', + + 'url' => '链接', + 'title' => '网站标题', + 'description' => '描述', + 'revtags' => '标签', + 'revlists' => '列表', + 'is_private' => '隐私状态', + + 'status' => [ + '1' => '运行中', + '2' => '移动', + '3' => '已失效', + ], + + 'author' => '创建者::user', + + 'external_link' => '外部链接', + 'wayback' => '链接存档 @ Wayback Machine', + + 'check_disable' => '禁用网站检查', + 'check_disabled' => '已禁用检查', + 'check_enable' => '启用网站检查', + 'check_enabled' => '已启用检查', + + 'added_successfully' => '已添加链接。', + 'added_connection_error' => '链接已添加,但在尝试访问 URL 时发生连接错误。详细信息可以在日志中找到。', + 'added_request_error' => '链接已添加,但在尝试请求URL时发生错误,例如无效的证书。 详细信息可以在日志中找到。', + 'updated_successfully' => '已更新链接。', + 'deleted_successfully' => '已删除链接。', + 'deletion_error' => '无法删除链接。', + + 'duplicates_found' => 'LinkAce发现提交的 URL可能重复:', + + 'notifications.linkcheck.errors' => 'LinkAce在检查您的链接时发生错误。', + 'notifications.linkcheck.errors.moved' => '⚠ 以下链接移动到一个新位置:', + 'notifications.linkcheck.errors.broken' => '🚫 以下链接不再可访问或返回一个错误:', + + 'happy_bookmarking' => '快乐的收藏书签把!', +]; diff --git a/resources/lang/zh_CN/linkace.php b/resources/lang/zh_CN/linkace.php new file mode 100644 index 00000000..c81a7bc4 --- /dev/null +++ b/resources/lang/zh_CN/linkace.php @@ -0,0 +1,52 @@ + 'LinkAce', + + 'user' => '用户', + 'username' => '用户名', + 'email' => '电子邮箱', + 'password' => '密码', + 'password_confirm' => '确认密码', + 'login' => '登录', + 'logout' => '登出', + 'remember_me' => '记住我的登陆', + 'go_to_dashboard' => '转到控制面板', + + 'reset_password' => '重置密码', + 'send_reset_email' => '发送密码重置链接', + 'forgot_password_link' => '忘记密码?点此重置', + + 'added' => '已添加', + 'added_at' => '添加于', + 'updated_at' => '更新于', + 'last_update' => '最后更新', + 'deleted_at' => '删除于', + + 'add' => '添加', + 'show' => '显示', + 'edit' => '编辑', + 'update' => '更新', + 'delete' => '删除', + + 'menu' => '菜单', + 'entries' => '条目', + + 'continue_adding' => '继续添加', + + 'private' => '仅自己可见', + 'is_private' => '是否仅自己可见', + + 'yes' => '是', + 'no' => '否', + 'more' => '更多', + + 'no_results_found' => '未找到 :model 。', + + 'bookmarklet_close' => '此书签窗口在 5 秒内自动关闭。', + 'open_linkace' => '打开 LinkAce', + + 'demo_login_hint' => '您可以立即登录。请注意此演示将每隔2小时重置。', + + 'project_of' => 'LinkAce 项目由', + 'version' => '当前版本: :version', +]; diff --git a/resources/lang/zh_CN/list.php b/resources/lang/zh_CN/list.php new file mode 100644 index 00000000..c474bf7c --- /dev/null +++ b/resources/lang/zh_CN/list.php @@ -0,0 +1,28 @@ + '列表', + 'lists' => '列表', + 'all_lists' => '所有列表', + + 'add' => '添加列表', + 'show' => '显示列表', + 'edit' => '编辑列表', + 'update' => '更新列表', + 'delete' => '删除列表', + + 'private' => '私有列表', + + 'name' => '列表名称', + 'description' => '列表描述', + + 'author' => '创建者::user', + + 'no_lists' => '列表为空', + + 'number_links' => ':number 链接在这个列表中|:number 链接在这个列表', + + 'added_successfully' => '已添加列表。', + 'updated_successfully' => '已更新列表。', + 'deleted_successfully' => '已删除列表。', + 'deletion_error' => '无法删除列表。', +]; diff --git a/resources/lang/zh_CN/note.php b/resources/lang/zh_CN/note.php new file mode 100644 index 00000000..b0269621 --- /dev/null +++ b/resources/lang/zh_CN/note.php @@ -0,0 +1,20 @@ + '注释', + 'notes' => '备注', + + 'add' => '添加注释', + 'show' => '显示备注', + 'edit' => '编辑注释', + 'update' => '更新注释', + 'delete' => '删除注释', + + 'private' => '私人注释', + + 'note_content' => '备注内容', + + 'added_successfully' => '已添加注释。', + 'updated_successfully' => '已更新注释。', + 'deleted_successfully' => '已删除注释。', + 'deletion_error' => '无法删除注释。', +]; diff --git a/resources/lang/zh_CN/pagination.php b/resources/lang/zh_CN/pagination.php new file mode 100644 index 00000000..5605e8de --- /dev/null +++ b/resources/lang/zh_CN/pagination.php @@ -0,0 +1,19 @@ + '« 前进', + 'next' => '后退 »', + +]; diff --git a/resources/lang/zh_CN/passwords.php b/resources/lang/zh_CN/passwords.php new file mode 100644 index 00000000..f1453066 --- /dev/null +++ b/resources/lang/zh_CN/passwords.php @@ -0,0 +1,22 @@ + '密码必须至少包含六个字符,并且与确认字符匹配。', + 'reset' => '您的密码已重置!', + 'sent' => '我们已经将密码重置链接发送至您的电子邮箱!', + 'token' => '此密码重置令牌无效。', + 'user' => "我们没有找到使用这个邮箱地址的用户。", + +]; diff --git a/resources/lang/zh_CN/placeholder.php b/resources/lang/zh_CN/placeholder.php new file mode 100644 index 00000000..75786668 --- /dev/null +++ b/resources/lang/zh_CN/placeholder.php @@ -0,0 +1,17 @@ + 'johndoe', + 'email' => 'john.doe@example.com', + 'password' => '密码', + 'password_confirmed' => '已确认密码', + + 'link_url' => 'https://github.com/Kovah/LinkAce', + 'link_title' => '网站标题', + + 'list_select' => '选择列表', + 'tags_select' => '选择标签', + + 'list_name' => '列表的实际名称', + 'tag_name' => '标签的实际名称', + +]; diff --git a/resources/lang/zh_CN/search.php b/resources/lang/zh_CN/search.php new file mode 100644 index 00000000..21fe4555 --- /dev/null +++ b/resources/lang/zh_CN/search.php @@ -0,0 +1,27 @@ + '搜索', + 'results' => '结果', + + 'filter_by_list' => '按列表筛选', + 'filter_by_tag' => '按标签筛选', + 'query' => '搜索......', + 'search_title' => '搜索标题', + 'search_description' => '搜索描述', + 'private_only' => '仅私有链接', + 'broken_links' => '仅失效的链接', + + 'order_by' => '排序方式', + 'order_by.title:asc' => '按标题升序排序', + 'order_by.title:desc' => '按标题降序排序', + 'order_by.url:asc' => '按网址升序排序', + 'order_by.url:desc' => '按网址降序排序', + 'order_by.created_at:asc' => '按创建日期升序排序', + 'order_by.created_at:desc' => '按创建日期降序排序', + + 'no_results' => '未找到任何结果。', + + 'validation_query_missing' => '如果没有提供列表或标签,搜索查询必须存在。', + 'validation_lists_missing' => '如果没有提供查询或某些标签,列表必须存在。', + 'validation_tags_missing' => '如果没有提供查询或某些标签,列表必须存在。', +]; diff --git a/resources/lang/zh_CN/settings.php b/resources/lang/zh_CN/settings.php new file mode 100644 index 00000000..d5f7d066 --- /dev/null +++ b/resources/lang/zh_CN/settings.php @@ -0,0 +1,89 @@ + '设置', + 'user_settings' => '用户设置', + 'account_settings' => '账号设置', + 'app_settings' => '应用程序设置', + 'system_settings' => '系统设置', + + 'language' => '语言', + 'timezone' => '时区', + 'date_format' => '日期格式', + 'time_format' => '时间格式', + 'listitem_count' => '列表中的项目数', + + 'links_new_tab' => '始终在新的标签页打开外部链接', + + 'privacy' => '隐私', + 'links_private_default' => '默认私密链接', + 'links_private_default_help' => '启用此选项将默认所有新链接为私密链接', + 'notes_private_default' => '默认私密笔记', + 'notes_private_default_help' => '启用此选项将默认所有新注释为私密链接', + 'tags_private_default' => '默认私密标签', + 'tags_private_default_help' => '启用此选项将默认所有新标签都是私有的', + 'lists_private_default' => '默认私密列表', + 'lists_private_default_help' => '启用此选项将默认所有新列表都是私有的', + + 'archive_backups' => 'Internet Archive 备份', + 'archive_backups_help' => '如果启用,LinkAce将告诉 Internet Archive 来备份链接。 通过使用 Internet Archive,用户可以获得一个免费的、外部的书签内容备份解决方案。请考虑捐赠给 Internet Archive。', + 'archive_backups_enabled' => '启用备份', + 'archive_backups_enabled_help' => '如果启用,非私人链接将存档在 Internet Archive 中。', + 'archive_private_backups_enabled' => '启用私密链接备份', + 'archive_private_backups_enabled_help' => '如果启用,也将保存私有链接。必须启用备份。', + + 'display_mode' => '链接显示为', + 'display_mode_list_detailed' => '列出更多信息', + 'display_mode_list_simple' => '列出部分信息', + 'display_mode_cards' => '细节较少的卡片', + + 'sharing' => '链接共享', + 'sharing_help' => '启用您想要显示链接的所有服务,以便能够轻松地通过单击分享链接。', + 'sharing_toggle' => '切换所有开关', + + 'darkmode' => '夜间模式', + 'darkmode_help' => '您可以选择永久开启或根据您的设备设置自动开启。 (点击这里检查 如果您的浏览器支持自动检测)', + 'darkmode_disabled' => '已禁用', + 'darkmode_auto' => '自动开启', + 'darkmode_permanent' => '始终开启', + + 'save_settings' => '保存设置', + 'settings_saved' => '设置已更新!', + + 'bookmarklet' => '小书签', + 'bookmarklet_button' => '拖动至您的书签栏或右键保存至书签', + 'bookmarklet_help' => '将小书签添加到您的浏览器中,以便您从访问的站点快速添加链接,而无需手动打开 LinkAce 。', + + 'change_password' => '修改密码', + 'old_password' => '旧密码', + 'new_password' => '新密码', + 'new_password2' => '重复输入新密码', + 'password_updated' => '密码修改完成!', + 'old_password_invalid' => '旧密码无效!', + + 'api_token' => 'API 令牌', + 'api_token_generate' => '生成令牌', + 'api_token_generate_confirm' => '您确定要生成新令牌吗?', + 'api_token_help' => 'API 令牌可以用来从其他应用程序或脚本访问 LinkAce。', + 'api_token_generate_info' => '注意:如果你已经有 API 令牌,生成一个新的令牌会破坏所有现有的集成!', + 'api_token_generate_failure' => '无法生成新的 API 令牌。请检查您的浏览器控制台和应用程序日志以获取更多信息。', + + 'sys_page_title' => '页面标题', + 'sys_guest_access' => '启用访客访问', + 'sys_guest_access_help' => '如果启用,访客将能够看到所有非私密链接。', + + 'cron_token' => 'Cron 令牌', + 'cron_token_generate' => '生成令牌', + 'cron_token_generate_confirm' => '您确定要生成新令牌吗?', + 'cron_token_help' => '使用 cron 令牌来运行 cron 服务以检查死链接或运行备份。', + 'cron_token_url' => '将你的cron点到以下URL: :route', + 'cron_token_generate_info' => '注意:如果你已经有一个cron token,生成一个新的 cron 任务将会中断现有的 cron 任务!', + 'cron_token_generate_failure' => '无法生成新的 cron 令牌。请检查您的浏览器控制台和应用程序日志以获取更多信息。', + 'cron_token_auth_failure' => '提供的 cron 令牌无效', + 'cron_execute_successful' => 'Cron 成功执行', + + 'update_check' => '检查更新', + 'update_check_running' => '正在检查更新…', + 'update_check_version_found' => '发现新版本 #VERSION# 可用。', + 'update_check_success' => '没有发现更新。', + 'update_check_failed' => '无法检查更新。', +]; diff --git a/resources/lang/zh_CN/setup.php b/resources/lang/zh_CN/setup.php new file mode 100644 index 00000000..d031a6df --- /dev/null +++ b/resources/lang/zh_CN/setup.php @@ -0,0 +1,51 @@ + '安装', + 'continue' => '继续', + 'try_again' => '重试', + + 'welcome' => '欢迎使用 LinkAce', + 'intro' => '完成以下步骤进行 LinkAce 安装', + 'intro.step1' => '检查是否符合所有要求。', + 'intro.step2' => '设置数据库并检查连接是否成功。', + 'intro.step3' => '创建您的帐户。', + + 'check_requirements' => '检查要求', + 'requirements.php_version' => 'PHP version >= 7.2.0', + 'requirements.extension_bcmath' => 'PHP Extension: BCMath', + 'requirements.extension_ctype' => 'PHP Extension: Ctype', + 'requirements.extension_json' => 'PHP Extension: JSON', + 'requirements.extension_mbstring' => 'PHP Extension: Mbstring', + 'requirements.extension_openssl' => 'PHP Extension: OpenSSL', + 'requirements.extension_pdo_mysql' => 'PHP Extension: PDO', + 'requirements.extension_tokenizer' => 'PHP Extension: Tokenizer', + 'requirements.extension_xml' => 'PHP Extension: XML', + 'requirements.env_writable' => '.env 文件已存在并可写', + + 'database_configuration' => '数据库配置', + 'database_configure' => '配置数据库', + 'database.intro' => '如果您已经在 .env 文件中填写了数据库详细信息,输入字段应该预先填写。 否则,请填写相应的数据库信息。', + 'database.config_error' => '数据库无法配置。请检查您的连接详细信息:', + 'database.db_host' => '数据库主机', + 'database.db_port' => '数据库端口', + 'database.db_name' => '数据库名称', + 'database.db_user' => '数据库用户', + 'database.db_password' => '数据库密码', + 'database.complete_hint' => '保存数据库配置并准备使用应用程序可能需要几秒钟,请耐心等待。', + + 'database.data_present' => '注意!我们在您指定的数据库中找到数据! 请确保您有该数据库的备份并确认删除所有数据。', + 'database.overwrite_data' => '我确认所有数据应该被删除并用新的 LinkAce 数据库覆盖', + + 'account_setup' => '账户设置', + 'account_setup.intro' => '在您开始之前,您必须创建您的用户帐户。', + 'account_setup.name' => '输入您的名称', + 'account_setup.email' => '输入您电子邮箱', + 'account_setup.password' => '输入较强的密码。', + 'account_setup.password_requirements' => '最小长度:10 个字符', + 'account_setup.password_confirmed' => '确认您的密码', + 'account_setup.create' => '创建帐户', + + 'complete' => '安装完成!', + 'outro' => '您已完成设置,现在可以使用 LinkAce!您已登录并可以马上开始使用书签。', +]; diff --git a/resources/lang/zh_CN/sharing.php b/resources/lang/zh_CN/sharing.php new file mode 100644 index 00000000..c44cc410 --- /dev/null +++ b/resources/lang/zh_CN/sharing.php @@ -0,0 +1,33 @@ + '我找到了这个很棒的链接,去查看它:#URL#', + 'subject' => '快来看看这个很酷的链接', + 'share' => '通过 :service 分享链接', + 'share_link' => '分享此链接', + 'service' => [ + 'email' => '电子邮箱', + 'print' => '打印', + 'facebook' => 'Facebook', + 'twitter' => 'Twitter', + 'reddit' => 'Reddit', + 'pinterest' => 'Pinterest', + 'whatsapp' => 'WhatsApp', + 'telegram' => 'Telegram', + 'fb-messenger' => 'Facebook Messenger', + 'wechat' => '微信', + 'sms' => '短信', + 'slack' => 'Slack', + 'skype' => 'Skype', + 'hackernews' => 'Hacker News', + 'discord' => 'Discord', + 'mastodon' => 'Mastodon', + 'pocket' => 'Pocket', + 'flipboard' => 'Flipboard', + 'evernote' => 'Evernote', + 'trello' => 'Trello', + 'buffer' => 'Buffer', + 'tumblr' => 'Tumblr', + 'xing' => 'Xing', + 'linkedin' => '领英', + ], +]; diff --git a/resources/lang/zh_CN/stats.php b/resources/lang/zh_CN/stats.php new file mode 100644 index 00000000..c910d627 --- /dev/null +++ b/resources/lang/zh_CN/stats.php @@ -0,0 +1,12 @@ + '统计', + 'total_links' => '全部链接', + 'total_lists' => '全部列表', + 'total_tags' => '所有标签', + 'total_notes' => '全部备注', + 'total_broken_links' => '失效链接', + +]; diff --git a/resources/lang/zh_CN/tag.php b/resources/lang/zh_CN/tag.php new file mode 100644 index 00000000..e748ffc6 --- /dev/null +++ b/resources/lang/zh_CN/tag.php @@ -0,0 +1,25 @@ + '标签', + 'tags' => '标签', + 'all_tags' => '所有标签', + + 'add' => '添加标签', + 'show' => '显示标签', + 'edit' => '编辑标签', + 'update' => '更新标签', + 'delete' => '删除标签', + + 'private' => '私人标签', + + 'name' => '标签名', + + 'author' => '创建者::user', + + 'no_tags' => '无标签', + + 'added_successfully' => '已添加标签。', + 'updated_successfully' => '已更新标签。', + 'deleted_successfully' => '已删除标签。', + 'deletion_error' => '无法删除标签。', +]; diff --git a/resources/lang/zh_CN/trash.php b/resources/lang/zh_CN/trash.php new file mode 100644 index 00000000..6117baf8 --- /dev/null +++ b/resources/lang/zh_CN/trash.php @@ -0,0 +1,31 @@ + '回收站', + + 'deleted_links' => '已回收链接', + 'deleted_lists' => '已回收列表', + 'deleted_tags' => '已回收标签', + 'deleted_notes' => '备注回收站', + + 'restore' => '还原', + + 'clear_trash' => '清空回收站', + 'delete_warning' => '永久删除的条目无法恢复!', + 'delete_no_entries' => '没有要删除的条目。', + + 'delete_success.links' => '永久删除所有链接。', + 'delete_success.lists' => '永久删除所有列表。', + 'delete_success.tags' => '永久删除所有标签。', + 'delete_success.notes' => '永久删除所有备注。', + + 'restore.link' => '从回收站恢复链接。', + 'restore.list' => '从回收站恢复列表。', + 'restore.tag' => '从回收站恢复标签。', + 'restore.note' => '从回收站恢复备注。', + + 'restore.not_found' => '找不到要还原的项目。', + 'restore.not_allowed' => '您无权恢复此项目。', + +]; diff --git a/resources/lang/zh_CN/user.php b/resources/lang/zh_CN/user.php new file mode 100644 index 00000000..c5aea21e --- /dev/null +++ b/resources/lang/zh_CN/user.php @@ -0,0 +1,10 @@ + '用户', + 'users' => '用户', + + 'username' => '用户名', + 'email' => '电子邮箱', + + 'hello' => '您好 :user!', +]; diff --git a/resources/lang/zh_CN/validation.php b/resources/lang/zh_CN/validation.php new file mode 100644 index 00000000..01dc7a52 --- /dev/null +++ b/resources/lang/zh_CN/validation.php @@ -0,0 +1,146 @@ + ':attribute 必须被接受。', + 'active_url' => ':attribute 不是一个有效的 URL。', + 'after' => ':attribute 必须在 :date 之后。', + 'after_or_equal' => ':attribute 必须是晚于或等于 :date 的日期。', + 'alpha' => ':attribute 只能包含字母', + 'alpha_dash' => ':attribute 只能包含字母、 数字、 破折号和下划线。', + 'alpha_num' => ':attribute 只能包含字母和数字。', + 'array' => ':attribute 必须是一个数组。', + 'before' => ':attribute 必须在 :date 之前。', + 'before_or_equal' => ':attribute 必须早于或等于 :date 的日期。', + 'between' => [ + 'numeric' => ':attribute 必须在 :min 到 :max 之间。', + 'file' => ':attribute 必须介于 :min 到 :max kb 之间。', + 'string' => ':attribute 必须介于 :min 到 :max 字符之间。', + 'array' => ':attribute 必须在 :min 到 :max 项目之间。', + ], + 'boolean' => ':attribute 字段必须为 true 或 false。', + 'confirmed' => ':attribute 不匹配', + 'date' => ':attribute 不是一个有效的日期。', + 'date_format' => ':attribute 与格式 :format 不匹配。', + 'different' => ':attribute 和 :other 必须不同。', + 'digits' => ':attribute 必须是 :digits 数字', + 'digits_between' => ':attribute 必须介于 :min 到 :max 位数字之间。', + 'dimensions' => ':attribute 的图像尺寸无效。', + 'distinct' => ':attribute 具有重复值。', + 'email' => ':attribute 必须是一个有效的电子邮件地址。', + 'exists' => '选中的 :attribute 无效。', + 'file' => ':attribute 必须是一个文件。', + 'filled' => ':attribute 字段必须有一个值。', + 'gt' => [ + 'numeric' => ':attribute 必须大于 :value', + 'file' => ':attribute 必须大于 :value kbytes。', + 'string' => ':attribute 必须大于 :value 字符。', + 'array' => ':attribute 必须超过 :value 项。', + ], + 'gte' => [ + 'numeric' => ':attribute 必须大于等于 :value', + 'file' => ':attribute 必须大于等于:value kbytes。', + 'string' => ':attribute 必须大于或等于 :value 字符。', + 'array' => ':attribute 必须有 :value 项目或更多。', + ], + 'image' => ':attribute 必须是一个图像。', + 'in' => '选中的 :attribute 无效。', + 'in_array' => ':attribute 字段不存在 :other 中。', + 'integer' => ':attribute 必须是整数。', + 'ip' => ':attribute 必须是一个有效的 IP 地址。', + 'ipv4' => ':attribute 必须是一个有效的IPv4地址。', + 'ipv6' => ':attribute 必须是一个有效的IPv6地址。', + 'json' => ':attribute 必须是一个有效的 JSON 字符串。', + 'lt' => [ + 'numeric' => ':attribute 必须小于 :value', + 'file' => ':attribute 必须小于 :value kbytes。', + 'string' => ':attribute 必须小于 :value 字符。', + 'array' => ':attribute 必须小于 :value 项。', + ], + 'lte' => [ + 'numeric' => ':attribute 必须小于或等于 :value', + 'file' => ':attribute 必须小于或等于 :value kbytes。', + 'string' => ':attribute 必须小于或等于 :value 字符。', + 'array' => ':attribute 不能超过 :value 项。', + ], + 'max' => [ + 'numeric' => ':attribute 不能大于 :max', + 'file' => ':attribute 不能大于 :max kbytes。', + 'string' => ':attribute 不能大于 :max 字符。', + 'array' => ':attribute 不能超过 :max 项。', + ], + 'mimes' => ':attribute 必须是一个类型的文件::values', + 'mimetypes' => ':attribute 必须是一个类型的文件::values', + 'min' => [ + 'numeric' => ':attribute 必须至少 :min。', + 'file' => ':attribute 必须至少 :min 千字节。', + 'string' => ':attribute 必须至少 :min 字符。', + 'array' => ':attribute 必须至少有 :min 项', + ], + 'not_in' => '选中的 :attribute 无效。', + 'not_regex' => ':attribute 格式不正确。', + 'numeric' => ':attribute 必须是一个数字。', + 'present' => ':attribute 字段必须存在', + 'regex' => ':attribute 格式不正确。', + 'required' => ':attribute 字段是必需的。', + 'required_if' => '当:other 是 :value 时,:attribute 字段是必需的。', + 'required_unless' => ':attribute 字段是必需的,除非:other 是 :values.', + 'required_with' => ':attribute 字段是必需的 :values 是存在的。', + 'required_with_all' => ':attribute 字段是必需的 :values 是存在的。', + 'required_without' => '当:values 不存在时,:attribute 字段是必需的。', + 'required_without_all' => '当没有 :values 不存在时,:attribute 字段是必需的。', + 'same' => ':attribute 和 :other 必须匹配。', + 'size' => [ + 'numeric' => ':attribute 必须是 :size', + 'file' => ':attribute 必须是 :size kobytes。', + 'string' => ':attribute 必须是 :size 字符。', + 'array' => ':attribute 必须包含 :size 项。', + ], + 'string' => ':attribute 必须是一个字符串。', + 'timezone' => ':attribute 必须是一个有效的区域。', + 'unique' => ':attribute 已经被占用。', + 'uploaded' => ':attribute 上传失败。', + 'url' => ':attribute 格式不正确。', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => '自定义消息', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/views/actions/settings/partials/user/app-settings.blade.php b/resources/views/actions/settings/partials/user/app-settings.blade.php index 908f1096..32025d30 100644 --- a/resources/views/actions/settings/partials/user/app-settings.blade.php +++ b/resources/views/actions/settings/partials/user/app-settings.blade.php @@ -11,21 +11,21 @@
-
@@ -34,21 +34,21 @@ class="simple-select {{ $errors->has('timezone') ? ' is-invalid' : '' }}">
-
@@ -105,7 +105,7 @@ class="custom-select{{ $errors->has('time_format') ? ' is-invalid' : '' }}">
-
+
@@ -166,6 +166,33 @@ class="custom-select{{ $errors->has('link_display_mode') ? ' is-invalid' : '' }}
+
+
+ +
+ + + @if ($errors->has('links_new_tab')) + + @endif +
+ +
+
+
+ @include('actions.settings.partials.user.app-settings.archive-backups') @include('actions.settings.partials.user.app-settings.privacy') diff --git a/tests/Controller/App/UserSettingsControllerTest.php b/tests/Controller/App/UserSettingsControllerTest.php index ec2c0ec4..13c69e7b 100644 --- a/tests/Controller/App/UserSettingsControllerTest.php +++ b/tests/Controller/App/UserSettingsControllerTest.php @@ -52,6 +52,7 @@ public function testValidUpdateAccountSettingsResponse(): void public function testValidUpdateApplicationSettingsResponse(): void { $response = $this->post('settings/app', [ + 'locale' => 'en_US', 'timezone' => 'Europe/Berlin', 'links_private_default' => '1', 'notes_private_default' => '1', @@ -68,6 +69,7 @@ public function testValidUpdateApplicationSettingsResponse(): void $this->user->load('rawSettings'); // Reload cached settings from other tests + $this->assertEquals('en_US', usersettings('locale')); $this->assertEquals('Europe/Berlin', usersettings('timezone')); $this->assertEquals('1', usersettings('links_private_default')); $this->assertEquals('1', usersettings('notes_private_default')); diff --git a/tests/Helper/HelperFunctionsTest.php b/tests/Helper/HelperFunctionsTest.php index ae4342c8..f3e30b67 100644 --- a/tests/Helper/HelperFunctionsTest.php +++ b/tests/Helper/HelperFunctionsTest.php @@ -37,6 +37,7 @@ public function testGetAllUserSettings(): void $this->actingAs($this->user); $this->post('settings/app', [ + 'locale' => 'en_US', 'timezone' => 'Europe/Berlin', ]); @@ -44,6 +45,8 @@ public function testGetAllUserSettings(): void $settings = usersettings(); + $this->assertArrayHasKey('locale', $settings); + $this->assertEquals('en_US', $settings['locale']); $this->assertArrayHasKey('timezone', $settings); $this->assertEquals('Europe/Berlin', $settings['timezone']); } @@ -75,6 +78,7 @@ public function testDateTimeFormatterWithUserSettings(): void $this->actingAs($this->user); $this->post('settings/app', [ + 'locale' => 'en_US', 'timezone' => 'Europe/Berlin', 'date_format' => 'd.m.Y', 'time_format' => 'H:i:s', @@ -97,6 +101,7 @@ public function testPaginationLimitWithUserSettings(): void $this->actingAs($this->user); $this->post('settings/app', [ + 'locale' => 'en_US', 'timezone' => 'Europe/Berlin', 'listitem_count' => '100', ]);