From 2a2045c24a9d88c4c2d0c30e4f693d9258b4c8cb Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 22:13:36 +0000 Subject: [PATCH] feat(i18n): Internationalize remaining app pages This commit completes the internationalization (i18n) for several key pages within the frontend application. The following pages have been updated to support multiple languages: - AccountPage.vue - SignupPage.vue - ListDetailPage.vue (including items, OCR, expenses, and cost summary) - MyChoresPage.vue - PersonalChoresPage.vue - IndexPage.vue Key changes include: - Extraction of all user-facing strings from these Vue components. - Addition of new translation keys and their English values to `fe/src/i18n/en.json`. - Modification of the Vue components to use the Vue I18n plugin's `$t()` (template) and `t()` (script) functions for displaying translated strings. - Dynamic messages, notifications, and form validation messages are now also internationalized. - The language files `de.json`, `es.json`, and `fr.json` have been updated with the new keys, using the English text as placeholders for future translation. This effort significantly expands the i18n coverage of the application, making it more accessible to a wider audience. --- fe/src/i18n/de.json | 287 ++++++++++++++++++++++++ fe/src/i18n/en.json | 287 ++++++++++++++++++++++++ fe/src/i18n/es.json | 287 ++++++++++++++++++++++++ fe/src/i18n/fr.json | 287 ++++++++++++++++++++++++ fe/src/pages/AccountPage.vue | 74 ++++--- fe/src/pages/IndexPage.vue | 13 +- fe/src/pages/ListDetailPage.vue | 327 ++++++++++++++-------------- fe/src/pages/MyChoresPage.vue | 106 +++++---- fe/src/pages/PersonalChoresPage.vue | 97 +++++---- fe/src/pages/SignupPage.vue | 46 ++-- 10 files changed, 1499 insertions(+), 312 deletions(-) diff --git a/fe/src/i18n/de.json b/fe/src/i18n/de.json index 838bc94..ab6a3ff 100644 --- a/fe/src/i18n/de.json +++ b/fe/src/i18n/de.json @@ -270,5 +270,292 @@ "removeMemberSuccess": "DE: Member removed successfully", "removeMemberFailed": "DE: Failed to remove member" } + }, + "accountPage": { + "title": "Account Settings", + "loadingProfile": "Loading profile...", + "retryButton": "Retry", + "profileSection": { + "header": "Profile Information", + "nameLabel": "Name", + "emailLabel": "Email", + "saveButton": "Save Changes" + }, + "passwordSection": { + "header": "Change Password", + "currentPasswordLabel": "Current Password", + "newPasswordLabel": "New Password", + "changeButton": "Change Password" + }, + "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" + }, + "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" + }, + "saving": "Saving..." + }, + "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", + "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" + }, + "notifications": { + "signupFailed": "Signup failed. Please try again.", + "signupSuccess": "Account created successfully. Please login." + } + }, + "listDetailPage": { + "loading": { + "list": "Loading list...", + "items": "Loading items...", + "ocrProcessing": "Processing image...", + "addingOcrItems": "Adding OCR items...", + "costSummary": "Loading summary...", + "expenses": "Loading expenses...", + "settlement": "Processing settlement..." + }, + "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." + }, + "retryButton": "Retry", + "buttons": { + "addViaOcr": "Add via OCR", + "addItem": "Add", + "addItems": "Add Items", + "cancel": "Cancel", + "confirm": "Confirm", + "saveChanges": "Save Changes", + "close": "Close", + "costSummary": "Cost Summary" + }, + "badges": { + "groupList": "Group List", + "personalList": "Personal List" + }, + "items": { + "emptyState": { + "title": "No Items Yet!", + "message": "Add some items using the form below." + }, + "addItemForm": { + "placeholder": "Add a new item", + "quantityPlaceholder": "Qty", + "itemNameSrLabel": "New item name", + "quantitySrLabel": "Quantity" + }, + "pricePlaceholder": "Price", + "editItemAriaLabel": "Edit item", + "deleteItemAriaLabel": "Delete item" + }, + "modals": { + "ocr": { + "title": "Add Items via OCR", + "uploadLabel": "Upload Image" + }, + "confirmation": { + "title": "Confirmation" + }, + "editItem": { + "title": "Edit Item", + "nameLabel": "Item Name", + "quantityLabel": "Quantity" + }, + "costSummary": { + "title": "List Cost Summary", + "totalCostLabel": "Total List Cost:", + "equalShareLabel": "Equal Share Per User:", + "participantsLabel": "Participating Users:", + "userBalancesHeader": "User Balances", + "tableHeaders": { + "user": "User", + "itemsAddedValue": "Items Added Value", + "amountDue": "Amount Due", + "balance": "Balance" + }, + "emptyState": "No cost summary available." + }, + "settleShare": { + "title": "Settle Share", + "settleAmountFor": "Settle amount for {userName}:", + "amountLabel": "Amount", + "errors": { + "enterAmount": "Please enter an amount.", + "positiveAmount": "Please enter a positive amount.", + "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", + "noSplitSelected": "Error: No split selected." + } + } + }, + "confirmations": { + "updateMessage": "Mark '{itemName}' as {status}?", + "statusComplete": "complete", + "statusIncomplete": "incomplete", + "deleteMessage": "Delete '{itemName}'? This cannot be undone." + }, + "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." + }, + "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" + }, + "status": { + "settled": "Settled", + "partiallySettled": "Partially Settled", + "unsettled": "Unsettled", + "paid": "Paid", + "partiallyPaid": "Partially Paid", + "unpaid": "Unpaid", + "unknown": "Unknown Status" + } + }, + "myChoresPage": { + "title": "My Assigned Chores", + "showCompletedToggle": "Show Completed", + "timelineHeaders": { + "overdue": "Overdue", + "today": "Due Today", + "thisWeek": "This Week", + "later": "Later", + "completed": "Completed" + }, + "choreCard": { + "personal": "Personal", + "group": "Group", + "duePrefix": "Due", + "completedPrefix": "Completed", + "dueToday": "Due Today", + "markCompleteButton": "Mark Complete" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "unknownDate": "Unknown Date" + }, + "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" + }, + "notifications": { + "loadFailed": "Failed to load assignments", + "markedComplete": "Marked \"{choreName}\" as complete!", + "markCompleteFailed": "Failed to mark assignment as complete" + } + }, + "personalChoresPage": { + "title": "Personal Chores", + "newChoreButton": "New Chore", + "editButton": "Edit", + "deleteButton": "Delete", + "cancelButton": "Cancel", + "saveButton": "Save", + "modals": { + "editChoreTitle": "Edit Chore", + "newChoreTitle": "New Chore", + "deleteChoreTitle": "Delete Chore" + }, + "form": { + "nameLabel": "Name", + "descriptionLabel": "Description", + "frequencyLabel": "Frequency", + "intervalLabel": "Interval (days)", + "dueDateLabel": "Next Due Date" + }, + "deleteDialog": { + "confirmationText": "Are you sure you want to delete this chore?" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "duePrefix": "Due" + }, + "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" + } + }, + "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." } } diff --git a/fe/src/i18n/en.json b/fe/src/i18n/en.json index 133984c..8e85b52 100644 --- a/fe/src/i18n/en.json +++ b/fe/src/i18n/en.json @@ -270,5 +270,292 @@ "removeMemberSuccess": "Member removed successfully", "removeMemberFailed": "Failed to remove member" } + }, + "accountPage": { + "title": "Account Settings", + "loadingProfile": "Loading profile...", + "retryButton": "Retry", + "profileSection": { + "header": "Profile Information", + "nameLabel": "Name", + "emailLabel": "Email", + "saveButton": "Save Changes" + }, + "passwordSection": { + "header": "Change Password", + "currentPasswordLabel": "Current Password", + "newPasswordLabel": "New Password", + "changeButton": "Change Password" + }, + "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" + }, + "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" + }, + "saving": "Saving..." + }, + "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", + "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" + }, + "notifications": { + "signupFailed": "Signup failed. Please try again.", + "signupSuccess": "Account created successfully. Please login." + } + }, + "listDetailPage": { + "loading": { + "list": "Loading list...", + "items": "Loading items...", + "ocrProcessing": "Processing image...", + "addingOcrItems": "Adding OCR items...", + "costSummary": "Loading summary...", + "expenses": "Loading expenses...", + "settlement": "Processing settlement..." + }, + "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." + }, + "retryButton": "Retry", + "buttons": { + "addViaOcr": "Add via OCR", + "addItem": "Add", + "addItems": "Add Items", + "cancel": "Cancel", + "confirm": "Confirm", + "saveChanges": "Save Changes", + "close": "Close", + "costSummary": "Cost Summary" + }, + "badges": { + "groupList": "Group List", + "personalList": "Personal List" + }, + "items": { + "emptyState": { + "title": "No Items Yet!", + "message": "Add some items using the form below." + }, + "addItemForm": { + "placeholder": "Add a new item", + "quantityPlaceholder": "Qty", + "itemNameSrLabel": "New item name", + "quantitySrLabel": "Quantity" + }, + "pricePlaceholder": "Price", + "editItemAriaLabel": "Edit item", + "deleteItemAriaLabel": "Delete item" + }, + "modals": { + "ocr": { + "title": "Add Items via OCR", + "uploadLabel": "Upload Image" + }, + "confirmation": { + "title": "Confirmation" + }, + "editItem": { + "title": "Edit Item", + "nameLabel": "Item Name", + "quantityLabel": "Quantity" + }, + "costSummary": { + "title": "List Cost Summary", + "totalCostLabel": "Total List Cost:", + "equalShareLabel": "Equal Share Per User:", + "participantsLabel": "Participating Users:", + "userBalancesHeader": "User Balances", + "tableHeaders": { + "user": "User", + "itemsAddedValue": "Items Added Value", + "amountDue": "Amount Due", + "balance": "Balance" + }, + "emptyState": "No cost summary available." + }, + "settleShare": { + "title": "Settle Share", + "settleAmountFor": "Settle amount for {userName}:", + "amountLabel": "Amount", + "errors": { + "enterAmount": "Please enter an amount.", + "positiveAmount": "Please enter a positive amount.", + "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", + "noSplitSelected": "Error: No split selected." + } + } + }, + "confirmations": { + "updateMessage": "Mark '{itemName}' as {status}?", + "statusComplete": "complete", + "statusIncomplete": "incomplete", + "deleteMessage": "Delete '{itemName}'? This cannot be undone." + }, + "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." + }, + "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" + }, + "status": { + "settled": "Settled", + "partiallySettled": "Partially Settled", + "unsettled": "Unsettled", + "paid": "Paid", + "partiallyPaid": "Partially Paid", + "unpaid": "Unpaid", + "unknown": "Unknown Status" + } + }, + "myChoresPage": { + "title": "My Assigned Chores", + "showCompletedToggle": "Show Completed", + "timelineHeaders": { + "overdue": "Overdue", + "today": "Due Today", + "thisWeek": "This Week", + "later": "Later", + "completed": "Completed" + }, + "choreCard": { + "personal": "Personal", + "group": "Group", + "duePrefix": "Due", + "completedPrefix": "Completed", + "dueToday": "Due Today", + "markCompleteButton": "Mark Complete" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "unknownDate": "Unknown Date" + }, + "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" + }, + "notifications": { + "loadFailed": "Failed to load assignments", + "markedComplete": "Marked \"{choreName}\" as complete!", + "markCompleteFailed": "Failed to mark assignment as complete" + } + }, + "personalChoresPage": { + "title": "Personal Chores", + "newChoreButton": "New Chore", + "editButton": "Edit", + "deleteButton": "Delete", + "cancelButton": "Cancel", + "saveButton": "Save", + "modals": { + "editChoreTitle": "Edit Chore", + "newChoreTitle": "New Chore", + "deleteChoreTitle": "Delete Chore" + }, + "form": { + "nameLabel": "Name", + "descriptionLabel": "Description", + "frequencyLabel": "Frequency", + "intervalLabel": "Interval (days)", + "dueDateLabel": "Next Due Date" + }, + "deleteDialog": { + "confirmationText": "Are you sure you want to delete this chore?" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "duePrefix": "Due" + }, + "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" + } + }, + "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." } } diff --git a/fe/src/i18n/es.json b/fe/src/i18n/es.json index b57d2e5..665870e 100644 --- a/fe/src/i18n/es.json +++ b/fe/src/i18n/es.json @@ -270,5 +270,292 @@ "removeMemberSuccess": "ES: Member removed successfully", "removeMemberFailed": "ES: Failed to remove member" } + }, + "accountPage": { + "title": "Account Settings", + "loadingProfile": "Loading profile...", + "retryButton": "Retry", + "profileSection": { + "header": "Profile Information", + "nameLabel": "Name", + "emailLabel": "Email", + "saveButton": "Save Changes" + }, + "passwordSection": { + "header": "Change Password", + "currentPasswordLabel": "Current Password", + "newPasswordLabel": "New Password", + "changeButton": "Change Password" + }, + "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" + }, + "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" + }, + "saving": "Saving..." + }, + "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", + "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" + }, + "notifications": { + "signupFailed": "Signup failed. Please try again.", + "signupSuccess": "Account created successfully. Please login." + } + }, + "listDetailPage": { + "loading": { + "list": "Loading list...", + "items": "Loading items...", + "ocrProcessing": "Processing image...", + "addingOcrItems": "Adding OCR items...", + "costSummary": "Loading summary...", + "expenses": "Loading expenses...", + "settlement": "Processing settlement..." + }, + "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." + }, + "retryButton": "Retry", + "buttons": { + "addViaOcr": "Add via OCR", + "addItem": "Add", + "addItems": "Add Items", + "cancel": "Cancel", + "confirm": "Confirm", + "saveChanges": "Save Changes", + "close": "Close", + "costSummary": "Cost Summary" + }, + "badges": { + "groupList": "Group List", + "personalList": "Personal List" + }, + "items": { + "emptyState": { + "title": "No Items Yet!", + "message": "Add some items using the form below." + }, + "addItemForm": { + "placeholder": "Add a new item", + "quantityPlaceholder": "Qty", + "itemNameSrLabel": "New item name", + "quantitySrLabel": "Quantity" + }, + "pricePlaceholder": "Price", + "editItemAriaLabel": "Edit item", + "deleteItemAriaLabel": "Delete item" + }, + "modals": { + "ocr": { + "title": "Add Items via OCR", + "uploadLabel": "Upload Image" + }, + "confirmation": { + "title": "Confirmation" + }, + "editItem": { + "title": "Edit Item", + "nameLabel": "Item Name", + "quantityLabel": "Quantity" + }, + "costSummary": { + "title": "List Cost Summary", + "totalCostLabel": "Total List Cost:", + "equalShareLabel": "Equal Share Per User:", + "participantsLabel": "Participating Users:", + "userBalancesHeader": "User Balances", + "tableHeaders": { + "user": "User", + "itemsAddedValue": "Items Added Value", + "amountDue": "Amount Due", + "balance": "Balance" + }, + "emptyState": "No cost summary available." + }, + "settleShare": { + "title": "Settle Share", + "settleAmountFor": "Settle amount for {userName}:", + "amountLabel": "Amount", + "errors": { + "enterAmount": "Please enter an amount.", + "positiveAmount": "Please enter a positive amount.", + "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", + "noSplitSelected": "Error: No split selected." + } + } + }, + "confirmations": { + "updateMessage": "Mark '{itemName}' as {status}?", + "statusComplete": "complete", + "statusIncomplete": "incomplete", + "deleteMessage": "Delete '{itemName}'? This cannot be undone." + }, + "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." + }, + "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" + }, + "status": { + "settled": "Settled", + "partiallySettled": "Partially Settled", + "unsettled": "Unsettled", + "paid": "Paid", + "partiallyPaid": "Partially Paid", + "unpaid": "Unpaid", + "unknown": "Unknown Status" + } + }, + "myChoresPage": { + "title": "My Assigned Chores", + "showCompletedToggle": "Show Completed", + "timelineHeaders": { + "overdue": "Overdue", + "today": "Due Today", + "thisWeek": "This Week", + "later": "Later", + "completed": "Completed" + }, + "choreCard": { + "personal": "Personal", + "group": "Group", + "duePrefix": "Due", + "completedPrefix": "Completed", + "dueToday": "Due Today", + "markCompleteButton": "Mark Complete" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "unknownDate": "Unknown Date" + }, + "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" + }, + "notifications": { + "loadFailed": "Failed to load assignments", + "markedComplete": "Marked \"{choreName}\" as complete!", + "markCompleteFailed": "Failed to mark assignment as complete" + } + }, + "personalChoresPage": { + "title": "Personal Chores", + "newChoreButton": "New Chore", + "editButton": "Edit", + "deleteButton": "Delete", + "cancelButton": "Cancel", + "saveButton": "Save", + "modals": { + "editChoreTitle": "Edit Chore", + "newChoreTitle": "New Chore", + "deleteChoreTitle": "Delete Chore" + }, + "form": { + "nameLabel": "Name", + "descriptionLabel": "Description", + "frequencyLabel": "Frequency", + "intervalLabel": "Interval (days)", + "dueDateLabel": "Next Due Date" + }, + "deleteDialog": { + "confirmationText": "Are you sure you want to delete this chore?" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "duePrefix": "Due" + }, + "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" + } + }, + "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." } } diff --git a/fe/src/i18n/fr.json b/fe/src/i18n/fr.json index 0251c52..cf8c4fc 100644 --- a/fe/src/i18n/fr.json +++ b/fe/src/i18n/fr.json @@ -270,5 +270,292 @@ "removeMemberSuccess": "FR: Member removed successfully", "removeMemberFailed": "FR: Failed to remove member" } + }, + "accountPage": { + "title": "Account Settings", + "loadingProfile": "Loading profile...", + "retryButton": "Retry", + "profileSection": { + "header": "Profile Information", + "nameLabel": "Name", + "emailLabel": "Email", + "saveButton": "Save Changes" + }, + "passwordSection": { + "header": "Change Password", + "currentPasswordLabel": "Current Password", + "newPasswordLabel": "New Password", + "changeButton": "Change Password" + }, + "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" + }, + "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" + }, + "saving": "Saving..." + }, + "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", + "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" + }, + "notifications": { + "signupFailed": "Signup failed. Please try again.", + "signupSuccess": "Account created successfully. Please login." + } + }, + "listDetailPage": { + "loading": { + "list": "Loading list...", + "items": "Loading items...", + "ocrProcessing": "Processing image...", + "addingOcrItems": "Adding OCR items...", + "costSummary": "Loading summary...", + "expenses": "Loading expenses...", + "settlement": "Processing settlement..." + }, + "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." + }, + "retryButton": "Retry", + "buttons": { + "addViaOcr": "Add via OCR", + "addItem": "Add", + "addItems": "Add Items", + "cancel": "Cancel", + "confirm": "Confirm", + "saveChanges": "Save Changes", + "close": "Close", + "costSummary": "Cost Summary" + }, + "badges": { + "groupList": "Group List", + "personalList": "Personal List" + }, + "items": { + "emptyState": { + "title": "No Items Yet!", + "message": "Add some items using the form below." + }, + "addItemForm": { + "placeholder": "Add a new item", + "quantityPlaceholder": "Qty", + "itemNameSrLabel": "New item name", + "quantitySrLabel": "Quantity" + }, + "pricePlaceholder": "Price", + "editItemAriaLabel": "Edit item", + "deleteItemAriaLabel": "Delete item" + }, + "modals": { + "ocr": { + "title": "Add Items via OCR", + "uploadLabel": "Upload Image" + }, + "confirmation": { + "title": "Confirmation" + }, + "editItem": { + "title": "Edit Item", + "nameLabel": "Item Name", + "quantityLabel": "Quantity" + }, + "costSummary": { + "title": "List Cost Summary", + "totalCostLabel": "Total List Cost:", + "equalShareLabel": "Equal Share Per User:", + "participantsLabel": "Participating Users:", + "userBalancesHeader": "User Balances", + "tableHeaders": { + "user": "User", + "itemsAddedValue": "Items Added Value", + "amountDue": "Amount Due", + "balance": "Balance" + }, + "emptyState": "No cost summary available." + }, + "settleShare": { + "title": "Settle Share", + "settleAmountFor": "Settle amount for {userName}:", + "amountLabel": "Amount", + "errors": { + "enterAmount": "Please enter an amount.", + "positiveAmount": "Please enter a positive amount.", + "exceedsRemaining": "Amount cannot exceed remaining: {amount}.", + "noSplitSelected": "Error: No split selected." + } + } + }, + "confirmations": { + "updateMessage": "Mark '{itemName}' as {status}?", + "statusComplete": "complete", + "statusIncomplete": "incomplete", + "deleteMessage": "Delete '{itemName}'? This cannot be undone." + }, + "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." + }, + "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" + }, + "status": { + "settled": "Settled", + "partiallySettled": "Partially Settled", + "unsettled": "Unsettled", + "paid": "Paid", + "partiallyPaid": "Partially Paid", + "unpaid": "Unpaid", + "unknown": "Unknown Status" + } + }, + "myChoresPage": { + "title": "My Assigned Chores", + "showCompletedToggle": "Show Completed", + "timelineHeaders": { + "overdue": "Overdue", + "today": "Due Today", + "thisWeek": "This Week", + "later": "Later", + "completed": "Completed" + }, + "choreCard": { + "personal": "Personal", + "group": "Group", + "duePrefix": "Due", + "completedPrefix": "Completed", + "dueToday": "Due Today", + "markCompleteButton": "Mark Complete" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "unknownDate": "Unknown Date" + }, + "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" + }, + "notifications": { + "loadFailed": "Failed to load assignments", + "markedComplete": "Marked \"{choreName}\" as complete!", + "markCompleteFailed": "Failed to mark assignment as complete" + } + }, + "personalChoresPage": { + "title": "Personal Chores", + "newChoreButton": "New Chore", + "editButton": "Edit", + "deleteButton": "Delete", + "cancelButton": "Cancel", + "saveButton": "Save", + "modals": { + "editChoreTitle": "Edit Chore", + "newChoreTitle": "New Chore", + "deleteChoreTitle": "Delete Chore" + }, + "form": { + "nameLabel": "Name", + "descriptionLabel": "Description", + "frequencyLabel": "Frequency", + "intervalLabel": "Interval (days)", + "dueDateLabel": "Next Due Date" + }, + "deleteDialog": { + "confirmationText": "Are you sure you want to delete this chore?" + }, + "frequencies": { + "one_time": "One Time", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "custom": "Custom", + "unknown": "Unknown Frequency" + }, + "dates": { + "invalidDate": "Invalid Date", + "duePrefix": "Due" + }, + "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" + } + }, + "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." } } diff --git a/fe/src/pages/AccountPage.vue b/fe/src/pages/AccountPage.vue index dff3ff0..101f600 100644 --- a/fe/src/pages/AccountPage.vue +++ b/fe/src/pages/AccountPage.vue @@ -1,32 +1,32 @@