diff --git a/fe/src/i18n/de.json b/fe/src/i18n/de.json index 49c77bf..31586fc 100644 --- a/fe/src/i18n/de.json +++ b/fe/src/i18n/de.json @@ -3,588 +3,629 @@ "hello": "Hallo" }, "loginPage": { - "emailLabel": "DE: Email", - "passwordLabel": "DE: Password", - "togglePasswordVisibilityLabel": "DE: Toggle password visibility", - "loginButton": "DE: Login", - "signupLink": "DE: Don't have an account? Sign up", + "emailLabel": "E-Mail", + "passwordLabel": "Passwort", + "togglePasswordVisibilityLabel": "Passwort-Sichtbarkeit umschalten", + "loginButton": "Anmelden", + "signupLink": "Kein Konto? Registrieren", "errors": { - "emailRequired": "DE: Email is required", - "emailInvalid": "DE: Invalid email format", - "passwordRequired": "DE: Password is required", - "loginFailed": "DE: Login failed. Please check your credentials." + "emailRequired": "E-Mail ist erforderlich", + "emailInvalid": "Ungültiges E-Mail-Format", + "passwordRequired": "Passwort ist erforderlich", + "loginFailed": "Anmeldung fehlgeschlagen. Bitte überprüfen Sie Ihre Anmeldedaten." }, "notifications": { - "loginSuccess": "DE: Login successful" + "loginSuccess": "Anmeldung erfolgreich" } }, "listsPage": { - "retryButton": "DE: Retry", + "retryButton": "Erneut versuchen", "emptyState": { - "noListsForGroup": "DE: No lists found for this group.", - "noListsYet": "DE: You have no lists yet.", - "personalGlobalInfo": "DE: Create a personal list or join a group to see shared lists.", - "groupSpecificInfo": "DE: This group doesn't have any lists yet." + "noListsForGroup": "Keine Listen für diese Gruppe gefunden.", + "noListsYet": "Sie haben noch keine Listen.", + "personalGlobalInfo": "Erstellen Sie eine persönliche Liste oder treten Sie einer Gruppe bei, um geteilte Listen zu sehen.", + "groupSpecificInfo": "Diese Gruppe hat noch keine Listen." }, - "createNewListButton": "DE: Create New List", - "loadingLists": "DE: Loading lists...", - "noDescription": "DE: No description", - "addItemPlaceholder": "DE: Add new item...", + "createNewListButton": "Neue Liste erstellen", + "loadingLists": "Listen werden geladen...", + "noDescription": "Keine Beschreibung", + "addItemPlaceholder": "Neues Element hinzufügen...", "createCard": { - "title": "DE: + Create a new list" + "title": "+ Liste" }, "pageTitle": { - "forGroup": "DE: Lists for {groupName}", - "forGroupId": "DE: Lists for Group {groupId}", - "myLists": "DE: My Lists" + "forGroup": "Listen für {groupName}", + "forGroupId": "Listen für Gruppe {groupId}", + "myLists": "Meine Listen" }, "errors": { - "fetchFailed": "DE: Failed to fetch lists." + "fetchFailed": "Abrufen der Listen fehlgeschlagen." } }, "groupsPage": { - "retryButton": "DE: Retry", + "retryButton": "Erneut versuchen", "emptyState": { - "title": "DE: No Groups Yet!", - "description": "DE: You are not a member of any groups yet. Create one or join using an invite code.", - "createButton": "DE: Create New Group" + "title": "Noch keine Gruppen!", + "description": "Sie sind noch kein Mitglied einer Gruppe. Erstellen Sie eine oder treten Sie mit einem Einladungscode bei.", + "createButton": "Neue Gruppe erstellen" }, "groupCard": { - "newListButton": "DE: List" + "newListButton": "Liste" }, "createCard": { - "title": "DE: + Group" + "title": "+ Gruppe" }, "joinGroup": { - "title": "DE: Join a Group with Invite Code", - "inputLabel": "DE: Enter Invite Code", - "inputPlaceholder": "DE: Enter Invite Code", - "joinButton": "DE: Join" + "title": "Gruppe mit Einladungscode beitreten", + "inputLabel": "Einladungscode eingeben", + "inputPlaceholder": "Einladungscode eingeben", + "joinButton": "Beitreten" }, "createDialog": { - "title": "DE: Create New Group", - "closeButtonLabel": "DE: Close", - "groupNameLabel": "DE: Group Name", - "cancelButton": "DE: Cancel", - "createButton": "DE: Create" + "title": "Neue Gruppe erstellen", + "closeButtonLabel": "Schließen", + "groupNameLabel": "Gruppenname", + "cancelButton": "Abbrechen", + "createButton": "Erstellen" }, "errors": { - "fetchFailed": "DE: Failed to load groups", - "groupNameRequired": "DE: Group name is required", - "createFailed": "DE: Failed to create group. Please try again.", - "inviteCodeRequired": "DE: Invite code is required", - "joinFailed": "DE: Failed to join group. Please check the invite code and try again.", - "invalidDataFromServer": "[TRANSLATE] Invalid data received from server.", - "createFailedConsole": "[TRANSLATE] Error creating group:", - "joinFailedConsole": "[TRANSLATE] Error joining group:" + "fetchFailed": "Laden der Gruppen fehlgeschlagen", + "groupNameRequired": "Gruppenname ist erforderlich", + "createFailed": "Erstellen der Gruppe fehlgeschlagen. Bitte versuchen Sie es erneut.", + "inviteCodeRequired": "Einladungscode ist erforderlich", + "joinFailed": "Beitritt zur Gruppe fehlgeschlagen. Bitte überprüfen Sie den Einladungscode und versuchen Sie es erneut.", + "invalidDataFromServer": "Ungültige Daten vom Server empfangen.", + "createFailedConsole": "Fehler beim Erstellen der Gruppe:", + "joinFailedConsole": "Fehler beim Beitreten zur Gruppe:" }, "notifications": { - "groupCreatedSuccess": "DE: Group '{groupName}' created successfully.", - "joinSuccessNamed": "DE: Successfully joined group '{groupName}'.", - "joinSuccessGeneric": "DE: Successfully joined group.", - "listCreatedSuccess": "DE: List '{listName}' created successfully." + "groupCreatedSuccess": "Gruppe '{groupName}' erfolgreich erstellt.", + "joinSuccessNamed": "Erfolgreich der Gruppe '{groupName}' beigetreten.", + "joinSuccessGeneric": "Erfolgreich der Gruppe beigetreten.", + "listCreatedSuccess": "Liste '{listName}' erfolgreich erstellt." } }, "authCallbackPage": { - "redirecting": "DE: Redirecting...", + "redirecting": "Weiterleitung...", "errors": { - "authenticationFailed": "DE: Authentication failed", - "noTokenProvided": "[TRANSLATE] No token provided" + "authenticationFailed": "Authentifizierung fehlgeschlagen", + "noTokenProvided": "Kein Token bereitgestellt" } }, "choresPage": { - "title": "DE: Chores", + "title": "Aufgaben", "tabs": { - "overdue": "DE: Overdue", - "today": "DE: Today", - "upcoming": "DE: Upcoming", - "allPending": "DE: All Pending", - "completed": "DE: Completed" + "overdue": "Überfällig", + "today": "Heute", + "upcoming": "Anstehend", + "allPending": "Alle ausstehenden", + "completed": "Abgeschlossen" }, "viewToggle": { - "calendarLabel": "DE: Calendar View", - "calendarText": "DE: Calendar", - "listLabel": "DE: List View", - "listText": "DE: List" + "calendarLabel": "Kalenderansicht", + "calendarText": "Kalender", + "listLabel": "Listenansicht", + "listText": "Liste" }, - "newChoreButtonLabel": "DE: New Chore", - "newChoreButtonText": "DE: New Chore", + "newChoreButtonLabel": "Neue Aufgabe", + "newChoreButtonText": "Neue Aufgabe", "loadingState": { - "loadingChores": "DE: Loading chores..." + "loadingChores": "Aufgaben werden geladen..." }, "calendar": { - "prevMonthLabel": "DE: Previous month", - "nextMonthLabel": "DE: Next month", + "prevMonthLabel": "Vorheriger Monat", + "nextMonthLabel": "Nächster Monat", "weekdays": { - "sun": "DE: Sun", - "mon": "DE: Mon", - "tue": "DE: Tue", - "wed": "DE: Wed", - "thu": "DE: Thu", - "fri": "DE: Fri", - "sat": "DE: Sat" + "sun": "So", + "mon": "Mo", + "tue": "Di", + "wed": "Mi", + "thu": "Do", + "fri": "Fr", + "sat": "Sa" }, - "addChoreToDayLabel": "DE: Add chore to this day", - "emptyState": "DE: No chores to display for this period." + "addChoreToDayLabel": "Aufgabe zu diesem Tag hinzufügen", + "emptyState": "Keine Aufgaben für diesen Zeitraum anzuzeigen." }, "listView": { - "choreTypePersonal": "DE: Personal", - "choreTypeGroupFallback": "DE: Group", - "completedDatePrefix": "DE: Completed:", + "choreTypePersonal": "Persönlich", + "choreTypeGroupFallback": "Gruppe", + "completedDatePrefix": "Abgeschlossen:", "actions": { - "doneTitle": "DE: Mark as Done", - "doneText": "DE: Done", - "undoTitle": "DE: Mark as Not Done", - "undoText": "DE: Undo", - "editTitle": "DE: Edit", - "editLabel": "DE: Edit chore", - "editText": "DE: Edit", - "deleteTitle": "DE: Delete", - "deleteLabel": "DE: Delete chore", - "deleteText": "DE: Delete" + "doneTitle": "Als erledigt markieren", + "doneText": "Erledigt", + "undoTitle": "Als nicht erledigt markieren", + "undoText": "Rückgängig", + "editTitle": "Bearbeiten", + "editLabel": "Aufgabe bearbeiten", + "editText": "Bearbeiten", + "deleteTitle": "Löschen", + "deleteLabel": "Aufgabe löschen", + "deleteText": "Löschen" }, "emptyState": { - "message": "DE: No chores in this view. Well done!", - "viewAllButton": "DE: View All Pending" + "message": "Keine Aufgaben in dieser Ansicht. Gut gemacht!", + "viewAllButton": "Alle ausstehenden anzeigen" } }, "choreModal": { - "editTitle": "DE: Edit Chore", - "newTitle": "DE: New Chore", - "closeButtonLabel": "DE: Close modal", - "nameLabel": "DE: Name", - "namePlaceholder": "DE: Enter chore name", - "typeLabel": "DE: Type", - "typePersonal": "DE: Personal", - "typeGroup": "DE: Group", - "groupLabel": "DE: Group", - "groupSelectDefault": "DE: Select a group", - "descriptionLabel": "DE: Description", - "descriptionPlaceholder": "DE: Add a description (optional)", - "frequencyLabel": "DE: Frequency", - "intervalLabel": "DE: Interval (days)", - "intervalPlaceholder": "DE: e.g. 3", - "dueDateLabel": "DE: Due Date", - "quickDueDateToday": "DE: Today", - "quickDueDateTomorrow": "DE: Tomorrow", - "quickDueDateNextWeek": "DE: Next Week", - "cancelButton": "DE: Cancel", - "saveButton": "DE: Save", - "intervalPlaceholder": "[TRANSLATE] e.g., 10" + "editTitle": "Aufgabe bearbeiten", + "newTitle": "Neue Aufgabe", + "closeButtonLabel": "Modal schließen", + "nameLabel": "Name", + "namePlaceholder": "Aufgabennamen eingeben", + "typeLabel": "Typ", + "typePersonal": "Persönlich", + "typeGroup": "Gruppe", + "groupLabel": "Gruppe", + "groupSelectDefault": "Gruppe auswählen", + "descriptionLabel": "Beschreibung", + "descriptionPlaceholder": "Beschreibung hinzufügen (optional)", + "frequencyLabel": "Häufigkeit", + "intervalLabel": "Intervall (Tage)", + "intervalPlaceholder": "z.B. 10", + "dueDateLabel": "Fälligkeitsdatum", + "quickDueDateToday": "Heute", + "quickDueDateTomorrow": "Morgen", + "quickDueDateNextWeek": "Nächste Woche", + "cancelButton": "Abbrechen", + "saveButton": "Speichern" }, "consoleErrors": { - "loadFailed": "[TRANSLATE] Failed to load all chores:", - "loadGroupsFailed": "[TRANSLATE] Failed to load groups", - "createAssignmentForNewChoreFailed": "[TRANSLATE] Failed to create assignment for new chore:", - "saveFailed": "[TRANSLATE] Failed to save chore:", - "deleteFailed": "[TRANSLATE] Failed to delete chore:", - "createAssignmentFailed": "[TRANSLATE] Failed to create assignment:", - "updateCompletionStatusFailed": "[TRANSLATE] Failed to update chore completion status:" + "loadFailed": "Laden aller Aufgaben fehlgeschlagen:", + "loadGroupsFailed": "Laden der Gruppen fehlgeschlagen", + "createAssignmentForNewChoreFailed": "Zuweisung für neue Aufgabe konnte nicht erstellt werden:", + "saveFailed": "Speichern der Aufgabe fehlgeschlagen:", + "deleteFailed": "Löschen der Aufgabe fehlgeschlagen:", + "createAssignmentFailed": "Zuweisung konnte nicht erstellt werden:", + "updateCompletionStatusFailed": "Abschlussstatus der Aufgabe konnte nicht aktualisiert werden:" }, "deleteDialog": { - "title": "DE: Delete Chore", - "confirmationText": "DE: Are you sure you want to delete this chore? This action cannot be undone.", - "deleteButton": "DE: Delete" + "title": "Aufgabe löschen", + "confirmationText": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "deleteButton": "Löschen" }, "shortcutsModal": { - "title": "DE: Keyboard Shortcuts", - "descNewChore": "DE: New Chore", - "descToggleView": "DE: Toggle View (List/Calendar)", - "descToggleShortcuts": "DE: Show/Hide Shortcuts", - "descCloseModal": "DE: Close any open Modal/Dialog" + "title": "Tastaturkürzel", + "descNewChore": "Neue Aufgabe", + "descToggleView": "Ansicht umschalten (Liste/Kalender)", + "descToggleShortcuts": "Kürzel anzeigen/ausblenden", + "descCloseModal": "Geöffnetes Modal/Dialog schließen" }, "frequencyOptions": { - "oneTime": "DE: One Time", - "daily": "DE: Daily", - "weekly": "DE: Weekly", - "monthly": "DE: Monthly", - "custom": "DE: Custom" + "oneTime": "Einmalig", + "daily": "Täglich", + "weekly": "Wöchentlich", + "monthly": "Monatlich", + "custom": "Benutzerdefiniert" + }, + "frequency": { + "customInterval": "Alle {n} Tag | Alle {n} Tage" }, "formatters": { - "noDueDate": "DE: No due date", - "dueToday": "DE: Due Today", - "dueTomorrow": "DE: Due Tomorrow", - "overdueFull": "DE: Overdue: {date}", - "dueFull": "DE: Due {date}", - "invalidDate": "DE: Invalid Date" + "noDueDate": "Kein Fälligkeitsdatum", + "dueToday": "Heute fällig", + "dueTomorrow": "Morgen fällig", + "overdueFull": "Überfällig: {date}", + "dueFull": "Fällig am {date}", + "invalidDate": "Ungültiges Datum" }, "notifications": { - "loadFailed": "DE: Failed to load chores", - "updateSuccess": "DE: Chore '{name}' updated successfully", - "createSuccess": "DE: Chore '{name}' created successfully", - "updateFailed": "DE: Failed to update chore", - "createFailed": "DE: Failed to create chore", - "deleteSuccess": "DE: Chore '{name}' deleted successfully", - "deleteFailed": "DE: Failed to delete chore", - "markedDone": "DE: {name} marked as done.", - "markedNotDone": "DE: {name} marked as not done.", - "statusUpdateFailed": "DE: Failed to update chore status." + "loadFailed": "Laden der Aufgaben fehlgeschlagen.", + "loadGroupsFailed": "Laden der Gruppen fehlgeschlagen.", + "updateSuccess": "Aufgabe '{name}' erfolgreich aktualisiert.", + "createSuccess": "Aufgabe '{name}' erfolgreich erstellt.", + "updateFailed": "Aktualisieren der Aufgabe fehlgeschlagen.", + "createFailed": "Erstellen der Aufgabe fehlgeschlagen.", + "deleteSuccess": "Aufgabe '{name}' erfolgreich gelöscht.", + "deleteFailed": "Löschen der Aufgabe fehlgeschlagen.", + "markedDone": "{name} als erledigt markiert.", + "markedNotDone": "{name} als nicht erledigt markiert.", + "statusUpdateFailed": "Status der Aufgabe konnte nicht aktualisiert werden.", + "createAssignmentFailed": "Zuweisung für Aufgabe konnte nicht erstellt werden." }, "validation": { - "nameRequired": "DE: Chore name is required.", - "groupRequired": "DE: Please select a group for group chores.", - "intervalRequired": "DE: Custom interval must be at least 1 day.", - "dueDateRequired": "DE: Due date is required.", - "invalidDueDate": "DE: Invalid due date format." + "nameRequired": "Aufgabenname ist erforderlich.", + "groupRequired": "Bitte wählen Sie eine Gruppe für Gruppenaufgaben.", + "intervalRequired": "Benutzerdefiniertes Intervall muss mindestens 1 Tag betragen.", + "dueDateRequired": "Fälligkeitsdatum ist erforderlich.", + "invalidDueDate": "Ungültiges Fälligkeitsdatumformat." }, - "unsavedChangesConfirmation": "DE: You have unsaved changes in the chore form. Are you sure you want to leave?" + "unsavedChangesConfirmation": "Sie haben ungespeicherte Änderungen im Aufgabenformular. Sind Sie sicher, dass Sie die Seite verlassen möchten?" }, "errorNotFoundPage": { - "errorCode": "DE: 404", - "errorMessage": "DE: Oops. Nothing here...", - "goHomeButton": "DE: Go Home" + "errorCode": "404", + "errorMessage": "Upps. Hier gibt es nichts...", + "goHomeButton": "Zur Startseite" }, "groupDetailPage": { - "loadingLabel": "DE: Loading group details...", - "retryButton": "DE: Retry", - "groupNotFound": "DE: Group not found or an error occurred.", + "loadingLabel": "Gruppendetails werden geladen...", + "retryButton": "Erneut versuchen", + "groupNotFound": "Gruppe nicht gefunden oder ein Fehler ist aufgetreten.", "members": { - "title": "DE: Group Members", - "defaultRole": "DE: Member", - "removeButton": "DE: Remove", - "emptyState": "DE: No members found.", - "closeMenuLabel": "[TRANSLATE] Close menu" + "title": "Gruppenmitglieder", + "defaultRole": "Mitglied", + "removeButton": "Entfernen", + "emptyState": "Keine Mitglieder gefunden.", + "closeMenuLabel": "Menü schließen" }, "invites": { - "title": "DE: Invite Members", - "description": "[TRANSLATE] Invite new members by generating a shareable code.", - "addMemberButtonLabel": "[TRANSLATE] Add member", - "closeInviteLabel": "[TRANSLATE] Close invite", - "regenerateButton": "DE: Regenerate Invite Code", - "generateButton": "DE: Generate Invite Code", - "activeCodeLabel": "DE: Current Active Invite Code:", - "copyButtonLabel": "DE: Copy invite code", - "copySuccess": "DE: Invite code copied to clipboard!", - "emptyState": "DE: No active invite code. Click the button above to generate one.", + "title": "Mitglieder einladen", + "description": "Laden Sie neue Mitglieder ein, indem Sie einen teilbaren Code generieren.", + "addMemberButtonLabel": "Mitglied hinzufügen", + "closeInviteLabel": "Einladung schließen", + "regenerateButton": "Einladungscode neu generieren", + "generateButton": "Einladungscode generieren", + "activeCodeLabel": "Aktueller aktiver Einladungscode:", + "copyButtonLabel": "Einladungscode kopieren", + "copySuccess": "Einladungscode in die Zwischenablage kopiert!", + "emptyState": "Kein aktiver Einladungscode. Klicken Sie auf die Schaltfläche oben, um einen zu generieren.", "errors": { - "newDataInvalid": "DE: New invite code data is invalid." + "newDataInvalid": "Daten des neuen Einladungscodes sind ungültig." } }, "errors": { - "failedToFetchActiveInvite": "[TRANSLATE] Failed to fetch active invite code.", - "failedToFetchGroupDetails": "[TRANSLATE] Failed to fetch group details.", - "failedToLoadUpcomingChores": "[TRANSLATE] Error loading upcoming chores:", - "failedToLoadRecentExpenses": "[TRANSLATE] Error loading recent expenses:" + "failedToFetchActiveInvite": "Abrufen des aktiven Einladungscodes fehlgeschlagen.", + "failedToFetchGroupDetails": "Abrufen der Gruppendetails fehlgeschlagen.", + "failedToLoadUpcomingChores": "Fehler beim Laden anstehender Aufgaben:", + "failedToLoadRecentExpenses": "Fehler beim Laden der letzten Ausgaben:" }, "console": { - "noActiveInvite": "[TRANSLATE] No active invite code found for this group." + "noActiveInvite": "Kein aktiver Einladungscode für diese Gruppe gefunden." }, "chores": { - "title": "DE: Group Chores", - "manageButton": "DE: Manage Chores", - "duePrefix": "DE: Due:", - "emptyState": "DE: No chores scheduled. Click \"Manage Chores\" to create some!" + "title": "Gruppenaufgaben", + "manageButton": "Aufgaben verwalten", + "duePrefix": "Fällig:", + "emptyState": "Keine Aufgaben geplant. Klicken Sie auf \"Aufgaben verwalten\", um welche zu erstellen!" }, "expenses": { - "title": "DE: Group Expenses", - "manageButton": "DE: Manage Expenses", - "emptyState": "DE: No expenses recorded. Click \"Manage Expenses\" to add some!", - "fallbackUserName": "[TRANSLATE] User ID: {userId}", - "activityByUserFallback": "[TRANSLATE] User {userId}", + "title": "Gruppenausgaben", + "manageButton": "Ausgaben verwalten", + "emptyState": "Keine Ausgaben erfasst. Klicken Sie auf \"Ausgaben verwalten\", um welche hinzuzufügen!", + "paidBy": "Bezahlt von:", + "owes": "schuldet", + "paidAmount": "Bezahlt:", + "onDate": "am", + "settleShareButton": "Meinen Anteil begleichen", + "activityLabel": "Aktivität:", + "byUser": "von", + "fallbackUserName": "Benutzer-ID: {userId}", + "activityByUserFallback": "Benutzer {userId}", "splitTypes": { - "equal": "DE: Equal", - "exactAmounts": "DE: Exact Amounts", - "percentage": "DE: Percentage", - "shares": "DE: Shares", - "itemBased": "DE: Item Based" + "equal": "Gleichmäßig", + "exactAmounts": "Genaue Beträge", + "percentage": "Prozentual", + "shares": "Anteile", + "itemBased": "Artikelbasiert" } }, "notifications": { - "fetchDetailsFailed": "DE: Failed to fetch group details.", - "fetchInviteFailed": "DE: Failed to fetch active invite code.", - "generateInviteSuccess": "DE: New invite code generated successfully!", - "generateInviteError": "DE: Failed to generate invite code.", - "clipboardNotSupported": "DE: Clipboard not supported or no code to copy.", - "copyInviteFailed": "DE: Failed to copy invite code.", - "removeMemberSuccess": "DE: Member removed successfully", - "removeMemberFailed": "DE: Failed to remove member" + "fetchDetailsFailed": "Abrufen der Gruppendetails fehlgeschlagen.", + "fetchInviteFailed": "Abrufen des aktiven Einladungscodes fehlgeschlagen.", + "generateInviteSuccess": "Neuer Einladungscode erfolgreich generiert!", + "generateInviteError": "Generieren des Einladungscodes fehlgeschlagen.", + "clipboardNotSupported": "Zwischenablage nicht unterstützt oder kein Code zum Kopieren vorhanden.", + "copyInviteFailed": "Kopieren des Einladungscodes fehlgeschlagen.", + "removeMemberSuccess": "Mitglied erfolgreich entfernt", + "removeMemberFailed": "Entfernen des Mitglieds fehlgeschlagen", + "loadExpensesFailed": "Laden der letzten Ausgaben fehlgeschlagen.", + "cannotSettleOthersShares": "Sie können nur Ihre eigenen Anteile begleichen.", + "settlementDataMissing": "Abrechnung kann nicht verarbeitet werden: fehlende Daten.", + "settleShareSuccess": "Anteil erfolgreich beglichen!", + "settleShareFailed": "Begleichen des Anteils fehlgeschlagen." + }, + "loading": { + "settlement": "Abrechnung wird verarbeitet..." + }, + "settleShareModal": { + "title": "Anteil begleichen", + "settleAmountFor": "Betrag für {userName} begleichen:", + "amountLabel": "Betrag", + "cancelButton": "Abbrechen", + "confirmButton": "Bestätigen", + "errors": { + "enterAmount": "Bitte geben Sie einen Betrag ein.", + "positiveAmount": "Bitte geben Sie einen positiven Betrag ein.", + "exceedsRemaining": "Betrag darf den Restbetrag nicht überschreiten: {amount}.", + "noSplitSelected": "Fehler: Keine Aufteilung ausgewählt." + } + }, + "status": { + "settled": "Beglichen", + "partiallySettled": "Teilweise beglichen", + "unsettled": "Unbeglichen", + "paid": "Bezahlt", + "partiallyPaid": "Teilweise bezahlt", + "unpaid": "Unbezahlt", + "unknown": "Unbekannter Status" } }, "accountPage": { - "title": "Account Settings", - "loadingProfile": "Loading profile...", - "retryButton": "Retry", + "title": "Kontoeinstellungen", + "loadingProfile": "Profil wird geladen...", + "retryButton": "Erneut versuchen", "profileSection": { - "header": "Profile Information", + "header": "Profilinformationen", "nameLabel": "Name", - "emailLabel": "Email", - "saveButton": "Save Changes" + "emailLabel": "E-Mail", + "saveButton": "Änderungen speichern" }, "passwordSection": { - "header": "Change Password", - "currentPasswordLabel": "Current Password", - "newPasswordLabel": "New Password", - "changeButton": "Change Password" + "header": "Passwort ändern", + "currentPasswordLabel": "Aktuelles Passwort", + "newPasswordLabel": "Neues Passwort", + "changeButton": "Passwort ändern" }, "notificationsSection": { - "header": "Notification Preferences", - "emailNotificationsLabel": "Email Notifications", - "emailNotificationsDescription": "Receive email notifications for important updates", - "listUpdatesLabel": "List Updates", - "listUpdatesDescription": "Get notified when lists are updated", - "groupActivitiesLabel": "Group Activities", - "groupActivitiesDescription": "Receive notifications for group activities" + "header": "Benachrichtigungseinstellungen", + "emailNotificationsLabel": "E-Mail-Benachrichtigungen", + "emailNotificationsDescription": "E-Mail-Benachrichtigungen für wichtige Updates erhalten", + "listUpdatesLabel": "Listen-Updates", + "listUpdatesDescription": "Benachrichtigungen erhalten, wenn Listen aktualisiert werden", + "groupActivitiesLabel": "Gruppenaktivitäten", + "groupActivitiesDescription": "Benachrichtigungen für Gruppenaktivitäten erhalten" }, "notifications": { - "profileLoadFailed": "Failed to load profile", - "profileUpdateSuccess": "Profile updated successfully", - "profileUpdateFailed": "Failed to update profile", - "passwordFieldsRequired": "Please fill in both current and new password fields.", - "passwordTooShort": "New password must be at least 8 characters long.", - "passwordChangeSuccess": "Password changed successfully", - "passwordChangeFailed": "Failed to change password", - "preferencesUpdateSuccess": "Preferences updated successfully", - "preferencesUpdateFailed": "Failed to update preferences" + "profileLoadFailed": "Laden des Profils fehlgeschlagen", + "profileUpdateSuccess": "Profil erfolgreich aktualisiert", + "profileUpdateFailed": "Aktualisieren des Profils fehlgeschlagen", + "passwordFieldsRequired": "Bitte füllen Sie sowohl das aktuelle als auch das neue Passwortfeld aus.", + "passwordTooShort": "Neues Passwort muss mindestens 8 Zeichen lang sein.", + "passwordChangeSuccess": "Passwort erfolgreich geändert", + "passwordChangeFailed": "Ändern des Passworts fehlgeschlagen", + "preferencesUpdateSuccess": "Einstellungen erfolgreich aktualisiert", + "preferencesUpdateFailed": "Aktualisieren der Einstellungen fehlgeschlagen" }, - "saving": "Saving..." + "saving": "Speichern..." }, "signupPage": { - "header": "Sign Up", - "fullNameLabel": "Full Name", - "emailLabel": "Email", - "passwordLabel": "Password", - "confirmPasswordLabel": "Confirm Password", - "togglePasswordVisibility": "Toggle password visibility", - "submitButton": "Sign Up", - "loginLink": "Already have an account? Login", + "header": "Registrieren", + "fullNameLabel": "Vollständiger Name", + "emailLabel": "E-Mail", + "passwordLabel": "Passwort", + "confirmPasswordLabel": "Passwort bestätigen", + "togglePasswordVisibility": "Passwort-Sichtbarkeit umschalten", + "submitButton": "Registrieren", + "loginLink": "Bereits ein Konto? Anmelden", "validation": { - "nameRequired": "Name is required", - "emailRequired": "Email is required", - "emailInvalid": "Invalid email format", - "passwordRequired": "Password is required", - "passwordLength": "Password must be at least 8 characters", - "confirmPasswordRequired": "Please confirm your password", - "passwordsNoMatch": "Passwords do not match" + "nameRequired": "Name ist erforderlich", + "emailRequired": "E-Mail ist erforderlich", + "emailInvalid": "Ungültiges E-Mail-Format", + "passwordRequired": "Passwort ist erforderlich", + "passwordLength": "Passwort muss mindestens 8 Zeichen lang sein", + "confirmPasswordRequired": "Bitte bestätigen Sie Ihr Passwort", + "passwordsNoMatch": "Passwörter stimmen nicht überein" }, "notifications": { - "signupFailed": "Signup failed. Please try again.", - "signupSuccess": "Account created successfully. Please login." + "signupFailed": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut.", + "signupSuccess": "Konto erfolgreich erstellt. Bitte anmelden." } }, "listDetailPage": { "loading": { - "list": "Loading list...", - "items": "Loading items...", - "ocrProcessing": "Processing image...", - "addingOcrItems": "Adding OCR items...", - "costSummary": "Loading summary...", - "expenses": "Loading expenses...", - "settlement": "Processing settlement..." + "list": "Liste wird geladen...", + "items": "Elemente werden geladen...", + "ocrProcessing": "Bild wird verarbeitet...", + "addingOcrItems": "OCR-Elemente werden hinzugefügt...", + "costSummary": "Zusammenfassung wird geladen...", + "expenses": "Ausgaben werden geladen...", + "settlement": "Abrechnung wird verarbeitet..." }, "errors": { - "fetchFailed": "Failed to load list details.", - "genericLoadFailure": "Group not found or an error occurred.", - "ocrNoItems": "No items extracted from the image.", - "ocrFailed": "Failed to process image.", - "addItemFailed": "Failed to add item.", - "updateItemFailed": "Failed to update item.", - "updateItemPriceFailed": "Failed to update item price.", - "deleteItemFailed": "Failed to delete item.", - "addOcrItemsFailed": "Failed to add OCR items.", - "fetchItemsFailed": "Failed to load items: {errorMessage}", - "loadCostSummaryFailed": "Failed to load cost summary." + "fetchFailed": "Laden der Listendetails fehlgeschlagen.", + "genericLoadFailure": "Gruppe nicht gefunden oder ein Fehler ist aufgetreten.", + "ocrNoItems": "Keine Elemente aus dem Bild extrahiert.", + "ocrFailed": "Verarbeitung des Bildes fehlgeschlagen.", + "addItemFailed": "Hinzufügen des Elements fehlgeschlagen.", + "updateItemFailed": "Aktualisieren des Elements fehlgeschlagen.", + "updateItemPriceFailed": "Aktualisieren des Elementpreises fehlgeschlagen.", + "deleteItemFailed": "Löschen des Elements fehlgeschlagen.", + "addOcrItemsFailed": "Hinzufügen der OCR-Elemente fehlgeschlagen.", + "fetchItemsFailed": "Laden der Elemente fehlgeschlagen: {errorMessage}", + "loadCostSummaryFailed": "Laden der Kostenzusammenfassung fehlgeschlagen." }, - "retryButton": "Retry", + "retryButton": "Erneut versuchen", "buttons": { - "addViaOcr": "Add via OCR", - "addItem": "Add", - "addItems": "Add Items", - "cancel": "Cancel", - "confirm": "Confirm", - "saveChanges": "Save Changes", - "close": "Close", - "costSummary": "Cost Summary" + "addViaOcr": "Über OCR hinzufügen", + "addItem": "Hinzufügen", + "addItems": "Elemente hinzufügen", + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "saveChanges": "Änderungen speichern", + "close": "Schließen", + "costSummary": "Kostenzusammenfassung" }, "badges": { - "groupList": "Group List", - "personalList": "Personal List" + "groupList": "Gruppenliste", + "personalList": "Persönliche Liste" }, "items": { "emptyState": { - "title": "No Items Yet!", - "message": "Add some items using the form below." + "title": "Noch keine Elemente!", + "message": "Fügen Sie einige Elemente über das Formular unten hinzu." }, "addItemForm": { - "placeholder": "Add a new item", - "quantityPlaceholder": "Qty", - "itemNameSrLabel": "New item name", - "quantitySrLabel": "Quantity" + "placeholder": "Neues Element hinzufügen", + "quantityPlaceholder": "Menge", + "itemNameSrLabel": "Name des neuen Elements", + "quantitySrLabel": "Menge" }, - "pricePlaceholder": "Price", - "editItemAriaLabel": "Edit item", - "deleteItemAriaLabel": "Delete item" + "pricePlaceholder": "Preis", + "editItemAriaLabel": "Element bearbeiten", + "deleteItemAriaLabel": "Element löschen" }, "modals": { "ocr": { - "title": "Add Items via OCR", - "uploadLabel": "Upload Image" + "title": "Elemente über OCR hinzufügen", + "uploadLabel": "Bild hochladen" }, "confirmation": { - "title": "Confirmation" + "title": "Bestätigung" }, "editItem": { - "title": "Edit Item", - "nameLabel": "Item Name", - "quantityLabel": "Quantity" + "title": "Element bearbeiten", + "nameLabel": "Elementname", + "quantityLabel": "Menge" }, "costSummary": { - "title": "List Cost Summary", - "totalCostLabel": "Total List Cost:", - "equalShareLabel": "Equal Share Per User:", - "participantsLabel": "Participating Users:", - "userBalancesHeader": "User Balances", + "title": "Listenkostenzusammenfassung", + "totalCostLabel": "Gesamtkosten der Liste:", + "equalShareLabel": "Gleicher Anteil pro Benutzer:", + "participantsLabel": "Teilnehmende Benutzer:", + "userBalancesHeader": "Benutzersalden", "tableHeaders": { - "user": "User", - "itemsAddedValue": "Items Added Value", - "amountDue": "Amount Due", - "balance": "Balance" + "user": "Benutzer", + "itemsAddedValue": "Wert der hinzugefügten Elemente", + "amountDue": "Fälliger Betrag", + "balance": "Saldo" }, - "emptyState": "No cost summary available." + "emptyState": "Keine Kostenzusammenfassung verfügbar." }, "settleShare": { - "title": "Settle Share", - "settleAmountFor": "Settle amount for {userName}:", - "amountLabel": "Amount", + "title": "Anteil begleichen", + "settleAmountFor": "Betrag für {userName} begleichen:", + "amountLabel": "Betrag", "errors": { - "enterAmount": "Please enter an amount.", - "positiveAmount": "Please enter a positive amount.", - "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", - "noSplitSelected": "Error: No split selected." + "enterAmount": "Bitte geben Sie einen Betrag ein.", + "positiveAmount": "Bitte geben Sie einen positiven Betrag ein.", + "exceedsRemaining": "Betrag darf den Restbetrag nicht überschreiten: {amount}.", + "noSplitSelected": "Fehler: Keine Aufteilung ausgewählt." } } }, "confirmations": { - "updateMessage": "Mark '{itemName}' as {status}?", - "statusComplete": "complete", - "statusIncomplete": "incomplete", - "deleteMessage": "Delete '{itemName}'? This cannot be undone." + "updateMessage": "'{itemName}' als {status} markieren?", + "statusComplete": "abgeschlossen", + "statusIncomplete": "unvollständig", + "deleteMessage": "'{itemName}' löschen? Dies kann nicht rückgängig gemacht werden." }, "notifications": { - "itemAddedSuccess": "Item added successfully.", - "itemsAddedSuccessOcr": "{count} item(s) added successfully from OCR.", - "itemUpdatedSuccess": "Item updated successfully.", - "itemDeleteSuccess": "Item deleted successfully.", - "enterItemName": "Please enter an item name.", - "costSummaryLoadFailed": "Failed to load cost summary.", - "cannotSettleOthersShares": "You can only settle your own shares.", - "settlementDataMissing": "Cannot process settlement: missing data.", - "settleShareSuccess": "Share settled successfully!", - "settleShareFailed": "Failed to settle share." + "itemAddedSuccess": "Element erfolgreich hinzugefügt.", + "itemsAddedSuccessOcr": "{count} Element(e) erfolgreich über OCR hinzugefügt.", + "itemUpdatedSuccess": "Element erfolgreich aktualisiert.", + "itemDeleteSuccess": "Element erfolgreich gelöscht.", + "enterItemName": "Bitte geben Sie einen Elementnamen ein.", + "costSummaryLoadFailed": "Laden der Kostenzusammenfassung fehlgeschlagen.", + "cannotSettleOthersShares": "Sie können nur Ihre eigenen Anteile begleichen.", + "settlementDataMissing": "Abrechnung kann nicht verarbeitet werden: fehlende Daten.", + "settleShareSuccess": "Anteil erfolgreich beglichen!", + "settleShareFailed": "Begleichen des Anteils fehlgeschlagen." }, "expensesSection": { - "title": "Expenses", - "addExpenseButton": "Add Expense", - "loading": "Loading expenses...", - "emptyState": "No expenses recorded for this list yet.", - "paidBy": "Paid by:", - "onDate": "on", - "owes": "owes", - "paidAmount": "Paid:", - "activityLabel": "Activity:", - "byUser": "by", - "settleShareButton": "Settle My Share", - "retryButton": "Retry" + "title": "Ausgaben", + "addExpenseButton": "Ausgabe hinzufügen", + "loading": "Ausgaben werden geladen...", + "emptyState": "Noch keine Ausgaben für diese Liste erfasst.", + "paidBy": "Bezahlt von:", + "onDate": "am", + "owes": "schuldet", + "paidAmount": "Bezahlt:", + "activityLabel": "Aktivität:", + "byUser": "von", + "settleShareButton": "Meinen Anteil begleichen", + "retryButton": "Erneut versuchen" }, "status": { - "settled": "Settled", - "partiallySettled": "Partially Settled", - "unsettled": "Unsettled", - "paid": "Paid", - "partiallyPaid": "Partially Paid", - "unpaid": "Unpaid", - "unknown": "Unknown Status" + "settled": "Beglichen", + "partiallySettled": "Teilweise beglichen", + "unsettled": "Unbeglichen", + "paid": "Bezahlt", + "partiallyPaid": "Teilweise bezahlt", + "unpaid": "Unbezahlt", + "unknown": "Unbekannter Status" } }, "myChoresPage": { - "title": "My Assigned Chores", - "showCompletedToggle": "Show Completed", + "title": "Meine zugewiesenen Aufgaben", + "showCompletedToggle": "Abgeschlossene anzeigen", "timelineHeaders": { - "overdue": "Overdue", - "today": "Due Today", - "thisWeek": "This Week", - "later": "Later", - "completed": "Completed" + "overdue": "Überfällig", + "today": "Heute fällig", + "thisWeek": "Diese Woche", + "later": "Später", + "completed": "Abgeschlossen" }, "choreCard": { - "personal": "Personal", - "group": "Group", - "duePrefix": "Due", - "completedPrefix": "Completed", - "dueToday": "Due Today", - "markCompleteButton": "Mark Complete" + "personal": "Persönlich", + "group": "Gruppe", + "duePrefix": "Fällig", + "completedPrefix": "Abgeschlossen", + "dueToday": "Heute fällig", + "markCompleteButton": "Als erledigt markieren" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Einmalig", + "daily": "Täglich", + "weekly": "Wöchentlich", + "monthly": "Monatlich", + "custom": "Benutzerdefiniert", + "unknown": "Unbekannte Häufigkeit" }, "dates": { - "invalidDate": "Invalid Date", - "unknownDate": "Unknown Date" + "invalidDate": "Ungültiges Datum", + "unknownDate": "Unbekanntes Datum" }, "emptyState": { - "title": "No Assignments Yet!", - "noAssignmentsPending": "You have no pending chore assignments.", - "noAssignmentsAll": "You have no chore assignments (completed or pending).", - "viewAllChoresButton": "View All Chores" + "title": "Noch keine Zuweisungen!", + "noAssignmentsPending": "Sie haben keine ausstehenden Aufgabenzuweisungen.", + "noAssignmentsAll": "Sie haben keine Aufgabenzuweisungen (abgeschlossen oder ausstehend).", + "viewAllChoresButton": "Alle Aufgaben anzeigen" }, "notifications": { - "loadFailed": "Failed to load assignments", - "markedComplete": "Marked \"{choreName}\" as complete!", - "markCompleteFailed": "Failed to mark assignment as complete" + "loadFailed": "Laden der Zuweisungen fehlgeschlagen", + "markedComplete": "\"{choreName}\" als erledigt markiert!", + "markCompleteFailed": "Markieren der Zuweisung als erledigt fehlgeschlagen" } }, "personalChoresPage": { - "title": "Personal Chores", - "newChoreButton": "New Chore", - "editButton": "Edit", - "deleteButton": "Delete", - "cancelButton": "Cancel", - "saveButton": "Save", + "title": "Persönliche Aufgaben", + "newChoreButton": "Neue Aufgabe", + "editButton": "Bearbeiten", + "deleteButton": "Löschen", + "cancelButton": "Abbrechen", + "saveButton": "Speichern", "modals": { - "editChoreTitle": "Edit Chore", - "newChoreTitle": "New Chore", - "deleteChoreTitle": "Delete Chore" + "editChoreTitle": "Aufgabe bearbeiten", + "newChoreTitle": "Neue Aufgabe", + "deleteChoreTitle": "Aufgabe löschen" }, "form": { "nameLabel": "Name", - "descriptionLabel": "Description", - "frequencyLabel": "Frequency", - "intervalLabel": "Interval (days)", - "dueDateLabel": "Next Due Date" + "descriptionLabel": "Beschreibung", + "frequencyLabel": "Häufigkeit", + "intervalLabel": "Intervall (Tage)", + "dueDateLabel": "Nächstes Fälligkeitsdatum" }, "deleteDialog": { - "confirmationText": "Are you sure you want to delete this chore?" + "confirmationText": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten?" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Einmalig", + "daily": "Täglich", + "weekly": "Wöchentlich", + "monthly": "Monatlich", + "custom": "Benutzerdefiniert", + "unknown": "Unbekannte Häufigkeit" }, "dates": { - "invalidDate": "Invalid Date", - "duePrefix": "Due" + "invalidDate": "Ungültiges Datum", + "duePrefix": "Fällig" }, "notifications": { - "loadFailed": "Failed to load personal chores", - "updateSuccess": "Personal chore updated successfully", - "createSuccess": "Personal chore created successfully", - "saveFailed": "Failed to save personal chore", - "deleteSuccess": "Personal chore deleted successfully", - "deleteFailed": "Failed to delete personal chore" + "loadFailed": "Laden der persönlichen Aufgaben fehlgeschlagen", + "updateSuccess": "Persönliche Aufgabe erfolgreich aktualisiert", + "createSuccess": "Persönliche Aufgabe erfolgreich erstellt", + "saveFailed": "Speichern der persönlichen Aufgabe fehlgeschlagen", + "deleteSuccess": "Persönliche Aufgabe erfolgreich gelöscht", + "deleteFailed": "Löschen der persönlichen Aufgabe fehlgeschlagen" } }, "indexPage": { - "welcomeMessage": "Welcome to Valerie UI App", - "mainPageInfo": "This is the main index page.", - "sampleTodosHeader": "Sample Todos (from IndexPage data)", - "totalCountLabel": "Total count from meta:", - "noTodos": "No todos to display." + "welcomeMessage": "Willkommen bei der Valerie UI App", + "mainPageInfo": "Dies ist die Hauptindexseite.", + "sampleTodosHeader": "Beispiel-Todos (aus IndexPage-Daten)", + "totalCountLabel": "Gesamtzahl aus Meta:", + "noTodos": "Keine Todos zum Anzeigen." } -} +} \ No newline at end of file diff --git a/fe/src/i18n/es.json b/fe/src/i18n/es.json index 5560da0..d89c8d7 100644 --- a/fe/src/i18n/es.json +++ b/fe/src/i18n/es.json @@ -3,588 +3,629 @@ "hello": "Hola" }, "loginPage": { - "emailLabel": "ES: Email", - "passwordLabel": "ES: Password", - "togglePasswordVisibilityLabel": "ES: Toggle password visibility", - "loginButton": "ES: Login", - "signupLink": "ES: Don't have an account? Sign up", + "emailLabel": "Correo electrónico", + "passwordLabel": "Contraseña", + "togglePasswordVisibilityLabel": "Alternar visibilidad de contraseña", + "loginButton": "Iniciar sesión", + "signupLink": "¿No tienes una cuenta? Regístrate", "errors": { - "emailRequired": "ES: Email is required", - "emailInvalid": "ES: Invalid email format", - "passwordRequired": "ES: Password is required", - "loginFailed": "ES: Login failed. Please check your credentials." + "emailRequired": "El correo electrónico es obligatorio", + "emailInvalid": "Formato de correo electrónico inválido", + "passwordRequired": "La contraseña es obligatoria", + "loginFailed": "Inicio de sesión fallido. Por favor, comprueba tus credenciales." }, "notifications": { - "loginSuccess": "ES: Login successful" + "loginSuccess": "Inicio de sesión exitoso" } }, "listsPage": { - "retryButton": "ES: Retry", + "retryButton": "Reintentar", "emptyState": { - "noListsForGroup": "ES: No lists found for this group.", - "noListsYet": "ES: You have no lists yet.", - "personalGlobalInfo": "ES: Create a personal list or join a group to see shared lists.", - "groupSpecificInfo": "ES: This group doesn't have any lists yet." + "noListsForGroup": "No se encontraron listas para este grupo.", + "noListsYet": "Aún no tienes listas.", + "personalGlobalInfo": "Crea una lista personal o únete a un grupo para ver listas compartidas.", + "groupSpecificInfo": "Este grupo aún no tiene listas." }, - "createNewListButton": "ES: Create New List", - "loadingLists": "ES: Loading lists...", - "noDescription": "ES: No description", - "addItemPlaceholder": "ES: Add new item...", + "createNewListButton": "Crear nueva lista", + "loadingLists": "Cargando listas...", + "noDescription": "Sin descripción", + "addItemPlaceholder": "Añadir nuevo artículo...", "createCard": { - "title": "ES: + Create a new list" + "title": "+ Lista" }, "pageTitle": { - "forGroup": "ES: Lists for {groupName}", - "forGroupId": "ES: Lists for Group {groupId}", - "myLists": "ES: My Lists" + "forGroup": "Listas para {groupName}", + "forGroupId": "Listas para el Grupo {groupId}", + "myLists": "Mis Listas" }, "errors": { - "fetchFailed": "ES: Failed to fetch lists." + "fetchFailed": "Error al obtener las listas." } }, "groupsPage": { - "retryButton": "ES: Retry", + "retryButton": "Reintentar", "emptyState": { - "title": "ES: No Groups Yet!", - "description": "ES: You are not a member of any groups yet. Create one or join using an invite code.", - "createButton": "ES: Create New Group" + "title": "¡Aún no hay grupos!", + "description": "Aún no eres miembro de ningún grupo. Crea uno o únete usando un código de invitación.", + "createButton": "Crear nuevo grupo" }, "groupCard": { - "newListButton": "ES: List" + "newListButton": "Lista" }, "createCard": { - "title": "ES: + Group" + "title": "+ Grupo" }, "joinGroup": { - "title": "ES: Join a Group with Invite Code", - "inputLabel": "ES: Enter Invite Code", - "inputPlaceholder": "ES: Enter Invite Code", - "joinButton": "ES: Join" + "title": "Unirse a un grupo con código de invitación", + "inputLabel": "Ingresar código de invitación", + "inputPlaceholder": "Ingresar código de invitación", + "joinButton": "Unirse" }, "createDialog": { - "title": "ES: Create New Group", - "closeButtonLabel": "ES: Close", - "groupNameLabel": "ES: Group Name", - "cancelButton": "ES: Cancel", - "createButton": "ES: Create" + "title": "Crear nuevo grupo", + "closeButtonLabel": "Cerrar", + "groupNameLabel": "Nombre del grupo", + "cancelButton": "Cancelar", + "createButton": "Crear" }, "errors": { - "fetchFailed": "ES: Failed to load groups", - "groupNameRequired": "ES: Group name is required", - "createFailed": "ES: Failed to create group. Please try again.", - "inviteCodeRequired": "ES: Invite code is required", - "joinFailed": "ES: Failed to join group. Please check the invite code and try again.", - "invalidDataFromServer": "[TRANSLATE] Invalid data received from server.", - "createFailedConsole": "[TRANSLATE] Error creating group:", - "joinFailedConsole": "[TRANSLATE] Error joining group:" + "fetchFailed": "Error al cargar los grupos", + "groupNameRequired": "El nombre del grupo es obligatorio", + "createFailed": "Error al crear el grupo. Por favor, inténtalo de nuevo.", + "inviteCodeRequired": "El código de invitación es obligatorio", + "joinFailed": "Error al unirse al grupo. Por favor, comprueba el código de invitación e inténtalo de nuevo.", + "invalidDataFromServer": "Datos inválidos recibidos del servidor.", + "createFailedConsole": "Error creando grupo:", + "joinFailedConsole": "Error al unirse al grupo:" }, "notifications": { - "groupCreatedSuccess": "ES: Group '{groupName}' created successfully.", - "joinSuccessNamed": "ES: Successfully joined group '{groupName}'.", - "joinSuccessGeneric": "ES: Successfully joined group.", - "listCreatedSuccess": "ES: List '{listName}' created successfully." + "groupCreatedSuccess": "Grupo '{groupName}' creado exitosamente.", + "joinSuccessNamed": "Te uniste exitosamente al grupo '{groupName}'.", + "joinSuccessGeneric": "Te uniste exitosamente al grupo.", + "listCreatedSuccess": "Lista '{listName}' creada exitosamente." } }, "authCallbackPage": { - "redirecting": "ES: Redirecting...", + "redirecting": "Redirigiendo...", "errors": { - "authenticationFailed": "ES: Authentication failed", - "noTokenProvided": "[TRANSLATE] No token provided" + "authenticationFailed": "Autenticación fallida", + "noTokenProvided": "No se proporcionó ningún token" } }, "choresPage": { - "title": "ES: Chores", + "title": "Tareas", "tabs": { - "overdue": "ES: Overdue", - "today": "ES: Today", - "upcoming": "ES: Upcoming", - "allPending": "ES: All Pending", - "completed": "ES: Completed" + "overdue": "Vencidas", + "today": "Hoy", + "upcoming": "Próximas", + "allPending": "Todas pendientes", + "completed": "Completadas" }, "viewToggle": { - "calendarLabel": "ES: Calendar View", - "calendarText": "ES: Calendar", - "listLabel": "ES: List View", - "listText": "ES: List" + "calendarLabel": "Vista de calendario", + "calendarText": "Calendario", + "listLabel": "Vista de lista", + "listText": "Lista" }, - "newChoreButtonLabel": "ES: New Chore", - "newChoreButtonText": "ES: New Chore", + "newChoreButtonLabel": "Nueva tarea", + "newChoreButtonText": "Nueva tarea", "loadingState": { - "loadingChores": "ES: Loading chores..." + "loadingChores": "Cargando tareas..." }, "calendar": { - "prevMonthLabel": "ES: Previous month", - "nextMonthLabel": "ES: Next month", + "prevMonthLabel": "Mes anterior", + "nextMonthLabel": "Mes siguiente", "weekdays": { - "sun": "ES: Sun", - "mon": "ES: Mon", - "tue": "ES: Tue", - "wed": "ES: Wed", - "thu": "ES: Thu", - "fri": "ES: Fri", - "sat": "ES: Sat" + "sun": "Dom", + "mon": "Lun", + "tue": "Mar", + "wed": "Mié", + "thu": "Jue", + "fri": "Vie", + "sat": "Sáb" }, - "addChoreToDayLabel": "ES: Add chore to this day", - "emptyState": "ES: No chores to display for this period." + "addChoreToDayLabel": "Añadir tarea a este día", + "emptyState": "No hay tareas para mostrar en este período." }, "listView": { - "choreTypePersonal": "ES: Personal", - "choreTypeGroupFallback": "ES: Group", - "completedDatePrefix": "ES: Completed:", + "choreTypePersonal": "Personal", + "choreTypeGroupFallback": "Grupo", + "completedDatePrefix": "Completada:", "actions": { - "doneTitle": "ES: Mark as Done", - "doneText": "ES: Done", - "undoTitle": "ES: Mark as Not Done", - "undoText": "ES: Undo", - "editTitle": "ES: Edit", - "editLabel": "ES: Edit chore", - "editText": "ES: Edit", - "deleteTitle": "ES: Delete", - "deleteLabel": "ES: Delete chore", - "deleteText": "ES: Delete" + "doneTitle": "Marcar como hecha", + "doneText": "Hecha", + "undoTitle": "Marcar como no hecha", + "undoText": "Deshacer", + "editTitle": "Editar", + "editLabel": "Editar tarea", + "editText": "Editar", + "deleteTitle": "Eliminar", + "deleteLabel": "Eliminar tarea", + "deleteText": "Eliminar" }, "emptyState": { - "message": "ES: No chores in this view. Well done!", - "viewAllButton": "ES: View All Pending" + "message": "No hay tareas en esta vista. ¡Bien hecho!", + "viewAllButton": "Ver todas las pendientes" } }, "choreModal": { - "editTitle": "ES: Edit Chore", - "newTitle": "ES: New Chore", - "closeButtonLabel": "ES: Close modal", - "nameLabel": "ES: Name", - "namePlaceholder": "ES: Enter chore name", - "typeLabel": "ES: Type", - "typePersonal": "ES: Personal", - "typeGroup": "ES: Group", - "groupLabel": "ES: Group", - "groupSelectDefault": "ES: Select a group", - "descriptionLabel": "ES: Description", - "descriptionPlaceholder": "ES: Add a description (optional)", - "frequencyLabel": "ES: Frequency", - "intervalLabel": "ES: Interval (days)", - "intervalPlaceholder": "ES: e.g. 3", - "dueDateLabel": "ES: Due Date", - "quickDueDateToday": "ES: Today", - "quickDueDateTomorrow": "ES: Tomorrow", - "quickDueDateNextWeek": "ES: Next Week", - "cancelButton": "ES: Cancel", - "saveButton": "ES: Save", - "intervalPlaceholder": "[TRANSLATE] e.g., 10" + "editTitle": "Editar tarea", + "newTitle": "Nueva tarea", + "closeButtonLabel": "Cerrar modal", + "nameLabel": "Nombre", + "namePlaceholder": "Ingresar nombre de la tarea", + "typeLabel": "Tipo", + "typePersonal": "Personal", + "typeGroup": "Grupo", + "groupLabel": "Grupo", + "groupSelectDefault": "Seleccionar un grupo", + "descriptionLabel": "Descripción", + "descriptionPlaceholder": "Añadir una descripción (opcional)", + "frequencyLabel": "Frecuencia", + "intervalLabel": "Intervalo (días)", + "intervalPlaceholder": "p.ej. 10", + "dueDateLabel": "Fecha de vencimiento", + "quickDueDateToday": "Hoy", + "quickDueDateTomorrow": "Mañana", + "quickDueDateNextWeek": "Próxima semana", + "cancelButton": "Cancelar", + "saveButton": "Guardar" }, "consoleErrors": { - "loadFailed": "[TRANSLATE] Failed to load all chores:", - "loadGroupsFailed": "[TRANSLATE] Failed to load groups", - "createAssignmentForNewChoreFailed": "[TRANSLATE] Failed to create assignment for new chore:", - "saveFailed": "[TRANSLATE] Failed to save chore:", - "deleteFailed": "[TRANSLATE] Failed to delete chore:", - "createAssignmentFailed": "[TRANSLATE] Failed to create assignment:", - "updateCompletionStatusFailed": "[TRANSLATE] Failed to update chore completion status:" + "loadFailed": "Error al cargar todas las tareas:", + "loadGroupsFailed": "Error al cargar grupos", + "createAssignmentForNewChoreFailed": "Error al crear asignación para nueva tarea:", + "saveFailed": "Error al guardar tarea:", + "deleteFailed": "Error al eliminar tarea:", + "createAssignmentFailed": "Error al crear asignación:", + "updateCompletionStatusFailed": "Error al actualizar estado de finalización de la tarea:" }, "deleteDialog": { - "title": "ES: Delete Chore", - "confirmationText": "ES: Are you sure you want to delete this chore? This action cannot be undone.", - "deleteButton": "ES: Delete" + "title": "Eliminar tarea", + "confirmationText": "¿Estás seguro de que quieres eliminar esta tarea? Esta acción no se puede deshacer.", + "deleteButton": "Eliminar" }, "shortcutsModal": { - "title": "ES: Keyboard Shortcuts", - "descNewChore": "ES: New Chore", - "descToggleView": "ES: Toggle View (List/Calendar)", - "descToggleShortcuts": "ES: Show/Hide Shortcuts", - "descCloseModal": "ES: Close any open Modal/Dialog" + "title": "Atajos de teclado", + "descNewChore": "Nueva tarea", + "descToggleView": "Alternar vista (Lista/Calendario)", + "descToggleShortcuts": "Mostrar/Ocultar atajos", + "descCloseModal": "Cerrar cualquier Modal/Diálogo abierto" }, "frequencyOptions": { - "oneTime": "ES: One Time", - "daily": "ES: Daily", - "weekly": "ES: Weekly", - "monthly": "ES: Monthly", - "custom": "ES: Custom" + "oneTime": "Una vez", + "daily": "Diariamente", + "weekly": "Semanalmente", + "monthly": "Mensualmente", + "custom": "Personalizado" + }, + "frequency": { + "customInterval": "Cada {n} día | Cada {n} días" }, "formatters": { - "noDueDate": "ES: No due date", - "dueToday": "ES: Due Today", - "dueTomorrow": "ES: Due Tomorrow", - "overdueFull": "ES: Overdue: {date}", - "dueFull": "ES: Due {date}", - "invalidDate": "ES: Invalid Date" + "noDueDate": "Sin fecha de vencimiento", + "dueToday": "Vence hoy", + "dueTomorrow": "Vence mañana", + "overdueFull": "Vencida: {date}", + "dueFull": "Vence el {date}", + "invalidDate": "Fecha inválida" }, "notifications": { - "loadFailed": "ES: Failed to load chores", - "updateSuccess": "ES: Chore '{name}' updated successfully", - "createSuccess": "ES: Chore '{name}' created successfully", - "updateFailed": "ES: Failed to update chore", - "createFailed": "ES: Failed to create chore", - "deleteSuccess": "ES: Chore '{name}' deleted successfully", - "deleteFailed": "ES: Failed to delete chore", - "markedDone": "ES: {name} marked as done.", - "markedNotDone": "ES: {name} marked as not done.", - "statusUpdateFailed": "ES: Failed to update chore status." + "loadFailed": "Error al cargar las tareas.", + "loadGroupsFailed": "Error al cargar los grupos.", + "updateSuccess": "Tarea '{name}' actualizada exitosamente.", + "createSuccess": "Tarea '{name}' creada exitosamente.", + "updateFailed": "Error al actualizar la tarea.", + "createFailed": "Error al crear la tarea.", + "deleteSuccess": "Tarea '{name}' eliminada exitosamente.", + "deleteFailed": "Error al eliminar la tarea.", + "markedDone": "{name} marcada como hecha.", + "markedNotDone": "{name} marcada como no hecha.", + "statusUpdateFailed": "Error al actualizar el estado de la tarea.", + "createAssignmentFailed": "Error al crear la asignación para la tarea." }, "validation": { - "nameRequired": "ES: Chore name is required.", - "groupRequired": "ES: Please select a group for group chores.", - "intervalRequired": "ES: Custom interval must be at least 1 day.", - "dueDateRequired": "ES: Due date is required.", - "invalidDueDate": "ES: Invalid due date format." + "nameRequired": "El nombre de la tarea es obligatorio.", + "groupRequired": "Por favor, selecciona un grupo para tareas grupales.", + "intervalRequired": "El intervalo personalizado debe ser de al menos 1 día.", + "dueDateRequired": "La fecha de vencimiento es obligatoria.", + "invalidDueDate": "Formato de fecha de vencimiento inválido." }, - "unsavedChangesConfirmation": "ES: You have unsaved changes in the chore form. Are you sure you want to leave?" + "unsavedChangesConfirmation": "Tienes cambios sin guardar en el formulario de la tarea. ¿Estás seguro de que quieres salir?" }, "errorNotFoundPage": { - "errorCode": "ES: 404", - "errorMessage": "ES: Oops. Nothing here...", - "goHomeButton": "ES: Go Home" + "errorCode": "404", + "errorMessage": "Vaya. Aquí no hay nada...", + "goHomeButton": "Ir al inicio" }, "groupDetailPage": { - "loadingLabel": "ES: Loading group details...", - "retryButton": "ES: Retry", - "groupNotFound": "ES: Group not found or an error occurred.", + "loadingLabel": "Cargando detalles del grupo...", + "retryButton": "Reintentar", + "groupNotFound": "Grupo no encontrado o se produjo un error.", "members": { - "title": "ES: Group Members", - "defaultRole": "ES: Member", - "removeButton": "ES: Remove", - "emptyState": "ES: No members found.", - "closeMenuLabel": "[TRANSLATE] Close menu" + "title": "Miembros del grupo", + "defaultRole": "Miembro", + "removeButton": "Eliminar", + "emptyState": "No se encontraron miembros.", + "closeMenuLabel": "Cerrar menú" }, "invites": { - "title": "ES: Invite Members", - "description": "[TRANSLATE] Invite new members by generating a shareable code.", - "addMemberButtonLabel": "[TRANSLATE] Add member", - "closeInviteLabel": "[TRANSLATE] Close invite", - "regenerateButton": "ES: Regenerate Invite Code", - "generateButton": "ES: Generate Invite Code", - "activeCodeLabel": "ES: Current Active Invite Code:", - "copyButtonLabel": "ES: Copy invite code", - "copySuccess": "ES: Invite code copied to clipboard!", - "emptyState": "ES: No active invite code. Click the button above to generate one.", + "title": "Invitar miembros", + "description": "Invita a nuevos miembros generando un código compartible.", + "addMemberButtonLabel": "Añadir miembro", + "closeInviteLabel": "Cerrar invitación", + "regenerateButton": "Regenerar código de invitación", + "generateButton": "Generar código de invitación", + "activeCodeLabel": "Código de invitación activo actual:", + "copyButtonLabel": "Copiar código de invitación", + "copySuccess": "¡Código de invitación copiado al portapapeles!", + "emptyState": "No hay código de invitación activo. Haz clic en el botón de arriba para generar uno.", "errors": { - "newDataInvalid": "ES: New invite code data is invalid." + "newDataInvalid": "Los datos del nuevo código de invitación son inválidos." } }, "errors": { - "failedToFetchActiveInvite": "[TRANSLATE] Failed to fetch active invite code.", - "failedToFetchGroupDetails": "[TRANSLATE] Failed to fetch group details.", - "failedToLoadUpcomingChores": "[TRANSLATE] Error loading upcoming chores:", - "failedToLoadRecentExpenses": "[TRANSLATE] Error loading recent expenses:" + "failedToFetchActiveInvite": "Error al obtener el código de invitación activo.", + "failedToFetchGroupDetails": "Error al obtener los detalles del grupo.", + "failedToLoadUpcomingChores": "Error al cargar las próximas tareas:", + "failedToLoadRecentExpenses": "Error al cargar los gastos recientes:" }, "console": { - "noActiveInvite": "[TRANSLATE] No active invite code found for this group." + "noActiveInvite": "No se encontró ningún código de invitación activo para este grupo." }, "chores": { - "title": "ES: Group Chores", - "manageButton": "ES: Manage Chores", - "duePrefix": "ES: Due:", - "emptyState": "ES: No chores scheduled. Click \"Manage Chores\" to create some!" + "title": "Tareas del grupo", + "manageButton": "Gestionar tareas", + "duePrefix": "Vence:", + "emptyState": "No hay tareas programadas. ¡Haz clic en \"Gestionar tareas\" para crear algunas!" }, "expenses": { - "title": "ES: Group Expenses", - "manageButton": "ES: Manage Expenses", - "emptyState": "ES: No expenses recorded. Click \"Manage Expenses\" to add some!", - "fallbackUserName": "[TRANSLATE] User ID: {userId}", - "activityByUserFallback": "[TRANSLATE] User {userId}", + "title": "Gastos del grupo", + "manageButton": "Gestionar gastos", + "emptyState": "No hay gastos registrados. ¡Haz clic en \"Gestionar gastos\" para añadir algunos!", + "paidBy": "Pagado por:", + "owes": "debe", + "paidAmount": "Pagado:", + "onDate": "el", + "settleShareButton": "Saldar mi parte", + "activityLabel": "Actividad:", + "byUser": "por", + "fallbackUserName": "ID de usuario: {userId}", + "activityByUserFallback": "Usuario {userId}", "splitTypes": { - "equal": "ES: Equal", - "exactAmounts": "ES: Exact Amounts", - "percentage": "ES: Percentage", - "shares": "ES: Shares", - "itemBased": "ES: Item Based" + "equal": "Igual", + "exactAmounts": "Cantidades exactas", + "percentage": "Porcentaje", + "shares": "Partes", + "itemBased": "Basado en artículos" } }, "notifications": { - "fetchDetailsFailed": "ES: Failed to fetch group details.", - "fetchInviteFailed": "ES: Failed to fetch active invite code.", - "generateInviteSuccess": "ES: New invite code generated successfully!", - "generateInviteError": "ES: Failed to generate invite code.", - "clipboardNotSupported": "ES: Clipboard not supported or no code to copy.", - "copyInviteFailed": "ES: Failed to copy invite code.", - "removeMemberSuccess": "ES: Member removed successfully", - "removeMemberFailed": "ES: Failed to remove member" + "fetchDetailsFailed": "Error al obtener los detalles del grupo.", + "fetchInviteFailed": "Error al obtener el código de invitación activo.", + "generateInviteSuccess": "¡Nuevo código de invitación generado exitosamente!", + "generateInviteError": "Error al generar el código de invitación.", + "clipboardNotSupported": "Portapapeles no compatible o no hay código para copiar.", + "copyInviteFailed": "Error al copiar el código de invitación.", + "removeMemberSuccess": "Miembro eliminado exitosamente", + "removeMemberFailed": "Error al eliminar miembro", + "loadExpensesFailed": "Error al cargar los gastos recientes.", + "cannotSettleOthersShares": "Solo puedes saldar tus propias partes.", + "settlementDataMissing": "No se puede procesar el saldo: faltan datos.", + "settleShareSuccess": "¡Parte saldada exitosamente!", + "settleShareFailed": "Error al saldar la parte." + }, + "loading": { + "settlement": "Procesando saldo..." + }, + "settleShareModal": { + "title": "Saldar parte", + "settleAmountFor": "Saldar cantidad para {userName}:", + "amountLabel": "Cantidad", + "cancelButton": "Cancelar", + "confirmButton": "Confirmar", + "errors": { + "enterAmount": "Por favor, ingresa una cantidad.", + "positiveAmount": "Por favor, ingresa una cantidad positiva.", + "exceedsRemaining": "La cantidad no puede exceder el restante: {amount}.", + "noSplitSelected": "Error: No se seleccionó ninguna división." + } + }, + "status": { + "settled": "Saldado", + "partiallySettled": "Parcialmente saldado", + "unsettled": "Pendiente", + "paid": "Pagado", + "partiallyPaid": "Parcialmente pagado", + "unpaid": "No pagado", + "unknown": "Estado desconocido" } }, "accountPage": { - "title": "Account Settings", - "loadingProfile": "Loading profile...", - "retryButton": "Retry", + "title": "Configuración de la cuenta", + "loadingProfile": "Cargando perfil...", + "retryButton": "Reintentar", "profileSection": { - "header": "Profile Information", - "nameLabel": "Name", - "emailLabel": "Email", - "saveButton": "Save Changes" + "header": "Información del perfil", + "nameLabel": "Nombre", + "emailLabel": "Correo electrónico", + "saveButton": "Guardar cambios" }, "passwordSection": { - "header": "Change Password", - "currentPasswordLabel": "Current Password", - "newPasswordLabel": "New Password", - "changeButton": "Change Password" + "header": "Cambiar contraseña", + "currentPasswordLabel": "Contraseña actual", + "newPasswordLabel": "Nueva contraseña", + "changeButton": "Cambiar contraseña" }, "notificationsSection": { - "header": "Notification Preferences", - "emailNotificationsLabel": "Email Notifications", - "emailNotificationsDescription": "Receive email notifications for important updates", - "listUpdatesLabel": "List Updates", - "listUpdatesDescription": "Get notified when lists are updated", - "groupActivitiesLabel": "Group Activities", - "groupActivitiesDescription": "Receive notifications for group activities" + "header": "Preferencias de notificación", + "emailNotificationsLabel": "Notificaciones por correo electrónico", + "emailNotificationsDescription": "Recibir notificaciones por correo electrónico para actualizaciones importantes", + "listUpdatesLabel": "Actualizaciones de listas", + "listUpdatesDescription": "Recibir notificaciones cuando se actualicen las listas", + "groupActivitiesLabel": "Actividades de grupo", + "groupActivitiesDescription": "Recibir notificaciones para actividades de grupo" }, "notifications": { - "profileLoadFailed": "Failed to load profile", - "profileUpdateSuccess": "Profile updated successfully", - "profileUpdateFailed": "Failed to update profile", - "passwordFieldsRequired": "Please fill in both current and new password fields.", - "passwordTooShort": "New password must be at least 8 characters long.", - "passwordChangeSuccess": "Password changed successfully", - "passwordChangeFailed": "Failed to change password", - "preferencesUpdateSuccess": "Preferences updated successfully", - "preferencesUpdateFailed": "Failed to update preferences" + "profileLoadFailed": "Error al cargar el perfil", + "profileUpdateSuccess": "Perfil actualizado exitosamente", + "profileUpdateFailed": "Error al actualizar el perfil", + "passwordFieldsRequired": "Por favor, completa los campos de contraseña actual y nueva.", + "passwordTooShort": "La nueva contraseña debe tener al menos 8 caracteres.", + "passwordChangeSuccess": "Contraseña cambiada exitosamente", + "passwordChangeFailed": "Error al cambiar la contraseña", + "preferencesUpdateSuccess": "Preferencias actualizadas exitosamente", + "preferencesUpdateFailed": "Error al actualizar las preferencias" }, - "saving": "Saving..." + "saving": "Guardando..." }, "signupPage": { - "header": "Sign Up", - "fullNameLabel": "Full Name", - "emailLabel": "Email", - "passwordLabel": "Password", - "confirmPasswordLabel": "Confirm Password", - "togglePasswordVisibility": "Toggle password visibility", - "submitButton": "Sign Up", - "loginLink": "Already have an account? Login", + "header": "Regístrate", + "fullNameLabel": "Nombre completo", + "emailLabel": "Correo electrónico", + "passwordLabel": "Contraseña", + "confirmPasswordLabel": "Confirmar contraseña", + "togglePasswordVisibility": "Alternar visibilidad de contraseña", + "submitButton": "Regístrate", + "loginLink": "¿Ya tienes una cuenta? Iniciar sesión", "validation": { - "nameRequired": "Name is required", - "emailRequired": "Email is required", - "emailInvalid": "Invalid email format", - "passwordRequired": "Password is required", - "passwordLength": "Password must be at least 8 characters", - "confirmPasswordRequired": "Please confirm your password", - "passwordsNoMatch": "Passwords do not match" + "nameRequired": "El nombre es obligatorio", + "emailRequired": "El correo electrónico es obligatorio", + "emailInvalid": "Formato de correo electrónico inválido", + "passwordRequired": "La contraseña es obligatoria", + "passwordLength": "La contraseña debe tener al menos 8 caracteres", + "confirmPasswordRequired": "Por favor, confirma tu contraseña", + "passwordsNoMatch": "Las contraseñas no coinciden" }, "notifications": { - "signupFailed": "Signup failed. Please try again.", - "signupSuccess": "Account created successfully. Please login." + "signupFailed": "Registro fallido. Por favor, inténtalo de nuevo.", + "signupSuccess": "Cuenta creada exitosamente. Por favor, inicia sesión." } }, "listDetailPage": { "loading": { - "list": "Loading list...", - "items": "Loading items...", - "ocrProcessing": "Processing image...", - "addingOcrItems": "Adding OCR items...", - "costSummary": "Loading summary...", - "expenses": "Loading expenses...", - "settlement": "Processing settlement..." + "list": "Cargando lista...", + "items": "Cargando artículos...", + "ocrProcessing": "Procesando imagen...", + "addingOcrItems": "Añadiendo artículos OCR...", + "costSummary": "Cargando resumen...", + "expenses": "Cargando gastos...", + "settlement": "Procesando saldo..." }, "errors": { - "fetchFailed": "Failed to load list details.", - "genericLoadFailure": "Group not found or an error occurred.", - "ocrNoItems": "No items extracted from the image.", - "ocrFailed": "Failed to process image.", - "addItemFailed": "Failed to add item.", - "updateItemFailed": "Failed to update item.", - "updateItemPriceFailed": "Failed to update item price.", - "deleteItemFailed": "Failed to delete item.", - "addOcrItemsFailed": "Failed to add OCR items.", - "fetchItemsFailed": "Failed to load items: {errorMessage}", - "loadCostSummaryFailed": "Failed to load cost summary." + "fetchFailed": "Error al cargar los detalles de la lista.", + "genericLoadFailure": "Grupo no encontrado o se produjo un error.", + "ocrNoItems": "No se extrajeron artículos de la imagen.", + "ocrFailed": "Error al procesar la imagen.", + "addItemFailed": "Error al añadir el artículo.", + "updateItemFailed": "Error al actualizar el artículo.", + "updateItemPriceFailed": "Error al actualizar el precio del artículo.", + "deleteItemFailed": "Error al eliminar el artículo.", + "addOcrItemsFailed": "Error al añadir artículos OCR.", + "fetchItemsFailed": "Error al cargar artículos: {errorMessage}", + "loadCostSummaryFailed": "Error al cargar el resumen de costos." }, - "retryButton": "Retry", + "retryButton": "Reintentar", "buttons": { - "addViaOcr": "Add via OCR", - "addItem": "Add", - "addItems": "Add Items", - "cancel": "Cancel", - "confirm": "Confirm", - "saveChanges": "Save Changes", - "close": "Close", - "costSummary": "Cost Summary" + "addViaOcr": "Añadir vía OCR", + "addItem": "Añadir", + "addItems": "Añadir artículos", + "cancel": "Cancelar", + "confirm": "Confirmar", + "saveChanges": "Guardar cambios", + "close": "Cerrar", + "costSummary": "Resumen de costos" }, "badges": { - "groupList": "Group List", - "personalList": "Personal List" + "groupList": "Lista de grupo", + "personalList": "Lista personal" }, "items": { "emptyState": { - "title": "No Items Yet!", - "message": "Add some items using the form below." + "title": "¡Aún no hay artículos!", + "message": "Añade algunos artículos usando el formulario de abajo." }, "addItemForm": { - "placeholder": "Add a new item", - "quantityPlaceholder": "Qty", - "itemNameSrLabel": "New item name", - "quantitySrLabel": "Quantity" + "placeholder": "Añadir un nuevo artículo", + "quantityPlaceholder": "Cant.", + "itemNameSrLabel": "Nombre del nuevo artículo", + "quantitySrLabel": "Cantidad" }, - "pricePlaceholder": "Price", - "editItemAriaLabel": "Edit item", - "deleteItemAriaLabel": "Delete item" + "pricePlaceholder": "Precio", + "editItemAriaLabel": "Editar artículo", + "deleteItemAriaLabel": "Eliminar artículo" }, "modals": { "ocr": { - "title": "Add Items via OCR", - "uploadLabel": "Upload Image" + "title": "Añadir artículos vía OCR", + "uploadLabel": "Subir imagen" }, "confirmation": { - "title": "Confirmation" + "title": "Confirmación" }, "editItem": { - "title": "Edit Item", - "nameLabel": "Item Name", - "quantityLabel": "Quantity" + "title": "Editar artículo", + "nameLabel": "Nombre del artículo", + "quantityLabel": "Cantidad" }, "costSummary": { - "title": "List Cost Summary", - "totalCostLabel": "Total List Cost:", - "equalShareLabel": "Equal Share Per User:", - "participantsLabel": "Participating Users:", - "userBalancesHeader": "User Balances", + "title": "Resumen de costos de la lista", + "totalCostLabel": "Costo total de la lista:", + "equalShareLabel": "Parte igual por usuario:", + "participantsLabel": "Usuarios participantes:", + "userBalancesHeader": "Saldos de usuarios", "tableHeaders": { - "user": "User", - "itemsAddedValue": "Items Added Value", - "amountDue": "Amount Due", - "balance": "Balance" + "user": "Usuario", + "itemsAddedValue": "Valor de los artículos añadidos", + "amountDue": "Cantidad debida", + "balance": "Saldo" }, - "emptyState": "No cost summary available." + "emptyState": "No hay resumen de costos disponible." }, "settleShare": { - "title": "Settle Share", - "settleAmountFor": "Settle amount for {userName}:", - "amountLabel": "Amount", + "title": "Saldar parte", + "settleAmountFor": "Saldar cantidad para {userName}:", + "amountLabel": "Cantidad", "errors": { - "enterAmount": "Please enter an amount.", - "positiveAmount": "Please enter a positive amount.", - "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", - "noSplitSelected": "Error: No split selected." + "enterAmount": "Por favor, ingresa una cantidad.", + "positiveAmount": "Por favor, ingresa una cantidad positiva.", + "exceedsRemaining": "La cantidad no puede exceder el restante: {amount}.", + "noSplitSelected": "Error: No se seleccionó ninguna división." } } }, "confirmations": { - "updateMessage": "Mark '{itemName}' as {status}?", - "statusComplete": "complete", - "statusIncomplete": "incomplete", - "deleteMessage": "Delete '{itemName}'? This cannot be undone." + "updateMessage": "¿Marcar '{itemName}' como {status}?", + "statusComplete": "completado", + "statusIncomplete": "incompleto", + "deleteMessage": "¿Eliminar '{itemName}'? Esto no se puede deshacer." }, "notifications": { - "itemAddedSuccess": "Item added successfully.", - "itemsAddedSuccessOcr": "{count} item(s) added successfully from OCR.", - "itemUpdatedSuccess": "Item updated successfully.", - "itemDeleteSuccess": "Item deleted successfully.", - "enterItemName": "Please enter an item name.", - "costSummaryLoadFailed": "Failed to load cost summary.", - "cannotSettleOthersShares": "You can only settle your own shares.", - "settlementDataMissing": "Cannot process settlement: missing data.", - "settleShareSuccess": "Share settled successfully!", - "settleShareFailed": "Failed to settle share." + "itemAddedSuccess": "Artículo añadido exitosamente.", + "itemsAddedSuccessOcr": "{count} artículo(s) añadido(s) exitosamente desde OCR.", + "itemUpdatedSuccess": "Artículo actualizado exitosamente.", + "itemDeleteSuccess": "Artículo eliminado exitosamente.", + "enterItemName": "Por favor, ingresa un nombre de artículo.", + "costSummaryLoadFailed": "Error al cargar el resumen de costos.", + "cannotSettleOthersShares": "Solo puedes saldar tus propias partes.", + "settlementDataMissing": "No se puede procesar el saldo: faltan datos.", + "settleShareSuccess": "¡Parte saldada exitosamente!", + "settleShareFailed": "Error al saldar la parte." }, "expensesSection": { - "title": "Expenses", - "addExpenseButton": "Add Expense", - "loading": "Loading expenses...", - "emptyState": "No expenses recorded for this list yet.", - "paidBy": "Paid by:", - "onDate": "on", - "owes": "owes", - "paidAmount": "Paid:", - "activityLabel": "Activity:", - "byUser": "by", - "settleShareButton": "Settle My Share", - "retryButton": "Retry" + "title": "Gastos", + "addExpenseButton": "Añadir gasto", + "loading": "Cargando gastos...", + "emptyState": "Aún no hay gastos registrados para esta lista.", + "paidBy": "Pagado por:", + "onDate": "el", + "owes": "debe", + "paidAmount": "Pagado:", + "activityLabel": "Actividad:", + "byUser": "por", + "settleShareButton": "Saldar mi parte", + "retryButton": "Reintentar" }, "status": { - "settled": "Settled", - "partiallySettled": "Partially Settled", - "unsettled": "Unsettled", - "paid": "Paid", - "partiallyPaid": "Partially Paid", - "unpaid": "Unpaid", - "unknown": "Unknown Status" + "settled": "Saldado", + "partiallySettled": "Parcialmente saldado", + "unsettled": "Pendiente", + "paid": "Pagado", + "partiallyPaid": "Parcialmente pagado", + "unpaid": "No pagado", + "unknown": "Estado desconocido" } }, "myChoresPage": { - "title": "My Assigned Chores", - "showCompletedToggle": "Show Completed", + "title": "Mis tareas asignadas", + "showCompletedToggle": "Mostrar completadas", "timelineHeaders": { - "overdue": "Overdue", - "today": "Due Today", - "thisWeek": "This Week", - "later": "Later", - "completed": "Completed" + "overdue": "Vencidas", + "today": "Vencen hoy", + "thisWeek": "Esta semana", + "later": "Más tarde", + "completed": "Completadas" }, "choreCard": { "personal": "Personal", - "group": "Group", - "duePrefix": "Due", - "completedPrefix": "Completed", - "dueToday": "Due Today", - "markCompleteButton": "Mark Complete" + "group": "Grupo", + "duePrefix": "Vence", + "completedPrefix": "Completada", + "dueToday": "Vence hoy", + "markCompleteButton": "Marcar como completada" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Una vez", + "daily": "Diariamente", + "weekly": "Semanalmente", + "monthly": "Mensualmente", + "custom": "Personalizado", + "unknown": "Frecuencia desconocida" }, "dates": { - "invalidDate": "Invalid Date", - "unknownDate": "Unknown Date" + "invalidDate": "Fecha inválida", + "unknownDate": "Fecha desconocida" }, "emptyState": { - "title": "No Assignments Yet!", - "noAssignmentsPending": "You have no pending chore assignments.", - "noAssignmentsAll": "You have no chore assignments (completed or pending).", - "viewAllChoresButton": "View All Chores" + "title": "¡Aún no hay asignaciones!", + "noAssignmentsPending": "No tienes asignaciones de tareas pendientes.", + "noAssignmentsAll": "No tienes asignaciones de tareas (completadas o pendientes).", + "viewAllChoresButton": "Ver todas las tareas" }, "notifications": { - "loadFailed": "Failed to load assignments", - "markedComplete": "Marked \"{choreName}\" as complete!", - "markCompleteFailed": "Failed to mark assignment as complete" + "loadFailed": "Error al cargar las asignaciones", + "markedComplete": "¡Se marcó \"{choreName}\" como completada!", + "markCompleteFailed": "Error al marcar la asignación como completada" } }, "personalChoresPage": { - "title": "Personal Chores", - "newChoreButton": "New Chore", - "editButton": "Edit", - "deleteButton": "Delete", - "cancelButton": "Cancel", - "saveButton": "Save", + "title": "Tareas personales", + "newChoreButton": "Nueva tarea", + "editButton": "Editar", + "deleteButton": "Eliminar", + "cancelButton": "Cancelar", + "saveButton": "Guardar", "modals": { - "editChoreTitle": "Edit Chore", - "newChoreTitle": "New Chore", - "deleteChoreTitle": "Delete Chore" + "editChoreTitle": "Editar tarea", + "newChoreTitle": "Nueva tarea", + "deleteChoreTitle": "Eliminar tarea" }, "form": { - "nameLabel": "Name", - "descriptionLabel": "Description", - "frequencyLabel": "Frequency", - "intervalLabel": "Interval (days)", - "dueDateLabel": "Next Due Date" + "nameLabel": "Nombre", + "descriptionLabel": "Descripción", + "frequencyLabel": "Frecuencia", + "intervalLabel": "Intervalo (días)", + "dueDateLabel": "Próxima fecha de vencimiento" }, "deleteDialog": { - "confirmationText": "Are you sure you want to delete this chore?" + "confirmationText": "¿Estás seguro de que quieres eliminar esta tarea?" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Una vez", + "daily": "Diariamente", + "weekly": "Semanalmente", + "monthly": "Mensualmente", + "custom": "Personalizado", + "unknown": "Frecuencia desconocida" }, "dates": { - "invalidDate": "Invalid Date", - "duePrefix": "Due" + "invalidDate": "Fecha inválida", + "duePrefix": "Vence" }, "notifications": { - "loadFailed": "Failed to load personal chores", - "updateSuccess": "Personal chore updated successfully", - "createSuccess": "Personal chore created successfully", - "saveFailed": "Failed to save personal chore", - "deleteSuccess": "Personal chore deleted successfully", - "deleteFailed": "Failed to delete personal chore" + "loadFailed": "Error al cargar las tareas personales", + "updateSuccess": "Tarea personal actualizada exitosamente", + "createSuccess": "Tarea personal creada exitosamente", + "saveFailed": "Error al guardar la tarea personal", + "deleteSuccess": "Tarea personal eliminada exitosamente", + "deleteFailed": "Error al eliminar la tarea personal" } }, "indexPage": { - "welcomeMessage": "Welcome to Valerie UI App", - "mainPageInfo": "This is the main index page.", - "sampleTodosHeader": "Sample Todos (from IndexPage data)", - "totalCountLabel": "Total count from meta:", - "noTodos": "No todos to display." + "welcomeMessage": "Bienvenido a la aplicación Valerie UI", + "mainPageInfo": "Esta es la página de índice principal.", + "sampleTodosHeader": "Tareas de ejemplo (de datos de IndexPage)", + "totalCountLabel": "Recuento total de meta:", + "noTodos": "No hay tareas para mostrar." } -} +} \ No newline at end of file diff --git a/fe/src/i18n/fr.json b/fe/src/i18n/fr.json index 887eb41..cc89b52 100644 --- a/fe/src/i18n/fr.json +++ b/fe/src/i18n/fr.json @@ -3,588 +3,629 @@ "hello": "Bonjour" }, "loginPage": { - "emailLabel": "FR: Email", - "passwordLabel": "FR: Password", - "togglePasswordVisibilityLabel": "FR: Toggle password visibility", - "loginButton": "FR: Login", - "signupLink": "FR: Don't have an account? Sign up", + "emailLabel": "E-mail", + "passwordLabel": "Mot de passe", + "togglePasswordVisibilityLabel": "Basculer la visibilité du mot de passe", + "loginButton": "Connexion", + "signupLink": "Vous n'avez pas de compte ? S'inscrire", "errors": { - "emailRequired": "FR: Email is required", - "emailInvalid": "FR: Invalid email format", - "passwordRequired": "FR: Password is required", - "loginFailed": "FR: Login failed. Please check your credentials." + "emailRequired": "L'e-mail est requis", + "emailInvalid": "Format d'e-mail invalide", + "passwordRequired": "Le mot de passe est requis", + "loginFailed": "Échec de la connexion. Veuillez vérifier vos identifiants." }, "notifications": { - "loginSuccess": "FR: Login successful" + "loginSuccess": "Connexion réussie" } }, "listsPage": { - "retryButton": "FR: Retry", + "retryButton": "Réessayer", "emptyState": { - "noListsForGroup": "FR: No lists found for this group.", - "noListsYet": "FR: You have no lists yet.", - "personalGlobalInfo": "FR: Create a personal list or join a group to see shared lists.", - "groupSpecificInfo": "FR: This group doesn't have any lists yet." + "noListsForGroup": "Aucune liste trouvée pour ce groupe.", + "noListsYet": "Vous n'avez pas encore de listes.", + "personalGlobalInfo": "Créez une liste personnelle ou rejoignez un groupe pour voir les listes partagées.", + "groupSpecificInfo": "Ce groupe n'a pas encore de listes." }, - "createNewListButton": "FR: Create New List", - "loadingLists": "FR: Loading lists...", - "noDescription": "FR: No description", - "addItemPlaceholder": "FR: Add new item...", + "createNewListButton": "Créer une nouvelle liste", + "loadingLists": "Chargement des listes...", + "noDescription": "Pas de description", + "addItemPlaceholder": "Ajouter un nouvel article...", "createCard": { - "title": "FR: + Create a new list" + "title": "+ Liste" }, "pageTitle": { - "forGroup": "FR: Lists for {groupName}", - "forGroupId": "FR: Lists for Group {groupId}", - "myLists": "FR: My Lists" + "forGroup": "Listes pour {groupName}", + "forGroupId": "Listes pour le groupe {groupId}", + "myLists": "Mes listes" }, "errors": { - "fetchFailed": "FR: Failed to fetch lists." + "fetchFailed": "Échec de la récupération des listes." } }, "groupsPage": { - "retryButton": "FR: Retry", + "retryButton": "Réessayer", "emptyState": { - "title": "FR: No Groups Yet!", - "description": "FR: You are not a member of any groups yet. Create one or join using an invite code.", - "createButton": "FR: Create New Group" + "title": "Pas encore de groupes !", + "description": "Vous n'êtes membre d'aucun groupe pour le moment. Créez-en un ou rejoignez-en un à l'aide d'un code d'invitation.", + "createButton": "Créer un nouveau groupe" }, "groupCard": { - "newListButton": "FR: List" + "newListButton": "Liste" }, "createCard": { - "title": "FR: + Group" + "title": "+ Groupe" }, "joinGroup": { - "title": "FR: Join a Group with Invite Code", - "inputLabel": "FR: Enter Invite Code", - "inputPlaceholder": "FR: Enter Invite Code", - "joinButton": "FR: Join" + "title": "Rejoindre un groupe avec un code d'invitation", + "inputLabel": "Entrez le code d'invitation", + "inputPlaceholder": "Entrez le code d'invitation", + "joinButton": "Rejoindre" }, "createDialog": { - "title": "FR: Create New Group", - "closeButtonLabel": "FR: Close", - "groupNameLabel": "FR: Group Name", - "cancelButton": "FR: Cancel", - "createButton": "FR: Create" + "title": "Créer un nouveau groupe", + "closeButtonLabel": "Fermer", + "groupNameLabel": "Nom du groupe", + "cancelButton": "Annuler", + "createButton": "Créer" }, "errors": { - "fetchFailed": "FR: Failed to load groups", - "groupNameRequired": "FR: Group name is required", - "createFailed": "FR: Failed to create group. Please try again.", - "inviteCodeRequired": "FR: Invite code is required", - "joinFailed": "FR: Failed to join group. Please check the invite code and try again.", - "invalidDataFromServer": "[TRANSLATE] Invalid data received from server.", - "createFailedConsole": "[TRANSLATE] Error creating group:", - "joinFailedConsole": "[TRANSLATE] Error joining group:" + "fetchFailed": "Échec du chargement des groupes", + "groupNameRequired": "Le nom du groupe est requis", + "createFailed": "Échec de la création du groupe. Veuillez réessayer.", + "inviteCodeRequired": "Le code d'invitation est requis", + "joinFailed": "Échec pour rejoindre le groupe. Veuillez vérifier le code d'invitation et réessayer.", + "invalidDataFromServer": "Données invalides reçues du serveur.", + "createFailedConsole": "Erreur lors de la création du groupe :", + "joinFailedConsole": "Erreur pour rejoindre le groupe :" }, "notifications": { - "groupCreatedSuccess": "FR: Group '{groupName}' created successfully.", - "joinSuccessNamed": "FR: Successfully joined group '{groupName}'.", - "joinSuccessGeneric": "FR: Successfully joined group.", - "listCreatedSuccess": "FR: List '{listName}' created successfully." + "groupCreatedSuccess": "Groupe '{groupName}' créé avec succès.", + "joinSuccessNamed": "Vous avez rejoint le groupe '{groupName}' avec succès.", + "joinSuccessGeneric": "Vous avez rejoint le groupe avec succès.", + "listCreatedSuccess": "Liste '{listName}' créée avec succès." } }, "authCallbackPage": { - "redirecting": "FR: Redirecting...", + "redirecting": "Redirection...", "errors": { - "authenticationFailed": "FR: Authentication failed", - "noTokenProvided": "[TRANSLATE] No token provided" + "authenticationFailed": "Échec de l'authentification", + "noTokenProvided": "Aucun jeton fourni" } }, "choresPage": { - "title": "FR: Chores", + "title": "Tâches", "tabs": { - "overdue": "FR: Overdue", - "today": "FR: Today", - "upcoming": "FR: Upcoming", - "allPending": "FR: All Pending", - "completed": "FR: Completed" + "overdue": "En retard", + "today": "Aujourd'hui", + "upcoming": "À venir", + "allPending": "Toutes en attente", + "completed": "Terminées" }, "viewToggle": { - "calendarLabel": "FR: Calendar View", - "calendarText": "FR: Calendar", - "listLabel": "FR: List View", - "listText": "FR: List" + "calendarLabel": "Vue Calendrier", + "calendarText": "Calendrier", + "listLabel": "Vue Liste", + "listText": "Liste" }, - "newChoreButtonLabel": "FR: New Chore", - "newChoreButtonText": "FR: New Chore", + "newChoreButtonLabel": "Nouvelle tâche", + "newChoreButtonText": "Nouvelle tâche", "loadingState": { - "loadingChores": "FR: Loading chores..." + "loadingChores": "Chargement des tâches..." }, "calendar": { - "prevMonthLabel": "FR: Previous month", - "nextMonthLabel": "FR: Next month", + "prevMonthLabel": "Mois précédent", + "nextMonthLabel": "Mois suivant", "weekdays": { - "sun": "FR: Sun", - "mon": "FR: Mon", - "tue": "FR: Tue", - "wed": "FR: Wed", - "thu": "FR: Thu", - "fri": "FR: Fri", - "sat": "FR: Sat" + "sun": "Dim", + "mon": "Lun", + "tue": "Mar", + "wed": "Mer", + "thu": "Jeu", + "fri": "Ven", + "sat": "Sam" }, - "addChoreToDayLabel": "FR: Add chore to this day", - "emptyState": "FR: No chores to display for this period." + "addChoreToDayLabel": "Ajouter une tâche à ce jour", + "emptyState": "Aucune tâche à afficher pour cette période." }, "listView": { - "choreTypePersonal": "FR: Personal", - "choreTypeGroupFallback": "FR: Group", - "completedDatePrefix": "FR: Completed:", + "choreTypePersonal": "Personnel", + "choreTypeGroupFallback": "Groupe", + "completedDatePrefix": "Terminée le :", "actions": { - "doneTitle": "FR: Mark as Done", - "doneText": "FR: Done", - "undoTitle": "FR: Mark as Not Done", - "undoText": "FR: Undo", - "editTitle": "FR: Edit", - "editLabel": "FR: Edit chore", - "editText": "FR: Edit", - "deleteTitle": "FR: Delete", - "deleteLabel": "FR: Delete chore", - "deleteText": "FR: Delete" + "doneTitle": "Marquer comme terminée", + "doneText": "Terminée", + "undoTitle": "Marquer comme non terminée", + "undoText": "Annuler", + "editTitle": "Modifier", + "editLabel": "Modifier la tâche", + "editText": "Modifier", + "deleteTitle": "Supprimer", + "deleteLabel": "Supprimer la tâche", + "deleteText": "Supprimer" }, "emptyState": { - "message": "FR: No chores in this view. Well done!", - "viewAllButton": "FR: View All Pending" + "message": "Aucune tâche dans cette vue. Bien joué !", + "viewAllButton": "Voir toutes les tâches en attente" } }, "choreModal": { - "editTitle": "FR: Edit Chore", - "newTitle": "FR: New Chore", - "closeButtonLabel": "FR: Close modal", - "nameLabel": "FR: Name", - "namePlaceholder": "FR: Enter chore name", - "typeLabel": "FR: Type", - "typePersonal": "FR: Personal", - "typeGroup": "FR: Group", - "groupLabel": "FR: Group", - "groupSelectDefault": "FR: Select a group", - "descriptionLabel": "FR: Description", - "descriptionPlaceholder": "FR: Add a description (optional)", - "frequencyLabel": "FR: Frequency", - "intervalLabel": "FR: Interval (days)", - "intervalPlaceholder": "FR: e.g. 3", - "dueDateLabel": "FR: Due Date", - "quickDueDateToday": "FR: Today", - "quickDueDateTomorrow": "FR: Tomorrow", - "quickDueDateNextWeek": "FR: Next Week", - "cancelButton": "FR: Cancel", - "saveButton": "FR: Save", - "intervalPlaceholder": "[TRANSLATE] e.g., 10" + "editTitle": "Modifier la tâche", + "newTitle": "Nouvelle tâche", + "closeButtonLabel": "Fermer la modale", + "nameLabel": "Nom", + "namePlaceholder": "Entrez le nom de la tâche", + "typeLabel": "Type", + "typePersonal": "Personnel", + "typeGroup": "Groupe", + "groupLabel": "Groupe", + "groupSelectDefault": "Sélectionnez un groupe", + "descriptionLabel": "Description", + "descriptionPlaceholder": "Ajoutez une description (facultatif)", + "frequencyLabel": "Fréquence", + "intervalLabel": "Intervalle (jours)", + "intervalPlaceholder": "ex: 10", + "dueDateLabel": "Date d'échéance", + "quickDueDateToday": "Aujourd'hui", + "quickDueDateTomorrow": "Demain", + "quickDueDateNextWeek": "Semaine prochaine", + "cancelButton": "Annuler", + "saveButton": "Enregistrer" }, "consoleErrors": { - "loadFailed": "[TRANSLATE] Failed to load all chores:", - "loadGroupsFailed": "[TRANSLATE] Failed to load groups", - "createAssignmentForNewChoreFailed": "[TRANSLATE] Failed to create assignment for new chore:", - "saveFailed": "[TRANSLATE] Failed to save chore:", - "deleteFailed": "[TRANSLATE] Failed to delete chore:", - "createAssignmentFailed": "[TRANSLATE] Failed to create assignment:", - "updateCompletionStatusFailed": "[TRANSLATE] Failed to update chore completion status:" + "loadFailed": "Échec du chargement de toutes les tâches :", + "loadGroupsFailed": "Échec du chargement des groupes", + "createAssignmentForNewChoreFailed": "Échec de la création de l'affectation pour la nouvelle tâche :", + "saveFailed": "Échec de l'enregistrement de la tâche :", + "deleteFailed": "Échec de la suppression de la tâche :", + "createAssignmentFailed": "Échec de la création de l'affectation :", + "updateCompletionStatusFailed": "Échec de la mise à jour du statut d'achèvement de la tâche :" }, "deleteDialog": { - "title": "FR: Delete Chore", - "confirmationText": "FR: Are you sure you want to delete this chore? This action cannot be undone.", - "deleteButton": "FR: Delete" + "title": "Supprimer la tâche", + "confirmationText": "Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action est irréversible.", + "deleteButton": "Supprimer" }, "shortcutsModal": { - "title": "FR: Keyboard Shortcuts", - "descNewChore": "FR: New Chore", - "descToggleView": "FR: Toggle View (List/Calendar)", - "descToggleShortcuts": "FR: Show/Hide Shortcuts", - "descCloseModal": "FR: Close any open Modal/Dialog" + "title": "Raccourcis clavier", + "descNewChore": "Nouvelle tâche", + "descToggleView": "Basculer la vue (Liste/Calendrier)", + "descToggleShortcuts": "Afficher/Masquer les raccourcis", + "descCloseModal": "Fermer toute modale/dialogue ouvert" }, "frequencyOptions": { - "oneTime": "FR: One Time", - "daily": "FR: Daily", - "weekly": "FR: Weekly", - "monthly": "FR: Monthly", - "custom": "FR: Custom" + "oneTime": "Une fois", + "daily": "Quotidien", + "weekly": "Hebdomadaire", + "monthly": "Mensuel", + "custom": "Personnalisé" + }, + "frequency": { + "customInterval": "Tous les {n} jour | Tous les {n} jours" }, "formatters": { - "noDueDate": "FR: No due date", - "dueToday": "FR: Due Today", - "dueTomorrow": "FR: Due Tomorrow", - "overdueFull": "FR: Overdue: {date}", - "dueFull": "FR: Due {date}", - "invalidDate": "FR: Invalid Date" + "noDueDate": "Pas de date d'échéance", + "dueToday": "Pour aujourd'hui", + "dueTomorrow": "Pour demain", + "overdueFull": "En retard : {date}", + "dueFull": "Échéance le {date}", + "invalidDate": "Date invalide" }, "notifications": { - "loadFailed": "FR: Failed to load chores", - "updateSuccess": "FR: Chore '{name}' updated successfully", - "createSuccess": "FR: Chore '{name}' created successfully", - "updateFailed": "FR: Failed to update chore", - "createFailed": "FR: Failed to create chore", - "deleteSuccess": "FR: Chore '{name}' deleted successfully", - "deleteFailed": "FR: Failed to delete chore", - "markedDone": "FR: {name} marked as done.", - "markedNotDone": "FR: {name} marked as not done.", - "statusUpdateFailed": "FR: Failed to update chore status." + "loadFailed": "Échec du chargement des tâches.", + "loadGroupsFailed": "Échec du chargement des groupes.", + "updateSuccess": "Tâche '{name}' mise à jour avec succès.", + "createSuccess": "Tâche '{name}' créée avec succès.", + "updateFailed": "Échec de la mise à jour de la tâche.", + "createFailed": "Échec de la création de la tâche.", + "deleteSuccess": "Tâche '{name}' supprimée avec succès.", + "deleteFailed": "Échec de la suppression de la tâche.", + "markedDone": "{name} marquée comme terminée.", + "markedNotDone": "{name} marquée comme non terminée.", + "statusUpdateFailed": "Échec de la mise à jour du statut de la tâche.", + "createAssignmentFailed": "Échec de la création de l'affectation pour la tâche." }, "validation": { - "nameRequired": "FR: Chore name is required.", - "groupRequired": "FR: Please select a group for group chores.", - "intervalRequired": "FR: Custom interval must be at least 1 day.", - "dueDateRequired": "FR: Due date is required.", - "invalidDueDate": "FR: Invalid due date format." + "nameRequired": "Le nom de la tâche est requis.", + "groupRequired": "Veuillez sélectionner un groupe pour les tâches de groupe.", + "intervalRequired": "L'intervalle personnalisé doit être d'au moins 1 jour.", + "dueDateRequired": "La date d'échéance est requise.", + "invalidDueDate": "Format de date d'échéance invalide." }, - "unsavedChangesConfirmation": "FR: You have unsaved changes in the chore form. Are you sure you want to leave?" + "unsavedChangesConfirmation": "Vous avez des modifications non enregistrées dans le formulaire de tâche. Êtes-vous sûr de vouloir quitter ?" }, "errorNotFoundPage": { - "errorCode": "FR: 404", - "errorMessage": "FR: Oops. Nothing here...", - "goHomeButton": "FR: Go Home" + "errorCode": "404", + "errorMessage": "Oups. Rien ici...", + "goHomeButton": "Aller à l'accueil" }, "groupDetailPage": { - "loadingLabel": "FR: Loading group details...", - "retryButton": "FR: Retry", - "groupNotFound": "FR: Group not found or an error occurred.", + "loadingLabel": "Chargement des détails du groupe...", + "retryButton": "Réessayer", + "groupNotFound": "Groupe non trouvé ou une erreur s'est produite.", "members": { - "title": "FR: Group Members", - "defaultRole": "FR: Member", - "removeButton": "FR: Remove", - "emptyState": "FR: No members found.", - "closeMenuLabel": "[TRANSLATE] Close menu" + "title": "Membres du groupe", + "defaultRole": "Membre", + "removeButton": "Retirer", + "emptyState": "Aucun membre trouvé.", + "closeMenuLabel": "Fermer le menu" }, "invites": { - "title": "FR: Invite Members", - "description": "[TRANSLATE] Invite new members by generating a shareable code.", - "addMemberButtonLabel": "[TRANSLATE] Add member", - "closeInviteLabel": "[TRANSLATE] Close invite", - "regenerateButton": "FR: Regenerate Invite Code", - "generateButton": "FR: Generate Invite Code", - "activeCodeLabel": "FR: Current Active Invite Code:", - "copyButtonLabel": "FR: Copy invite code", - "copySuccess": "FR: Invite code copied to clipboard!", - "emptyState": "FR: No active invite code. Click the button above to generate one.", + "title": "Inviter des membres", + "description": "Invitez de nouveaux membres en générant un code partageable.", + "addMemberButtonLabel": "Ajouter un membre", + "closeInviteLabel": "Fermer l'invitation", + "regenerateButton": "Régénérer le code d'invitation", + "generateButton": "Générer le code d'invitation", + "activeCodeLabel": "Code d'invitation actif actuel :", + "copyButtonLabel": "Copier le code d'invitation", + "copySuccess": "Code d'invitation copié dans le presse-papiers !", + "emptyState": "Aucun code d'invitation actif. Cliquez sur le bouton ci-dessus pour en générer un.", "errors": { - "newDataInvalid": "FR: New invite code data is invalid." + "newDataInvalid": "Les données du nouveau code d'invitation sont invalides." } }, "errors": { - "failedToFetchActiveInvite": "[TRANSLATE] Failed to fetch active invite code.", - "failedToFetchGroupDetails": "[TRANSLATE] Failed to fetch group details.", - "failedToLoadUpcomingChores": "[TRANSLATE] Error loading upcoming chores:", - "failedToLoadRecentExpenses": "[TRANSLATE] Error loading recent expenses:" + "failedToFetchActiveInvite": "Échec de la récupération du code d'invitation actif.", + "failedToFetchGroupDetails": "Échec de la récupération des détails du groupe.", + "failedToLoadUpcomingChores": "Erreur lors du chargement des tâches à venir :", + "failedToLoadRecentExpenses": "Erreur lors du chargement des dépenses récentes :" }, "console": { - "noActiveInvite": "[TRANSLATE] No active invite code found for this group." + "noActiveInvite": "Aucun code d'invitation actif trouvé pour ce groupe." }, "chores": { - "title": "FR: Group Chores", - "manageButton": "FR: Manage Chores", - "duePrefix": "FR: Due:", - "emptyState": "FR: No chores scheduled. Click \"Manage Chores\" to create some!" + "title": "Tâches du groupe", + "manageButton": "Gérer les tâches", + "duePrefix": "Échéance :", + "emptyState": "Aucune tâche planifiée. Cliquez sur \"Gérer les tâches\" pour en créer !" }, "expenses": { - "title": "FR: Group Expenses", - "manageButton": "FR: Manage Expenses", - "emptyState": "FR: No expenses recorded. Click \"Manage Expenses\" to add some!", - "fallbackUserName": "[TRANSLATE] User ID: {userId}", - "activityByUserFallback": "[TRANSLATE] User {userId}", + "title": "Dépenses du groupe", + "manageButton": "Gérer les dépenses", + "emptyState": "Aucune dépense enregistrée. Cliquez sur \"Gérer les dépenses\" pour en ajouter !", + "paidBy": "Payé par :", + "owes": "doit", + "paidAmount": "Payé :", + "onDate": "le", + "settleShareButton": "Régler ma part", + "activityLabel": "Activité :", + "byUser": "par", + "fallbackUserName": "ID utilisateur : {userId}", + "activityByUserFallback": "Utilisateur {userId}", "splitTypes": { - "equal": "FR: Equal", - "exactAmounts": "FR: Exact Amounts", - "percentage": "FR: Percentage", - "shares": "FR: Shares", - "itemBased": "FR: Item Based" + "equal": "Égal", + "exactAmounts": "Montants exacts", + "percentage": "Pourcentage", + "shares": "Parts", + "itemBased": "Basé sur l'article" } }, "notifications": { - "fetchDetailsFailed": "FR: Failed to fetch group details.", - "fetchInviteFailed": "FR: Failed to fetch active invite code.", - "generateInviteSuccess": "FR: New invite code generated successfully!", - "generateInviteError": "FR: Failed to generate invite code.", - "clipboardNotSupported": "FR: Clipboard not supported or no code to copy.", - "copyInviteFailed": "FR: Failed to copy invite code.", - "removeMemberSuccess": "FR: Member removed successfully", - "removeMemberFailed": "FR: Failed to remove member" + "fetchDetailsFailed": "Échec de la récupération des détails du groupe.", + "fetchInviteFailed": "Échec de la récupération du code d'invitation actif.", + "generateInviteSuccess": "Nouveau code d'invitation généré avec succès !", + "generateInviteError": "Échec de la génération du code d'invitation.", + "clipboardNotSupported": "Presse-papiers non pris en charge ou aucun code à copier.", + "copyInviteFailed": "Échec de la copie du code d'invitation.", + "removeMemberSuccess": "Membre retiré avec succès", + "removeMemberFailed": "Échec du retrait du membre", + "loadExpensesFailed": "Échec du chargement des dépenses récentes.", + "cannotSettleOthersShares": "Vous ne pouvez régler que vos propres parts.", + "settlementDataMissing": "Impossible de traiter le règlement : données manquantes.", + "settleShareSuccess": "Part réglée avec succès !", + "settleShareFailed": "Échec du règlement de la part." + }, + "loading": { + "settlement": "Traitement du règlement..." + }, + "settleShareModal": { + "title": "Régler la part", + "settleAmountFor": "Régler le montant pour {userName} :", + "amountLabel": "Montant", + "cancelButton": "Annuler", + "confirmButton": "Confirmer", + "errors": { + "enterAmount": "Veuillez entrer un montant.", + "positiveAmount": "Veuillez entrer un montant positif.", + "exceedsRemaining": "Le montant ne peut pas dépasser le reste : {amount}.", + "noSplitSelected": "Erreur : Aucune répartition sélectionnée." + } + }, + "status": { + "settled": "Réglé", + "partiallySettled": "Partiellement réglé", + "unsettled": "Non réglé", + "paid": "Payé", + "partiallyPaid": "Partiellement payé", + "unpaid": "Non payé", + "unknown": "Statut inconnu" } }, "accountPage": { - "title": "Account Settings", - "loadingProfile": "Loading profile...", - "retryButton": "Retry", + "title": "Paramètres du compte", + "loadingProfile": "Chargement du profil...", + "retryButton": "Réessayer", "profileSection": { - "header": "Profile Information", - "nameLabel": "Name", - "emailLabel": "Email", - "saveButton": "Save Changes" + "header": "Informations du profil", + "nameLabel": "Nom", + "emailLabel": "E-mail", + "saveButton": "Enregistrer les modifications" }, "passwordSection": { - "header": "Change Password", - "currentPasswordLabel": "Current Password", - "newPasswordLabel": "New Password", - "changeButton": "Change Password" + "header": "Changer le mot de passe", + "currentPasswordLabel": "Mot de passe actuel", + "newPasswordLabel": "Nouveau mot de passe", + "changeButton": "Changer le mot de passe" }, "notificationsSection": { - "header": "Notification Preferences", - "emailNotificationsLabel": "Email Notifications", - "emailNotificationsDescription": "Receive email notifications for important updates", - "listUpdatesLabel": "List Updates", - "listUpdatesDescription": "Get notified when lists are updated", - "groupActivitiesLabel": "Group Activities", - "groupActivitiesDescription": "Receive notifications for group activities" + "header": "Préférences de notification", + "emailNotificationsLabel": "Notifications par e-mail", + "emailNotificationsDescription": "Recevoir des notifications par e-mail pour les mises à jour importantes", + "listUpdatesLabel": "Mises à jour des listes", + "listUpdatesDescription": "Être notifié lorsque les listes sont mises à jour", + "groupActivitiesLabel": "Activités de groupe", + "groupActivitiesDescription": "Recevoir des notifications pour les activités de groupe" }, "notifications": { - "profileLoadFailed": "Failed to load profile", - "profileUpdateSuccess": "Profile updated successfully", - "profileUpdateFailed": "Failed to update profile", - "passwordFieldsRequired": "Please fill in both current and new password fields.", - "passwordTooShort": "New password must be at least 8 characters long.", - "passwordChangeSuccess": "Password changed successfully", - "passwordChangeFailed": "Failed to change password", - "preferencesUpdateSuccess": "Preferences updated successfully", - "preferencesUpdateFailed": "Failed to update preferences" + "profileLoadFailed": "Échec du chargement du profil", + "profileUpdateSuccess": "Profil mis à jour avec succès", + "profileUpdateFailed": "Échec de la mise à jour du profil", + "passwordFieldsRequired": "Veuillez remplir les champs du mot de passe actuel et du nouveau mot de passe.", + "passwordTooShort": "Le nouveau mot de passe doit comporter au moins 8 caractères.", + "passwordChangeSuccess": "Mot de passe changé avec succès", + "passwordChangeFailed": "Échec du changement de mot de passe", + "preferencesUpdateSuccess": "Préférences mises à jour avec succès", + "preferencesUpdateFailed": "Échec de la mise à jour des préférences" }, - "saving": "Saving..." + "saving": "Enregistrement..." }, "signupPage": { - "header": "Sign Up", - "fullNameLabel": "Full Name", - "emailLabel": "Email", - "passwordLabel": "Password", - "confirmPasswordLabel": "Confirm Password", - "togglePasswordVisibility": "Toggle password visibility", - "submitButton": "Sign Up", - "loginLink": "Already have an account? Login", + "header": "S'inscrire", + "fullNameLabel": "Nom complet", + "emailLabel": "E-mail", + "passwordLabel": "Mot de passe", + "confirmPasswordLabel": "Confirmer le mot de passe", + "togglePasswordVisibility": "Basculer la visibilité du mot de passe", + "submitButton": "S'inscrire", + "loginLink": "Vous avez déjà un compte ? Connexion", "validation": { - "nameRequired": "Name is required", - "emailRequired": "Email is required", - "emailInvalid": "Invalid email format", - "passwordRequired": "Password is required", - "passwordLength": "Password must be at least 8 characters", - "confirmPasswordRequired": "Please confirm your password", - "passwordsNoMatch": "Passwords do not match" + "nameRequired": "Le nom est requis", + "emailRequired": "L'e-mail est requis", + "emailInvalid": "Format d'e-mail invalide", + "passwordRequired": "Le mot de passe est requis", + "passwordLength": "Le mot de passe doit comporter au moins 8 caractères", + "confirmPasswordRequired": "Veuillez confirmer votre mot de passe", + "passwordsNoMatch": "Les mots de passe ne correspondent pas" }, "notifications": { - "signupFailed": "Signup failed. Please try again.", - "signupSuccess": "Account created successfully. Please login." + "signupFailed": "Échec de l'inscription. Veuillez réessayer.", + "signupSuccess": "Compte créé avec succès. Veuillez vous connecter." } }, "listDetailPage": { "loading": { - "list": "Loading list...", - "items": "Loading items...", - "ocrProcessing": "Processing image...", - "addingOcrItems": "Adding OCR items...", - "costSummary": "Loading summary...", - "expenses": "Loading expenses...", - "settlement": "Processing settlement..." + "list": "Chargement de la liste...", + "items": "Chargement des articles...", + "ocrProcessing": "Traitement de l'image...", + "addingOcrItems": "Ajout des articles OCR...", + "costSummary": "Chargement du résumé...", + "expenses": "Chargement des dépenses...", + "settlement": "Traitement du règlement..." }, "errors": { - "fetchFailed": "Failed to load list details.", - "genericLoadFailure": "Group not found or an error occurred.", - "ocrNoItems": "No items extracted from the image.", - "ocrFailed": "Failed to process image.", - "addItemFailed": "Failed to add item.", - "updateItemFailed": "Failed to update item.", - "updateItemPriceFailed": "Failed to update item price.", - "deleteItemFailed": "Failed to delete item.", - "addOcrItemsFailed": "Failed to add OCR items.", - "fetchItemsFailed": "Failed to load items: {errorMessage}", - "loadCostSummaryFailed": "Failed to load cost summary." + "fetchFailed": "Échec du chargement des détails de la liste.", + "genericLoadFailure": "Groupe non trouvé ou une erreur s'est produite.", + "ocrNoItems": "Aucun article extrait de l'image.", + "ocrFailed": "Échec du traitement de l'image.", + "addItemFailed": "Échec de l'ajout de l'article.", + "updateItemFailed": "Échec de la mise à jour de l'article.", + "updateItemPriceFailed": "Échec de la mise à jour du prix de l'article.", + "deleteItemFailed": "Échec de la suppression de l'article.", + "addOcrItemsFailed": "Échec de l'ajout des articles OCR.", + "fetchItemsFailed": "Échec du chargement des articles : {errorMessage}", + "loadCostSummaryFailed": "Échec du chargement du résumé des coûts." }, - "retryButton": "Retry", + "retryButton": "Réessayer", "buttons": { - "addViaOcr": "Add via OCR", - "addItem": "Add", - "addItems": "Add Items", - "cancel": "Cancel", - "confirm": "Confirm", - "saveChanges": "Save Changes", - "close": "Close", - "costSummary": "Cost Summary" + "addViaOcr": "Ajouter via OCR", + "addItem": "Ajouter", + "addItems": "Ajouter des articles", + "cancel": "Annuler", + "confirm": "Confirmer", + "saveChanges": "Enregistrer les modifications", + "close": "Fermer", + "costSummary": "Résumé des coûts" }, "badges": { - "groupList": "Group List", - "personalList": "Personal List" + "groupList": "Liste de groupe", + "personalList": "Liste personnelle" }, "items": { "emptyState": { - "title": "No Items Yet!", - "message": "Add some items using the form below." + "title": "Pas encore d'articles !", + "message": "Ajoutez des articles en utilisant le formulaire ci-dessous." }, "addItemForm": { - "placeholder": "Add a new item", - "quantityPlaceholder": "Qty", - "itemNameSrLabel": "New item name", - "quantitySrLabel": "Quantity" + "placeholder": "Ajouter un nouvel article", + "quantityPlaceholder": "Qté", + "itemNameSrLabel": "Nom du nouvel article", + "quantitySrLabel": "Quantité" }, - "pricePlaceholder": "Price", - "editItemAriaLabel": "Edit item", - "deleteItemAriaLabel": "Delete item" + "pricePlaceholder": "Prix", + "editItemAriaLabel": "Modifier l'article", + "deleteItemAriaLabel": "Supprimer l'article" }, "modals": { "ocr": { - "title": "Add Items via OCR", - "uploadLabel": "Upload Image" + "title": "Ajouter des articles via OCR", + "uploadLabel": "Télécharger une image" }, "confirmation": { "title": "Confirmation" }, "editItem": { - "title": "Edit Item", - "nameLabel": "Item Name", - "quantityLabel": "Quantity" + "title": "Modifier l'article", + "nameLabel": "Nom de l'article", + "quantityLabel": "Quantité" }, "costSummary": { - "title": "List Cost Summary", - "totalCostLabel": "Total List Cost:", - "equalShareLabel": "Equal Share Per User:", - "participantsLabel": "Participating Users:", - "userBalancesHeader": "User Balances", + "title": "Résumé des coûts de la liste", + "totalCostLabel": "Coût total de la liste :", + "equalShareLabel": "Part égale par utilisateur :", + "participantsLabel": "Utilisateurs participants :", + "userBalancesHeader": "Soldes des utilisateurs", "tableHeaders": { - "user": "User", - "itemsAddedValue": "Items Added Value", - "amountDue": "Amount Due", - "balance": "Balance" + "user": "Utilisateur", + "itemsAddedValue": "Valeur des articles ajoutés", + "amountDue": "Montant dû", + "balance": "Solde" }, - "emptyState": "No cost summary available." + "emptyState": "Aucun résumé des coûts disponible." }, "settleShare": { - "title": "Settle Share", - "settleAmountFor": "Settle amount for {userName}:", - "amountLabel": "Amount", + "title": "Régler la part", + "settleAmountFor": "Régler le montant pour {userName} :", + "amountLabel": "Montant", "errors": { - "enterAmount": "Please enter an amount.", - "positiveAmount": "Please enter a positive amount.", - "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", - "noSplitSelected": "Error: No split selected." + "enterAmount": "Veuillez entrer un montant.", + "positiveAmount": "Veuillez entrer un montant positif.", + "exceedsRemaining": "Le montant ne peut pas dépasser le reste : {amount}.", + "noSplitSelected": "Erreur : Aucune répartition sélectionnée." } } }, "confirmations": { - "updateMessage": "Mark '{itemName}' as {status}?", - "statusComplete": "complete", - "statusIncomplete": "incomplete", - "deleteMessage": "Delete '{itemName}'? This cannot be undone." + "updateMessage": "Marquer '{itemName}' comme {status} ?", + "statusComplete": "terminé", + "statusIncomplete": "incomplet", + "deleteMessage": "Supprimer '{itemName}' ? Ceci ne peut pas être annulé." }, "notifications": { - "itemAddedSuccess": "Item added successfully.", - "itemsAddedSuccessOcr": "{count} item(s) added successfully from OCR.", - "itemUpdatedSuccess": "Item updated successfully.", - "itemDeleteSuccess": "Item deleted successfully.", - "enterItemName": "Please enter an item name.", - "costSummaryLoadFailed": "Failed to load cost summary.", - "cannotSettleOthersShares": "You can only settle your own shares.", - "settlementDataMissing": "Cannot process settlement: missing data.", - "settleShareSuccess": "Share settled successfully!", - "settleShareFailed": "Failed to settle share." + "itemAddedSuccess": "Article ajouté avec succès.", + "itemsAddedSuccessOcr": "{count} article(s) ajouté(s) avec succès depuis l'OCR.", + "itemUpdatedSuccess": "Article mis à jour avec succès.", + "itemDeleteSuccess": "Article supprimé avec succès.", + "enterItemName": "Veuillez entrer un nom d'article.", + "costSummaryLoadFailed": "Échec du chargement du résumé des coûts.", + "cannotSettleOthersShares": "Vous ne pouvez régler que vos propres parts.", + "settlementDataMissing": "Impossible de traiter le règlement : données manquantes.", + "settleShareSuccess": "Part réglée avec succès !", + "settleShareFailed": "Échec du règlement de la part." }, "expensesSection": { - "title": "Expenses", - "addExpenseButton": "Add Expense", - "loading": "Loading expenses...", - "emptyState": "No expenses recorded for this list yet.", - "paidBy": "Paid by:", - "onDate": "on", - "owes": "owes", - "paidAmount": "Paid:", - "activityLabel": "Activity:", - "byUser": "by", - "settleShareButton": "Settle My Share", - "retryButton": "Retry" + "title": "Dépenses", + "addExpenseButton": "Ajouter une dépense", + "loading": "Chargement des dépenses...", + "emptyState": "Aucune dépense enregistrée pour cette liste pour le moment.", + "paidBy": "Payé par :", + "onDate": "le", + "owes": "doit", + "paidAmount": "Payé :", + "activityLabel": "Activité :", + "byUser": "par", + "settleShareButton": "Régler ma part", + "retryButton": "Réessayer" }, "status": { - "settled": "Settled", - "partiallySettled": "Partially Settled", - "unsettled": "Unsettled", - "paid": "Paid", - "partiallyPaid": "Partially Paid", - "unpaid": "Unpaid", - "unknown": "Unknown Status" + "settled": "Réglé", + "partiallySettled": "Partiellement réglé", + "unsettled": "Non réglé", + "paid": "Payé", + "partiallyPaid": "Partiellement payé", + "unpaid": "Non payé", + "unknown": "Statut inconnu" } }, "myChoresPage": { - "title": "My Assigned Chores", - "showCompletedToggle": "Show Completed", + "title": "Mes tâches assignées", + "showCompletedToggle": "Afficher les tâches terminées", "timelineHeaders": { - "overdue": "Overdue", - "today": "Due Today", - "thisWeek": "This Week", - "later": "Later", - "completed": "Completed" + "overdue": "En retard", + "today": "Pour aujourd'hui", + "thisWeek": "Cette semaine", + "later": "Plus tard", + "completed": "Terminées" }, "choreCard": { - "personal": "Personal", - "group": "Group", - "duePrefix": "Due", - "completedPrefix": "Completed", - "dueToday": "Due Today", - "markCompleteButton": "Mark Complete" + "personal": "Personnel", + "group": "Groupe", + "duePrefix": "Échéance", + "completedPrefix": "Terminée", + "dueToday": "Pour aujourd'hui", + "markCompleteButton": "Marquer comme terminée" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Une fois", + "daily": "Quotidien", + "weekly": "Hebdomadaire", + "monthly": "Mensuel", + "custom": "Personnalisé", + "unknown": "Fréquence inconnue" }, "dates": { - "invalidDate": "Invalid Date", - "unknownDate": "Unknown Date" + "invalidDate": "Date invalide", + "unknownDate": "Date inconnue" }, "emptyState": { - "title": "No Assignments Yet!", - "noAssignmentsPending": "You have no pending chore assignments.", - "noAssignmentsAll": "You have no chore assignments (completed or pending).", - "viewAllChoresButton": "View All Chores" + "title": "Pas encore d'affectations !", + "noAssignmentsPending": "Vous n'avez aucune affectation de tâche en attente.", + "noAssignmentsAll": "Vous n'avez aucune affectation de tâche (terminée ou en attente).", + "viewAllChoresButton": "Voir toutes les tâches" }, "notifications": { - "loadFailed": "Failed to load assignments", - "markedComplete": "Marked \"{choreName}\" as complete!", - "markCompleteFailed": "Failed to mark assignment as complete" + "loadFailed": "Échec du chargement des affectations", + "markedComplete": "\"{choreName}\" marquée comme terminée !", + "markCompleteFailed": "Échec du marquage de l'affectation comme terminée" } }, "personalChoresPage": { - "title": "Personal Chores", - "newChoreButton": "New Chore", - "editButton": "Edit", - "deleteButton": "Delete", - "cancelButton": "Cancel", - "saveButton": "Save", + "title": "Tâches personnelles", + "newChoreButton": "Nouvelle tâche", + "editButton": "Modifier", + "deleteButton": "Supprimer", + "cancelButton": "Annuler", + "saveButton": "Enregistrer", "modals": { - "editChoreTitle": "Edit Chore", - "newChoreTitle": "New Chore", - "deleteChoreTitle": "Delete Chore" + "editChoreTitle": "Modifier la tâche", + "newChoreTitle": "Nouvelle tâche", + "deleteChoreTitle": "Supprimer la tâche" }, "form": { - "nameLabel": "Name", + "nameLabel": "Nom", "descriptionLabel": "Description", - "frequencyLabel": "Frequency", - "intervalLabel": "Interval (days)", - "dueDateLabel": "Next Due Date" + "frequencyLabel": "Fréquence", + "intervalLabel": "Intervalle (jours)", + "dueDateLabel": "Prochaine date d'échéance" }, "deleteDialog": { - "confirmationText": "Are you sure you want to delete this chore?" + "confirmationText": "Êtes-vous sûr de vouloir supprimer cette tâche ?" }, "frequencies": { - "one_time": "One Time", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", - "custom": "Custom", - "unknown": "Unknown Frequency" + "one_time": "Une fois", + "daily": "Quotidien", + "weekly": "Hebdomadaire", + "monthly": "Mensuel", + "custom": "Personnalisé", + "unknown": "Fréquence inconnue" }, "dates": { - "invalidDate": "Invalid Date", - "duePrefix": "Due" + "invalidDate": "Date invalide", + "duePrefix": "Échéance" }, "notifications": { - "loadFailed": "Failed to load personal chores", - "updateSuccess": "Personal chore updated successfully", - "createSuccess": "Personal chore created successfully", - "saveFailed": "Failed to save personal chore", - "deleteSuccess": "Personal chore deleted successfully", - "deleteFailed": "Failed to delete personal chore" + "loadFailed": "Échec du chargement des tâches personnelles", + "updateSuccess": "Tâche personnelle mise à jour avec succès", + "createSuccess": "Tâche personnelle créée avec succès", + "saveFailed": "Échec de l'enregistrement de la tâche personnelle", + "deleteSuccess": "Tâche personnelle supprimée avec succès", + "deleteFailed": "Échec de la suppression de la tâche personnelle" } }, "indexPage": { - "welcomeMessage": "Welcome to Valerie UI App", - "mainPageInfo": "This is the main index page.", - "sampleTodosHeader": "Sample Todos (from IndexPage data)", - "totalCountLabel": "Total count from meta:", - "noTodos": "No todos to display." + "welcomeMessage": "Bienvenue sur l'application Valerie UI", + "mainPageInfo": "Ceci est la page d'index principale.", + "sampleTodosHeader": "Exemples de tâches (depuis les données IndexPage)", + "totalCountLabel": "Nombre total depuis meta :", + "noTodos": "Aucune tâche à afficher." } -} +} \ No newline at end of file diff --git a/fe/src/i18n/index.ts b/fe/src/i18n/index.ts index cf5cbc9..fc030cf 100644 --- a/fe/src/i18n/index.ts +++ b/fe/src/i18n/index.ts @@ -1,11 +1,13 @@ import en from './en.json'; import de from './de.json'; +import nl from './nl.json'; import fr from './fr.json'; import es from './es.json'; export default { en, de, + nl, fr, es }; diff --git a/fe/src/i18n/nl.json b/fe/src/i18n/nl.json new file mode 100644 index 0000000..4e017bb --- /dev/null +++ b/fe/src/i18n/nl.json @@ -0,0 +1,631 @@ +{ + "message": { + "hello": "Hallo" + }, + "loginPage": { + "emailLabel": "E-mail", + "passwordLabel": "Wachtwoord", + "togglePasswordVisibilityLabel": "Wachtwoord zichtbaarheid wisselen", + "loginButton": "Inloggen", + "signupLink": "Geen account? Aanmelden", + "errors": { + "emailRequired": "E-mail is vereist", + "emailInvalid": "Ongeldig e-mailformaat", + "passwordRequired": "Wachtwoord is vereist", + "loginFailed": "Inloggen mislukt. Controleer uw gegevens." + }, + "notifications": { + "loginSuccess": "Succesvol ingelogd" + } + }, + "listsPage": { + "retryButton": "Opnieuw proberen", + "emptyState": { + "noListsForGroup": "Geen lijsten gevonden voor deze groep.", + "noListsYet": "U heeft nog geen lijsten.", + "personalGlobalInfo": "Maak een persoonlijke lijst of word lid van een groep om gedeelde lijsten te zien.", + "groupSpecificInfo": "Deze groep heeft nog geen lijsten." + }, + "createNewListButton": "Nieuwe lijst maken", + "loadingLists": "Lijsten laden...", + "noDescription": "Geen beschrijving", + "addItemPlaceholder": "Nieuw item toevoegen...", + "createCard": { + "title": "+ Lijst" + }, + "pageTitle": { + "forGroup": "Lijsten voor {groupName}", + "forGroupId": "Lijsten voor Groep {groupId}", + "myLists": "Mijn Lijsten" + }, + "errors": { + "fetchFailed": "Ophalen van lijsten mislukt." + } + }, + "groupsPage": { + "retryButton": "Opnieuw proberen", + "emptyState": { + "title": "Nog geen groepen!", + "description": "U bent nog geen lid van groepen. Maak er een aan of word lid met een uitnodigingscode.", + "createButton": "Nieuwe groep maken" + }, + "groupCard": { + "newListButton": "Lijst" + }, + "createCard": { + "title": "+ Groep" + }, + "joinGroup": { + "title": "Lid worden van een groep met uitnodigingscode", + "inputLabel": "Voer uitnodigingscode in", + "inputPlaceholder": "Voer uitnodigingscode in", + "joinButton": "Deelnemen" + }, + "createDialog": { + "title": "Nieuwe groep maken", + "closeButtonLabel": "Sluiten", + "groupNameLabel": "Groepsnaam", + "cancelButton": "Annuleren", + "createButton": "Maken" + }, + "errors": { + "fetchFailed": "Laden van groepen mislukt", + "groupNameRequired": "Groepsnaam is vereist", + "createFailed": "Maken van groep mislukt. Probeer het opnieuw.", + "inviteCodeRequired": "Uitnodigingscode is vereist", + "joinFailed": "Deelnemen aan groep mislukt. Controleer de uitnodigingscode en probeer het opnieuw.", + "invalidDataFromServer": "Ongeldige gegevens ontvangen van server.", + "createFailedConsole": "Fout bij het maken van groep:", + "joinFailedConsole": "Fout bij het deelnemen aan groep:" + }, + "notifications": { + "groupCreatedSuccess": "Groep '{groupName}' succesvol aangemaakt.", + "joinSuccessNamed": "Succesvol lid geworden van groep '{groupName}'.", + "joinSuccessGeneric": "Succesvol lid geworden van groep.", + "listCreatedSuccess": "Lijst '{listName}' succesvol aangemaakt." + } + }, + "authCallbackPage": { + "redirecting": "Bezig met omleiden...", + "errors": { + "authenticationFailed": "Authenticatie mislukt", + "noTokenProvided": "Geen token opgegeven" + } + }, + "choresPage": { + "title": "Taken", + "tabs": { + "overdue": "Achterstallig", + "today": "Vandaag", + "upcoming": "Aankomend", + "allPending": "Alle openstaande", + "completed": "Voltooid" + }, + "viewToggle": { + "calendarLabel": "Kalenderweergave", + "calendarText": "Kalender", + "listLabel": "Lijstweergave", + "listText": "Lijst" + }, + "newChoreButtonLabel": "Nieuwe taak", + "newChoreButtonText": "Nieuwe taak", + "loadingState": { + "loadingChores": "Taken laden..." + }, + "calendar": { + "prevMonthLabel": "Vorige maand", + "nextMonthLabel": "Volgende maand", + "weekdays": { + "sun": "Zo", + "mon": "Ma", + "tue": "Di", + "wed": "Wo", + "thu": "Do", + "fri": "Vr", + "sat": "Za" + }, + "addChoreToDayLabel": "Taak aan deze dag toevoegen", + "emptyState": "Geen taken om weer te geven voor deze periode." + }, + "listView": { + "choreTypePersonal": "Persoonlijk", + "choreTypeGroupFallback": "Groep", + "completedDatePrefix": "Voltooid:", + "actions": { + "doneTitle": "Markeer als voltooid", + "doneText": "Gedaan", + "undoTitle": "Markeer als niet voltooid", + "undoText": "Ongedaan maken", + "editTitle": "Bewerken", + "editLabel": "Taak bewerken", + "editText": "Bewerken", + "deleteTitle": "Verwijderen", + "deleteLabel": "Taak verwijderen", + "deleteText": "Verwijderen" + }, + "emptyState": { + "message": "Geen taken in deze weergave. Goed gedaan!", + "viewAllButton": "Alle openstaande bekijken" + } + }, + "choreModal": { + "editTitle": "Taak bewerken", + "newTitle": "Nieuwe taak", + "closeButtonLabel": "Modal sluiten", + "nameLabel": "Naam", + "namePlaceholder": "Voer taaknaam in", + "typeLabel": "Type", + "typePersonal": "Persoonlijk", + "typeGroup": "Groep", + "groupLabel": "Groep", + "groupSelectDefault": "Selecteer een groep", + "descriptionLabel": "Beschrijving", + "descriptionPlaceholder": "Voeg een beschrijving toe (optioneel)", + "frequencyLabel": "Frequentie", + "intervalLabel": "Interval (dagen)", + "intervalPlaceholder": "bijv. 10", + "dueDateLabel": "Vervaldatum", + "quickDueDateToday": "Vandaag", + "quickDueDateTomorrow": "Morgen", + "quickDueDateNextWeek": "Volgende week", + "cancelButton": "Annuleren", + "saveButton": "Opslaan" + }, + "consoleErrors": { + "loadFailed": "Laden van alle taken mislukt:", + "loadGroupsFailed": "Laden van groepen mislukt", + "createAssignmentForNewChoreFailed": "Toewijzing voor nieuwe taak kon niet worden gemaakt:", + "saveFailed": "Opslaan van taak mislukt:", + "deleteFailed": "Verwijderen van taak mislukt:", + "createAssignmentFailed": "Toewijzing kon niet worden gemaakt:", + "updateCompletionStatusFailed": "Voltooiingsstatus van taak kon niet worden bijgewerkt:" + }, + "deleteDialog": { + "title": "Taak verwijderen", + "confirmationText": "Weet u zeker dat u deze taak wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "deleteButton": "Verwijderen" + }, + "shortcutsModal": { + "title": "Sneltoetsen", + "descNewChore": "Nieuwe taak", + "descToggleView": "Weergave wisselen (Lijst/Kalender)", + "descToggleShortcuts": "Sneltoetsen tonen/verbergen", + "descCloseModal": "Open Modal/Dialoog sluiten" + }, + "frequencyOptions": { + "oneTime": "Eenmalig", + "daily": "Dagelijks", + "weekly": "Wekelijks", + "monthly": "Maandelijks", + "custom": "Aangepast" + }, + "frequency": { + "customInterval": "Elke {n} dag | Elke {n} dagen" + }, + "formatters": { + "noDueDate": "Geen vervaldatum", + "dueToday": "Vandaag te doen", + "dueTomorrow": "Morgen te doen", + "overdueFull": "Achterstallig: {date}", + "dueFull": "Vervalt op {date}", + "invalidDate": "Ongeldige datum" + }, + "notifications": { + "loadFailed": "Laden van taken mislukt.", + "loadGroupsFailed": "Laden van groepen mislukt.", + "updateSuccess": "Taak '{name}' succesvol bijgewerkt.", + "createSuccess": "Taak '{name}' succesvol aangemaakt.", + "updateFailed": "Bijwerken van taak mislukt.", + "createFailed": "Aanmaken van taak mislukt.", + "deleteSuccess": "Taak '{name}' succesvol verwijderd.", + "deleteFailed": "Verwijderen van taak mislukt.", + "markedDone": "{name} gemarkeerd als voltooid.", + "markedNotDone": "{name} gemarkeerd als niet voltooid.", + "statusUpdateFailed": "Status van taak kon niet worden bijgewerkt.", + "createAssignmentFailed": "Toewijzing voor taak kon niet worden gemaakt." + }, + "validation": { + "nameRequired": "Taaknaam is vereist.", + "groupRequired": "Selecteer een groep voor groepstaken.", + "intervalRequired": "Aangepast interval moet minimaal 1 dag zijn.", + "dueDateRequired": "Vervaldatum is vereist.", + "invalidDueDate": "Ongeldig formaat vervaldatum." + }, + "unsavedChangesConfirmation": "U heeft niet-opgeslagen wijzigingen in het taakformulier. Weet u zeker dat u wilt vertrekken?" + }, + "errorNotFoundPage": { + "errorCode": "404", + "errorMessage": "Oeps. Hier is niets...", + "goHomeButton": "Naar de startpagina" + }, + "groupDetailPage": { + "loadingLabel": "Groepsdetails laden...", + "retryButton": "Opnieuw proberen", + "groupNotFound": "Groep niet gevonden of er is een fout opgetreden.", + "members": { + "title": "Groepsleden", + "defaultRole": "Lid", + "removeButton": "Verwijderen", + "emptyState": "Geen leden gevonden.", + "closeMenuLabel": "Menu sluiten" + }, + "invites": { + "title": "Leden uitnodigen", + "description": "Nodig nieuwe leden uit door een deelbare code te genereren.", + "addMemberButtonLabel": "Lid toevoegen", + "closeInviteLabel": "Uitnodiging sluiten", + "regenerateButton": "Uitnodigingscode opnieuw genereren", + "generateButton": "Uitnodigingscode genereren", + "activeCodeLabel": "Huidige actieve uitnodigingscode:", + "copyButtonLabel": "Kopieer uitnodigingscode", + "copySuccess": "Uitnodigingscode gekopieerd naar klembord!", + "emptyState": "Geen actieve uitnodigingscode. Klik op de knop hierboven om er een te genereren.", + "errors": { + "newDataInvalid": "Gegevens van nieuwe uitnodigingscode zijn ongeldig." + } + }, + "errors": { + "failedToFetchActiveInvite": "Ophalen van actieve uitnodigingscode mislukt.", + "failedToFetchGroupDetails": "Ophalen van groepsdetails mislukt.", + "failedToLoadUpcomingChores": "Fout bij het laden van aankomende taken:", + "failedToLoadRecentExpenses": "Fout bij het laden van recente uitgaven:" + }, + "console": { + "noActiveInvite": "Geen actieve uitnodigingscode gevonden voor deze groep." + }, + "chores": { + "title": "Groepstaken", + "manageButton": "Taken beheren", + "duePrefix": "Vervalt:", + "emptyState": "Geen taken gepland. Klik op \"Taken beheren\" om er enkele aan te maken!" + }, + "expenses": { + "title": "Groepsuitgaven", + "manageButton": "Uitgaven beheren", + "emptyState": "Geen uitgaven geregistreerd. Klik op \"Uitgaven beheren\" om er enkele toe te voegen!", + "paidBy": "Betaald door:", + "owes": "is verschuldigd", + "paidAmount": "Betaald:", + "onDate": "op", + "settleShareButton": "Mijn deel vereffenen", + "activityLabel": "Activiteit:", + "byUser": "door", + "fallbackUserName": "Gebruikers-ID: {userId}", + "activityByUserFallback": "Gebruiker {userId}", + "splitTypes": { + "equal": "Gelijk", + "exactAmounts": "Exacte bedragen", + "percentage": "Percentage", + "shares": "Aandelen", + "itemBased": "Op item gebaseerd" + } + }, + "notifications": { + "fetchDetailsFailed": "Ophalen van groepsdetails mislukt.", + "fetchInviteFailed": "Ophalen van actieve uitnodigingscode mislukt.", + "generateInviteSuccess": "Nieuwe uitnodigingscode succesvol gegenereerd!", + "generateInviteError": "Genereren van uitnodigingscode mislukt.", + "clipboardNotSupported": "Klembord niet ondersteund of geen code om te kopiëren.", + "copyInviteFailed": "Kopiëren van uitnodigingscode mislukt.", + "removeMemberSuccess": "Lid succesvol verwijderd", + "removeMemberFailed": "Verwijderen van lid mislukt", + "loadExpensesFailed": "Laden van recente uitgaven mislukt.", + "cannotSettleOthersShares": "U kunt alleen uw eigen aandelen vereffenen.", + "settlementDataMissing": "Kan vereffening niet verwerken: gegevens ontbreken.", + "settleShareSuccess": "Aandeel succesvol vereffend!", + "settleShareFailed": "Vereffenen van aandeel mislukt." + }, + "loading": { + "settlement": "Bezig met vereffenen..." + }, + "settleShareModal": { + "title": "Aandeel vereffenen", + "settleAmountFor": "Bedrag vereffenen voor {userName}:", + "amountLabel": "Bedrag", + "cancelButton": "Annuleren", + "confirmButton": "Bevestigen", + "errors": { + "enterAmount": "Voer een bedrag in.", + "positiveAmount": "Voer een positief bedrag in.", + "exceedsRemaining": "Bedrag mag resterend bedrag niet overschrijden: {amount}.", + "noSplitSelected": "Fout: Geen verdeling geselecteerd." + } + }, + "status": { + "settled": "Vereffend", + "partiallySettled": "Gedeeltelijk vereffend", + "unsettled": "Openstaand", + "paid": "Betaald", + "partiallyPaid": "Gedeeltelijk betaald", + "unpaid": "Onbetaald", + "unknown": "Onbekende status" + } + }, + "accountPage": { + "title": "Accountinstellingen", + "loadingProfile": "Profiel laden...", + "retryButton": "Opnieuw proberen", + "profileSection": { + "header": "Profielinformatie", + "nameLabel": "Naam", + "emailLabel": "E-mail", + "saveButton": "Wijzigingen opslaan" + }, + "passwordSection": { + "header": "Wachtwoord wijzigen", + "currentPasswordLabel": "Huidig wachtwoord", + "newPasswordLabel": "Nieuw wachtwoord", + "changeButton": "Wachtwoord wijzigen" + }, + "notificationsSection": { + "header": "Notificatievoorkeuren", + "emailNotificationsLabel": "E-mailnotificaties", + "emailNotificationsDescription": "Ontvang e-mailnotificaties voor belangrijke updates", + "listUpdatesLabel": "Lijstupdates", + "listUpdatesDescription": "Ontvang een melding wanneer lijsten worden bijgewerkt", + "groupActivitiesLabel": "Groepsactiviteiten", + "groupActivitiesDescription": "Ontvang meldingen voor groepsactiviteiten" + }, + "notifications": { + "profileLoadFailed": "Laden van profiel mislukt", + "profileUpdateSuccess": "Profiel succesvol bijgewerkt", + "profileUpdateFailed": "Bijwerken van profiel mislukt", + "passwordFieldsRequired": "Vul zowel het huidige als het nieuwe wachtwoordveld in.", + "passwordTooShort": "Nieuw wachtwoord moet minimaal 8 tekens lang zijn.", + "passwordChangeSuccess": "Wachtwoord succesvol gewijzigd", + "passwordChangeFailed": "Wijzigen van wachtwoord mislukt", + "preferencesUpdateSuccess": "Voorkeuren succesvol bijgewerkt", + "preferencesUpdateFailed": "Bijwerken van voorkeuren mislukt" + }, + "saving": "Opslaan..." + }, + "signupPage": { + "header": "Aanmelden", + "fullNameLabel": "Volledige naam", + "emailLabel": "E-mail", + "passwordLabel": "Wachtwoord", + "confirmPasswordLabel": "Bevestig wachtwoord", + "togglePasswordVisibility": "Wachtwoord zichtbaarheid wisselen", + "submitButton": "Aanmelden", + "loginLink": "Heeft u al een account? Inloggen", + "validation": { + "nameRequired": "Naam is vereist", + "emailRequired": "E-mail is vereist", + "emailInvalid": "Ongeldig e-mailformaat", + "passwordRequired": "Wachtwoord is vereist", + "passwordLength": "Wachtwoord moet minimaal 8 tekens lang zijn", + "confirmPasswordRequired": "Bevestig uw wachtwoord", + "passwordsNoMatch": "Wachtwoorden komen niet overeen" + }, + "notifications": { + "signupFailed": "Aanmelden mislukt. Probeer het opnieuw.", + "signupSuccess": "Account succesvol aangemaakt. Log in alstublieft." + } + }, + "listDetailPage": { + "loading": { + "list": "Lijst laden...", + "items": "Items laden...", + "ocrProcessing": "Afbeelding verwerken...", + "addingOcrItems": "OCR-items toevoegen...", + "costSummary": "Samenvatting laden...", + "expenses": "Uitgaven laden...", + "settlement": "Bezig met vereffenen..." + }, + "errors": { + "fetchFailed": "Laden van lijstdetails mislukt.", + "genericLoadFailure": "Groep niet gevonden of er is een fout opgetreden.", + "ocrNoItems": "Geen items uit de afbeelding gehaald.", + "ocrFailed": "Verwerken van afbeelding mislukt.", + "addItemFailed": "Toevoegen van item mislukt.", + "updateItemFailed": "Bijwerken van item mislukt.", + "updateItemPriceFailed": "Bijwerken van itemprijs mislukt.", + "deleteItemFailed": "Verwijderen van item mislukt.", + "addOcrItemsFailed": "Toevoegen van OCR-items mislukt.", + "fetchItemsFailed": "Laden van items mislukt: {errorMessage}", + "loadCostSummaryFailed": "Laden van kostensamenvatting mislukt." + }, + "retryButton": "Opnieuw proberen", + "buttons": { + "addViaOcr": "Toevoegen via OCR", + "addItem": "Toevoegen", + "addItems": "Items toevoegen", + "cancel": "Annuleren", + "confirm": "Bevestigen", + "saveChanges": "Wijzigingen opslaan", + "close": "Sluiten", + "costSummary": "Kostensamenvatting" + }, + "badges": { + "groupList": "Groepslijst", + "personalList": "Persoonlijke lijst" + }, + "items": { + "emptyState": { + "title": "Nog geen items!", + "message": "Voeg items toe via het onderstaande formulier." + }, + "addItemForm": { + "placeholder": "Nieuw item toevoegen", + "quantityPlaceholder": "Aantal", + "itemNameSrLabel": "Naam nieuw item", + "quantitySrLabel": "Hoeveelheid" + }, + "pricePlaceholder": "Prijs", + "editItemAriaLabel": "Item bewerken", + "deleteItemAriaLabel": "Item verwijderen" + }, + "modals": { + "ocr": { + "title": "Items toevoegen via OCR", + "uploadLabel": "Afbeelding uploaden" + }, + "confirmation": { + "title": "Bevestiging" + }, + "editItem": { + "title": "Item bewerken", + "nameLabel": "Itemnaam", + "quantityLabel": "Hoeveelheid" + }, + "costSummary": { + "title": "Kostensamenvatting lijst", + "totalCostLabel": "Totale kosten lijst:", + "equalShareLabel": "Gelijk deel per gebruiker:", + "participantsLabel": "Deelnemende gebruikers:", + "userBalancesHeader": "Gebruikerssaldi", + "tableHeaders": { + "user": "Gebruiker", + "itemsAddedValue": "Waarde toegevoegde items", + "amountDue": "Verschuldigd bedrag", + "balance": "Saldo" + }, + "emptyState": "Geen kostensamenvatting beschikbaar." + }, + "settleShare": { + "title": "Aandeel vereffenen", + "settleAmountFor": "Bedrag vereffenen voor {userName}:", + "amountLabel": "Bedrag", + "errors": { + "enterAmount": "Voer een bedrag in.", + "positiveAmount": "Voer een positief bedrag in.", + "exceedsRemaining": "Bedrag mag resterend bedrag niet overschrijden: {amount}.", + "noSplitSelected": "Fout: Geen verdeling geselecteerd." + } + } + }, + "confirmations": { + "updateMessage": "'{itemName}' markeren als {status}?", + "statusComplete": "voltooid", + "statusIncomplete": "onvolledig", + "deleteMessage": "'{itemName}' verwijderen? Dit kan niet ongedaan worden gemaakt." + }, + "notifications": { + "itemAddedSuccess": "Item succesvol toegevoegd.", + "itemsAddedSuccessOcr": "{count} item(s) succesvol toegevoegd via OCR.", + "itemUpdatedSuccess": "Item succesvol bijgewerkt.", + "itemDeleteSuccess": "Item succesvol verwijderd.", + "enterItemName": "Voer een itemnaam in.", + "costSummaryLoadFailed": "Laden van kostensamenvatting mislukt.", + "cannotSettleOthersShares": "U kunt alleen uw eigen aandelen vereffenen.", + "settlementDataMissing": "Kan vereffening niet verwerken: gegevens ontbreken.", + "settleShareSuccess": "Aandeel succesvol vereffend!", + "settleShareFailed": "Vereffenen van aandeel mislukt." + }, + "expensesSection": { + "title": "Uitgaven", + "addExpenseButton": "Uitgave toevoegen", + "loading": "Uitgaven laden...", + "emptyState": "Nog geen uitgaven geregistreerd voor deze lijst.", + "paidBy": "Betaald door:", + "onDate": "op", + "owes": "is verschuldigd", + "paidAmount": "Betaald:", + "activityLabel": "Activiteit:", + "byUser": "door", + "settleShareButton": "Mijn deel vereffenen", + "retryButton": "Opnieuw proberen" + }, + "status": { + "settled": "Vereffend", + "partiallySettled": "Gedeeltelijk vereffend", + "unsettled": "Openstaand", + "paid": "Betaald", + "partiallyPaid": "Gedeeltelijk betaald", + "unpaid": "Onbetaald", + "unknown": "Onbekende status" + } + }, + "myChoresPage": { + "title": "Mijn toegewezen taken", + "showCompletedToggle": "Voltooide tonen", + "timelineHeaders": { + "overdue": "Achterstallig", + "today": "Vandaag te doen", + "thisWeek": "Deze week", + "later": "Later", + "completed": "Voltooid" + }, + "choreCard": { + "personal": "Persoonlijk", + "group": "Groep", + "duePrefix": "Vervalt", + "completedPrefix": "Voltooid", + "dueToday": "Vandaag te doen", + "markCompleteButton": "Markeer als voltooid" + }, + "frequencies": { + "one_time": "Eenmalig", + "daily": "Dagelijks", + "weekly": "Wekelijks", + "monthly": "Maandelijks", + "custom": "Aangepast", + "unknown": "Onbekende frequentie" + }, + "dates": { + "invalidDate": "Ongeldige datum", + "unknownDate": "Onbekende datum" + }, + "emptyState": { + "title": "Nog geen toewijzingen!", + "noAssignmentsPending": "U heeft geen openstaande taaktoewijzingen.", + "noAssignmentsAll": "U heeft geen taaktoewijzingen (voltooid of openstaand).", + "viewAllChoresButton": "Alle taken bekijken" + }, + "notifications": { + "loadFailed": "Laden van toewijzingen mislukt", + "markedComplete": "\"{choreName}\" gemarkeerd als voltooid!", + "markCompleteFailed": "Markeren van toewijzing als voltooid mislukt" + } + }, + "personalChoresPage": { + "title": "Persoonlijke taken", + "newChoreButton": "Nieuwe taak", + "editButton": "Bewerken", + "deleteButton": "Verwijderen", + "cancelButton": "Annuleren", + "saveButton": "Opslaan", + "modals": { + "editChoreTitle": "Taak bewerken", + "newChoreTitle": "Nieuwe taak", + "deleteChoreTitle": "Taak verwijderen" + }, + "form": { + "nameLabel": "Naam", + "descriptionLabel": "Beschrijving", + "frequencyLabel": "Frequentie", + "intervalLabel": "Interval (dagen)", + "dueDateLabel": "Volgende vervaldatum" + }, + "deleteDialog": { + "confirmationText": "Weet u zeker dat u deze taak wilt verwijderen?" + }, + "frequencies": { + "one_time": "Eenmalig", + "daily": "Dagelijks", + "weekly": "Wekelijks", + "monthly": "Maandelijks", + "custom": "Aangepast", + "unknown": "Onbekende frequentie" + }, + "dates": { + "invalidDate": "Ongeldige datum", + "duePrefix": "Vervalt" + }, + "notifications": { + "loadFailed": "Laden van persoonlijke taken mislukt", + "updateSuccess": "Persoonlijke taak succesvol bijgewerkt", + "createSuccess": "Persoonlijke taak succesvol aangemaakt", + "saveFailed": "Opslaan van persoonlijke taak mislukt", + "deleteSuccess": "Persoonlijke taak succesvol verwijderd", + "deleteFailed": "Verwijderen van persoonlijke taak mislukt" + } + }, + "indexPage": { + "welcomeMessage": "Welkom bij de Valerie UI App", + "mainPageInfo": "Dit is de hoofdindexpagina.", + "sampleTodosHeader": "Voorbeeldtaken (uit IndexPage-gegevens)", + "totalCountLabel": "Totaal aantal uit meta:", + "noTodos": "Geen taken om weer te geven." + } +} \ No newline at end of file diff --git a/fe/src/main.ts b/fe/src/main.ts index 30196f2..e9ec648 100644 --- a/fe/src/main.ts +++ b/fe/src/main.ts @@ -9,6 +9,7 @@ import enMessages from './i18n/en.json' // Import en.json directly import deMessages from './i18n/de.json' import frMessages from './i18n/fr.json' import esMessages from './i18n/es.json' +import nlMessages from './i18n/nl.json' // Global styles import './assets/main.scss'