feat: add Italian, Czech, Hungarian + sync all 12 languages

New languages: Italian (it), Czech (cs), Hungarian (hu)
Merged PRs #158, #130, #119 with conflict resolution.

All 12 language files synced to ~1238 keys each:
ar, br, cs, de, en, es, fr, hu, it, nl, ru, zh

Thanks @entropyst72 (Italian), @Numira-code (Czech),
@slashwarm (Hungarian) for the translations!
This commit is contained in:
Maurice
2026-03-30 21:22:53 +02:00
6 changed files with 2034 additions and 14 deletions

View File

@@ -4,6 +4,8 @@ import de from './translations/de'
import en from './translations/en'
import es from './translations/es'
import fr from './translations/fr'
import hu from './translations/hu'
import it from './translations/it'
import ru from './translations/ru'
import zh from './translations/zh'
import nl from './translations/nl'
@@ -18,16 +20,18 @@ export const SUPPORTED_LANGUAGES = [
{ value: 'en', label: 'English' },
{ value: 'es', label: 'Español' },
{ value: 'fr', label: 'Français' },
{ value: 'hu', label: 'Magyar' },
{ value: 'nl', label: 'Nederlands' },
{ value: 'br', label: 'Português (Brasil)' },
{ value: 'cs', label: 'Česky' },
{ value: 'ru', label: 'Русский' },
{ value: 'zh', label: '中文' },
{ value: 'it', label: 'Italiano' },
{ value: 'ar', label: 'العربية' },
] as const
const translations: Record<string, TranslationStrings> = { de, en, es, fr, ru, zh, nl, ar, br, cs }
const LOCALES: Record<string, string> = { de: 'de-DE', en: 'en-US', es: 'es-ES', fr: 'fr-FR', ru: 'ru-RU', zh: 'zh-CN', nl: 'nl-NL', ar: 'ar-SA', br: 'pt-BR', cs: 'cs-CZ' }
const translations: Record<string, TranslationStrings> = { de, en, es, fr, hu, it, ru, zh, nl, ar, br, cs }
const LOCALES: Record<string, string> = { de: 'de-DE', en: 'en-US', es: 'es-ES', fr: 'fr-FR', hu: 'hu-HU', it: 'it-IT', ru: 'ru-RU', zh: 'zh-CN', nl: 'nl-NL', ar: 'ar-SA', br: 'pt-BR', cs: 'cs-CZ' }
const RTL_LANGUAGES = new Set(['ar'])
export function getLocaleForLanguage(language: string): string {
@@ -36,7 +40,7 @@ export function getLocaleForLanguage(language: string): string {
export function getIntlLanguage(language: string): string {
if (language === 'br') return 'pt-BR'
return ['de', 'es', 'fr', 'ru', 'zh', 'nl', 'ar', 'cs'].includes(language) ? language : 'en'
return ['de', 'es', 'fr', 'hu', 'it', 'ru', 'zh', 'nl', 'ar', 'cs'].includes(language) ? language : 'en'
}
export function isRtlLanguage(language: string): boolean {

View File

@@ -455,6 +455,20 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'admin.weather.requestsDesc': 'Grátis, sem chave de API',
'admin.weather.locationHint': 'O clima usa o primeiro lugar com coordenadas de cada dia. Se nenhum lugar estiver atribuído ao dia, qualquer lugar da lista serve como referência.',
'admin.tabs.audit': 'Log de auditoria',
'admin.audit.subtitle': 'Eventos sensíveis de segurança e administração (backups, usuários, 2FA, configurações).',
'admin.audit.empty': 'Nenhum registro de auditoria.',
'admin.audit.refresh': 'Atualizar',
'admin.audit.loadMore': 'Carregar mais',
'admin.audit.showing': '{count} carregados · {total} no total',
'admin.audit.col.time': 'Hora',
'admin.audit.col.user': 'Usuário',
'admin.audit.col.action': 'Ação',
'admin.audit.col.resource': 'Recurso',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Detalhes',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.github.title': 'Histórico de versões',

View File

@@ -17,7 +17,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'common.ok': 'OK',
'common.yes': 'Ano',
'common.no': 'Ne',
'common.nebo': 'nebo',
'common.or': 'nebo',
'common.none': 'Žádné',
'common.date': 'Datum',
'common.rename': 'Přejmenovat',
@@ -46,7 +46,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
// Přehled (Dashboard)
'dashboard.title': 'Moje cesty',
'dashboard.subtitle.loading': 'Načítání cest...',
'dashboard.subtitle.cest': '{count} cest ({archived} archivováno)',
'dashboard.subtitle.trips': '{count} cest ({archived} archivováno)',
'dashboard.subtitle.empty': 'Začněte svou první cestu',
'dashboard.subtitle.activeOne': '{count} aktivní cesta',
'dashboard.subtitle.activeMany': '{count} aktivních cest',
@@ -140,6 +140,16 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'settings.temperature': 'Jednotky teploty',
'settings.timeFormat': 'Formát času',
'settings.routeCalculation': 'Výpočet trasy',
'settings.blurBookingCodes': 'Skrýt rezervační kódy',
'settings.notifications': 'Oznámení',
'settings.notifyTripInvite': 'Pozvánky na cesty',
'settings.notifyBookingChange': 'Změny rezervací',
'settings.notifyTripReminder': 'Připomínky cest',
'settings.notifyVacayInvite': 'Pozvánky k propojení Vacay',
'settings.notifyPhotosShared': 'Sdílené fotky (Immich)',
'settings.notifyCollabMessage': 'Zprávy v chatu (Collab)',
'settings.notifyPackingTagged': 'Seznam balení: přiřazení',
'settings.notifyWebhook': 'Webhook oznámení',
'settings.on': 'Zapnuto',
'settings.off': 'Vypnuto',
'settings.account': 'Účet',
@@ -192,6 +202,40 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'settings.mfa.toastEnabled': 'Dvoufaktorové ověření bylo zapnuto',
'settings.mfa.toastDisabled': 'Dvoufaktorové ověření bylo vypnuto',
'settings.mfa.demoBlocked': 'Není k dispozici v demo režimu',
'admin.smtp.title': 'E-mail a oznámení',
'admin.smtp.hint': 'Konfigurace SMTP pro e-mailová oznámení. Volitelně: Webhook URL pro Discord, Slack apod.',
'admin.smtp.testButton': 'Odeslat testovací e-mail',
'admin.smtp.testSuccess': 'Testovací e-mail byl úspěšně odeslán',
'admin.smtp.testFailed': 'Odeslání testovacího e-mailu se nezdařilo',
'dayplan.icsTooltip': 'Exportovat kalendář (ICS)',
'share.linkTitle': 'Veřejný odkaz',
'share.linkHint': 'Vytvořte odkaz, kterým si může kdokoli prohlédnout tuto cestu bez přihlášení. Pouze pro čtení — úpravy nejsou možné.',
'share.createLink': 'Vytvořit odkaz',
'share.deleteLink': 'Smazat odkaz',
'share.createError': 'Nepodařilo se vytvořit odkaz',
'common.copy': 'Kopírovat',
'common.copied': 'Zkopírováno',
'share.permMap': 'Mapa a plán',
'share.permBookings': 'Rezervace',
'share.permPacking': 'Balení',
'shared.expired': 'Odkaz vypršel nebo je neplatný',
'shared.expiredHint': 'Tento sdílený odkaz na cestu již není aktivní.',
'shared.readOnly': 'Sdílené zobrazení pouze pro čtení',
'shared.tabPlan': 'Plán',
'shared.tabBookings': 'Rezervace',
'shared.tabPacking': 'Balení',
'shared.tabBudget': 'Rozpočet',
'shared.tabChat': 'Chat',
'shared.days': 'dní',
'shared.places': 'míst',
'shared.other': 'Ostatní',
'shared.totalBudget': 'Celkový rozpočet',
'shared.messages': 'zpráv',
'shared.sharedVia': 'Sdíleno přes',
'shared.confirmed': 'Potvrzeno',
'shared.pending': 'Čeká na potvrzení',
'share.permBudget': 'Rozpočet',
'share.permCollab': 'Chat',
// Přihlášení (Login)
'login.error': 'Přihlášení se nezdařilo. Zkontrolujte prosím své údaje.',
@@ -273,7 +317,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'admin.tabs.categories': 'Kategorie',
'admin.tabs.backup': 'Zálohování',
'admin.stats.users': 'Uživatelé',
'admin.stats.cest': 'Cesty',
'admin.stats.trips': 'Cesty',
'admin.stats.places': 'Místa',
'admin.stats.photos': 'Fotky',
'admin.stats.files': 'Soubory',
@@ -398,6 +442,38 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'admin.addons.toast.updated': 'Doplněk byl aktualizován',
'admin.addons.toast.error': 'Aktualizace doplňku se nezdařila',
'admin.addons.noAddons': 'Žádné doplňky nejsou k dispozici',
'admin.addons.catalog.memories.name': 'Fotky (Immich)',
'admin.addons.catalog.memories.description': 'Sdílejte cestovní fotky přes vaši instanci Immich',
'admin.addons.subtitleBefore': 'Zapněte nebo vypněte funkce a přizpůsobte si ',
'admin.addons.subtitleAfter': '.',
'admin.tabs.audit': 'Auditní protokol',
'admin.audit.subtitle': 'Bezpečnostní a administrátorské události (zálohy, uživatelé, 2FA, nastavení).',
'admin.audit.empty': 'Zatím žádné záznamy auditu.',
'admin.audit.refresh': 'Obnovit',
'admin.audit.loadMore': 'Načíst další',
'admin.audit.showing': '{count} načteno · {total} celkem',
'admin.audit.col.time': 'Čas',
'admin.audit.col.user': 'Uživatel',
'admin.audit.col.action': 'Akce',
'admin.audit.col.resource': 'Zdroj',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Detaily',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.github.title': 'Historie verzí',
'admin.github.subtitle': 'Nejnovější aktualizace z {repo}',
'admin.github.latest': 'Nejnovější',
'admin.github.prerelease': 'Předběžná verze',
'admin.github.showDetails': 'Zobrazit podrobnosti',
'admin.github.hideDetails': 'Skrýt podrobnosti',
'admin.github.loadMore': 'Načíst další',
'admin.github.loading': 'Načítání...',
'admin.github.error': 'Nepodařilo se načíst verze',
'admin.github.by': 'od',
'admin.github.support': 'Pomáhá udržovat vývoj TREK',
// Počasí (Weather)
'admin.weather.title': 'Data o počasí',
@@ -428,6 +504,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'admin.update.backupLink': 'Přejít na zálohování',
'admin.update.howTo': 'Jak aktualizovat',
'admin.update.dockerText': 'Váš TREK běží v Dockeru. Pro aktualizaci na verzi {version} spusťte na svém serveru tyto příkazy:',
'admin.update.reloadHint': 'Prosím obnovte stránku za několik sekund.',
// Vacay doplněk
'vacay.subtitle': 'Plánování a správa dovolené',
@@ -444,6 +521,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'vacay.editPerson': 'Upravit osobu',
'vacay.removePerson': 'Odebrat osobu',
'vacay.removePersonConfirm': 'Odebrat osobu {name}?',
'vacay.removePersonHint': 'Všechny záznamy dovolené pro tuto osobu budou trvale smazány.',
'vacay.personName': 'Jméno',
'vacay.personNamePlaceholder': 'Zadejte jméno',
'vacay.color': 'Barva',
@@ -468,17 +546,24 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'vacay.fri': 'Pá',
'vacay.sat': 'So',
'vacay.sun': 'Ne',
'vacay.weekendDays': 'Víkendové dny',
'vacay.publicHolidays': 'Státní svátky',
'vacay.publicHolidaysHint': 'Zobrazit státní svátky v kalendáři',
'vacay.selectCountry': 'Vyberte zemi',
'vacay.selectRegion': 'Vyberte region (volitelné)',
'vacay.addCalendar': 'Přidat kalendář',
'vacay.calendarLabel': 'Popisek (volitelné)',
'vacay.calendarColor': 'Barva',
'vacay.noCalendars': 'Zatím nebyly přidány žádné svátkové kalendáře',
'vacay.companyHolidays': 'Firemní volno',
'vacay.companyHolidaysHint': 'Povolit označování dnů celofiremního volna',
'vacay.companyHolidaysNoDeduct': 'Firemní volno se nezapočítává do nároku na dovolenou.',
'vacay.carryOver': 'Převod dovolené',
'vacay.carryOverHint': 'Automaticky převádět zbývající dny do dalšího roku',
'vacay.sharing': 'Sdílení',
'vacay.sharingHint': 'Sdílejte svůj plán dovolené s ostatními uživateli TREK',
'vacay.owner': 'Vlastník',
'vacay.shareEmailPlaceholder': 'E-mail uživatele TREK',
'vacay.shareSuccess': 'Plán byl úspěšně sdílen',
'vacay.shareError': 'Nepodařilo se sdílet plán',
'vacay.dissolve': 'Zrušit propojení',
@@ -496,6 +581,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'vacay.inviteSent': 'Pozvánka odeslána',
'vacay.inviteError': 'Nepodařilo se odeslat pozvánku',
'vacay.pending': 'čeká na vyřízení',
'vacay.noUsersAvailable': 'Žádní uživatelé nejsou k dispozici',
'vacay.accept': 'Přijmout',
'vacay.decline': 'Odmítnout',
'vacay.acceptFusion': 'Přijmout a propojit',
@@ -510,7 +596,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
// Atlas doplněk
'atlas.subtitle': 'Vaše stopa ve světě',
'atlas.countries': 'Země',
'atlas.cest': 'Cesty',
'atlas.trips': 'Cesty',
'atlas.places': 'Místa',
'atlas.unmark': 'Odebrat',
'atlas.confirmMark': 'Označit tuto zemi jako navštívenou?',
@@ -518,6 +604,9 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'atlas.markVisited': 'Označit jako navštívené',
'atlas.markVisitedHint': 'Přidat tuto zemi do seznamu navštívených',
'atlas.addToBucket': 'Přidat do seznamu přání (Bucket list)',
'atlas.addPoi': 'Přidat místo',
'atlas.bucketNamePlaceholder': 'Název (země, město, místo...)',
'atlas.month': 'Měsíc',
'atlas.addToBucketHint': 'Uložit jako místo, které chcete navštívit',
'atlas.bucketWhen': 'Kdy plánujete návštěvu?',
'atlas.statsTab': 'Statistiky',
@@ -603,14 +692,26 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportovat denní plán do PDF',
'dayplan.pdfError': 'Export do PDF se nezdařil',
'dayplan.cannotReorderTransport': 'Rezervace s pevným časem nelze přeuspořádat',
'dayplan.confirmRemoveTimeTitle': 'Odebrat čas?',
'dayplan.confirmRemoveTimeBody': 'Toto místo má pevný čas ({time}). Přesunutím se čas odebere a povolí se volné řazení.',
'dayplan.confirmRemoveTimeAction': 'Odebrat čas a přesunout',
'dayplan.cannotDropOnTimed': 'Položky nelze umístit mezi záznamy s pevným časem',
'dayplan.cannotBreakChronology': 'Toto by porušilo chronologické pořadí naplánovaných položek a rezervací',
// Boční panel míst (Places Sidebar)
'places.addPlace': 'Přidat místo/aktivitu',
'places.importGpx': 'Importovat GPX',
'places.gpxImported': '{count} míst importováno z GPX',
'places.urlResolved': 'Místo importováno z URL',
'places.gpxError': 'Import GPX se nezdařil',
'places.assignToDay': 'Přidat do kterého dne?',
'places.all': 'Vše',
'places.unplanned': 'Nezařazené',
'places.search': 'Hledat místa...',
'places.allCategories': 'Všechny kategorie',
'places.categoriesSelected': 'kategorií',
'places.clearFilter': 'Vymazat filtr',
'places.count': '{count} míst',
'places.countSingular': '1 místo',
'places.allPlanned': 'Všechna místa jsou naplánována',
@@ -644,7 +745,41 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'places.nameRequired': 'Prosím zadejte název',
'places.saveError': 'Uložení se nezdařilo',
// Inspektor míst (Place Inspector)
'inspector.opened': 'Otevřeno',
'inspector.closed': 'Zavřeno',
'inspector.openingHours': 'Otevírací doba',
'inspector.showHours': 'Zobrazit otevírací dobu',
'inspector.files': 'Soubory',
'inspector.filesCount': '{count} souborů',
'inspector.removeFromDay': 'Odebrat ze dne',
'inspector.addToDay': 'Přidat ke dni',
'inspector.confirmedRes': 'Potvrzená rezervace',
'inspector.pendingRes': 'Čekající rezervace',
'inspector.google': 'Otevřít v Google Mapách',
'inspector.website': 'Otevřít webové stránky',
'inspector.addRes': 'Rezervace',
'inspector.editRes': 'Upravit rezervaci',
'inspector.participants': 'Účastníci',
// Rezervace (Reservations)
'reservations.title': 'Rezervace',
'reservations.empty': 'Zatím žádné rezervace',
'reservations.emptyHint': 'Přidejte rezervace letů, hotelů a dalších',
'reservations.add': 'Přidat rezervaci',
'reservations.addManual': 'Ruční rezervace',
'reservations.placeHint': 'Tip: Rezervace je nejlepší vytvářet přímo z místa propojí se tak s denním plánem.',
'reservations.confirmed': 'Potvrzeno',
'reservations.pending': 'Čeká na potvrzení',
'reservations.summary': '{confirmed} potvrzených, {pending} čekajících',
'reservations.fromPlan': 'Z plánu',
'reservations.showFiles': 'Zobrazit soubory',
'reservations.editTitle': 'Upravit rezervaci',
'reservations.status': 'Stav',
'reservations.datetime': 'Datum a čas',
'reservations.startTime': 'Čas začátku',
'reservations.endTime': 'Čas konce',
'reservations.date': 'Datum',
'reservations.time': 'Čas',
'reservations.timeAlt': 'Čas (alternativní, např. 19:30)',
'reservations.notes': 'Poznámky',
@@ -675,7 +810,9 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.event': 'Událost',
'reservations.type.tour': 'Prohlídka',
'reservations.type.other': 'Jiné',
'reservations.confirm.delete': 'Opravdu chcete smazat rezervaci „{name}?',
'reservations.confirm.delete': 'Opravdu chcete smazat rezervaci „{name}?',
'reservations.confirm.deleteTitle': 'Smazat rezervaci?',
'reservations.confirm.deleteBody': '„{name}” bude trvale smazána.',
'reservations.toast.updated': 'Rezervace aktualizována',
'reservations.toast.removed': 'Rezervace smazána',
'reservations.toast.fileUploaded': 'Soubor byl nahrán',
@@ -699,9 +836,64 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'reservations.toast.saveError': 'Uložení se nezdařilo',
'reservations.toast.updateError': 'Aktualizace se nezdařila',
'reservations.toast.deleteError': 'Smazání se nezdařilo',
'reservations.confirm.remove': 'Odstranit rezervaci pro „{name}?',
'reservations.confirm.remove': 'Odstranit rezervaci pro „{name}?',
'reservations.linkAssignment': 'Propojit s přiřazením dne',
'reservations.pickAssignment': 'Vyberte přiřazení z vašeho plánu...',
'reservations.noAssignment': 'Bez propojení (samostatné)',
// Rozpočet (Budget)
'budget.title': 'Rozpočet',
'budget.emptyTitle': 'Zatím nebyl vytvořen žádný rozpočet',
'budget.emptyText': 'Vytvořte kategorie a položky pro plánování cestovního rozpočtu',
'budget.emptyPlaceholder': 'Zadejte název kategorie...',
'budget.createCategory': 'Vytvořit kategorii',
'budget.category': 'Kategorie',
'budget.categoryName': 'Název kategorie',
'budget.table.name': 'Název',
'budget.table.total': 'Celkem',
'budget.table.persons': 'Osoby',
'budget.table.days': 'Dní',
'budget.table.perPerson': 'Na osobu',
'budget.table.perDay': 'Za den',
'budget.table.perPersonDay': 'Os. / den',
'budget.table.note': 'Poznámka',
'budget.newEntry': 'Nová položka',
'budget.defaultEntry': 'Nová položka',
'budget.defaultCategory': 'Nová kategorie',
'budget.total': 'Celkem',
'budget.totalBudget': 'Celkový rozpočet',
'budget.byCategory': 'Podle kategorie',
'budget.editTooltip': 'Klikněte pro úpravu',
'budget.confirm.deleteCategory': 'Opravdu chcete smazat kategorii „{name}” s {count} položkami?',
'budget.deleteCategory': 'Smazat kategorii',
'budget.perPerson': 'Na osobu',
'budget.paid': 'Zaplaceno',
'budget.open': 'Nezaplaceno',
'budget.noMembers': 'Žádní členové nebyli přiřazeni',
'budget.settlement': 'Vyúčtování',
'budget.settlementInfo': 'Klikněte na avatar člena u rozpočtové položky pro zelené označení to znamená, že zaplatil. Vyúčtování pak ukazuje, kdo komu a kolik dluží.',
'budget.netBalances': 'Čisté zůstatky',
// Soubory (Files)
'files.title': 'Soubory',
'files.count': '{count} souborů',
'files.countSingular': '1 soubor',
'files.uploaded': '{count} nahráno',
'files.uploadError': 'Nahrávání se nezdařilo',
'files.dropzone': 'Přetáhněte soubory sem',
'files.dropzoneHint': 'nebo klikněte pro výběr',
'files.allowedTypes': 'Obrázky, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 MB',
'files.uploading': 'Nahrávání...',
'files.filterAll': 'Vše',
'files.filterPdf': 'PDF',
'files.filterImages': 'Obrázky',
'files.filterDocs': 'Dokumenty',
'files.filterCollab': 'Poznámky spolupráce',
'files.sourceCollab': 'Z poznámek spolupráce',
'files.empty': 'Zatím žádné soubory',
'files.emptyHint': 'Nahrajte soubory k vaší cestě',
'files.openTab': 'Otevřít v nové kartě',
'files.confirm.delete': 'Opravdu chcete smazat tento soubor?',
'files.toast.deleted': 'Soubor byl smazán',
'files.toast.deleteError': 'Nepodařilo se smazat soubor',
'files.sourcePlan': 'Denní plán',
@@ -734,6 +926,15 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
// Balení (Packing)
'packing.title': 'Seznam věcí',
'packing.empty': 'Seznam věcí je prázdný',
'packing.import': 'Importovat',
'packing.importTitle': 'Importovat seznam',
'packing.importHint': 'Jedna položka na řádek. Formát: Kategorie, Název, Váha v g (volitelné), Zavazadlo (volitelné), checked/unchecked (volitelné)',
'packing.importPlaceholder': 'Hygiena, Zubní kartáček\nOblečení, Trička, 200\nDokumenty, Pas, , Příruční zavazadlo\nElektronika, Nabíječka, 50, Kufr, checked',
'packing.importCsv': 'Načíst CSV/TXT',
'packing.importAction': 'Importovat {count}',
'packing.importSuccess': '{count} položek importováno',
'packing.importError': 'Import se nezdařil',
'packing.importEmpty': 'Žádné položky k importu',
'packing.progress': '{packed} z {total} zabaleno ({percent} %)',
'packing.clearChecked': 'Odstranit {count} hotových',
'packing.clearCheckedShort': 'Odstranit {count}',
@@ -759,8 +960,333 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'packing.addItemPlaceholder': 'Název položky...',
'packing.addCategory': 'Přidat kategorii',
'packing.newCategoryPlaceholder': 'Název kategorie (např. Oblečení)',
'packing.applyTemplate': 'Použít šablonu',
'packing.template': 'Šablona',
'packing.templateApplied': '{count} položek přidáno ze šablony',
'packing.templateError': 'Šablonu se nepodařilo použít',
'packing.bags': 'Zavazadla',
'packing.noBag': 'Nepřiřazeno',
'packing.totalWeight': 'Celková váha',
'packing.bagName': 'Název zavazadla...',
'packing.addBag': 'Přidat zavazadlo',
'packing.changeCategory': 'Změnit kategorii',
'packing.confirm.clearChecked': 'Opravdu chcete odstranit {count} zabalených položek?',
'packing.confirm.deleteCat': 'Opravdu chcete smazat kategorii „{name}" s {count} položkami?',
'packing.defaultCategory': 'Ostatní',
'packing.toast.saveError': 'Uložení se nezdařilo',
'packing.toast.deleteError': 'Smazání se nezdařilo',
'packing.toast.renameError': 'Přejmenování se nezdařilo',
'packing.toast.addError': 'Přidání se nezdařilo',
// Spolupráce (Collab / Chat)
// Návrhy balení (Packing suggestions)
'packing.suggestions.items': [
{ name: 'Pas', category: 'Dokumenty' },
{ name: 'Občanský průkaz', category: 'Dokumenty' },
{ name: 'Cestovní pojištění', category: 'Dokumenty' },
{ name: 'Letenky', category: 'Dokumenty' },
{ name: 'Platební karta', category: 'Finance' },
{ name: 'Hotovost', category: 'Finance' },
{ name: 'Víza', category: 'Dokumenty' },
{ name: 'Trička', category: 'Oblečení' },
{ name: 'Kalhoty', category: 'Oblečení' },
{ name: 'Spodní prádlo', category: 'Oblečení' },
{ name: 'Ponožky', category: 'Oblečení' },
{ name: 'Bunda', category: 'Oblečení' },
{ name: 'Pyžamo', category: 'Oblečení' },
{ name: 'Plavky', category: 'Oblečení' },
{ name: 'Pláštěnka', category: 'Oblečení' },
{ name: 'Pohodlné boty', category: 'Oblečení' },
{ name: 'Zubní kartáček', category: 'Hygiena' },
{ name: 'Zubní pasta', category: 'Hygiena' },
{ name: 'Šampón', category: 'Hygiena' },
{ name: 'Deodorant', category: 'Hygiena' },
{ name: 'Opalovací krém', category: 'Hygiena' },
{ name: 'Holicí strojek', category: 'Hygiena' },
{ name: 'Nabíječka', category: 'Elektronika' },
{ name: 'Powerbanka', category: 'Elektronika' },
{ name: 'Sluchátka', category: 'Elektronika' },
{ name: 'Cestovní adaptér', category: 'Elektronika' },
{ name: 'Fotoaparát', category: 'Elektronika' },
{ name: 'Léky proti bolesti', category: 'Zdraví' },
{ name: 'Náplasti', category: 'Zdraví' },
{ name: 'Dezinfekce', category: 'Zdraví' },
],
// Členové / Sdílení (Members)
'members.shareTrip': 'Sdílet cestu',
'members.inviteUser': 'Pozvat uživatele',
'members.selectUser': 'Vyberte uživatele…',
'members.invite': 'Pozvat',
'members.allHaveAccess': 'Všichni uživatelé již mají přístup.',
'members.access': 'Přístup',
'members.person': 'osoba',
'members.persons': 'osob',
'members.you': 'vy',
'members.owner': 'Vlastník',
'members.leaveTrip': 'Opustit cestu',
'members.removeAccess': 'Odebrat přístup',
'members.confirmLeave': 'Opustit cestu? Ztratíte přístup.',
'members.confirmRemove': 'Odebrat přístup tomuto uživateli?',
'members.loadError': 'Nepodařilo se načíst členy',
'members.added': 'přidán/a',
'members.addError': 'Nepodařilo se přidat',
'members.removed': 'Člen odebrán',
'members.removeError': 'Nepodařilo se odebrat',
// Kategorie (Admin)
'categories.title': 'Kategorie',
'categories.subtitle': 'Správa kategorií pro místa',
'categories.new': 'Nová kategorie',
'categories.empty': 'Zatím žádné kategorie',
'categories.namePlaceholder': 'Název kategorie',
'categories.icon': 'Ikona',
'categories.color': 'Barva',
'categories.customColor': 'Vybrat vlastní barvu',
'categories.preview': 'Náhled',
'categories.defaultName': 'Kategorie',
'categories.update': 'Aktualizovat',
'categories.create': 'Vytvořit',
'categories.confirm.delete': 'Smazat kategorii? Místa v této kategorii nebudou smazána.',
'categories.toast.loadError': 'Nepodařilo se načíst kategorie',
'categories.toast.nameRequired': 'Prosím zadejte název',
'categories.toast.updated': 'Kategorie aktualizována',
'categories.toast.created': 'Kategorie vytvořena',
'categories.toast.saveError': 'Uložení se nezdařilo',
'categories.toast.deleted': 'Kategorie smazána',
'categories.toast.deleteError': 'Smazání se nezdařilo',
// Zálohování (Backup)
'backup.title': 'Záloha dat',
'backup.subtitle': 'Databáze a všechny nahrané soubory',
'backup.refresh': 'Obnovit',
'backup.upload': 'Nahrát zálohu',
'backup.uploading': 'Nahrávání…',
'backup.create': 'Vytvořit zálohu',
'backup.creating': 'Vytváření…',
'backup.empty': 'Zatím žádné zálohy',
'backup.createFirst': 'Vytvořit první zálohu',
'backup.download': 'Stáhnout',
'backup.restore': 'Obnovit',
'backup.confirm.restore': 'Obnovit zálohu „{name}"?\n\nVšechna aktuální data budou nahrazena zálohou.',
'backup.confirm.uploadRestore': 'Nahrát a obnovit zálohu „{name}"?\n\nVšechna aktuální data budou přepsána.',
'backup.confirm.delete': 'Smazat zálohu „{name}"?',
'backup.toast.loadError': 'Nepodařilo se načíst zálohy',
'backup.toast.created': 'Záloha byla úspěšně vytvořena',
'backup.toast.createError': 'Nepodařilo se vytvořit zálohu',
'backup.toast.restored': 'Záloha obnovena. Stránka se znovu načte…',
'backup.toast.restoreError': 'Obnovení se nezdařilo',
'backup.toast.uploadError': 'Nahrávání se nezdařilo',
'backup.toast.deleted': 'Záloha smazána',
'backup.toast.deleteError': 'Smazání se nezdařilo',
'backup.toast.downloadError': 'Stahování se nezdařilo',
'backup.toast.settingsSaved': 'Nastavení automatického zálohování uloženo',
'backup.toast.settingsError': 'Nepodařilo se uložit nastavení',
'backup.auto.title': 'Automatické zálohování',
'backup.auto.subtitle': 'Automatické zálohování podle plánu',
'backup.auto.enable': 'Povolit automatické zálohování',
'backup.auto.enableHint': 'Zálohy budou vytvářeny automaticky podle zvoleného plánu',
'backup.auto.interval': 'Interval',
'backup.auto.hour': 'Spustit v hodinu',
'backup.auto.hourHint': 'Místní čas serveru (formát {format})',
'backup.auto.dayOfWeek': 'Den v týdnu',
'backup.auto.dayOfMonth': 'Den v měsíci',
'backup.auto.dayOfMonthHint': 'Omezeno na 128 pro kompatibilitu se všemi měsíci',
'backup.auto.scheduleSummary': 'Plán',
'backup.auto.summaryDaily': 'Každý den v {hour}:00',
'backup.auto.summaryWeekly': 'Každý {day} v {hour}:00',
'backup.auto.summaryMonthly': '{day}. každého měsíce v {hour}:00',
'backup.auto.envLocked': 'Docker',
'backup.auto.envLockedHint': 'Automatické zálohování je konfigurováno přes Docker proměnné prostředí. Pro změnu nastavení aktualizujte docker-compose.yml a restartujte kontejner.',
'backup.auto.copyEnv': 'Zkopírovat Docker proměnné',
'backup.auto.envCopied': 'Docker proměnné prostředí zkopírovány do schránky',
'backup.auto.keepLabel': 'Smazat staré zálohy po',
'backup.dow.sunday': 'Ne',
'backup.dow.monday': 'Po',
'backup.dow.tuesday': 'Út',
'backup.dow.wednesday': 'St',
'backup.dow.thursday': 'Čt',
'backup.dow.friday': 'Pá',
'backup.dow.saturday': 'So',
'backup.interval.hourly': 'Každou hodinu',
'backup.interval.daily': 'Denně',
'backup.interval.weekly': 'Týdně',
'backup.interval.monthly': 'Měsíčně',
'backup.keep.1day': '1 den',
'backup.keep.3days': '3 dny',
'backup.keep.7days': '7 dní',
'backup.keep.14days': '14 dní',
'backup.keep.30days': '30 dní',
'backup.keep.forever': 'Uchovávat navždy',
// Fotky
'photos.allDays': 'Všechny dny',
'photos.noPhotos': 'Zatím žádné fotky',
'photos.uploadHint': 'Nahrajte své cestovní fotky',
'photos.clickToSelect': 'nebo klikněte pro výběr',
'photos.linkPlace': 'Propojit s místem',
'photos.noPlace': 'Žádné místo',
'photos.uploadN': 'Nahrát {n} fotek',
// Obnovení zálohy
'backup.restoreConfirmTitle': 'Obnovit zálohu?',
'backup.restoreWarning': 'Všechna aktuální data (cesty, místa, uživatelé, nahrané soubory) budou trvale nahrazena zálohou. Tuto akci nelze vrátit.',
'backup.restoreTip': 'Tip: Před obnovením vytvořte zálohu aktuálního stavu.',
'backup.restoreConfirm': 'Ano, obnovit',
// PDF
'pdf.travelPlan': 'Cestovní plán',
'pdf.planned': 'Naplánováno',
'pdf.costLabel': 'Náklady EUR',
'pdf.preview': 'Náhled PDF',
'pdf.saveAsPdf': 'Uložit jako PDF',
// Plánovač (Planner)
'planner.places': 'Místa',
'planner.bookings': 'Rezervace',
'planner.packingList': 'Seznam věcí',
'planner.documents': 'Dokumenty',
'planner.dayPlan': 'Denní plán',
'planner.reservations': 'Rezervace',
'planner.minTwoPlaces': 'Potřebujete alespoň 2 místa se souřadnicemi',
'planner.noGeoPlaces': 'Žádná místa se souřadnicemi nejsou k dispozici',
'planner.routeCalculated': 'Trasa vypočtena',
'planner.routeCalcFailed': 'Trasu se nepodařilo vypočítat',
'planner.routeError': 'Chyba při výpočtu trasy',
'planner.routeOptimized': 'Trasa optimalizována',
'planner.reservationUpdated': 'Rezervace aktualizována',
'planner.reservationAdded': 'Rezervace přidána',
'planner.confirmDeleteReservation': 'Smazat rezervaci?',
'planner.reservationDeleted': 'Rezervace smazána',
'planner.days': 'Dny',
'planner.allPlaces': 'Všechna místa',
'planner.totalPlaces': 'Celkem {n} míst',
'planner.noDaysPlanned': 'Zatím nejsou naplánovány žádné dny',
'planner.editTrip': 'Upravit cestu \u2192',
'planner.placeOne': '1 místo',
'planner.placeN': '{n} míst',
'planner.addNote': 'Přidat poznámku',
'planner.noEntries': 'Pro tento den nejsou žádné záznamy',
'planner.addPlace': 'Přidat místo/aktivitu',
'planner.addPlaceShort': '+ Přidat místo/aktivitu',
'planner.resPending': 'Rezervace čeká · ',
'planner.resConfirmed': 'Rezervace potvrzena · ',
'planner.notePlaceholder': 'Poznámka\u2026',
'planner.noteTimePlaceholder': 'Čas (volitelné)',
'planner.noteExamplePlaceholder': 'např. S3 ve 14:30 z hlavního nádraží, trajekt z přístaviště 7, přestávka na oběd\u2026',
'planner.totalCost': 'Celkové náklady',
'planner.searchPlaces': 'Hledat místa\u2026',
'planner.allCategories': 'Všechny kategorie',
'planner.noPlacesFound': 'Žádná místa nenalezena',
'planner.addFirstPlace': 'Přidat první místo',
'planner.noReservations': 'Žádné rezervace',
'planner.addFirstReservation': 'Přidat první rezervaci',
'planner.new': 'Nový',
'planner.addToDay': '+ Den',
'planner.calculating': 'Počítání\u2026',
'planner.route': 'Trasa',
'planner.optimize': 'Optimalizovat',
'planner.openGoogleMaps': 'Otevřít v Google Mapách',
'planner.selectDayHint': 'Vyberte den ze seznamu vlevo pro zobrazení denního plánu',
'planner.noPlacesForDay': 'Zatím žádná místa pro tento den',
'planner.addPlacesLink': 'Přidat místa \u2192',
'planner.minTotal': 'min. celkem',
'planner.noReservation': 'Žádná rezervace',
'planner.removeFromDay': 'Odebrat ze dne',
'planner.addToThisDay': 'Přidat ke dni',
'planner.overview': 'Přehled',
'planner.noDays': 'Zatím žádné dny',
'planner.editTripToAddDays': 'Upravte cestu pro přidání dnů',
'planner.dayCount': '{n} dní',
'planner.clickToUnlock': 'Klikněte pro odemčení',
'planner.keepPosition': 'Zachovat pozici při optimalizaci trasy',
'planner.dayDetails': 'Podrobnosti dne',
'planner.dayN': 'Den {n}',
// Statistiky (Dashboard Stats)
'stats.countries': 'Země',
'stats.cities': 'Města',
'stats.trips': 'Cesty',
'stats.places': 'Místa',
'stats.worldProgress': 'Průzkum světa',
'stats.visited': 'navštíveno',
'stats.remaining': 'zbývá',
'stats.visitedCountries': 'Navštívené země',
// Detail dne (Day Detail Panel)
'day.precipProb': 'Pravděpodobnost srážek',
'day.precipitation': 'Srážky',
'day.wind': 'Vítr',
'day.sunrise': 'Východ slunce',
'day.sunset': 'Západ slunce',
'day.hourlyForecast': 'Hodinová předpověď',
'day.climateHint': 'Historické průměry — reálná předpověď je k dispozici do 16 dnů od tohoto data.',
'day.noWeather': 'Nejsou k dispozici žádná data o počasí. Přidejte místo se souřadnicemi.',
'day.overview': 'Denní přehled',
'day.accommodation': 'Ubytování',
'day.addAccommodation': 'Přidat ubytování',
'day.hotelDayRange': 'Použít na dny',
'day.noPlacesForHotel': 'Nejprve přidejte místa ke své cestě',
'day.allDays': 'Vše',
'day.checkIn': 'Check-in',
'day.checkOut': 'Check-out',
'day.confirmation': 'Potvrzení',
'day.editAccommodation': 'Upravit ubytování',
'day.reservations': 'Rezervace',
// Fotky / Immich
'memories.title': 'Fotky',
'memories.notConnected': 'Immich není připojen',
'memories.notConnectedHint': 'Připojte svoji instanci Immich v Nastavení, abyste zde viděli fotky z cest.',
'memories.noDates': 'Přidejte data k cestě pro načtení fotek.',
'memories.noPhotos': 'Nenalezeny žádné fotky',
'memories.noPhotosHint': 'V Immich nebyly nalezeny žádné fotky pro období této cesty.',
'memories.photosFound': 'fotek',
'memories.fromOthers': 'od ostatních',
'memories.sharePhotos': 'Sdílet fotky',
'memories.sharing': 'Sdílení',
'memories.reviewTitle': 'Zkontrolujte své fotky',
'memories.reviewHint': 'Klikněte na fotky pro vyloučení ze sdílení.',
'memories.shareCount': 'Sdílet {count} fotek',
'memories.immichUrl': 'URL serveru Immich',
'memories.immichApiKey': 'API klíč',
'memories.testConnection': 'Otestovat připojení',
'memories.connected': 'Připojeno',
'memories.disconnected': 'Nepřipojeno',
'memories.connectionSuccess': 'Připojeno k Immich',
'memories.connectionError': 'Nepodařilo se připojit k Immich',
'memories.saved': 'Nastavení Immich uloženo',
'memories.addPhotos': 'Přidat fotky',
'memories.selectPhotos': 'Vybrat fotky z Immich',
'memories.selectHint': 'Klepněte na fotky pro jejich výběr.',
'memories.selected': 'vybráno',
'memories.addSelected': 'Přidat {count} fotek',
'memories.alreadyAdded': 'Přidáno',
'memories.private': 'Soukromé',
'memories.stopSharing': 'Zastavit sdílení',
'memories.oldest': 'Nejstarší',
'memories.newest': 'Nejnovější',
'memories.allLocations': 'Všechna místa',
'memories.tripDates': 'Data cesty',
'memories.allPhotos': 'Všechny fotky',
'memories.confirmShareTitle': 'Sdílet se členy cesty?',
'memories.confirmShareHint': '{count} fotek bude viditelných pro všechny členy této cesty. Jednotlivé fotky můžete později nastavit jako soukromé.',
'memories.confirmShareButton': 'Sdílet fotky',
// Spolupráce (Collab)
'collab.tabs.chat': 'Chat',
'collab.tabs.notes': 'Poznámky',
'collab.tabs.polls': 'Hlasování',
'collab.whatsNext.title': 'Co následuje',
'collab.whatsNext.today': 'Dnes',
'collab.whatsNext.tomorrow': 'Zítra',
'collab.whatsNext.empty': 'Žádné nadcházející aktivity',
'collab.whatsNext.until': 'do',
'collab.whatsNext.emptyHint': 'Aktivity s časem se zde zobrazí',
'collab.chat.send': 'Odeslat',
'collab.chat.placeholder': 'Napište zprávu...',
'collab.chat.empty': 'Začněte konverzaci',
'collab.chat.emptyHint': 'Zprávy jsou sdíleny se všemi členy cesty',
'collab.chat.emptyDesc': 'Sdílejte nápady, plány a novinky se svou cestovatelskou skupinou',
'collab.chat.today': 'Dnes',
'collab.chat.yesterday': 'Včera',
'collab.chat.deletedMessage': 'smazal zprávu',
@@ -790,6 +1316,10 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'collab.notes.attachFiles': 'Přiložit soubory',
'collab.notes.noCategoriesYet': 'Zatím žádné kategorie',
'collab.notes.emptyDesc': 'Vytvořte poznámku a začněte',
'collab.notes.contentPlaceholder': 'Napište něco...',
'collab.notes.categoryPlaceholder': 'Kategorie',
'collab.notes.newCategory': 'Nová kategorie...',
'collab.notes.category': 'Kategorie',
'collab.polls.title': 'Hlasování',
'collab.polls.new': 'Nové hlasování',
'collab.polls.empty': 'Zatím žádná hlasování',
@@ -798,5 +1328,18 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'collab.polls.questionPlaceholder': 'Co bychom měli dělat?',
'collab.polls.addOption': '+ Přidat možnost',
'collab.polls.optionPlaceholder': 'Možnost {n}',
'collab.polls.create': 'Vytvořit',
};
'collab.polls.create': 'Vytvořit hlasování',
'collab.polls.close': 'Uzavřít',
'collab.polls.closed': 'Uzavřeno',
'collab.polls.votes': '{n} hlasů',
'collab.polls.vote': '{n} hlas',
'collab.polls.multipleChoice': 'Více možností',
'collab.polls.multiChoice': 'Více možností',
'collab.polls.deadline': 'Termín',
'collab.polls.option': 'Možnost',
'collab.polls.options': 'Možnosti',
'collab.polls.delete': 'Smazat',
'collab.polls.closedSection': 'Uzavřené',
}
export default cs

View File

@@ -454,6 +454,20 @@ const fr: Record<string, string> = {
'admin.weather.requestsDesc': 'Gratuit, aucune clé API requise',
'admin.weather.locationHint': 'La météo est basée sur le premier lieu avec des coordonnées de chaque jour. Si aucun lieu n\'est attribué à un jour, un lieu de la liste est utilisé comme référence.',
'admin.tabs.audit': 'Journal d\'audit',
'admin.audit.subtitle': 'Événements sensibles de sécurité et d\'administration (sauvegardes, utilisateurs, 2FA, paramètres).',
'admin.audit.empty': 'Aucune entrée d\'audit.',
'admin.audit.refresh': 'Actualiser',
'admin.audit.loadMore': 'Charger plus',
'admin.audit.showing': '{count} chargées · {total} au total',
'admin.audit.col.time': 'Heure',
'admin.audit.col.user': 'Utilisateur',
'admin.audit.col.action': 'Action',
'admin.audit.col.resource': 'Ressource',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Détails',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.github.title': 'Historique des versions',

File diff suppressed because it is too large Load Diff

View File

@@ -139,6 +139,16 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'settings.temperature': 'Unità di Temperatura',
'settings.timeFormat': 'Formato Ora',
'settings.routeCalculation': 'Calcolo Percorso',
'settings.blurBookingCodes': 'Nascondi codici di prenotazione',
'settings.notifications': 'Notifiche',
'settings.notifyTripInvite': 'Inviti di viaggio',
'settings.notifyBookingChange': 'Modifiche alle prenotazioni',
'settings.notifyTripReminder': 'Promemoria di viaggio',
'settings.notifyVacayInvite': 'Inviti fusione Vacay',
'settings.notifyPhotosShared': 'Foto condivise (Immich)',
'settings.notifyCollabMessage': 'Messaggi chat (Collab)',
'settings.notifyPackingTagged': 'Lista valigia: assegnazioni',
'settings.notifyWebhook': 'Notifiche webhook',
'settings.on': 'On',
'settings.off': 'Off',
'settings.account': 'Account',
@@ -191,6 +201,40 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'settings.mfa.toastEnabled': 'Autenticazione a due fattori abilitata',
'settings.mfa.toastDisabled': 'Autenticazione a due fattori disabilitata',
'settings.mfa.demoBlocked': 'Non disponibile in modalità demo',
'admin.smtp.title': 'Email e notifiche',
'admin.smtp.hint': 'Configurazione SMTP per le notifiche via email. Opzionale: URL webhook per Discord, Slack, ecc.',
'admin.smtp.testButton': 'Invia email di prova',
'admin.smtp.testSuccess': 'Email di prova inviata con successo',
'admin.smtp.testFailed': 'Invio email di prova fallito',
'dayplan.icsTooltip': 'Esporta calendario (ICS)',
'share.linkTitle': 'Link pubblico',
'share.linkHint': 'Crea un link che chiunque può usare per visualizzare questo viaggio senza accedere. Solo lettura — nessuna modifica possibile.',
'share.createLink': 'Crea link',
'share.deleteLink': 'Elimina link',
'share.createError': 'Impossibile creare il link',
'common.copy': 'Copia',
'common.copied': 'Copiato',
'share.permMap': 'Mappa e programma',
'share.permBookings': 'Prenotazioni',
'share.permPacking': 'Valigia',
'shared.expired': 'Link scaduto o non valido',
'shared.expiredHint': 'Questo link di viaggio condiviso non è più attivo.',
'shared.readOnly': 'Vista in sola lettura',
'shared.tabPlan': 'Programma',
'shared.tabBookings': 'Prenotazioni',
'shared.tabPacking': 'Valigia',
'shared.tabBudget': 'Budget',
'shared.tabChat': 'Chat',
'shared.days': 'giorni',
'shared.places': 'luoghi',
'shared.other': 'Altro',
'shared.totalBudget': 'Budget totale',
'shared.messages': 'messaggi',
'shared.sharedVia': 'Condiviso tramite',
'shared.confirmed': 'Confermato',
'shared.pending': 'In attesa',
'share.permBudget': 'Budget',
'share.permCollab': 'Chat',
// Login
'login.error': 'Accesso fallito. Controlla le tue credenziali.',
@@ -373,8 +417,6 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'admin.tabs.addons': 'Moduli',
'admin.addons.title': 'Moduli',
'admin.addons.subtitle': 'Abilita o disabilita le funzionalità per personalizzare la tua esperienza TREK.',
'admin.addons.catalog.memories.name': 'Ricordi',
'admin.addons.catalog.memories.description': 'Album fotografici condivisi per ogni viaggio',
'admin.addons.catalog.packing.name': 'Lista valigia',
'admin.addons.catalog.packing.description': 'Checklist per preparare la valigia per ogni viaggio',
'admin.addons.catalog.budget.name': 'Budget',
@@ -413,6 +455,20 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'admin.weather.requestsDesc': 'Gratis, nessuna chiave API richiesta',
'admin.weather.locationHint': 'Il meteo si basa sul primo luogo con coordinate di ogni giorno. Se a un giorno non è assegnato alcun luogo, viene utilizzato come riferimento un qualsiasi luogo dell\'elenco.',
'admin.tabs.audit': 'Log di audit',
'admin.audit.subtitle': 'Eventi sensibili di sicurezza e amministrazione (backup, utenti, 2FA, impostazioni).',
'admin.audit.empty': 'Nessuna voce di audit.',
'admin.audit.refresh': 'Aggiorna',
'admin.audit.loadMore': 'Carica altro',
'admin.audit.showing': '{count} caricati · {total} totali',
'admin.audit.col.time': 'Ora',
'admin.audit.col.user': 'Utente',
'admin.audit.col.action': 'Azione',
'admin.audit.col.resource': 'Risorsa',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Dettagli',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.github.title': 'Cronologia rilasci',
@@ -544,6 +600,9 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'atlas.markVisited': 'Segna come visitato',
'atlas.markVisitedHint': 'Aggiungi questo paese alla tua lista dei visitati',
'atlas.addToBucket': 'Aggiungi alla lista desideri',
'atlas.addPoi': 'Aggiungi luogo',
'atlas.bucketNamePlaceholder': 'Nome (paese, città, luogo...)',
'atlas.month': 'Mese',
'atlas.addToBucketHint': 'Salvalo come luogo che vuoi visitare',
'atlas.bucketWhen': 'Quando pensi di visitarlo?',
'atlas.statsTab': 'Statistiche',
@@ -629,14 +688,26 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Esporta il programma del giorno come PDF',
'dayplan.pdfError': 'Impossibile esportare il PDF',
'dayplan.cannotReorderTransport': 'Le prenotazioni con un orario fisso non possono essere riordinate',
'dayplan.confirmRemoveTimeTitle': 'Rimuovere l\'orario?',
'dayplan.confirmRemoveTimeBody': 'Questo luogo ha un orario fisso ({time}). Spostarlo rimuoverà l\'orario e consentirà l\'ordinamento libero.',
'dayplan.confirmRemoveTimeAction': 'Rimuovi orario e sposta',
'dayplan.cannotDropOnTimed': 'Gli elementi non possono essere posizionati tra voci con orario fisso',
'dayplan.cannotBreakChronology': 'Ciò interromperebbe l\'ordine cronologico degli elementi e delle prenotazioni pianificati',
// Places Sidebar
'places.addPlace': 'Aggiungi Luogo/Attività',
'places.importGpx': 'Importa GPX',
'places.gpxImported': '{count} luoghi importati da GPX',
'places.urlResolved': 'Luogo importato dall\'URL',
'places.gpxError': 'Importazione GPX non riuscita',
'places.assignToDay': 'A quale giorno aggiungere?',
'places.all': 'Tutti',
'places.unplanned': 'Non pianificati',
'places.search': 'Cerca luoghi...',
'places.allCategories': 'Tutte le categorie',
'places.categoriesSelected': 'categorie',
'places.clearFilter': 'Cancella filtro',
'places.count': '{count} luoghi',
'places.countSingular': '1 luogo',
'places.allPlanned': 'Tutti i luoghi sono programmati',
@@ -735,6 +806,8 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'reservations.type.tour': 'Tour',
'reservations.type.other': 'Altro',
'reservations.confirm.delete': 'Sei sicuro di voler eliminare la prenotazione "{name}"?',
'reservations.confirm.deleteTitle': 'Eliminare la prenotazione?',
'reservations.confirm.deleteBody': '"{name}" verrà eliminato in modo permanente.',
'reservations.toast.updated': 'Prenotazione aggiornata',
'reservations.toast.removed': 'Prenotazione eliminata',
'reservations.toast.fileUploaded': 'File caricato',
@@ -792,6 +865,9 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'budget.paid': 'Pagato',
'budget.open': 'Aperto',
'budget.noMembers': 'Nessun membro assegnato',
'budget.settlement': 'Regolamento',
'budget.settlementInfo': 'Clicca sull\'avatar di un membro su una voce di budget per contrassegnarlo in verde — significa che ha pagato. Il regolamento mostra poi chi deve quanto a chi.',
'budget.netBalances': 'Saldi netti',
// Files
'files.title': 'File',
@@ -845,6 +921,15 @@ const it: Record<string, string | { name: string; category: string }[]> = {
// Packing
'packing.title': 'Lista valigia',
'packing.empty': 'La lista valigia è vuota',
'packing.import': 'Importa',
'packing.importTitle': 'Importa lista valigia',
'packing.importHint': 'Un elemento per riga. Formato: Categoria, Nome, Peso in g (opzionale), Borsa (opzionale), checked/unchecked (opzionale)',
'packing.importPlaceholder': 'Igiene, Spazzolino\nAbbigliamento, Magliette, 200\nDocumenti, Passaporto, , Bagaglio a mano\nElettronica, Caricabatterie, 50, Valigia, checked',
'packing.importCsv': 'Carica CSV/TXT',
'packing.importAction': 'Importa {count}',
'packing.importSuccess': '{count} elementi importati',
'packing.importError': 'Importazione non riuscita',
'packing.importEmpty': 'Nessun elemento da importare',
'packing.progress': '{packed} di {total} in valigia ({percent}%)',
'packing.clearChecked': 'Rimuovi {count} spuntati',
'packing.clearCheckedShort': 'Rimuovi {count}',
@@ -996,7 +1081,27 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'backup.auto.enable': 'Abilita auto-backup',
'backup.auto.enableHint': 'I backup verranno creati automaticamente in base alla pianificazione scelta',
'backup.auto.interval': 'Intervallo',
'backup.auto.hour': 'Esegui all\'ora',
'backup.auto.hourHint': 'Ora locale del server (formato {format})',
'backup.auto.dayOfWeek': 'Giorno della settimana',
'backup.auto.dayOfMonth': 'Giorno del mese',
'backup.auto.dayOfMonthHint': 'Limitato a 128 per compatibilità con tutti i mesi',
'backup.auto.scheduleSummary': 'Pianificazione',
'backup.auto.summaryDaily': 'Ogni giorno alle {hour}:00',
'backup.auto.summaryWeekly': 'Ogni {day} alle {hour}:00',
'backup.auto.summaryMonthly': 'Giorno {day} di ogni mese alle {hour}:00',
'backup.auto.envLocked': 'Docker',
'backup.auto.envLockedHint': 'L\'auto-backup è configurato tramite variabili d\'ambiente Docker. Per modificare queste impostazioni, aggiorna il tuo docker-compose.yml e riavvia il container.',
'backup.auto.copyEnv': 'Copia variabili env Docker',
'backup.auto.envCopied': 'Variabili env Docker copiate negli appunti',
'backup.auto.keepLabel': 'Elimina i vecchi backup dopo',
'backup.dow.sunday': 'Dom',
'backup.dow.monday': 'Lun',
'backup.dow.tuesday': 'Mar',
'backup.dow.wednesday': 'Mer',
'backup.dow.thursday': 'Gio',
'backup.dow.friday': 'Ven',
'backup.dow.saturday': 'Sab',
'backup.interval.hourly': 'Ogni ora',
'backup.interval.daily': 'Giornaliero',
'backup.interval.weekly': 'Settimanale',