Merge branch 'pr-130' into dev

This commit is contained in:
Maurice
2026-03-30 21:02:32 +02:00
2 changed files with 807 additions and 3 deletions

View File

@@ -9,6 +9,7 @@ import zh from './translations/zh'
import nl from './translations/nl'
import ar from './translations/ar'
import br from './translations/br'
import cs from './translations/cs'
type TranslationStrings = Record<string, string | { name: string; category: string }[]>
@@ -19,13 +20,14 @@ export const SUPPORTED_LANGUAGES = [
{ value: 'fr', label: 'Français' },
{ value: 'nl', label: 'Nederlands' },
{ value: 'br', label: 'Português (Brasil)' },
{ value: 'cs', label: 'Česky' },
{ value: 'ru', label: 'Русский' },
{ value: 'zh', label: '中文' },
{ value: 'ar', label: 'العربية' },
] as const
const translations: Record<string, TranslationStrings> = { de, en, es, fr, ru, zh, nl, ar, br }
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' }
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 RTL_LANGUAGES = new Set(['ar'])
export function getLocaleForLanguage(language: string): string {
@@ -34,7 +36,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'].includes(language) ? language : 'en'
return ['de', 'es', 'fr', 'ru', 'zh', 'nl', 'ar', 'cs'].includes(language) ? language : 'en'
}
export function isRtlLanguage(language: string): boolean {

View File

@@ -0,0 +1,802 @@
const cs: Record<string, string | { name: string; category: string }[]> = {
// Společné (Common)
'common.save': 'Uložit',
'common.cancel': 'Zrušit',
'common.delete': 'Smazat',
'common.edit': 'Upravit',
'common.add': 'Přidat',
'common.loading': 'Načítání...',
'common.error': 'Chyba',
'common.back': 'Zpět',
'common.all': 'Vše',
'common.close': 'Zavřít',
'common.open': 'Otevřít',
'common.upload': 'Nahrát',
'common.search': 'Hledat',
'common.confirm': 'Potvrdit',
'common.ok': 'OK',
'common.yes': 'Ano',
'common.no': 'Ne',
'common.nebo': 'nebo',
'common.none': 'Žádné',
'common.date': 'Datum',
'common.rename': 'Přejmenovat',
'common.name': 'Jméno',
'common.email': 'E-mail',
'common.password': 'Heslo',
'common.saving': 'Ukládání...',
'common.update': 'Aktualizovat',
'common.change': 'Změnit',
'common.uploading': 'Nahrávání…',
'common.backToPlanning': 'Zpět k plánování',
'common.reset': 'Resetovat',
// Navigační lišta (Navbar)
'nav.trip': 'Cesta',
'nav.share': 'Sdílet',
'nav.settings': 'Nastavení',
'nav.admin': 'Administrace',
'nav.logout': 'Odhlásit se',
'nav.lightMode': 'Světlý režim',
'nav.darkMode': 'Tmavý režim',
'nav.autoMode': 'Automatický režim',
'nav.administrator': 'Administrátor',
'nav.myTrips': 'Moje cesty',
// Přehled (Dashboard)
'dashboard.title': 'Moje cesty',
'dashboard.subtitle.loading': 'Načítání cest...',
'dashboard.subtitle.cest': '{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',
'dashboard.subtitle.archivedSuffix': ' · {count} archivováno',
'dashboard.newTrip': 'Nová cesta',
'dashboard.gridView': 'Mřížka',
'dashboard.listView': 'Seznam',
'dashboard.currency': 'Měna',
'dashboard.timezone': 'Časová pásma',
'dashboard.localTime': 'Místní čas',
'dashboard.timezoneCustomTitle': 'Vlastní pásmo',
'dashboard.timezoneCustomLabelPlaceholder': 'Popisek (volitelné)',
'dashboard.timezoneCustomTzPlaceholder': 'např. America/New_York',
'dashboard.timezoneCustomAdd': 'Přidat',
'dashboard.timezoneCustomErrorEmpty': 'Zadejte identifikátor pásma',
'dashboard.timezoneCustomErrorInvalid': 'Neplatné pásmo. Použijte formát jako např. Europe/Prague',
'dashboard.timezoneCustomErrorDuplicate': 'Již bylo přidáno',
'dashboard.emptyTitle': 'Zatím žádné cesty',
'dashboard.emptyText': 'Vytvořte svou první cestu a začněte plánovat!',
'dashboard.emptyButton': 'Vytvořit první cestu',
'dashboard.nextTrip': 'Další cesta',
'dashboard.shared': 'Sdílené',
'dashboard.sharedBy': 'Sdílí {name}',
'dashboard.days': 'Dní',
'dashboard.places': 'Míst',
'dashboard.archive': 'Archivovat',
'dashboard.restore': 'Obnovit',
'dashboard.archived': 'Archivováno',
'dashboard.status.ongoing': 'Probíhající',
'dashboard.status.today': 'Dnes',
'dashboard.status.tomorrow': 'Zítra',
'dashboard.status.past': 'Proběhlé',
'dashboard.status.daysLeft': 'zbývá {count} dní',
'dashboard.toast.loadError': 'Nepodařilo se načíst cesty',
'dashboard.toast.created': 'Cesta byla úspěšně vytvořena!',
'dashboard.toast.createError': 'Nepodařilo se vytvořit cestu',
'dashboard.toast.updated': 'Cesta byla aktualizována!',
'dashboard.toast.updateError': 'Nepodařilo se aktualizovat cestu',
'dashboard.toast.deleted': 'Cesta byla smazána',
'dashboard.toast.deleteError': 'Nepodařilo se smazat cestu',
'dashboard.toast.archived': 'Cesta byla archivována',
'dashboard.toast.archiveError': 'Nepodařilo se archivovat cestu',
'dashboard.toast.restored': 'Cesta byla obnovena',
'dashboard.toast.restoreError': 'Nepodařilo se obnovit cestu',
'dashboard.confirm.delete': 'Smazat cestu „{title}“? Všechna místa a plány budou trvale smazány.',
'dashboard.editTrip': 'Upravit cestu',
'dashboard.createTrip': 'Vytvořit novou cestu',
'dashboard.tripTitle': 'Název',
'dashboard.tripTitlePlaceholder': 'např. Léto v Japonsku',
'dashboard.tripDescription': 'Popis',
'dashboard.tripDescriptionPlaceholder': 'O čem je tato cesta?',
'dashboard.startDate': 'Datum začátku',
'dashboard.endDate': 'Datum konce',
'dashboard.noDateHint': 'Datum nezadáno výchozí délka nastavena na 7 dní. Toto lze kdykoli změnit.',
'dashboard.coverImage': 'Úvodní obrázek',
'dashboard.addCoverImage': 'Vybrat úvodní obrázek (nebo přetáhnout sem)',
'dashboard.addMembers': 'Spolucestující',
'dashboard.addMember': 'Přidat člena',
'dashboard.coverSaved': 'Úvodní obrázek uložen',
'dashboard.coverUploadError': 'Nahrávání se nezdařilo',
'dashboard.coverRemoveError': 'Odstranění se nezdařilo',
'dashboard.titleRequired': 'Název je povinný',
'dashboard.endDateError': 'Datum konce musí být po datu začátku',
// Nastavení (Settings)
'settings.title': 'Nastavení',
'settings.subtitle': 'Upravte své osobní nastavení',
'settings.map': 'Mapy',
'settings.mapTemplate': 'Šablona mapy',
'settings.mapTemplatePlaceholder.select': 'Vyberte šablonu...',
'settings.mapDefaultHint': 'Ponechte prázdné pro OpenStreetMap (výchozí)',
'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'settings.mapHint': 'URL šablony pro mapové dlaždice',
'settings.latitude': 'Zeměpisná šířka',
'settings.longitude': 'Zeměpisná délka',
'settings.saveMap': 'Uložit nastavení mapy',
'settings.apiKeys': 'API klíče',
'settings.mapsKey': 'Google Maps API klíč',
'settings.mapsKeyHint': 'Pro vyhledávání míst. Vyžaduje Places API (New). Získáte na console.cloud.google.com',
'settings.weatherKey': 'OpenWeatherMap API klíč',
'settings.weatherKeyHint': 'Pro předpověď počasí. Zdarma na openweathermap.org/api',
'settings.keyPlaceholder': 'Vložte klíč...',
'settings.configured': 'Nastaveno',
'settings.saveKeys': 'Uložit klíče',
'settings.display': 'Zobrazení',
'settings.colorMode': 'Barevné schéma',
'settings.light': 'Světlé',
'settings.dark': 'Tmavé',
'settings.auto': 'Automatické',
'settings.language': 'Jazyk',
'settings.temperature': 'Jednotky teploty',
'settings.timeFormat': 'Formát času',
'settings.routeCalculation': 'Výpočet trasy',
'settings.on': 'Zapnuto',
'settings.off': 'Vypnuto',
'settings.account': 'Účet',
'settings.username': 'Uživatelské jméno',
'settings.email': 'E-mail',
'settings.role': 'Role',
'settings.roleAdmin': 'Administrátor',
'settings.oidcLinked': 'Propojeno přes',
'settings.changePassword': 'Změnit heslo',
'settings.currentPassword': 'Současné heslo',
'settings.currentPasswordRequired': 'Současné heslo je vyžadováno',
'settings.newPassword': 'Nové heslo',
'settings.confirmPassword': 'Potvrdit nové heslo',
'settings.updatePassword': 'Aktualizovat heslo',
'settings.passwordRequired': 'Zadejte prosím současné i nové heslo',
'settings.passwordTooShort': 'Heslo musí mít alespoň 8 znaků',
'settings.passwordMismatch': 'Hesla se neshodují',
'settings.passwordWeak': 'Heslo musí obsahovat velké a malé písmeno a číslici',
'settings.passwordChanged': 'Heslo bylo úspěšně změněno',
'settings.deleteAccount': 'Smazat účet',
'settings.deleteAccountTitle': 'Smazat váš účet?',
'settings.deleteAccountWarning': 'Váš účet a všechny vaše cesty, místa a soubory budou trvale smazány. Tuto akci nelze vrátit.',
'settings.deleteAccountConfirm': 'Smazat natrvalo',
'settings.deleteBlockedTitle': 'Účet nelze smazat',
'settings.deleteBlockedMessage': 'Jste jediným administrátorem. Před smazáním svého účtu předejte roli administrátora jinému uživateli.',
'settings.roleUser': 'Uživatel',
'settings.saveProfile': 'Uložit profil',
'settings.toast.mapSaved': 'Nastavení map uloženo',
'settings.toast.keysSaved': 'API klíče uloženy',
'settings.toast.displaySaved': 'Nastavení zobrazení uloženo',
'settings.toast.profileSaved': 'Profil byl uložen',
'settings.uploadAvatar': 'Nahrát profilový obrázek',
'settings.removeAvatar': 'Odebrat profilový obrázek',
'settings.avatarUploaded': 'Profilový obrázek byl aktualizován',
'settings.avatarRemoved': 'Profilový obrázek byl odstraněn',
'settings.avatarError': 'Nahrávání se nezdařilo',
'settings.mfa.title': 'Dvoufaktorové ověření (2FA)',
'settings.mfa.description': 'Přidá druhý stupeň zabezpečení při přihlašování e-mailem a heslem. Použijte aplikaci (Google Authenticator, Authy apod.).',
'settings.mfa.enabled': '2FA je pro váš účet aktivní.',
'settings.mfa.disabled': '2FA není aktivní.',
'settings.mfa.setup': 'Nastavit autentizační aplikaci',
'settings.mfa.scanQr': 'Naskenujte tento QR kód ve vaší aplikaci nebo zadejte kód ručně.',
'settings.mfa.secretLabel': 'Tajný klíč (pro ruční zadání)',
'settings.mfa.codePlaceholder': '6místný kód',
'settings.mfa.enable': 'Zapnout 2FA',
'settings.mfa.cancelSetup': 'Zrušit',
'settings.mfa.disableTitle': 'Vypnout 2FA',
'settings.mfa.disableHint': 'Zadejte své heslo k účtu a aktuální kód z aplikace.',
'settings.mfa.disable': 'Vypnout 2FA',
'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',
// Přihlášení (Login)
'login.error': 'Přihlášení se nezdařilo. Zkontrolujte prosím své údaje.',
'login.tagline': 'Vaše cesty.\nVáš plán.',
'login.description': 'Plánujte cesty společně s interaktivními mapami, rozpočty a synchronizací v reálném čase.',
'login.features.maps': 'Interaktivní mapy',
'login.features.mapsDesc': 'Google Places, trasy a shlukování bodů',
'login.features.realtime': 'Synchronizace v reálném čase',
'login.features.realtimeDesc': 'Plánujte společně přes WebSocket',
'login.features.budget': 'Sledování rozpočtu',
'login.features.budgetDesc': 'Kategorie, grafy a náklady na osobu',
'login.features.collab': 'Spolupráce',
'login.features.collabDesc': 'Více uživatelů se sdílenými cestami',
'login.features.packing': 'Seznamy věcí',
'login.features.packingDesc': 'Kategorie, pokrok v balení a návrhy',
'login.features.bookings': 'Rezervace',
'login.features.bookingsDesc': 'Lety, hotely, restaurace a další',
'login.features.files': 'Dokumenty',
'login.features.filesDesc': 'Nahrávejte a spravujte dokumenty',
'login.features.routes': 'Chytré trasy',
'login.features.routesDesc': 'Automatická optimalizace a export do Google Maps',
'login.selfHosted': 'Self-hosted · Open Source · Vaše data zůstávají u vás',
'login.title': 'Přihlásit se',
'login.subtitle': 'Vítejte zpět',
'login.signingIn': 'Přihlašování…',
'login.signIn': 'Přihlásit se',
'login.createAdmin': 'Vytvořit účet administrátora',
'login.createAdminHint': 'Nastavte první administrátorský účet pro TREK.',
'login.createAccount': 'Vytvořit účet',
'login.createAccountHint': 'Zaregistrujte si nový účet.',
'login.creating': 'Vytváření…',
'login.noAccount': 'Nemáte účet?',
'login.hasAccount': 'Již máte účet?',
'login.register': 'Registrovat se',
'login.emailPlaceholder': 'vas@email.cz',
'login.username': 'Uživatelské jméno',
'login.oidc.registrationDisabled': 'Registrace je zakázána. Kontaktujte svého administrátora.',
'login.oidc.noEmail': 'Od poskytovatele nebyl přijat žádný e-mail.',
'login.oidc.tokenFailed': 'Ověření se nezdařilo.',
'login.oidc.invalidState': 'Neplatná relace. Zkuste to prosím znovu.',
'login.demoFailed': 'Přihlášení do dema se nezdařilo',
'login.oidcSignIn': 'Přihlásit se přes {name}',
'login.oidcOnly': 'Ověřování heslem je zakázáno. Přihlaste se prosím přes SSO poskytovatele.',
'login.demoHint': 'Vyzkoušejte demo registrace není nutná',
'login.mfaTitle': 'Dvoufaktorové ověření',
'login.mfaSubtitle': 'Zadejte 6místný kód z vaší autentizační aplikace.',
'login.mfaCodeLabel': 'Ověřovací kód',
'login.mfaCodeRequired': 'Zadejte kód z aplikace.',
'login.mfaHint': 'Otevřete Google Authenticator, Authy nebo jinou TOTP aplikaci.',
'login.mfaBack': '← Zpět k přihlášení',
'login.mfaVerify': 'Ověřit',
// Registrace (Register)
'register.passwordMismatch': 'Hesla se neshodují',
'register.passwordTooShort': 'Heslo musí mít alespoň 6 znaků',
'register.failed': 'Registrace se nezdařila',
'register.getStarted': 'Začínáme',
'register.subtitle': 'Vytvořte si účet a začněte plánovat svou vysněnou cestu.',
'register.feature1': 'Neomezené plány cest',
'register.feature2': 'Zobrazení na interaktivní mapě',
'register.feature3': 'Správa míst a kategorií',
'register.feature4': 'Sledování rezervací',
'register.feature5': 'Vytváření seznamů věcí',
'register.feature6': 'Ukládání fotek a souborů',
'register.createAccount': 'Vytvořit účet',
'register.startPlanning': 'Začít plánovat',
'register.minChars': 'Min. 6 znaků',
'register.confirmPassword': 'Potvrdit heslo',
'register.repeatPassword': 'Heslo znovu',
'register.registering': 'Registrace...',
'register.register': 'Registrovat se',
'register.hasAccount': 'Již máte účet?',
'register.signIn': 'Přihlásit se',
// Administrace (Admin)
'admin.title': 'Administrace',
'admin.subtitle': 'Správa uživatelů a systémová nastavení',
'admin.tabs.users': 'Uživatelé',
'admin.tabs.categories': 'Kategorie',
'admin.tabs.backup': 'Zálohování',
'admin.stats.users': 'Uživatelé',
'admin.stats.cest': 'Cesty',
'admin.stats.places': 'Místa',
'admin.stats.photos': 'Fotky',
'admin.stats.files': 'Soubory',
'admin.table.user': 'Uživatel',
'admin.table.email': 'E-mail',
'admin.table.role': 'Role',
'admin.table.created': 'Vytvořeno',
'admin.table.lastLogin': 'Poslední přihlášení',
'admin.table.actions': 'Akce',
'admin.you': '(Vy)',
'admin.editUser': 'Upravit uživatele',
'admin.newPassword': 'Nové heslo',
'admin.newPasswordHint': 'Ponechte prázdné pro zachování současného hesla',
'admin.deleteUser': 'Smazat uživatele „{name}“? Všechny jeho cesty budou trvale smazány.',
'admin.deleteUserTitle': 'Smazat uživatele',
'admin.newPasswordPlaceholder': 'Zadejte nové heslo…',
'admin.toast.loadError': 'Nepodařilo se načíst data administrace',
'admin.toast.userUpdated': 'Uživatel byl aktualizován',
'admin.toast.updateError': 'Aktualizace se nezdařila',
'admin.toast.userDeleted': 'Uživatel byl smazán',
'admin.toast.deleteError': 'Smazání se nezdařilo',
'admin.toast.cannotDeleteSelf': 'Nemůžete smazat svůj vlastní účet',
'admin.toast.userCreated': 'Uživatel byl vytvořen',
'admin.toast.createError': 'Nepodařilo se vytvořit uživatele',
'admin.toast.fieldsRequired': 'Uživatelské jméno, e-mail a heslo jsou povinné',
'admin.createUser': 'Vytvořit uživatele',
'admin.invite.title': 'Pozvánky',
'admin.invite.subtitle': 'Vytvářejte jednorázové registrační odkazy',
'admin.invite.create': 'Vytvořit odkaz',
'admin.invite.createAndCopy': 'Vytvořit a zkopírovat',
'admin.invite.empty': 'Zatím nebyly vytvořeny žádné pozvánky',
'admin.invite.maxUses': 'Max. použití',
'admin.invite.expiry': 'Vyprší za',
'admin.invite.uses': 'použito',
'admin.invite.expiresAt': 'vyprší',
'admin.invite.createdBy': 'vytvořil',
'admin.invite.active': 'Aktivní',
'admin.invite.expired': 'Expirované',
'admin.invite.usedUp': 'Využito',
'admin.invite.copied': 'Odkaz byl zkopírován do schránky',
'admin.invite.copyLink': 'Kopírovat odkaz',
'admin.invite.deleted': 'Pozvánka smazána',
'admin.invite.createError': 'Nepodařilo se vytvořit pozvánku',
'admin.invite.deleteError': 'Nepodařilo se smazat pozvánku',
'admin.tabs.settings': 'Nastavení',
'admin.allowRegistration': 'Povolit registraci',
'admin.allowRegistrationHint': 'Noví uživatelé se mohou sami registrovat',
'admin.apiKeys': 'API klíče',
'admin.apiKeysHint': 'Volitelné. Povoluje rozšířená data o místech (fotky, počasí).',
'admin.mapsKey': 'Google Maps API klíč',
'admin.mapsKeyHint': 'Povinné pro hledání míst. Získáte na console.cloud.google.com',
'admin.mapsKeyHintLong': 'Bez API klíče se pro hledání používá OpenStreetMap. S Google klíčem lze načítat fotky, hodnocení a otevírací dobu.',
'admin.recommended': 'Doporučeno',
'admin.weatherKey': 'OpenWeatherMap API klíč',
'admin.weatherKeyHint': 'Pro data o počasí. Zdarma na openweathermap.org',
'admin.validateKey': 'Testovat',
'admin.keyValid': 'Připojeno',
'admin.keyInvalid': 'Neplatný',
'admin.keySaved': 'API klíče byly uloženy',
'admin.oidcTitle': 'Jednotné přihlášení (OIDC)',
'admin.oidcSubtitle': 'Povolit přihlášení přes externí poskytovatele (Google, Apple, Authentik, Keycloak).',
'admin.oidcDisplayName': 'Zobrazované jméno',
'admin.oidcIssuer': 'URL vydavatele (Issuer)',
'admin.oidcIssuerHint': 'OpenID Connect Issuer URL, např. https://accounts.google.com',
'admin.oidcSaved': 'Konfigurace OIDC uložena',
'admin.oidcOnlyMode': 'Zakázat ověřování heslem',
'admin.oidcOnlyModeHint': 'Pokud je zapnuto, je povolen pouze SSO login. Registrace i přihlášení heslem budou zablokovány.',
// Typy souborů (File Types)
'admin.fileTypes': 'Povolené typy souborů',
'admin.fileTypesHint': 'Nastavte, které typy souborů mohou uživatelé nahrávat.',
'admin.fileTypesFormat': 'Přípony oddělené čárkou (např. jpg,png,pdf,doc). Použijte * pro všechny typy.',
'admin.fileTypesSaved': 'Nastavení souborů uloženo',
// Šablony balení (Packing Templates)
'admin.bagTracking.title': 'Sledování zavazadel',
'admin.bagTracking.subtitle': 'Povolit váhu a přiřazení k zavazadlům u položek balení',
'admin.tabs.config': 'Konfigurace',
'admin.tabs.templates': 'Šablony seznamů',
'admin.packingTemplates.title': 'Šablony pro balení',
'admin.packingTemplates.subtitle': 'Vytvářejte opakovaně použitelné seznamy pro své cesty',
'admin.packingTemplates.create': 'Nová šablona',
'admin.packingTemplates.namePlaceholder': 'Název šablony (např. Dovolená u moře)',
'admin.packingTemplates.empty': 'Zatím nejsou vytvořeny žádné šablony',
'admin.packingTemplates.items': 'položek',
'admin.packingTemplates.categories': 'kategorií',
'admin.packingTemplates.itemName': 'Název položky',
'admin.packingTemplates.itemCategory': 'Kategorie',
'admin.packingTemplates.categoryName': 'Název kategorie (např. Oblečení)',
'admin.packingTemplates.addCategory': 'Přidat kategorii',
'admin.packingTemplates.created': 'Šablona vytvořena',
'admin.packingTemplates.deleted': 'Šablona smazána',
'admin.packingTemplates.loadError': 'Nepodařilo se načíst šablony',
'admin.packingTemplates.createError': 'Nepodařilo se vytvořit šablonu',
'admin.packingTemplates.deleteError': 'Nepodařilo se smazat šablonu',
'admin.packingTemplates.saveError': 'Uložení se nezdařilo',
// Doplňky (Addons)
'admin.tabs.addons': 'Doplňky',
'admin.addons.title': 'Doplňky',
'admin.addons.subtitle': 'Zapněte nebo vypněte funkce a přizpůsobte si TREK.',
'admin.addons.catalog.memories.name': 'Vzpomínky',
'admin.addons.catalog.memories.description': 'Sdílená fotoalba pro každou cestu',
'admin.addons.catalog.packing.name': 'Balení',
'admin.addons.catalog.packing.description': 'Seznamy věcí pro přípravu na cestu',
'admin.addons.catalog.budget.name': 'Rozpočet',
'admin.addons.catalog.budget.description': 'Sledování výdajů a plánování rozpočtu cesty',
'admin.addons.catalog.documents.name': 'Dokumenty',
'admin.addons.catalog.documents.description': 'Ukládání a správa cestovních dokladů',
'admin.addons.catalog.vacay.name': 'Dovolená (Vacay)',
'admin.addons.catalog.vacay.description': 'Osobní plánovač dovolené s kalendářem',
'admin.addons.catalog.atlas.name': 'Atlas',
'admin.addons.catalog.atlas.description': 'Mapa světa s navštívenými zeměmi a statistikami',
'admin.addons.catalog.collab.name': 'Spolupráce',
'admin.addons.catalog.collab.description': 'Poznámky v reálném čase, hlasování a chat pro plánování',
'admin.addons.enabled': 'Povoleno',
'admin.addons.disabled': 'Zakázáno',
'admin.addons.type.trip': 'Cesta',
'admin.addons.type.global': 'Globální',
'admin.addons.tripHint': 'Dostupné jako karta v rámci každé cesty',
'admin.addons.globalHint': 'Dostupné jako samostatná sekce v hlavní navigaci',
'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',
// Počasí (Weather)
'admin.weather.title': 'Data o počasí',
'admin.weather.badge': 'Od 24. března 2026',
'admin.weather.description': 'TREK používá Open-Meteo jako zdroj dat. Je to bezplatná open-source služba není vyžadován API klíč.',
'admin.weather.forecast': 'Předpověď na 16 dní',
'admin.weather.forecastDesc': 'Dříve 5 dní (OpenWeatherMap)',
'admin.weather.climate': 'Historická klimatická data',
'admin.weather.climateDesc': 'Průměry za posledních 85 let pro dny mimo 16denní předpověď',
'admin.weather.requests': '10 000 požadavků denně',
'admin.weather.requestsDesc': 'Zdarma, bez nutnosti klíče',
'admin.weather.locationHint': 'Počasí se určuje podle prvního místa se souřadnicemi v daném dni.',
// Aktualizace (Updates)
'admin.update.available': 'Dostupná aktualizace',
'admin.update.text': 'TREK {version} je k dispozici. Aktuálně používáte verzi {current}.',
'admin.update.button': 'Zobrazit na GitHubu',
'admin.update.install': 'Instalovat aktualizaci',
'admin.update.confirmTitle': 'Instalovat aktualizaci?',
'admin.update.confirmText': 'TREK bude aktualizován z verze {current} na {version}. Server se poté automaticky restartuje.',
'admin.update.dataInfo': 'Všechna vaše data (cesty, uživatelé, API klíče, soubory) budou zachována.',
'admin.update.warning': 'Aplikace bude během restartu krátce nedostupná.',
'admin.update.confirm': 'Aktualizovat nyní',
'admin.update.installing': 'Aktualizace probíhá…',
'admin.update.success': 'Aktualizace byla nainstalována! Server se restartuje…',
'admin.update.failed': 'Aktualizace se nezdařila',
'admin.update.backupHint': 'Před aktualizací doporučujeme vytvořit zálohu.',
'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:',
// Vacay doplněk
'vacay.subtitle': 'Plánování a správa dovolené',
'vacay.settings': 'Nastavení',
'vacay.year': 'Rok',
'vacay.addYear': 'Přidat rok',
'vacay.removeYear': 'Odebrat rok',
'vacay.removeYearConfirm': 'Odebrat rok {year}?',
'vacay.removeYearHint': 'Všechny záznamy o dovolené a firemní svátky pro tento rok budou trvale smazány.',
'vacay.remove': 'Odebrat',
'vacay.persons': 'Osoby',
'vacay.noPersons': 'Žádné osoby nebyly přidány',
'vacay.addPerson': 'Přidat osobu',
'vacay.editPerson': 'Upravit osobu',
'vacay.removePerson': 'Odebrat osobu',
'vacay.removePersonConfirm': 'Odebrat osobu {name}?',
'vacay.personName': 'Jméno',
'vacay.personNamePlaceholder': 'Zadejte jméno',
'vacay.color': 'Barva',
'vacay.add': 'Přidat',
'vacay.legend': 'Legenda',
'vacay.publicHoliday': 'Státní svátek',
'vacay.companyHoliday': 'Firemní volno',
'vacay.weekend': 'Víkend',
'vacay.modeVacation': 'Dovolená',
'vacay.modeCompany': 'Firemní volno',
'vacay.entitlement': 'Nárok',
'vacay.entitlementDays': 'Dní',
'vacay.used': 'Vyčerpáno',
'vacay.remaining': 'Zbývá',
'vacay.carriedOver': 'z roku {year}',
'vacay.blockWeekends': 'Blokovat víkendy',
'vacay.blockWeekendsHint': 'Zamezit zadávání dovolené na víkendové dny',
'vacay.mon': 'Po',
'vacay.tue': 'Út',
'vacay.wed': 'St',
'vacay.thu': 'Čt',
'vacay.fri': 'Pá',
'vacay.sat': 'So',
'vacay.sun': 'Ne',
'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.noCalendars': 'Zatím nebyly přidány žádné svátkové kalendáře',
'vacay.companyHolidays': 'Firemní volno',
'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.owner': 'Vlastník',
'vacay.shareSuccess': 'Plán byl úspěšně sdílen',
'vacay.shareError': 'Nepodařilo se sdílet plán',
'vacay.dissolve': 'Zrušit propojení',
'vacay.dissolveHint': 'Znovu oddělit kalendáře. Vaše záznamy zůstanou zachovány.',
'vacay.dissolveAction': 'Oddělit',
'vacay.dissolved': 'Kalendáře byly odděleny',
'vacay.fusedWith': 'Propojeno s',
'vacay.you': 'vy',
'vacay.noData': 'Žádná data',
'vacay.changeColor': 'Změnit barvu',
'vacay.inviteUser': 'Pozvat uživatele',
'vacay.inviteHint': 'Pozvěte jiného uživatele TREK ke sdílení společného kalendáře dovolených.',
'vacay.selectUser': 'Vyberte uživatele',
'vacay.sendInvite': 'Odeslat pozvánku',
'vacay.inviteSent': 'Pozvánka odeslána',
'vacay.inviteError': 'Nepodařilo se odeslat pozvánku',
'vacay.pending': 'čeká na vyřízení',
'vacay.accept': 'Přijmout',
'vacay.decline': 'Odmítnout',
'vacay.acceptFusion': 'Přijmout a propojit',
'vacay.inviteTitle': 'Žádost o propojení',
'vacay.inviteWantsToFuse': 'vás zve ke sdílení kalendáře dovolených.',
'vacay.fuseInfo1': 'Oba uvidíte všechny záznamy v jednom sdíleném kalendáři.',
'vacay.fuseInfo2': 'Obě strany mohou vytvářet a upravovat záznamy tomu druhému.',
'vacay.fuseInfo3': 'Obě strany mohou měnit nároky na dovolenou.',
'vacay.fuseInfo4': 'Nastavení (svátky, firemní volno) jsou sdílená.',
'vacay.fuseInfo5': 'Propojení lze kdykoli zrušit bez ztráty dat.',
// Atlas doplněk
'atlas.subtitle': 'Vaše stopa ve světě',
'atlas.countries': 'Země',
'atlas.cest': 'Cesty',
'atlas.places': 'Místa',
'atlas.unmark': 'Odebrat',
'atlas.confirmMark': 'Označit tuto zemi jako navštívenou?',
'atlas.confirmUnmark': 'Odebrat tuto zemi ze seznamu navštívených?',
'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.addToBucketHint': 'Uložit jako místo, které chcete navštívit',
'atlas.bucketWhen': 'Kdy plánujete návštěvu?',
'atlas.statsTab': 'Statistiky',
'atlas.bucketTab': 'Bucket List',
'atlas.addBucket': 'Přidat na Bucket List',
'atlas.bucketNamePlaceholder': 'Místo nebo destinace...',
'atlas.bucketNotesPlaceholder': 'Poznámky (volitelné)',
'atlas.bucketEmpty': 'Váš seznam přání je prázdný',
'atlas.bucketEmptyHint': 'Přidejte místa, která sníte navštívit',
'atlas.days': 'Dní',
'atlas.visitedCountries': 'Navštívené země',
'atlas.cities': 'Města',
'atlas.noData': 'Zatím žádná cestovatelská data',
'atlas.noDataHint': 'Vytvořte cestu a přidejte místa, abyste viděli svou mapu světa',
'atlas.lastTrip': 'Poslední cesta',
'atlas.nextTrip': 'Další cesta',
'atlas.daysLeft': 'dní zbývá',
'atlas.streak': 'Série',
'atlas.year': 'rok',
'atlas.years': 'roky/let',
'atlas.yearInRow': 'rok v řadě',
'atlas.yearsInRow': 'let v řadě',
'atlas.tripIn': 'cesta v roce',
'atlas.tripsIn': 'cest v roce',
'atlas.since': 'od',
'atlas.europe': 'Evropa',
'atlas.asia': 'Asie',
'atlas.northAmerica': 'S. Amerika',
'atlas.southAmerica': 'J. Amerika',
'atlas.africa': 'Afrika',
'atlas.oceania': 'Oceánie',
'atlas.other': 'Ostatní',
'atlas.firstVisit': 'První cesta',
'atlas.lastVisitLabel': 'Poslední cesta',
'atlas.tripSingular': 'Cesta',
'atlas.tripPlural': 'Cesty',
'atlas.placeVisited': 'Navštívené místo',
'atlas.placesVisited': 'Navštívená místa',
// Plánovač cesty (Trip Planner)
'trip.tabs.plan': 'Plán',
'trip.tabs.reservations': 'Rezervace',
'trip.tabs.reservationsShort': 'Rez.',
'trip.tabs.packing': 'Seznam věcí',
'trip.tabs.packingShort': 'Balení',
'trip.tabs.budget': 'Rozpočet',
'trip.tabs.files': 'Soubory',
'trip.loading': 'Načítání cesty...',
'trip.mobilePlan': 'Plán',
'trip.mobilePlaces': 'Místa',
'trip.toast.placeUpdated': 'Místo bylo aktualizováno',
'trip.toast.placeAdded': 'Místo bylo přidáno',
'trip.toast.placeDeleted': 'Místo bylo smazáno',
'trip.toast.selectDay': 'Prosím nejdříve vyberte den',
'trip.toast.assignedToDay': 'Místo bylo přiřazeno ke dni',
'trip.toast.reorderError': 'Nepodařilo se změnit pořadí',
'trip.toast.reservationUpdated': 'Rezervace aktualizována',
'trip.toast.reservationAdded': 'Rezervace přidána',
'trip.toast.deleted': 'Smazáno',
'trip.confirm.deletePlace': 'Opravdu chcete toto místo smazat?',
// Denní plán (Day Plan)
'dayplan.emptyDay': 'Na tento den nejsou naplánována žádná místa',
'dayplan.addNote': 'Přidat poznámku',
'dayplan.editNote': 'Upravit poznámku',
'dayplan.noteAdd': 'Přidat poznámku',
'dayplan.noteEdit': 'Upravit poznámku',
'dayplan.noteTitle': 'Poznámka',
'dayplan.noteSubtitle': 'Poznámka ke dni',
'dayplan.totalCost': 'Celkové náklady',
'dayplan.days': 'Dny',
'dayplan.dayN': 'Den {n}',
'dayplan.calculating': 'Počítání...',
'dayplan.route': 'Trasa',
'dayplan.optimize': 'Optimalizovat',
'dayplan.optimized': 'Trasa optimalizována',
'dayplan.routeError': 'Nepodařilo se vypočítat trasu',
'dayplan.toast.needTwoPlaces': 'Pro optimalizaci trasy jsou potřeba alespoň dvě místa',
'dayplan.toast.routeOptimized': 'Trasa byla optimalizována',
'dayplan.toast.noGeoPlaces': 'Nebyla nalezena žádná místa se souřadnicemi pro výpočet trasy',
'dayplan.confirmed': 'Potvrzeno',
'dayplan.pendingRes': 'Čeká na potvrzení',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportovat denní plán do PDF',
'dayplan.pdfError': 'Export do PDF se nezdařil',
// Boční panel míst (Places Sidebar)
'places.addPlace': 'Přidat místo/aktivitu',
'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.count': '{count} míst',
'places.countSingular': '1 místo',
'places.allPlanned': 'Všechna místa jsou naplánována',
'places.noneFound': 'Žádná místa nebyla nalezena',
'places.editPlace': 'Upravit místo',
'places.formName': 'Název',
'places.formNamePlaceholder': 'např. Eiffelova věž',
'places.formDescription': 'Popis',
'places.formDescriptionPlaceholder': 'Krátký popis...',
'places.formAddress': 'Adresa',
'places.formAddressPlaceholder': 'Ulice, město, země',
'places.formLat': 'Zeměpisná šířka',
'places.formLng': 'Zeměpisná délka',
'places.formCategory': 'Kategorie',
'places.noCategory': 'Bez kategorie',
'places.categoryNamePlaceholder': 'Název kategorie',
'places.formTime': 'Čas',
'places.startTime': 'Od',
'places.endTime': 'Do',
'places.endTimeBeforeStart': 'Čas konce je před časem začátku',
'places.timeCollision': 'Časový překryv s:',
'places.formWebsite': 'Webové stránky',
'places.formNotesPlaceholder': 'Osobní poznámky...',
'places.formReservation': 'Rezervace',
'places.reservationNotesPlaceholder': 'Poznámky k rezervaci, potvrzovací kód...',
'places.mapsSearchPlaceholder': 'Hledat místa...',
'places.mapsSearchError': 'Hledání místa se nezdařilo.',
'places.osmHint': 'Používáte hledání přes OpenStreetMap (bez fotek a hodnocení). Pro plné detaily přidejte Google API klíč v nastavení.',
'places.osmActive': 'Hledání přes OpenStreetMap.',
'places.categoryCreateError': 'Nepodařilo se vytvořit kategorii',
'places.nameRequired': 'Prosím zadejte název',
'places.saveError': 'Uložení se nezdařilo',
// Rezervace (Reservations)
'reservations.time': 'Čas',
'reservations.timeAlt': 'Čas (alternativní, např. 19:30)',
'reservations.notes': 'Poznámky',
'reservations.notesPlaceholder': 'Další poznámky...',
'reservations.meta.airline': 'Letecká společnost',
'reservations.meta.flightNumber': 'Číslo letu',
'reservations.meta.from': 'Z',
'reservations.meta.to': 'Do',
'reservations.meta.trainNumber': 'Číslo vlaku',
'reservations.meta.platform': 'Nástupiště',
'reservations.meta.seat': 'Sedadlo',
'reservations.meta.checkIn': 'Check-in',
'reservations.meta.checkOut': 'Check-out',
'reservations.meta.linkAccommodation': 'Ubytování',
'reservations.meta.pickAccommodation': 'Propojit s ubytováním',
'reservations.meta.noAccommodation': 'Nic',
'reservations.meta.hotelPlace': 'Ubytování',
'reservations.meta.pickHotel': 'Vybrat ubytování',
'reservations.meta.fromDay': 'Od dne',
'reservations.meta.toDay': 'Do dne',
'reservations.meta.selectDay': 'Vyberte den',
'reservations.type.flight': 'Let',
'reservations.type.hotel': 'Ubytování',
'reservations.type.restaurant': 'Restaurace',
'reservations.type.train': 'Vlak',
'reservations.type.car': 'Pronájem auta',
'reservations.type.cruise': 'Plavba',
'reservations.type.event': 'Událost',
'reservations.type.tour': 'Prohlídka',
'reservations.type.other': 'Jiné',
'reservations.confirm.delete': 'Opravdu chcete smazat rezervaci „{name}“?',
'reservations.toast.updated': 'Rezervace aktualizována',
'reservations.toast.removed': 'Rezervace smazána',
'reservations.toast.fileUploaded': 'Soubor byl nahrán',
'reservations.toast.uploadError': 'Nahrávání se nezdařilo',
'reservations.newTitle': 'Nová rezervace',
'reservations.bookingType': 'Typ rezervace',
'reservations.titleLabel': 'Název',
'reservations.titlePlaceholder': 'např. Let LH123, Hotel Adlon...',
'reservations.locationAddress': 'Místo / Adresa',
'reservations.locationPlaceholder': 'Adresa, letiště, hotel...',
'reservations.confirmationCode': 'Rezervační kód',
'reservations.confirmationPlaceholder': 'např. ABC12345',
'reservations.day': 'Den',
'reservations.noDay': 'Žádný den',
'reservations.place': 'Místo',
'reservations.noPlace': 'Žádné místo',
'reservations.pendingSave': 'bude uloženo…',
'reservations.uploading': 'Nahrávání...',
'reservations.attachFile': 'Přiložit soubor',
'reservations.linkExisting': 'Propojit stávající soubor',
'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}“?',
// Soubory (Files)
'files.toast.deleted': 'Soubor byl smazán',
'files.toast.deleteError': 'Nepodařilo se smazat soubor',
'files.sourcePlan': 'Denní plán',
'files.sourceBooking': 'Rezervace',
'files.attach': 'Přiložit',
'files.pasteHint': 'Můžete také vložit obrázek ze schránky (Ctrl+V)',
'files.trash': 'Koš',
'files.trashEmpty': 'Koš je prázdný',
'files.emptyTrash': 'Vysypat koš',
'files.restore': 'Obnovit',
'files.star': 'Označit hvězdičkou',
'files.unstar': 'Odebrat hvězdičku',
'files.assign': 'Přiřadit',
'files.assignTitle': 'Přiřadit soubor',
'files.assignPlace': 'Místo',
'files.assignBooking': 'Rezervace',
'files.unassigned': 'Nepřiřazeno',
'files.unlink': 'Zrušit propojení',
'files.toast.trashed': 'Přesunuto do koše',
'files.toast.restored': 'Soubor byl obnoven',
'files.toast.trashEmptied': 'Koš byl vysypán',
'files.toast.assigned': 'Soubor byl přiřazen',
'files.toast.assignError': 'Přiřazení se nezdařilo',
'files.toast.restoreError': 'Obnovení se nezdařilo',
'files.confirm.permanentDelete': 'Trvale smazat tento soubor? Tuto akci nelze vrátit.',
'files.confirm.emptyTrash': 'Trvale smazat všechny soubory v koši? Tuto akci nelze vrátit.',
'files.noteLabel': 'Poznámka',
'files.notePlaceholder': 'Přidat poznámku...',
// Balení (Packing)
'packing.title': 'Seznam věcí',
'packing.empty': 'Seznam věcí je prázdný',
'packing.progress': '{packed} z {total} zabaleno ({percent} %)',
'packing.clearChecked': 'Odstranit {count} hotových',
'packing.clearCheckedShort': 'Odstranit {count}',
'packing.suggestions': 'Návrhy',
'packing.suggestionsTitle': 'Přidat návrhy',
'packing.allSuggested': 'Všechny návrhy byly přidány',
'packing.allPacked': 'Vše je zabaleno!',
'packing.addPlaceholder': 'Přidat novou položku...',
'packing.categoryPlaceholder': 'Kategorie...',
'packing.filterAll': 'Vše',
'packing.filterOpen': 'K zabalení',
'packing.filterDone': 'Hotovo',
'packing.emptyTitle': 'Seznam věcí je prázdný',
'packing.emptyHint': 'Přidejte položky nebo použijte návrhy',
'packing.emptyFiltered': 'Žádné položky neodpovídají filtru',
'packing.menuRename': 'Přejmenovat',
'packing.menuCheckAll': 'Označit vše',
'packing.menuUncheckAll': 'Odznačit vše',
'packing.menuDeleteCat': 'Smazat kategorii',
'packing.assignUser': 'Přiřadit uživateli',
'packing.noMembers': 'Žádní členové cesty',
'packing.addItem': 'Přidat položku',
'packing.addItemPlaceholder': 'Název položky...',
'packing.addCategory': 'Přidat kategorii',
'packing.newCategoryPlaceholder': 'Název kategorie (např. Oblečení)',
// Spolupráce (Collab / Chat)
'collab.chat.today': 'Dnes',
'collab.chat.yesterday': 'Včera',
'collab.chat.deletedMessage': 'smazal zprávu',
'collab.chat.loadMore': 'Načíst starší zprávy',
'collab.chat.justNow': 'právě teď',
'collab.chat.minutesAgo': 'před {n} min',
'collab.chat.hoursAgo': 'před {n} h',
'collab.notes.title': 'Poznámky',
'collab.notes.new': 'Nová poznámka',
'collab.notes.empty': 'Zatím žádné poznámky',
'collab.notes.emptyHint': 'Začněte zapisovat nápady a plány',
'collab.notes.all': 'Vše',
'collab.notes.titlePlaceholder': 'Poznámka...',
'collab.notes.noCategory': 'Bez kategorie',
'collab.notes.color': 'Barva',
'collab.notes.save': 'Uložit',
'collab.notes.cancel': 'Zrušit',
'collab.notes.edit': 'Upravit',
'collab.notes.delete': 'Smazat',
'collab.notes.pin': 'Připnout',
'collab.notes.unpin': 'Odepnout',
'collab.notes.daysAgo': 'před {n} dny',
'collab.notes.categorySettings': 'Spravovat kategorie',
'collab.notes.create': 'Vytvořit',
'collab.notes.website': 'Webové stránky',
'collab.notes.websitePlaceholder': 'https://...',
'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.polls.title': 'Hlasování',
'collab.polls.new': 'Nové hlasování',
'collab.polls.empty': 'Zatím žádná hlasování',
'collab.polls.emptyHint': 'Zeptejte se skupiny a hlasujte společně',
'collab.polls.question': 'Otázka',
'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',
};