Kdyby\Translation: předání locale v latte makru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
svezij
Člen | 69
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Proč chceš překladači říkat jakým jazykem to má přeložit? Překladač sám o sobě ví jakej jazyk je aktuálně nastavenej.

svezij
Člen | 69
+
+1
-

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)

CZechBoY
Člen | 3608
+
0
-

Proč teda potřebuješ překládat text, který bude ve všech jazycích stejný?
Nejde podědit ty soubory, že by se společný obsah dal do nějaké main sekce a už konkrétní jazyky (čeština, angličtina) by z toho dědily?

svezij
Člen | 69
+
0
-

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
+
0
-

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
+
0
-

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
Jan Mikeš
Člen | 771
+
0
-

Mělo by fungovat toto:

{_anything.message, NULL, [], NULL, 'cs'}
{_anything.message, [], NULL, 'cs'}

Oboji by melo byt spravne a funkcni.

Editoval Lexi (11. 5. 2016 14:36)

libik
Člen | 96
+
0
-

Diky za tip. Pokud ale zadam cokoliv jineho nez ‚cs‘, ladenka krici:

Circular reference detected when adding a fallback catalogue for locale „cs“

Podotykam jeste, ze jedu na Nette 2.2

Editoval libik (11. 5. 2016 14:52)

libik
Člen | 96
+
0
-

Tak jsem nasel reseni na:

https://forum.nette.org/…-translatoru

se zakomentovanym fallbackem v configu uz to slape.

Jan Mikeš
Člen | 771
+
0
-

Problem mas v nastaveni translatoru, fallback mas pravdepodobne na neexistujici slovnik, postni sem tvou konfiguraci translatoru.

libik
Člen | 96
+
0
-

Klasicky dle dokumentace

	translation:
			default: cs
			fallback: [cs_CZ, cs]
			debugger: on
Jan Mikeš
Člen | 771
+
+1
-

Zkus dat pryc cs_CZ

libik
Člen | 96
+
0
-

Tak to pomohlo.