Integrace Symfony translation do Nette – Kdyby/Translation

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

@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.
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);

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

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é…

akadlec
Člen | 1326
+
0
-

Jinak narazil jsem na bug, pokud je klíč překladu „yes“ a nebo „no“ nedojde k překladu.

Filip Procházka
Moderator | 4668
+
0
-

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

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

@**akadlec**: Něco podobného je i v případě. „car: car“ >> https://forum.nette.org/…-translation?p=2

akadlec
Člen | 1326
+
0
-

@martinit: v podstatě asi jo, protože já to měl ještě v en a jazyk přepnutý na EN takže klíč i hodnota byla praktický stejná.

Quinix
Člen | 108
+
0
-

akadlec Protože yes, no, on, off atd. jsou rezervovaný výrazy… stačí to dát do uvozovek.
https://github.com/…e/issues/809

Jelen
Člen | 18
+
0
-

@akadlec to o co se snažím je přeložit hlášky už na straně serveru, psal jsem to v komentáři #95, #97 a system popsal v #101. Tak snad už je to pochopitelné…

akadlec
Člen | 1326
+
0
-

@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');
....
Jelen
Člen | 18
+
0
-

@akadlec: raději nebudu reagovat :) Chyba byla tady, dík.

MartinitCZ
Člen | 580
+
0
-

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)

Filip Procházka
Moderator | 4668
+
0
-

@martinit work in progress :)

MartinitCZ
Člen | 580
+
0
-
batko
Člen | 219
+
0
-

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

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.

mezitím vylepším panel aby tam už nikdy nikdo koukat nemusel

akadlec
Člen | 1326
+
0
-

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

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.

akadlec
Člen | 1326
+
0
-

tak v url by bylo jen /en/, /cs/ atd. tedy jen jazyk, země by se doplnila na základě definice extension co?

Filip Procházka
Moderator | 4668
+
0
-

Od toho jsou ty fallbacky, ono to pozná jazyk na který to začíná :) Něco ti nefunguje nebo si jenom hraješ? :)

akadlec
Člen | 1326
+
0
-

No a jak ty fallbacky správně nastavit tak aby to splnilo pravidla co sem psal výše? Jop aktualně mi toto hapruje v appce, protože v db mám uloženy jazyky co mají celé locale ne jen jazyk a na to sou udělané vazby.

Filip Procházka
Moderator | 4668
+
0
-

Zkus být trošku konkrétnější.

batko
Člen | 219
+
0
-

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 metodu createServiceTranslation__default a koukni jestli se v ní volá $service->addResource s těmi soubory slovníků co jsi vytvořil.

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)

Quinix
Člen | 108
+
0
-

slovníky máš v /lang, ale mají být v /app/lang (pokud sis to v configu nezměnil)

batko
Člen | 219
+
0
-

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
+
0
-
  1. aktualizuj si translator na aktuální vývojovou verzi
  2. 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?

akadlec
Člen | 1326
+
0
-

Já mám local na oknech a translator funguje.

Quinix
Člen | 108
+
0
-

Filip Procházka napsal(a):

Btw nemám windows, používá tu translator nějaký windowsák? Funguje ti?

Naprosto bez problémů… proč by neměl? ;)

batko
Člen | 219
+
0
-

Filip Procházka napsal(a):

  1. aktualizuj si translator na aktuální vývojovou verzi
  2. 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
+
0
-

/**
* @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.

akadlec
Člen | 1326
+
0
-

funguje ti autowiring?

slade183
Člen | 30
+
-1
-

Chci se zeptat, kdyz jedu podle navodu tak me zastavi tato chyba
<script>Class ‚Symfony\Component\Translation\Loader\ArrayLoader‘ not found</script>
Urcite to bude nejaka prkotina ale uz hodinu se s tim tady hraju..

akadlec
Člen | 1326
+
-1
-

Máš ve vendors dir symfony?

slade183
Člen | 30
+
-1
-

edit: tak uz to frci diky.

Editoval slade183 (2. 4. 2014 20:18)

MartinitCZ
Člen | 580
+
0
-

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
+
0
-
akadlec
Člen | 1326
+
0
-

Jenom krátký dotaz k samotným překladům. Jak řešíte html formátování v překladech? Pokud chcu např. zobrazit zprávu:

Článek: Lorem ipsum byl úspěšně upraven a byl odeslán ke schválení našim administrátorům

tučné, odkazy, atd. ?

Editoval akadlec (9. 4. 2014 22:29)

Filip Procházka
Moderator | 4668
+
0
-

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

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

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 :)

mrfazolka
Člen | 24
+
0
-

Díky moc. Po chvíli přemýšlení jsem to tak taky řešil. Elegantnější způsob mě také nenapadá :)

MartinitCZ
Člen | 580
+
0
-

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)

Filip Procházka
Moderator | 4668
+
0
-

A zkoušel jsi nightly verzi Translatoru?

MartinitCZ
Člen | 580
+
0
-

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

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

@**Filip Procházka**: Poslední update vše vyřešil. Díky Filipe.
PS: Sry za spam

Stic
Člen | 28
+
0
-

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

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

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é.