Integrace Symfony translation do Nette – Kdyby/Translation
- Jelen
- Člen | 18
@Tomáš: Aha. No, logika věci je taková, že mám třídu
CustomUploadHandler (dědí od UploadHandler), která má své chybové
hlášky, pro testování přepsaná hláška max_file_size do
tečkové(?) notace text.fileupload.tooBig.
V UploadPresenter
na který chodí jen AJAXové požadavky je akce actionGallery()
kde vytvářím objekt CustomUploadHandler, který pak vrací application/json.
Ten ze stránky kde vznik request se zpracuje a snaží se vypsat onu hlášku
console.log(response.error);
V UploadPresenteru actionGallery() nastavuju translator pro CustomUploadHandler který překládá hlášku (pokud je chyba) ve funkci handle_file_upload.
Mělo by to stačit nebo je k zapotřebí ještě nějaká úprava?
Editoval Jelen (21. 2. 2014 14:04)
- akadlec
- Člen | 1326
Tak tedy znova a trochu polopatě, v samotném JS těžko donutíš PHP aby dělalo překlady. Proto buď si budeš muset udělat nějaký JS translator kde budeš mít ty JS hlášky přeloženy a nebo si upravit JS skripty tak aby to bralo hlášky třeba z response a nebo si ty hlášky přeložíš generování konrkétního JS kódu. Teď je to už snad pochopitelné…
- Filip Procházka
- Moderator | 4668
@akadlec klíč nebo hodnota? K překladu dojde vždy, ale Neon se k některým hodnotám chová dost speficky (yes a no převádí na true/false).
- akadlec
- Člen | 1326
@Filip Procházka: klíč, udělal jsem si překlady buttonu:
buttons:
yes : "Ano"
no : "Ne"
a nedojde k překladu, vypíše to celý překladový řetězec, tedy: app.buttons.yes
Pokud to změním na:
buttons:
bYes : "Ano"
bNo : "Ne"
tak to funguje ok.
Editoval akadlec (24. 2. 2014 7:40)
- MartinitCZ
- Člen | 580
@**akadlec**: Něco podobného je i v případě. „car: car“ >> https://forum.nette.org/…-translation?p=2
- Quinix
- Člen | 108
akadlec Protože yes, no, on, off atd. jsou rezervovaný
výrazy… stačí to dát do uvozovek.
https://github.com/…e/issues/809
- akadlec
- Člen | 1326
@jelen:
Takový typický php kod že ;)
console.log(this.error);
Pokud to tedy překládáš na straně serveru, tak snad máš k dispozici translator popřípadě si jej získá3 patřičným konstruktorem a pak stačí snad zavolat překlad ne?
....
$hlaska = $this->translator->translate('string.pro.prelozeni');
....
- MartinitCZ
- Člen | 580
Filipe, jak to vypadá s tímto: https://github.com/…ion/issues/5
?
Potřeboval bych porovnat použité stringy a ty, které jsou jen
v překladovém souboru.
Nechce se mi to dělat ručně :/ :D
Editoval martinit (27. 2. 2014 15:29)
- batko
- Člen | 219
ahoj, snažím se rozchodit překlady dle dokumentace:
https://github.com/…/en/index.md#…
- nainstaloval jsem composerem
- vytvožil slovníky cs/en ve kterách mám
homepage:
hello: "Hello World"
- v basepresenteru mám
/** @persistent */
public $locale;
/** @var \Kdyby\Translation\Translator */
protected $translator;
public function injectTranslator(\Kdyby\Translation\Translator $translator) {
$this->translator = $translator;
}
protected function createTemplate($class = NULL) {
$template = parent::createTemplate($class);
$template->registerHelperLoader(callback($this->translator->createTemplateHelpers(), 'loader'));
return $template;
}
config.neon
extensions:
dibi: DibiNette21Extension
translation: Kdyby\Translation\DI\TranslationExtension
translation:
default: cs
#fallback: [cs_CZ, cs]
whitelist: ['cs', 'en']
v šabloně
<p>{_messages.homepage.hello}</p>
a výsledek
homepage.hello
v panelu se mi vypíše
Missing translations: 1
Message
homepage.hello
netušíte kde může být chyba?
- Filip Procházka
- Moderator | 4668
Máš správně pojmenované slovníky?
Koukni se do temp/cache/_Nette.Configurator
bude tam psycho
soubor ve kterém je zkompilovaný SystemContainer
, najdi metodu
createServiceTranslation__default
a koukni jestli se v ní volá
$service->addResource
s těmi soubory slovníků co jsi
vytvořil.
Já mezitím vylepším panel aby tam už nikdy nikdo koukat nemusel
- akadlec
- Člen | 1326
@Filip Procházka: dalo by se nějak pořešit aby translator pracoval s celým locale? Tedy cs_CZ, sk_SK atd? Že bych si v configu namapoval jaké locale se má použít
translation:
default : cs
fallback : [cs_CZ, cs]
dirs : [%appDir%/modules/AppModule/Translations]
locales :
cs : cs_CZ
en : en_US
sk : sk_SK
- Filip Procházka
- Moderator | 4668
Pokud si to ošetříš aby to například v URL mělo správný tvar a aby se to správně předávalo do translatoru tak není problém.
- Filip Procházka
- Moderator | 4668
Od toho jsou ty fallbacky, ono to pozná jazyk na který to začíná :) Něco ti nefunguje nebo si jenom hraješ? :)
- batko
- Člen | 219
Filip Procházka napsal(a):
Máš správně pojmenované slovníky?
Koukni se do
temp/cache/_Nette.Configurator
bude tam psycho soubor ve kterém je zkompilovanýSystemContainer
, najdi metoducreateServiceTranslation__default
a koukni jestli se v ní volá$service->addResource
s těmi soubory slovníků co jsi vytvořil.Já mezitím vylepším panel aby tam už nikdy nikdo koukat nemusel
nevolá, slovníky mám v
/app
/lang
/www
.
.
.
/**
* @return Kdyby\Translation\Translator
*/
public function createServiceTranslation__default()
{
$service = new Kdyby\Translation\Translator($this->getService('translation.userLocaleResolver'), $this->getService('translation.selector'), $this->getService('translation.catalogueCompiler'), $this->getService('translation.catalogueFactory'), $this->getService('translation.fallbackResolver'));
$this->getService('translation.userLocaleResolver.param')->setTranslator($service);
$service->setFallbackLocales(array('en_US'));
Kdyby\Translation\Diagnostics\Panel::register($service, 'C:\\xampp\\htdocs\\cms');
return $service;
}
Editoval batko (27. 3. 2014 9:43)
- batko
- Člen | 219
Quinix napsal(a):
slovníky máš v /lang, ale mají být v /app/lang (pokud sis to v configu nezměnil)
ok moje chyba, to jsem změnil, ale bohužel to nepomohlo, promazal jsem cache a nic
/**
* @return Kdyby\Translation\Translator
*/
public function createServiceTranslation__default()
{
$service = new Kdyby\Translation\Translator($this->getService('translation.userLocaleResolver'), $this->getService('translation.selector'), $this->getService('translation.catalogueCompiler'), $this->getService('translation.catalogueFactory'), $this->getService('translation.fallbackResolver'));
$this->getService('translation.userLocaleResolver.param')->setTranslator($service);
$service->setFallbackLocales(array('en_US'));
Kdyby\Translation\Diagnostics\Panel::register($service, 'C:\\xampp\\htdocs\\cms');
return $service;
}
- Filip Procházka
- Moderator | 4668
- aktualizuj si translator na aktuální vývojovou verzi
- podívej se do panelu
Když tam nic nebude pošli svůj config translatoru a rozepiš přesně jak máš složky včetně názvů slovníků (nebo vyscreenshotuj v IDE strom souborů, to bude asi jednodušší)
Btw nemám windows, používá tu translator nějaký windowsák? Funguje ti?
- batko
- Člen | 219
Filip Procházka napsal(a):
- aktualizuj si translator na aktuální vývojovou verzi
- podívej se do panelu
Když tam nic nebude pošli svůj config translatoru a rozepiš přesně jak máš složky včetně názvů slovníků (nebo vyscreenshotuj v IDE strom souborů, to bude asi jednodušší)
Btw nemám windows, používá tu translator nějaký windowsák? Funguje ti?
tak jsem to naistaloval na čistý sandbox, tak tam bude zádrhel někde jinde, až ho najdu dám hlášení, děkuji moc zatím je to super nástroj
- Jambor
- Člen | 1
/**
* @var \Kdyby\Translation\LocaleResolver\SessionResolver
* @autowire
*/
protected $translatorSession;public function handleChangeLocale($locale)
{
$this->translatorSession->setLocale($locale);
$this->redirect(‚this‘);
}
Ahoj,
preklad ako taký ide. Načíta text z neon súbor. Ale keď som pridal
horeuvedený handle, padne to na tomto riadku
$this->translatorSession->setLocale($locale);
$this->translatorSession je NULL.
Ako danú premennú inicializujem?
Ďakujem za pomoc.
- MartinitCZ
- Člen | 580
Jak funguje nastavení defaultního jazyka, resp. nefunguje?
Mám toto:
default: en
fallback: [en_GB, en]
resolvers:
session: on
header: off
I tak je výchoí jazyk cs. Když si v presenteru v resolveru zmním jazyk
na en, tak se správně načte. Jenže se stačí odhlásit (zníčit session) a
zase je hlavní jazyk cs!
Nette 2.0.14
Editoval martinit (7. 4. 2014 14:38)
- Filip Procházka
- Moderator | 4668
Vyzkoušej aktuální master, přidal jsem do panelu debugger na locale resolvery.
- Filip Procházka
- Moderator | 4668
Teď takto
loremIpsum:
successfulyEdited: <b>%article%</b> byl úspěšně upraven a byl odeslán <b>ke schválení</b> našim administrátorům
{!_front.loremIpsum.successfulyEdited}
v budoucnu snad takto https://github.com/…ion/issues/4
- mrfazolka
- Člen | 24
Zdravím. Chtěl bych se zeptat na něco ohledně struktury překládaných textů. Jak řešíte když chcete přeložit text, který obsahuje link např.: „Můžete nás <a n:href=‚Kontakt:‘>kontaktovat</a>“ a v anglické verzi chcete mít napsáno „You can <a n:href=‚Kontakt:‘>contact</a> us“. Možná je to začátečnický dotaz, každopádně nevím jak si s tím poradit, když jednou je link uprostřed věty a jednou na konci, přičemž v jiném jazyce to může být na začátku.
Dík za odpověď
- Filip Procházka
- Moderator | 4668
Máš několik možností, ale nejlepší asi bude něco takového
<p>{!_front.contact.us, [href => $template->url($presenter->link('Contact:'))]}</p>
contact:
us: "Můžete nás <a href='%href%'><b>kontaktovat</b></a>"
contact:
us: "You can <a href='%href%'><b>contact</b></a> us"
Kdyby někdo měl lepší nápad tak sem s ním :)
- MartinitCZ
- Člen | 580
Ahoj lidi,
jak registrujete helper v Nette 2.2?
// Pro 2.1
$template->registerHelperLoader(array($this->getTranslator()->createTemplateHelpers(), 'loader'));
Určitě je lepší možnost, než:
// Pro 2.2
$callback = array($this->getTranslator()->createTemplateHelpers(), 'loader');
$latte = $template->getLatte();
$template->getLatte()->addFilter(NULL, function($name) use ($callback, $latte) {
if ($res = call_user_func($callback, $name)) {
$latte->addFilter($name, $res);
}
});
Editoval martinit (5. 5. 2014 18:19)
- MartinitCZ
- Člen | 580
@**Filip Procházka**: Ano, ale nový způsob zápisu ->getLatte->addFilter() na tvé helpery nefunguje a starý je deprecated https://github.com/…Template.php#L110
- Filip Procházka
- Moderator | 4668
Aktuální master (ještě jsem tam dnes něco opravoval) by měl šablony mít kompletně už vyřešené pro 2.2 i dev. Na to že je registrace loaderu dost komplikovaná jsem taky narazil. Ovšem když použiješ šablony vytvořené přes TemplateFactory (což bys měl!), tak makra i helpery budeš mít už registrovaná.
- MartinitCZ
- Člen | 580
@**Filip Procházka**: Poslední update vše vyřešil. Díky
Filipe.
PS: Sry za spam
- Stic
- Člen | 28
precital som si predchadzajuce komentare o integracii do noveho nette, ale nic mi nepovedali a z navodu som tiez nic nevycital akosi.
ako konkretne mam zmenit toto:
<?php
/**
* Add translator to templates
*
* @param {string|NULL} $class
* @return Template
*/
public function createTemplate($class = NULL)
{
$template = parent::createTemplate($class);
$template->addFilter(NULL,callback($this->translator->createTemplateHelpers(), 'loader'));
return $template;
}
?>
aby to zacalo fungovat?
Vopred dakujem za nejake nakopnutie :)
- Tomáš Votruba
- Moderator | 1114
Registrace filtrů probíhá tady v rozšíření, tzn. že by mělo stačit tvůj kód smazat.
Je možné, že $latteFactory
se jmenuje jinak. Koukni do
debugbaru containeru (ozubené kolečko), jak se tam jmenuje.
Editoval Tomáš Votruba (9. 7. 2014 17:20)
- Filip Procházka
- Moderator | 4668
Další otázky bych prosil na fórum k tomu určené do samostaných vláken. Už u minulé stránky to tu přestalo být přehledné.