Kdyby\Translation: předání locale v latte makru
- svezij
- Člen | 69
Ahojte, potřeboval bych přímo v podtržítkovém latte makru předat konkrétní locale. Je to nějak možné? V PHP souboru mohu napsat:
$this->translator->translate('messages.product.name', NULL, [], NULL, 'en_EN');
Je něco takového možno udělat i v latte? Např.:
{_messages.product.name locale=en_EN}
A ještě takový dotaz. Když použiju metodu translate() s parametrem locale, tak mi to úplně rozhodí překlady. Dochází tam k nějakým vnitřním změnám? Nenastavuje to například aktuální locale na to, co předávám v parametru metodě translate()? V případě, že se tam nic takového neděje, hodím sem celý příklad. Nicméně hlavní dotaz je to, co jsem uvedl výše. Díky.
- svezij
- Člen | 69
Souhlasím, ve většině případů to tak asi je, ale např. typicky název samotného locale je výjimkou. Popíšu. Mám překlady např. cs_CZ a en_EN. Mám tedy dva soubory: dict.cs_CZ.neon a dict.en_EN.neon. V nich budu mít např.:
dict.cs_CZ.neon
locale:
name: Česky
next: Další
prev: Předchozí
dict.en_EN.neon
locale:
name: English
next: Next
prev: Previous
A v latte chci vygenerovat samotný přepínač jazyků. Využiji proto nějakého cyklu který projde dostupné lokalizace a vytváří odkazy. Nicméně v tuto chvíli je jedno, ve kterém jsem jazyce. Jsem-li ve výchozí češtině a jsem angličan, potřebuji mít u odkazu přepnutí do svého jazyku napsáno English, nikoliv Anglicky. Tudíž např. přepínače jazyků jsou ve své podstatě nezávislé, ale zároveň mi přijde žádoucí mít to přávě ve slovníku k danému jazyku.
Vše bych překládal klasicky:
{_dict.prev} {_dict.next}
Ale přepínače např. takto:
<a n:foreach="$availableLocales as $current" n:href="this, locale => $current">
{_locale.name locale=$current}
</a>
Jojo, toto je trochu nestandardní. Dá se to ale např. také využít v administraci, kde překlady zapisuju. V databázi budu mít uložený překlad názvu výrobku v češtině a v angličtině, ale do formulářových políček nepotřebuji načíst jen to, které mi překládá administraci samotnou. Potřebuji načíst oba překlady.
Editoval svezij (14. 3. 2016 13:44)
- svezij
- Člen | 69
Opět ahoj, oki, trochu upravím svůj příklad:
dict.cs_CZ.neon
locales:
cs_CZ: Česky
en_EN: Anglicky
dict.en_EN.neon
locales:
cs_CZ: Czech
en_EN: English
Nyní, když budu chtít někam do stránek vypsat všechny dostupné jazykové mutace, tak to vypíšu podle aktuálně nastaveného locale, protože tady opravdu chci vypsat překlady pro aktuálně prohlížejícího uživatele, ale pokud budu chtít tyto překlady využít i pro samotný přepínač, pak budu v cyklu procházet překlady dict.locales, ale pro každé locale musím sáhnout do jeho vlastního dict.
Nebo ten příklad, co jsem uvedl dále – když budu chtít v adminu vypsat najednou všechny překlady názvu nějakého produktu – v tu chvíli zkrátka potřebuji programově říct, že chci využít konkrétního slovníku. Použitím $translator->translate() se ale stane jakýsi záhadný problém (systém najednou nemůže nalézt překlady, angličtinu mi přeloží do češtiny atd.) a v latte nevím, jestli je to vůbec možné. Nevíte, o jaký problém se jedná v metodě translate()? Je možné tuto věc provést přímo v podtržítkovém makru latte?
Editoval svezij (15. 3. 2016 5:51)
- svezij
- Člen | 69
Tak ještě jednou zdravím. Částečně jsme problém vyřešili s kolegou v práci. Není to stoprocentní a vadí mi, že vlastně úplně nerozumím tomu, jak to funguje, ale zatím nám to stačí. Už funguje translate(). Problém byl s parametrem fallback v config.neon – vlastně vůbec nevím, k čemu tento parametr slouží, mohli byste mi to, prosím, někdo vysvětlit? A také byl problém v pojmenování souborů s překlady, kde bylo např. dict.en_EN.neon, ale přitom předávané locale v perzistentním parametru bylo pouze en. Jaktože to tak vlastně fungovalo? Když jsem zavolal metodu $translator->getAvailableLocales(), tak mi podle názvů souborů vracela [cs_CZ, en_EN], a přitom $translator->getLocale() vracelo pouze cs nebo en.
Každopádně řešením bylo odstranit parametr fallback a přejmenovat slovníky na dict.cs.neon a dict.en.neon, v tomto případě funguje vše tak jak má. A předpokládám tedy, že v latte v podtržítkovém makru možnost předat konkrétní locale není. Nicméně, vystačím si s voláním metody translate().
Díky za pomoc. Mějte se.
- libik
- Člen | 96
Nasel jsem tohle tema, protoze hledam neco podobneho. V administraci
uzivateli na jedne strance vypisuju, jak vypada jeho profil v CZ a EN verzi a
popisy profiloveho boxu mam v neon souborech.
Chtel bych teda vypsat oba profily zaroven, jeden v CZ a druhy v EN, ale
nevim, jak (a jestli to lze) to prekladaci vnutit.
{_profiles.detail.education} - CZ verzi
{_profiles.detail.education} - EN verzi
- libik
- Člen | 96
Tak jsem nasel reseni na:
https://forum.nette.org/…-translatoru
se zakomentovanym fallbackem v configu uz to slape.