Prava a bezpecnost: spravce firmy uz nemuze nastavit priznak spravce platformy ani clenstvi v cizi firme; pozvanky, konektory a automatizace kontroluji sve pravo; cizi firma v query je 404; zivy stream posila udalosti jen firmam, kterych se tykaji; akce nad ticketem maji kontrolu prava za firmu ticketu a strop viditelnosti; tokeny se nelogujou; limit pokusu na prihlaseni, kontakt a pozvanky; bezpecnostni hlavicky; zachyceni chyb v async handlerech; timing-safe porovnani tokenu. Vykon: audit neskenuje celou kolekci pri kazdem zapisu a konecne maze firemni zaznamy; ticket se uklada jednou misto trikrat; zapisy do Postgresu jsou serializovane podle ID; prava se pocitaji jednou na request; widgety nacitaji tickety jednou; strankovani seznamu; worker je pool misto kol; na webu udalost ze streamu neodmontuje stranku, dotazy maji spolecny debounce a cache, ciselniky drzi typovany sklad. Runtime: opakuji se jen chyby oznacene retryable; smycka nenarazi na strop 50 kroku (novy strop 1000 akci); podminka nad datem funguje; vystup MCP nastroje neprepisuje spoustec; sandbox skriptu firmy nejde opustit; MCP session id se drzi mezi volanimi; incident z kroku patri firme; jedno rozhodnuti o rezimu uloziste; snapshot neprepise soubor po chybe cteni. Refaktory: sdilene typy API v src/shared (web nic nekopiruje, osm rozjetych tvaru sjednoceno); spolecny modul net/guard pro volani ven; formularova vrstva ui/form; rozdeleni Connectors a FlowCanvas; jeden helper pro firmu z query, validaci a CRUD udalosti; pomucky ctx.util pro skripty konektoru; i18n verejneho webu vcetne anglictiny. Nova funkce: zalozeni firmy z registru ARES v Nastaveni (IC nebo nazev, dotazeni IC, DIC, sidla a pravni formy, vyber soucasnych statutarnich zastupcu a prokury, ucty spravce firmy s nahradnim e-mailem IC-poradi@placeholder.cz). Dokumentace: zaznam v 99-zmeny.md a aktualizace 15 dalsich dokumentu. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
3.8 KiB
23 - Jazyky
Mechanismus je hotovy a overeny. Verejny web je prelozeny cely, portal za prihlasenim jen ve spolecnych castech.
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 |