Resitel uz neni vlastni zaznam spojeny s uctem pres e-mail: je to clenstvi uctu ve firme a jeho ID je ID uctu. Popisek, kapacita, externi ID a zapnuti visi na clenstvi, takze clovek ve dvou firmach je v kazde jinak a spravce firmy ho vypne jen u sebe. Odebrani z firmy odebere jen clenstvi. Stara data se pri startu jednou prevedou (migratePeople.ts), vcetne odkazu v ticketech, skupinach, automatizacich, akcich a widgetech. Sprava lidi v zalozce Lide zaklada ucty, pozvanka uz nema volbu resitele. Zalozeni firmy z registru ARES: hledani podle IC nebo nazvu, dotazeni IC, DIC, sidla a pravni formy, vyber soucasnych statutarnich zastupcu a prokury, ucty spravce firmy s nahradnim e-mailem IC-poradi@placeholder.cz. Vychozi rozlozeni dashboardu bez resitele neobsahuje list.myTickets. Prepinani jazyku je docasne schovane (MULTILANG_ENABLED), web je cesky. Dokumentace aktualizovana. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
4.1 KiB
23 - Jazyky
Mechanismus je hotovy a overeny. Verejny web je prelozeny cely, portal za prihlasenim jen ve spolecnych castech.
Prepinani je docasne schovane (rozhodnuti 2026-09-09, do rozhodnuti
o znacce): MULTILANG_ENABLED = false v web/src/i18n/index.ts. Prepinac
se nekresli, vzdy se pouzije cestina a ulozena volba en se ignoruje, aby
nikdo nezustal v anglictine bez moznosti prepnout zpet. Slovniky zustavaji,
zapnuti je zmena jedne konstanty.
Jak to funguje
| Co | Kde |
|---|---|
| Vrstva, prepinani | web/src/i18n/index.ts |
| Ceske texty | web/src/i18n/cs.ts |
| Anglicke texty | web/src/i18n/en.ts |
| Prepinac v rozhrani | web/src/components/layout/LanguageSwitch.tsx |
Vybrany jazyk je jedna hodnota pro celou aplikaci, drzena v modulu mimo
React. Je to tentyz vzorec jako u vybrane firmy (lib/tenant.ts) a ze stejneho
duvodu: hodnota musi byt dostupna i mimo komponenty a prepnuti nesmi byt stav
jedne stranky.
Volba se uklada a prezije obnoveni stranky. Pri prvnim nacteni rozhoduje ulozena volba, pak jazyk prohlizece, pak cestina.
Pri kazde zmene se prepisuje i <html lang>. Ctecky a prohlizece podle nej
poznaji jazyk stranky a nenabizeji preklad textu, ktery uz prelozeny je.
Klice jsou ploche
t('hero.titleAccent') // ne t('hero').titleAccent
Ploche klice jdou vygrepovat: grep "hero.titleAccent" najde definici
i vsechna pouziti. U zanorenych objektu to nejde a prave tohle clovek pri
prekladu dela nejcasteji.
Chybejici preklad nespadne
en.ts je Partial, takze nemusi byt uplny. Co v nem neni, spadne
na cestinu:
const text = dictionaries[locale][key] ?? cs[key] ?? key;
Diky tomu jde preklad doplnovat po castech. Kdyby anglictina musela byt uplna, znamenal by kazdy novy cesky text rozbity build, dokud ho nekdo neprelozi - a vysledkem by bylo, ze se texty nepridavaji.
Cestina je zaroven zaloha, takze nedokoncena anglictina znamena misty cestinu.
To je horsi nez hotovy preklad, ale lepsi nez prazdno nebo hero.title
v nadpisu.
Co uz je prelozene
| Cast | Stav |
|---|---|
| Hlavicka, navigace a mobilni menu | hotovo |
| Homepage vcetne Produktu, Referenci a Postupu | hotovo |
| Paticka | hotovo |
| Stranky O nas, Sluzby, Kontakt, 404 | hotovo |
| Prihlaseni | hotovo, vcetne hlasky o vyprselem prihlaseni |
DataState a ErrorBoundary |
hotovo - stavy nacitani a chyby jsou vsude |
| Portal za prihlasenim | ne, stranky dashboardu maji texty v kodu |
Pro prelozene casti je en.ts uplna, nikde nespada na cestinu. Zbytek je
mechanicky: text ven do cs.ts, klic do en.ts, v komponente
const t = useT() a {t('klic')}. Zadna dalsi prace na vrstve uz potreba neni.
Co se neprekada
Jmeno znacky, kontakty, ICO a adresa zustavaji v config/brand.ts. Nemeni se
s jazykem a mit je ve slovniku dvakrat by znamenalo, ze se jednou zmeni jen
jedno misto.
Claim se prekada (brand.claim), protoze to je text, ne udaj.
Co chybi
| Chybi | Poznamka |
|---|---|
| Stranky portalu | viz tabulka vys |
| Jazyk v adrese | /en/sluzby misto volby v prohlizeci. Chce to kvuli vyhledavacum |
| Preklad dat ze serveru | nazvy sluzeb, stavu a chybovych hlasek chodi z API cesky |
| Format cisel a datumu | toLocaleString se zatim vola natvrdo s cs-CZ |