From a2acd063f3883a667e60c3cde78426f5f767d50c Mon Sep 17 00:00:00 2001 From: ezzra Date: Tue, 11 Dec 2018 19:39:16 +0100 Subject: [PATCH 1/3] add german informal language --- config/app.php | 2 +- resources/lang/de_informal/activities.php | 23 ++++++++ resources/lang/de_informal/auth.php | 45 ++++++++++++++++ resources/lang/de_informal/common.php | 32 +++++++++++ resources/lang/de_informal/components.php | 15 ++++++ resources/lang/de_informal/entities.php | 66 +++++++++++++++++++++++ resources/lang/de_informal/errors.php | 36 +++++++++++++ resources/lang/de_informal/pagination.php | 20 +++++++ resources/lang/de_informal/passwords.php | 19 +++++++ resources/lang/de_informal/settings.php | 41 ++++++++++++++ resources/lang/de_informal/validation.php | 41 ++++++++++++++ resources/lang/en/settings.php | 3 +- 12 files changed, 341 insertions(+), 2 deletions(-) create mode 100644 resources/lang/de_informal/activities.php create mode 100644 resources/lang/de_informal/auth.php create mode 100644 resources/lang/de_informal/common.php create mode 100644 resources/lang/de_informal/components.php create mode 100644 resources/lang/de_informal/entities.php create mode 100644 resources/lang/de_informal/errors.php create mode 100644 resources/lang/de_informal/pagination.php create mode 100644 resources/lang/de_informal/passwords.php create mode 100644 resources/lang/de_informal/settings.php create mode 100644 resources/lang/de_informal/validation.php diff --git a/config/app.php b/config/app.php index b514263d1..5209b5372 100755 --- a/config/app.php +++ b/config/app.php @@ -84,7 +84,7 @@ return [ */ 'locale' => env('APP_LANG', 'en'), - 'locales' => ['en', 'ar', 'de', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'zh_CN', 'zh_TW'], + 'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'zh_CN', 'zh_TW'], /* |-------------------------------------------------------------------------- diff --git a/resources/lang/de_informal/activities.php b/resources/lang/de_informal/activities.php new file mode 100644 index 000000000..4f6dc30e6 --- /dev/null +++ b/resources/lang/de_informal/activities.php @@ -0,0 +1,23 @@ + 'Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.', + /** + * Login & Register + */ + 'ldap_email_hint' => 'Bitte gib eine E-Mail-Adresse ein, um diese mit dem Account zu nutzen.', + 'register_confirm' => 'Bitte prüfe Deinen Posteingang und bestätig die Registrierung.', + 'registration_email_domain_invalid' => 'Du kannst dich mit dieser E-Mail nicht registrieren.', + 'register_success' => 'Vielen Dank für Deine Registrierung! Die Daten sind gespeichert und Du bist angemeldet.', + /** + * Password Reset + */ + 'reset_password_send_instructions' => 'Bitte gib Deine E-Mail-Adresse ein. Danach erhältst Du eine E-Mail mit einem Link zum Zurücksetzen Deines Passwortes.', + 'reset_password_sent_success' => 'Eine E-Mail mit dem Link zum Zurücksetzen Deines Passwortes wurde an :email gesendet.', + 'reset_password_success' => 'Dein Passwort wurde erfolgreich zurückgesetzt.', + 'email_reset_text' => 'Du erhältsts diese E-Mail, weil jemand versucht hat, Dein Passwort zurückzusetzen.', + 'email_reset_not_requested' => 'Wenn Du das nicht warst, brauchst Du nichts weiter zu tun.', + /** + * Email Confirmation + */ + 'email_confirm_subject' => 'Bestätige Deine E-Mail-Adresse für :appName', + 'email_confirm_greeting' => 'Danke, dass Du dich für :appName registrierst hast!', + 'email_confirm_text' => 'Bitte bestätige Deine E-Mail-Adresse, indem Du auf die Schaltfläche klickst:', + 'email_confirm_send_error' => 'Leider konnte die für die Registrierung notwendige E-Mail zur Bestätigung Deine E-Mail-Adresse nicht versandt werden. Bitte kontaktiere den Systemadministrator!', + 'email_confirm_success' => 'Deine E-Mail-Adresse wurde bestätigt!', + 'email_confirm_resent' => 'Bestätigungs-E-Mail wurde erneut versendet, bitte überprüfe Deinen Posteingang.', + 'email_not_confirmed_text' => 'Deine E-Mail-Adresse ist bisher nicht bestätigt.', + 'email_not_confirmed_click_link' => 'Bitte klicke auf den Link in der E-Mail, die Du nach der Registrierung erhalten hast.', + 'email_not_confirmed_resend' => 'Wenn Du die E-Mail nicht erhalten hast, kannst Du die Nachricht erneut anfordern. Fülle hierzu bitte das folgende Formular aus:', +]; + +return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/common.php b/resources/lang/de_informal/common.php new file mode 100644 index 000000000..933b3e30b --- /dev/null +++ b/resources/lang/de_informal/common.php @@ -0,0 +1,32 @@ + 'Sollte es beim Anklicken der Schaltfläche ":action_text" Probleme geben, öffne die folgende URL in Deinem Browser:', +]; + +return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/components.php b/resources/lang/de_informal/components.php new file mode 100644 index 000000000..651974c88 --- /dev/null +++ b/resources/lang/de_informal/components.php @@ -0,0 +1,15 @@ + 'Bitte klicke erneut auf löschen, wenn Du dieses Bild wirklich entfernen möchtest.', + 'image_dropzone' => 'Ziehe Bilder hierher oder klicke hier, um ein Bild auszuwählen', + /** + * Code editor + */ +]; + +return array_replace($de_formal, $de_informal); \ No newline at end of file diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php new file mode 100644 index 000000000..232ab51ec --- /dev/null +++ b/resources/lang/de_informal/entities.php @@ -0,0 +1,66 @@ + 'Du hast bisher keine Seiten angesehen.', + 'no_pages_recently_created' => 'Du hast bisher keine Seiten angelegt.', + 'no_pages_recently_updated' => 'Du hast bisher keine Seiten aktualisiert.', + /** + * Permissions and restrictions + */ + + /** + * Search + */ + + /** + * Books + */ + 'books_delete_confirmation' => 'Bist Du sicher, dass Du dieses Buch löschen möchtest?', + /** + * Chapters + */ + 'chapters_delete_confirm' => 'Bist Du sicher, dass Du dieses Kapitel löschen möchtest?', + /** + * Pages + */ + 'pages_delete_confirm' => 'Bist Du sicher, dass Du diese Seite löschen möchtest?', + 'pages_delete_draft_confirm' => 'Bist Du sicher, dass Du diesen Seitenentwurf löschen möchtest?', + 'pages_edit_enter_changelog_desc' => 'Bitte gib eine kurze Zusammenfassung Deiner Änderungen ein', + 'pages_editing_draft_notification' => 'Du bearbeitest momenten einen Entwurf, der zuletzt :timeDiff gespeichert wurde.', + 'pages_draft_edit_active' => [ + 'start_a' => ':count Benutzer bearbeiten derzeit diese Seite.', + 'start_b' => ':userName bearbeitet jetzt diese Seite.', + 'time_a' => 'seit die Seiten zuletzt aktualisiert wurden.', + 'time_b' => 'in den letzten :minCount Minuten', + 'message' => ':start :time. Achte darauf, keine Änderungen von anderen Benutzern zu überschreiben!', + ], + /** + * Editor sidebar + */ + 'tags_explain' => "Füge Schlagwörter hinzu, um ihren Inhalt zu kategorisieren.\nDu kannst einen erklärenden Inhalt hinzufügen, um eine genauere Unterteilung vorzunehmen.", + 'attachments_explain' => 'Du kannst auf Deiner Seite Dateien hochladen oder Links hinzufügen. Diese werden in der Seitenleiste angezeigt.', + 'attachments_delete_confirm' => 'Klicke erneut auf löschen, um diesen Anhang zu entfernen.', + 'attachments_dropzone' => 'Ziehe Dateien hierher oder klicke hier, um eine Datei auszuwählen', + 'attachments_explain_link' => 'Wenn Du keine Datei hochladen möchtest, kannst Du stattdessen einen Link hinzufügen. Dieser Link kann auf eine andere Seite oder eine Datei im Internet verweisen.', + 'attachments_edit_drop_upload' => 'Ziehe Dateien hierher, um diese hochzuladen und zu überschreiben', + /** + * Profile View + */ + + /** + * Comments + */ + 'comment_placeholder' => 'Gib hier Deine Kommentare ein (Markdown unterstützt)', + 'comment_delete_confirm' => 'Möchtst Du diesen Kommentar wirklich löschen?', + + /** + * Revision + */ + 'revision_delete_confirm' => 'Bist Du sicher, dass Du diese Revision löschen möchtest?', +]; + +return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/errors.php b/resources/lang/de_informal/errors.php new file mode 100644 index 000000000..8f8d24ea8 --- /dev/null +++ b/resources/lang/de_informal/errors.php @@ -0,0 +1,36 @@ + 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', + 'permissionJson' => 'Du hast keine Berechtigung, die angeforderte Aktion auszuführen.', + // Auth + 'email_already_confirmed' => 'Die E-Mail-Adresse ist bereits bestätigt. Bitte melde dich an.', + 'email_confirmation_invalid' => 'Der Bestätigungslink ist nicht gültig oder wurde bereits verwendet. Bitte registriere dich erneut.', + 'social_account_in_use' => 'Dieses :socialAccount-Konto wird bereits verwendet. Bitte melde dich mit dem :socialAccount-Konto an.', + 'social_account_email_in_use' => 'Die E-Mail-Adresse ":email" ist bereits registriert. Wenn Du bereits registriert bist, kannst Du Dein :socialAccount-Konto in Deinen Profil-Einstellungen verknüpfen.', + 'social_account_not_used' => 'Dieses :socialAccount-Konto ist bisher keinem Benutzer zugeordnet. Du kannst das in Deinen Profil-Einstellungen tun.', + 'social_account_register_instructions' => 'Wenn Du bisher kein Social-Media Konto besitzt, kannst Du ein solches Konto mit der :socialAccount Option anlegen.', + // System + 'path_not_writable' => 'Die Datei kann nicht in den angegebenen Pfad :filePath hochgeladen werden. Stelle sicher, dass dieser Ordner auf dem Server beschreibbar ist.', + 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfe, ob die GD PHP-Erweiterung installiert ist.', + 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuche es mit einer kleineren Datei.', + // Attachments + // Pages + 'page_draft_autosave_fail' => 'Fehler beim Speichern des Entwurfs. Stelle sicher, dass Du mit dem Internet verbunden bist, bevor Du den Entwurf dieser Seite speicherst.', + 'page_custom_home_deletion' => 'Eine als Startseite gesetzte Seite kann nicht gelöscht werden.', + // Entities + // Users + 'users_cannot_delete_only_admin' => 'Du kannst den einzigen Administrator nicht löschen.', + 'users_cannot_delete_guest' => 'Du kannst den Gast-Benutzer nicht löschen', + // Roles + // Comments + // Error pages + 'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Du angefordert hast, wurde nicht gefunden.', +]; + +return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/pagination.php b/resources/lang/de_informal/pagination.php new file mode 100644 index 000000000..0feccda8e --- /dev/null +++ b/resources/lang/de_informal/pagination.php @@ -0,0 +1,20 @@ + 'Wähle den Editor aus, der von allen Benutzern genutzt werden soll, um Seiten zu editieren.', + 'app_primary_color_desc' => "Dies sollte ein HEX Wert sein.\nWenn Du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt.", + 'app_homepage_desc' => 'Wähle eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', + 'app_homepage_books' => 'Oder wähle die Buch-Übersicht als Startseite. Das wird die Seiten-Auswahl überschreiben.', + /** + * Registration settings + */ + + /** + * Maintenance settings + */ + 'maint_image_cleanup_desc' => 'Überprüft Seiten- und Versionsinhalte auf ungenutzte und mehrfach vorhandene Bilder. Erstelle vor dem Start ein Backup Deiner Datenbank und Bilder.', + 'maint_image_cleanup_warning' => ':count eventuell unbenutze Bilder wurden gefunden. Möchtest Du diese Bilder löschen?', + + /** + * Role settings + */ + 'role_delete_confirm' => 'Du möchtest die Rolle ":roleName" löschen.', + 'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Du kannst unten eine neue Rolle auswählen, die Du diesen Benutzern zuordnen möchtest.', + 'role_delete_sure' => 'Bist Du sicher, dass Du diese Rolle löschen möchtest?', + /** + * Users + */ + 'users_password_warning' => 'Fülle die folgenden Felder nur aus, wenn Du Dein Passwort ändern möchtest:', + 'users_delete_confirm' => 'Bist Du sicher, dass Du diesen Benutzer löschen möchtest?', + 'users_social_accounts_info' => 'Hier kannst Du andere Social-Media-Konten für eine schnellere und einfachere Anmeldung verknüpfen. Wenn Du ein Social-Media Konto löschst, bleibt der Zugriff erhalten. Entferne in diesem Falle die Berechtigung in Deinen Profil-Einstellungen des verknüpften Social-Media-Kontos.', +]; + +return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/validation.php b/resources/lang/de_informal/validation.php new file mode 100644 index 000000000..e2078ed61 --- /dev/null +++ b/resources/lang/de_informal/validation.php @@ -0,0 +1,41 @@ + [ 'en' => 'English', 'ar' => 'العربية', - 'de' => 'Deutsch', + 'de' => 'Deutsch (Sie)', + 'de_informal' => 'Deutsch (Du)', 'es' => 'Español', 'es_AR' => 'Español Argentina', 'fr' => 'Français', From f943f0d401e7e4e9e3325a2f9c4e090aca70a307 Mon Sep 17 00:00:00 2001 From: ezzra Date: Wed, 12 Dec 2018 10:37:24 +0100 Subject: [PATCH 2/3] de_informal - remove comments from unused lines --- resources/lang/de_informal/activities.php | 15 ----------- resources/lang/de_informal/common.php | 21 --------------- resources/lang/de_informal/components.php | 3 --- resources/lang/de_informal/entities.php | 13 --------- resources/lang/de_informal/errors.php | 7 ----- resources/lang/de_informal/pagination.php | 12 --------- resources/lang/de_informal/passwords.php | 11 -------- resources/lang/de_informal/settings.php | 5 ---- resources/lang/de_informal/validation.php | 33 ----------------------- 9 files changed, 120 deletions(-) diff --git a/resources/lang/de_informal/activities.php b/resources/lang/de_informal/activities.php index 4f6dc30e6..79595ac4b 100644 --- a/resources/lang/de_informal/activities.php +++ b/resources/lang/de_informal/activities.php @@ -2,21 +2,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - - /** - * Activity text strings. - * Is used for all the text within activity logs & notifications. - */ - - // Pages - - // Chapters - - // Books - - // Bookshelves - - // Other ]; diff --git a/resources/lang/de_informal/common.php b/resources/lang/de_informal/common.php index 933b3e30b..9121b18ca 100644 --- a/resources/lang/de_informal/common.php +++ b/resources/lang/de_informal/common.php @@ -2,27 +2,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - - /** - * Buttons - */ - - /** - * Form Labels - */ - - /** - * Actions - */ - - /** - * Misc - */ - - /** - * Header - */ - /** * Email Content */ diff --git a/resources/lang/de_informal/components.php b/resources/lang/de_informal/components.php index 651974c88..4027da46e 100644 --- a/resources/lang/de_informal/components.php +++ b/resources/lang/de_informal/components.php @@ -7,9 +7,6 @@ $de_informal = [ */ 'image_delete_confirm' => 'Bitte klicke erneut auf löschen, wenn Du dieses Bild wirklich entfernen möchtest.', 'image_dropzone' => 'Ziehe Bilder hierher oder klicke hier, um ein Bild auszuwählen', - /** - * Code editor - */ ]; return array_replace($de_formal, $de_informal); \ No newline at end of file diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php index 232ab51ec..d50b0029d 100644 --- a/resources/lang/de_informal/entities.php +++ b/resources/lang/de_informal/entities.php @@ -8,14 +8,6 @@ $de_informal = [ 'no_pages_viewed' => 'Du hast bisher keine Seiten angesehen.', 'no_pages_recently_created' => 'Du hast bisher keine Seiten angelegt.', 'no_pages_recently_updated' => 'Du hast bisher keine Seiten aktualisiert.', - /** - * Permissions and restrictions - */ - - /** - * Search - */ - /** * Books */ @@ -47,16 +39,11 @@ $de_informal = [ 'attachments_dropzone' => 'Ziehe Dateien hierher oder klicke hier, um eine Datei auszuwählen', 'attachments_explain_link' => 'Wenn Du keine Datei hochladen möchtest, kannst Du stattdessen einen Link hinzufügen. Dieser Link kann auf eine andere Seite oder eine Datei im Internet verweisen.', 'attachments_edit_drop_upload' => 'Ziehe Dateien hierher, um diese hochzuladen und zu überschreiben', - /** - * Profile View - */ - /** * Comments */ 'comment_placeholder' => 'Gib hier Deine Kommentare ein (Markdown unterstützt)', 'comment_delete_confirm' => 'Möchtst Du diesen Kommentar wirklich löschen?', - /** * Revision */ diff --git a/resources/lang/de_informal/errors.php b/resources/lang/de_informal/errors.php index 8f8d24ea8..9cc123c3d 100644 --- a/resources/lang/de_informal/errors.php +++ b/resources/lang/de_informal/errors.php @@ -2,9 +2,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - /** - * Error text strings. - */ // Pages 'permission' => 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', 'permissionJson' => 'Du hast keine Berechtigung, die angeforderte Aktion auszuführen.', @@ -19,16 +16,12 @@ $de_informal = [ 'path_not_writable' => 'Die Datei kann nicht in den angegebenen Pfad :filePath hochgeladen werden. Stelle sicher, dass dieser Ordner auf dem Server beschreibbar ist.', 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfe, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuche es mit einer kleineren Datei.', - // Attachments // Pages 'page_draft_autosave_fail' => 'Fehler beim Speichern des Entwurfs. Stelle sicher, dass Du mit dem Internet verbunden bist, bevor Du den Entwurf dieser Seite speicherst.', 'page_custom_home_deletion' => 'Eine als Startseite gesetzte Seite kann nicht gelöscht werden.', - // Entities // Users 'users_cannot_delete_only_admin' => 'Du kannst den einzigen Administrator nicht löschen.', 'users_cannot_delete_guest' => 'Du kannst den Gast-Benutzer nicht löschen', - // Roles - // Comments // Error pages 'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Du angefordert hast, wurde nicht gefunden.', ]; diff --git a/resources/lang/de_informal/pagination.php b/resources/lang/de_informal/pagination.php index 0feccda8e..efab3e48f 100644 --- a/resources/lang/de_informal/pagination.php +++ b/resources/lang/de_informal/pagination.php @@ -3,18 +3,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ - - ]; return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/passwords.php b/resources/lang/de_informal/passwords.php index f25119c9d..efab3e48f 100644 --- a/resources/lang/de_informal/passwords.php +++ b/resources/lang/de_informal/passwords.php @@ -3,17 +3,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ - ]; return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/settings.php b/resources/lang/de_informal/settings.php index 1360fc151..67bd32c13 100644 --- a/resources/lang/de_informal/settings.php +++ b/resources/lang/de_informal/settings.php @@ -14,16 +14,11 @@ $de_informal = [ 'app_primary_color_desc' => "Dies sollte ein HEX Wert sein.\nWenn Du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt.", 'app_homepage_desc' => 'Wähle eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', 'app_homepage_books' => 'Oder wähle die Buch-Übersicht als Startseite. Das wird die Seiten-Auswahl überschreiben.', - /** - * Registration settings - */ - /** * Maintenance settings */ 'maint_image_cleanup_desc' => 'Überprüft Seiten- und Versionsinhalte auf ungenutzte und mehrfach vorhandene Bilder. Erstelle vor dem Start ein Backup Deiner Datenbank und Bilder.', 'maint_image_cleanup_warning' => ':count eventuell unbenutze Bilder wurden gefunden. Möchtest Du diese Bilder löschen?', - /** * Role settings */ diff --git a/resources/lang/de_informal/validation.php b/resources/lang/de_informal/validation.php index e2078ed61..efab3e48f 100644 --- a/resources/lang/de_informal/validation.php +++ b/resources/lang/de_informal/validation.php @@ -3,39 +3,6 @@ $de_formal = (include resource_path() . '/lang/de/' . basename(__FILE__)); $de_informal = [ - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | following language lines contain default error messages used by - | validator class. Some of these rules have multiple versions such - | as size rules. Feel free to tweak each of these messages here. - | - */ - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | 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. - | - */ - ]; return array_replace($de_formal, $de_informal); From 323bff7d6d3974e5752bfec9581d733b91e933f5 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 12 Dec 2018 20:46:27 +0000 Subject: [PATCH 3/3] Extended translations system for arrays & extension Extended the base Laravel translation system to allow a locale to be based upon another. Also adds functionality to take base & fallback locales into account when fetching an array of translations. Related to work done in #1159 --- app/Http/Controllers/HomeController.php | 10 +-- app/Providers/TranslationServiceProvider.php | 32 +++++++++ app/Translation/Translator.php | 74 ++++++++++++++++++++ composer.json | 1 + config/app.php | 2 +- resources/lang/de_informal/activities.php | 10 ++- resources/lang/de_informal/auth.php | 12 ++-- resources/lang/de_informal/common.php | 8 +-- resources/lang/de_informal/components.php | 8 +-- resources/lang/de_informal/entities.php | 12 ++-- resources/lang/de_informal/errors.php | 11 +-- resources/lang/de_informal/pagination.php | 10 ++- resources/lang/de_informal/passwords.php | 10 ++- resources/lang/de_informal/settings.php | 10 +-- resources/lang/de_informal/validation.php | 10 ++- tests/LanguageTest.php | 26 +++++++ 16 files changed, 185 insertions(+), 61 deletions(-) create mode 100644 app/Providers/TranslationServiceProvider.php create mode 100644 app/Translation/Translator.php diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 2bf029b51..5a5f34e4a 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -79,6 +79,7 @@ class HomeController extends Controller { $locale = app()->getLocale(); $cacheKey = 'GLOBAL_TRANSLATIONS_' . $locale; + if (cache()->has($cacheKey) && config('app.env') !== 'development') { $resp = cache($cacheKey); } else { @@ -89,15 +90,6 @@ class HomeController extends Controller 'entities' => trans('entities'), 'errors' => trans('errors') ]; - if ($locale !== 'en') { - $enTrans = [ - 'common' => trans('common', [], 'en'), - 'components' => trans('components', [], 'en'), - 'entities' => trans('entities', [], 'en'), - 'errors' => trans('errors', [], 'en') - ]; - $translations = array_replace_recursive($enTrans, $translations); - } $resp = 'window.translations = ' . json_encode($translations); cache()->put($cacheKey, $resp, 120); } diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php new file mode 100644 index 000000000..0e628c7da --- /dev/null +++ b/app/Providers/TranslationServiceProvider.php @@ -0,0 +1,32 @@ +registerLoader(); + + $this->app->singleton('translator', function ($app) { + $loader = $app['translation.loader']; + + // When registering the translator component, we'll need to set the default + // locale as well as the fallback locale. So, we'll grab the application + // configuration so we can easily get both of these values from there. + $locale = $app['config']['app.locale']; + + $trans = new Translator($loader, $locale); + + $trans->setFallback($app['config']['app.fallback_locale']); + + return $trans; + }); + } +} \ No newline at end of file diff --git a/app/Translation/Translator.php b/app/Translation/Translator.php new file mode 100644 index 000000000..2edfecf73 --- /dev/null +++ b/app/Translation/Translator.php @@ -0,0 +1,74 @@ + 'de', + ]; + + /** + * Get the translation for a given key. + * + * @param string $key + * @param array $replace + * @param string $locale + * @return string|array|null + */ + public function trans($key, array $replace = [], $locale = null) + { + $translation = $this->get($key, $replace, $locale); + + if (is_array($translation)) { + $translation = $this->mergeBackupTranslations($translation, $key, $locale); + } + + return $translation; + } + + /** + * Merge the fallback translations, and base translations if existing, + * into the provided core key => value array of translations content. + * @param array $translationArray + * @param string $key + * @param null $locale + * @return array + */ + protected function mergeBackupTranslations(array $translationArray, string $key, $locale = null) + { + $fallback = $this->get($key, [], $this->fallback); + $baseLocale = $this->getBaseLocale($locale ?? $this->locale); + $baseTranslations = $baseLocale ? $this->get($key, [], $baseLocale) : []; + + return array_replace_recursive($fallback, $baseTranslations, $translationArray); + } + + /** + * Get the array of locales to be checked. + * + * @param string|null $locale + * @return array + */ + protected function localeArray($locale) + { + $primaryLocale = $locale ?: $this->locale; + return array_filter([$primaryLocale, $this->getBaseLocale($primaryLocale), $this->fallback]); + } + + /** + * Get the locale to extend for the given locale. + * + * @param string $locale + * @return string|null + */ + protected function getBaseLocale($locale) + { + return $this->baseLocaleMap[$locale] ?? null; + } + +} \ No newline at end of file diff --git a/composer.json b/composer.json index a34c65091..a9b38bff4 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "type": "project", "require": { "php": ">=7.0.0", + "ext-json": "*", "ext-tidy": "*", "ext-dom": "*", "laravel/framework": "~5.5.44", diff --git a/config/app.php b/config/app.php index 5209b5372..3040a36c6 100755 --- a/config/app.php +++ b/config/app.php @@ -187,7 +187,6 @@ return [ Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, Illuminate\Notifications\NotificationServiceProvider::class, @@ -205,6 +204,7 @@ return [ * Application Service Providers... */ BookStack\Providers\PaginationServiceProvider::class, + BookStack\Providers\TranslationServiceProvider::class, BookStack\Providers\AuthServiceProvider::class, BookStack\Providers\AppServiceProvider::class, diff --git a/resources/lang/de_informal/activities.php b/resources/lang/de_informal/activities.php index 79595ac4b..c82c9e0c4 100644 --- a/resources/lang/de_informal/activities.php +++ b/resources/lang/de_informal/activities.php @@ -1,8 +1,6 @@ 'Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.', + /** * Login & Register */ @@ -20,6 +22,7 @@ $de_informal = [ 'register_confirm' => 'Bitte prüfe Deinen Posteingang und bestätig die Registrierung.', 'registration_email_domain_invalid' => 'Du kannst dich mit dieser E-Mail nicht registrieren.', 'register_success' => 'Vielen Dank für Deine Registrierung! Die Daten sind gespeichert und Du bist angemeldet.', + /** * Password Reset */ @@ -28,6 +31,7 @@ $de_informal = [ 'reset_password_success' => 'Dein Passwort wurde erfolgreich zurückgesetzt.', 'email_reset_text' => 'Du erhältsts diese E-Mail, weil jemand versucht hat, Dein Passwort zurückzusetzen.', 'email_reset_not_requested' => 'Wenn Du das nicht warst, brauchst Du nichts weiter zu tun.', + /** * Email Confirmation */ @@ -40,6 +44,4 @@ $de_informal = [ 'email_not_confirmed_text' => 'Deine E-Mail-Adresse ist bisher nicht bestätigt.', 'email_not_confirmed_click_link' => 'Bitte klicke auf den Link in der E-Mail, die Du nach der Registrierung erhalten hast.', 'email_not_confirmed_resend' => 'Wenn Du die E-Mail nicht erhalten hast, kannst Du die Nachricht erneut anfordern. Fülle hierzu bitte das folgende Formular aus:', -]; - -return array_replace($de_formal, $de_informal); +]; \ No newline at end of file diff --git a/resources/lang/de_informal/common.php b/resources/lang/de_informal/common.php index 9121b18ca..d80fa9dcf 100644 --- a/resources/lang/de_informal/common.php +++ b/resources/lang/de_informal/common.php @@ -1,11 +1,9 @@ 'Sollte es beim Anklicken der Schaltfläche ":action_text" Probleme geben, öffne die folgende URL in Deinem Browser:', -]; - -return array_replace($de_formal, $de_informal); +]; \ No newline at end of file diff --git a/resources/lang/de_informal/components.php b/resources/lang/de_informal/components.php index 4027da46e..31cc9ca1b 100644 --- a/resources/lang/de_informal/components.php +++ b/resources/lang/de_informal/components.php @@ -1,12 +1,10 @@ 'Bitte klicke erneut auf löschen, wenn Du dieses Bild wirklich entfernen möchtest.', 'image_dropzone' => 'Ziehe Bilder hierher oder klicke hier, um ein Bild auszuwählen', -]; - -return array_replace($de_formal, $de_informal); \ No newline at end of file +]; \ No newline at end of file diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php index d50b0029d..21fdbb13d 100644 --- a/resources/lang/de_informal/entities.php +++ b/resources/lang/de_informal/entities.php @@ -1,21 +1,24 @@ 'Du hast bisher keine Seiten angesehen.', 'no_pages_recently_created' => 'Du hast bisher keine Seiten angelegt.', 'no_pages_recently_updated' => 'Du hast bisher keine Seiten aktualisiert.', + /** * Books */ 'books_delete_confirmation' => 'Bist Du sicher, dass Du dieses Buch löschen möchtest?', + /** * Chapters */ 'chapters_delete_confirm' => 'Bist Du sicher, dass Du dieses Kapitel löschen möchtest?', + /** * Pages */ @@ -30,6 +33,7 @@ $de_informal = [ 'time_b' => 'in den letzten :minCount Minuten', 'message' => ':start :time. Achte darauf, keine Änderungen von anderen Benutzern zu überschreiben!', ], + /** * Editor sidebar */ @@ -39,15 +43,15 @@ $de_informal = [ 'attachments_dropzone' => 'Ziehe Dateien hierher oder klicke hier, um eine Datei auszuwählen', 'attachments_explain_link' => 'Wenn Du keine Datei hochladen möchtest, kannst Du stattdessen einen Link hinzufügen. Dieser Link kann auf eine andere Seite oder eine Datei im Internet verweisen.', 'attachments_edit_drop_upload' => 'Ziehe Dateien hierher, um diese hochzuladen und zu überschreiben', + /** * Comments */ 'comment_placeholder' => 'Gib hier Deine Kommentare ein (Markdown unterstützt)', 'comment_delete_confirm' => 'Möchtst Du diesen Kommentar wirklich löschen?', + /** * Revision */ 'revision_delete_confirm' => 'Bist Du sicher, dass Du diese Revision löschen möchtest?', ]; - -return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/errors.php b/resources/lang/de_informal/errors.php index 9cc123c3d..924deee0d 100644 --- a/resources/lang/de_informal/errors.php +++ b/resources/lang/de_informal/errors.php @@ -1,10 +1,11 @@ 'Du hast keine Berechtigung, auf diese Seite zuzugreifen.', 'permissionJson' => 'Du hast keine Berechtigung, die angeforderte Aktion auszuführen.', + // Auth 'email_already_confirmed' => 'Die E-Mail-Adresse ist bereits bestätigt. Bitte melde dich an.', 'email_confirmation_invalid' => 'Der Bestätigungslink ist nicht gültig oder wurde bereits verwendet. Bitte registriere dich erneut.', @@ -12,18 +13,20 @@ $de_informal = [ 'social_account_email_in_use' => 'Die E-Mail-Adresse ":email" ist bereits registriert. Wenn Du bereits registriert bist, kannst Du Dein :socialAccount-Konto in Deinen Profil-Einstellungen verknüpfen.', 'social_account_not_used' => 'Dieses :socialAccount-Konto ist bisher keinem Benutzer zugeordnet. Du kannst das in Deinen Profil-Einstellungen tun.', 'social_account_register_instructions' => 'Wenn Du bisher kein Social-Media Konto besitzt, kannst Du ein solches Konto mit der :socialAccount Option anlegen.', + // System 'path_not_writable' => 'Die Datei kann nicht in den angegebenen Pfad :filePath hochgeladen werden. Stelle sicher, dass dieser Ordner auf dem Server beschreibbar ist.', 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfe, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuche es mit einer kleineren Datei.', + // Pages 'page_draft_autosave_fail' => 'Fehler beim Speichern des Entwurfs. Stelle sicher, dass Du mit dem Internet verbunden bist, bevor Du den Entwurf dieser Seite speicherst.', 'page_custom_home_deletion' => 'Eine als Startseite gesetzte Seite kann nicht gelöscht werden.', + // Users 'users_cannot_delete_only_admin' => 'Du kannst den einzigen Administrator nicht löschen.', 'users_cannot_delete_guest' => 'Du kannst den Gast-Benutzer nicht löschen', + // Error pages 'sorry_page_not_found' => 'Entschuldigung. Die Seite, die Du angefordert hast, wurde nicht gefunden.', ]; - -return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/pagination.php b/resources/lang/de_informal/pagination.php index efab3e48f..c82c9e0c4 100644 --- a/resources/lang/de_informal/pagination.php +++ b/resources/lang/de_informal/pagination.php @@ -1,8 +1,6 @@ "Dies sollte ein HEX Wert sein.\nWenn Du nichts eingibst, wird die Anwendung auf die Standardfarbe zurückgesetzt.", 'app_homepage_desc' => 'Wähle eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', 'app_homepage_books' => 'Oder wähle die Buch-Übersicht als Startseite. Das wird die Seiten-Auswahl überschreiben.', + /** * Maintenance settings */ 'maint_image_cleanup_desc' => 'Überprüft Seiten- und Versionsinhalte auf ungenutzte und mehrfach vorhandene Bilder. Erstelle vor dem Start ein Backup Deiner Datenbank und Bilder.', 'maint_image_cleanup_warning' => ':count eventuell unbenutze Bilder wurden gefunden. Möchtest Du diese Bilder löschen?', + /** * Role settings */ 'role_delete_confirm' => 'Du möchtest die Rolle ":roleName" löschen.', 'role_delete_users_assigned' => 'Diese Rolle ist :userCount Benutzern zugeordnet. Du kannst unten eine neue Rolle auswählen, die Du diesen Benutzern zuordnen möchtest.', 'role_delete_sure' => 'Bist Du sicher, dass Du diese Rolle löschen möchtest?', + /** * Users */ @@ -32,5 +36,3 @@ $de_informal = [ 'users_delete_confirm' => 'Bist Du sicher, dass Du diesen Benutzer löschen möchtest?', 'users_social_accounts_info' => 'Hier kannst Du andere Social-Media-Konten für eine schnellere und einfachere Anmeldung verknüpfen. Wenn Du ein Social-Media Konto löschst, bleibt der Zugriff erhalten. Entferne in diesem Falle die Berechtigung in Deinen Profil-Einstellungen des verknüpften Social-Media-Kontos.', ]; - -return array_replace($de_formal, $de_informal); diff --git a/resources/lang/de_informal/validation.php b/resources/lang/de_informal/validation.php index efab3e48f..c82c9e0c4 100644 --- a/resources/lang/de_informal/validation.php +++ b/resources/lang/de_informal/validation.php @@ -1,8 +1,6 @@ assertTrue(config('app.rtl'), "App RTL config should have been set to true by middleware"); } + public function test_de_informal_falls_base_to_de() + { + // Base de back value + $deBack = trans()->get('common.cancel', [], 'de', false); + $this->assertEquals('Abbrechen', $deBack); + // Ensure de_informal has no value set + $this->assertEquals('common.cancel', trans()->get('common.cancel', [], 'de_informal', false)); + // Ensure standard trans falls back to de + $this->assertEquals($deBack, trans('common.cancel', [], 'de_informal')); + // Ensure de_informal gets its own values where set + $deEmailActionHelp = trans()->get('common.email_action_help', [], 'de', false); + $enEmailActionHelp = trans()->get('common.email_action_help', [], 'en', false); + $deInformalEmailActionHelp = trans()->get('common.email_action_help', [], 'de_informal', false); + $this->assertNotEquals($deEmailActionHelp, $deInformalEmailActionHelp); + $this->assertNotEquals($enEmailActionHelp, $deInformalEmailActionHelp); + } + + public function test_de_informal_falls_base_to_de_in_js_endpoint() + { + $this->asEditor(); + setting()->putUser($this->getEditor(), 'language', 'de_informal'); + + $transResp = $this->get('/translations'); + $transResp->assertSee('"cancel":"Abbrechen"'); + } + } \ No newline at end of file