From 41010e6ad85b38f7d8b2fbb9a1493ea152d9da76 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Thu, 26 Oct 2023 15:00:54 +0200 Subject: [PATCH 1/6] 1177: Translate build config and intro slides --- frontend/assets/l10n/main/app_de.json | 35 ++++++++++++-- frontend/assets/l10n/main/app_en.json | 35 ++++++++++++-- .../assets/l10n/nuernberg/overwrite_de.json | 33 ++++++++++++- .../assets/l10n/nuernberg/overwrite_en.json | 33 ++++++++++++- frontend/build-configs/bayern/index.ts | 36 +++----------- frontend/build-configs/bayern/localization.ts | 42 ---------------- frontend/build-configs/nuernberg/index.ts | 38 +++------------ .../build-configs/nuernberg/localization.ts | 42 ---------------- frontend/build-configs/types.ts | 48 +------------------ .../activation_code_scanner_page.dart | 4 +- .../activation_overwrite_existing_dialog.dart | 4 +- .../card_detail_view/more_actions_dialog.dart | 19 ++++---- frontend/lib/identification/no_card_view.dart | 15 +++--- .../positive_verification_result_dialog.dart | 5 +- .../remove_card_confirmation_dialog.dart | 7 ++- .../dialogs/verification_info_dialog.dart | 4 +- .../verification_qr_scanner_page.dart | 3 +- frontend/lib/intro_slides/intro_screen.dart | 24 +++++----- frontend/lib/main.dart | 4 +- 19 files changed, 178 insertions(+), 253 deletions(-) delete mode 100644 frontend/build-configs/bayern/localization.ts delete mode 100644 frontend/build-configs/nuernberg/localization.ts diff --git a/frontend/assets/l10n/main/app_de.json b/frontend/assets/l10n/main/app_de.json index e95d4d3cf..f620b89cf 100644 --- a/frontend/assets/l10n/main/app_de.json +++ b/frontend/assets/l10n/main/app_de.json @@ -65,8 +65,12 @@ }, "identification": { "activate": "Aktivieren", - "activateCardCurrentDevice": "Karte auf diesem Gerät aktivieren?", - "activateCardCurrentDeviceRationale": "Ihre Karte ist bereits auf einem anderen Gerät aktiviert. Wenn Sie Ihre Karte auf diesem Gerät aktivieren, wird sie auf Ihrem anderen Gerät automatisch deaktiviert.", + "activateCurrentDeviceDescription": "Ihre Karte ist bereits auf einem anderen Gerät aktiviert. Wenn Sie Ihre Karte auf diesem Gerät aktivieren, wird sie auf Ihrem anderen Gerät automatisch deaktiviert.", + "activateCurrentDeviceTitle": "Karte auf diesem Gerät aktivieren?", + "activateDescription": "Sie haben die Ehrenamtskarte bereits beantragt und den Aktivierungscode Ihrer digitalen Ehrenamtskarte erhalten? Scannen Sie den Code hier ein.", + "activateTitle": "Karte aktivieren", + "applyDescription": "Sie sind ehrenamtlich engagiert, haben aber noch keine Ehrenamtskarte? Hier können Sie Ihre Ehrenamtskarte beantragen.", + "applyTitle": "Beantragen", "authenticationPossible": "Mit diesem QR-Code können Sie sich bei Akzeptanzstellen ausweisen:", "cameraAccessRequired": "Zugriff auf Kamera erforderlich", "cameraAccessRequiredSettings": "Um einen QR-Code einzuscannen, benötigt die App Zugriff auf die Kamera.\nIn den Einstellungen können Sie der App den Zugriff auf die Kamera erlauben.", @@ -90,7 +94,18 @@ "flashOff": "Blitz aus", "flashOn": "Blitz an", "internetRequired": "Eine Internetverbindung wird benötigt.", + "moreActionsActivateDescription": "Ihre hinterlegte Ehrenamtskarte bleibt erhalten. Sie können diese manuell entfernen.", + "moreActionsActivateLimitDescription": "Um eine weitere Ehrenamtskarte hinzuzufügen, müssen Sie zuerst eine vorhandene Ehrenamtskarte löschen.", + "moreActionsActivateTitle": "Weitere Ehrenamtskarte hinzufügen", + "moreActionsApplyDescription": "Ihre hinterlegte Karte bleibt erhalten.", + "moreActionsApplyTitle": "Ehrenamtskarte beantragen oder verlängern", + "moreActionsRemoveDescription": "Nach der Auswahl wird diese Ehrenamtskarte vom Gerät gelöscht.", + "moreActionsRemoveTitle": "Diese Ehrenamtskarte löschen", + "moreActionsVerifyDescription": "Prüfen Sie die Gültigkeit einer digitalen Ehrenamtskarte.", + "moreActionsVerifyTitle": "Eine digitale Ehrenamtskarte prüfen", "notVerified": "Nicht verifiziert", + "removeDescription": "Wenn diese Karte gelöscht wird, muss diese für eine erneute Verwendung neu hinzugefügt werden.", + "removeTitle": "Diese Karte löschen?", "scanCode": "Scannen Sie den QR-Code, der auf dem \"Ausweisen\"-Tab Ihres Gegenübers angezeigt wird.", "scanQRCode": "Halten Sie die Kamera auf den QR Code.", "scanningFailed": "Fehler beim Lesen des Codes", @@ -101,7 +116,21 @@ "title": "Ausweisen", "unlimited": "unbegrenzt", "validFromUntil": "Gültig: {{startDate}} bis {{expirationDate}}", - "validUntil": "Gültig bis: {{expirationDate}}" + "validUntil": "Gültig bis: {{expirationDate}}", + "verificationSuccessful": "Karte ist gültig", + "verifyDescription": "Sie möchten die Gültigkeit einer digitalen Ehrenamtskarte prüfen? Scannen Sie den Code hier ein.", + "verifyInfoTitle": "So prüfen Sie die Gültigkeit einer Ehrenamtskarte", + "verifyTitle": "Gültigkeit prüfen" + }, + "intro": { + "applyDescription": "Im Formular geben Sie Informationen über sich und Ihre ehrenamtliche Tätigkeit an.\nAnschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", + "applyTitle": "Wie kann ich die Ehrenamtskarte beantragen?", + "locationDescription": "Wir können Ihren Standort auf der Karte anzeigen und Akzeptanzstellen in Ihrer Umgebung anzeigen.\nWenn Sie diese Hilfen nutzen möchten, benötigen wir Ihre Zustimmung.\nIhr Standort wird nicht gespeichert.", + "locationTitle": "Finden Sie Akzeptanzstellen in Ihrer Umgebung!", + "usageDescription": "Auf der Karte von Bayern können Sie alle Akzeptanzstellen finden.\nTippen Sie auf einen Standort, um mehr Informationen sehen zu können.", + "usageTitle": "Wo kann ich meine Ehrenamtskarte nutzen?", + "welcomeDescription": "Vielen Dank, dass Sie sich die App zur Bayerischen Ehrenamtskarte heruntergeladen haben!", + "welcomeTitle": "Willkommen!" }, "location": { "activateLocationAccess": "Standortermittlung aktivieren", diff --git a/frontend/assets/l10n/main/app_en.json b/frontend/assets/l10n/main/app_en.json index 33cbaf4fe..60e138bae 100644 --- a/frontend/assets/l10n/main/app_en.json +++ b/frontend/assets/l10n/main/app_en.json @@ -65,8 +65,12 @@ }, "identification": { "activate": "Activate", - "activateCardCurrentDevice": "Activate card on this device?", - "activateCardCurrentDeviceRationale": "Your card is already activated on another device. If you activate your card on this device, it will be automatically deactivated on your other device.", + "activateCurrentDeviceDescription": "Your card is already activated on another device. If you activate your card on this device, it will be automatically deactivated on your other device.", + "activateCurrentDeviceTitle": "Activate card on this device?", + "activateDescription": "You have already applied for the Ehrenamtskarte and received the activation code for your digital Ehrenamtskarte? Scan the code here.", + "activateTitle": "Activate card", + "applyDescription": "Are you involved in voluntary work but do not yet have a Ehrenamtskarte? You can apply for your Ehrenamtskarte here.", + "applyTitle": "Apply", "authenticationPossible": "You can use this QR code to identify yourself at acceptance points:", "cameraAccessRequired": "Access to camera required", "cameraAccessRequiredSettings": "To scan a QR code, the app needs access to the camera.\nYou can allow the app to access the camera in the settings.", @@ -90,7 +94,18 @@ "flashOff": "Flash off", "flashOn": "Flash on", "internetRequired": "An internet connection is required.", + "moreActionsActivateDescription": "Your saved Ehrenamtskarte will be retained. You can remove it manually.", + "moreActionsActivateLimitDescription": "To add another Ehrenamtskarte, you must first delete an existing Ehrenamtskarte.", + "moreActionsActivateTitle": "Add another Ehrenamtskarte", + "moreActionsApplyDescription": "Your saved card will be retained.", + "moreActionsApplyTitle": "Apply for or extend a Ehrenamtskarte", + "moreActionsRemoveDescription": "After selection, this Ehrenamtskarte is deleted from the device.", + "moreActionsRemoveTitle": "Delete this Ehrenamtskarte?", + "moreActionsVerifyDescription": "Check the validity of a Ehrenamtskarte", + "moreActionsVerifyTitle": "Check a Ehrenamtskarte", "notVerified": "Not verified", + "removeDescription": "If this card is deleted, it must be added again before using it again.", + "removeTitle": "Delete this card?", "scanCode": "Scan the QR code that appears on the \"Identify\" tab of the other party.", "scanQRCode": "Point the camera at the QR code.", "scanningFailed": "Error reading the code", @@ -101,7 +116,21 @@ "title": "Identify", "unlimited": "unlimited", "validFromUntil": "Valid: {{startDate}} until {{expirationDate}}", - "validUntil": "Valid until: {{expirationDate}}" + "validUntil": "Valid until: {{expirationDate}}", + "verificationSuccessful": "Card is valid", + "verifyDescription": "You would like to check the validity of a digital Ehrenamtskarte? Scan the code here.", + "verifyInfoTitle": "How to check the validity of a Ehrenamtskarte", + "verifyTitle": "Check validity" + }, + "intro": { + "applyDescription": "Provide information about yourself and your volunteer activity in the form.\nThe application is then forwarded and processed by the responsible office.", + "applyTitle": "How can I apply for the Ehrenamtskarte?", + "locationDescription": "We can show your location on the map and display acceptance points in your area.\nIf you want to use these aids, we need your consent.\nYour location is not stored.", + "locationTitle": "Find acceptance points in your area!", + "usageDescription": "On the map of Bavaria you can find all acceptance points.\nTap on a location to be able to see more information.", + "usageTitle": "Where can I use my Ehrenamtskarte?", + "welcomeDescription": "Thank you for downloading the app for the Bayerische Ehrenamtskarte!", + "welcomeTitle": "Welcome!" }, "location": { "activateLocationAccess": "Activate location access", diff --git a/frontend/assets/l10n/nuernberg/overwrite_de.json b/frontend/assets/l10n/nuernberg/overwrite_de.json index 6a50940ba..31b0a25be 100644 --- a/frontend/assets/l10n/nuernberg/overwrite_de.json +++ b/frontend/assets/l10n/nuernberg/overwrite_de.json @@ -1,5 +1,34 @@ { - "about": { - "title": "Nürnberg" + "identification": { + "activateCurrentDeviceDescription": "Ihr Pass ist bereits auf einem anderen Gerät aktiviert. Wenn Sie Ihren Pass auf diesem Gerät aktivieren, wird er auf Ihrem anderen Gerät automatisch deaktiviert.", + "activateCurrentDeviceTitle": "Pass auf diesem Gerät aktivieren?", + "activateDescription": "Sie haben den Nürnberg-Pass bereits beantragt und einen Aktivierungscode erhalten? Scannen Sie den Code hier ein.", + "activateTitle": "Pass aktivieren", + "applyDescription": "Sie haben noch keinen Nürnberg-Pass? Hier können Sie Ihren Nürnberg-Pass beantragen.", + "cardExpired": "Ihr Pass ist abgelaufen.\nUnter \"Weitere Aktionen\" können Sie einen Antrag auf Verlängerung stellen.", + "cardInvalid": "Ihr Pass ist ungültig.\nSie wurde entweder widerrufen oder auf einem anderen Gerät aktiviert.", + "cardNotYetValid": "Der Gültigkeitszeitraum Ihres Passes hat noch nicht begonnen.", + "checkFailed": "Ihr Pass konnte nicht auf ihre Gültigkeit geprüft werden. Bitte stellen Sie sicher, dass eine Internetverbindung besteht und prüfen Sie erneut.", + "moreActionsActivateDescription": "Ihr hinterlegter Nürnberg-Pass bleibt erhalten. Sie können diesen manuell entfernen.", + "moreActionsActivateLimitDescription": "Um einen weiteren Nürnberg-Pass hinzuzufügen, müssen Sie zuerst einen vorhandenen Nürnberg-Pass löschen.", + "moreActionsActivateTitle": "Weiteren Nürnberg-Pass hinzufügen", + "moreActionsApplyDescription": "Ihr hinterlegter Pass bleibt erhalten.", + "moreActionsApplyTitle": "Nürnberg-Pass beantragen oder verlängern", + "moreActionsRemoveDescription": "Nach der Auswahl wird dieser Nürnberg-Pass vom Gerät gelöscht.", + "moreActionsRemoveTitle": "Diesen Nürnberg-Pass löschen", + "moreActionsVerifyDescription": "Prüfen Sie die Gültigkeit eines Nürnberg-Passes.", + "moreActionsVerifyTitle": "Einen Nürnberg-Pass prüfen", + "removeDescription": "Wenn dieser Pass gelöscht wird, muss dieser für eine erneute Verwendung neu hinzugefügt werden.", + "removeTitle": "Diesen Pass löschen?", + "verificationSuccessful": "Pass ist gültig", + "verifyDescription": "Sie möchten die Gültigkeit eines Nürnberg-Passes prüfen? Scannen Sie den Code hier ein.", + "verifyInfoTitle": "So prüfen Sie die Gültigkeit eines Nürnberg-Passes" + }, + "intro": { + "applyDescription": "Im Formular geben Sie Ihre persönlichen Informationen an.\nAnschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", + "applyTitle": "Wie kann ich den Nürnberg-Pass beantragen?", + "usageDescription": "Auf der Karte von Nürnberg können Sie alle Akzeptanzstellen finden.\nTippen Sie auf einen Standort, um mehr Informationen sehen zu können.", + "usageTitle": "Wo kann ich den Nürnberg-Pass nutzen?", + "welcomeDescription": "Vielen Dank, dass Sie sich die App zum Nürnberg-Pass heruntergeladen haben!" } } diff --git a/frontend/assets/l10n/nuernberg/overwrite_en.json b/frontend/assets/l10n/nuernberg/overwrite_en.json index 6a50940ba..70589e29b 100644 --- a/frontend/assets/l10n/nuernberg/overwrite_en.json +++ b/frontend/assets/l10n/nuernberg/overwrite_en.json @@ -1,5 +1,34 @@ { - "about": { - "title": "Nürnberg" + "identification": { + "activateCurrentDeviceDescription": "Your pass is already activated on another device. If you activate your pass on this device, it will be automatically deactivated on your other device.", + "activateCurrentDeviceTitle": "Activate pass on this device?", + "activateDescription": "You have already applied for the Nürnberg-Pass and received an activation code? Scan the code here.", + "activateTitle": "Activate pass", + "applyDescription": "You don't have a Nürnberg-Pass yet? Here you can apply for your Nürnberg-Pass.", + "cardExpired": "Your pass has expired.\nYou can apply for renewal under \"More actions\"", + "cardInvalid": "Your pass is invalid.\nIt has either been revoked or activated on another device.", + "cardNotYetValid": "The validity period of your pass has not started yet.", + "checkFailed": "Your pass could not be verified. Please make sure you have an internet connection and try again.", + "moreActionsActivateDescription": "Your saved Nürnberg-Pass will be retained. You can remove it manually.", + "moreActionsActivateLimitDescription": "To add another Nürnberg-Pass, you must first delete an existing Nürnberg-Pass.", + "moreActionsActivateTitle": "Add another Nürnberg-Pass", + "moreActionsApplyDescription": "Your saved pass will be retained.", + "moreActionsApplyTitle": "Apply for or extend a Nürnberg-Pass", + "moreActionsRemoveDescription": "After selection, this Nürnberg-Pass is deleted from the device.", + "moreActionsRemoveTitle": "Delete this Nürnberg-Pass?", + "moreActionsVerifyDescription": "Check the validity of a Nürnberg-Pass", + "moreActionsVerifyTitle": "Check a Nürnberg-Pass", + "removeDescription": "If this pass is deleted, it must be added again before using it again.", + "removeTitle": "Delete this pass?", + "verificationSuccessful": "Pass is valid", + "verifyDescription": "You would like to check the validity of a Nürnberg-Pass? Scan the code here.", + "verifyInfoTitle": "How to check the validity of a Nürnberg-Pass" + }, + "intro": { + "applyDescription": "Provide your personal information in the form.\nThe application is then forwarded and processed by the responsible office.", + "applyTitle": "How can I apply for the Nürnberg-Pass?", + "usageDescription": "On the map of Nürnberg you can find all acceptance points.\nTap on a location to be able to see more information.", + "usageTitle": "Where can I use my Nürnberg-Pass?", + "welcomeDescription": "Thank you for downloading the app for the Nürnberg-Pass!" } } diff --git a/frontend/build-configs/bayern/index.ts b/frontend/build-configs/bayern/index.ts index dcf2c4d52..f8bd1f41c 100644 --- a/frontend/build-configs/bayern/index.ts +++ b/frontend/build-configs/bayern/index.ts @@ -1,7 +1,6 @@ import BuildConfigType, {CommonBuildConfigType} from "../types" import publisherText from "./publisherText" import disclaimerText from "./disclaimerText" -import localization from "./localization" export const bayernCommon: CommonBuildConfigType = { appName: "Ehrenamt", @@ -56,34 +55,12 @@ export const bayernCommon: CommonBuildConfigType = { boxDecorationRadius: 1, }, iconInAboutTab: "assets/bayern/icon.png", - introSlide1: { - title: "Willkommen!", - description: "Vielen Dank, dass Sie sich die App zur " + - "Bayerischen Ehrenamtskarte heruntergeladen haben!", - imagePath: "assets/bayern/icon.png" - }, - introSlide2: { - title: "Wie kann ich die Ehrenamtskarte beantragen?", - description: "Im Formular geben Sie Informationen über sich und Ihre " + - "ehrenamtliche Tätigkeit an.\nAnschließend wird " + - "der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", - imagePath: "assets/bayern/intro_slides/apply_for_eak.png" - }, - introSlide3: { - title: "Wo kann ich meine Ehrenamtskarte nutzen?", - description: "Auf der Karte von Bayern können Sie alle Akzeptanzstellen" + - " finden.\nTippen Sie auf einen Standort, um mehr Informationen " + - "sehen zu können.", - imagePath: "assets/bayern/intro_slides/map_zoom.jpeg" - }, - introSlide4: { - title: "Finden Sie Akzeptanzstellen in Ihrer Umgebung!", - description: "Wir können Ihren Standort auf der Karte anzeigen" + - " und Akzeptanzstellen in Ihrer Umgebung anzeigen.\n" + - "Wenn Sie diese Hilfen nutzen möchten, benötigen wir Ihre " + - "Zustimmung.\nIhr Standort wird nicht gespeichert.", - imagePath: "assets/bayern/intro_slides/search_with_location.png" - }, + introSlidesImages: [ + "assets/bayern/icon.png", + "assets/bayern/intro_slides/apply_for_eak.png", + "assets/bayern/intro_slides/map_zoom.jpeg", + "assets/bayern/intro_slides/search_with_location.png", + ], featureFlags: { verification: true }, @@ -93,7 +70,6 @@ export const bayernCommon: CommonBuildConfigType = { "Bayerisches Staatsministerium\nfür Familie, Arbeit und Soziales\nWinzererstraße 9\n80797 München", publisherText, disclaimerText, - localization, maxCardAmount: 1 } diff --git a/frontend/build-configs/bayern/localization.ts b/frontend/build-configs/bayern/localization.ts deleted file mode 100644 index 888a70ed1..000000000 --- a/frontend/build-configs/bayern/localization.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { LocalizationType } from "../types" - -const localization: LocalizationType = { - identification: { - noCardView: { - applyTitle: "Beantragen", - applyDescription: - "Sie sind ehrenamtlich engagiert, haben aber noch keine Ehrenamtskarte? Hier können Sie Ihre Ehrenamtskarte beantragen.", - activateTitle: "Karte aktivieren", - activateDescription: - "Sie haben die Ehrenamtskarte bereits beantragt und den Aktivierungscode Ihrer digitalen Ehrenamtskarte erhalten? Scannen Sie den Code hier ein.", - verifyTitle: "Gültigkeit prüfen", - verifyDescription: - "Sie möchten die Gültigkeit einer digitalen Ehrenamtskarte prüfen? Scannen Sie den Code hier ein.", - }, - activationCodeScanner: { - title: "Karte aktivieren", - }, - verificationCodeScanner: { - title: "Karte verifizieren", - infoDialogTitle: "So prüfen Sie die Gültigkeit einer Ehrenamtskarte", - positiveVerificationDialogTitle: "Karte ist gültig", - }, - moreActions: { - applyForAnotherCardTitle: "Ehrenamtskarte beantragen oder verlängern", - applyForAnotherCardDescription: "Ihre hinterlegte Karte bleibt erhalten.", - activateAnotherCardTitle: "Weitere Ehrenamtskarte hinzufügen", - activateAnotherCardDescription: "Ihre hinterlegte Ehrenamtskarte bleibt erhalten. Sie können diese manuell entfernen.", - activationLimitDescription: "Um eine weitere Ehrenamtskarte hinzuzufügen, müssen Sie zuerst eine vorhandene Ehrenamtskarte löschen.", - verifyTitle: "Eine digitale Ehrenamtskarte prüfen", - verifyDescription: "Prüfen Sie die Gültigkeit einer digitalen Ehrenamtskarte.", - removeCardTitle: "Diese Ehrenamtskarte löschen", - removeCardDescription: "Nach der Auswahl wird diese Ehrenamtskarte vom Gerät gelöscht.", - }, - removeCardDialog: { - title: "Diese Karte löschen?", - description: "Wenn diese Karte gelöscht wird, muss diese für eine erneute Verwendung neu hinzugefügt werden.", - } - }, -} - -export default localization diff --git a/frontend/build-configs/nuernberg/index.ts b/frontend/build-configs/nuernberg/index.ts index 5a865a0ac..a9ae629ff 100644 --- a/frontend/build-configs/nuernberg/index.ts +++ b/frontend/build-configs/nuernberg/index.ts @@ -1,7 +1,6 @@ import BuildConfigType, {CommonBuildConfigType} from "../types" import publisherText from "./publisherText" import disclaimerText from "./disclaimerText" -import localization from "./localization" export const nuernbergCommon: CommonBuildConfigType = { appName: "Nürnberg-Pass", @@ -56,36 +55,12 @@ export const nuernbergCommon: CommonBuildConfigType = { boxDecorationRadius: 0, }, iconInAboutTab: "assets/nuernberg/body-logo.png", - introSlide1: { - title: "Willkommen!", - description: "Vielen Dank, dass Sie sich die App zum Nürnberg-Pass heruntergeladen haben!", - imagePath: "assets/nuernberg/body-logo.png", - }, - introSlide2: { - title: "Wie kann ich den Nürnberg-Pass beantragen?", - description: - "Im Formular geben Sie Ihre " + - "persönlichen Informationen an. Anschließend wird " + - "der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", - imagePath: "assets/nuernberg/intro_slides/apply_for_sozialpass.png", - }, - introSlide3: { - title: "Wo kann ich den Nürnberg-Pass nutzen?", - description: - "Auf der Karte von Nürnberg können Sie alle Akzeptanzstellen" + - " finden. Tippen Sie auf einen Standort, um mehr Informationen " + - "sehen zu können.", - imagePath: "assets/nuernberg/intro_slides/map_zoom.png", - }, - introSlide4: { - title: "Finden Sie Akzeptanzstellen in Ihrer Umgebung!", - description: - "Wir können Ihren Standort auf der Karte anzeigen" + - " und Akzeptanzstellen in Ihrer Umgebung anzeigen. " + - "Wenn Sie diese Hilfen nutzen möchten, benötigen wir Ihre " + - "Zustimmung. Ihr Standort wird nicht gespeichert.", - imagePath: "assets/nuernberg/intro_slides/search_with_location.png", - }, + introSlidesImages: [ + "assets/nuernberg/body-logo.png", + "assets/nuernberg/intro_slides/apply_for_sozialpass.png", + "assets/nuernberg/intro_slides/map_zoom.png", + "assets/nuernberg/intro_slides/search_with_location.png", + ], featureFlags: { verification: true }, @@ -95,7 +70,6 @@ export const nuernbergCommon: CommonBuildConfigType = { dataPrivacyPolicyUrl: "https://nuernberg.sozialpass.app/data-privacy-policy", publisherText, disclaimerText, - localization, maxCardAmount: 5, } diff --git a/frontend/build-configs/nuernberg/localization.ts b/frontend/build-configs/nuernberg/localization.ts deleted file mode 100644 index 3d5573b64..000000000 --- a/frontend/build-configs/nuernberg/localization.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { LocalizationType } from "../types" - -const localization: LocalizationType = { - identification: { - noCardView: { - applyTitle: "Beantragen", - applyDescription: - "Sie haben noch keinen Nürnberg-Pass? Hier können Sie Ihren Nürnberg-Pass beantragen.", - activateTitle: "Pass aktivieren", - activateDescription: - "Sie haben den Nürnberg-Pass bereits beantragt und einen Aktivierungscode erhalten? Scannen Sie den Code hier ein.", - verifyTitle: "Gültigkeit prüfen", - verifyDescription: - "Sie möchten die Gültigkeit eines Nürnberg-Passes prüfen? Scannen Sie den Code hier ein.", - }, - activationCodeScanner: { - title: "Pass aktivieren", - }, - verificationCodeScanner: { - title: "Pass verifizieren", - infoDialogTitle: "So prüfen Sie die Gültigkeit eines Nürnberg-Passes", - positiveVerificationDialogTitle: "Pass ist gültig", - }, - moreActions: { - applyForAnotherCardTitle: "Nürnberg-Pass beantragen oder verlängern", - applyForAnotherCardDescription: "Ihr hinterlegter Pass bleibt erhalten.", - activateAnotherCardTitle: "Weiteren Nürnberg-Pass hinzufügen", - activateAnotherCardDescription: "Ihr hinterlegter Pass bleibt erhalten. Sie können diesen manuell entfernen.", - activationLimitDescription: "Um einen weiteren Pass hinzuzufügen, müssen Sie zuerst einen der vorhandenen Pässe löschen.", - verifyTitle: "Einen Nürnberg-Pass prüfen", - verifyDescription: "Prüfen Sie die Gültigkeit eines Nürnberg-Passes.", - removeCardTitle: "Diesen Nürnberg-Pass löschen", - removeCardDescription: "Nach der Auswahl wird der hinterlegte Pass vom Gerät gelöscht.", - }, - removeCardDialog: { - title: "Diesen Pass löschen?", - description: "Wenn dieser Pass gelöscht wird, muss dieser für eine erneute Verwendung neu hinzugefügt werden.", - } - }, -} - -export default localization diff --git a/frontend/build-configs/types.ts b/frontend/build-configs/types.ts index 13d07865f..7403f6db7 100644 --- a/frontend/build-configs/types.ts +++ b/frontend/build-configs/types.ts @@ -13,48 +13,6 @@ export type ThemeType = { primaryDark: string } -type SlideType = { - title: string - description: string - imagePath: string -} - -export type LocalizationType = { - identification: { - noCardView: { - applyTitle: string - applyDescription: string - activateTitle: string - activateDescription: string - verifyTitle: string - verifyDescription: string - } - activationCodeScanner: { - title: string - } - verificationCodeScanner: { - title: string - infoDialogTitle: string - positiveVerificationDialogTitle: string - } - moreActions: { - applyForAnotherCardTitle: string - applyForAnotherCardDescription: string - activateAnotherCardTitle: string - activateAnotherCardDescription: string - activationLimitDescription: string - verifyTitle: string - verifyDescription: string - removeCardTitle: string - removeCardDescription: string - } - removeCardDialog: { - title: string - description: string - } - } -} - export type CommonBuildConfigType = { appName: string appIcon: string @@ -113,10 +71,7 @@ export type CommonBuildConfigType = { boxDecorationRadius: number } iconInAboutTab: string - introSlide1: SlideType, - introSlide2: SlideType, - introSlide3: SlideType, - introSlide4: SlideType + introSlidesImages: [string, string, string, string], theme: ThemeType categories: number[] featureFlags: FeatureFlagsType @@ -125,7 +80,6 @@ export type CommonBuildConfigType = { publisherAddress: string publisherText: string disclaimerText: string - localization: LocalizationType maxCardAmount: number } diff --git a/frontend/lib/identification/activation_workflow/activation_code_scanner_page.dart b/frontend/lib/identification/activation_workflow/activation_code_scanner_page.dart index 373959f8c..b6543cf63 100644 --- a/frontend/lib/identification/activation_workflow/activation_code_scanner_page.dart +++ b/frontend/lib/identification/activation_workflow/activation_code_scanner_page.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:typed_data'; -import 'package:ehrenamtskarte/build_config/build_config.dart' show buildConfig; import 'package:ehrenamtskarte/configuration/configuration.dart'; import 'package:ehrenamtskarte/graphql/graphql_api.graphql.dart'; import 'package:ehrenamtskarte/identification/activation_workflow/activate_code.dart'; @@ -33,10 +32,9 @@ class ActivationCodeScannerPage extends StatelessWidget { @override Widget build(BuildContext context) { - final localization = buildConfig.localization.identification.activationCodeScanner; return Column( children: [ - CustomAppBar(title: localization.title), + CustomAppBar(title: t.identification.activateTitle), Expanded( child: QrCodeScannerPage( onCodeScanned: (code) async => _onCodeScanned(context, code), diff --git a/frontend/lib/identification/activation_workflow/activation_overwrite_existing_dialog.dart b/frontend/lib/identification/activation_workflow/activation_overwrite_existing_dialog.dart index 3eabcce7e..d40be1428 100644 --- a/frontend/lib/identification/activation_workflow/activation_overwrite_existing_dialog.dart +++ b/frontend/lib/identification/activation_workflow/activation_overwrite_existing_dialog.dart @@ -8,11 +8,11 @@ class ActivationOverwriteExistingDialog extends StatelessWidget { @override Widget build(BuildContext context) { return AlertDialog( - title: Text(t.identification.activateCardCurrentDevice, style: TextStyle(fontSize: 18)), + title: Text(t.identification.activateCurrentDeviceTitle, style: TextStyle(fontSize: 18)), content: SingleChildScrollView( child: ListBody( children: [ - Text(t.identification.activateCardCurrentDeviceRationale), + Text(t.identification.activateCurrentDeviceDescription), ], ), ), diff --git a/frontend/lib/identification/card_detail_view/more_actions_dialog.dart b/frontend/lib/identification/card_detail_view/more_actions_dialog.dart index eaa0d6171..092067574 100644 --- a/frontend/lib/identification/card_detail_view/more_actions_dialog.dart +++ b/frontend/lib/identification/card_detail_view/more_actions_dialog.dart @@ -21,7 +21,6 @@ class MoreActionsDialog extends StatelessWidget { @override Widget build(BuildContext context) { - final localization = buildConfig.localization.identification.moreActions; final userCodeModel = Provider.of(context, listen: false); final String cardsInUse = userCodeModel.userCodes.length.toString(); final String maxCardAmount = buildConfig.maxCardAmount.toString(); @@ -35,8 +34,8 @@ class MoreActionsDialog extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ ListTile( - title: Text(localization.applyForAnotherCardTitle), - subtitle: Text(localization.applyForAnotherCardDescription), + title: Text(t.identification.moreActionsApplyTitle), + subtitle: Text(t.identification.moreActionsApplyDescription), leading: const Icon(Icons.assignment, size: 36), onTap: () { Navigator.pop(context); @@ -44,8 +43,8 @@ class MoreActionsDialog extends StatelessWidget { }, ), ListTile( - title: Text(localization.verifyTitle), - subtitle: Text(localization.verifyDescription), + title: Text(t.identification.moreActionsVerifyTitle), + subtitle: Text(t.identification.moreActionsVerifyDescription), leading: const Icon(Icons.verified, size: 36), onTap: () { Navigator.pop(context); @@ -54,11 +53,11 @@ class MoreActionsDialog extends StatelessWidget { ), ListTile( enabled: !cardLimitIsReached, - title: Text('${localization.activateAnotherCardTitle} ($cardsInUse/$maxCardAmount)', + title: Text('${t.identification.moreActionsActivateTitle} ($cardsInUse/$maxCardAmount)', style: TextStyle(color: Theme.of(context).colorScheme.onBackground)), subtitle: Text(cardLimitIsReached - ? localization.activationLimitDescription - : localization.activateAnotherCardDescription), + ? t.identification.moreActionsActivateLimitDescription + : t.identification.moreActionsActivateDescription), leading: Icon(Icons.add_card, size: 36), onTap: () { Navigator.pop(context); @@ -66,8 +65,8 @@ class MoreActionsDialog extends StatelessWidget { }, ), ListTile( - title: Text(localization.removeCardTitle), - subtitle: Text(localization.removeCardDescription), + title: Text(t.identification.moreActionsRemoveTitle), + subtitle: Text(t.identification.moreActionsRemoveDescription), leading: const Icon(Icons.delete, size: 36), onTap: () { Navigator.pop(context); diff --git a/frontend/lib/identification/no_card_view.dart b/frontend/lib/identification/no_card_view.dart index 056f26b7c..b5fcc46e9 100644 --- a/frontend/lib/identification/no_card_view.dart +++ b/frontend/lib/identification/no_card_view.dart @@ -1,4 +1,4 @@ -import 'package:ehrenamtskarte/build_config/build_config.dart' show buildConfig; +import 'package:ehrenamtskarte/l10n/translations.g.dart'; import 'package:flutter/material.dart'; class NoCardView extends StatelessWidget { @@ -15,7 +15,6 @@ class NoCardView extends StatelessWidget { @override Widget build(BuildContext context) { - final localization = buildConfig.localization.identification.noCardView; return LayoutBuilder( builder: (BuildContext context, BoxConstraints viewportConstraints) => SingleChildScrollView( child: ConstrainedBox( @@ -27,20 +26,20 @@ class NoCardView extends StatelessWidget { children: [ _TapableCardWithArea( onTap: startApplication, - title: localization.applyTitle, - description: localization.applyDescription, + title: t.identification.applyTitle, + description: t.identification.applyDescription, icon: Icons.assignment, ), _TapableCardWithArea( onTap: startActivation, - title: localization.activateTitle, - description: localization.activateDescription, + title: t.identification.activateTitle, + description: t.identification.activateDescription, icon: Icons.add_card, ), _TapableCardWithArea( onTap: startVerification, - title: localization.verifyTitle, - description: localization.verifyDescription, + title: t.identification.verifyTitle, + description: t.identification.verifyDescription, icon: Icons.verified, ), ].wrapWithSpacers(height: 24), diff --git a/frontend/lib/identification/verification_workflow/dialogs/positive_verification_result_dialog.dart b/frontend/lib/identification/verification_workflow/dialogs/positive_verification_result_dialog.dart index 7991168a3..d7daae30c 100644 --- a/frontend/lib/identification/verification_workflow/dialogs/positive_verification_result_dialog.dart +++ b/frontend/lib/identification/verification_workflow/dialogs/positive_verification_result_dialog.dart @@ -1,4 +1,3 @@ -import 'package:ehrenamtskarte/build_config/build_config.dart' show buildConfig; import 'package:ehrenamtskarte/configuration/configuration.dart'; import 'package:ehrenamtskarte/graphql/graphql_api.dart'; import 'package:ehrenamtskarte/identification/id_card/id_card.dart'; @@ -41,7 +40,6 @@ class PositiveVerificationResultDialogState extends State { @override Widget build(BuildContext context) { - final localization = buildConfig.localization.identification.removeCardDialog; final projectId = Configuration.of(context).projectId; final regionsQuery = GetRegionsByIdQuery( variables: GetRegionsByIdArguments( @@ -52,14 +51,14 @@ class RemoveCardConfirmationDialogState extends State[ Padding( padding: EdgeInsets.only(bottom: 20), - child: Text(localization.description, style: TextStyle(fontSize: 14))), + child: Text(t.identification.removeDescription, style: TextStyle(fontSize: 14))), IdCard( cardInfo: widget.userCode.info, region: region != null ? Region(region.prefix, region.name) : null, diff --git a/frontend/lib/identification/verification_workflow/dialogs/verification_info_dialog.dart b/frontend/lib/identification/verification_workflow/dialogs/verification_info_dialog.dart index bacb1cd48..19e83c7ab 100644 --- a/frontend/lib/identification/verification_workflow/dialogs/verification_info_dialog.dart +++ b/frontend/lib/identification/verification_workflow/dialogs/verification_info_dialog.dart @@ -1,4 +1,3 @@ -import 'package:ehrenamtskarte/build_config/build_config.dart' show buildConfig; import 'package:ehrenamtskarte/configuration/settings_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -11,9 +10,8 @@ class VerificationInfoDialog extends StatelessWidget { @override Widget build(BuildContext context) { final settings = Provider.of(context); - final localization = buildConfig.localization.identification.verificationCodeScanner; return AlertDialog( - title: Text(localization.infoDialogTitle), + title: Text(t.identification.verifyInfoTitle), content: SingleChildScrollView( child: ListBody( children: [ diff --git a/frontend/lib/identification/verification_workflow/verification_qr_scanner_page.dart b/frontend/lib/identification/verification_workflow/verification_qr_scanner_page.dart index 62d8ca0b4..3332d7532 100644 --- a/frontend/lib/identification/verification_workflow/verification_qr_scanner_page.dart +++ b/frontend/lib/identification/verification_workflow/verification_qr_scanner_page.dart @@ -1,6 +1,5 @@ import 'dart:typed_data'; -import 'package:ehrenamtskarte/build_config/build_config.dart' show buildConfig; import 'package:ehrenamtskarte/configuration/configuration.dart'; import 'package:ehrenamtskarte/configuration/settings_model.dart'; import 'package:ehrenamtskarte/identification/connection_failed_dialog.dart'; @@ -33,7 +32,7 @@ class VerificationQrScannerPage extends StatelessWidget { return Column( children: [ CustomAppBar( - title: buildConfig.localization.identification.verificationCodeScanner.title, + title: t.identification.verifyTitle, actions: [ IconButton( icon: const Icon(Icons.help), diff --git a/frontend/lib/intro_slides/intro_screen.dart b/frontend/lib/intro_slides/intro_screen.dart index 284ba989a..cb23cae0c 100644 --- a/frontend/lib/intro_slides/intro_screen.dart +++ b/frontend/lib/intro_slides/intro_screen.dart @@ -34,9 +34,9 @@ class IntroScreen extends StatelessWidget { isShowSkipBtn: false, listContentConfig: [ ContentConfig( - title: buildConfig.introSlide1.title, - description: buildConfig.introSlide1.description, - pathImage: buildConfig.introSlide1.imagePath, + title: t.intro.welcomeTitle, + description: t.intro.welcomeDescription, + pathImage: buildConfig.introSlidesImages[0], backgroundColor: theme.brightness == Brightness.light ? const Color(0xffECECEC) : theme.colorScheme.background, maxLineTitle: 3, @@ -44,9 +44,9 @@ class IntroScreen extends StatelessWidget { styleDescription: theme.textTheme.bodyLarge?.apply(fontSizeFactor: 1.2), ), ContentConfig( - title: buildConfig.introSlide2.title, - description: buildConfig.introSlide2.description, - pathImage: buildConfig.introSlide2.imagePath, + title: t.intro.applyTitle, + description: t.intro.applyDescription, + pathImage: buildConfig.introSlidesImages[1], backgroundColor: theme.brightness == Brightness.light ? const Color(0xffECECEC) : theme.colorScheme.background, maxLineTitle: 3, @@ -54,9 +54,9 @@ class IntroScreen extends StatelessWidget { styleDescription: theme.textTheme.bodyLarge?.apply(fontSizeFactor: 1.2), ), ContentConfig( - title: buildConfig.introSlide3.title, - description: buildConfig.introSlide3.description, - pathImage: buildConfig.introSlide3.imagePath, + title: t.intro.usageTitle, + description: t.intro.usageDescription, + pathImage: buildConfig.introSlidesImages[2], backgroundColor: theme.brightness == Brightness.light ? const Color(0xffECECEC) : theme.colorScheme.background, maxLineTitle: 3, @@ -64,17 +64,17 @@ class IntroScreen extends StatelessWidget { styleDescription: theme.textTheme.bodyLarge?.apply(fontSizeFactor: 1.2), ), ContentConfig( - title: buildConfig.introSlide4.title, + title: t.intro.locationTitle, backgroundColor: theme.brightness == Brightness.light ? const Color(0xffECECEC) : theme.colorScheme.background, maxLineTitle: 3, styleTitle: theme.textTheme.headlineSmall, - pathImage: buildConfig.introSlide4.imagePath, + pathImage: buildConfig.introSlidesImages[3], widgetDescription: Center( child: Column( children: [ Text( - buildConfig.introSlide4.description, + t.intro.locationDescription, style: theme.textTheme.bodyLarge?.apply(fontSizeFactor: 1.2), textAlign: TextAlign.center, maxLines: 100, diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index dbbaf25c6..3ce466071 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -8,6 +8,7 @@ import 'package:ehrenamtskarte/sentry.dart'; import 'package:ehrenamtskarte/settings_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:slang/builder/model/enums.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -26,8 +27,7 @@ Future main() async { void override(AppLocale locale) async { final localeOverwritePath = '${buildConfig.localeOverwritePath}/overwrite_${locale.languageCode}.json'; String overrideLocales = await rootBundle.loadString(localeOverwritePath); - // TODO uncomment in #1177 - // LocaleSettings.overrideTranslations(locale: locale, fileType: FileType.json, content: overrideLocales); + LocaleSettings.overrideTranslations(locale: locale, fileType: FileType.json, content: overrideLocales); } AppLocale.values.forEach(override); From 8921cbf19f62880d8a27dfcd5cdda8db0a04b772 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Thu, 26 Oct 2023 15:29:09 +0200 Subject: [PATCH 2/6] 1177: Remove escaped chars --- frontend/assets/l10n/main/app_de.json | 12 ++++++------ frontend/assets/l10n/main/app_en.json | 12 ++++++------ frontend/assets/l10n/nuernberg/overwrite_de.json | 8 ++++---- frontend/assets/l10n/nuernberg/overwrite_en.json | 10 +++++----- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/frontend/assets/l10n/main/app_de.json b/frontend/assets/l10n/main/app_de.json index f620b89cf..44ad09c9e 100644 --- a/frontend/assets/l10n/main/app_de.json +++ b/frontend/assets/l10n/main/app_de.json @@ -73,10 +73,10 @@ "applyTitle": "Beantragen", "authenticationPossible": "Mit diesem QR-Code können Sie sich bei Akzeptanzstellen ausweisen:", "cameraAccessRequired": "Zugriff auf Kamera erforderlich", - "cameraAccessRequiredSettings": "Um einen QR-Code einzuscannen, benötigt die App Zugriff auf die Kamera.\nIn den Einstellungen können Sie der App den Zugriff auf die Kamera erlauben.", + "cameraAccessRequiredSettings": "Um einen QR-Code einzuscannen, benötigt die App Zugriff auf die Kamera. In den Einstellungen können Sie der App den Zugriff auf die Kamera erlauben.", "cardAlreadyActivated": "Der eingescannte QRCode wurde bereits aktiviert.", - "cardExpired": "Ihre Karte ist abgelaufen.\nUnter \"Weitere Aktionen\" können Sie einen Antrag auf Verlängerung stellen.", - "cardInvalid": "Ihre Karte ist ungültig.\nSie wurde entweder widerrufen oder auf einem anderen Gerät aktiviert.", + "cardExpired": "Ihre Karte ist abgelaufen. Unter \"Weitere Aktionen\" können Sie einen Antrag auf Verlängerung stellen.", + "cardInvalid": "Ihre Karte ist ungültig. Sie wurde entweder widerrufen oder auf einem anderen Gerät aktiviert.", "cardNotYetValid": "Der Gültigkeitszeitraum Ihrer Karte hat noch nicht begonnen.", "checkFailed": "Ihre Karte konnte nicht auf ihre Gültigkeit geprüft werden. Bitte stellen Sie sicher, dass eine Internetverbindung besteht und prüfen Sie erneut.", "checkRequired": "Prüfung nötig", @@ -123,11 +123,11 @@ "verifyTitle": "Gültigkeit prüfen" }, "intro": { - "applyDescription": "Im Formular geben Sie Informationen über sich und Ihre ehrenamtliche Tätigkeit an.\nAnschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", + "applyDescription": "Im Formular geben Sie Informationen über sich und Ihre ehrenamtliche Tätigkeit an. Anschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", "applyTitle": "Wie kann ich die Ehrenamtskarte beantragen?", - "locationDescription": "Wir können Ihren Standort auf der Karte anzeigen und Akzeptanzstellen in Ihrer Umgebung anzeigen.\nWenn Sie diese Hilfen nutzen möchten, benötigen wir Ihre Zustimmung.\nIhr Standort wird nicht gespeichert.", + "locationDescription": "Wir können Ihren Standort auf der Karte anzeigen und Akzeptanzstellen in Ihrer Umgebung anzeigen. Wenn Sie diese Hilfen nutzen möchten, benötigen wir Ihre Zustimmung. Ihr Standort wird nicht gespeichert.", "locationTitle": "Finden Sie Akzeptanzstellen in Ihrer Umgebung!", - "usageDescription": "Auf der Karte von Bayern können Sie alle Akzeptanzstellen finden.\nTippen Sie auf einen Standort, um mehr Informationen sehen zu können.", + "usageDescription": "Auf der Karte von Bayern können Sie alle Akzeptanzstellen finden. Tippen Sie auf einen Standort, um mehr Informationen sehen zu können.", "usageTitle": "Wo kann ich meine Ehrenamtskarte nutzen?", "welcomeDescription": "Vielen Dank, dass Sie sich die App zur Bayerischen Ehrenamtskarte heruntergeladen haben!", "welcomeTitle": "Willkommen!" diff --git a/frontend/assets/l10n/main/app_en.json b/frontend/assets/l10n/main/app_en.json index 60e138bae..285aa1890 100644 --- a/frontend/assets/l10n/main/app_en.json +++ b/frontend/assets/l10n/main/app_en.json @@ -73,10 +73,10 @@ "applyTitle": "Apply", "authenticationPossible": "You can use this QR code to identify yourself at acceptance points:", "cameraAccessRequired": "Access to camera required", - "cameraAccessRequiredSettings": "To scan a QR code, the app needs access to the camera.\nYou can allow the app to access the camera in the settings.", + "cameraAccessRequiredSettings": "To scan a QR code, the app needs access to the camera. You can allow the app to access the camera in the settings.", "cardAlreadyActivated": "The scanned QR code has already been activated.", - "cardExpired": "Your card has expired.\nYou can apply for renewal under \"More actions\"", - "cardInvalid": "Your card is invalid.\nIt has either been revoked or activated on another device.", + "cardExpired": "Your card has expired. You can apply for renewal under \"More actions\"", + "cardInvalid": "Your card is invalid. It has either been revoked or activated on another device.", "cardNotYetValid": "The validity period of your card has not started yet.", "checkFailed": "Your card could not be verified. Please make sure you have an internet connection and try again.", "checkRequired": "Verification necessary", @@ -123,11 +123,11 @@ "verifyTitle": "Check validity" }, "intro": { - "applyDescription": "Provide information about yourself and your volunteer activity in the form.\nThe application is then forwarded and processed by the responsible office.", + "applyDescription": "Provide information about yourself and your volunteer activity in the form. The application is then forwarded and processed by the responsible office.", "applyTitle": "How can I apply for the Ehrenamtskarte?", - "locationDescription": "We can show your location on the map and display acceptance points in your area.\nIf you want to use these aids, we need your consent.\nYour location is not stored.", + "locationDescription": "We can show your location on the map and display acceptance points in your area. If you want to use these aids, we need your consent. Your location is not stored.", "locationTitle": "Find acceptance points in your area!", - "usageDescription": "On the map of Bavaria you can find all acceptance points.\nTap on a location to be able to see more information.", + "usageDescription": "On the map of Bavaria you can find all acceptance points. Tap on a location to be able to see more information.", "usageTitle": "Where can I use my Ehrenamtskarte?", "welcomeDescription": "Thank you for downloading the app for the Bayerische Ehrenamtskarte!", "welcomeTitle": "Welcome!" diff --git a/frontend/assets/l10n/nuernberg/overwrite_de.json b/frontend/assets/l10n/nuernberg/overwrite_de.json index 31b0a25be..76c38c031 100644 --- a/frontend/assets/l10n/nuernberg/overwrite_de.json +++ b/frontend/assets/l10n/nuernberg/overwrite_de.json @@ -5,8 +5,8 @@ "activateDescription": "Sie haben den Nürnberg-Pass bereits beantragt und einen Aktivierungscode erhalten? Scannen Sie den Code hier ein.", "activateTitle": "Pass aktivieren", "applyDescription": "Sie haben noch keinen Nürnberg-Pass? Hier können Sie Ihren Nürnberg-Pass beantragen.", - "cardExpired": "Ihr Pass ist abgelaufen.\nUnter \"Weitere Aktionen\" können Sie einen Antrag auf Verlängerung stellen.", - "cardInvalid": "Ihr Pass ist ungültig.\nSie wurde entweder widerrufen oder auf einem anderen Gerät aktiviert.", + "cardExpired": "Ihr Pass ist abgelaufen. Unter \"Weitere Aktionen\" können Sie einen Antrag auf Verlängerung stellen.", + "cardInvalid": "Ihr Pass ist ungültig. Sie wurde entweder widerrufen oder auf einem anderen Gerät aktiviert.", "cardNotYetValid": "Der Gültigkeitszeitraum Ihres Passes hat noch nicht begonnen.", "checkFailed": "Ihr Pass konnte nicht auf ihre Gültigkeit geprüft werden. Bitte stellen Sie sicher, dass eine Internetverbindung besteht und prüfen Sie erneut.", "moreActionsActivateDescription": "Ihr hinterlegter Nürnberg-Pass bleibt erhalten. Sie können diesen manuell entfernen.", @@ -25,9 +25,9 @@ "verifyInfoTitle": "So prüfen Sie die Gültigkeit eines Nürnberg-Passes" }, "intro": { - "applyDescription": "Im Formular geben Sie Ihre persönlichen Informationen an.\nAnschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", + "applyDescription": "Im Formular geben Sie Ihre persönlichen Informationen an. Anschließend wird der Antrag weitergeleitet und von der zuständigen Stelle bearbeitet.", "applyTitle": "Wie kann ich den Nürnberg-Pass beantragen?", - "usageDescription": "Auf der Karte von Nürnberg können Sie alle Akzeptanzstellen finden.\nTippen Sie auf einen Standort, um mehr Informationen sehen zu können.", + "usageDescription": "Auf der Karte von Nürnberg können Sie alle Akzeptanzstellen finden. Tippen Sie auf einen Standort, um mehr Informationen sehen zu können.", "usageTitle": "Wo kann ich den Nürnberg-Pass nutzen?", "welcomeDescription": "Vielen Dank, dass Sie sich die App zum Nürnberg-Pass heruntergeladen haben!" } diff --git a/frontend/assets/l10n/nuernberg/overwrite_en.json b/frontend/assets/l10n/nuernberg/overwrite_en.json index 70589e29b..6a1cb650d 100644 --- a/frontend/assets/l10n/nuernberg/overwrite_en.json +++ b/frontend/assets/l10n/nuernberg/overwrite_en.json @@ -4,9 +4,9 @@ "activateCurrentDeviceTitle": "Activate pass on this device?", "activateDescription": "You have already applied for the Nürnberg-Pass and received an activation code? Scan the code here.", "activateTitle": "Activate pass", - "applyDescription": "You don't have a Nürnberg-Pass yet? Here you can apply for your Nürnberg-Pass.", - "cardExpired": "Your pass has expired.\nYou can apply for renewal under \"More actions\"", - "cardInvalid": "Your pass is invalid.\nIt has either been revoked or activated on another device.", + "applyDescription": "You do not yet have a Nürnberg-Pass? Here you can apply for your Nürnberg-Pass.", + "cardExpired": "Your pass has expired. You can apply for renewal under \"More actions\"", + "cardInvalid": "Your pass is invalid. It has either been revoked or activated on another device.", "cardNotYetValid": "The validity period of your pass has not started yet.", "checkFailed": "Your pass could not be verified. Please make sure you have an internet connection and try again.", "moreActionsActivateDescription": "Your saved Nürnberg-Pass will be retained. You can remove it manually.", @@ -25,9 +25,9 @@ "verifyInfoTitle": "How to check the validity of a Nürnberg-Pass" }, "intro": { - "applyDescription": "Provide your personal information in the form.\nThe application is then forwarded and processed by the responsible office.", + "applyDescription": "Provide your personal information in the form. The application is then forwarded and processed by the responsible office.", "applyTitle": "How can I apply for the Nürnberg-Pass?", - "usageDescription": "On the map of Nürnberg you can find all acceptance points.\nTap on a location to be able to see more information.", + "usageDescription": "On the map of Nürnberg you can find all acceptance points. Tap on a location to be able to see more information.", "usageTitle": "Where can I use my Nürnberg-Pass?", "welcomeDescription": "Thank you for downloading the app for the Nürnberg-Pass!" } From 6d3eafcf5e64fb68cf9e05aed9993225ef692c65 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Mon, 6 Nov 2023 13:34:35 +0100 Subject: [PATCH 3/6] 1177: Improve translations --- frontend/assets/l10n/main/app_en.json | 20 +++++++++---------- .../assets/l10n/nuernberg/overwrite_en.json | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frontend/assets/l10n/main/app_en.json b/frontend/assets/l10n/main/app_en.json index 285aa1890..12d154821 100644 --- a/frontend/assets/l10n/main/app_en.json +++ b/frontend/assets/l10n/main/app_en.json @@ -40,7 +40,7 @@ "media": "Multimedia", "mobility": "Mobility", "mobilityLong": "Car/Bicycle", - "movies": "Plays", + "movies": "Shows", "moviesLong": "Cinema/Theater/Concerts", "other": "Other", "pharmacies": "Pharmacies", @@ -69,7 +69,7 @@ "activateCurrentDeviceTitle": "Activate card on this device?", "activateDescription": "You have already applied for the Ehrenamtskarte and received the activation code for your digital Ehrenamtskarte? Scan the code here.", "activateTitle": "Activate card", - "applyDescription": "Are you involved in voluntary work but do not yet have a Ehrenamtskarte? You can apply for your Ehrenamtskarte here.", + "applyDescription": "Are you involved in voluntary work but do not yet have an Ehrenamtskarte? You can apply for your Ehrenamtskarte here.", "applyTitle": "Apply", "authenticationPossible": "You can use this QR code to identify yourself at acceptance points:", "cameraAccessRequired": "Access to camera required", @@ -77,7 +77,7 @@ "cardAlreadyActivated": "The scanned QR code has already been activated.", "cardExpired": "Your card has expired. You can apply for renewal under \"More actions\"", "cardInvalid": "Your card is invalid. It has either been revoked or activated on another device.", - "cardNotYetValid": "The validity period of your card has not started yet.", + "cardNotYetValid": "The validity period of your card has not yet started.", "checkFailed": "Your card could not be verified. Please make sure you have an internet connection and try again.", "checkRequired": "Verification necessary", "checkingCode": "The QR code is verified by a server request.", @@ -94,15 +94,15 @@ "flashOff": "Flash off", "flashOn": "Flash on", "internetRequired": "An internet connection is required.", - "moreActionsActivateDescription": "Your saved Ehrenamtskarte will be retained. You can remove it manually.", + "moreActionsActivateDescription": "Your saved cards will be retained. You can remove them manually.", "moreActionsActivateLimitDescription": "To add another Ehrenamtskarte, you must first delete an existing Ehrenamtskarte.", "moreActionsActivateTitle": "Add another Ehrenamtskarte", - "moreActionsApplyDescription": "Your saved card will be retained.", - "moreActionsApplyTitle": "Apply for or extend a Ehrenamtskarte", - "moreActionsRemoveDescription": "After selection, this Ehrenamtskarte is deleted from the device.", + "moreActionsApplyDescription": "Your saved cards will be retained.", + "moreActionsApplyTitle": "Apply for or extend an Ehrenamtskarte", + "moreActionsRemoveDescription": "After selection, this Ehrenamtskarte will be deleted from the device.", "moreActionsRemoveTitle": "Delete this Ehrenamtskarte?", - "moreActionsVerifyDescription": "Check the validity of a Ehrenamtskarte", - "moreActionsVerifyTitle": "Check a Ehrenamtskarte", + "moreActionsVerifyDescription": "Check the validity of an Ehrenamtskarte", + "moreActionsVerifyTitle": "Check an Ehrenamtskarte", "notVerified": "Not verified", "removeDescription": "If this card is deleted, it must be added again before using it again.", "removeTitle": "Delete this card?", @@ -119,7 +119,7 @@ "validUntil": "Valid until: {{expirationDate}}", "verificationSuccessful": "Card is valid", "verifyDescription": "You would like to check the validity of a digital Ehrenamtskarte? Scan the code here.", - "verifyInfoTitle": "How to check the validity of a Ehrenamtskarte", + "verifyInfoTitle": "How to check the validity of an Ehrenamtskarte", "verifyTitle": "Check validity" }, "intro": { diff --git a/frontend/assets/l10n/nuernberg/overwrite_en.json b/frontend/assets/l10n/nuernberg/overwrite_en.json index 6a1cb650d..159272b6a 100644 --- a/frontend/assets/l10n/nuernberg/overwrite_en.json +++ b/frontend/assets/l10n/nuernberg/overwrite_en.json @@ -7,14 +7,14 @@ "applyDescription": "You do not yet have a Nürnberg-Pass? Here you can apply for your Nürnberg-Pass.", "cardExpired": "Your pass has expired. You can apply for renewal under \"More actions\"", "cardInvalid": "Your pass is invalid. It has either been revoked or activated on another device.", - "cardNotYetValid": "The validity period of your pass has not started yet.", + "cardNotYetValid": "The validity period of your pass has not yet started.", "checkFailed": "Your pass could not be verified. Please make sure you have an internet connection and try again.", - "moreActionsActivateDescription": "Your saved Nürnberg-Pass will be retained. You can remove it manually.", + "moreActionsActivateDescription": "Your saved passes will be retained. You can remove them manually.", "moreActionsActivateLimitDescription": "To add another Nürnberg-Pass, you must first delete an existing Nürnberg-Pass.", "moreActionsActivateTitle": "Add another Nürnberg-Pass", - "moreActionsApplyDescription": "Your saved pass will be retained.", + "moreActionsApplyDescription": "Your saved passes will be retained.", "moreActionsApplyTitle": "Apply for or extend a Nürnberg-Pass", - "moreActionsRemoveDescription": "After selection, this Nürnberg-Pass is deleted from the device.", + "moreActionsRemoveDescription": "After selection, this Nürnberg-Pass will be deleted from the device.", "moreActionsRemoveTitle": "Delete this Nürnberg-Pass?", "moreActionsVerifyDescription": "Check the validity of a Nürnberg-Pass", "moreActionsVerifyTitle": "Check a Nürnberg-Pass", From 57d9640540e8da45657abfd1ccee29cfd85a7cc9 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Mon, 6 Nov 2023 13:50:39 +0100 Subject: [PATCH 4/6] 1177: Fix l10n override paths --- frontend/assets/l10n/{main => }/app_de.json | 0 frontend/assets/l10n/{main => }/app_en.json | 0 .../overwrite_de.json => nuernberg/l10n/override_de.json} | 0 .../overwrite_en.json => nuernberg/l10n/override_en.json} | 0 frontend/build-configs/bayern/index.ts | 2 +- frontend/build-configs/nuernberg/index.ts | 2 +- frontend/build-configs/types.ts | 2 +- frontend/build.yaml | 4 ++-- frontend/lib/main.dart | 6 +++--- frontend/pubspec.yaml | 2 +- 10 files changed, 9 insertions(+), 9 deletions(-) rename frontend/assets/l10n/{main => }/app_de.json (100%) rename frontend/assets/l10n/{main => }/app_en.json (100%) rename frontend/assets/{l10n/nuernberg/overwrite_de.json => nuernberg/l10n/override_de.json} (100%) rename frontend/assets/{l10n/nuernberg/overwrite_en.json => nuernberg/l10n/override_en.json} (100%) diff --git a/frontend/assets/l10n/main/app_de.json b/frontend/assets/l10n/app_de.json similarity index 100% rename from frontend/assets/l10n/main/app_de.json rename to frontend/assets/l10n/app_de.json diff --git a/frontend/assets/l10n/main/app_en.json b/frontend/assets/l10n/app_en.json similarity index 100% rename from frontend/assets/l10n/main/app_en.json rename to frontend/assets/l10n/app_en.json diff --git a/frontend/assets/l10n/nuernberg/overwrite_de.json b/frontend/assets/nuernberg/l10n/override_de.json similarity index 100% rename from frontend/assets/l10n/nuernberg/overwrite_de.json rename to frontend/assets/nuernberg/l10n/override_de.json diff --git a/frontend/assets/l10n/nuernberg/overwrite_en.json b/frontend/assets/nuernberg/l10n/override_en.json similarity index 100% rename from frontend/assets/l10n/nuernberg/overwrite_en.json rename to frontend/assets/nuernberg/l10n/override_en.json diff --git a/frontend/build-configs/bayern/index.ts b/frontend/build-configs/bayern/index.ts index f8bd1f41c..1185ba8e4 100644 --- a/frontend/build-configs/bayern/index.ts +++ b/frontend/build-configs/bayern/index.ts @@ -31,7 +31,7 @@ export const bayernCommon: CommonBuildConfigType = { local: "http://localhost:8000", }, appLocales: ['de'], - localeOverwritePath: null, + localeOverridePath: null, cardBranding: { headerTextColor: "#008dc9", headerColor: "#F5F5FFF5", diff --git a/frontend/build-configs/nuernberg/index.ts b/frontend/build-configs/nuernberg/index.ts index a9ae629ff..526fc1f47 100644 --- a/frontend/build-configs/nuernberg/index.ts +++ b/frontend/build-configs/nuernberg/index.ts @@ -31,7 +31,7 @@ export const nuernbergCommon: CommonBuildConfigType = { local: "http://localhost:8000", }, appLocales: ['de', 'en'], - localeOverwritePath: 'assets/l10n/nuernberg', + localeOverridePath: 'assets/nuernberg/l10n', cardBranding: { headerTextColor: "#000000", headerTextFontSize: 9, diff --git a/frontend/build-configs/types.ts b/frontend/build-configs/types.ts index 7403f6db7..8b553c4b2 100644 --- a/frontend/build-configs/types.ts +++ b/frontend/build-configs/types.ts @@ -37,7 +37,7 @@ export type CommonBuildConfigType = { local: string } appLocales: string[] - localeOverwritePath: string | null + localeOverridePath: string | null cardBranding: { headerTextColor: string headerColor: string diff --git a/frontend/build.yaml b/frontend/build.yaml index 4d9f53c9d..417a551a2 100644 --- a/frontend/build.yaml +++ b/frontend/build.yaml @@ -8,7 +8,7 @@ targets: - schema.graphql - card.proto - lib/build_config/build_config.yaml - - assets/l10n/main/** + - assets/l10n/* builders: df_build_config: generate_for: @@ -38,7 +38,7 @@ targets: slang_build_runner: options: base_locale: de - input_directory: assets/l10n/main + input_directory: assets/l10n input_file_pattern: .json output_file_name: translations.g.dart output_directory: lib/l10n diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index 3ce466071..e5bec10f2 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -23,10 +23,10 @@ Future main() async { // Use override locales for whitelabels (e.g. nuernberg) // ignore: unnecessary_null_comparison - if (buildConfig.localeOverwritePath != null) { + if (buildConfig.localeOverridePath != null) { void override(AppLocale locale) async { - final localeOverwritePath = '${buildConfig.localeOverwritePath}/overwrite_${locale.languageCode}.json'; - String overrideLocales = await rootBundle.loadString(localeOverwritePath); + final localeOverridePath = '${buildConfig.localeOverridePath}/override_${locale.languageCode}.json'; + String overrideLocales = await rootBundle.loadString(localeOverridePath); LocaleSettings.overrideTranslations(locale: locale, fileType: FileType.json, content: overrideLocales); } diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index 986de2d42..ac9a6e619 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -112,7 +112,7 @@ flutter: - assets/nuernberg/body-logo.png - assets/nuernberg/background.png - assets/nuernberg/intro_slides/ - - assets/l10n/nuernberg/ + - assets/nuernberg/l10n/ # An image asset can refer to one or more resolution-specific 'variants', see # https://flutter.dev/assets-and-images/#resolution-aware. From aa3d4448978c26751eb27fa75660bc85a88da324 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Mon, 6 Nov 2023 14:27:27 +0100 Subject: [PATCH 5/6] 1177: Use English as locale fallback if supported --- frontend/lib/main.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index e5bec10f2..311e136dc 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -17,6 +17,8 @@ Future main() async { final locale = Platform.localeName.split('_')[0]; if (buildConfig.appLocales.contains(locale)) { LocaleSettings.useDeviceLocale(); + } else if (buildConfig.appLocales.contains('en')) { + LocaleSettings.setLocale(AppLocale.en); } else { LocaleSettings.setLocale(AppLocale.de); } From c90e91c1c24f7ea7e2b5e796bcaf64b38cd9d703 Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Mon, 6 Nov 2023 14:32:46 +0100 Subject: [PATCH 6/6] 1177: Fix pubspec.yaml --- frontend/pubspec.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/frontend/pubspec.yaml b/frontend/pubspec.yaml index ac9a6e619..145fcc894 100644 --- a/frontend/pubspec.yaml +++ b/frontend/pubspec.yaml @@ -93,9 +93,6 @@ dev_dependencies: # The following section is specific to Flutter. flutter: - # Used for localization (l10n) - generate: true - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class.