diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d4a45..80e02e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.23.17] - 2026-04-25 - -### Fixed -- Italian (it) locale: translated all missing strings in the recipes section (`nav.recipes`, `meals.savedRecipeLabel`, `meals.savedRecipePlaceholder`, `meals.saveAsRecipe`, `meals.recipeScaleLabel`, and all `recipes.*` keys) — contributed by @albanobattistella - ## [0.23.16] - 2026-04-24 ### Changed diff --git a/package-lock.json b/package-lock.json index 814c504..4235aea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.23.17", + "version": "0.23.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.23.17", + "version": "0.23.16", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index 41b5b8f..806b999 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.23.17", + "version": "0.23.16", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/locales/ar.json b/public/locales/ar.json index e8e5cbf..a6b8a9d 100644 --- a/public/locales/ar.json +++ b/public/locales/ar.json @@ -463,21 +463,68 @@ "trendNeutral": "- مثل {{month}}", "validAmountRequired": "أدخل مبلغاً صحيحاً", "dateRequired": "التاريخ مطلوب", - "catFood": "الطعام", + "catFood": "Food", "catRent": "الإيجار", "catInsurance": "التأمين", "catMobility": "التنقل", - "catLeisure": "الترفيه", + "catLeisure": "Leisure and Entertainment", "catClothing": "الملابس", "catHealth": "الصحة", - "catEducation": "التعليم", + "catEducation": "Education", "catMisc": "متنوع", "catEarnedIncome": "دخل العمل", "catInvestmentIncome": "دخل الاستثمار", "catTransferGiftIncome": "التحويلات والهدايا", "catGovernmentBenefits": "المزايا الاجتماعية", "catOtherIncome": "دخل آخر", - "loadingIndicator": "جارٍ التحميل…" + "loadingIndicator": "جارٍ التحميل…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "الإعدادات", diff --git a/public/locales/de.json b/public/locales/de.json index d78d2a9..b6b6501 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -469,11 +469,11 @@ "trendNeutral": "- wie {{month}}", "validAmountRequired": "Gültigen Betrag eingeben", "dateRequired": "Datum ist erforderlich", - "catFood": "Lebensmittel", + "catFood": "Ernährung", "catRent": "Miete", "catInsurance": "Versicherung", "catMobility": "Mobilität", - "catLeisure": "Freizeit", + "catLeisure": "Freizeit und Unterhaltung", "catClothing": "Kleidung", "catHealth": "Gesundheit", "catEducation": "Bildung", @@ -483,7 +483,54 @@ "catTransferGiftIncome": "Geschenke & Transfers", "catGovernmentBenefits": "Sozialleistungen", "catOtherIncome": "Sonstiges Einkommen", - "loadingIndicator": "Lade…" + "loadingIndicator": "Lade…", + "subcategoryLabel": "Unterkategorie", + "catHousing": "Wohnen / Zuhause", + "catTransport": "Transport", + "catPersonalHealth": "Körperpflege / Gesundheit", + "catShoppingClothing": "Einkäufe und Kleidung", + "catFinancialOther": "Finanzdienstleistungen und Sonstiges", + "subcatRentMortgage": "Miete / Kreditrate", + "subcatCondominium": "Hausgeld", + "subcatUtilities": "Strom / Wasser / Gas", + "subcatInternetTvPhone": "Internet / TV / Telefon", + "subcatRenovationMaintenance": "Renovierung / Instandhaltung", + "subcatCleaning": "Reinigung", + "subcatGroceries": "Supermarkt", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bäckerei", + "subcatFuel": "Kraftstoff", + "subcatParkingTolls": "Parken / Maut", + "subcatPublicTransport": "Öffentliche Verkehrsmittel", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Wartung / Versicherung", + "subcatPharmacy": "Apotheke", + "subcatHealthInsurance": "Krankenversicherung", + "subcatGymSports": "Fitnessstudio / Sport", + "subcatBeautyCosmetics": "Schönheit / Kosmetik", + "subcatTravel": "Reisen", + "subcatStreaming": "Streaming", + "subcatEvents": "Veranstaltungen", + "subcatHobbies": "Hobbys", + "subcatClothesShoes": "Kleidung / Schuhe", + "subcatElectronics": "Elektronik", + "subcatGifts": "Geschenke", + "subcatCoursesCollege": "Kurse / Hochschule", + "subcatSchoolSupplies": "Schulmaterial", + "subcatLanguages": "Sprachen", + "subcatLoansInterest": "Kredite / Zinsen", + "subcatBankFees": "Bankgebühren", + "subcatInsuranceOther": "Versicherungen", + "subcatInvestments": "Investitionen", + "subcatTaxes": "Steuern", + "metaLoadError": "Budget-Kategorien konnten nicht geladen werden.", + "addCategory": "+ Kategorie", + "addSubcategory": "+ Unterkategorie", + "newCategoryPrompt": "Name der neuen Kategorie:", + "newSubcategoryPrompt": "Name der neuen Unterkategorie:", + "categoryAddedToast": "Kategorie hinzugefügt.", + "subcategoryAddedToast": "Unterkategorie hinzugefügt." }, "settings": { "title": "Einstellungen", diff --git a/public/locales/el.json b/public/locales/el.json index 5ac786d..fbfc4f8 100644 --- a/public/locales/el.json +++ b/public/locales/el.json @@ -463,21 +463,68 @@ "trendNeutral": "- ίδιο με {{month}}", "validAmountRequired": "Παρακαλώ εισαγάγετε έγκυρο ποσό", "dateRequired": "Η ημερομηνία είναι υποχρεωτική", - "catFood": "Τρόφιμα", + "catFood": "Food", "catRent": "Ενοίκιο", "catInsurance": "Ασφάλεια", "catMobility": "Μεταφορές", - "catLeisure": "Ελεύθερος χρόνος", + "catLeisure": "Leisure and Entertainment", "catClothing": "Ρουχισμός", "catHealth": "Υγεία", - "catEducation": "Εκπαίδευση", + "catEducation": "Education", "catMisc": "Διάφορα", "catEarnedIncome": "Εισόδημα από εργασία", "catInvestmentIncome": "Επενδυτικό εισόδημα", "catTransferGiftIncome": "Μεταφορές και δώρα", "catGovernmentBenefits": "Κοινωνικές παροχές", "catOtherIncome": "Άλλο εισόδημα", - "loadingIndicator": "Φόρτωση…" + "loadingIndicator": "Φόρτωση…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Ρυθμίσεις", diff --git a/public/locales/en.json b/public/locales/en.json index f81727a..b72af7f 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -463,11 +463,11 @@ "trendNeutral": "- same as {{month}}", "validAmountRequired": "Please enter a valid amount", "dateRequired": "Date is required", - "catFood": "Groceries", + "catFood": "Food", "catRent": "Rent", "catInsurance": "Insurance", "catMobility": "Transport", - "catLeisure": "Leisure", + "catLeisure": "Leisure and Entertainment", "catClothing": "Clothing", "catHealth": "Health", "catEducation": "Education", @@ -477,7 +477,54 @@ "catTransferGiftIncome": "Transfer & Gift Income", "catGovernmentBenefits": "Government & Social Benefits", "catOtherIncome": "Other Income", - "loadingIndicator": "Loading…" + "loadingIndicator": "Loading…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Settings", diff --git a/public/locales/es.json b/public/locales/es.json index b3faf96..3a1e8c9 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -467,7 +467,7 @@ "catRent": "Alquiler", "catInsurance": "Seguro", "catMobility": "Movilidad", - "catLeisure": "Ocio", + "catLeisure": "Ocio y entretenimiento", "catClothing": "Ropa", "catHealth": "Salud", "catEducation": "Educación", @@ -477,7 +477,54 @@ "catTransferGiftIncome": "Transferencias y Regalos", "catGovernmentBenefits": "Prestaciones Sociales", "catOtherIncome": "Otros Ingresos", - "loadingIndicator": "Cargando…" + "loadingIndicator": "Cargando…", + "subcategoryLabel": "Subcategoría", + "catHousing": "Vivienda / Casa", + "catTransport": "Transporte", + "catPersonalHealth": "Cuidado personal / Salud", + "catShoppingClothing": "Compras y ropa", + "catFinancialOther": "Servicios financieros y otros", + "subcatRentMortgage": "Alquiler / Hipoteca", + "subcatCondominium": "Comunidad", + "subcatUtilities": "Luz / Agua / Gas", + "subcatInternetTvPhone": "Internet / TV / Teléfono", + "subcatRenovationMaintenance": "Reforma / Mantenimiento", + "subcatCleaning": "Limpieza", + "subcatGroceries": "Supermercado", + "subcatRestaurantsBars": "Restaurantes / Bares", + "subcatSnacksFastFood": "Snacks / Comida rápida", + "subcatBakery": "Panadería", + "subcatFuel": "Combustible", + "subcatParkingTolls": "Aparcamiento / Peajes", + "subcatPublicTransport": "Transporte público", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Mantenimiento / Seguro", + "subcatPharmacy": "Farmacia", + "subcatHealthInsurance": "Seguro médico", + "subcatGymSports": "Gimnasio / Deportes", + "subcatBeautyCosmetics": "Belleza / Cosmética", + "subcatTravel": "Viajes", + "subcatStreaming": "Streaming", + "subcatEvents": "Eventos", + "subcatHobbies": "Aficiones", + "subcatClothesShoes": "Ropa / Calzado", + "subcatElectronics": "Electrónica", + "subcatGifts": "Regalos", + "subcatCoursesCollege": "Cursos / Universidad", + "subcatSchoolSupplies": "Material escolar", + "subcatLanguages": "Idiomas", + "subcatLoansInterest": "Préstamos / Intereses", + "subcatBankFees": "Comisiones bancarias", + "subcatInsuranceOther": "Seguros", + "subcatInvestments": "Inversiones", + "subcatTaxes": "Impuestos", + "metaLoadError": "No se pudieron cargar las categorías del presupuesto.", + "addCategory": "+ categoría", + "addSubcategory": "+ subcategoría", + "newCategoryPrompt": "Nombre de la nueva categoría:", + "newSubcategoryPrompt": "Nombre de la nueva subcategoría:", + "categoryAddedToast": "Categoría añadida.", + "subcategoryAddedToast": "Subcategoría añadida." }, "settings": { "title": "Ajustes", diff --git a/public/locales/fr.json b/public/locales/fr.json index 583be21..af83829 100644 --- a/public/locales/fr.json +++ b/public/locales/fr.json @@ -467,7 +467,7 @@ "catRent": "Loyer", "catInsurance": "Assurance", "catMobility": "Transport", - "catLeisure": "Loisirs", + "catLeisure": "Loisirs et divertissement", "catClothing": "Vêtements", "catHealth": "Santé", "catEducation": "Éducation", @@ -477,7 +477,54 @@ "catTransferGiftIncome": "Transferts et Cadeaux", "catGovernmentBenefits": "Allocations Sociales", "catOtherIncome": "Autres Revenus", - "loadingIndicator": "Chargement…" + "loadingIndicator": "Chargement…", + "subcategoryLabel": "Sous-catégorie", + "catHousing": "Logement / Maison", + "catTransport": "Transport", + "catPersonalHealth": "Soins personnels / Santé", + "catShoppingClothing": "Achats et vêtements", + "catFinancialOther": "Services financiers et autres", + "subcatRentMortgage": "Loyer / Crédit immobilier", + "subcatCondominium": "Copropriété", + "subcatUtilities": "Électricité / Eau / Gaz", + "subcatInternetTvPhone": "Internet / TV / Téléphone", + "subcatRenovationMaintenance": "Rénovation / Entretien", + "subcatCleaning": "Nettoyage", + "subcatGroceries": "Supermarché", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast-food", + "subcatBakery": "Boulangerie", + "subcatFuel": "Carburant", + "subcatParkingTolls": "Parking / Péages", + "subcatPublicTransport": "Transports publics", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Entretien / Assurance", + "subcatPharmacy": "Pharmacie", + "subcatHealthInsurance": "Assurance santé", + "subcatGymSports": "Salle de sport / Sports", + "subcatBeautyCosmetics": "Beauté / Cosmétiques", + "subcatTravel": "Voyages", + "subcatStreaming": "Streaming", + "subcatEvents": "Événements", + "subcatHobbies": "Loisirs", + "subcatClothesShoes": "Vêtements / Chaussures", + "subcatElectronics": "Électronique", + "subcatGifts": "Cadeaux", + "subcatCoursesCollege": "Cours / Université", + "subcatSchoolSupplies": "Fournitures scolaires", + "subcatLanguages": "Langues", + "subcatLoansInterest": "Prêts / Intérêts", + "subcatBankFees": "Frais bancaires", + "subcatInsuranceOther": "Assurances", + "subcatInvestments": "Investissements", + "subcatTaxes": "Impôts", + "metaLoadError": "Impossible de charger les catégories du budget.", + "addCategory": "+ catégorie", + "addSubcategory": "+ sous-catégorie", + "newCategoryPrompt": "Nom de la nouvelle catégorie :", + "newSubcategoryPrompt": "Nom de la nouvelle sous-catégorie :", + "categoryAddedToast": "Catégorie ajoutée.", + "subcategoryAddedToast": "Sous-catégorie ajoutée." }, "settings": { "title": "Paramètres", diff --git a/public/locales/hi.json b/public/locales/hi.json index be3288f..70d6c99 100644 --- a/public/locales/hi.json +++ b/public/locales/hi.json @@ -463,21 +463,68 @@ "trendNeutral": "- {{month}} जैसा", "validAmountRequired": "वैध राशि दर्ज करें", "dateRequired": "तारीख आवश्यक है", - "catFood": "भोजन", + "catFood": "Food", "catRent": "किराया", "catInsurance": "बीमा", "catMobility": "परिवहन", - "catLeisure": "मनोरंजन", + "catLeisure": "Leisure and Entertainment", "catClothing": "कपड़े", "catHealth": "स्वास्थ्य", - "catEducation": "शिक्षा", + "catEducation": "Education", "catMisc": "विविध", "catEarnedIncome": "कमाई आय", "catInvestmentIncome": "निवेश आय", "catTransferGiftIncome": "स्थानांतरण और उपहार", "catGovernmentBenefits": "सामाजिक लाभ", "catOtherIncome": "अन्य आय", - "loadingIndicator": "लोड हो रहा है…" + "loadingIndicator": "लोड हो रहा है…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "सेटिंग्स", diff --git a/public/locales/it.json b/public/locales/it.json index 13ad9c4..8824541 100644 --- a/public/locales/it.json +++ b/public/locales/it.json @@ -43,7 +43,7 @@ "main": "Navigazione principale", "navigation": "Navigazione", "quickActions": "Azioni rapide", - "recipes": "Ricette", + "recipes": "Recipes", "more": "Altro" }, "dashboard": { @@ -255,10 +255,10 @@ "recipeUrlLabel": "Link ricetta (opzionale)", "recipeUrlPlaceholder": "https://…", "openRecipe": "Apri ricetta", - "savedRecipeLabel": "Ricette salvate", - "savedRecipePlaceholder": "Seleziona ricetta", - "saveAsRecipe": "Salva come ricetta", - "recipeScaleLabel": "Scala ingredienti" + "savedRecipeLabel": "Saved recipe", + "savedRecipePlaceholder": "Select recipe", + "saveAsRecipe": "Save as recipe", + "recipeScaleLabel": "Scale ingredients" }, "calendar": { "title": "Calendario", @@ -463,11 +463,11 @@ "trendNeutral": "- come {{month}}", "validAmountRequired": "Inserisci un importo valido", "dateRequired": "La data è obbligatoria", - "catFood": "Spesa alimentare", + "catFood": "Alimentazione", "catRent": "Affitto", "catInsurance": "Assicurazione", "catMobility": "Trasporti", - "catLeisure": "Tempo libero", + "catLeisure": "Tempo libero e intrattenimento", "catClothing": "Abbigliamento", "catHealth": "Salute", "catEducation": "Istruzione", @@ -477,7 +477,54 @@ "catTransferGiftIncome": "Trasferimenti e Regali", "catGovernmentBenefits": "Prestazioni Sociali", "catOtherIncome": "Altro Reddito", - "loadingIndicator": "Caricamento…" + "loadingIndicator": "Caricamento…", + "subcategoryLabel": "Sottocategoria", + "catHousing": "Abitazione / Casa", + "catTransport": "Trasporti", + "catPersonalHealth": "Cura personale / Salute", + "catShoppingClothing": "Acquisti e abbigliamento", + "catFinancialOther": "Servizi finanziari e altro", + "subcatRentMortgage": "Affitto / Mutuo", + "subcatCondominium": "Condominio", + "subcatUtilities": "Luce / Acqua / Gas", + "subcatInternetTvPhone": "Internet / TV / Telefono", + "subcatRenovationMaintenance": "Ristrutturazione / Manutenzione", + "subcatCleaning": "Pulizia", + "subcatGroceries": "Supermercato", + "subcatRestaurantsBars": "Ristoranti / Bar", + "subcatSnacksFastFood": "Snack / Fast food", + "subcatBakery": "Panetteria", + "subcatFuel": "Carburante", + "subcatParkingTolls": "Parcheggio / Pedaggi", + "subcatPublicTransport": "Trasporto pubblico", + "subcatAppsTaxi": "App / Taxi", + "subcatMaintenanceInsurance": "Manutenzione / Assicurazione", + "subcatPharmacy": "Farmacia", + "subcatHealthInsurance": "Assicurazione sanitaria", + "subcatGymSports": "Palestra / Sport", + "subcatBeautyCosmetics": "Bellezza / Cosmetici", + "subcatTravel": "Viaggi", + "subcatStreaming": "Streaming", + "subcatEvents": "Eventi", + "subcatHobbies": "Hobby", + "subcatClothesShoes": "Vestiti / Scarpe", + "subcatElectronics": "Elettronica", + "subcatGifts": "Regali", + "subcatCoursesCollege": "Corsi / Università", + "subcatSchoolSupplies": "Materiale scolastico", + "subcatLanguages": "Lingue", + "subcatLoansInterest": "Prestiti / Interessi", + "subcatBankFees": "Commissioni bancarie", + "subcatInsuranceOther": "Assicurazioni", + "subcatInvestments": "Investimenti", + "subcatTaxes": "Imposte", + "metaLoadError": "Impossibile caricare le categorie del budget.", + "addCategory": "+ categoria", + "addSubcategory": "+ sottocategoria", + "newCategoryPrompt": "Nome della nuova categoria:", + "newSubcategoryPrompt": "Nome della nuova sottocategoria:", + "categoryAddedToast": "Categoria aggiunta.", + "subcategoryAddedToast": "Sottocategoria aggiunta." }, "settings": { "title": "Impostazioni", @@ -659,28 +706,28 @@ "unitMonths": "mesi" }, "recipes": { - "title": "Ricette", - "addRecipe": "Aggiungi ricetta", - "editRecipe": "Modifica ricetta", - "emptyTitle": "Nessuna ricetta", - "emptyDescription": "Salva le tue ricette preferite e riutilizzale nella pianificazione dei pasti.", - "titleLabel": "Titolo *", - "titlePlaceholder": "es. Pasta Carbonara", - "notesLabel": "Note", - "notesPlaceholder": "Opzionale...", - "urlLabel": "Link della ricetta", + "title": "Recipes", + "addRecipe": "Add recipe", + "editRecipe": "Edit recipe", + "emptyTitle": "No recipes yet", + "emptyDescription": "Save your favorite recipes and reuse them in meal planning.", + "titleLabel": "Title *", + "titlePlaceholder": "e.g. Pasta Carbonara", + "notesLabel": "Notes", + "notesPlaceholder": "Optional...", + "urlLabel": "Recipe link", "urlPlaceholder": "https://...", - "ingredientsLabel": "Ingredienti", - "addToMeals": "Aggiungi al piano alimentare", - "openLink": "Apri il link della ricetta", - "deleteConfirm": "Eliminare la ricetta \"{{title}}\"?", - "created": "Ricetta salvata.", - "updated": "Ricetta aggiornata.", - "deleted": "Ricetta eliminata.", - "titleRequired": "È richiesto il titolo", - "duplicate": "Duplicato", - "duplicated": "Ricetta duplicata.", - "copySuffix": "copia" + "ingredientsLabel": "Ingredients", + "addToMeals": "Add to meal plan", + "openLink": "Open recipe link", + "deleteConfirm": "Delete recipe \"{{title}}\"?", + "created": "Recipe saved.", + "updated": "Recipe updated.", + "deleted": "Recipe deleted.", + "titleRequired": "Title is required", + "duplicate": "Duplicate", + "duplicated": "Recipe duplicated.", + "copySuffix": "copy" }, "search": { "title": "Ricerca", diff --git a/public/locales/ja.json b/public/locales/ja.json index d799c7e..806f6d7 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -463,21 +463,68 @@ "trendNeutral": "- {{month}} と同じ", "validAmountRequired": "有効な金額を入力してください", "dateRequired": "日付は必須です", - "catFood": "食費", + "catFood": "Food", "catRent": "家賃", "catInsurance": "保険", "catMobility": "交通費", - "catLeisure": "娯楽", + "catLeisure": "Leisure and Entertainment", "catClothing": "衣服", "catHealth": "医療", - "catEducation": "教育", + "catEducation": "Education", "catMisc": "その他", "catEarnedIncome": "給与・報酬", "catInvestmentIncome": "投資収入", "catTransferGiftIncome": "譲渡・贈与", "catGovernmentBenefits": "社会保障給付", "catOtherIncome": "その他の収入", - "loadingIndicator": "読み込み中…" + "loadingIndicator": "読み込み中…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "設定", diff --git a/public/locales/pt.json b/public/locales/pt.json index 8f56de8..5c86ccf 100644 --- a/public/locales/pt.json +++ b/public/locales/pt.json @@ -467,7 +467,7 @@ "catRent": "Aluguel", "catInsurance": "Seguro", "catMobility": "Transporte", - "catLeisure": "Lazer", + "catLeisure": "Lazer e Entretenimento", "catClothing": "Roupas", "catHealth": "Saúde", "catEducation": "Educação", @@ -477,7 +477,54 @@ "catTransferGiftIncome": "Transferências e Presentes", "catGovernmentBenefits": "Benefícios Sociais", "catOtherIncome": "Outras Rendas", - "loadingIndicator": "Carregando…" + "loadingIndicator": "Carregando…", + "subcategoryLabel": "Subcategoria", + "catHousing": "Habitação / Casa", + "catTransport": "Transporte", + "catPersonalHealth": "Cuidados Pessoais / Saúde", + "catShoppingClothing": "Compras e Vestuário", + "catFinancialOther": "Serviços Financeiros e Outros", + "subcatRentMortgage": "Aluguel / Prestação", + "subcatCondominium": "Condomínio", + "subcatUtilities": "Luz / Água / Gás", + "subcatInternetTvPhone": "Internet / TV / Telefone", + "subcatRenovationMaintenance": "Reforma / Manutenção", + "subcatCleaning": "Limpeza", + "subcatGroceries": "Supermercado", + "subcatRestaurantsBars": "Restaurante / Bares", + "subcatSnacksFastFood": "Lanches / Fast Food", + "subcatBakery": "Padaria", + "subcatFuel": "Combustível", + "subcatParkingTolls": "Estacionamento / Pedágio", + "subcatPublicTransport": "Transporte Público", + "subcatAppsTaxi": "Aplicativos / Táxi", + "subcatMaintenanceInsurance": "Manutenção / Seguro", + "subcatPharmacy": "Farmácia", + "subcatHealthInsurance": "Plano de Saúde", + "subcatGymSports": "Academia / Esportes", + "subcatBeautyCosmetics": "Beleza / Cosméticos", + "subcatTravel": "Viagens", + "subcatStreaming": "Streaming", + "subcatEvents": "Eventos", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Roupas / Calçados", + "subcatElectronics": "Eletrônicos", + "subcatGifts": "Presentes", + "subcatCoursesCollege": "Cursos / Faculdade", + "subcatSchoolSupplies": "Material Escolar", + "subcatLanguages": "Idiomas", + "subcatLoansInterest": "Empréstimos / Juros", + "subcatBankFees": "Tarifas Bancárias", + "subcatInsuranceOther": "Seguros", + "subcatInvestments": "Investimentos", + "subcatTaxes": "Impostos", + "metaLoadError": "Categorias do orçamento não puderam ser carregadas.", + "addCategory": "+ categoria", + "addSubcategory": "+ subcategoria", + "newCategoryPrompt": "Nome da nova categoria:", + "newSubcategoryPrompt": "Nome da nova subcategoria:", + "categoryAddedToast": "Categoria adicionada.", + "subcategoryAddedToast": "Subcategoria adicionada." }, "settings": { "title": "Configurações", diff --git a/public/locales/ru.json b/public/locales/ru.json index 6363454..dca2ff4 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -463,21 +463,68 @@ "trendNeutral": "— как в {{month}}", "validAmountRequired": "Введите корректную сумму", "dateRequired": "Дата обязательна", - "catFood": "Продукты", + "catFood": "Food", "catRent": "Аренда", "catInsurance": "Страховка", "catMobility": "Транспорт", - "catLeisure": "Досуг", + "catLeisure": "Leisure and Entertainment", "catClothing": "Одежда", "catHealth": "Здоровье", - "catEducation": "Образование", + "catEducation": "Education", "catMisc": "Разное", "catEarnedIncome": "Трудовой доход", "catInvestmentIncome": "Инвестиционный доход", "catTransferGiftIncome": "Переводы и подарки", "catGovernmentBenefits": "Социальные пособия", "catOtherIncome": "Прочие доходы", - "loadingIndicator": "Загрузка…" + "loadingIndicator": "Загрузка…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Настройки", diff --git a/public/locales/sv.json b/public/locales/sv.json index a0949af..5d36878 100644 --- a/public/locales/sv.json +++ b/public/locales/sv.json @@ -463,21 +463,68 @@ "trendNeutral": "- samma som {{month}}", "validAmountRequired": "Ange ett giltigt belopp", "dateRequired": "Datum krävs", - "catFood": "Specerier", + "catFood": "Food", "catRent": "Hyra", "catInsurance": "Försäkring", "catMobility": "Transport", - "catLeisure": "Fritid", + "catLeisure": "Leisure and Entertainment", "catClothing": "Kläder", "catHealth": "Hälsa", - "catEducation": "Utbildning", + "catEducation": "Education", "catMisc": "Diverse", "catEarnedIncome": "Arbetsinkomst", "catInvestmentIncome": "Investeringsinkomst", "catTransferGiftIncome": "Överföringar och gåvor", "catGovernmentBenefits": "Socialförmåner", "catOtherIncome": "Övrig inkomst", - "loadingIndicator": "Laddar…" + "loadingIndicator": "Laddar…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Inställningar", diff --git a/public/locales/tr.json b/public/locales/tr.json index c25ee13..bd0d42d 100644 --- a/public/locales/tr.json +++ b/public/locales/tr.json @@ -463,21 +463,68 @@ "trendNeutral": "- {{month}} ile aynı", "validAmountRequired": "Lütfen geçerli bir tutar girin", "dateRequired": "Tarih zorunludur", - "catFood": "Market", + "catFood": "Food", "catRent": "Kira", "catInsurance": "Sigorta", "catMobility": "Ulaşım", - "catLeisure": "Eğlence", + "catLeisure": "Leisure and Entertainment", "catClothing": "Giyim", "catHealth": "Sağlık", - "catEducation": "Eğitim", + "catEducation": "Education", "catMisc": "Diğer", "catEarnedIncome": "Kazanç Geliri", "catInvestmentIncome": "Yatırım Geliri", "catTransferGiftIncome": "Transferler ve Hediyeler", "catGovernmentBenefits": "Sosyal Yardımlar", "catOtherIncome": "Diğer Gelir", - "loadingIndicator": "Yükleniyor…" + "loadingIndicator": "Yükleniyor…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Ayarlar", diff --git a/public/locales/uk.json b/public/locales/uk.json index 1dfd859..1cff39c 100644 --- a/public/locales/uk.json +++ b/public/locales/uk.json @@ -463,21 +463,68 @@ "trendNeutral": "— так само, як у {{month}}", "validAmountRequired": "Будь ласка, введіть коректну суму", "dateRequired": "Дата є обов'язковою", - "catFood": "Продукти", + "catFood": "Food", "catRent": "Оренда", "catInsurance": "Страхування", "catMobility": "Транспорт", - "catLeisure": "Дозвілля", + "catLeisure": "Leisure and Entertainment", "catClothing": "Одяг", "catHealth": "Здоров'я", - "catEducation": "Освіта", + "catEducation": "Education", "catMisc": "Різне", "catEarnedIncome": "Трудовий дохід", "catInvestmentIncome": "Інвестиційний дохід", "catTransferGiftIncome": "Переводи та подарунки", "catGovernmentBenefits": "Соціальні виплати", "catOtherIncome": "Інші доходи", - "loadingIndicator": "Завантаження…" + "loadingIndicator": "Завантаження…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "Налаштування", diff --git a/public/locales/zh.json b/public/locales/zh.json index 16a1f7d..539bf8b 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -463,21 +463,68 @@ "trendNeutral": "- 与 {{month}} 相同", "validAmountRequired": "请输入有效金额", "dateRequired": "日期为必填项", - "catFood": "食品", + "catFood": "Food", "catRent": "租金", "catInsurance": "保险", "catMobility": "出行", - "catLeisure": "休闲", + "catLeisure": "Leisure and Entertainment", "catClothing": "服装", "catHealth": "健康", - "catEducation": "教育", + "catEducation": "Education", "catMisc": "其他", "catEarnedIncome": "劳动收入", "catInvestmentIncome": "投资收入", "catTransferGiftIncome": "转账和礼物", "catGovernmentBenefits": "社会福利", "catOtherIncome": "其他收入", - "loadingIndicator": "加载中…" + "loadingIndicator": "加载中…", + "subcategoryLabel": "Subcategory", + "catHousing": "Housing / Home", + "catTransport": "Transport", + "catPersonalHealth": "Personal Care / Health", + "catShoppingClothing": "Shopping and Clothing", + "catFinancialOther": "Financial Services and Other", + "subcatRentMortgage": "Rent / Mortgage", + "subcatCondominium": "Condominium fees", + "subcatUtilities": "Electricity / Water / Gas", + "subcatInternetTvPhone": "Internet / TV / Phone", + "subcatRenovationMaintenance": "Renovation / Maintenance", + "subcatCleaning": "Cleaning", + "subcatGroceries": "Groceries", + "subcatRestaurantsBars": "Restaurants / Bars", + "subcatSnacksFastFood": "Snacks / Fast Food", + "subcatBakery": "Bakery", + "subcatFuel": "Fuel", + "subcatParkingTolls": "Parking / Tolls", + "subcatPublicTransport": "Public transport", + "subcatAppsTaxi": "Apps / Taxi", + "subcatMaintenanceInsurance": "Maintenance / Insurance", + "subcatPharmacy": "Pharmacy", + "subcatHealthInsurance": "Health insurance", + "subcatGymSports": "Gym / Sports", + "subcatBeautyCosmetics": "Beauty / Cosmetics", + "subcatTravel": "Travel", + "subcatStreaming": "Streaming", + "subcatEvents": "Events", + "subcatHobbies": "Hobbies", + "subcatClothesShoes": "Clothes / Shoes", + "subcatElectronics": "Electronics", + "subcatGifts": "Gifts", + "subcatCoursesCollege": "Courses / College", + "subcatSchoolSupplies": "School supplies", + "subcatLanguages": "Languages", + "subcatLoansInterest": "Loans / Interest", + "subcatBankFees": "Bank fees", + "subcatInsuranceOther": "Insurance", + "subcatInvestments": "Investments", + "subcatTaxes": "Taxes", + "metaLoadError": "Budget categories could not be loaded.", + "addCategory": "+ category", + "addSubcategory": "+ subcategory", + "newCategoryPrompt": "Name of the new category:", + "newSubcategoryPrompt": "Name of the new subcategory:", + "categoryAddedToast": "Category added.", + "subcategoryAddedToast": "Subcategory added." }, "settings": { "title": "设置", diff --git a/public/pages/budget.js b/public/pages/budget.js index 5eb29d8..df34311 100644 --- a/public/pages/budget.js +++ b/public/pages/budget.js @@ -15,29 +15,16 @@ import { esc } from '/utils/html.js'; // Konstanten // -------------------------------------------------------- -const EXPENSE_CATEGORIES = [ - 'Lebensmittel', 'Miete', 'Versicherung', 'Mobilität', - 'Freizeit', 'Kleidung', 'Gesundheit', 'Bildung', 'Sonstiges', -]; - -const INCOME_CATEGORIES = [ - 'Erwerbseinkommen', 'Kapitalerträge', 'Geschenke & Transfers', - 'Sozialleistungen', 'Sonstiges Einkommen', -]; - -const CATEGORIES = [...EXPENSE_CATEGORIES, ...INCOME_CATEGORIES]; - -const CATEGORY_LABELS = () => ({ +const CATEGORY_I18N = () => ({ // Expense categories - 'Lebensmittel': t('budget.catFood'), - 'Miete': t('budget.catRent'), - 'Versicherung': t('budget.catInsurance'), - 'Mobilität': t('budget.catMobility'), - 'Freizeit': t('budget.catLeisure'), - 'Kleidung': t('budget.catClothing'), - 'Gesundheit': t('budget.catHealth'), - 'Bildung': t('budget.catEducation'), - 'Sonstiges': t('budget.catMisc'), + housing: t('budget.catHousing'), + food: t('budget.catFood'), + transport: t('budget.catTransport'), + personal_health: t('budget.catPersonalHealth'), + leisure: t('budget.catLeisure'), + shopping_clothing: t('budget.catShoppingClothing'), + education: t('budget.catEducation'), + financial_other: t('budget.catFinancialOther'), // Income categories 'Erwerbseinkommen': t('budget.catEarnedIncome'), 'Kapitalerträge': t('budget.catInvestmentIncome'), @@ -46,6 +33,82 @@ const CATEGORY_LABELS = () => ({ 'Sonstiges Einkommen': t('budget.catOtherIncome'), }); +const SUBCATEGORY_I18N = () => ({ + rent_mortgage: t('budget.subcatRentMortgage'), + condominium: t('budget.subcatCondominium'), + utilities: t('budget.subcatUtilities'), + internet_tv_phone: t('budget.subcatInternetTvPhone'), + renovation_maintenance: t('budget.subcatRenovationMaintenance'), + cleaning: t('budget.subcatCleaning'), + groceries: t('budget.subcatGroceries'), + restaurants_bars: t('budget.subcatRestaurantsBars'), + snacks_fast_food: t('budget.subcatSnacksFastFood'), + bakery: t('budget.subcatBakery'), + fuel: t('budget.subcatFuel'), + parking_tolls: t('budget.subcatParkingTolls'), + public_transport: t('budget.subcatPublicTransport'), + apps_taxi: t('budget.subcatAppsTaxi'), + maintenance_insurance: t('budget.subcatMaintenanceInsurance'), + pharmacy: t('budget.subcatPharmacy'), + health_insurance: t('budget.subcatHealthInsurance'), + gym_sports: t('budget.subcatGymSports'), + beauty_cosmetics: t('budget.subcatBeautyCosmetics'), + travel: t('budget.subcatTravel'), + streaming: t('budget.subcatStreaming'), + events: t('budget.subcatEvents'), + hobbies: t('budget.subcatHobbies'), + clothes_shoes: t('budget.subcatClothesShoes'), + electronics: t('budget.subcatElectronics'), + gifts: t('budget.subcatGifts'), + courses_college: t('budget.subcatCoursesCollege'), + school_supplies: t('budget.subcatSchoolSupplies'), + languages: t('budget.subcatLanguages'), + loans_interest: t('budget.subcatLoansInterest'), + bank_fees: t('budget.subcatBankFees'), + insurance_other: t('budget.subcatInsuranceOther'), + investments: t('budget.subcatInvestments'), + taxes: t('budget.subcatTaxes'), +}); + +function categoryLabel(category) { + const item = typeof category === 'object' + ? category + : [...expenseCategories(), ...incomeCategories()].find((c) => c.key === category); + const key = item?.key ?? category; + const name = item?.name ?? category; + return CATEGORY_I18N()[key] ?? name; +} + +function subcategoryLabel(subcategory) { + const item = typeof subcategory === 'object' + ? subcategory + : Object.values(state.meta.expenseSubcategories ?? {}).flat().find((s) => s.key === subcategory); + const key = item?.key ?? subcategory; + const name = item?.name ?? subcategory; + return SUBCATEGORY_I18N()[key] ?? name; +} + +function expenseCategories() { + return state.meta.expenseCategories ?? []; +} + +function incomeCategories() { + return state.meta.incomeCategories ?? []; +} + +function getSubcategories(category) { + return state.meta.expenseSubcategories?.[category] || []; +} + +function defaultSubcategory(category) { + return getSubcategories(category)[0]?.key || ''; +} + +function defaultCategory(type) { + const cats = type === 'income' ? incomeCategories() : expenseCategories(); + return cats[0]?.key || ''; +} + function getMonthName(monthIndex) { // monthIndex: 0-based (0=Januar, 11=Dezember) const date = new Date(2000, monthIndex, 1); @@ -62,6 +125,7 @@ let state = { summary: null, prevSummary: null, // Vormonat für Monatsvergleich currency: 'EUR', + meta: { expenseCategories: [], incomeCategories: [], expenseSubcategories: {} }, }; let _container = null; @@ -110,6 +174,21 @@ async function loadMonth(month) { } } +async function loadBudgetMeta() { + try { + const res = await api.get('/budget/meta'); + state.meta = { + expenseCategories: res.data?.expenseCategories ?? [], + incomeCategories: res.data?.incomeCategories ?? [], + expenseSubcategories: res.data?.expenseSubcategories ?? {}, + }; + } catch (err) { + console.error('[Budget] meta Fehler:', err); + state.meta = { expenseCategories: [], incomeCategories: [], expenseSubcategories: {} }; + window.oikos?.showToast(t('budget.metaLoadError'), 'danger'); + } +} + // -------------------------------------------------------- // Entry Point // -------------------------------------------------------- @@ -120,7 +199,10 @@ export async function render(container, { user }) { state.month = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}`; try { - const prefsRes = await api.get('/preferences'); + const [prefsRes] = await Promise.all([ + api.get('/preferences'), + loadBudgetMeta(), + ]); state.currency = prefsRes.data?.currency ?? 'EUR'; } catch (_) { /* Fallback auf EUR */ } @@ -274,7 +356,7 @@ function renderCategoryBars(byCategory) { return `