Vytvoření vlastního translatoru

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

Ahoj,
dostal jsem se do situace, kdy potřebuji pro web translator a nechci přebírat již hotové věci jako je translator z kdyby nebo gettextranslator. Takže oč mi jde, mám navrženou strukturu překladu rozloženou do několika tabulek v db a já bych to chtěl s využitím nette translate nějak praktikovat. Mohl by mě někdo nějak nesměrovat, abych se v tom zbytečně dlouho neplácal. Díky H.

zelenomodrypes
Člen | 11
+
0
-

Já to má řešené velmi jednoduše, asi takto:

app/model/Translator.php

<?php
class Translator extends \Nette\Object implements \Nette\Localization\ITranslator
{
	/** @var \Nette\Database\Connection */
	private $db;

	/** @var int */
	private $language_id;

	/** @var string[] */
	private $translations;


	public function __construct(\Nette\Database\Connection $db, $language_id)
	{
		$this->db = $db;
		$this->language_id = (int)$language_id;
	}

	/**
	 * Vrací pole překladů pro daný jazyk.
	 *
	 * @return string[]
	 */
	public function getTranslations()
	{
		if ($this->translations === NULL) {
			$this->translations = $this->db->table('localization')->where('language_id', $this->language_id)->fetchPairs('code', 'text');
		}
		return $this->translations;
	}

	/**
	 * Vrací překlad pro zvolený řetezec.
	 *
	 * @param string
	 * @param int
	 * @return string
	 */
	public function translate($code, $count = null)
	{
		$translations = $this->getTranslations();

		return isset($translations[$code]) ? $translations[$code] : $code;
	}
}
?>

Použití v presenteru:

<?php
$translator = \Translator($this->db, $language_id);
$this->template->setTranslator($translator);

$translatedString = $translator->translate('ahoj');
?>

Použití v template:

{_'ahoj!'}
Filip Procházka
Moderator | 4668
+
0
-

Velice snadno se dá dopsat loader do Kdyby/Translation který by načítal překlady z databáze :)

Jakou má výhodu psát vlastní řešení? V čem bude lepší? Nedávalo by větší smysl přispět svým nápadem do jiného již zaběhnuté a spolehlivé knihovny?

@zelenomodrypes tvoje řešení je super, pokud máš do stovky překladů. Načítat hromadu textu navíc na každý pageload z databáze jenom proto abys toho použil 1–5% určitě není úplně v optimální :)

Tomáš Kolinger
Člen | 136
+
0
-

@Chuchy
Můžeš použít řešení zelenomodrého psa ale určitě výsledky kešuj do souboru. Podávat každý request dotaz na všechny překlady je zbytečné, hlavně když se překlady mění „jednou za rok“.

Nebylo by taky na škodu ošetřit to co píše Filip – rozdělit překlady do nějakých menších balíku, např. podle presenteru a potom by se ti načítání zbytečných překladů hodně zredukovalo. Ale to samozřejmě záleží na tom, co píšeš za aplikaci a jak moc rozsáhlá je. U nějakého základního webu či blogu tě tohle vůbec trápit nemusí a kešování všech překladů do souboru v pohodě stačí.

@Filip Procházka
<offtopic>
Jakou má výhodu psát vlastní řešení? Bude jednodušší. Bude to rychlejší na implementaci a rozhodně transparentnější…

Když vemu Kdyby\Translation, tak to je knihovna, co má celou řadu tříd a jen zlomek je popsán v dokumentaci, takže na první pohled nemám nejmenší tušení co to umí a hlavně jestli to bude fungovat… Může to být přeci další knihovna, která není domyšlená a nebude vyhovovat mému use-case.

Samozřejmě si můžu přečíst dokumentaci Symfony ale to už se na tolik komplikuje, že to opravdu hodně lidí odradí.

Posledním důvodem může být to, že 75% knihovny nevyužiji a tak je zbytečný tahat takový kanón na triviální key ⇒ value překlady.

Pro tebe to samozřejmě nedává smysl, jelikož si to celé napsal a víš přesně jestli je to dobře napsané a co vše to (ne)umí :).
</offtopic>

Editoval Tomáš Kolinger (15. 3. 2014 20:10)

Chuchy
Člen | 77
+
0
-

Ahoj,
díky za tipy, použil jsem styl řešení od **zelenomodrypes **, je to v současné situaci řešení, které mi nejvíce vyhovuje, výsledky samozřejmě cachuji