# 23 - Jazyky Rozdelane. Mechanismus je hotovy a overeny, prevod obsahu bezi po 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 ``. Ctecky a prohlizece podle nej poznaji jazyk stranky a nenabizeji preklad textu, ktery uz prelozeny je. ## Klice jsou ploche ```ts 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: ```ts 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 a mobilni menu | hotovo | | Hero vcetne snimku portalu | hotovo | | Pas s logy klientu | hotovo | | Cisla | hotovo | | Zaverecna vyzva | hotovo | | Paticka | castecne, sloupce odkazu zatim cesky | | Sekce Produkty, Reference, Postup | ne | | Stranky O nas, Sluzby, Kontakt, 404 | ne | | Portal za prihlasenim | ne | Prevod zbytku 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 | | ---------------------- | ----------------------------------------------------------------- | | Prevod zbytku obsahu | 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` |