feat: add French, Turkish, Russian, Greek and Chinese UI languages + TRY/RUB currencies

This commit is contained in:
Ulas
2026-04-13 09:40:38 +02:00
parent 01d1f583b8
commit e61644702c
13 changed files with 3002 additions and 6 deletions
+7
View File
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.16.3] - 2026-04-13
### Added
- i18n: five new UI languages - French (fr), Turkish (tr), Russian (ru), Greek (el), and Chinese Simplified (zh) with full translations of all keys
- Budget: TRY (Turkish Lira) and RUB (Russian Ruble) added to the list of selectable currencies in Settings
- i18n: Italian locale now includes the complete `rrule` section (was missing previously)
## [0.16.2] - 2026-04-13 ## [0.16.2] - 2026-04-13
### Added ### Added
+2 -2
View File
@@ -51,7 +51,7 @@
**Calendar Sync:** Two-way sync with Google Calendar (OAuth) and Apple iCloud (CalDAV) **Calendar Sync:** Two-way sync with Google Calendar (OAuth) and Apple iCloud (CalDAV)
**Budget Tracking:** Income and expenses, recurring entries, configurable currency (13 currencies), monthly trends, CSV export **Budget Tracking:** Income and expenses, recurring entries, configurable currency (15 currencies), monthly trends, CSV export
**Notes & Contacts:** Colored sticky notes with Markdown, contact directory with vCard import/export **Notes & Contacts:** Colored sticky notes with Markdown, contact directory with vCard import/export
@@ -61,7 +61,7 @@
**PWA Native Feel:** Installable on any device, works offline, dark mode, responsive from phone to desktop **PWA Native Feel:** Installable on any device, works offline, dark mode, responsive from phone to desktop
**Multilingual:** German, English, Italian, and Swedish UI with automatic locale detection **Multilingual:** German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, and Chinese UI with automatic locale detection
## Quick Start ## Quick Start
+7 -1
View File
@@ -234,7 +234,7 @@ User management and app configuration. Logged-in users only.
- **User management (admin):** create new users, edit/delete existing users, assign roles (admin/member) - **User management (admin):** create new users, edit/delete existing users, assign roles (admin/member)
- **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval - **Calendar integration:** connect/disconnect Google Calendar OAuth, store Apple Calendar (CalDAV) credentials, configure sync interval
- **Weather:** configure OpenWeatherMap location - **Weather:** configure OpenWeatherMap location
- **Language:** System (follows `navigator.language`), German, English, Italian, Swedish - via `oikos-locale-picker` web component; switch without page reload - **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese - via `oikos-locale-picker` web component; switch without page reload
- **App info:** version, license - **App info:** version, license
### Budget (`/budget`) ### Budget (`/budget`)
@@ -344,8 +344,14 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o
|------|----------|--------| |------|----------|--------|
| `de` | German | Reference locale (all keys defined here) | | `de` | German | Reference locale (all keys defined here) |
| `en` | English | Full translation | | `en` | English | Full translation |
| `es` | Spanish | Full translation |
| `fr` | French | Full translation (added v0.16.3) |
| `it` | Italian | Full translation (added v0.5.8) | | `it` | Italian | Full translation (added v0.5.8) |
| `sv` | Swedish | Full translation (added v0.11.3) | | `sv` | Swedish | Full translation (added v0.11.3) |
| `el` | Greek | Full translation (added v0.16.3) |
| `ru` | Russian | Full translation (added v0.16.3) |
| `tr` | Turkish | Full translation (added v0.16.3) |
| `zh` | Chinese (Simplified) | Full translation (added v0.16.3) |
### Adding a New Language ### Adding a New Language
+5
View File
@@ -11,8 +11,13 @@ const LOCALE_LABELS = {
de: 'Deutsch', de: 'Deutsch',
en: 'English', en: 'English',
es: 'Español', es: 'Español',
fr: 'Français',
it: 'Italiano', it: 'Italiano',
sv: 'Svenska', sv: 'Svenska',
el: 'Ελληνικά',
ru: 'Русский',
tr: 'Türkçe',
zh: '中文',
}; };
class OikosLocalePicker extends HTMLElement { class OikosLocalePicker extends HTMLElement {
+1 -1
View File
@@ -5,7 +5,7 @@
* Dependencies: none (vanilla JS, Fetch API, Intl API) * Dependencies: none (vanilla JS, Fetch API, Intl API)
*/ */
const SUPPORTED_LOCALES = ['de', 'en', 'es', 'it', 'sv']; const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', 'zh'];
const DEFAULT_LOCALE = 'de'; const DEFAULT_LOCALE = 'de';
const STORAGE_KEY = 'oikos-locale'; const STORAGE_KEY = 'oikos-locale';
+591
View File
@@ -0,0 +1,591 @@
{
"common": {
"save": "Αποθήκευση",
"cancel": "Ακύρωση",
"delete": "Διαγραφή",
"edit": "Επεξεργασία",
"close": "Κλείσιμο",
"create": "Δημιουργία",
"add": "Προσθήκη",
"back": "Πίσω",
"next": "Επόμενο",
"loading": "Φόρτωση…",
"saving": "Αποθήκευση…",
"required": "Αυτό το πεδίο είναι υποχρεωτικό.",
"error": "Σφάλμα",
"allFieldsRequired": "Παρακαλώ συμπληρώστε όλα τα πεδία.",
"today": "Σήμερα",
"tomorrow": "Αύριο",
"skipToContent": "Μετάβαση στο περιεχόμενο",
"reload": "Ανανέωση",
"errorOccurred": "Κάτι πήγε στραβά.",
"unexpectedError": "Παρουσιάστηκε απρόβλεπτο σφάλμα.",
"errorGeneric": "Παρουσιάστηκε σφάλμα.",
"updateAvailable": "Διαθέσιμη ενημέρωση - ανανεώστε τη σελίδα για την τελευταία έκδοση.",
"titleRequired": "Ο τίτλος είναι υποχρεωτικός",
"nameRequired": "Το όνομα είναι υποχρεωτικό",
"contentRequired": "Το περιεχόμενο είναι υποχρεωτικό",
"all": "Όλα",
"unknownError": "Άγνωστο σφάλμα",
"confirm": "Επιβεβαίωση",
"undo": "Αναίρεση"
},
"nav": {
"dashboard": "Επισκόπηση",
"tasks": "Εργασίες",
"calendar": "Ημερολόγιο",
"meals": "Γεύματα",
"shopping": "Αγορές",
"notes": "Σημειώσεις",
"contacts": "Επαφές",
"budget": "Προϋπολογισμός",
"settings": "Ρυθμίσεις",
"main": "Κύρια πλοήγηση",
"navigation": "Πλοήγηση",
"quickActions": "Γρήγορες ενέργειες"
},
"dashboard": {
"title": "Επισκόπηση",
"greetingMorning": "Καλημέρα, {{name}}",
"greetingDay": "Καλησπέρα, {{name}}",
"greetingEvening": "Καλό βράδυ, {{name}}",
"allDone": "Όλα έτοιμα",
"noEvents": "Δεν υπάρχουν εκδηλώσεις",
"noPinnedNotes": "Δεν υπάρχουν καρφιτσωμένες σημειώσεις",
"todayMeals": "Γεύματα σήμερα",
"allLink": "Όλα",
"weekLink": "Εβδομάδα",
"urgentTasksChip": "{{count}} επείγουσα εργασία",
"urgentTasksChipPlural": "{{count}} επείγουσες εργασίες",
"eventsChip": "{{count}} εκδήλωση σήμερα",
"eventsChipPlural": "{{count}} εκδηλώσεις σήμερα",
"todayMealChip": "Σήμερα: {{title}}",
"loadError": "Η επισκόπηση δεν φορτώθηκε πλήρως.",
"weatherRefresh": "Ανανέωση καιρού",
"weatherRefreshTitle": "Ανανέωση",
"weatherUpdated": "Καιρός ενημερώθηκε",
"weatherFeelsLike": "Αίσθηση {{temp}}° · {{humidity}}% · Άνεμος {{wind}} χλμ/ώ",
"fabTaskLabel": "Προσθήκη εργασίας",
"fabCalendarLabel": "Προσθήκη εκδήλωσης",
"fabShoppingLabel": "Προσθήκη αγοράς",
"fabNoteLabel": "Προσθήκη σημείωσης",
"fabTask": "Εργασία",
"fabCalendar": "Εκδήλωση",
"fabShopping": "Αγορά",
"fabNote": "Σημείωση",
"overdue": "Εκπρόθεσμο",
"dueSoon": "Λήγει σήμερα",
"dueTomorrow": "Λήγει αύριο",
"allDay": "Όλη μέρα",
"shoppingMore": "+{{count}} ακόμα"
},
"tasks": {
"title": "Εργασίες",
"newTask": "Νέα εργασία",
"editTask": "Επεξεργασία εργασίας",
"emptyTitle": "Δεν υπάρχουν εργασίες - όλα έτοιμα;",
"emptyDescription": "Δημιουργήστε νέες εργασίες με το κουμπί +.",
"titleLabel": "Τίτλος *",
"titlePlaceholder": "Τι πρέπει να γίνει;",
"descriptionLabel": "Σημείωση",
"descriptionPlaceholder": "Προαιρετικές λεπτομέρειες…",
"priorityLabel": "Προτεραιότητα",
"categoryLabel": "Κατηγορία",
"dueDateLabel": "Ημερομηνία λήξης",
"dueTimeLabel": "Ώρα",
"assignedLabel": "Ανατεθειμένο σε",
"assignedNobody": "- Κανέναν -",
"statusLabel": "Κατάσταση",
"priorityUrgent": "Επείγον",
"priorityHigh": "Υψηλή",
"priorityMedium": "Μέτρια",
"priorityLow": "Χαμηλή",
"priorityNone": "Καμία",
"statusOpen": "Ανοιχτό",
"statusInProgress": "Σε εξέλιξη",
"statusDone": "Ολοκληρώθηκε",
"categoryHousehold": "Οικιακά",
"categorySchool": "Σχολείο",
"categoryShopping": "Αγορές",
"categoryRepair": "Επισκευή",
"categoryHealth": "Υγεία",
"categoryFinance": "Οικονομικά",
"categoryLeisure": "Ελεύθερος χρόνος",
"categoryMisc": "Διάφορα",
"overdue": "Εκπρόθεσμο",
"overdueDay": "{{count}}μ εκπρόθεσμο",
"dueToday": "Λήγει σήμερα",
"dueTomorrow": "Λήγει αύριο",
"groupOverdue": "Εκπρόθεσμο",
"groupToday": "Σήμερα",
"groupThisWeek": "Αυτή την εβδομάδα",
"groupNextWeek": "Επόμενη εβδομάδα",
"groupLater": "Αργότερα",
"groupNoDate": "Χωρίς ημερομηνία",
"markDone": "Επισήμανση {{title}} ως ολοκληρωμένο",
"editButton": "Επεξεργασία εργασίας",
"swipeOpen": "Επαναφορά",
"swipeDone": "Ολοκληρώθηκε",
"swipeEdit": "Επεξεργασία",
"subtaskAdd": "+ Προσθήκη υποεργασίας",
"subtaskToggle": "Εμφάνιση υποεργασιών",
"subtaskMarkDone": "Επισήμανση {{title}} ως ολοκληρωμένο",
"deleteConfirm": "Διαγραφή εργασίας και όλων των υποεργασιών;",
"savedToast": "Η εργασία αποθηκεύτηκε.",
"createdToast": "Η εργασία δημιουργήθηκε.",
"deletedToast": "Η εργασία διαγράφηκε.",
"loadError": "Δεν ήταν δυνατή η φόρτωση της εργασίας.",
"subtaskPrompt": "Υποεργασία:",
"kanbanOpen": "Ανοιχτό",
"kanbanInProgress": "Σε εξέλιξη",
"kanbanDone": "Ολοκληρώθηκε",
"kanbanMoveToInProgress": "Μετακίνηση σε εξέλιξη",
"kanbanMoveToDone": "Επισήμανση ως ολοκληρωμένο",
"kanbanMoveToOpen": "Επαναφορά",
"recurring": "Επαναλαμβανόμενο",
"listView": "Προβολή λίστας",
"kanbanView": "Προβολή Kanban"
},
"shopping": {
"title": "Αγορές",
"noLists": "Δεν υπάρχουν λίστες",
"noListsDescription": "Δημιουργήστε μια λίστα με το κουμπί +.",
"emptyList": "Η λίστα είναι κενή",
"emptyListDescription": "Προσθέστε είδη μέσω του πεδίου εισαγωγής πάνω.",
"newListPrompt": "Όνομα νέας λίστας:",
"newListButton": "Δημιουργία νέας λίστας",
"renameListPrompt": "Νέο όνομα λίστας:",
"deleteListConfirm": "Διαγραφή λίστας «{{name}}» και όλων των ειδών;",
"deletedListToast": "Η λίστα διαγράφηκε.",
"itemDeletedToast": "Το «{{name}}» αφαιρέθηκε.",
"itemsRemovedToast": "{{count}} είδη αφαιρέθηκαν.",
"clearChecked": "Αφαίρεση επιλεγμένων ({{count}})",
"itemNamePlaceholder": "Προσθήκη είδους…",
"itemQtyPlaceholder": "Ποσότητα",
"itemNameLabel": "Όνομα είδους",
"itemQtyLabel": "Ποσότητα",
"categoryLabel": "Κατηγορία",
"addItemLabel": "Προσθήκη είδους",
"renameListLabel": "Μετονομασία λίστας",
"deleteListLabel": "Διαγραφή λίστας",
"swipeBack": "Αναίρεση",
"swipeCheck": "Επισήμανση",
"swipeDelete": "Διαγραφή",
"markDoneLabel": "Επισήμανση {{name}}",
"markUndoneLabel": "Αφαίρεση επισήμανσης {{name}}",
"deleteItemLabel": "Διαγραφή {{name}}",
"listsLoadError": "Δεν ήταν δυνατή η φόρτωση λιστών.",
"itemsLoadError": "Δεν ήταν δυνατή η φόρτωση ειδών.",
"catFruitVeg": "Φρούτα και λαχανικά",
"catBakery": "Αρτοποιία",
"catDairy": "Γαλακτοκομικά",
"catMeatFish": "Κρέας και ψάρι",
"catFrozen": "Κατεψυγμένα",
"catDrinks": "Ποτά",
"catHousehold": "Οικιακά",
"catDrugstore": "Φαρμακείο",
"catMisc": "Διάφορα"
},
"meals": {
"title": "Πρόγραμμα γευμάτων",
"noMealPlanned": "Δεν έχει προγραμματιστεί γεύμα",
"addMeal": "Προσθήκη {{type}}",
"editMeal": "Επεξεργασία γεύματος",
"addMealTitle": "Προσθήκη γεύματος",
"deleteMeal": "Διαγραφή γεύματος",
"transferToShoppingList": "Προσθήκη υλικών στη λίστα αγορών",
"today": "Σήμερα",
"prevWeek": "Προηγούμενη εβδομάδα",
"nextWeek": "Επόμενη εβδομάδα",
"loadError": "Δεν ήταν δυνατή η φόρτωση του προγράμματος γευμάτων.",
"typeBreakfast": "Πρωινό",
"typeLunch": "Μεσημεριανό",
"typeDinner": "Βραδινό",
"typeSnack": "Σνακ",
"dayMo": "Δευ",
"dayDi": "Τρί",
"dayMi": "Τετ",
"dayDo": "Πέμ",
"dayFr": "Παρ",
"daySa": "Σάβ",
"daySo": "Κυρ",
"dateLabel": "Ημερομηνία",
"mealTypeLabel": "Γεύμα",
"titleLabel": "Τίτλος *",
"titlePlaceholder": "π.χ. Μακαρονάδα μπολονέζ",
"notesLabel": "Σημειώσεις",
"notesPlaceholder": "Προαιρετικό…",
"ingredientsLabel": "Υλικά",
"addIngredient": "Προσθήκη υλικού",
"ingredientNamePlaceholder": "Υλικό",
"ingredientQtyPlaceholder": "Ποσότητα",
"removeIngredient": "Αφαίρεση υλικού",
"transferLabel": "Μεταφορά υλικών στη λίστα αγορών",
"transferNow": "Μεταφορά τώρα",
"noShoppingLists": "Δεν υπάρχουν λίστες αγορών",
"transferSuccess": "{{count}} υλικό μεταφέρθηκε",
"transferSuccessPlural": "{{count}} υλικά μεταφέρθηκαν",
"transferAlreadyDone": "Όλα τα υλικά έχουν ήδη μεταφερθεί",
"ingredientCount": "{{count}} υλικό",
"ingredientCountPlural": "{{count}} υλικά",
"titleRequired": "Ο τίτλος είναι υποχρεωτικός",
"loadingIndicator": "Φόρτωση…",
"recipeUrlLabel": "Σύνδεσμος συνταγής (προαιρετικό)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "Άνοιγμα συνταγής"
},
"calendar": {
"title": "Ημερολόγιο",
"newEvent": "Νέα εκδήλωση",
"editEvent": "Επεξεργασία εκδήλωσης",
"addEvent": "Προσθήκη εκδήλωσης",
"deleteEvent": "Διαγραφή εκδήλωσης",
"noEvents": "Δεν υπάρχουν εκδηλώσεις στην επιλεγμένη περίοδο.",
"today": "Σήμερα",
"back": "Πίσω",
"forward": "Μπροστά",
"viewMonth": "Μήνας",
"viewWeek": "Εβδομάδα",
"viewDay": "Ημέρα",
"viewAgenda": "Ατζέντα",
"allDay": "Όλη μέρα",
"allDayShort": "όλη μέρα",
"moreEvents": "+{{count}} ακόμα",
"weekNumberLabel": "Εβδ{{week}} · {{month}} {{year}}",
"agendaFrom": "Από {{date}}",
"titleLabel": "Τίτλος *",
"titlePlaceholder": "π.χ. Οδοντίατρος",
"allDayToggle": "Όλη μέρα",
"startDateLabel": "Ημερομηνία έναρξης",
"startTimeLabel": "Ώρα έναρξης",
"endDateLabel": "Ημερομηνία λήξης",
"endTimeLabel": "Ώρα λήξης",
"fromLabel": "Από",
"toLabel": "Έως",
"locationLabel": "Τοποθεσία",
"locationPlaceholder": "Προαιρετικό",
"assignedLabel": "Ανατεθειμένο σε",
"assignedNobody": "- Κανέναν -",
"colorLabel": "Χρώμα {{color}}",
"descriptionLabel": "Περιγραφή",
"descriptionPlaceholder": "Προαιρετικό…",
"popupEdit": "Επεξεργασία",
"deleteConfirm": "Διαγραφή «{{title}}»;",
"createdToast": "Η εκδήλωση δημιουργήθηκε",
"savedToast": "Η εκδήλωση αποθηκεύτηκε",
"deletedToast": "Η εκδήλωση διαγράφηκε",
"loadError": "Δεν ήταν δυνατή η φόρτωση εκδηλώσεων.",
"saveError": "Σφάλμα αποθήκευσης",
"deleteError": "Σφάλμα διαγραφής",
"titleRequired": "Ο τίτλος είναι υποχρεωτικός",
"monthJanuary": "Ιανουάριος",
"monthFebruary": "Φεβρουάριος",
"monthMarch": "Μάρτιος",
"monthApril": "Απρίλιος",
"monthMay": "Μάιος",
"monthJune": "Ιούνιος",
"monthJuly": "Ιούλιος",
"monthAugust": "Αύγουστος",
"monthSeptember": "Σεπτέμβριος",
"monthOctober": "Οκτώβριος",
"monthNovember": "Νοέμβριος",
"monthDecember": "Δεκέμβριος",
"dayShortSunday": "Κυρ",
"dayShortMonday": "Δευ",
"dayShortTuesday": "Τρί",
"dayShortWednesday": "Τετ",
"dayShortThursday": "Πέμ",
"dayShortFriday": "Παρ",
"dayShortSaturday": "Σάβ",
"dayLongSunday": "Κυριακή",
"dayLongMonday": "Δευτέρα",
"dayLongTuesday": "Τρίτη",
"dayLongWednesday": "Τετάρτη",
"dayLongThursday": "Πέμπτη",
"dayLongFriday": "Παρασκευή",
"dayLongSaturday": "Σάββατο",
"timeSuffix": ""
},
"notes": {
"title": "Σημειώσεις",
"newNote": "Νέα σημείωση",
"editNote": "Επεξεργασία σημείωσης",
"addNoteLabel": "Νέα σημείωση",
"searchPlaceholder": "Αναζήτηση σημειώσεων…",
"emptyTitle": "Δεν υπάρχουν σημειώσεις",
"emptyDescription": "Δημιουργήστε νέα σημείωση με το κουμπί +.",
"noResultsTitle": "Δεν βρέθηκαν αποτελέσματα",
"noResultsDescription": "Καμία σημείωση δεν περιέχει «{{query}}».",
"titleLabel": "Τίτλος (προαιρετικό)",
"titlePlaceholder": "Χωρίς τίτλο",
"contentLabel": "Περιεχόμενο",
"contentMarkdownHint": "(Υποστηρίζεται μορφοποίηση Markdown)",
"contentPlaceholder": "Εισαγωγή σημείωσης…",
"colorLabel": "Χρώμα",
"pinnedLabel": "Καρφίτσωμα (εμφανίζεται στην επισκόπηση)",
"pinAction": "Καρφίτσωμα",
"unpinAction": "Αποκαρφίτσωμα",
"deleteLabel": "Διαγραφή σημείωσης",
"deleteConfirm": "Διαγραφή αυτής της σημείωσης;",
"createdToast": "Η σημείωση δημιουργήθηκε",
"savedToast": "Η σημείωση αποθηκεύτηκε",
"deletedToast": "Η σημείωση διαγράφηκε",
"loadError": "Δεν ήταν δυνατή η φόρτωση σημειώσεων.",
"formatBold": "Έντονο (Ctrl+B)",
"formatItalic": "Πλάγιο (Ctrl+I)",
"formatUnderline": "Υπογράμμιση (Ctrl+U)",
"formatStrikethrough": "Διακριτική γραμμή",
"formatHeading": "Επικεφαλίδα",
"formatList": "Λίστα κουκκίδων",
"formatOrderedList": "Αριθμημένη λίστα",
"formatChecklist": "Λίστα ελέγχου",
"formatLink": "Σύνδεσμος",
"formatCode": "Κώδικας",
"formatQuote": "Παράθεση",
"formatDivider": "Διαχωριστής"
},
"contacts": {
"title": "Επαφές",
"newContact": "Νέα επαφή",
"editContact": "Επεξεργασία επαφής",
"addButton": "Νέο",
"newContactLabel": "Νέα επαφή",
"searchPlaceholder": "Αναζήτηση με όνομα, τηλέφωνο ή email…",
"importButton": "Εισαγωγή",
"importLabel": "Εισαγωγή επαφής από vCard",
"importTooltip": "Εισαγωγή vCard",
"emptyTitle": "Δεν υπάρχουν επαφές",
"emptyDescription": "Προσθέστε νέες επαφές με το κουμπί +.",
"filterAll": "Όλες",
"nameLabel": "Όνομα *",
"namePlaceholder": "Πλήρες όνομα",
"categoryLabel": "Κατηγορία",
"phoneLabel": "Τηλέφωνο",
"phonePlaceholder": "+30 …",
"emailLabel": "Email",
"emailPlaceholder": "ονομα@παραδειγμα.gr",
"addressLabel": "Διεύθυνση",
"addressPlaceholder": "Οδός, ΤΚ Πόλη",
"notesLabel": "Σημειώσεις",
"notesPlaceholder": "Προαιρετικό…",
"callLabel": "Κλήση",
"emailActionLabel": "Email",
"mapsLabel": "Άνοιγμα στους Χάρτες",
"exportLabel": "Εξαγωγή ως vCard",
"exportTooltip": "Εξαγωγή vCard",
"deleteLabel": "Διαγραφή επαφής",
"deleteConfirm": "Διαγραφή αυτής της επαφής;",
"deletePersonConfirm": "Διαγραφή «{{name}}»;",
"savedToast": "Η επαφή αποθηκεύτηκε",
"updatedToast": "Η επαφή ενημερώθηκε",
"deletedToast": "Η επαφή διαγράφηκε",
"importedToast": "{{name}} εισήχθη.",
"importError": "Αποτυχία εισαγωγής: {{error}}",
"vcardNoName": "Η vCard δεν περιέχει όνομα.",
"catDoctor": "Γιατρός",
"catSchool": "Σχολείο/Παιδικός σταθμός",
"catAuthority": "Δημόσια υπηρεσία",
"catInsurance": "Ασφάλεια",
"catCraftsman": "Τεχνίτης",
"catEmergency": "Έκτακτη ανάγκη",
"catMisc": "Διάφορα",
"categoryDoctor": "Γιατρός",
"categorySchool": "Σχολείο/Παιδικός σταθμός",
"categoryAuthority": "Δημόσια υπηρεσία",
"categoryInsurance": "Ασφάλεια",
"categoryCraftsman": "Τεχνίτης",
"categoryEmergency": "Έκτακτη ανάγκη",
"categoryOther": "Άλλο"
},
"budget": {
"title": "Προϋπολογισμός",
"newEntry": "Νέα εγγραφή",
"editEntry": "Επεξεργασία εγγραφής",
"addEntryLabel": "Προσθήκη εγγραφής",
"newEntryFabLabel": "Νέα εγγραφή",
"currentMonth": "Τρέχων",
"prevMonth": "Προηγούμενος μήνας",
"nextMonth": "Επόμενος μήνας",
"income": "Έσοδα",
"expenses": "Έξοδα",
"balance": "Υπόλοιπο",
"byCategory": "Ανά κατηγορία",
"transactions": "Συναλλαγές",
"emptyTitle": "Δεν υπάρχουν εγγραφές αυτόν τον μήνα",
"emptyDescription": "Προσθέστε εγγραφές προϋπολογισμού με το κουμπί +.",
"csvExport": "CSV",
"typeExpense": "Έξοδο",
"typeIncome": "Έσοδο",
"titleLabel": "Τίτλος *",
"titlePlaceholder": "π.χ. Σούπερ μάρκετ",
"amountLabel": "Ποσό *",
"amountPlaceholder": "0,00",
"categoryLabel": "Κατηγορία",
"dateLabel": "Ημερομηνία *",
"recurringLabel": "Επαναλαμβανόμενο",
"deleteLabel": "Διαγραφή εγγραφής",
"deleteConfirm": "Διαγραφή αυτής της εγγραφής;",
"deletePersonConfirm": "Διαγραφή «{{title}}»;",
"addedToast": "Η εγγραφή προστέθηκε",
"savedToast": "Η εγγραφή αποθηκεύτηκε",
"deletedToast": "Η εγγραφή διαγράφηκε",
"loadError": "Δεν ήταν δυνατή η φόρτωση του προϋπολογισμού.",
"trendNeutral": "- ίδιο με {{month}}",
"validAmountRequired": "Παρακαλώ εισαγάγετε έγκυρο ποσό",
"dateRequired": "Η ημερομηνία είναι υποχρεωτική",
"catFood": "Τρόφιμα",
"catRent": "Ενοίκιο",
"catInsurance": "Ασφάλεια",
"catMobility": "Μεταφορές",
"catLeisure": "Ελεύθερος χρόνος",
"catClothing": "Ρουχισμός",
"catHealth": "Υγεία",
"catEducation": "Εκπαίδευση",
"catMisc": "Διάφορα",
"loadingIndicator": "Φόρτωση…"
},
"settings": {
"title": "Ρυθμίσεις",
"tabGeneral": "Γενικά",
"tabMeals": "Γεύματα",
"tabBudget": "Προϋπολογισμός",
"tabShopping": "Αγορές",
"tabCalendar": "Ημερολόγιο",
"tabAccount": "Λογαριασμός",
"tabsAriaLabel": "Τμήματα ρυθμίσεων",
"sectionDesign": "Εμφάνιση",
"sectionShopping": "Αγορές",
"shoppingCategoriesLabel": "Κατηγορίες αγορών",
"shoppingCategoriesHint": "Προσθέστε, μετονομάστε, διαγράψτε ή ταξινομήστε κατηγορίες.",
"shoppingCategoryPlaceholder": "Νέα κατηγορία…",
"shoppingCategoryRenameHint": "Κάντε κλικ για μετονομασία",
"shoppingCategoryRenamePrompt": "Νέο όνομα κατηγορίας:",
"shoppingCategoryMoveUp": "Μετακίνηση κατηγορίας πάνω",
"shoppingCategoryMoveDown": "Μετακίνηση κατηγορίας κάτω",
"shoppingCategoryDelete": "Διαγραφή κατηγορίας",
"shoppingCategoryDeleteConfirm": "Διαγραφή κατηγορίας «{{name}}»; Τα υπάρχοντα είδη θα μεταφερθούν στην επόμενη κατηγορία.",
"shoppingCategoryAdded": "Η κατηγορία προστέθηκε.",
"shoppingCategoryRenamed": "Η κατηγορία μετονομάστηκε.",
"shoppingCategoryDeleted": "Η κατηγορία διαγράφηκε.",
"sectionAccount": "Ο λογαριασμός μου",
"sectionCalendarSync": "Συγχρονισμός ημερολογίου",
"sectionFamily": "Μέλη οικογένειας",
"cardAppearance": "Εμφάνιση",
"themeSystem": "Σύστημα",
"themeSysLabel": "Χρήση ρύθμισης συστήματος",
"themeLight": "Ανοιχτό",
"themeLightLabel": "Ανοιχτό θέμα",
"themeDark": "Σκούρο",
"themeDarkLabel": "Σκούρο θέμα",
"changePassword": "Αλλαγή κωδικού",
"currentPasswordLabel": "Τρέχων κωδικός",
"newPasswordLabel": "Νέος κωδικός",
"confirmPasswordLabel": "Επιβεβαίωση νέου κωδικού",
"savePassword": "Αποθήκευση κωδικού",
"passwordMismatch": "Οι κωδικοί δεν ταιριάζουν.",
"passwordSavedToast": "Ο κωδικός άλλαξε επιτυχώς.",
"googleCalendar": "Google Calendar",
"appleCalendar": "Apple Calendar (iCloud)",
"syncNow": "Συγχρονισμός τώρα",
"disconnect": "Αποσύνδεση",
"connectGoogle": "Σύνδεση με Google",
"connected": "Συνδεδεμένο",
"connectedLastSync": "Συνδεδεμένο · Τελευταίο: {{date}}",
"notConnected": "Μη συνδεδεμένο",
"notConfigured": "Μη ρυθμισμένο (λείπουν μεταβλητές .env)",
"configured": "Ρυθμισμένο (μέσω .env)",
"configuredLastSync": "Ρυθμισμένο (μέσω .env) · Τελευταίο: {{date}}",
"syncSuccess": "{{provider}} συγχρονίστηκε.",
"disconnectedToast": "{{provider}} αποσυνδέθηκε.",
"googleOnlyAdmin": "Μόνο ο διαχειριστής μπορεί να συνδέσει το Google Calendar.",
"appleOnlyAdmin": "Μόνο ο διαχειριστής μπορεί να συνδέσει το Apple Calendar.",
"caldavUrlLabel": "URL διακομιστή CalDAV",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple ID (email)",
"applePasswordLabel": "Κωδικός για εφαρμογή",
"applePasswordHint": "Δημιουργήστε κωδικό στο <strong>appleid.apple.com → Ασφάλεια</strong>.",
"appleConnectBtn": "Σύνδεση και δοκιμή",
"appleConnecting": "Σύνδεση…",
"appleConnectedToast": "Το Apple Calendar συνδέθηκε.",
"syncSuccessGoogle": "Ο συγχρονισμός ημερολογίου με Google συνδέθηκε επιτυχώς.",
"syncSuccessApple": "Ο συγχρονισμός ημερολογίου με Apple συνδέθηκε επιτυχώς.",
"syncErrorGoogle": "Η σύνδεση με Google απέτυχε. Δοκιμάστε ξανά.",
"syncErrorApple": "Η σύνδεση με Apple απέτυχε. Δοκιμάστε ξανά.",
"addMember": "+ Προσθήκη μέλους",
"newMemberTitle": "Νέο μέλος οικογένειας",
"usernameLabel": "Όνομα χρήστη",
"displayNameLabel": "Εμφανιζόμενο όνομα",
"memberPasswordLabel": "Κωδικός",
"colorLabel": "Χρώμα",
"roleLabel": "Ρόλος",
"roleMember": "Μέλος",
"roleAdmin": "Διαχειριστής",
"createMember": "Δημιουργία",
"cancelAddMember": "Ακύρωση",
"memberAddedToast": "{{name}} προστέθηκε.",
"deleteMemberConfirm": "Διαγραφή {{name}};",
"memberDeletedToast": "{{name}} διαγράφηκε.",
"deleteMemberLabel": "Διαγραφή",
"logout": "Αποσύνδεση",
"synchronizing": "Συγχρονισμός…",
"googleDisconnectConfirm": "Αποσύνδεση Google Calendar;",
"appleDisconnectConfirm": "Αποσύνδεση Apple Calendar;",
"localeSystem": "Σύστημα",
"localeLabel": "Γλώσσα",
"languageTitle": "Γλώσσα",
"sectionMeals": "Πρόγραμμα γευμάτων",
"mealTypesLabel": "Ορατά γεύματα",
"mealTypesHint": "Στο πρόγραμμα γευμάτων εμφανίζονται μόνο οι επιλεγμένοι τύποι.",
"mealTypesSaved": "Οι ρυθμίσεις προγράμματος γευμάτων αποθηκεύτηκαν.",
"mealTypesMinOne": "Πρέπει να είναι ενεργός τουλάχιστον ένας τύπος γεύματος.",
"sectionBudget": "Προϋπολογισμός",
"currencyLabel": "Νόμισμα",
"currencyHint": "Ορίζει το νόμισμα για ολόκληρη την ενότητα προϋπολογισμού.",
"currencySaved": "Το νόμισμα αποθηκεύτηκε."
},
"login": {
"tagline": "Οικογενειακός προγραμματισμός. Ασφαλής. Φιλικός προς την ιδιωτικότητα. Ανοιχτός κώδικας.",
"usernameLabel": "Όνομα χρήστη",
"usernamePlaceholder": "χρήστης",
"passwordLabel": "Κωδικός",
"passwordPlaceholder": "••••••••",
"loginButton": "Σύνδεση",
"loggingIn": "Σύνδεση…",
"tooManyAttempts": "Πολλές προσπάθειες. Παρακαλώ περιμένετε λίγο.",
"invalidCredentials": "Λανθασμένα στοιχεία σύνδεσης."
},
"install": {
"title": "Εγκατάσταση Oikos",
"subtitle": "Προσθήκη στην αρχική οθόνη",
"iosTip1": "Πατήστε ",
"iosTip2": " → «Προσθήκη στην Αρχική»",
"installButton": "Εγκατάσταση",
"dismissLabel": "Κλείσιμο"
},
"modal": {
"closeLabel": "Κλείσιμο"
},
"rrule": {
"freqNone": "Χωρίς επανάληψη",
"freqDaily": "Ημερησίως",
"freqWeekly": "Εβδομαδιαίως",
"freqMonthly": "Μηνιαίως",
"dayMo": "Δε",
"dayTu": "Τρ",
"dayWe": "Τε",
"dayTh": "Πε",
"dayFr": "Πα",
"daySa": "Σα",
"daySu": "Κυ",
"labelRepeat": "Επανάληψη",
"labelEvery": "Κάθε",
"labelOnDays": "Αυτές τις ημέρες",
"labelUntil": "Λήγει (προαιρετικό)",
"unitDay": "ημέρα",
"unitDays": "ημέρες",
"unitWeek": "εβδομάδα",
"unitWeeks": "εβδομάδες",
"unitMonth": "μήνα",
"unitMonths": "μήνες"
}
}
+591
View File
@@ -0,0 +1,591 @@
{
"common": {
"save": "Enregistrer",
"cancel": "Annuler",
"delete": "Supprimer",
"edit": "Modifier",
"close": "Fermer",
"create": "Créer",
"add": "Ajouter",
"back": "Retour",
"next": "Suivant",
"loading": "Chargement…",
"saving": "Enregistrement…",
"required": "Ce champ est obligatoire.",
"error": "Erreur",
"allFieldsRequired": "Veuillez remplir tous les champs.",
"today": "Aujourd'hui",
"tomorrow": "Demain",
"skipToContent": "Aller au contenu",
"reload": "Recharger",
"errorOccurred": "Une erreur s'est produite.",
"unexpectedError": "Une erreur inattendue s'est produite.",
"errorGeneric": "Une erreur s'est produite.",
"updateAvailable": "Mise à jour disponible - rechargez la page pour obtenir la dernière version.",
"titleRequired": "Le titre est obligatoire",
"nameRequired": "Le nom est obligatoire",
"contentRequired": "Le contenu est obligatoire",
"all": "Tout",
"unknownError": "Erreur inconnue",
"confirm": "Confirmer",
"undo": "Annuler"
},
"nav": {
"dashboard": "Accueil",
"tasks": "Tâches",
"calendar": "Calendrier",
"meals": "Repas",
"shopping": "Courses",
"notes": "Notes",
"contacts": "Contacts",
"budget": "Budget",
"settings": "Paramètres",
"main": "Navigation principale",
"navigation": "Navigation",
"quickActions": "Actions rapides"
},
"dashboard": {
"title": "Accueil",
"greetingMorning": "Bonjour, {{name}}",
"greetingDay": "Bon après-midi, {{name}}",
"greetingEvening": "Bonsoir, {{name}}",
"allDone": "Tout est fait",
"noEvents": "Aucun événement",
"noPinnedNotes": "Aucune note épinglée",
"todayMeals": "Repas du jour",
"allLink": "Tout",
"weekLink": "Semaine",
"urgentTasksChip": "{{count}} tâche urgente",
"urgentTasksChipPlural": "{{count}} tâches urgentes",
"eventsChip": "{{count}} événement aujourd'hui",
"eventsChipPlural": "{{count}} événements aujourd'hui",
"todayMealChip": "Aujourd'hui : {{title}}",
"loadError": "Le tableau de bord n'a pas pu être chargé complètement.",
"weatherRefresh": "Actualiser la météo",
"weatherRefreshTitle": "Actualiser",
"weatherUpdated": "Météo mise à jour",
"weatherFeelsLike": "Ressenti {{temp}}° · {{humidity}}% · Vent {{wind}} km/h",
"fabTaskLabel": "Ajouter une tâche",
"fabCalendarLabel": "Ajouter un événement",
"fabShoppingLabel": "Ajouter une course",
"fabNoteLabel": "Ajouter une note",
"fabTask": "Tâche",
"fabCalendar": "Événement",
"fabShopping": "Course",
"fabNote": "Note",
"overdue": "En retard",
"dueSoon": "À rendre aujourd'hui",
"dueTomorrow": "À rendre demain",
"allDay": "Toute la journée",
"shoppingMore": "+{{count}} de plus"
},
"tasks": {
"title": "Tâches",
"newTask": "Nouvelle tâche",
"editTask": "Modifier la tâche",
"emptyTitle": "Aucune tâche - tout est fait ?",
"emptyDescription": "Créez de nouvelles tâches avec le bouton +.",
"titleLabel": "Titre *",
"titlePlaceholder": "Que faut-il faire ?",
"descriptionLabel": "Note",
"descriptionPlaceholder": "Détails optionnels…",
"priorityLabel": "Priorité",
"categoryLabel": "Catégorie",
"dueDateLabel": "Date d'échéance",
"dueTimeLabel": "Heure",
"assignedLabel": "Assigné à",
"assignedNobody": "- Personne -",
"statusLabel": "Statut",
"priorityUrgent": "Urgent",
"priorityHigh": "Élevée",
"priorityMedium": "Moyenne",
"priorityLow": "Faible",
"priorityNone": "Aucune",
"statusOpen": "Ouvert",
"statusInProgress": "En cours",
"statusDone": "Terminé",
"categoryHousehold": "Maison",
"categorySchool": "École",
"categoryShopping": "Courses",
"categoryRepair": "Réparation",
"categoryHealth": "Santé",
"categoryFinance": "Finances",
"categoryLeisure": "Loisirs",
"categoryMisc": "Divers",
"overdue": "En retard",
"overdueDay": "{{count}}j de retard",
"dueToday": "À rendre aujourd'hui",
"dueTomorrow": "À rendre demain",
"groupOverdue": "En retard",
"groupToday": "Aujourd'hui",
"groupThisWeek": "Cette semaine",
"groupNextWeek": "Semaine prochaine",
"groupLater": "Plus tard",
"groupNoDate": "Sans date",
"markDone": "Marquer {{title}} comme terminé",
"editButton": "Modifier la tâche",
"swipeOpen": "Rouvrir",
"swipeDone": "Terminé",
"swipeEdit": "Modifier",
"subtaskAdd": "+ Ajouter une sous-tâche",
"subtaskToggle": "Afficher les sous-tâches",
"subtaskMarkDone": "Marquer {{title}} comme terminé",
"deleteConfirm": "Supprimer la tâche et toutes ses sous-tâches ?",
"savedToast": "Tâche enregistrée.",
"createdToast": "Tâche créée.",
"deletedToast": "Tâche supprimée.",
"loadError": "La tâche n'a pas pu être chargée.",
"subtaskPrompt": "Sous-tâche :",
"kanbanOpen": "Ouvert",
"kanbanInProgress": "En cours",
"kanbanDone": "Terminé",
"kanbanMoveToInProgress": "Mettre en cours",
"kanbanMoveToDone": "Marquer comme terminé",
"kanbanMoveToOpen": "Rouvrir",
"recurring": "Récurrent",
"listView": "Vue liste",
"kanbanView": "Vue Kanban"
},
"shopping": {
"title": "Courses",
"noLists": "Aucune liste",
"noListsDescription": "Créez une liste avec le bouton +.",
"emptyList": "La liste est vide",
"emptyListDescription": "Ajoutez des articles via le champ de saisie ci-dessus.",
"newListPrompt": "Nom de la nouvelle liste :",
"newListButton": "Créer une nouvelle liste",
"renameListPrompt": "Nouveau nom de la liste :",
"deleteListConfirm": "Supprimer la liste « {{name}} » et tous ses articles ?",
"deletedListToast": "Liste supprimée.",
"itemDeletedToast": "« {{name}} » supprimé.",
"itemsRemovedToast": "{{count}} articles supprimés.",
"clearChecked": "Supprimer les cochés ({{count}})",
"itemNamePlaceholder": "Ajouter un article…",
"itemQtyPlaceholder": "Quantité",
"itemNameLabel": "Nom de l'article",
"itemQtyLabel": "Quantité",
"categoryLabel": "Catégorie",
"addItemLabel": "Ajouter un article",
"renameListLabel": "Renommer la liste",
"deleteListLabel": "Supprimer la liste",
"swipeBack": "Annuler",
"swipeCheck": "Cocher",
"swipeDelete": "Supprimer",
"markDoneLabel": "Cocher {{name}}",
"markUndoneLabel": "Décocher {{name}}",
"deleteItemLabel": "Supprimer {{name}}",
"listsLoadError": "Les listes n'ont pas pu être chargées.",
"itemsLoadError": "Les articles n'ont pas pu être chargés.",
"catFruitVeg": "Fruits et légumes",
"catBakery": "Boulangerie",
"catDairy": "Produits laitiers",
"catMeatFish": "Viande et poisson",
"catFrozen": "Surgelés",
"catDrinks": "Boissons",
"catHousehold": "Ménage",
"catDrugstore": "Pharmacie",
"catMisc": "Divers"
},
"meals": {
"title": "Plan de repas",
"noMealPlanned": "Aucun repas prévu",
"addMeal": "Ajouter {{type}}",
"editMeal": "Modifier le repas",
"addMealTitle": "Ajouter un repas",
"deleteMeal": "Supprimer le repas",
"transferToShoppingList": "Ajouter les ingrédients à la liste de courses",
"today": "Aujourd'hui",
"prevWeek": "Semaine précédente",
"nextWeek": "Semaine suivante",
"loadError": "Le plan de repas n'a pas pu être chargé.",
"typeBreakfast": "Petit-déjeuner",
"typeLunch": "Déjeuner",
"typeDinner": "Dîner",
"typeSnack": "Snack",
"dayMo": "Lun",
"dayDi": "Mar",
"dayMi": "Mer",
"dayDo": "Jeu",
"dayFr": "Ven",
"daySa": "Sam",
"daySo": "Dim",
"dateLabel": "Date",
"mealTypeLabel": "Repas",
"titleLabel": "Titre *",
"titlePlaceholder": "ex. Pâtes bolognaise",
"notesLabel": "Notes",
"notesPlaceholder": "Optionnel…",
"ingredientsLabel": "Ingrédients",
"addIngredient": "Ajouter un ingrédient",
"ingredientNamePlaceholder": "Ingrédient",
"ingredientQtyPlaceholder": "Quantité",
"removeIngredient": "Supprimer l'ingrédient",
"transferLabel": "Transférer les ingrédients vers la liste de courses",
"transferNow": "Transférer maintenant",
"noShoppingLists": "Aucune liste de courses disponible",
"transferSuccess": "{{count}} ingrédient transféré",
"transferSuccessPlural": "{{count}} ingrédients transférés",
"transferAlreadyDone": "Tous les ingrédients ont déjà été transférés",
"ingredientCount": "{{count}} ingrédient",
"ingredientCountPlural": "{{count}} ingrédients",
"titleRequired": "Le titre est obligatoire",
"loadingIndicator": "Chargement…",
"recipeUrlLabel": "Lien recette (optionnel)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "Ouvrir la recette"
},
"calendar": {
"title": "Calendrier",
"newEvent": "Nouvel événement",
"editEvent": "Modifier l'événement",
"addEvent": "Ajouter un événement",
"deleteEvent": "Supprimer l'événement",
"noEvents": "Aucun événement dans la période sélectionnée.",
"today": "Aujourd'hui",
"back": "Retour",
"forward": "Avancer",
"viewMonth": "Mois",
"viewWeek": "Semaine",
"viewDay": "Jour",
"viewAgenda": "Agenda",
"allDay": "Toute la journée",
"allDayShort": "tj.",
"moreEvents": "+{{count}} de plus",
"weekNumberLabel": "S{{week}} · {{month}} {{year}}",
"agendaFrom": "À partir du {{date}}",
"titleLabel": "Titre *",
"titlePlaceholder": "ex. Dentiste",
"allDayToggle": "Toute la journée",
"startDateLabel": "Date de début",
"startTimeLabel": "Heure de début",
"endDateLabel": "Date de fin",
"endTimeLabel": "Heure de fin",
"fromLabel": "De",
"toLabel": "À",
"locationLabel": "Lieu",
"locationPlaceholder": "Optionnel",
"assignedLabel": "Assigné à",
"assignedNobody": "- Personne -",
"colorLabel": "Couleur {{color}}",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Optionnel…",
"popupEdit": "Modifier",
"deleteConfirm": "Supprimer « {{title}} » ?",
"createdToast": "Événement créé",
"savedToast": "Événement enregistré",
"deletedToast": "Événement supprimé",
"loadError": "Les événements n'ont pas pu être chargés.",
"saveError": "Erreur lors de l'enregistrement",
"deleteError": "Erreur lors de la suppression",
"titleRequired": "Le titre est obligatoire",
"monthJanuary": "Janvier",
"monthFebruary": "Février",
"monthMarch": "Mars",
"monthApril": "Avril",
"monthMay": "Mai",
"monthJune": "Juin",
"monthJuly": "Juillet",
"monthAugust": "Août",
"monthSeptember": "Septembre",
"monthOctober": "Octobre",
"monthNovember": "Novembre",
"monthDecember": "Décembre",
"dayShortSunday": "Dim",
"dayShortMonday": "Lun",
"dayShortTuesday": "Mar",
"dayShortWednesday": "Mer",
"dayShortThursday": "Jeu",
"dayShortFriday": "Ven",
"dayShortSaturday": "Sam",
"dayLongSunday": "Dimanche",
"dayLongMonday": "Lundi",
"dayLongTuesday": "Mardi",
"dayLongWednesday": "Mercredi",
"dayLongThursday": "Jeudi",
"dayLongFriday": "Vendredi",
"dayLongSaturday": "Samedi",
"timeSuffix": ""
},
"notes": {
"title": "Notes",
"newNote": "Nouvelle note",
"editNote": "Modifier la note",
"addNoteLabel": "Nouvelle note",
"searchPlaceholder": "Rechercher des notes…",
"emptyTitle": "Aucune note",
"emptyDescription": "Créez une nouvelle note avec le bouton +.",
"noResultsTitle": "Aucun résultat",
"noResultsDescription": "Aucune note ne contient « {{query}} ».",
"titleLabel": "Titre (optionnel)",
"titlePlaceholder": "Sans titre",
"contentLabel": "Contenu",
"contentMarkdownHint": "(Formatage Markdown supporté)",
"contentPlaceholder": "Saisir une note…",
"colorLabel": "Couleur",
"pinnedLabel": "Épingler (apparaît sur le tableau de bord)",
"pinAction": "Épingler",
"unpinAction": "Désépingler",
"deleteLabel": "Supprimer la note",
"deleteConfirm": "Supprimer cette note ?",
"createdToast": "Note créée",
"savedToast": "Note enregistrée",
"deletedToast": "Note supprimée",
"loadError": "Les notes n'ont pas pu être chargées.",
"formatBold": "Gras (Ctrl+B)",
"formatItalic": "Italique (Ctrl+I)",
"formatUnderline": "Souligné (Ctrl+U)",
"formatStrikethrough": "Barré",
"formatHeading": "Titre",
"formatList": "Liste à puces",
"formatOrderedList": "Liste numérotée",
"formatChecklist": "Liste de contrôle",
"formatLink": "Lien",
"formatCode": "Code",
"formatQuote": "Citation",
"formatDivider": "Séparateur"
},
"contacts": {
"title": "Contacts",
"newContact": "Nouveau contact",
"editContact": "Modifier le contact",
"addButton": "Nouveau",
"newContactLabel": "Nouveau contact",
"searchPlaceholder": "Rechercher par nom, téléphone ou e-mail…",
"importButton": "Importer",
"importLabel": "Importer un contact depuis vCard",
"importTooltip": "Importer vCard",
"emptyTitle": "Aucun contact",
"emptyDescription": "Ajoutez de nouveaux contacts avec le bouton +.",
"filterAll": "Tous",
"nameLabel": "Nom *",
"namePlaceholder": "Nom complet",
"categoryLabel": "Catégorie",
"phoneLabel": "Téléphone",
"phonePlaceholder": "+33 …",
"emailLabel": "E-mail",
"emailPlaceholder": "nom@exemple.fr",
"addressLabel": "Adresse",
"addressPlaceholder": "Rue, Code postal Ville",
"notesLabel": "Notes",
"notesPlaceholder": "Optionnel…",
"callLabel": "Appeler",
"emailActionLabel": "E-mail",
"mapsLabel": "Ouvrir dans Maps",
"exportLabel": "Exporter en vCard",
"exportTooltip": "Exporter vCard",
"deleteLabel": "Supprimer le contact",
"deleteConfirm": "Supprimer ce contact ?",
"deletePersonConfirm": "Supprimer « {{name}} » ?",
"savedToast": "Contact enregistré",
"updatedToast": "Contact mis à jour",
"deletedToast": "Contact supprimé",
"importedToast": "{{name}} importé.",
"importError": "Importation échouée : {{error}}",
"vcardNoName": "La vCard ne contient pas de nom.",
"catDoctor": "Médecin",
"catSchool": "École/Crèche",
"catAuthority": "Administration",
"catInsurance": "Assurance",
"catCraftsman": "Artisan",
"catEmergency": "Urgence",
"catMisc": "Divers",
"categoryDoctor": "Médecin",
"categorySchool": "École/Crèche",
"categoryAuthority": "Administration",
"categoryInsurance": "Assurance",
"categoryCraftsman": "Artisan",
"categoryEmergency": "Urgence",
"categoryOther": "Autre"
},
"budget": {
"title": "Budget",
"newEntry": "Nouvelle entrée",
"editEntry": "Modifier l'entrée",
"addEntryLabel": "Ajouter une entrée",
"newEntryFabLabel": "Nouvelle entrée",
"currentMonth": "Actuel",
"prevMonth": "Mois précédent",
"nextMonth": "Mois suivant",
"income": "Revenus",
"expenses": "Dépenses",
"balance": "Solde",
"byCategory": "Par catégorie",
"transactions": "Transactions",
"emptyTitle": "Aucune entrée ce mois-ci",
"emptyDescription": "Ajoutez des entrées budgétaires avec le bouton +.",
"csvExport": "CSV",
"typeExpense": "Dépense",
"typeIncome": "Revenu",
"titleLabel": "Titre *",
"titlePlaceholder": "ex. Supermarché",
"amountLabel": "Montant *",
"amountPlaceholder": "0,00",
"categoryLabel": "Catégorie",
"dateLabel": "Date *",
"recurringLabel": "Récurrent",
"deleteLabel": "Supprimer l'entrée",
"deleteConfirm": "Supprimer cette entrée ?",
"deletePersonConfirm": "Supprimer « {{title}} » ?",
"addedToast": "Entrée ajoutée",
"savedToast": "Entrée enregistrée",
"deletedToast": "Entrée supprimée",
"loadError": "Le budget n'a pas pu être chargé.",
"trendNeutral": "- identique à {{month}}",
"validAmountRequired": "Veuillez saisir un montant valide",
"dateRequired": "La date est obligatoire",
"catFood": "Alimentation",
"catRent": "Loyer",
"catInsurance": "Assurance",
"catMobility": "Transport",
"catLeisure": "Loisirs",
"catClothing": "Vêtements",
"catHealth": "Santé",
"catEducation": "Éducation",
"catMisc": "Divers",
"loadingIndicator": "Chargement…"
},
"settings": {
"title": "Paramètres",
"tabGeneral": "Général",
"tabMeals": "Repas",
"tabBudget": "Budget",
"tabShopping": "Courses",
"tabCalendar": "Calendrier",
"tabAccount": "Compte",
"tabsAriaLabel": "Sections des paramètres",
"sectionDesign": "Apparence",
"sectionShopping": "Courses",
"shoppingCategoriesLabel": "Catégories de courses",
"shoppingCategoriesHint": "Ajoutez, renommez, supprimez ou réorganisez les catégories.",
"shoppingCategoryPlaceholder": "Nouvelle catégorie…",
"shoppingCategoryRenameHint": "Cliquez pour renommer",
"shoppingCategoryRenamePrompt": "Nouveau nom de catégorie :",
"shoppingCategoryMoveUp": "Déplacer la catégorie vers le haut",
"shoppingCategoryMoveDown": "Déplacer la catégorie vers le bas",
"shoppingCategoryDelete": "Supprimer la catégorie",
"shoppingCategoryDeleteConfirm": "Supprimer la catégorie « {{name}} » ? Les articles existants seront déplacés vers la catégorie suivante.",
"shoppingCategoryAdded": "Catégorie ajoutée.",
"shoppingCategoryRenamed": "Catégorie renommée.",
"shoppingCategoryDeleted": "Catégorie supprimée.",
"sectionAccount": "Mon compte",
"sectionCalendarSync": "Synchronisation du calendrier",
"sectionFamily": "Membres de la famille",
"cardAppearance": "Affichage",
"themeSystem": "Système",
"themeSysLabel": "Utiliser le paramètre système",
"themeLight": "Clair",
"themeLightLabel": "Mode clair",
"themeDark": "Sombre",
"themeDarkLabel": "Mode sombre",
"changePassword": "Changer le mot de passe",
"currentPasswordLabel": "Mot de passe actuel",
"newPasswordLabel": "Nouveau mot de passe",
"confirmPasswordLabel": "Confirmer le nouveau mot de passe",
"savePassword": "Enregistrer le mot de passe",
"passwordMismatch": "Les mots de passe ne correspondent pas.",
"passwordSavedToast": "Mot de passe modifié avec succès.",
"googleCalendar": "Google Agenda",
"appleCalendar": "Apple Calendar (iCloud)",
"syncNow": "Synchroniser maintenant",
"disconnect": "Déconnecter",
"connectGoogle": "Connecter avec Google",
"connected": "Connecté",
"connectedLastSync": "Connecté · Dernière sync. : {{date}}",
"notConnected": "Non connecté",
"notConfigured": "Non configuré (variables .env manquantes)",
"configured": "Configuré (via .env)",
"configuredLastSync": "Configuré (via .env) · Dernière sync. : {{date}}",
"syncSuccess": "{{provider}} synchronisé.",
"disconnectedToast": "{{provider}} déconnecté.",
"googleOnlyAdmin": "Seul l'administrateur peut connecter Google Agenda.",
"appleOnlyAdmin": "Seul l'administrateur peut connecter Apple Calendar.",
"caldavUrlLabel": "URL du serveur CalDAV",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Identifiant Apple (e-mail)",
"applePasswordLabel": "Mot de passe spécifique à l'app",
"applePasswordHint": "Créez le mot de passe sur <strong>appleid.apple.com → Sécurité</strong>.",
"appleConnectBtn": "Connecter et tester",
"appleConnecting": "Connexion…",
"appleConnectedToast": "Apple Calendar connecté.",
"syncSuccessGoogle": "Synchronisation du calendrier avec Google réussie.",
"syncSuccessApple": "Synchronisation du calendrier avec Apple réussie.",
"syncErrorGoogle": "La connexion à Google a échoué. Veuillez réessayer.",
"syncErrorApple": "La connexion à Apple a échoué. Veuillez réessayer.",
"addMember": "+ Ajouter un membre",
"newMemberTitle": "Nouveau membre de la famille",
"usernameLabel": "Nom d'utilisateur",
"displayNameLabel": "Nom affiché",
"memberPasswordLabel": "Mot de passe",
"colorLabel": "Couleur",
"roleLabel": "Rôle",
"roleMember": "Membre",
"roleAdmin": "Admin",
"createMember": "Créer",
"cancelAddMember": "Annuler",
"memberAddedToast": "{{name}} ajouté.",
"deleteMemberConfirm": "Supprimer {{name}} ?",
"memberDeletedToast": "{{name}} supprimé.",
"deleteMemberLabel": "Supprimer",
"logout": "Se déconnecter",
"synchronizing": "Synchronisation…",
"googleDisconnectConfirm": "Déconnecter Google Agenda ?",
"appleDisconnectConfirm": "Déconnecter Apple Calendar ?",
"localeSystem": "Système",
"localeLabel": "Langue",
"languageTitle": "Langue",
"sectionMeals": "Plan de repas",
"mealTypesLabel": "Repas visibles",
"mealTypesHint": "Seuls les types de repas sélectionnés s'affichent dans le planificateur.",
"mealTypesSaved": "Paramètres du plan de repas enregistrés.",
"mealTypesMinOne": "Au moins un type de repas doit être actif.",
"sectionBudget": "Budget",
"currencyLabel": "Devise",
"currencyHint": "Définit la devise utilisée dans toute la section budget.",
"currencySaved": "Devise enregistrée."
},
"login": {
"tagline": "Planification familiale. Sécurisée. Respectueuse de la vie privée. Open source.",
"usernameLabel": "Nom d'utilisateur",
"usernamePlaceholder": "identifiant",
"passwordLabel": "Mot de passe",
"passwordPlaceholder": "••••••••",
"loginButton": "Se connecter",
"loggingIn": "Connexion…",
"tooManyAttempts": "Trop de tentatives. Veuillez patienter un moment.",
"invalidCredentials": "Identifiants invalides."
},
"install": {
"title": "Installer Oikos",
"subtitle": "Ajouter à l'écran d'accueil",
"iosTip1": "Appuyez sur ",
"iosTip2": " → « Ajouter à l'écran d'accueil »",
"installButton": "Installer",
"dismissLabel": "Fermer"
},
"modal": {
"closeLabel": "Fermer"
},
"rrule": {
"freqNone": "Pas de répétition",
"freqDaily": "Quotidien",
"freqWeekly": "Hebdomadaire",
"freqMonthly": "Mensuel",
"dayMo": "Lu",
"dayTu": "Ma",
"dayWe": "Me",
"dayTh": "Je",
"dayFr": "Ve",
"daySa": "Sa",
"daySu": "Di",
"labelRepeat": "Répétition",
"labelEvery": "Tous les",
"labelOnDays": "Ces jours-ci",
"labelUntil": "Se termine le (optionnel)",
"unitDay": "jour",
"unitDays": "jours",
"unitWeek": "semaine",
"unitWeeks": "semaines",
"unitMonth": "mois",
"unitMonths": "mois"
}
}
+23
View File
@@ -564,5 +564,28 @@
}, },
"modal": { "modal": {
"closeLabel": "Chiudi" "closeLabel": "Chiudi"
},
"rrule": {
"freqNone": "Nessuna ripetizione",
"freqDaily": "Ogni giorno",
"freqWeekly": "Ogni settimana",
"freqMonthly": "Ogni mese",
"dayMo": "Lu",
"dayTu": "Ma",
"dayWe": "Me",
"dayTh": "Gi",
"dayFr": "Ve",
"daySa": "Sa",
"daySu": "Do",
"labelRepeat": "Ripetizione",
"labelEvery": "Ogni",
"labelOnDays": "In questi giorni",
"labelUntil": "Termina il (opzionale)",
"unitDay": "giorno",
"unitDays": "giorni",
"unitWeek": "settimana",
"unitWeeks": "settimane",
"unitMonth": "mese",
"unitMonths": "mesi"
} }
} }
+591
View File
@@ -0,0 +1,591 @@
{
"common": {
"save": "Сохранить",
"cancel": "Отмена",
"delete": "Удалить",
"edit": "Редактировать",
"close": "Закрыть",
"create": "Создать",
"add": "Добавить",
"back": "Назад",
"next": "Далее",
"loading": "Загрузка…",
"saving": "Сохранение…",
"required": "Это поле обязательно.",
"error": "Ошибка",
"allFieldsRequired": "Пожалуйста, заполните все поля.",
"today": "Сегодня",
"tomorrow": "Завтра",
"skipToContent": "Перейти к содержимому",
"reload": "Обновить",
"errorOccurred": "Что-то пошло не так.",
"unexpectedError": "Произошла непредвиденная ошибка.",
"errorGeneric": "Произошла ошибка.",
"updateAvailable": "Доступно обновление — перезагрузите страницу для получения последней версии.",
"titleRequired": "Заголовок обязателен",
"nameRequired": "Имя обязательно",
"contentRequired": "Содержимое обязательно",
"all": "Все",
"unknownError": "Неизвестная ошибка",
"confirm": "Подтвердить",
"undo": "Отменить"
},
"nav": {
"dashboard": "Обзор",
"tasks": "Задачи",
"calendar": "Календарь",
"meals": "Питание",
"shopping": "Покупки",
"notes": "Заметки",
"contacts": "Контакты",
"budget": "Бюджет",
"settings": "Настройки",
"main": "Главная навигация",
"navigation": "Навигация",
"quickActions": "Быстрые действия"
},
"dashboard": {
"title": "Обзор",
"greetingMorning": "Доброе утро, {{name}}",
"greetingDay": "Добрый день, {{name}}",
"greetingEvening": "Добрый вечер, {{name}}",
"allDone": "Всё готово",
"noEvents": "Нет событий",
"noPinnedNotes": "Нет закреплённых заметок",
"todayMeals": "Питание сегодня",
"allLink": "Все",
"weekLink": "Неделя",
"urgentTasksChip": "{{count}} срочная задача",
"urgentTasksChipPlural": "{{count}} срочных задач",
"eventsChip": "{{count}} событие сегодня",
"eventsChipPlural": "{{count}} событий сегодня",
"todayMealChip": "Сегодня: {{title}}",
"loadError": "Не удалось полностью загрузить панель управления.",
"weatherRefresh": "Обновить погоду",
"weatherRefreshTitle": "Обновить",
"weatherUpdated": "Погода обновлена",
"weatherFeelsLike": "Ощущается как {{temp}}° · {{humidity}}% · Ветер {{wind}} км/ч",
"fabTaskLabel": "Добавить задачу",
"fabCalendarLabel": "Добавить событие",
"fabShoppingLabel": "Добавить покупку",
"fabNoteLabel": "Добавить заметку",
"fabTask": "Задача",
"fabCalendar": "Событие",
"fabShopping": "Покупка",
"fabNote": "Заметка",
"overdue": "Просрочено",
"dueSoon": "Сегодня",
"dueTomorrow": "Завтра",
"allDay": "Весь день",
"shoppingMore": "+{{count}} ещё"
},
"tasks": {
"title": "Задачи",
"newTask": "Новая задача",
"editTask": "Редактировать задачу",
"emptyTitle": "Нет задач — всё готово?",
"emptyDescription": "Создайте новые задачи с помощью кнопки +.",
"titleLabel": "Заголовок *",
"titlePlaceholder": "Что нужно сделать?",
"descriptionLabel": "Заметка",
"descriptionPlaceholder": "Дополнительные сведения…",
"priorityLabel": "Приоритет",
"categoryLabel": "Категория",
"dueDateLabel": "Срок выполнения",
"dueTimeLabel": "Время",
"assignedLabel": "Назначено",
"assignedNobody": "- Никому -",
"statusLabel": "Статус",
"priorityUrgent": "Срочно",
"priorityHigh": "Высокий",
"priorityMedium": "Средний",
"priorityLow": "Низкий",
"priorityNone": "Нет",
"statusOpen": "Открыто",
"statusInProgress": "В процессе",
"statusDone": "Выполнено",
"categoryHousehold": "Домашнее хозяйство",
"categorySchool": "Школа",
"categoryShopping": "Покупки",
"categoryRepair": "Ремонт",
"categoryHealth": "Здоровье",
"categoryFinance": "Финансы",
"categoryLeisure": "Досуг",
"categoryMisc": "Разное",
"overdue": "Просрочено",
"overdueDay": "Просрочено на {{count}}д",
"dueToday": "Срок сегодня",
"dueTomorrow": "Срок завтра",
"groupOverdue": "Просрочено",
"groupToday": "Сегодня",
"groupThisWeek": "На этой неделе",
"groupNextWeek": "На следующей неделе",
"groupLater": "Позже",
"groupNoDate": "Без даты",
"markDone": "Отметить {{title}} как выполненное",
"editButton": "Редактировать задачу",
"swipeOpen": "Открыть снова",
"swipeDone": "Выполнено",
"swipeEdit": "Редактировать",
"subtaskAdd": "+ Добавить подзадачу",
"subtaskToggle": "Показать подзадачи",
"subtaskMarkDone": "Отметить {{title}} как выполненное",
"deleteConfirm": "Удалить задачу и все подзадачи?",
"savedToast": "Задача сохранена.",
"createdToast": "Задача создана.",
"deletedToast": "Задача удалена.",
"loadError": "Не удалось загрузить задачу.",
"subtaskPrompt": "Подзадача:",
"kanbanOpen": "Открыто",
"kanbanInProgress": "В процессе",
"kanbanDone": "Выполнено",
"kanbanMoveToInProgress": "Перевести в работу",
"kanbanMoveToDone": "Отметить как выполненное",
"kanbanMoveToOpen": "Открыть снова",
"recurring": "Повторяющееся",
"listView": "Список",
"kanbanView": "Канбан"
},
"shopping": {
"title": "Покупки",
"noLists": "Нет списков",
"noListsDescription": "Создайте список с помощью кнопки +.",
"emptyList": "Список пуст",
"emptyListDescription": "Добавьте товары через поле ввода выше.",
"newListPrompt": "Название нового списка:",
"newListButton": "Создать новый список",
"renameListPrompt": "Новое название списка:",
"deleteListConfirm": "Удалить список «{{name}}» и все товары?",
"deletedListToast": "Список удалён.",
"itemDeletedToast": "«{{name}}» удалено.",
"itemsRemovedToast": "{{count}} товаров удалено.",
"clearChecked": "Удалить отмеченные ({{count}})",
"itemNamePlaceholder": "Добавить товар…",
"itemQtyPlaceholder": "Количество",
"itemNameLabel": "Название товара",
"itemQtyLabel": "Количество",
"categoryLabel": "Категория",
"addItemLabel": "Добавить товар",
"renameListLabel": "Переименовать список",
"deleteListLabel": "Удалить список",
"swipeBack": "Отменить",
"swipeCheck": "Отметить",
"swipeDelete": "Удалить",
"markDoneLabel": "Отметить {{name}}",
"markUndoneLabel": "Снять отметку с {{name}}",
"deleteItemLabel": "Удалить {{name}}",
"listsLoadError": "Не удалось загрузить списки.",
"itemsLoadError": "Не удалось загрузить товары.",
"catFruitVeg": "Фрукты и овощи",
"catBakery": "Выпечка",
"catDairy": "Молочные продукты",
"catMeatFish": "Мясо и рыба",
"catFrozen": "Заморозка",
"catDrinks": "Напитки",
"catHousehold": "Хозтовары",
"catDrugstore": "Аптека",
"catMisc": "Разное"
},
"meals": {
"title": "План питания",
"noMealPlanned": "Питание не запланировано",
"addMeal": "Добавить {{type}}",
"editMeal": "Редактировать приём пищи",
"addMealTitle": "Добавить приём пищи",
"deleteMeal": "Удалить приём пищи",
"transferToShoppingList": "Добавить ингредиенты в список покупок",
"today": "Сегодня",
"prevWeek": "Предыдущая неделя",
"nextWeek": "Следующая неделя",
"loadError": "Не удалось загрузить план питания.",
"typeBreakfast": "Завтрак",
"typeLunch": "Обед",
"typeDinner": "Ужин",
"typeSnack": "Перекус",
"dayMo": "Пн",
"dayDi": "Вт",
"dayMi": "Ср",
"dayDo": "Чт",
"dayFr": "Пт",
"daySa": "Сб",
"daySo": "Вс",
"dateLabel": "Дата",
"mealTypeLabel": "Приём пищи",
"titleLabel": "Название *",
"titlePlaceholder": "напр. Борщ",
"notesLabel": "Заметки",
"notesPlaceholder": "Необязательно…",
"ingredientsLabel": "Ингредиенты",
"addIngredient": "Добавить ингредиент",
"ingredientNamePlaceholder": "Ингредиент",
"ingredientQtyPlaceholder": "Количество",
"removeIngredient": "Удалить ингредиент",
"transferLabel": "Перенести ингредиенты в список покупок",
"transferNow": "Перенести сейчас",
"noShoppingLists": "Нет списков покупок",
"transferSuccess": "{{count}} ингредиент перенесён",
"transferSuccessPlural": "{{count}} ингредиентов перенесено",
"transferAlreadyDone": "Все ингредиенты уже перенесены",
"ingredientCount": "{{count}} ингредиент",
"ingredientCountPlural": "{{count}} ингредиентов",
"titleRequired": "Название обязательно",
"loadingIndicator": "Загрузка…",
"recipeUrlLabel": "Ссылка на рецепт (необязательно)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "Открыть рецепт"
},
"calendar": {
"title": "Календарь",
"newEvent": "Новое событие",
"editEvent": "Редактировать событие",
"addEvent": "Добавить событие",
"deleteEvent": "Удалить событие",
"noEvents": "Нет событий в выбранном периоде.",
"today": "Сегодня",
"back": "Назад",
"forward": "Вперёд",
"viewMonth": "Месяц",
"viewWeek": "Неделя",
"viewDay": "День",
"viewAgenda": "Повестка",
"allDay": "Весь день",
"allDayShort": "весь день",
"moreEvents": "+{{count}} ещё",
"weekNumberLabel": "Н{{week}} · {{month}} {{year}}",
"agendaFrom": "С {{date}}",
"titleLabel": "Заголовок *",
"titlePlaceholder": "напр. Врач",
"allDayToggle": "Весь день",
"startDateLabel": "Дата начала",
"startTimeLabel": "Время начала",
"endDateLabel": "Дата окончания",
"endTimeLabel": "Время окончания",
"fromLabel": "С",
"toLabel": "По",
"locationLabel": "Место",
"locationPlaceholder": "Необязательно",
"assignedLabel": "Назначено",
"assignedNobody": "- Никому -",
"colorLabel": "Цвет {{color}}",
"descriptionLabel": "Описание",
"descriptionPlaceholder": "Необязательно…",
"popupEdit": "Редактировать",
"deleteConfirm": "Удалить «{{title}}»?",
"createdToast": "Событие создано",
"savedToast": "Событие сохранено",
"deletedToast": "Событие удалено",
"loadError": "Не удалось загрузить события.",
"saveError": "Ошибка сохранения",
"deleteError": "Ошибка удаления",
"titleRequired": "Заголовок обязателен",
"monthJanuary": "Январь",
"monthFebruary": "Февраль",
"monthMarch": "Март",
"monthApril": "Апрель",
"monthMay": "Май",
"monthJune": "Июнь",
"monthJuly": "Июль",
"monthAugust": "Август",
"monthSeptember": "Сентябрь",
"monthOctober": "Октябрь",
"monthNovember": "Ноябрь",
"monthDecember": "Декабрь",
"dayShortSunday": "Вс",
"dayShortMonday": "Пн",
"dayShortTuesday": "Вт",
"dayShortWednesday": "Ср",
"dayShortThursday": "Чт",
"dayShortFriday": "Пт",
"dayShortSaturday": "Сб",
"dayLongSunday": "Воскресенье",
"dayLongMonday": "Понедельник",
"dayLongTuesday": "Вторник",
"dayLongWednesday": "Среда",
"dayLongThursday": "Четверг",
"dayLongFriday": "Пятница",
"dayLongSaturday": "Суббота",
"timeSuffix": ""
},
"notes": {
"title": "Заметки",
"newNote": "Новая заметка",
"editNote": "Редактировать заметку",
"addNoteLabel": "Новая заметка",
"searchPlaceholder": "Поиск по заметкам…",
"emptyTitle": "Нет заметок",
"emptyDescription": "Создайте новую заметку с помощью кнопки +.",
"noResultsTitle": "Нет результатов",
"noResultsDescription": "Ни одна заметка не содержит «{{query}}».",
"titleLabel": "Заголовок (необязательно)",
"titlePlaceholder": "Без заголовка",
"contentLabel": "Содержимое",
"contentMarkdownHint": "(Поддерживается Markdown-форматирование)",
"contentPlaceholder": "Введите заметку…",
"colorLabel": "Цвет",
"pinnedLabel": "Закрепить (отображается на панели)",
"pinAction": "Закрепить",
"unpinAction": "Открепить",
"deleteLabel": "Удалить заметку",
"deleteConfirm": "Удалить эту заметку?",
"createdToast": "Заметка создана",
"savedToast": "Заметка сохранена",
"deletedToast": "Заметка удалена",
"loadError": "Не удалось загрузить заметки.",
"formatBold": "Жирный (Ctrl+B)",
"formatItalic": "Курсив (Ctrl+I)",
"formatUnderline": "Подчёркнутый (Ctrl+U)",
"formatStrikethrough": "Зачёркнутый",
"formatHeading": "Заголовок",
"formatList": "Маркированный список",
"formatOrderedList": "Нумерованный список",
"formatChecklist": "Список задач",
"formatLink": "Ссылка",
"formatCode": "Код",
"formatQuote": "Цитата",
"formatDivider": "Разделитель"
},
"contacts": {
"title": "Контакты",
"newContact": "Новый контакт",
"editContact": "Редактировать контакт",
"addButton": "Новый",
"newContactLabel": "Новый контакт",
"searchPlaceholder": "Поиск по имени, телефону или email…",
"importButton": "Импорт",
"importLabel": "Импортировать контакт из vCard",
"importTooltip": "Импортировать vCard",
"emptyTitle": "Нет контактов",
"emptyDescription": "Добавьте новые контакты с помощью кнопки +.",
"filterAll": "Все",
"nameLabel": "Имя *",
"namePlaceholder": "Полное имя",
"categoryLabel": "Категория",
"phoneLabel": "Телефон",
"phonePlaceholder": "+7 …",
"emailLabel": "Email",
"emailPlaceholder": "имя@пример.ру",
"addressLabel": "Адрес",
"addressPlaceholder": "Улица, индекс Город",
"notesLabel": "Заметки",
"notesPlaceholder": "Необязательно…",
"callLabel": "Позвонить",
"emailActionLabel": "Email",
"mapsLabel": "Открыть в Картах",
"exportLabel": "Экспортировать в vCard",
"exportTooltip": "Экспорт vCard",
"deleteLabel": "Удалить контакт",
"deleteConfirm": "Удалить этот контакт?",
"deletePersonConfirm": "Удалить «{{name}}»?",
"savedToast": "Контакт сохранён",
"updatedToast": "Контакт обновлён",
"deletedToast": "Контакт удалён",
"importedToast": "{{name}} импортирован.",
"importError": "Ошибка импорта: {{error}}",
"vcardNoName": "В vCard нет имени.",
"catDoctor": "Врач",
"catSchool": "Школа/Детсад",
"catAuthority": "Гос. орган",
"catInsurance": "Страховая",
"catCraftsman": "Мастер",
"catEmergency": "Экстренная помощь",
"catMisc": "Разное",
"categoryDoctor": "Врач",
"categorySchool": "Школа/Детсад",
"categoryAuthority": "Гос. орган",
"categoryInsurance": "Страховая",
"categoryCraftsman": "Мастер",
"categoryEmergency": "Экстренная помощь",
"categoryOther": "Другое"
},
"budget": {
"title": "Бюджет",
"newEntry": "Новая запись",
"editEntry": "Редактировать запись",
"addEntryLabel": "Добавить запись",
"newEntryFabLabel": "Новая запись",
"currentMonth": "Текущий",
"prevMonth": "Предыдущий месяц",
"nextMonth": "Следующий месяц",
"income": "Доходы",
"expenses": "Расходы",
"balance": "Баланс",
"byCategory": "По категориям",
"transactions": "Транзакции",
"emptyTitle": "Нет записей за этот месяц",
"emptyDescription": "Добавьте записи бюджета с помощью кнопки +.",
"csvExport": "CSV",
"typeExpense": "Расход",
"typeIncome": "Доход",
"titleLabel": "Заголовок *",
"titlePlaceholder": "напр. Продукты",
"amountLabel": "Сумма *",
"amountPlaceholder": "0,00",
"categoryLabel": "Категория",
"dateLabel": "Дата *",
"recurringLabel": "Повторяющееся",
"deleteLabel": "Удалить запись",
"deleteConfirm": "Удалить эту запись?",
"deletePersonConfirm": "Удалить «{{title}}»?",
"addedToast": "Запись добавлена",
"savedToast": "Запись сохранена",
"deletedToast": "Запись удалена",
"loadError": "Не удалось загрузить бюджет.",
"trendNeutral": "— как в {{month}}",
"validAmountRequired": "Введите корректную сумму",
"dateRequired": "Дата обязательна",
"catFood": "Продукты",
"catRent": "Аренда",
"catInsurance": "Страховка",
"catMobility": "Транспорт",
"catLeisure": "Досуг",
"catClothing": "Одежда",
"catHealth": "Здоровье",
"catEducation": "Образование",
"catMisc": "Разное",
"loadingIndicator": "Загрузка…"
},
"settings": {
"title": "Настройки",
"tabGeneral": "Общие",
"tabMeals": "Питание",
"tabBudget": "Бюджет",
"tabShopping": "Покупки",
"tabCalendar": "Календарь",
"tabAccount": "Аккаунт",
"tabsAriaLabel": "Разделы настроек",
"sectionDesign": "Внешний вид",
"sectionShopping": "Покупки",
"shoppingCategoriesLabel": "Категории покупок",
"shoppingCategoriesHint": "Добавляйте, переименовывайте, удаляйте или сортируйте категории.",
"shoppingCategoryPlaceholder": "Новая категория…",
"shoppingCategoryRenameHint": "Нажмите для переименования",
"shoppingCategoryRenamePrompt": "Новое название категории:",
"shoppingCategoryMoveUp": "Переместить категорию вверх",
"shoppingCategoryMoveDown": "Переместить категорию вниз",
"shoppingCategoryDelete": "Удалить категорию",
"shoppingCategoryDeleteConfirm": "Удалить категорию «{{name}}»? Существующие товары будут перемещены в следующую категорию.",
"shoppingCategoryAdded": "Категория добавлена.",
"shoppingCategoryRenamed": "Категория переименована.",
"shoppingCategoryDeleted": "Категория удалена.",
"sectionAccount": "Мой аккаунт",
"sectionCalendarSync": "Синхронизация календаря",
"sectionFamily": "Члены семьи",
"cardAppearance": "Отображение",
"themeSystem": "Система",
"themeSysLabel": "Использовать системную настройку",
"themeLight": "Светлая",
"themeLightLabel": "Светлая тема",
"themeDark": "Тёмная",
"themeDarkLabel": "Тёмная тема",
"changePassword": "Изменить пароль",
"currentPasswordLabel": "Текущий пароль",
"newPasswordLabel": "Новый пароль",
"confirmPasswordLabel": "Подтвердить новый пароль",
"savePassword": "Сохранить пароль",
"passwordMismatch": "Пароли не совпадают.",
"passwordSavedToast": "Пароль успешно изменён.",
"googleCalendar": "Google Календарь",
"appleCalendar": "Apple Calendar (iCloud)",
"syncNow": "Синхронизировать сейчас",
"disconnect": "Отключить",
"connectGoogle": "Подключить Google",
"connected": "Подключено",
"connectedLastSync": "Подключено · Последняя: {{date}}",
"notConnected": "Не подключено",
"notConfigured": "Не настроено (отсутствуют переменные .env)",
"configured": "Настроено (через .env)",
"configuredLastSync": "Настроено (через .env) · Последняя: {{date}}",
"syncSuccess": "{{provider}} синхронизирован.",
"disconnectedToast": "{{provider}} отключён.",
"googleOnlyAdmin": "Только администратор может подключить Google Календарь.",
"appleOnlyAdmin": "Только администратор может подключить Apple Calendar.",
"caldavUrlLabel": "URL сервера CalDAV",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple ID (email)",
"applePasswordLabel": "Пароль для приложения",
"applePasswordHint": "Создайте пароль на <strong>appleid.apple.com → Безопасность</strong>.",
"appleConnectBtn": "Подключить и протестировать",
"appleConnecting": "Подключение…",
"appleConnectedToast": "Apple Calendar подключён.",
"syncSuccessGoogle": "Синхронизация календаря с Google успешно подключена.",
"syncSuccessApple": "Синхронизация календаря с Apple успешно подключена.",
"syncErrorGoogle": "Не удалось подключиться к Google. Попробуйте ещё раз.",
"syncErrorApple": "Не удалось подключиться к Apple. Попробуйте ещё раз.",
"addMember": "+ Добавить участника",
"newMemberTitle": "Новый член семьи",
"usernameLabel": "Имя пользователя",
"displayNameLabel": "Отображаемое имя",
"memberPasswordLabel": "Пароль",
"colorLabel": "Цвет",
"roleLabel": "Роль",
"roleMember": "Участник",
"roleAdmin": "Администратор",
"createMember": "Создать",
"cancelAddMember": "Отмена",
"memberAddedToast": "{{name}} добавлен.",
"deleteMemberConfirm": "Удалить {{name}}?",
"memberDeletedToast": "{{name}} удалён.",
"deleteMemberLabel": "Удалить",
"logout": "Выйти",
"synchronizing": "Синхронизация…",
"googleDisconnectConfirm": "Отключить Google Календарь?",
"appleDisconnectConfirm": "Отключить Apple Calendar?",
"localeSystem": "Система",
"localeLabel": "Язык",
"languageTitle": "Язык",
"sectionMeals": "План питания",
"mealTypesLabel": "Видимые приёмы пищи",
"mealTypesHint": "В плане питания отображаются только выбранные типы приёмов пищи.",
"mealTypesSaved": "Настройки плана питания сохранены.",
"mealTypesMinOne": "Должен быть активен хотя бы один тип приёма пищи.",
"sectionBudget": "Бюджет",
"currencyLabel": "Валюта",
"currencyHint": "Устанавливает валюту для всего раздела бюджета.",
"currencySaved": "Валюта сохранена."
},
"login": {
"tagline": "Семейное планирование. Безопасно. С уважением к приватности. Открытый исходный код.",
"usernameLabel": "Имя пользователя",
"usernamePlaceholder": "имяпользователя",
"passwordLabel": "Пароль",
"passwordPlaceholder": "••••••••",
"loginButton": "Войти",
"loggingIn": "Вход…",
"tooManyAttempts": "Слишком много попыток. Подождите немного.",
"invalidCredentials": "Неверные данные для входа."
},
"install": {
"title": "Установить Oikos",
"subtitle": "Добавить на главный экран",
"iosTip1": "Нажмите ",
"iosTip2": " → «На экран Домой»",
"installButton": "Установить",
"dismissLabel": "Закрыть"
},
"modal": {
"closeLabel": "Закрыть"
},
"rrule": {
"freqNone": "Без повтора",
"freqDaily": "Ежедневно",
"freqWeekly": "Еженедельно",
"freqMonthly": "Ежемесячно",
"dayMo": "Пн",
"dayTu": "Вт",
"dayWe": "Ср",
"dayTh": "Чт",
"dayFr": "Пт",
"daySa": "Сб",
"daySu": "Вс",
"labelRepeat": "Повтор",
"labelEvery": "Каждые",
"labelOnDays": "В эти дни",
"labelUntil": "Заканчивается (необязательно)",
"unitDay": "день",
"unitDays": "дней",
"unitWeek": "неделю",
"unitWeeks": "недель",
"unitMonth": "месяц",
"unitMonths": "месяцев"
}
}
+591
View File
@@ -0,0 +1,591 @@
{
"common": {
"save": "Kaydet",
"cancel": "İptal",
"delete": "Sil",
"edit": "Düzenle",
"close": "Kapat",
"create": "Oluştur",
"add": "Ekle",
"back": "Geri",
"next": "İleri",
"loading": "Yükleniyor…",
"saving": "Kaydediliyor…",
"required": "Bu alan zorunludur.",
"error": "Hata",
"allFieldsRequired": "Lütfen tüm alanları doldurun.",
"today": "Bugün",
"tomorrow": "Yarın",
"skipToContent": "İçeriğe geç",
"reload": "Yenile",
"errorOccurred": "Bir şeyler ters gitti.",
"unexpectedError": "Beklenmeyen bir hata oluştu.",
"errorGeneric": "Bir hata oluştu.",
"updateAvailable": "Güncelleme mevcut - en son sürümü almak için sayfayı yenileyin.",
"titleRequired": "Başlık zorunludur",
"nameRequired": "Ad zorunludur",
"contentRequired": "İçerik zorunludur",
"all": "Tümü",
"unknownError": "Bilinmeyen hata",
"confirm": "Onayla",
"undo": "Geri al"
},
"nav": {
"dashboard": "Genel Bakış",
"tasks": "Görevler",
"calendar": "Takvim",
"meals": "Yemekler",
"shopping": "Alışveriş",
"notes": "Notlar",
"contacts": "Kişiler",
"budget": "Bütçe",
"settings": "Ayarlar",
"main": "Ana gezinme",
"navigation": "Gezinme",
"quickActions": "Hızlı işlemler"
},
"dashboard": {
"title": "Genel Bakış",
"greetingMorning": "Günaydın, {{name}}",
"greetingDay": "İyi günler, {{name}}",
"greetingEvening": "İyi akşamlar, {{name}}",
"allDone": "Her şey tamam",
"noEvents": "Etkinlik yok",
"noPinnedNotes": "Sabitlenmiş not yok",
"todayMeals": "Bugünün yemekleri",
"allLink": "Tümü",
"weekLink": "Hafta",
"urgentTasksChip": "{{count}} acil görev",
"urgentTasksChipPlural": "{{count}} acil görev",
"eventsChip": "Bugün {{count}} etkinlik",
"eventsChipPlural": "Bugün {{count}} etkinlik",
"todayMealChip": "Bugün: {{title}}",
"loadError": "Gösterge paneli tam olarak yüklenemedi.",
"weatherRefresh": "Hava durumunu yenile",
"weatherRefreshTitle": "Yenile",
"weatherUpdated": "Hava durumu güncellendi",
"weatherFeelsLike": "Hissedilen {{temp}}° · {{humidity}}% · Rüzgar {{wind}} km/s",
"fabTaskLabel": "Görev ekle",
"fabCalendarLabel": "Etkinlik ekle",
"fabShoppingLabel": "Alışveriş ekle",
"fabNoteLabel": "Not ekle",
"fabTask": "Görev",
"fabCalendar": "Etkinlik",
"fabShopping": "Alışveriş",
"fabNote": "Not",
"overdue": "Gecikmiş",
"dueSoon": "Bugün bitiyor",
"dueTomorrow": "Yarın bitiyor",
"allDay": "Tüm gün",
"shoppingMore": "+{{count}} daha"
},
"tasks": {
"title": "Görevler",
"newTask": "Yeni Görev",
"editTask": "Görevi Düzenle",
"emptyTitle": "Görev yok - her şey tamam mı?",
"emptyDescription": "+ düğmesiyle yeni görevler oluşturun.",
"titleLabel": "Başlık *",
"titlePlaceholder": "Ne yapılması gerekiyor?",
"descriptionLabel": "Not",
"descriptionPlaceholder": "İsteğe bağlı ayrıntılar…",
"priorityLabel": "Öncelik",
"categoryLabel": "Kategori",
"dueDateLabel": "Bitiş tarihi",
"dueTimeLabel": "Saat",
"assignedLabel": "Atanan",
"assignedNobody": "- Kimse -",
"statusLabel": "Durum",
"priorityUrgent": "Acil",
"priorityHigh": "Yüksek",
"priorityMedium": "Orta",
"priorityLow": "Düşük",
"priorityNone": "Yok",
"statusOpen": "Açık",
"statusInProgress": "Devam Ediyor",
"statusDone": "Tamamlandı",
"categoryHousehold": "Ev İşleri",
"categorySchool": "Okul",
"categoryShopping": "Alışveriş",
"categoryRepair": "Tamir",
"categoryHealth": "Sağlık",
"categoryFinance": "Finans",
"categoryLeisure": "Boş Zaman",
"categoryMisc": "Diğer",
"overdue": "Gecikmiş",
"overdueDay": "{{count}}g gecikmiş",
"dueToday": "Bugün bitiyor",
"dueTomorrow": "Yarın bitiyor",
"groupOverdue": "Gecikmiş",
"groupToday": "Bugün",
"groupThisWeek": "Bu hafta",
"groupNextWeek": "Gelecek hafta",
"groupLater": "Sonra",
"groupNoDate": "Tarih yok",
"markDone": "{{title}} tamamlandı olarak işaretle",
"editButton": "Görevi düzenle",
"swipeOpen": "Yeniden aç",
"swipeDone": "Tamamlandı",
"swipeEdit": "Düzenle",
"subtaskAdd": "+ Alt görev ekle",
"subtaskToggle": "Alt görevleri göster",
"subtaskMarkDone": "{{title}} tamamlandı olarak işaretle",
"deleteConfirm": "Görev ve tüm alt görevler silinsin mi?",
"savedToast": "Görev kaydedildi.",
"createdToast": "Görev oluşturuldu.",
"deletedToast": "Görev silindi.",
"loadError": "Görev yüklenemedi.",
"subtaskPrompt": "Alt görev:",
"kanbanOpen": "Açık",
"kanbanInProgress": "Devam Ediyor",
"kanbanDone": "Tamamlandı",
"kanbanMoveToInProgress": "Devam ediyor olarak ayarla",
"kanbanMoveToDone": "Tamamlandı olarak işaretle",
"kanbanMoveToOpen": "Yeniden aç",
"recurring": "Yinelenen",
"listView": "Liste görünümü",
"kanbanView": "Kanban görünümü"
},
"shopping": {
"title": "Alışveriş",
"noLists": "Liste yok",
"noListsDescription": "+ düğmesiyle bir liste oluşturun.",
"emptyList": "Liste boş",
"emptyListDescription": "Yukarıdaki giriş alanını kullanarak ürün ekleyin.",
"newListPrompt": "Yeni liste adı:",
"newListButton": "Yeni liste oluştur",
"renameListPrompt": "Yeni liste adı:",
"deleteListConfirm": "\"{{name}}\" listesi ve tüm ürünleri silinsin mi?",
"deletedListToast": "Liste silindi.",
"itemDeletedToast": "\"{{name}}\" kaldırıldı.",
"itemsRemovedToast": "{{count}} ürün kaldırıldı.",
"clearChecked": "İşaretlileri sil ({{count}})",
"itemNamePlaceholder": "Ürün ekle…",
"itemQtyPlaceholder": "Miktar",
"itemNameLabel": "Ürün adı",
"itemQtyLabel": "Miktar",
"categoryLabel": "Kategori",
"addItemLabel": "Ürün ekle",
"renameListLabel": "Listeyi yeniden adlandır",
"deleteListLabel": "Listeyi sil",
"swipeBack": "Geri al",
"swipeCheck": "İşaretle",
"swipeDelete": "Sil",
"markDoneLabel": "{{name}} işaretle",
"markUndoneLabel": "{{name}} işaretini kaldır",
"deleteItemLabel": "{{name}} sil",
"listsLoadError": "Listeler yüklenemedi.",
"itemsLoadError": "Ürünler yüklenemedi.",
"catFruitVeg": "Meyve ve Sebze",
"catBakery": "Fırın",
"catDairy": "Süt Ürünleri",
"catMeatFish": "Et ve Balık",
"catFrozen": "Dondurulmuş",
"catDrinks": "İçecekler",
"catHousehold": "Ev Gereçleri",
"catDrugstore": "Eczane",
"catMisc": "Diğer"
},
"meals": {
"title": "Yemek Planı",
"noMealPlanned": "Yemek planlanmadı",
"addMeal": "{{type}} ekle",
"editMeal": "Yemeği düzenle",
"addMealTitle": "Yemek ekle",
"deleteMeal": "Yemeği sil",
"transferToShoppingList": "Malzemeleri alışveriş listesine ekle",
"today": "Bugün",
"prevWeek": "Önceki hafta",
"nextWeek": "Gelecek hafta",
"loadError": "Yemek planı yüklenemedi.",
"typeBreakfast": "Kahvaltı",
"typeLunch": "Öğle yemeği",
"typeDinner": "Akşam yemeği",
"typeSnack": "Atıştırmalık",
"dayMo": "Pzt",
"dayDi": "Sal",
"dayMi": "Çar",
"dayDo": "Per",
"dayFr": "Cum",
"daySa": "Cmt",
"daySo": "Paz",
"dateLabel": "Tarih",
"mealTypeLabel": "Öğün",
"titleLabel": "Başlık *",
"titlePlaceholder": "örn. Mercimek çorbası",
"notesLabel": "Notlar",
"notesPlaceholder": "İsteğe bağlı…",
"ingredientsLabel": "Malzemeler",
"addIngredient": "Malzeme ekle",
"ingredientNamePlaceholder": "Malzeme",
"ingredientQtyPlaceholder": "Miktar",
"removeIngredient": "Malzemeyi kaldır",
"transferLabel": "Malzemeleri alışveriş listesine aktar",
"transferNow": "Şimdi aktar",
"noShoppingLists": "Alışveriş listesi yok",
"transferSuccess": "{{count}} malzeme aktarıldı",
"transferSuccessPlural": "{{count}} malzeme aktarıldı",
"transferAlreadyDone": "Tüm malzemeler zaten aktarıldı",
"ingredientCount": "{{count}} malzeme",
"ingredientCountPlural": "{{count}} malzeme",
"titleRequired": "Başlık zorunludur",
"loadingIndicator": "Yükleniyor…",
"recipeUrlLabel": "Tarif bağlantısı (isteğe bağlı)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "Tarifi aç"
},
"calendar": {
"title": "Takvim",
"newEvent": "Yeni Etkinlik",
"editEvent": "Etkinliği Düzenle",
"addEvent": "Etkinlik ekle",
"deleteEvent": "Etkinliği sil",
"noEvents": "Seçilen dönemde etkinlik yok.",
"today": "Bugün",
"back": "Geri",
"forward": "İleri",
"viewMonth": "Ay",
"viewWeek": "Hafta",
"viewDay": "Gün",
"viewAgenda": "Ajanda",
"allDay": "Tüm gün",
"allDayShort": "tüm gün",
"moreEvents": "+{{count}} daha",
"weekNumberLabel": "H{{week}} · {{month}} {{year}}",
"agendaFrom": "{{date}} tarihinden itibaren",
"titleLabel": "Başlık *",
"titlePlaceholder": "örn. Diş hekimi",
"allDayToggle": "Tüm gün",
"startDateLabel": "Başlangıç tarihi",
"startTimeLabel": "Başlangıç saati",
"endDateLabel": "Bitiş tarihi",
"endTimeLabel": "Bitiş saati",
"fromLabel": "Başlangıç",
"toLabel": "Bitiş",
"locationLabel": "Konum",
"locationPlaceholder": "İsteğe bağlı",
"assignedLabel": "Atanan",
"assignedNobody": "- Kimse -",
"colorLabel": "Renk {{color}}",
"descriptionLabel": "Açıklama",
"descriptionPlaceholder": "İsteğe bağlı…",
"popupEdit": "Düzenle",
"deleteConfirm": "\"{{title}}\" silinsin mi?",
"createdToast": "Etkinlik oluşturuldu",
"savedToast": "Etkinlik kaydedildi",
"deletedToast": "Etkinlik silindi",
"loadError": "Etkinlikler yüklenemedi.",
"saveError": "Kaydetme hatası",
"deleteError": "Silme hatası",
"titleRequired": "Başlık zorunludur",
"monthJanuary": "Ocak",
"monthFebruary": "Şubat",
"monthMarch": "Mart",
"monthApril": "Nisan",
"monthMay": "Mayıs",
"monthJune": "Haziran",
"monthJuly": "Temmuz",
"monthAugust": "Ağustos",
"monthSeptember": "Eylül",
"monthOctober": "Ekim",
"monthNovember": "Kasım",
"monthDecember": "Aralık",
"dayShortSunday": "Paz",
"dayShortMonday": "Pzt",
"dayShortTuesday": "Sal",
"dayShortWednesday": "Çar",
"dayShortThursday": "Per",
"dayShortFriday": "Cum",
"dayShortSaturday": "Cmt",
"dayLongSunday": "Pazar",
"dayLongMonday": "Pazartesi",
"dayLongTuesday": "Salı",
"dayLongWednesday": "Çarşamba",
"dayLongThursday": "Perşembe",
"dayLongFriday": "Cuma",
"dayLongSaturday": "Cumartesi",
"timeSuffix": ""
},
"notes": {
"title": "Notlar",
"newNote": "Yeni Not",
"editNote": "Notu Düzenle",
"addNoteLabel": "Yeni Not",
"searchPlaceholder": "Notlarda ara…",
"emptyTitle": "Henüz not yok",
"emptyDescription": "+ düğmesiyle yeni bir not oluşturun.",
"noResultsTitle": "Sonuç yok",
"noResultsDescription": "Hiçbir not \"{{query}}\" içermiyor.",
"titleLabel": "Başlık (isteğe bağlı)",
"titlePlaceholder": "Başlıksız",
"contentLabel": "İçerik",
"contentMarkdownHint": "(Markdown biçimlendirmesi desteklenir)",
"contentPlaceholder": "Not girin…",
"colorLabel": "Renk",
"pinnedLabel": "Sabitle (gösterge panelinde görünür)",
"pinAction": "Sabitle",
"unpinAction": "Sabitlemeyi kaldır",
"deleteLabel": "Notu sil",
"deleteConfirm": "Bu not silinsin mi?",
"createdToast": "Not oluşturuldu",
"savedToast": "Not kaydedildi",
"deletedToast": "Not silindi",
"loadError": "Notlar yüklenemedi.",
"formatBold": "Kalın (Ctrl+B)",
"formatItalic": "İtalik (Ctrl+I)",
"formatUnderline": "Altı çizili (Ctrl+U)",
"formatStrikethrough": "Üstü çizili",
"formatHeading": "Başlık",
"formatList": "Madde listesi",
"formatOrderedList": "Numaralı liste",
"formatChecklist": "Kontrol listesi",
"formatLink": "Bağlantı",
"formatCode": "Kod",
"formatQuote": "Alıntı",
"formatDivider": "Ayırıcı"
},
"contacts": {
"title": "Kişiler",
"newContact": "Yeni Kişi",
"editContact": "Kişiyi Düzenle",
"addButton": "Yeni",
"newContactLabel": "Yeni Kişi",
"searchPlaceholder": "Ad, telefon veya e-posta ara…",
"importButton": "İçe aktar",
"importLabel": "vCard'dan kişi içe aktar",
"importTooltip": "vCard içe aktar",
"emptyTitle": "Henüz kişi yok",
"emptyDescription": "+ düğmesiyle yeni kişiler ekleyin.",
"filterAll": "Tümü",
"nameLabel": "Ad *",
"namePlaceholder": "Tam ad",
"categoryLabel": "Kategori",
"phoneLabel": "Telefon",
"phonePlaceholder": "+90 …",
"emailLabel": "E-posta",
"emailPlaceholder": "ad@ornek.com.tr",
"addressLabel": "Adres",
"addressPlaceholder": "Sokak, Posta Kodu Şehir",
"notesLabel": "Notlar",
"notesPlaceholder": "İsteğe bağlı…",
"callLabel": "Ara",
"emailActionLabel": "E-posta",
"mapsLabel": "Haritada aç",
"exportLabel": "vCard olarak dışa aktar",
"exportTooltip": "vCard dışa aktar",
"deleteLabel": "Kişiyi sil",
"deleteConfirm": "Bu kişi silinsin mi?",
"deletePersonConfirm": "\"{{name}}\" silinsin mi?",
"savedToast": "Kişi kaydedildi",
"updatedToast": "Kişi güncellendi",
"deletedToast": "Kişi silindi",
"importedToast": "{{name}} içe aktarıldı.",
"importError": "İçe aktarma başarısız: {{error}}",
"vcardNoName": "vCard'da ad yok.",
"catDoctor": "Doktor",
"catSchool": "Okul/Kreş",
"catAuthority": "Resmi Kurum",
"catInsurance": "Sigorta",
"catCraftsman": "Usta",
"catEmergency": "Acil",
"catMisc": "Diğer",
"categoryDoctor": "Doktor",
"categorySchool": "Okul/Kreş",
"categoryAuthority": "Resmi Kurum",
"categoryInsurance": "Sigorta",
"categoryCraftsman": "Usta",
"categoryEmergency": "Acil",
"categoryOther": "Diğer"
},
"budget": {
"title": "Bütçe",
"newEntry": "Yeni Kayıt",
"editEntry": "Kaydı Düzenle",
"addEntryLabel": "Kayıt ekle",
"newEntryFabLabel": "Yeni Kayıt",
"currentMonth": "Bu Ay",
"prevMonth": "Önceki ay",
"nextMonth": "Sonraki ay",
"income": "Gelir",
"expenses": "Gider",
"balance": "Bakiye",
"byCategory": "Kategoriye göre",
"transactions": "İşlemler",
"emptyTitle": "Bu ay kayıt yok",
"emptyDescription": "+ düğmesiyle bütçe kayıtları ekleyin.",
"csvExport": "CSV",
"typeExpense": "Gider",
"typeIncome": "Gelir",
"titleLabel": "Başlık *",
"titlePlaceholder": "örn. Market alışverişi",
"amountLabel": "Tutar *",
"amountPlaceholder": "0,00",
"categoryLabel": "Kategori",
"dateLabel": "Tarih *",
"recurringLabel": "Yinelenen",
"deleteLabel": "Kaydı sil",
"deleteConfirm": "Bu kayıt silinsin mi?",
"deletePersonConfirm": "\"{{title}}\" silinsin mi?",
"addedToast": "Kayıt eklendi",
"savedToast": "Kayıt kaydedildi",
"deletedToast": "Kayıt silindi",
"loadError": "Bütçe yüklenemedi.",
"trendNeutral": "- {{month}} ile aynı",
"validAmountRequired": "Lütfen geçerli bir tutar girin",
"dateRequired": "Tarih zorunludur",
"catFood": "Market",
"catRent": "Kira",
"catInsurance": "Sigorta",
"catMobility": "Ulaşım",
"catLeisure": "Eğlence",
"catClothing": "Giyim",
"catHealth": "Sağlık",
"catEducation": "Eğitim",
"catMisc": "Diğer",
"loadingIndicator": "Yükleniyor…"
},
"settings": {
"title": "Ayarlar",
"tabGeneral": "Genel",
"tabMeals": "Yemekler",
"tabBudget": "Bütçe",
"tabShopping": "Alışveriş",
"tabCalendar": "Takvim",
"tabAccount": "Hesap",
"tabsAriaLabel": "Ayar bölümleri",
"sectionDesign": "Görünüm",
"sectionShopping": "Alışveriş",
"shoppingCategoriesLabel": "Alışveriş Kategorileri",
"shoppingCategoriesHint": "Kategorileri ekleyin, yeniden adlandırın, silin veya sıralayın.",
"shoppingCategoryPlaceholder": "Yeni kategori…",
"shoppingCategoryRenameHint": "Yeniden adlandırmak için tıklayın",
"shoppingCategoryRenamePrompt": "Yeni kategori adı:",
"shoppingCategoryMoveUp": "Kategoriyi yukarı taşı",
"shoppingCategoryMoveDown": "Kategoriyi aşağı taşı",
"shoppingCategoryDelete": "Kategoriyi sil",
"shoppingCategoryDeleteConfirm": "\"{{name}}\" kategorisi silinsin mi? Mevcut ürünler bir sonraki kategoriye taşınacak.",
"shoppingCategoryAdded": "Kategori eklendi.",
"shoppingCategoryRenamed": "Kategori yeniden adlandırıldı.",
"shoppingCategoryDeleted": "Kategori silindi.",
"sectionAccount": "Hesabım",
"sectionCalendarSync": "Takvim Senkronizasyonu",
"sectionFamily": "Aile Üyeleri",
"cardAppearance": "Görünüm",
"themeSystem": "Sistem",
"themeSysLabel": "Sistem ayarını kullan",
"themeLight": "Açık",
"themeLightLabel": "Açık mod",
"themeDark": "Koyu",
"themeDarkLabel": "Koyu mod",
"changePassword": "Şifre değiştir",
"currentPasswordLabel": "Mevcut şifre",
"newPasswordLabel": "Yeni şifre",
"confirmPasswordLabel": "Yeni şifreyi onayla",
"savePassword": "Şifreyi kaydet",
"passwordMismatch": "Şifreler eşleşmiyor.",
"passwordSavedToast": "Şifre başarıyla değiştirildi.",
"googleCalendar": "Google Takvim",
"appleCalendar": "Apple Takvim (iCloud)",
"syncNow": "Şimdi senkronize et",
"disconnect": "Bağlantıyı kes",
"connectGoogle": "Google ile bağlan",
"connected": "Bağlı",
"connectedLastSync": "Bağlı · Son: {{date}}",
"notConnected": "Bağlı değil",
"notConfigured": "Yapılandırılmadı (.env değişkenleri eksik)",
"configured": "Yapılandırıldı (via .env)",
"configuredLastSync": "Yapılandırıldı (via .env) · Son: {{date}}",
"syncSuccess": "{{provider}} senkronize edildi.",
"disconnectedToast": "{{provider}} bağlantısı kesildi.",
"googleOnlyAdmin": "Yalnızca yönetici Google Takvim'i bağlayabilir.",
"appleOnlyAdmin": "Yalnızca yönetici Apple Takvim'i bağlayabilir.",
"caldavUrlLabel": "CalDAV Sunucu URL'si",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple Kimliği (e-posta)",
"applePasswordLabel": "Uygulamaya özel şifre",
"applePasswordHint": "<strong>appleid.apple.com → Güvenlik</strong> adresinden şifre oluşturun.",
"appleConnectBtn": "Bağlan ve test et",
"appleConnecting": "Bağlanıyor…",
"appleConnectedToast": "Apple Takvim bağlandı.",
"syncSuccessGoogle": "Google ile takvim senkronizasyonu başarıyla bağlandı.",
"syncSuccessApple": "Apple ile takvim senkronizasyonu başarıyla bağlandı.",
"syncErrorGoogle": "Google'a bağlanılamadı. Lütfen tekrar deneyin.",
"syncErrorApple": "Apple'a bağlanılamadı. Lütfen tekrar deneyin.",
"addMember": "+ Üye ekle",
"newMemberTitle": "Yeni Aile Üyesi",
"usernameLabel": "Kullanıcı adı",
"displayNameLabel": "Görünen ad",
"memberPasswordLabel": "Şifre",
"colorLabel": "Renk",
"roleLabel": "Rol",
"roleMember": "Üye",
"roleAdmin": "Yönetici",
"createMember": "Oluştur",
"cancelAddMember": "İptal",
"memberAddedToast": "{{name}} eklendi.",
"deleteMemberConfirm": "{{name}} silinsin mi?",
"memberDeletedToast": "{{name}} silindi.",
"deleteMemberLabel": "Sil",
"logout": "Çıkış yap",
"synchronizing": "Senkronize ediliyor…",
"googleDisconnectConfirm": "Google Takvim bağlantısı kesilsin mi?",
"appleDisconnectConfirm": "Apple Takvim bağlantısı kesilsin mi?",
"localeSystem": "Sistem",
"localeLabel": "Dil",
"languageTitle": "Dil",
"sectionMeals": "Yemek Planı",
"mealTypesLabel": "Görünür öğünler",
"mealTypesHint": "Yalnızca seçili öğün türleri yemek planında gösterilir.",
"mealTypesSaved": "Yemek planı ayarları kaydedildi.",
"mealTypesMinOne": "En az bir öğün türü aktif olmalıdır.",
"sectionBudget": "Bütçe",
"currencyLabel": "Para birimi",
"currencyHint": "Bütçe bölümünde kullanılan para birimini belirler.",
"currencySaved": "Para birimi kaydedildi."
},
"login": {
"tagline": "Aile planlaması. Güvenli. Gizlilik dostu. Açık kaynak.",
"usernameLabel": "Kullanıcı adı",
"usernamePlaceholder": "kullaniciadi",
"passwordLabel": "Şifre",
"passwordPlaceholder": "••••••••",
"loginButton": "Giriş yap",
"loggingIn": "Giriş yapılıyor…",
"tooManyAttempts": "Çok fazla deneme. Lütfen bir süre bekleyin.",
"invalidCredentials": "Geçersiz kimlik bilgileri."
},
"install": {
"title": "Oikos'u Yükle",
"subtitle": "Ana ekrana ekle",
"iosTip1": "Dokunun ",
"iosTip2": " → \"Ana Ekrana Ekle\"",
"installButton": "Yükle",
"dismissLabel": "Kapat"
},
"modal": {
"closeLabel": "Kapat"
},
"rrule": {
"freqNone": "Tekrar yok",
"freqDaily": "Günlük",
"freqWeekly": "Haftalık",
"freqMonthly": "Aylık",
"dayMo": "Pt",
"dayTu": "Sa",
"dayWe": "Ça",
"dayTh": "Pe",
"dayFr": "Cu",
"daySa": "Ct",
"daySu": "Pz",
"labelRepeat": "Tekrar",
"labelEvery": "Her",
"labelOnDays": "Bu günlerde",
"labelUntil": "Bitiş tarihi (isteğe bağlı)",
"unitDay": "gün",
"unitDays": "gün",
"unitWeek": "hafta",
"unitWeeks": "hafta",
"unitMonth": "ay",
"unitMonths": "ay"
}
}
+591
View File
@@ -0,0 +1,591 @@
{
"common": {
"save": "保存",
"cancel": "取消",
"delete": "删除",
"edit": "编辑",
"close": "关闭",
"create": "创建",
"add": "添加",
"back": "返回",
"next": "下一步",
"loading": "加载中…",
"saving": "保存中…",
"required": "此字段为必填项。",
"error": "错误",
"allFieldsRequired": "请填写所有字段。",
"today": "今天",
"tomorrow": "明天",
"skipToContent": "跳转到内容",
"reload": "重新加载",
"errorOccurred": "出现了问题。",
"unexpectedError": "发生了意外错误。",
"errorGeneric": "发生了错误。",
"updateAvailable": "有更新 - 重新加载页面以获取最新版本。",
"titleRequired": "标题为必填项",
"nameRequired": "姓名为必填项",
"contentRequired": "内容为必填项",
"all": "全部",
"unknownError": "未知错误",
"confirm": "确认",
"undo": "撤销"
},
"nav": {
"dashboard": "概览",
"tasks": "任务",
"calendar": "日历",
"meals": "饮食",
"shopping": "购物",
"notes": "便签",
"contacts": "联系人",
"budget": "预算",
"settings": "设置",
"main": "主导航",
"navigation": "导航",
"quickActions": "快捷操作"
},
"dashboard": {
"title": "概览",
"greetingMorning": "早上好,{{name}}",
"greetingDay": "下午好,{{name}}",
"greetingEvening": "晚上好,{{name}}",
"allDone": "全部完成",
"noEvents": "暂无日程",
"noPinnedNotes": "暂无置顶便签",
"todayMeals": "今日饮食",
"allLink": "全部",
"weekLink": "本周",
"urgentTasksChip": "{{count}} 个紧急任务",
"urgentTasksChipPlural": "{{count}} 个紧急任务",
"eventsChip": "今天 {{count}} 个日程",
"eventsChipPlural": "今天 {{count}} 个日程",
"todayMealChip": "今天:{{title}}",
"loadError": "仪表板加载失败。",
"weatherRefresh": "刷新天气",
"weatherRefreshTitle": "刷新",
"weatherUpdated": "天气已更新",
"weatherFeelsLike": "体感 {{temp}}° · {{humidity}}% · 风速 {{wind}} km/h",
"fabTaskLabel": "添加任务",
"fabCalendarLabel": "添加日程",
"fabShoppingLabel": "添加购物",
"fabNoteLabel": "添加便签",
"fabTask": "任务",
"fabCalendar": "日程",
"fabShopping": "购物",
"fabNote": "便签",
"overdue": "已逾期",
"dueSoon": "今天到期",
"dueTomorrow": "明天到期",
"allDay": "全天",
"shoppingMore": "+{{count}} 更多"
},
"tasks": {
"title": "任务",
"newTask": "新建任务",
"editTask": "编辑任务",
"emptyTitle": "暂无任务 - 全部完成了?",
"emptyDescription": "通过 + 按钮创建新任务。",
"titleLabel": "标题 *",
"titlePlaceholder": "需要做什么?",
"descriptionLabel": "备注",
"descriptionPlaceholder": "可选详情…",
"priorityLabel": "优先级",
"categoryLabel": "分类",
"dueDateLabel": "截止日期",
"dueTimeLabel": "时间",
"assignedLabel": "分配给",
"assignedNobody": "- 无人 -",
"statusLabel": "状态",
"priorityUrgent": "紧急",
"priorityHigh": "高",
"priorityMedium": "中",
"priorityLow": "低",
"priorityNone": "无",
"statusOpen": "待处理",
"statusInProgress": "进行中",
"statusDone": "已完成",
"categoryHousehold": "家务",
"categorySchool": "学校",
"categoryShopping": "购物",
"categoryRepair": "维修",
"categoryHealth": "健康",
"categoryFinance": "财务",
"categoryLeisure": "休闲",
"categoryMisc": "其他",
"overdue": "已逾期",
"overdueDay": "逾期 {{count}} 天",
"dueToday": "今天到期",
"dueTomorrow": "明天到期",
"groupOverdue": "已逾期",
"groupToday": "今天",
"groupThisWeek": "本周",
"groupNextWeek": "下周",
"groupLater": "以后",
"groupNoDate": "无日期",
"markDone": "将 {{title}} 标记为完成",
"editButton": "编辑任务",
"swipeOpen": "打开",
"swipeDone": "完成",
"swipeEdit": "编辑",
"subtaskAdd": "+ 添加子任务",
"subtaskToggle": "显示子任务",
"subtaskMarkDone": "将 {{title}} 标记为完成",
"deleteConfirm": "删除任务及所有子任务?",
"savedToast": "任务已保存。",
"createdToast": "任务已创建。",
"deletedToast": "任务已删除。",
"loadError": "任务加载失败。",
"subtaskPrompt": "子任务:",
"kanbanOpen": "待处理",
"kanbanInProgress": "进行中",
"kanbanDone": "已完成",
"kanbanMoveToInProgress": "移至进行中",
"kanbanMoveToDone": "标记为完成",
"kanbanMoveToOpen": "重新打开",
"recurring": "重复",
"listView": "列表视图",
"kanbanView": "看板视图"
},
"shopping": {
"title": "购物",
"noLists": "暂无清单",
"noListsDescription": "通过 + 按钮创建清单。",
"emptyList": "清单为空",
"emptyListDescription": "通过上方输入框添加商品。",
"newListPrompt": "新清单名称:",
"newListButton": "新建清单",
"renameListPrompt": "新清单名称:",
"deleteListConfirm": "删除清单 \"{{name}}\" 及所有商品?",
"deletedListToast": "清单已删除。",
"itemDeletedToast": "\"{{name}}\" 已移除。",
"itemsRemovedToast": "已移除 {{count}} 件商品。",
"clearChecked": "删除已勾选 ({{count}})",
"itemNamePlaceholder": "添加商品…",
"itemQtyPlaceholder": "数量",
"itemNameLabel": "商品名称",
"itemQtyLabel": "数量",
"categoryLabel": "分类",
"addItemLabel": "添加商品",
"renameListLabel": "重命名清单",
"deleteListLabel": "删除清单",
"swipeBack": "返回",
"swipeCheck": "勾选",
"swipeDelete": "删除",
"markDoneLabel": "勾选 {{name}}",
"markUndoneLabel": "取消勾选 {{name}}",
"deleteItemLabel": "删除 {{name}}",
"listsLoadError": "清单加载失败。",
"itemsLoadError": "商品加载失败。",
"catFruitVeg": "蔬果",
"catBakery": "烘焙",
"catDairy": "乳制品",
"catMeatFish": "肉类&海鲜",
"catFrozen": "冷冻食品",
"catDrinks": "饮料",
"catHousehold": "家居",
"catDrugstore": "日化",
"catMisc": "其他"
},
"meals": {
"title": "饮食计划",
"noMealPlanned": "暂无饮食计划",
"addMeal": "添加{{type}}",
"editMeal": "编辑餐食",
"addMealTitle": "添加餐食",
"deleteMeal": "删除餐食",
"transferToShoppingList": "食材添加到购物清单",
"today": "今天",
"prevWeek": "上一周",
"nextWeek": "下一周",
"loadError": "饮食计划加载失败。",
"typeBreakfast": "早餐",
"typeLunch": "午餐",
"typeDinner": "晚餐",
"typeSnack": "零食",
"dayMo": "一",
"dayDi": "二",
"dayMi": "三",
"dayDo": "四",
"dayFr": "五",
"daySa": "六",
"daySo": "日",
"dateLabel": "日期",
"mealTypeLabel": "餐食",
"titleLabel": "标题 *",
"titlePlaceholder": "例如:红烧肉",
"notesLabel": "备注",
"notesPlaceholder": "可选…",
"ingredientsLabel": "食材",
"addIngredient": "添加食材",
"ingredientNamePlaceholder": "食材",
"ingredientQtyPlaceholder": "数量",
"removeIngredient": "移除食材",
"transferLabel": "将食材添加到购物清单",
"transferNow": "立即添加",
"noShoppingLists": "暂无购物清单",
"transferSuccess": "已添加 {{count}} 种食材",
"transferSuccessPlural": "已添加 {{count}} 种食材",
"transferAlreadyDone": "所有食材已添加",
"ingredientCount": "{{count}} 种食材",
"ingredientCountPlural": "{{count}} 种食材",
"titleRequired": "标题为必填项",
"loadingIndicator": "加载中…",
"recipeUrlLabel": "食谱链接(可选)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "打开食谱"
},
"calendar": {
"title": "日历",
"newEvent": "新建日程",
"editEvent": "编辑日程",
"addEvent": "添加日程",
"deleteEvent": "删除日程",
"noEvents": "所选时间段内暂无日程。",
"today": "今天",
"back": "返回",
"forward": "前进",
"viewMonth": "月",
"viewWeek": "周",
"viewDay": "日",
"viewAgenda": "议程",
"allDay": "全天",
"allDayShort": "全天",
"moreEvents": "+{{count}} 更多",
"weekNumberLabel": "第 {{week}} 周 · {{month}} {{year}}",
"agendaFrom": "从 {{date}} 起",
"titleLabel": "标题 *",
"titlePlaceholder": "例如:牙医预约",
"allDayToggle": "全天",
"startDateLabel": "开始日期",
"startTimeLabel": "开始时间",
"endDateLabel": "结束日期",
"endTimeLabel": "结束时间",
"fromLabel": "从",
"toLabel": "至",
"locationLabel": "地点",
"locationPlaceholder": "可选",
"assignedLabel": "分配给",
"assignedNobody": "- 无人 -",
"colorLabel": "颜色 {{color}}",
"descriptionLabel": "描述",
"descriptionPlaceholder": "可选…",
"popupEdit": "编辑",
"deleteConfirm": "确定删除 \"{{title}}\"",
"createdToast": "日程已创建",
"savedToast": "日程已保存",
"deletedToast": "日程已删除",
"loadError": "日程加载失败。",
"saveError": "保存失败",
"deleteError": "删除失败",
"titleRequired": "标题为必填项",
"monthJanuary": "一月",
"monthFebruary": "二月",
"monthMarch": "三月",
"monthApril": "四月",
"monthMay": "五月",
"monthJune": "六月",
"monthJuly": "七月",
"monthAugust": "八月",
"monthSeptember": "九月",
"monthOctober": "十月",
"monthNovember": "十一月",
"monthDecember": "十二月",
"dayShortSunday": "日",
"dayShortMonday": "一",
"dayShortTuesday": "二",
"dayShortWednesday": "三",
"dayShortThursday": "四",
"dayShortFriday": "五",
"dayShortSaturday": "六",
"dayLongSunday": "星期日",
"dayLongMonday": "星期一",
"dayLongTuesday": "星期二",
"dayLongWednesday": "星期三",
"dayLongThursday": "星期四",
"dayLongFriday": "星期五",
"dayLongSaturday": "星期六",
"timeSuffix": ""
},
"notes": {
"title": "便签板",
"newNote": "新建便签",
"editNote": "编辑便签",
"addNoteLabel": "新建便签",
"searchPlaceholder": "搜索便签…",
"emptyTitle": "暂无便签",
"emptyDescription": "通过 + 按钮创建新便签。",
"noResultsTitle": "无结果",
"noResultsDescription": "没有包含 \"{{query}}\" 的便签。",
"titleLabel": "标题(可选)",
"titlePlaceholder": "无标题",
"contentLabel": "内容",
"contentMarkdownHint": "(支持 Markdown 格式)",
"contentPlaceholder": "输入便签…",
"colorLabel": "颜色",
"pinnedLabel": "置顶(显示在仪表板)",
"pinAction": "置顶",
"unpinAction": "取消置顶",
"deleteLabel": "删除便签",
"deleteConfirm": "确定删除便签?",
"createdToast": "便签已创建",
"savedToast": "便签已保存",
"deletedToast": "便签已删除",
"loadError": "便签加载失败。",
"formatBold": "加粗 (Ctrl+B)",
"formatItalic": "斜体 (Ctrl+I)",
"formatUnderline": "下划线 (Ctrl+U)",
"formatStrikethrough": "删除线",
"formatHeading": "标题",
"formatList": "列表",
"formatOrderedList": "有序列表",
"formatChecklist": "待办清单",
"formatLink": "链接",
"formatCode": "代码",
"formatQuote": "引用",
"formatDivider": "分隔线"
},
"contacts": {
"title": "联系人",
"newContact": "新建联系人",
"editContact": "编辑联系人",
"addButton": "新建",
"newContactLabel": "新建联系人",
"searchPlaceholder": "搜索姓名、电话或邮箱…",
"importButton": "导入",
"importLabel": "从 vCard 导入联系人",
"importTooltip": "导入 vCard",
"emptyTitle": "暂无联系人",
"emptyDescription": "通过 + 按钮添加新联系人。",
"filterAll": "全部",
"nameLabel": "姓名 *",
"namePlaceholder": "全名",
"categoryLabel": "分类",
"phoneLabel": "电话",
"phonePlaceholder": "+86 …",
"emailLabel": "邮箱",
"emailPlaceholder": "name@example.com",
"addressLabel": "地址",
"addressPlaceholder": "街道、城市",
"notesLabel": "备注",
"notesPlaceholder": "可选…",
"callLabel": "拨打电话",
"emailActionLabel": "发送邮件",
"mapsLabel": "在地图中打开",
"exportLabel": "导出为 vCard",
"exportTooltip": "导出 vCard",
"deleteLabel": "删除联系人",
"deleteConfirm": "确定删除联系人?",
"deletePersonConfirm": "确定删除 \"{{name}}\"",
"savedToast": "联系人已保存",
"updatedToast": "联系人已更新",
"deletedToast": "联系人已删除",
"importedToast": "{{name}} 已导入。",
"importError": "导入失败:{{error}}",
"vcardNoName": "vCard 不含姓名。",
"catDoctor": "医生",
"catSchool": "学校/幼儿园",
"catAuthority": "政府机构",
"catInsurance": "保险",
"catCraftsman": "技工",
"catEmergency": "紧急联系",
"catMisc": "其他",
"categoryDoctor": "医生",
"categorySchool": "学校/幼儿园",
"categoryAuthority": "政府机构",
"categoryInsurance": "保险",
"categoryCraftsman": "技工",
"categoryEmergency": "紧急联系",
"categoryOther": "其他"
},
"budget": {
"title": "预算",
"newEntry": "新建条目",
"editEntry": "编辑条目",
"addEntryLabel": "添加条目",
"newEntryFabLabel": "新建条目",
"currentMonth": "当前",
"prevMonth": "上个月",
"nextMonth": "下个月",
"income": "收入",
"expenses": "支出",
"balance": "余额",
"byCategory": "按分类",
"transactions": "交易记录",
"emptyTitle": "本月暂无条目",
"emptyDescription": "通过 + 按钮添加预算条目。",
"csvExport": "CSV",
"typeExpense": "支出",
"typeIncome": "收入",
"titleLabel": "标题 *",
"titlePlaceholder": "例如:超市购物",
"amountLabel": "金额 *",
"amountPlaceholder": "0.00",
"categoryLabel": "分类",
"dateLabel": "日期 *",
"recurringLabel": "重复",
"deleteLabel": "删除条目",
"deleteConfirm": "确定删除条目?",
"deletePersonConfirm": "确定删除 \"{{title}}\"",
"addedToast": "条目已添加",
"savedToast": "条目已保存",
"deletedToast": "条目已删除",
"loadError": "预算加载失败。",
"trendNeutral": "- 与 {{month}} 相同",
"validAmountRequired": "请输入有效金额",
"dateRequired": "日期为必填项",
"catFood": "食品",
"catRent": "租金",
"catInsurance": "保险",
"catMobility": "出行",
"catLeisure": "休闲",
"catClothing": "服装",
"catHealth": "健康",
"catEducation": "教育",
"catMisc": "其他",
"loadingIndicator": "加载中…"
},
"settings": {
"title": "设置",
"tabGeneral": "常规",
"tabMeals": "饮食",
"tabBudget": "预算",
"tabShopping": "购物",
"tabCalendar": "日历",
"tabAccount": "账户",
"tabsAriaLabel": "设置类别",
"sectionDesign": "外观",
"sectionShopping": "购物",
"shoppingCategoriesLabel": "购物分类",
"shoppingCategoriesHint": "添加、重命名、删除或排序分类。",
"shoppingCategoryPlaceholder": "新分类…",
"shoppingCategoryRenameHint": "点击重命名",
"shoppingCategoryRenamePrompt": "新分类名称:",
"shoppingCategoryMoveUp": "上移分类",
"shoppingCategoryMoveDown": "下移分类",
"shoppingCategoryDelete": "删除分类",
"shoppingCategoryDeleteConfirm": "删除分类 \"{{name}}\"?现有商品将归入下一分类。",
"shoppingCategoryAdded": "分类已添加。",
"shoppingCategoryRenamed": "分类已重命名。",
"shoppingCategoryDeleted": "分类已删除。",
"sectionAccount": "我的账户",
"sectionCalendarSync": "日历同步",
"sectionFamily": "家庭成员",
"cardAppearance": "外观",
"themeSystem": "跟随系统",
"themeSysLabel": "使用系统设置",
"themeLight": "浅色",
"themeLightLabel": "浅色主题",
"themeDark": "深色",
"themeDarkLabel": "深色主题",
"changePassword": "修改密码",
"currentPasswordLabel": "当前密码",
"newPasswordLabel": "新密码",
"confirmPasswordLabel": "确认新密码",
"savePassword": "保存密码",
"passwordMismatch": "两次密码不一致。",
"passwordSavedToast": "密码修改成功。",
"googleCalendar": "Google 日历",
"appleCalendar": "Apple 日历(iCloud",
"syncNow": "立即同步",
"disconnect": "断开连接",
"connectGoogle": "连接 Google",
"connected": "已连接",
"connectedLastSync": "已连接 · 上次:{{date}}",
"notConnected": "未连接",
"notConfigured": "未配置(缺少 .env 变量)",
"configured": "已配置(通过 .env",
"configuredLastSync": "已配置(通过 .env · 上次:{{date}}",
"syncSuccess": "{{provider}} 同步成功。",
"disconnectedToast": "{{provider}} 已断开。",
"googleOnlyAdmin": "只有管理员可以连接 Google 日历。",
"appleOnlyAdmin": "只有管理员可以连接 Apple 日历。",
"caldavUrlLabel": "CalDAV 服务器 URL",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple ID(邮箱)",
"applePasswordLabel": "专用 App 密码",
"applePasswordHint": "在 <strong>appleid.apple.com → 安全</strong> 下创建密码。",
"appleConnectBtn": "连接并测试",
"appleConnecting": "连接中…",
"appleConnectedToast": "Apple 日历已连接。",
"syncSuccessGoogle": "Google 日历同步连接成功。",
"syncSuccessApple": "Apple 日历同步连接成功。",
"syncErrorGoogle": "连接 Google 失败,请重试。",
"syncErrorApple": "连接 Apple 失败,请重试。",
"addMember": "+ 添加成员",
"newMemberTitle": "新建家庭成员",
"usernameLabel": "用户名",
"displayNameLabel": "显示名称",
"memberPasswordLabel": "密码",
"colorLabel": "颜色",
"roleLabel": "角色",
"roleMember": "成员",
"roleAdmin": "管理员",
"createMember": "创建",
"cancelAddMember": "取消",
"memberAddedToast": "{{name}} 已添加。",
"deleteMemberConfirm": "确定删除 {{name}}",
"memberDeletedToast": "{{name}} 已删除。",
"deleteMemberLabel": "删除",
"logout": "退出登录",
"synchronizing": "同步中…",
"googleDisconnectConfirm": "断开 Google 日历连接?",
"appleDisconnectConfirm": "断开 Apple 日历连接?",
"localeSystem": "跟随系统",
"localeLabel": "语言",
"languageTitle": "语言",
"sectionMeals": "饮食计划",
"mealTypesLabel": "显示的餐食类型",
"mealTypesHint": "饮食计划中只显示已选择的餐食类型。",
"mealTypesSaved": "饮食计划设置已保存。",
"mealTypesMinOne": "至少需要一种餐食类型处于启用状态。",
"sectionBudget": "预算",
"currencyLabel": "货币",
"currencyHint": "设置整个预算区域使用的货币。",
"currencySaved": "货币已保存。"
},
"login": {
"tagline": "家庭规划。安全。注重隐私。开源。",
"usernameLabel": "用户名",
"usernamePlaceholder": "用户名",
"passwordLabel": "密码",
"passwordPlaceholder": "••••••••",
"loginButton": "登录",
"loggingIn": "登录中…",
"tooManyAttempts": "尝试次数过多,请稍后再试。",
"invalidCredentials": "用户名或密码错误。"
},
"install": {
"title": "安装 Oikos",
"subtitle": "添加到应用",
"iosTip1": "点击 ",
"iosTip2": " → \"添加到主屏幕\"",
"installButton": "安装",
"dismissLabel": "关闭"
},
"modal": {
"closeLabel": "关闭"
},
"rrule": {
"freqNone": "不重复",
"freqDaily": "每天",
"freqWeekly": "每周",
"freqMonthly": "每月",
"dayMo": "一",
"dayTu": "二",
"dayWe": "三",
"dayTh": "四",
"dayFr": "五",
"daySa": "六",
"daySu": "日",
"labelRepeat": "重复",
"labelEvery": "每",
"labelOnDays": "在这些天",
"labelUntil": "结束日期(可选)",
"unitDay": "天",
"unitDays": "天",
"unitWeek": "周",
"unitWeeks": "周",
"unitMonth": "个月",
"unitMonths": "个月"
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ import { t, formatDate, formatTime } from '/i18n.js';
import { esc } from '/utils/html.js'; import { esc } from '/utils/html.js';
import '/components/oikos-locale-picker.js'; import '/components/oikos-locale-picker.js';
const SUPPORTED_CURRENCIES = ['AUD', 'CAD', 'CHF', 'CNY', 'CZK', 'DKK', 'EUR', 'GBP', 'HUF', 'JPY', 'NOK', 'PLN', 'SEK', 'USD']; const SUPPORTED_CURRENCIES = ['AUD', 'CAD', 'CHF', 'CNY', 'CZK', 'DKK', 'EUR', 'GBP', 'HUF', 'JPY', 'NOK', 'PLN', 'RUB', 'SEK', 'TRY', 'USD'];
const SETTINGS_TAB_KEY = 'oikos:settings:tab'; const SETTINGS_TAB_KEY = 'oikos:settings:tab';
function buildCurrencyOptions(selected) { function buildCurrencyOptions(selected) {
+1 -1
View File
@@ -15,7 +15,7 @@ const router = express.Router();
const VALID_MEAL_TYPES = ['breakfast', 'lunch', 'dinner', 'snack']; const VALID_MEAL_TYPES = ['breakfast', 'lunch', 'dinner', 'snack'];
const DEFAULT_MEAL_TYPES = VALID_MEAL_TYPES.join(','); const DEFAULT_MEAL_TYPES = VALID_MEAL_TYPES.join(',');
const VALID_CURRENCIES = ['EUR', 'USD', 'GBP', 'SEK', 'NOK', 'DKK', 'CHF', 'CNY', 'PLN', 'CZK', 'HUF', 'JPY', 'AUD', 'CAD']; const VALID_CURRENCIES = ['EUR', 'USD', 'GBP', 'SEK', 'NOK', 'DKK', 'CHF', 'CNY', 'PLN', 'CZK', 'HUF', 'JPY', 'AUD', 'CAD', 'TRY', 'RUB'];
const DEFAULT_CURRENCY = 'EUR'; const DEFAULT_CURRENCY = 'EUR';
// -------------------------------------------------------- // --------------------------------------------------------