Vícejazyčný web

Rudolf Svátek 2016-07-05 10:31

Celou aplikaci, tak, jak bude vypadat po dnešní kapitole si můžeš stáhnout: kapitola8.zip.

U administrace to možná tak nutné není, ale na frontendu je častým požadavkem vícejazyčný web. Nette má prosttředky pro vytvoření překladače. Já sáhl po už vytvořeném řešení a nainstaloval jsem si Kdyby Translation. Bylo to v druhé kapitole seriálu.

Úprava BasePresenteru

Teď se nám hodí BasePresenter. Stačí do něj doplnit pár řádků:

	/** @persistent */
	public $locale;

	/** @var \Kdyby\Translation\Translator @inject */
	public $translator;

Tím jsme pro všechny presentery definovali persistentní parametr $locale a také injectnuli Translator. Normálně se ještě upravuje config a router, ale ty už to všechno máš z minulých dílů.

Vytvoření slovníků

Bude potřeba někde si ukládat přeložené výrazy. Vytvoř tedy složku app\lang. Uvnitř složky lang pak vytvoř soubor messages.cs_CZ.neon. Uvniř souboru můžeš tvořit různé texty podle vzoru:

msg:
	inactive: "Byli jste odhlášeni z důvodu nečinnosti. Prosím, přihlaste se znovu."
	please_login: "Prosím, přihlaste se."
	not_allowed: "Nemáte oprávnění"

Použití slovníků

Překládat lze výrazy v presenterech, šablonách i formulářích.

Překlad presenterů

Presentery jsou snadné. Nejprve zkusíme upravit hlášky v BasePresenteru. Nahradíme hlášky za cestu k hlášce v lokalizačním souboru:

	protected function startup() {
		parent::startup();
		if (!$this->getUser()->isLoggedIn()) {
			if ($this->getUser()->logoutReason === User::INACTIVITY) {
				$this->flashMessage($this->translator->translate('messages.msg.inactive'));
			} else {
				$this->flashMessage($this->translator->translate('messages.msg.please_login'));
			}
			$this->redirect(':Front:Sign:in', ['backlink' => $this->storeRequest()]);
		}

		if (!$this->getUser()->isInRole('admin')) {
			$this->flashMessage($this->translator->translate('messages.msg.not_allowed'));
			$this->redirect(':Front:Sign:in', ['backlink' => $this->storeRequest()]);
		}
	}

Tvar cesty je celkem srozumitelný. Začíná názvem souboru. Zakládali jsme soubor messages.cs_CZ.neon, tak proto je první "messages". Dál je klíč "msg" a jeho podklíč - "inactive", "please_login" atd.

Kdyby Translator umí pracovat i s plurály, proměnnými apod. Počti si na jeho stránkách v dokumentaci.

Podobně i v ostatních presenterech můžeš texty překládat tak, že vložíš přeložený text do souboru s překladem a nahradíš daný text jeho klíčem. Třeba v UsersPresenter.php nahraď

$this->flashMessage('Tento mail používá jiný uživatel.', 'danger');

za

$this->flashMessage($this->translator->translate('messages.users.mail_use'), 'danger');

Samozřejmě musíš doplnit do lokalizačního souboru

users:
	mail_use: "Tento mail používá jiný uživatel."

Překlad šablon

U šablon je to podobné jako u presenterů. Jen zápis je trochu jiný. A snad i jednodušší. Stačí mít v lokalizačním souboru správný klíč s hodnotou a pak stačí zadat klíč do překladového makra:

{_ messages.application.logout}

Samořřejmě se předpokládá, že tedy ve slovníku budeš mít:

application:
	logout: "Odhlásit"

Překlad formulářů

Tady to také nebude složité. Prostě jen změníš texty opět na klíče slovníku. Asi takto:

		$form->addText('username', "messages.users.login")
			->setAttribute('placeholder', "messages.users.loginPlaceholder")
			->setAttribute('class', 'form-control input-sm')
			->setRequired("messages.users.plsLogin");
		$form->addPassword('password', '')
			->setAttribute('placeholder', "messages.users.passwordPlaceholder")
			->setAttribute('class', 'form-control input-sm');
		$form->addPassword('password2', '')
			->addRule(Form::EQUAL, "messages.users.equalPassword", $form['password'])
			->setAttribute('placeholder', "messages.users.password2Placeholder")
			->setAttribute('class', 'form-control input-sm');
		$form->addText('name', "messages.users.name")
			->setAttribute('placeholder', "messages.users.namePlaceholder")
			->setAttribute('class', 'form-control input-sm');
		$form->addText('lastname', "messages.users.lastName")
			->setAttribute('placeholder', "messages.users.lastNamePlaceholder")
			->setAttribute('class', 'form-control input-sm');
		$form->addText('email', "messages.users.email")
			->setType('email')
			->addRule(Form::EMAIL, "messages.users.validEmail")
			->setAttribute('placeholder', "messages.users.emailPlaceholder")
			->setAttribute('class', 'form-control input-sm');
		$form->addSelect('role', "messages.users.validEmail" . ": ", $roles)
			->setAttribute('class', 'form-control input-sm');
		$form->addSubmit('process', "messages.users.btnSubmit")
			->setAttribute('class', 'btn btn-primary');

Ovšem ještě něco dodělat musíš. Je nutné nastavit formuláři překladač. Stačí upravit v presenteru metodu pro vytváření komponenty:

	/**
	 * @return Form
	 */
	protected function createComponentEditForm() {
		$form = $this->editUserFormFactory->create();
		$form->setTranslator($this->translator);

		$form->onSuccess[] = function (Form $form) {

Samozřejmě, že pokud vykresluješ formuláře ručně, tak jako já, musíš lokalizaci provést i v šabloně vykreslovaného formuláře.

Přepínání mezi jazyky

Můžeš vytvořit další slovníky. Každý ulož do složky ap\lang. Pojmenuj je tak, aby součástí názvu byl kód země. Třeba en_EN, de_DE apod. Přesvědč se, že v config.neon máš povoleny všechny jazyky, v RouterFactory také, a pak jen někam dej odkaz pro výběr jazyka.

<a n:href="this, locale => 'cs'">CZ</a>
<a n:href="this, locale => 'en'">EN</a>

To je k lokalizaci prostředí asi vše. Samozřejmě, že takto nejdou přeložit přímo texty na stránkách. K tomu se musí vytvořit překlad pro každou jazykovou mutaci. Přiznám se, že tohle zatím zpracováno nemám, takže na tom budeme pracovat spolu. Někdy příště.

Celou aplikaci, tak, jak bude vypadat po dnešní kapitole si můžeš stáhnout: kapitola8.zip.

V další kapitole se podíváme na administraci textových stránek. To bude trochu rozsáhlejší kapitola.

Redakční systém RS::RS Předchozí kapitola

Úpravy vzhledu administrace

Redakční systém RS::RS Celý seriál

Vývoj redakčního systému v PHP

Redakční systém RS::RS Následující kapitola

Administrace textových stránek

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace