diff --git a/CHANGELOG.md b/CHANGELOG.md index aa68cb4..26ede4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.50.0] - 2026-05-08 + +### Added +- **Polish locale**: full Polish (`pl`) translation added, covering all UI strings across all modules (tasks, calendar, shopping, meals, budget, notes, contacts, birthdays, recipes, documents, housekeeping, settings, and more). Polish is now selectable in Settings → Language. + ## [0.49.0] - 2026-05-08 ### Added diff --git a/README.md b/README.md index e30acf4..0c8f22c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ The goal is a single, private place for everything that keeps a household runnin - **PWA** — installable on any device, works offline, dark mode, responsive from phone to desktop - **Privacy First** — SQLCipher AES-256 encrypted database, fully self-hosted, zero telemetry - **Zero Build Step** — pure ES modules, no bundler, no transpiler, no framework -- **Multilingual** — 15 languages with automatic locale detection (de, en, es, fr, it, sv, el, ru, tr, zh, ja, ar, hi, pt, uk) +- **Multilingual** — 16 languages with automatic locale detection (de, en, es, fr, it, sv, el, ru, tr, zh, ja, ar, hi, pt, uk, pl) ## Quick Start diff --git a/docs/SPEC.md b/docs/SPEC.md index 125d70b..fc1ed1b 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -572,7 +572,7 @@ User management and app configuration. Logged-in users only. - **Calendar Sync:** connect/disconnect Google Calendar (OAuth 2.0); manage multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal) with per-account calendar selection via checkboxes, two-way sync, and optional outbound event target; manage ICS URL subscriptions (add, delete, sync now, set color and visibility); configure sync interval - **Contact Sync:** manage multiple CardDAV accounts (iCloud, Nextcloud, Radicale, Baikal); per-addressbook enable/disable; manual sync trigger; real-time status badges (success, error, syncing with animated spinner) - **Weather:** configure OpenWeatherMap location -- **Language:** System (follows `navigator.language`), German, English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese, Japanese, Arabic, Hindi, Portuguese - 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, Japanese, Arabic, Hindi, Portuguese, Ukrainian, Polish - via `oikos-locale-picker` web component; switch without page reload - **API Tokens (admin):** create named Bearer / X-API-Key tokens for external integrations; the full token value is shown only once immediately after creation; tokens can be revoked at any time; support optional expiry and track last-used timestamp - **Backup Management (admin):** download the current database as a file (`GET /api/v1/backup/database`) or restore from a backup file (`POST /api/v1/backup/restore`, drag-and-drop supported). Validates that the uploaded file is a valid Oikos database. A rollback copy is created automatically before restore. **Automatic scheduled backups:** configurable via `.env` (`BACKUP_ENABLED`, `BACKUP_SCHEDULE`, `BACKUP_DIR`, `BACKUP_KEEP`); default 2 AM daily, keeps last 7 copies; Settings → Backup shows scheduler status, schedule, retention policy, last backup timestamp, and a manual trigger button. - **Tab navigation:** Settings is organized in nine tabs (General, Meals, Budget, Shopping, Synchronization, Family, API Tokens, Backup, Account). Admin-only tabs: Family, API Tokens, Backup. Sticky tab bar, active tab persists in sessionStorage, Synchronization tab auto-activates after OAuth callbacks. @@ -791,7 +791,7 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o ### Architecture - **Module:** `public/i18n.js` - exports: `initI18n()`, `setLocale()`, `t(key, params?)`, `getLocale()`, `getSupportedLocales()`, `formatDate(date)`, `formatTime(date)` -- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json`, `public/locales/es.json`, `public/locales/fr.json`, `public/locales/it.json`, `public/locales/sv.json`, `public/locales/el.json`, `public/locales/ru.json`, `public/locales/tr.json`, `public/locales/zh.json`, `public/locales/ja.json`, `public/locales/ar.json`, `public/locales/hi.json`, `public/locales/pt.json` - structure: `{ "module.camelCaseKey": "Value" }` +- **Locale files:** `public/locales/de.json` (reference), `public/locales/en.json`, `public/locales/es.json`, `public/locales/fr.json`, `public/locales/it.json`, `public/locales/sv.json`, `public/locales/el.json`, `public/locales/ru.json`, `public/locales/tr.json`, `public/locales/zh.json`, `public/locales/ja.json`, `public/locales/ar.json`, `public/locales/hi.json`, `public/locales/pt.json`, `public/locales/uk.json`, `public/locales/pl.json` - structure: `{ "module.camelCaseKey": "Value" }` - **Variables:** `{{variable}}` syntax in translation strings, e.g. `t('tasks.assignedTo', { name: 'Anna' })` - **Fallback chain:** active locale → German (`de`) → key itself - **Date format:** `Intl.DateTimeFormat` with current locale - use `formatDate()` and `formatTime()` from `i18n.js` @@ -820,6 +820,8 @@ All UI strings are managed via `public/i18n.js`. No hardcoded text in JS files o | `ar` | Arabic | Full translation (added v0.19.0) | | `hi` | Hindi | Full translation (added v0.19.0) | | `pt` | Portuguese | Full translation (added v0.19.0) | +| `uk` | Ukrainian | Full translation (added v0.19.0) | +| `pl` | Polish | Full translation (added v0.50.0) | ### Adding a New Language diff --git a/package.json b/package.json index 0a17e54..162542d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.49.0", + "version": "0.50.0", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/components/oikos-locale-picker.js b/public/components/oikos-locale-picker.js index ddf7ae9..876dcf1 100644 --- a/public/components/oikos-locale-picker.js +++ b/public/components/oikos-locale-picker.js @@ -23,6 +23,7 @@ const LOCALE_LABELS = { hi: 'हिन्दी', pt: 'Português', uk: 'Українська', + pl: 'Polski', }; class OikosLocalePicker extends HTMLElement { diff --git a/public/i18n.js b/public/i18n.js index fc7f077..c73564f 100644 --- a/public/i18n.js +++ b/public/i18n.js @@ -5,7 +5,7 @@ * Dependencies: none (vanilla JS, Fetch API, Intl API) */ -const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', 'zh', 'ja', 'ar', 'hi', 'pt', 'uk']; +const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', 'zh', 'ja', 'ar', 'hi', 'pt', 'uk', 'pl']; const DEFAULT_LOCALE = 'de'; const STORAGE_KEY = 'oikos-locale'; const DATE_FORMAT_KEY = 'oikos-date-format'; diff --git a/public/locales/pl.json b/public/locales/pl.json new file mode 100644 index 0000000..992e1d9 --- /dev/null +++ b/public/locales/pl.json @@ -0,0 +1,1462 @@ +{ + "common": { + "save": "Zapisz", + "cancel": "Anuluj", + "delete": "Usuń", + "edit": "Edytuj", + "close": "Zamknij", + "create": "Utwórz", + "add": "Dodaj", + "back": "Wstecz", + "next": "Dalej", + "loading": "Ładowanie…", + "saving": "Zapisywanie…", + "required": "To pole jest wymagane.", + "error": "Błąd", + "allFieldsRequired": "Proszę wypełnić wszystkie pola.", + "today": "Dzisiaj", + "tomorrow": "Jutro", + "skipToContent": "Przejdź do treści", + "reload": "Odśwież", + "errorOccurred": "Coś poszło nie tak.", + "unexpectedError": "Wystąpił nieoczekiwany błąd.", + "errorGeneric": "Wystąpił błąd.", + "updateAvailable": "Dostępna aktualizacja – ponowne ładowanie…", + "titleRequired": "Tytuł jest wymagany", + "nameRequired": "Nazwa jest wymagana", + "contentRequired": "Treść jest wymagana", + "all": "Wszystkie", + "unknownError": "Nieznany błąd", + "confirm": "Potwierdź", + "undo": "Cofnij", + "reset": "Przywróć oryginał", + "errorOffline": "Brak połączenia z internetem. Sprawdź sieć.", + "errorForbidden": "Odmowa dostępu. Zaloguj się ponownie.", + "errorNotFound": "Wpis nie został znaleziony.", + "errorServer": "Błąd serwera. Spróbuj ponownie później.", + "errorTimeout": "Połączenie trwało zbyt długo. Spróbuj ponownie." + }, + "nav": { + "dashboard": "Pulpit", + "tasks": "Zadania", + "calendar": "Kalendarz", + "meals": "Jedzenie", + "shopping": "Zakupy", + "notes": "Notatki", + "contacts": "Kontakty", + "birthdays": "Urodziny", + "budget": "Budżet", + "settings": "Ustawienia", + "main": "Główna nawigacja", + "navigation": "Nawigacja", + "quickActions": "Szybkie akcje", + "more": "Więcej", + "recipes": "Przepisy", + "documents": "Dokumenty", + "kitchen": "Kuchnia", + "search": "Szukaj", + "housekeeping": "Sprzątanie" + }, + "search": { + "title": "Szukaj", + "placeholder": "Szukaj…", + "noResults": "Nie znaleziono wyników.", + "open": "Otwórz wyszukiwanie" + }, + "dashboard": { + "title": "Pulpit", + "greetingMorning": "Dzień dobry, {{name}}", + "greetingDay": "Cześć, {{name}}", + "greetingEvening": "Dobry wieczór, {{name}}", + "allDone": "Wszystko gotowe", + "noEvents": "Brak wydarzeń", + "noPinnedNotes": "Brak przypiętych notatek", + "todayMeals": "Dzisiaj na obiad", + "allLink": "Wszystkie", + "weekLink": "Tydzień", + "urgentTasksChip": "{{count}} pilne zadanie", + "urgentTasksChipPlural": "{{count}} pilne zadania", + "eventsChip": "{{count}} wydarzenie dzisiaj", + "eventsChipPlural": "{{count}} wydarzenia dzisiaj", + "todayMealChip": "Dzisiaj: {{title}}", + "loadError": "Nie udało się w pełni załadować pulpitu.", + "weatherRefresh": "Odśwież pogodę", + "weatherRefreshTitle": "Odśwież", + "weatherUpdated": "Pogoda zaktualizowana", + "weatherFeelsLike": "Odczuwalnie {{temp}}° · {{humidity}}% · Wiatr {{wind}} {{windUnit}}", + "fabTaskLabel": "Dodaj zadanie", + "fabCalendarLabel": "Dodaj wydarzenie", + "fabShoppingLabel": "Dodaj zakupy", + "fabNoteLabel": "Dodaj notatkę", + "fabTask": "Zadanie", + "fabCalendar": "Wydarzenie", + "fabShopping": "Zakupy", + "fabNote": "Notatka", + "overdue": "Przeterminowane", + "dueSoon": "Wkrótce", + "dueToday": "Na dziś", + "dueTomorrow": "Na jutro", + "allDay": "Cały dzień", + "shoppingMore": "+{{count}} więcej", + "weather": "Pogoda", + "familyMembers": "Członkowie rodziny", + "participantsAdded": "Dodano uczestników", + "upcomingBirthdays": "Nadchodzące urodziny", + "noBirthdays": "Brak urodzin", + "daysLeft": "{{count}} dni", + "budgetOverview": "Przegląd budżetu", + "monthlyIncome": "Przychody", + "monthlyExpenses": "Wydatki", + "monthlyBalance": "Saldo", + "savingsRate": "Oszczędności", + "topExpense": "Największy wydatek", + "budgetEntries": "Wpisy", + "noBudgetData": "Brak danych budżetowych w tym miesiącu.", + "customize": "Dostosuj", + "customizeTitle": "Dostosuj widżety", + "customizeReset": "Domyślne", + "customizeSaved": "Pulpit zapisany", + "customizeMoveUp": "Przesuń w górę", + "customizeMoveDown": "Przesuń w dół", + "overdueTasksChip": "{{count}} przeterminowane zadanie", + "overdueTasksChipPlural": "{{count}} przeterminowane zadania", + "customizeManage": "Widżety", + "customizeExit": "Zakończ dostosowywanie", + "customizeDrag": "Przeciągnij widżet", + "customizeSize": "Rozmiar", + "customizeSizeFor": "Rozmiar dla {{widget}}", + "customizeHide": "Ukryj {{widget}}", + "widgetSizeTiny": "Mały (1×1)", + "widgetSizeNarrow": "Wąski (2×1)", + "widgetSizeStandard": "Standardowy (2×2)", + "widgetSizeLarge": "Duży (3×2)", + "widgetSizeFull": "Pełny (4×2)" + }, + "tasks": { + "title": "Zadania", + "newTask": "Nowe zadanie", + "editTask": "Edytuj zadanie", + "emptyTitle": "Brak zadań – wszystko gotowe?", + "emptyDescription": "Utwórz nowe zadania przyciskiem +.", + "emptyAction": "Utwórz zadanie", + "titleLabel": "Tytuł *", + "titlePlaceholder": "Co trzeba zrobić?", + "descriptionLabel": "Notatka", + "descriptionPlaceholder": "Opcjonalne szczegóły…", + "priorityLabel": "Priorytet", + "categoryLabel": "Kategoria", + "dueDateLabel": "Termin", + "dueTimeLabel": "Godzina", + "assignedLabel": "Przypisane do", + "assignedNobody": "– Nikt –", + "statusLabel": "Status", + "priorityUrgent": "Pilne", + "priorityHigh": "Wysokie", + "priorityMedium": "Średnie", + "priorityLow": "Niskie", + "priorityNone": "Brak", + "statusOpen": "Otwarte", + "statusInProgress": "W toku", + "statusDone": "Zrobione", + "categoryHousehold": "Dom", + "categorySchool": "Szkoła", + "categoryShopping": "Zakupy", + "categoryRepair": "Naprawa", + "categoryHealth": "Zdrowie", + "categoryFinance": "Finanse", + "categoryLeisure": "Wypoczynek", + "categoryMisc": "Inne", + "overdue": "Przeterminowane", + "overdueDay": "{{count}}d po terminie", + "dueToday": "Na dziś", + "dueTomorrow": "Na jutro", + "groupOverdue": "Przeterminowane", + "groupToday": "Dzisiaj", + "groupThisWeek": "W tym tygodniu", + "groupNextWeek": "W przyszłym tygodniu", + "groupLater": "Później", + "groupNoDate": "Bez daty", + "markDone": "Oznacz {{title}} jako zrobione", + "markOpen": "Oznacz {{title}} jako otwarte", + "editButton": "Edytuj zadanie", + "swipeOpen": "Otwórz", + "swipeDone": "Zrobione", + "swipeEdit": "Edytuj", + "subtaskAdd": "+ Dodaj podzadanie", + "subtaskToggle": "Pokaż podzadania", + "subtaskMarkDone": "Oznacz {{title}} jako zrobione", + "deleteConfirm": "Usunąć zadanie i wszystkie podzadania?", + "savedToast": "Zadanie zapisane.", + "createdToast": "Zadanie utworzone.", + "deletedToast": "Zadanie usunięte.", + "loadError": "Nie udało się załadować zadania.", + "subtaskPrompt": "Podzadanie:", + "kanbanOpen": "Otwarte", + "kanbanInProgress": "W toku", + "kanbanDone": "Zrobione", + "kanbanMoveToInProgress": "Ustaw jako w toku", + "kanbanMoveToDone": "Oznacz jako zrobione", + "kanbanMoveToOpen": "Otwórz ponownie", + "recurring": "Cykliczne", + "listView": "Widok listy", + "kanbanView": "Widok Kanban", + "swipedDoneToast": "Oznaczono jako zrobione.", + "swipedOpenToast": "Oznaczono jako otwarte.", + "filterBtn": "Filtry", + "filterGroupStatus": "Status", + "filterGroupPriority": "Priorytet", + "filterGroupPerson": "Osoba", + "filterClearAll": "Wyczyść wszystkie filtry", + "navLabelOverdue": "Zadania, {{count}} przeterminowanych", + "statusArchived": "Zarchiwizowane", + "archiveButton": "Archiwizuj zadanie", + "archivedToast": "Zadanie zarchiwizowane.", + "bulkSelect": "Wybór wielokrotny", + "selectTask": "Wybierz zadanie", + "bulkSelectedCount": "{{count}} zaznaczonych", + "bulkMarkDone": "Zrobione", + "bulkMarkOpen": "Otwarte", + "bulkArchive": "Archiwizuj", + "bulkDelete": "Usuń", + "bulkDeleteConfirm": "Bezpowrotnie usunąć {{count}} zadań?", + "bulkStatusChanged": "Status zmieniony.", + "bulkArchived": "Zadania zarchiwizowane.", + "bulkDeleted": "Zadania usunięte.", + "kanbanArchived": "Zarchiwizowane", + "reminderNeedsDueDate": "Ustaw datę terminu, aby włączyć przypomnienia o zadaniu." + }, + "shopping": { + "title": "Zakupy", + "noLists": "Brak list", + "noListsDescription": "Utwórz listę przyciskiem +.", + "emptyList": "Lista jest pusta", + "emptyListDescription": "Dodaj artykuły w polu powyżej.", + "emptyAction": "Dodaj artykuł", + "newListPrompt": "Nazwa nowej listy:", + "newListButton": "Utwórz nową listę", + "renameListPrompt": "Nowa nazwa listy:", + "deleteListConfirm": "Usunąć listę \"{{name}}\" i wszystkie artykuły?", + "deletedListToast": "Lista usunięta.", + "itemDeletedToast": "Usunięto \"{{name}}\".", + "itemsRemovedToast": "Usunięto {{count}} artykułów.", + "clearChecked": "Usuń zaznaczone ({{count}})", + "itemNamePlaceholder": "Dodaj artykuł…", + "itemQtyPlaceholder": "Ilość", + "itemNameLabel": "Nazwa artykułu", + "itemQtyLabel": "Ilość", + "categoryLabel": "Kategoria", + "addItemLabel": "Dodaj artykuł", + "renameListLabel": "Zmień nazwę listy", + "deleteListLabel": "Usuń listę", + "swipeBack": "Wstecz", + "swipeCheck": "Odznacz", + "swipeDelete": "Usuń", + "markDoneLabel": "Odznacz {{name}}", + "markUndoneLabel": "Oznacz {{name}} jako nieodznaczone", + "deleteItemLabel": "Usuń {{name}}", + "listsLoadError": "Nie udało się załadować list.", + "itemsLoadError": "Nie udało się załadować artykułów.", + "catFruitVeg": "Owoce i warzywa", + "catBakery": "Pieczywo", + "catDairy": "Nabiał", + "catMeatFish": "Mięso i ryby", + "catFrozen": "Mrożonki", + "catDrinks": "Napoje", + "catHousehold": "Dom", + "catDrugstore": "Drogeria", + "catMisc": "Inne" + }, + "meals": { + "title": "Plan posiłków", + "noMealPlanned": "Brak zaplanowanych posiłków", + "addMeal": "Dodaj {{type}}", + "editMeal": "Edytuj posiłek", + "addMealTitle": "Dodaj posiłek", + "deleteMeal": "Usuń posiłek", + "transferToShoppingList": "Składniki na listę zakupów", + "today": "Dzisiaj", + "prevWeek": "Poprzedni tydzień", + "nextWeek": "Następny tydzień", + "loadError": "Nie udało się załadować planu posiłków.", + "typeBreakfast": "Śniadanie", + "typeLunch": "Obiad", + "typeDinner": "Kolacja", + "typeSnack": "Przekąska", + "dayMo": "Pon", + "dayDi": "Wt", + "dayMi": "Śr", + "dayDo": "Czw", + "dayFr": "Pt", + "daySa": "Sob", + "daySo": "Niedz", + "dateLabel": "Data", + "mealTypeLabel": "Posiłek", + "titleLabel": "Tytuł *", + "titlePlaceholder": "np. Spaghetti Bolognese", + "notesLabel": "Notatki", + "notesPlaceholder": "Opcjonalnie…", + "ingredientsLabel": "Składniki", + "addIngredient": "Dodaj składnik", + "ingredientNamePlaceholder": "Składnik", + "ingredientQtyPlaceholder": "Ilość", + "ingredientCategoryLabel": "Kategoria", + "ingredientCategoryDefault": "Inne", + "removeIngredient": "Usuń składnik", + "transferLabel": "Przenieś składniki na listę zakupów", + "transferNow": "Przenieś teraz", + "noShoppingLists": "Brak list zakupów", + "transferSuccess": "Przeniesiono {{count}} składnik", + "transferSuccessPlural": "Przeniesiono {{count}} składniki", + "transferAlreadyDone": "Wszystkie składniki już przeniesione", + "ingredientCount": "{{count}} składnik", + "ingredientCountPlural": "{{count}} składniki", + "titleRequired": "Tytuł jest wymagany", + "loadingIndicator": "Ładowanie…", + "recipeUrlLabel": "Link do przepisu (opcjonalnie)", + "recipeUrlPlaceholder": "https://…", + "openRecipe": "Otwórz przepis", + "savedRecipeLabel": "Zapisany przepis", + "savedRecipePlaceholder": "Wybierz przepis", + "saveAsRecipe": "Zapisz jako przepis", + "recipeScaleLabel": "Skaluj składniki", + "deletedToast": "Posiłek usunięty" + }, + "calendar": { + "title": "Kalendarz", + "newEvent": "Nowe wydarzenie", + "editEvent": "Edytuj wydarzenie", + "addEvent": "Dodaj wydarzenie", + "deleteEvent": "Usuń wydarzenie", + "noEvents": "Brak wydarzeń w wybranym okresie.", + "today": "Dzisiaj", + "back": "Wstecz", + "forward": "Dalej", + "viewMonth": "Miesiąc", + "viewWeek": "Tydzień", + "viewDay": "Dzień", + "viewAgenda": "Agenda", + "allDay": "Cały dzień", + "allDayShort": "cały dz.", + "moreEvents": "+{{count}} więcej", + "weekNumberLabel": "Tydz. {{week}} · {{month}} {{year}}", + "agendaFrom": "Od {{date}}", + "titleLabel": "Tytuł *", + "titlePlaceholder": "np. Dentysta", + "allDayToggle": "Cały dzień", + "startDateLabel": "Data rozpoczęcia", + "startTimeLabel": "Godzina rozpoczęcia", + "endDateLabel": "Data zakończenia", + "endTimeLabel": "Godzina zakończenia", + "fromLabel": "Od", + "toLabel": "Do", + "locationLabel": "Miejsce", + "locationPlaceholder": "Opcjonalnie", + "assignedLabel": "Przypisane do", + "assignedNobody": "– Nikt –", + "colorLabel": "Kolor", + "colorBlue": "Niebieski", + "colorGreen": "Zielony", + "colorOrange": "Pomarańczowy", + "colorRed": "Czerwony", + "colorPurple": "Fioletowy", + "colorCoral": "Koralowy", + "colorSkyBlue": "Błękitny", + "colorYellow": "Żółty", + "colorGray": "Szary", + "colorCyan": "Cyjan", + "descriptionLabel": "Opis", + "descriptionPlaceholder": "Opcjonalnie…", + "popupEdit": "Edytuj", + "deleteConfirm": "Naprawdę usunąć \"{{title}}\"?", + "createdToast": "Wydarzenie utworzone", + "savedToast": "Wydarzenie zapisane", + "deletedToast": "Wydarzenie usunięte", + "loadError": "Nie udało się załadować wydarzeń.", + "saveError": "Błąd podczas zapisywania", + "deleteError": "Błąd podczas usuwania", + "titleRequired": "Tytuł jest wymagany", + "monthJanuary": "Styczeń", + "monthFebruary": "Luty", + "monthMarch": "Marzec", + "monthApril": "Kwiecień", + "monthMay": "Maj", + "monthJune": "Czerwiec", + "monthJuly": "Lipiec", + "monthAugust": "Sierpień", + "monthSeptember": "Wrzesień", + "monthOctober": "Październik", + "monthNovember": "Listopad", + "monthDecember": "Grudzień", + "dayShortSunday": "Niedz", + "dayShortMonday": "Pon", + "dayShortTuesday": "Wt", + "dayShortWednesday": "Śr", + "dayShortThursday": "Czw", + "dayShortFriday": "Pt", + "dayShortSaturday": "Sob", + "dayLongSunday": "Niedziela", + "dayLongMonday": "Poniedziałek", + "dayLongTuesday": "Wtorek", + "dayLongWednesday": "Środa", + "dayLongThursday": "Czwartek", + "dayLongFriday": "Piątek", + "dayLongSaturday": "Sobota", + "timeSuffix": "", + "ics": { + "reset": "Przywróć oryginał", + "resetToast": "Zmiany zostały cofnięte." + }, + "iconLabel": "Ikona", + "iconSearchPlaceholder": "Szukaj ikony...", + "iconSearchEmpty": "Nie znaleziono ikony.", + "iconCategoryGeneral": "Ogólne", + "iconCategoryHealth": "Zdrowie i sport", + "iconCategoryTransport": "Transport i podróże", + "iconCategoryWork": "Praca i edukacja", + "iconCategoryFood": "Jedzenie i napoje", + "iconCategoryShopping": "Zakupy i finanse", + "iconCategoryLeisure": "Wypoczynek i rozrywka", + "iconCategoryFamily": "Rodzina i zwierzęta", + "iconCategoryHome": "Dom i gospodarstwо domowe", + "iconCategoryNature": "Natura i inne", + "iconCalendar": "Kalendarz", + "iconAlarm": "Alarm", + "iconClock": "Zegar", + "iconBell": "Przypomnienie", + "iconLocation": "Miejsce", + "iconStar": "Ulubione", + "iconFlag": "Flaga", + "iconTarget": "Cel", + "iconFlame": "Ważne", + "iconTooth": "Dentysta", + "iconHospital": "Szpital", + "iconDoctor": "Lekarz", + "iconVaccine": "Szczepienie", + "iconMedicine": "Lek", + "iconBandage": "Opatrunek", + "iconHealth": "Zdrowie", + "iconActivity": "Aktywność", + "iconHaircut": "Fryzjer", + "iconSports": "Sport", + "iconTrophy": "Zawody", + "iconCar": "Samochód", + "iconBus": "Autobus", + "iconTrain": "Pociąg", + "iconPlane": "Podróż", + "iconFlight": "Lot", + "iconFuel": "Tankowanie", + "iconNavigation": "Nawigacja", + "iconWork": "Praca", + "iconLaptop": "Laptop", + "iconPresentation": "Prezentacja", + "iconSchool": "Szkoła", + "iconEducation": "Edukacja", + "iconReading": "Czytanie", + "iconStudy": "Nauka", + "iconCalculator": "Kalkulator", + "iconMeal": "Posiłek", + "iconCooking": "Gotowanie", + "iconCoffee": "Kawa", + "iconCake": "Urodziny", + "iconPizza": "Pizza", + "iconWine": "Wino", + "iconBeer": "Bar", + "iconShopping": "Zakupy", + "iconGroceries": "Spożywcze", + "iconGift": "Prezent", + "iconCard": "Karta", + "iconWallet": "Portfel", + "iconSavings": "Oszczędności", + "iconBank": "Bank", + "iconMusic": "Muzyka", + "iconMovie": "Film", + "iconTicket": "Bilet", + "iconGame": "Gra", + "iconPhoto": "Zdjęcie", + "iconParty": "Impreza", + "iconFamily": "Rodzina", + "iconBaby": "Niemowlę", + "iconDog": "Pies", + "iconCat": "Kot", + "iconPet": "Zwierzę", + "iconHome": "Dom", + "iconBuilding": "Budynek", + "iconRepair": "Naprawa", + "iconMaintenance": "Konserwacja", + "iconDecoration": "Dekoracja", + "iconFurniture": "Meble", + "iconLaundry": "Pranie", + "iconLeaf": "Natura", + "iconTree": "Drzewo", + "iconFlower": "Kwiat", + "iconSun": "Dzień", + "iconMoon": "Noc", + "iconWeather": "Pogoda", + "invalidDate": "Proszę użyć prawidłowej daty w wybranym formacie.", + "caldavTargetLabel": "Synchronizuj z CalDAV", + "caldavTargetLocal": "Tylko lokalnie", + "caldavTargetHint": "Wybierz kalendarz CalDAV, aby synchronizować to wydarzenie.", + "attachmentLabel": "Załącznik", + "attachmentHint": "Dołącz lokalny obraz, PDF lub dokument. Obrazy będą wyświetlane w podglądzie wydarzenia.", + "attachmentFallback": "Załącznik", + "attachmentReadError": "Nie udało się odczytać załącznika.", + "attachmentTooLarge": "Załącznik może mieć maksymalnie 5 MB.", + "iconCleaning": "Sprzątanie", + "attachmentDocumentName": "{{title}} - {{name}}", + "attachmentDocumentDescription": "Załącznik do wpisu kalendarza \"{{title}}\" przesłany." + }, + "notes": { + "title": "Notatki", + "newNote": "Nowa notatka", + "editNote": "Edytuj notatkę", + "addNoteLabel": "Nowa notatka", + "searchPlaceholder": "Szukaj notatek…", + "emptyTitle": "Brak notatek", + "emptyDescription": "Utwórz nową notatkę przyciskiem +.", + "emptyAction": "Utwórz notatkę", + "noResultsTitle": "Brak wyników", + "noResultsDescription": "Żadna notatka nie zawiera \"{{query}}\".", + "titleLabel": "Tytuł (opcjonalnie)", + "titlePlaceholder": "Bez tytułu", + "contentLabel": "Treść", + "contentMarkdownHint": "(możliwe formatowanie Markdown)", + "contentPlaceholder": "Wpisz notatkę…", + "colorLabel": "Kolor", + "pinnedLabel": "Przypnij (widoczne na pulpicie)", + "pinAction": "Przypnij", + "unpinAction": "Odepnij", + "deleteLabel": "Usuń notatkę", + "deleteConfirm": "Naprawdę usunąć notatkę?", + "createdToast": "Notatka utworzona", + "savedToast": "Notatka zapisana", + "deletedToast": "Notatka usunięta", + "loadError": "Nie udało się załadować notatek.", + "formatBold": "Pogrubienie (Ctrl+B)", + "formatItalic": "Kursywa (Ctrl+I)", + "formatUnderline": "Podkreślenie (Ctrl+U)", + "formatStrikethrough": "Przekreślenie", + "formatHeading": "Nagłówek", + "formatList": "Lista", + "formatOrderedList": "Lista numerowana", + "formatChecklist": "Lista kontrolna", + "formatLink": "Link", + "formatCode": "Kod", + "formatQuote": "Cytat", + "formatDivider": "Linia podziału", + "colorYellow": "Żółty", + "colorAmber": "Jasnożółty", + "colorGreen": "Zielony", + "colorTeal": "Turkusowy", + "colorBlue": "Niebieski", + "colorPurple": "Fioletowy", + "colorOrange": "Pomarańczowy", + "colorWhite": "Biały" + }, + "contacts": { + "title": "Kontakty", + "newContact": "Nowy kontakt", + "editContact": "Edytuj kontakt", + "addButton": "Nowy", + "newContactLabel": "Nowy kontakt", + "searchPlaceholder": "Szukaj po nazwie, telefonie lub e-mailu…", + "importButton": "Importuj", + "importLabel": "Importuj kontakt z vCard", + "importTooltip": "Importuj vCard", + "emptyTitle": "Brak kontaktów", + "emptyDescription": "Dodaj nowe kontakty przyciskiem +.", + "emptyAction": "Dodaj kontakt", + "filterAll": "Wszystkie", + "nameLabel": "Imię i nazwisko *", + "namePlaceholder": "Pełne imię i nazwisko", + "categoryLabel": "Kategoria", + "phoneLabel": "Telefon", + "phonePlaceholder": "+48 …", + "emailLabel": "E-mail", + "emailPlaceholder": "imie@przyklad.pl", + "addressLabel": "Adres", + "addressPlaceholder": "Ulica, kod pocztowy, miasto", + "notesLabel": "Notatki", + "notesPlaceholder": "Opcjonalnie…", + "callLabel": "Zadzwoń", + "emailActionLabel": "E-mail", + "mapsLabel": "Otwórz w mapach", + "exportLabel": "Eksportuj jako vCard", + "exportTooltip": "Eksportuj vCard", + "deleteLabel": "Usuń kontakt", + "deleteConfirm": "Naprawdę usunąć kontakt?", + "deletePersonConfirm": "Naprawdę usunąć \"{{name}}\"?", + "savedToast": "Kontakt zapisany", + "updatedToast": "Kontakt zaktualizowany", + "deletedToast": "Kontakt usunięty", + "importedToast": "Zaimportowano {{name}}.", + "importError": "Import nie powiódł się: {{error}}", + "vcardNoName": "vCard nie zawiera nazwy.", + "catDoctor": "Lekarz", + "catSchool": "Szkoła/Przedszkole", + "catAuthority": "Urząd", + "catInsurance": "Ubezpieczenie", + "catCraftsman": "Rzemieślnik", + "catEmergency": "Nagły wypadek", + "catMisc": "Inne", + "categoryDoctor": "Lekarz", + "categorySchool": "Szkoła/Przedszkole", + "categoryAuthority": "Urząd", + "categoryInsurance": "Ubezpieczenie", + "categoryCraftsman": "Rzemieślnik", + "categoryEmergency": "Nagły wypadek", + "categoryOther": "Inne" + }, + "budget": { + "title": "Budżet", + "newEntry": "Nowy wpis", + "editEntry": "Edytuj wpis", + "addEntryLabel": "Dodaj wpis", + "newEntryFabLabel": "Nowy wpis", + "currentMonth": "Bieżący", + "prevMonth": "Poprzedni miesiąc", + "nextMonth": "Następny miesiąc", + "income": "Przychody", + "expenses": "Wydatki", + "balance": "Saldo", + "byCategory": "Według kategorii", + "transactions": "Transakcje", + "emptyTitle": "Brak wpisów w tym miesiącu", + "emptyDescription": "Dodaj wpisy budżetowe przyciskiem +.", + "emptyAction": "Utwórz wpis", + "csvExport": "CSV", + "typeExpense": "Wydatek", + "typeIncome": "Przychód", + "titleLabel": "Tytuł *", + "titlePlaceholder": "np. Zakupy spożywcze", + "amountLabel": "Kwota *", + "amountPlaceholder": "0,00", + "categoryLabel": "Kategoria", + "dateLabel": "Data *", + "recurringLabel": "Cykliczne", + "deleteLabel": "Usuń wpis", + "deleteConfirm": "Naprawdę usunąć wpis?", + "deletePersonConfirm": "Naprawdę usunąć \"{{title}}\"?", + "addedToast": "Wpis dodany", + "savedToast": "Wpis zapisany", + "deletedToast": "Wpis usunięty", + "loadError": "Nie udało się załadować budżetu.", + "trendNeutral": "– jak {{month}}", + "validAmountRequired": "Podaj prawidłową kwotę", + "dateRequired": "Data jest wymagana", + "catFood": "Żywność", + "catRent": "Czynsz", + "catInsurance": "Ubezpieczenie", + "catMobility": "Transport", + "catLeisure": "Wypoczynek i rozrywka", + "catClothing": "Odzież", + "catHealth": "Zdrowie", + "catEducation": "Edukacja", + "catMisc": "Inne", + "catEarnedIncome": "Wynagrodzenie", + "catInvestmentIncome": "Dochody z inwestycji", + "catTransferGiftIncome": "Prezenty i przelewy", + "catGovernmentBenefits": "Świadczenia socjalne", + "catOtherIncome": "Inne dochody", + "loadingIndicator": "Ładowanie…", + "subcategoryLabel": "Podkategoria", + "catHousing": "Mieszkanie / Dom", + "catTransport": "Transport", + "catPersonalHealth": "Higiena osobista / Zdrowie", + "catShoppingClothing": "Zakupy i odzież", + "catFinancialOther": "Usługi finansowe i inne", + "subcatRentMortgage": "Czynsz / Kredyt hipoteczny", + "subcatCondominium": "Wspólnota mieszkaniowa", + "subcatUtilities": "Prąd / Woda / Gaz", + "subcatInternetTvPhone": "Internet / TV / Telefon", + "subcatRenovationMaintenance": "Remont / Konserwacja", + "subcatCleaning": "Sprzątanie", + "subcatGroceries": "Supermarket", + "subcatRestaurantsBars": "Restauracje / Bary", + "subcatSnacksFastFood": "Przekąski / Fast food", + "subcatBakery": "Piekarnia", + "subcatFuel": "Paliwo", + "subcatParkingTolls": "Parking / Opłaty drogowe", + "subcatPublicTransport": "Komunikacja miejska", + "subcatAppsTaxi": "Aplikacje / Taxi", + "subcatMaintenanceInsurance": "Konserwacja / Ubezpieczenie", + "subcatPharmacy": "Apteka", + "subcatHealthInsurance": "Ubezpieczenie zdrowotne", + "subcatGymSports": "Siłownia / Sport", + "subcatBeautyCosmetics": "Uroda / Kosmetyki", + "subcatTravel": "Podróże", + "subcatStreaming": "Streaming", + "subcatEvents": "Wydarzenia", + "subcatHobbies": "Hobby", + "subcatClothesShoes": "Ubrania / Buty", + "subcatElectronics": "Elektronika", + "subcatGifts": "Prezenty", + "subcatCoursesCollege": "Kursy / Studia", + "subcatSchoolSupplies": "Przybory szkolne", + "subcatLanguages": "Języki", + "subcatLoansInterest": "Kredyty / Odsetki", + "subcatBankFees": "Opłaty bankowe", + "subcatInsuranceOther": "Ubezpieczenia", + "subcatInvestments": "Inwestycje", + "subcatTaxes": "Podatki", + "metaLoadError": "Nie udało się załadować kategorii budżetu.", + "addCategory": "+ Kategoria", + "addSubcategory": "+ Podkategoria", + "newCategoryPrompt": "Nazwa nowej kategorii:", + "newSubcategoryPrompt": "Nazwa nowej podkategorii:", + "categoryAddedToast": "Kategoria dodana.", + "subcategoryAddedToast": "Podkategoria dodana.", + "loansTitle": "Pożyczki", + "loansSummary": "{{count}} aktywnych · {{amount}} pozostało", + "newLoan": "Nowa pożyczka", + "createLoan": "Utwórz pożyczkę", + "editLoan": "Edytuj pożyczkę", + "deleteLoan": "Usuń pożyczkę", + "deleteLoanConfirm": "Usunąć pożyczkę \"{{title}}\"? Płatności już zaksięgowane w budżecie zostaną również usunięte.", + "deleteLoanPaymentConfirm": "Usunąć tę ratę pożyczki?", + "loanRemainingAmount": "Pozostało", + "loanRemainingInstallments": "Raty pozostałe", + "loanPaidAmount": "Zapłacono", + "loansEmpty": "Brak aktywnych pożyczek.", + "loanInstallmentMeta": "{{paid}} z {{total}} rat zapłaconych", + "loanRemainingOf": "z {{total}}", + "loanNextDue": "Następna: {{month}}", + "loanPaidStatus": "Zapłacona", + "markLoanPaid": "Oznacz jako zapłaconą", + "loanBorrowerLabel": "Osoba *", + "loanBorrowerPlaceholder": "np. Anna", + "loanTitleLabel": "Tytuł pożyczki", + "loanTitlePlaceholder": "np. Pożyczka osobista", + "loanAmountLabel": "Kwota całkowita *", + "loanInstallmentsLabel": "Raty *", + "loanStartMonthLabel": "Pierwszy miesiąc płatności *", + "loanNotesLabel": "Notatki", + "loanBorrowerRequired": "Osoba jest wymagana", + "loanInstallmentsRequired": "Podaj liczbę rat", + "loanStartMonthRequired": "Podaj pierwszy miesiąc płatności", + "loanAddedToast": "Pożyczka dodana", + "loanSavedToast": "Pożyczka zapisana", + "loanDeletedToast": "Pożyczka usunięta", + "loanPaymentAddedToast": "Płatność zarejestrowana", + "loanPaymentTitle": "Spłata pożyczki: {{borrower}}", + "typeLoan": "Pożyczka", + "tabsLabel": "Sekcje budżetu", + "budgetTab": "Budżet", + "loansTab": "Pożyczki", + "filteredTransactions": "Przefiltrowane transakcje", + "clearLoanFilter": "Wyczyść filtr", + "loanFilterActive": "Pożyczka: {{title}}", + "filterLoanTransactions": "Pokaż transakcje tej pożyczki", + "loansEmptyDescription": "Utwórz pożyczkę przyciskiem + i wybierz Pożyczki.", + "newCategoryTitle": "Nowa kategoria", + "newCategoryPlaceholder": "Nazwa kategorii", + "newSubcategoryTitle": "Nowa podkategoria", + "newSubcategoryPlaceholder": "Nazwa podkategorii", + "loanStatusFilterLabel": "Filtruj status pożyczki", + "loanStatusActive": "Aktywne", + "loanStatusPaid": "Zapłacone", + "loanStatusAll": "Wszystkie", + "loanTransactions": "Transakcje pożyczki", + "loanInstallmentNumber": "Rata {{number}} z {{total}}", + "loanReportTitle": "Raport pożyczki", + "loanNoTransactions": "Brak zarejestrowanych płatności." + }, + "settings": { + "title": "Ustawienia", + "navigationLabel": "Nawigacja ustawień", + "breadcrumbLabel": "Ścieżka", + "sectionPersonal": "Osobiste", + "sectionModulesNav": "Moduły", + "sectionSync": "Synchronizacja", + "sectionAdmin": "Administracja", + "tabGeneral": "Ogólne", + "tabMeals": "Posiłki", + "tabBudget": "Budżet", + "tabShopping": "Zakupy", + "tabCalendar": "Kalendarz", + "tabSync": "Synchronizacja", + "tabSyncCalendar": "Kalendarz", + "tabSyncContacts": "Kontakty", + "sectionContactSync": "Synchronizacja kontaktów", + "sectionOpenStandards": "CalDAV i CardDAV", + "sectionCloudServices": "Usługi chmurowe", + "cardavTitle": "Kontakty CardDAV", + "tabFamily": "Rodzina", + "tabApiTokens": "Tokeny API", + "tabAccount": "Konto", + "tabBackup": "Zarządzanie kopiami", + "tabsAriaLabel": "Sekcje ustawień", + "sectionDesign": "Wygląd", + "sectionAppName": "Nazwa aplikacji", + "sectionModules": "Moduły", + "modulesTitle": "Aktywne moduły", + "modulesHint": "Wyłączone moduły znikają z nawigacji. Dane są zachowane i dostępne po ponownym włączeniu.", + "modulesSaved": "Widoczność modułów zapisana.", + "sectionShopping": "Zakupy", + "shoppingCategoriesLabel": "Kategorie zakupów", + "shoppingCategoriesHint": "Dodaj, zmień nazwę, usuń lub posortuj kategorie.", + "shoppingCategoryPlaceholder": "Nowa kategoria…", + "shoppingCategoryRenameHint": "Kliknij, aby zmienić nazwę", + "shoppingCategoryRenamePrompt": "Nowa nazwa kategorii:", + "shoppingCategoryMoveUp": "Kategoria w górę", + "shoppingCategoryMoveDown": "Kategoria w dół", + "shoppingCategoryDelete": "Usuń kategorię", + "shoppingCategoryDeleteConfirm": "Usunąć kategorię \"{{name}}\"? Istniejące artykuły zostaną przypisane do następnej kategorii.", + "shoppingCategoryAdded": "Kategoria dodana.", + "shoppingCategoryRenamed": "Kategoria zmieniona.", + "shoppingCategoryDeleted": "Kategoria usunięta.", + "sectionAccount": "Moje konto", + "sectionCalendarSync": "Synchronizacja kalendarza", + "sectionFamily": "Członkowie rodziny", + "cardAppearance": "Wygląd", + "appNameTitle": "Nazwa aplikacji", + "appNameLabel": "Nazwa aplikacji", + "appNameHint": "Ta nazwa pojawia się na pasku bocznym, w tytule przeglądarki i na ekranie logowania.", + "appNamePlaceholder": "Oikos", + "appNameSavedToast": "Nazwa aplikacji zapisana.", + "sectionDate": "Data", + "dateFormatTitle": "Format daty", + "dateFormatLabel": "Preferowany format daty", + "dateFormatHint": "Wybierz sposób wyświetlania dat w aplikacji.", + "dateFormatSavedToast": "Format daty zapisany.", + "timeFormatLabel": "Format czasu", + "timeFormatHours": "Godziny", + "timeFormatSavedToast": "Format czasu zapisany.", + "themeSystem": "System", + "themeSysLabel": "Użyj ustawień systemowych", + "themeLight": "Jasny", + "themeLightLabel": "Jasny motyw", + "themeDark": "Ciemny", + "themeDarkLabel": "Ciemny motyw", + "changePassword": "Zmień hasło", + "currentPasswordLabel": "Aktualne hasło", + "newPasswordLabel": "Nowe hasło", + "confirmPasswordLabel": "Potwierdź nowe hasło", + "savePassword": "Zapisz hasło", + "passwordMismatch": "Hasła nie są zgodne.", + "passwordSavedToast": "Hasło zostało pomyślnie zmienione.", + "googleCalendar": "Google Calendar", + "appleCalendar": "Apple Calendar (iCloud)", + "syncNow": "Synchronizuj teraz", + "disconnect": "Rozłącz", + "connectGoogle": "Połącz z Google", + "connected": "Połączono", + "connectedLastSync": "Połączono · Ostatnio: {{date}}", + "notConnected": "Niepołączono", + "notConfigured": "Nieskonfigurowane (brak zmiennych .env)", + "configured": "Skonfigurowane (przez .env)", + "configuredLastSync": "Skonfigurowane (przez .env) · Ostatnio: {{date}}", + "syncSuccess": "{{provider}} zsynchronizowany.", + "disconnectedToast": "{{provider}} rozłączony.", + "googleOnlyAdmin": "Tylko administrator może połączyć Google Calendar.", + "appleOnlyAdmin": "Tylko administrator może połączyć Apple Calendar.", + "caldavUrlLabel": "URL serwera CalDAV", + "caldavUrlPlaceholder": "https://caldav.icloud.com", + "appleIdLabel": "Apple ID (e-mail)", + "applePasswordLabel": "Hasło aplikacji", + "applePasswordHint": "Utwórz hasło na appleid.apple.com → Bezpieczeństwo.", + "appleConnectBtn": "Połącz i przetestuj", + "appleConnecting": "Łączenie…", + "appleConnectedToast": "Apple Calendar połączony.", + "syncSuccessGoogle": "Synchronizacja kalendarza z Google pomyślnie połączona.", + "syncSuccessApple": "Synchronizacja kalendarza z Apple pomyślnie połączona.", + "syncErrorGoogle": "Połączenie z Google nie powiodło się. Spróbuj ponownie.", + "syncErrorApple": "Połączenie z Apple nie powiodło się. Spróbuj ponownie.", + "addMember": "+ Dodaj członka", + "newMemberTitle": "Nowy członek rodziny", + "usernameLabel": "Nazwa użytkownika", + "displayNameLabel": "Wyświetlana nazwa", + "memberPasswordLabel": "Hasło", + "colorLabel": "Kolor", + "profilePictureTitle": "Zdjęcie profilowe", + "profilePictureLabel": "Prześlij zdjęcie", + "profilePictureHint": "PNG, JPEG lub WebP. Duże zdjęcia zostaną zmniejszone przed przesłaniem.", + "profilePictureRemove": "Usuń zdjęcie", + "profilePictureTypeError": "Proszę użyć pliku PNG, JPEG lub WebP.", + "profilePictureFileTooLarge": "Plik zdjęcia jest za duży.", + "profilePictureTooLarge": "Zdjęcie profilowe jest nadal za duże po zmniejszeniu.", + "profilePictureReadError": "Nie udało się odczytać wybranego zdjęcia.", + "profileSavedToast": "Profil zaktualizowany.", + "editMemberLabel": "Edytuj", + "editMemberTitle": "Edytuj członka rodziny", + "saveMember": "Zapisz członka", + "memberUpdatedToast": "{{name}} zaktualizowany.", + "familyRoleLabel": "Rola w rodzinie", + "familyRoleDad": "Ojciec", + "familyRoleMom": "Matka", + "familyRoleParent": "Rodzic", + "familyRoleChild": "Dziecko", + "familyRoleGrandparent": "Dziadkowie", + "familyRoleRelative": "Krewny/Krewna", + "familyRoleOther": "Członek rodziny", + "systemAdminLabel": "Administrator systemu", + "systemAdminHint": "Administratorzy systemu mogą zarządzać ustawieniami aplikacji, integracjami, tokenami API i kontami rodzinnymi.", + "systemAdminBadge": "Administrator systemu", + "roleLabel": "Rola", + "roleMember": "Członek", + "roleAdmin": "Admin", + "createMember": "Utwórz", + "cancelAddMember": "Anuluj", + "memberAddedToast": "{{name}} dodany.", + "deleteMemberConfirm": "Naprawdę usunąć {{name}}?", + "memberDeletedToast": "{{name}} usunięty.", + "deleteMemberLabel": "Usuń", + "logout": "Wyloguj", + "synchronizing": "Synchronizowanie…", + "googleDisconnectConfirm": "Rozłączyć połączenie z Google Calendar?", + "appleDisconnectConfirm": "Rozłączyć połączenie z Apple Calendar?", + "localeSystem": "System", + "localeLabel": "Język", + "languageTitle": "Język", + "sectionMeals": "Plan posiłków", + "mealTypesLabel": "Widoczne posiłki", + "mealTypesHint": "W planie posiłków wyświetlane są tylko wybrane typy posiłków.", + "mealTypesSaved": "Ustawienia posiłków zapisane.", + "mealTypesMinOne": "Co najmniej jeden typ posiłku musi być aktywny.", + "sectionBudget": "Budżet", + "currencyLabel": "Waluta", + "currencyHint": "Określa walutę dla całego obszaru budżetu.", + "currencySaved": "Waluta zapisana.", + "apiTokensTitle": "Tokeny API", + "apiTokensCardTitle": "Tokeny dostępu", + "apiTokensHint": "Twórz tokeny API dla zewnętrznych integracji. Pełny token jest wyświetlany tylko raz po utworzeniu.", + "apiTokenNameLabel": "Nazwa tokenu", + "apiTokenExpiresLabel": "Data wygaśnięcia", + "apiTokenExpiresHint": "Pozostaw puste, aby utworzyć token bez daty wygaśnięcia.", + "apiTokenCreatedLabel": "Nowy token API", + "apiTokenCreatedHint": "Zachowaj ten token w bezpiecznym miejscu. Nie można go ponownie wyświetlić.", + "apiTokenCreate": "Utwórz token", + "apiTokenInvalidExpiration": "Podaj prawidłową datę wygaśnięcia.", + "apiTokenCreatedToast": "Token API utworzony.", + "apiTokenRevokedToast": "Token API unieważniony.", + "apiTokenRevokeConfirm": "Unieważnić token API \"{{name}}\"?", + "apiTokenRevoke": "Unieważnij token", + "apiTokenRevoked": "Unieważniony", + "apiTokenExpired": "Wygasły", + "apiTokenActive": "Aktywny", + "apiTokenPrefix": "Prefiks", + "apiTokenExpires": "Wygasa", + "apiTokenNeverExpires": "Bez daty wygaśnięcia", + "apiTokenLastUsed": "Ostatnio użyty", + "apiTokenNeverUsed": "Nigdy nie użyty", + "ics": { + "title": "Subskrypcje ICS", + "add": "Dodaj subskrypcję", + "form": { + "url": "URL ICS", + "name": "Nazwa", + "color": "Kolor", + "shared": "Widoczne dla wszystkich" + }, + "actions": { + "sync": "Synchronizuj teraz", + "edit": "Edytuj", + "delete": "Usuń", + "save": "Zapisz", + "cancel": "Anuluj", + "submit": "Dodaj" + }, + "status": { + "lastSync": "Ostatnia synchronizacja:", + "never": "Jeszcze nie synchronizowano", + "syncing": "Synchronizowanie...", + "syncError": "Błąd synchronizacji" + }, + "confirm_delete": "Naprawdę usunąć tę subskrypcję? Wszystkie powiązane wydarzenia zostaną również usunięte.", + "badges": { + "private": "Prywatna", + "shared": "Udostępniona" + }, + "empty": "Brak subskrypcji.", + "addedToast": "Subskrypcja dodana.", + "syncedToast": "Subskrypcja zsynchronizowana.", + "deletedToast": "Subskrypcja usunięta.", + "updatedToast": "Subskrypcja zaktualizowana." + }, + "memberPhoneLabel": "Numer telefonu (opcjonalnie)", + "memberEmailLabel": "E-mail (opcjonalnie)", + "memberBirthDateLabel": "Data urodzin (opcjonalnie)", + "memberContactBirthdayHint": "Ten członek będzie automatycznie synchronizowany z kontaktami i urodzinami.", + "memberBirthDateInvalid": "Proszę użyć prawidłowej daty urodzin w wybranym formacie.", + "memberPhoneMeta": "Telefon: {{value}}", + "memberBirthdayMeta": "Urodziny: {{date}}", + "sectionBackup": "Zarządzanie kopiami", + "backupDownloadTitle": "Pobierz kopię bazy danych", + "backupDownloadHint": "Tworzy spójną kopię SQLite wszystkich danych aplikacji.", + "backupDownloadButton": "Pobierz kopię", + "backupRestoreTitle": "Przywróć kopię bazy danych", + "backupRestoreHint": "Przywracanie zastępuje bieżącą bazę danych. Pobierz najpierw świeżą kopię.", + "backupDropzoneTitle": "Upuść plik kopii tutaj lub kliknij, aby wybrać", + "backupDropzoneHint": "Pliki kopii SQLite: .db, .sqlite lub .sqlite3", + "backupRestoreButton": "Przywróć kopię", + "backupRestoreConfirm": "Ta kopia zastąpi bieżącą bazę danych dla wszystkich użytkowników. Kontynuować?", + "backupRestoring": "Przywracanie...", + "backupRestoredToast": "Baza danych przywrócona. Ponowne ładowanie strony...", + "backupCliTitle": "Przywracanie przez CLI / Docker Compose", + "backupCliHint": "W celu operacyjnego przywracania zatrzymaj aplikację, zamontuj kopię w tymczasowym kontenerze i zastąp plik bazy danych.", + "backupCliBackupHint": "Możesz również bezpośrednio utworzyć kopię przez Docker Compose:", + "backupSchedulerTitle": "Automatyczne kopie", + "backupSchedulerHint": "Zaplanowane kopie są tworzone automatycznie, a stare kopie są rotowane.", + "backupSchedulerStatus": "Status", + "backupSchedulerEnabled": "Aktywny", + "backupSchedulerDisabled": "Wyłączony", + "backupSchedulerSchedule": "Harmonogram", + "backupSchedulerKeep": "Przechowywanie", + "backupSchedulerKeepCount": "{{count}} kopii", + "backupSchedulerLastBackup": "Ostatnia kopia", + "backupSchedulerLastSuccess": "{{date}} (pomyślnie)", + "backupSchedulerLastFail": "{{date}} (nie powiodło się)", + "backupSchedulerNever": "Jeszcze nie utworzono kopii", + "backupSchedulerTrigger": "Utwórz kopię teraz", + "backupSchedulerTriggering": "Tworzenie kopii...", + "backupSchedulerTriggeredToast": "Kopia pomyślnie utworzona.", + "caldavTitle": "Kalendarze CalDAV", + "caldavDescription": "Połącz wiele kont CalDAV (iCloud, Nextcloud, Radicale, Baikal itp.) i wybierz, które kalendarze mają być synchronizowane.", + "caldavAddAccount": "Dodaj konto CalDAV", + "caldavEmptyState": "Brak połączonych kont CalDAV. Dodaj pierwsze konto, aby rozpocząć.", + "caldavNameLabel": "Nazwa konta", + "caldavNamePlaceholder": "np. Mój Radicale, iCloud, Nextcloud", + "caldavUrlHint": "Bazowy URL serwera CalDAV", + "caldavUsernameLabel": "Nazwa użytkownika", + "caldavPasswordLabel": "Hasło", + "caldavPasswordHint": "Dla iCloud: użyj hasła aplikacji z appleid.apple.com", + "caldavAccountAdded": "Konto CalDAV pomyślnie dodane", + "caldavAccountDeleted": "Konto CalDAV usunięte", + "caldavCalendarsToggle": "Pokaż/ukryj kalendarze", + "caldavRefreshCalendars": "Odśwież kalendarze", + "caldavSyncSuccess": "Synchronizacja CalDAV pomyślna", + "caldavSyncFailed": "Synchronizacja CalDAV nie powiodła się", + "caldavConnectionFailed": "Połączenie z serwerem CalDAV nie powiodło się", + "calendarEnabled": "Kalendarz włączony", + "calendarDisabled": "Kalendarz wyłączony", + "calendarsRefreshed": "Kalendarze odświeżone", + "deleteAccountConfirm": "Naprawdę usunąć konto CalDAV? Wszystkie zsynchronizowane kalendarze zostaną usunięte.", + "lastSync": "Ostatnia synchronizacja", + "cardavDescription": "Połącz wiele kont CardDAV (iCloud, Nextcloud, Radicale itp.) i synchronizuj swoje kontakty.", + "cardavAddAccount": "Dodaj konto CardDAV", + "cardavEmptyState": "Brak połączonych kont CardDAV. Dodaj pierwsze konto, aby synchronizować kontakty.", + "cardavNameLabel": "Nazwa konta", + "cardavNamePlaceholder": "np. iCloud, Nextcloud", + "cardavUrlLabel": "URL serwera CardDAV", + "cardavUrlPlaceholder": "https://contacts.icloud.com", + "cardavUrlHint": "Bazowy URL serwera CardDAV", + "cardavUsernameLabel": "Nazwa użytkownika", + "cardavPasswordLabel": "Hasło", + "cardavPasswordHint": "Dla iCloud: użyj hasła aplikacji z appleid.apple.com", + "cardavAccountAdded": "Konto CardDAV pomyślnie dodane", + "cardavAccountDeleted": "Konto CardDAV usunięte", + "cardavSyncSuccess": "Synchronizacja CardDAV pomyślna", + "cardavSyncFailed": "Synchronizacja CardDAV nie powiodła się", + "cardavConnectionFailed": "Połączenie z serwerem CardDAV nie powiodło się", + "cardavAddressbooksToggle": "Pokaż/ukryj książki adresowe", + "cardavRefreshAddressbooks": "Odśwież książki adresowe", + "addressbookEnabled": "Książka adresowa włączona", + "addressbookDisabled": "Książka adresowa wyłączona", + "addressbooksRefreshed": "Książki adresowe odświeżone", + "deleteCardDAVAccountConfirm": "Naprawdę usunąć konto CardDAV? Wszystkie zsynchronizowane kontakty zostaną zachowane, ale utracą powiązanie z CardDAV.", + "statusSynced": "Zsynchronizowano", + "statusError": "Błąd", + "statusSyncing": "Synchronizowanie…", + "statusNeverSynced": "Nigdy nie synchronizowano", + "syncedAgo": "{{time}} temu", + "helpTooltipCalDAV": "CalDAV umożliwia synchronizację kalendarzy z iCloud, Nextcloud i innymi serwerami CalDAV.", + "helpTooltipCardDAV": "CardDAV umożliwia synchronizację kontaktów z iCloud, Nextcloud i innymi serwerami CardDAV.", + "emptyStateAddFirst": "Dodaj pierwsze konto", + "emptyStateNoAccounts": "Brak połączonych kont", + "sectionHousekeeping": "Pomoc domowa", + "housekeepingPaymentsTitle": "Zadania płatności", + "housekeepingPaymentTasksLabel": "Przy każdym zameldowaniu utwórz zadanie płatności", + "housekeepingPaymentTasksHint": "Po włączeniu, przy każdym zameldowaniu zostanie utworzone zadanie płatności za pomoc domową. Ukończenie tego zadania oznacza wizytę jako opłaconą.", + "housekeepingPaymentTasksSaved": "Ustawienia płatności za pomoc domową zapisane." + }, + "login": { + "tagline": "Planowanie rodziny. Bezpieczne. Chroniące prywatność. Open Source.", + "usernameLabel": "Nazwa użytkownika", + "usernamePlaceholder": "nazwa użytkownika", + "passwordLabel": "Hasło", + "passwordPlaceholder": "••••••••", + "loginButton": "Zaloguj", + "loggingIn": "Logowanie…", + "tooManyAttempts": "Za dużo prób. Poczekaj chwilę.", + "invalidCredentials": "Nieprawidłowe dane logowania.", + "version": "v{{version}}" + }, + "install": { + "title": "Zainstaluj Oikos", + "subtitle": "Dodaj do aplikacji", + "iosTip1": "Stuknij ", + "iosTip2": " → „Dodaj do ekranu głównego"", + "installButton": "Zainstaluj", + "dismissLabel": "Zamknij" + }, + "modal": { + "closeLabel": "Zamknij", + "overlayLabel": "Tło dialogu modalnego", + "unsavedChanges": "Odrzucić zmiany?", + "discardChanges": "Odrzuć" + }, + "rrule": { + "freqNone": "Bez powtarzania", + "freqDaily": "Codziennie", + "freqWeekly": "Co tydzień", + "freqMonthly": "Co miesiąc", + "dayMo": "Pon", + "dayTu": "Wt", + "dayWe": "Śr", + "dayTh": "Czw", + "dayFr": "Pt", + "daySa": "Sob", + "daySu": "Niedz", + "labelRepeat": "Powtarzanie", + "labelEvery": "Co", + "labelOnDays": "W te dni", + "labelUntil": "Kończy się (opcjonalnie)", + "unitDay": "dzień", + "unitDays": "dni", + "unitWeek": "tydzień", + "unitWeeks": "tygodnie", + "unitMonth": "miesiąc", + "unitMonths": "miesiące" + }, + "reminders": { + "sectionTitle": "Przypomnienie", + "enableLabel": "Ustaw przypomnienie", + "dateLabel": "Data", + "timeLabel": "Godzina", + "offsetLabel": "Przypomnij", + "offsetNone": "Brak", + "offset15min": "15 minut wcześniej", + "offset1hour": "1 godzinę wcześniej", + "offset1day": "1 dzień wcześniej", + "offsetAtTime": "O czasie rozpoczęcia", + "toastTitle": "Przypomnienie", + "dismiss": "Odrzuć", + "notificationPermission": "Powiadomienia przeglądarki", + "notificationEnable": "Włącz powiadomienia", + "notificationEnabled": "Powiadomienia aktywne", + "notificationDenied": "Powiadomienia zablokowane", + "notificationHint": "Otrzymuj powiadomienia, gdy aplikacja jest otwarta.", + "pendingBadgeTitle": "{{count}} oczekujące przypomnienie", + "pendingBadgeTitlePlural": "{{count}} oczekujące przypomnienia", + "offset2days": "2 dni wcześniej", + "offset1week": "1 tydzień wcześniej", + "offset2weeks": "2 tygodnie wcześniej", + "offsetCustom": "Niestandardowe...", + "customAmountLabel": "Liczba", + "customUnitLabel": "Jednostka", + "customMinutes": "Minuty", + "customHours": "Godziny", + "customDays": "Dni", + "customWeeks": "Tygodnie" + }, + "birthdays": { + "title": "Urodziny", + "addButton": "Dodaj urodziny", + "searchPlaceholder": "Szukaj urodzin…", + "upcomingTitle": "Nadchodzące urodziny", + "upcomingHint": "Najbliższe obchody, już połączone z kalendarzem i przypomnieniami.", + "peopleTitle": "Osoby", + "peopleHint": "Przeglądaj, sprawdzaj i edytuj wszystkie zapisane urodziny.", + "emptyTitle": "Brak urodzin", + "emptyDescription": "Dodaj urodziny, aby pojawiły się w kalendarzu i przypomnieniach.", + "newTitle": "Nowe urodziny", + "editTitle": "Edytuj urodziny", + "nameLabel": "Imię", + "birthDateLabel": "Data urodzin", + "photoLabel": "Zdjęcie profilowe", + "photoOptional": "Opcjonalnie: możesz zapisać bez zdjęcia profilowego.", + "removePhoto": "Usuń zdjęcie", + "notesLabel": "Notatki", + "notesPlaceholder": "Pomysły na prezenty, ulubione ciasto, notatki rodzinne…", + "calendarHint": "Każde urodziny są automatycznie dodawane do kalendarza i systemu przypomnień.", + "requiredFields": "Imię i data urodzin są wymagane.", + "createdToast": "Urodziny zapisane.", + "updatedToast": "Urodziny zaktualizowane.", + "deletedToast": "Urodziny usunięte.", + "deleteConfirm": "Usunąć urodziny \"{{name}}\"?", + "ageNoteToday": "Kończy dzisiaj {{age}} lat.", + "ageNoteTomorrow": "Kończy jutro {{age}} lat.", + "ageNoteDays": "Kończy {{age}} lat za {{days}} dni." + }, + "recipes": { + "title": "Przepisy", + "addRecipe": "Dodaj przepis", + "editRecipe": "Edytuj przepis", + "emptyTitle": "Brak przepisów", + "emptyDescription": "Zapisz swoje ulubione przepisy i użyj ich do planowania posiłków.", + "emptyAction": "Utwórz przepis", + "titleLabel": "Tytuł *", + "titlePlaceholder": "np. Pasta Carbonara", + "notesLabel": "Notatki", + "notesPlaceholder": "Opcjonalnie…", + "urlLabel": "Link do przepisu", + "urlPlaceholder": "https://…", + "ingredientsLabel": "Składniki", + "addToMeals": "Dodaj do planu posiłków", + "openLink": "Otwórz link do przepisu", + "deleteConfirm": "Usunąć przepis \"{{title}}\"?", + "created": "Przepis zapisany.", + "updated": "Przepis zaktualizowany.", + "deleted": "Przepis usunięty.", + "titleRequired": "Tytuł jest wymagany.", + "duplicate": "Duplikuj", + "duplicated": "Przepis zduplikowany.", + "copySuffix": "Kopia" + }, + "onboarding": { + "step1Title": "Witaj w {{name}}", + "step1Body": "Twój osobisty planer rodzinny. Zadania, kalendarz, zakupy i więcej – wszystko w jednym miejscu.", + "step2Title": "Nawigacja i moduły", + "step2Body": "Na dole masz bezpośredni dostęp do pulpitu i kalendarza. Przycisk ··· otwiera inne moduły, takie jak kuchnia, notatki i kontakty.", + "step3Title": "Szybki start", + "step3Body": "Przyciskiem FAB + możesz wszędzie tworzyć nowe wpisy. Przesuń elementy listy w lewo lub prawo, aby uzyskać szybkie akcje.", + "next": "Dalej", + "done": "Zaczynamy", + "skip": "Pomiń" + }, + "offline": { + "banner": "Offline – przywracanie połączenia…" + }, + "emptyHint": { + "tasks": "Stuknij +, aby utworzyć pierwsze zadanie. Przesuń kartę w lewo, aby usunąć.", + "calendar": "Połącz Google Kalendarz w Ustawienia → Integracje, aby automatycznie synchronizować.", + "shopping": "Dodaj artykuły i przesuń, aby odznaczać lub usuwać.", + "notes": "Stuknij + dla nowej notatki. Notatki są przeszukiwane pełnotekstowo.", + "contacts": "Dodaj ważne kontakty – lekarza, szkołę, nagły wypadek – dla szybkiego dostępu.", + "budget": "Utwórz kategorie i wpisuj przychody i wydatki.", + "meals": "Planuj posiłki na tydzień i łącz przepisy.", + "birthdays": "Wpisz urodziny – otrzymasz przypomnienie na czas.", + "recipes": "Twórz przepisy i łącz je z planowaniem posiłków." + }, + "shortcuts": { + "search": "Otwórz wyszukiwanie", + "new": "Utwórz nowy wpis", + "help": "Skróty klawiszowe", + "goDash": "Pulpit", + "goTasks": "Zadania", + "goCal": "Kalendarz", + "goShop": "Lista zakupów", + "goNotes": "Notatki", + "goKitchen": "Kuchnia" + }, + "documents": { + "title": "Dokumenty", + "addButton": "Dodaj dokument", + "searchPlaceholder": "Szukaj dokumentów...", + "gridView": "Widok siatki", + "listView": "Widok listy", + "viewToggle": "Widok dokumentów", + "allCategories": "Wszystkie kategorie", + "emptyTitle": "Brak dokumentów", + "emptyDescription": "Prześlij dokumenty rodzinne i kontroluj, kto może widzieć każdy plik.", + "newTitle": "Nowy dokument", + "editTitle": "Ustawienia dokumentu", + "nameLabel": "Nazwa", + "descriptionLabel": "Opis", + "categoryLabel": "Kategoria", + "fileLabel": "Plik", + "fileHint": "PDF, obrazy, tekst i pliki Office do 5 MB.", + "visibilityLabel": "Widoczność", + "statusLabel": "Status", + "allowedMembersLabel": "Dozwoleni członkowie", + "uploadAction": "Prześlij", + "downloadAction": "Pobierz", + "editAction": "Ustawienia", + "archiveAction": "Archiwizuj", + "restoreAction": "Przywróć", + "savedToast": "Dokument zapisany.", + "uploadedToast": "Dokument przesłany.", + "archivedToast": "Dokument zarchiwizowany.", + "restoredToast": "Dokument przywrócony.", + "deletedToast": "Dokument usunięty.", + "deleteConfirm": "Usunąć dokument \"{{name}}\"?", + "fileRequired": "Proszę wybrać plik.", + "fileTooLarge": "Plik może mieć maksymalnie 5 MB.", + "fileReadError": "Nie udało się odczytać pliku.", + "statusActive": "Aktywny", + "statusArchived": "Zarchiwizowany", + "visibility": { + "family": "Cała rodzina", + "restricted": "Wybrani członkowie", + "private": "Tylko ja" + }, + "category": { + "medical": "Medyczne", + "school": "Szkoła", + "identity": "Tożsamość", + "insurance": "Ubezpieczenie", + "finance": "Finanse", + "home": "Dom", + "vehicle": "Pojazd", + "legal": "Prawne", + "travel": "Podróże", + "pets": "Zwierzęta", + "warranty": "Gwarancja", + "taxes": "Podatki", + "work": "Praca", + "other": "Inne" + }, + "dropzoneTitle": "Upuść plik tutaj lub kliknij", + "dropzoneHint": "Przeciągnij plik do tego obszaru lub użyj wyboru pliku.", + "selectedFileLabel": "Wybrano: {{name}}", + "addFolderButton": "Dodaj folder", + "allFolders": "Wszystkie foldery", + "folderLabel": "Folder", + "noFolder": "Bez folderu", + "newFolderTitle": "Nowy folder", + "folderNameLabel": "Nazwa folderu", + "createFolderAction": "Utwórz folder", + "folderCreatedToast": "Folder utworzony.", + "housekeepingFolder": "Sprzątanie", + "calendarItemsFolder": "Wpisy kalendarza", + "folderBrowserTitle": "Przeglądaj foldery" + }, + "userMultiSelect": { + "nobody": "– Nikt –", + "moreUsers": "więcej" + }, + "housekeeping": { + "title": "Strefa sprzątania", + "bottomNav": "Nawigacja sprzątania", + "home": "Start", + "tasks": "Zadania", + "report": "Zgłoś", + "notCheckedIn": "Niezameldowany", + "checkedInAt": "Zameldowany o", + "monthTotal": "Bieżący miesiąc · {{count}} wizyt", + "dailyRate": "Stawka dzienna", + "extras": "Dodatki", + "checkIn": "Zamelduj", + "checkOut": "Wymelduj", + "quickSupply": "Brakuje produktu", + "supplyName": "Nazwa produktu", + "supplyPlaceholder": "Czego brakuje?", + "checkedInToast": "Zameldowanie zapisane.", + "checkedOutToast": "Wymeldowanie zapisane.", + "supplyAddedToast": "Dodano do listy zakupów.", + "overdue": "Przeterminowane", + "dueToday": "Na dziś", + "ok": "OK", + "noTasks": "Brak zadań sprzątania.", + "everyDays": "Co {{days}} dni", + "completeTask": "Wykonaj {{name}}", + "taskDoneToast": "Zadanie ukończone.", + "reportTitle": "Zgłoś problem", + "problemDescription": "Opis problemu", + "problemPlaceholder": "Przykład: Przepalona żarówka", + "addPhoto": "Dodaj zdjęcie", + "sendReport": "Wyślij zgłoszenie", + "reportSentToast": "Problem zgłoszony.", + "recentReports": "Ostatnie zgłoszenia", + "addTask": "Dodaj zadanie", + "taskName": "Zadanie", + "taskNamePlaceholder": "Przykład: Sprzątanie łazienki", + "taskArea": "Obszar", + "taskAreaPlaceholder": "Przykład: Łazienka", + "taskFrequency": "Częstotliwość", + "createTask": "Utwórz zadanie", + "taskCreatedToast": "Zadanie sprzątania utworzone.", + "dashboard": "Pulpit", + "reports": "Raporty", + "visitsThisMonth": "Wizyty w miesiącu", + "lastVisit": "Ostatnia wizyta", + "pendingChores": "Otwarte zadania", + "finishedChores": "Ukończone zadania", + "payments": "Płatności", + "pendingPayments": "Oczekujące płatności", + "monthlyPayments": "Miesięczne płatności", + "noPaymentData": "Brak danych płatności.", + "noVisits": "Brak wizyt", + "noWorkerTitle": "Brak profilu pomocy domowej", + "noWorkerHint": "Utwórz profil, aby ustawić kontakty, stawkę dzienną i harmonogram płatności.", + "taskTemplates": "Sugerowane zadania", + "addCustomTask": "Dodaj własne zadanie", + "noReports": "Brak zgłoszeń.", + "profileTitle": "Profil pomocy domowej", + "profilePicture": "Zdjęcie profilowe", + "workerName": "Imię", + "workerUsername": "Nazwa użytkownika", + "workerPhone": "Telefon", + "workerEmail": "E-mail", + "workerBirthDate": "Data urodzin", + "paymentSchedule": "Harmonogram płatności", + "scheduleDaily": "Za wizytę", + "scheduleTwiceMonthly": "Dwa razy w miesiącu", + "scheduleMonthly": "Miesięcznie", + "profileColor": "Kolor profilu", + "workerNotes": "Notatki", + "workerSavedToast": "Profil pomocy domowej zapisany.", + "staff": "Personel", + "staffTitle": "Personel sprzątający", + "addWorker": "Dodaj pomoc domową", + "editWorker": "Edytuj pomoc domową", + "noWorkers": "Brak zarejestrowanej osoby sprzątającej.", + "moreWorkers": "+{{count}} więcej", + "checkInDisabled": "Najpierw utwórz osobę sprzątającą.", + "calendarColor": "Kolor kalendarza", + "visitRecordedAt": "Wizyta zarejestrowana o", + "checkedInToday": "Zarejestrowano dzisiaj", + "visitReports": "Raporty wizyt personelu", + "noVisitReports": "Brak zarejestrowanych wizyt personelu w tym miesiącu.", + "openVisitReport": "Otwórz raport wizyty", + "visitReportDetails": "Raport wizyty", + "paymentPaid": "Zapłacono", + "paymentPending": "Oczekuje", + "totalPayment": "Łączna płatność", + "paymentStatus": "Status płatności", + "paymentTask": "Zadanie płatności", + "calendarEvent": "Wydarzenie kalendarza", + "notAvailable": "Niedostępne", + "calendarVisitTitle": "Sprzątanie: {{name}}", + "paymentTaskTitle": "Zapłać {{name}} za sprzątanie", + "paymentTaskDescription": "Wizyta sprzątająca {{date}}. Należna kwota: {{amount}}.", + "staffLogTitle": "Wizyty {{name}}", + "staffLogHint": "Edytuj daty wizyt, kwoty i powiązane rekordy.", + "filterMonth": "Miesiąc", + "editVisit": "Edytuj wizytę", + "deleteVisit": "Usuń wizytę", + "deleteVisitConfirm": "Usunąć tę wizytę? Powiązane wydarzenie kalendarza i zadanie płatności zostaną również usunięte.", + "visitDeletedToast": "Wizyta usunięta.", + "visitSavedToast": "Wizyta zaktualizowana.", + "visitDate": "Data wizyty", + "markPaid": "Oznacz jako zapłaconą", + "visitPaidToast": "Płatność oznaczona jako zapłacona.", + "receiptUploadTitle": "Prześlij paragon płatności", + "receiptUploadHint": "Dołącz paragon płatności. Pojawi się w dokumentach.", + "receiptDocumentName": "Paragon – {{name}} – {{date}}", + "receiptDocumentDescription": "Paragon płatności za wizytę sprzątającą {{name}} w dniu {{date}}.", + "taskTemplateData": { + "cleanBathrooms": { + "name": "Sprzątanie łazienek", + "area": "Łazienki" + }, + "mopKitchenFloor": { + "name": "Mycie podłogi kuchennej", + "area": "Kuchnia" + }, + "dustLivingRoom": { + "name": "Odkurzanie salonu", + "area": "Salon" + }, + "changeBedLinens": { + "name": "Zmiana pościeli", + "area": "Sypialnia" + }, + "cleanRefrigerator": { + "name": "Czyszczenie lodówki", + "area": "Kuchnia" + }, + "cleanWindows": { + "name": "Mycie okien", + "area": "Cały dom" + }, + "deepCleanOven": { + "name": "Gruntowne czyszczenie piekarnika", + "area": "Kuchnia" + }, + "washOutdoor": { + "name": "Mycie balkonu/tarasu", + "area": "Na zewnątrz" + } + } + } +}