Nette Translator chyba pri zápise v latte

Richard17
Člen | 21
+
0
-

\--Dobrý chcem sa len spýtať pri zápise v šablóne

pri tom zápise mi funguje všetko správne

<p>{='hellow_world' | translate}</p>

a pri tom zápise mi vypise chybu

<p>{_'hellow_world'}</p>

Editoval Richard17 (5. 6. 14:42)

Marek Bartoš
Nette Blogger | 1221
+
0
-

Jakou chybu?
Můžeš použít formátování kódu, ať je jasné, že máš v pořádku syntaxi?

Richard17
Člen | 21
+
0
-

Marek Bartoš napsal(a):

Jakou chybu?
Můžeš použít formátování kódu, ať je jasné, že máš v pořádku syntaxi?

Prepačte

Latte\CompileException
Unexpected tag {_}, did you mean {=}? (in '…\Front/@layout.latte' on line 15 at column 5)

<p>{_'hellow_world'}</p>

Editoval Richard17 (5. 6. 14:35)

Marek Bartoš
Nette Blogger | 1221
+
-2
-

Používáš pro překlad nějaké rozšíření, které by makro {_} přidávalo?
Přes $this->template->setTranslator($translator) se přidává jen filtr |translate, žádné makro pro překlad přímo v Nette není

Editoval Marek Bartoš (5. 6. 14:41)

MajklNajt
Člen | 474
+
0
-

@MarekBartoš

https://latte.nette.org/cs/tags#…

Editoval MajklNajt (5. 6. 15:27)

Pavel Kravčík
Člen | 1186
+
0
-

A není odebraný v latte 4?

Marek Bartoš
Nette Blogger | 1221
+
0
-

@MajklNajt To je zastaralé. Tady se píše, že makro _ se používalo dřív. A malá oprava předchozího tvrzení, makro pro překlad v Latte je, ale od Latte 2.11 se jmenuje {translate}, ne {_}
https://doc.nette.org/…on/templates#…

Editoval Marek Bartoš (5. 6. 16:33)

dms
Člen | 90
+
0
-

Neni to zastaralý a normálně to funguje. V kodu je to tady

https://github.com/…xtension.php#L44

Marek Bartoš
Nette Blogger | 1221
+
0
-

Pro překlad úseku šablony existuje párová značka {translate} (od Latte 2.11, dříve se používala značka {_})

Tak je jen trochu nejasná textace, od verze 2.11 jsou tam opravdu obě https://github.com/…reMacros.php#…

David Grudl
Nette Core | 8183
+
+3
-

@Richard17 musíš aktivovat translator, postup je popsaný tady https://doc.nette.org/…on/templates#…

(koukám že se tu sešla úplná sbírka nesprávných odpovědí :-)

Marek Bartoš
Nette Blogger | 1221
+
+5
-

@DavidGrudl Občas má každý špatný den :D

Richard17
Člen | 21
+
0
-

David Grudl napsal(a):

@Richard17 musíš aktivovat translator, postup je popsaný tady https://doc.nette.org/…on/templates#…

(koukám že se tu sešla úplná sbírka nesprávných odpovědí :-)

Takto mam services.neon

services
App\Core\RouterFactory::createRouter

myTranslator: App\UI\Accessory\MyTranslator(defaultLang: %defaultLang%)
nette.latteFactory:
setup:
 – addfilter(‚translate‘, [@myTranslator, ‚translate‘])

search:
formuláře:
in: %appDir%
classes:
 – *Factory
 – *Facade

model:
in: %appDir%
classes:
 – *Manager

Takto mam Class MyTranslator


namespace App\UI\Accessory;

use Nette\Localization\Translator as Translator;

class MyTranslator implements Translator
{
      public function __construct(
        private string $defaultLang,
    )  {}

    public function setLang(string $lang): void
    {
        $this->defaultLang = $lang;
    }
    public array $tranlationMapper = [
        "hellow_world" =>  [
          "sk" => "Ahoj Svete ",
          "en" => "Hello Worlds",
        ],
    ];

    /**
     * @inheritDoc
     */
    function translate(\Stringable|string $message, ...$parameters): string
    {
    $mess = $this->tranlationMapper[$message] ?? $message;
       if(is_string($mess)) {
           return $mess;
       }
       return $mess[$parameters['lang'] ?? $this->defaultLang];
    }
}

a takto mam hlavný presenter

<?php

declare(strict_types=1);

namespace App\UI\Accessory;

use Nette\Application\Attributes\Persistent;
use Nette\Application\UI\Presenter as UIPresenter;
use Nette\DI\Attributes\Inject;
use Nette\Localization\Translator;

class Presenter extends UIPresenter
{
    #[Persistent]public string $lang;
    #[Inject] public Translator $translator;

    protected function startup()
    {
        parent::startup();
        if ($this->translator instanceof MyTranslator) {
            $this->translator->setLang($this->lang);
        }
    }
}

a nejde to ani tak.. Nechápem

Editoval Richard17 (7. 6. 18:58)

Marek Bartoš
Nette Blogger | 1221
+
+2
-

@Richard17 Mrkni na ten postup v dokumentaci co psal David. Ty si v konfiguraci nastavuješ jen filtr, ne makro. Extension ti nastaví oboje

Btw, editor má tlačítko jen na php a html kód, ale stejným způsobem jde označit i neon a další jazyky :) A funguje i markdown syntaxe

hello:
	world: "It's a me, Mario!"

Editoval Marek Bartoš (7. 6. 22:19)

m.brecher
Generous Backer | 797
+
+1
-

@Richard17

a nejde to ani tak.. Nechápem

Jak psal @DavidGrudl je potřeba podle dokumentace “nastavit šabloně translator”, vyzkoušel jsem a funguje to:

services:
	myTranslator: App\Model\MyTranslator(defaultLang: 'sk')

	nette.latteFactory:
		setup:
			- addFilter('translate', [@myTranslator, 'translate'])
latte:
	extensions:
		- Latte\Essential\TranslatorExtension(@myTranslator)

Sample code nastavení translátoru jako extension Latte je ale v dokumentaci nedostatečný – chybí popis, že je potřeba předat jako první parametr konstruktoru translator: https://doc.nette.org/…on/templates#…

Služby v Nette obvykle není potřeba pojmenovávat, stačí je volat jednodušeji typehintem jako anonymní služby takto:

services:
	- App\Model\MyTranslator(defaultLang: 'sk')

	nette.latteFactory:
		setup:
			- addFilter('translate', [@App\Model\MyTranslator, 'translate'])
latte:
	extensions:
		- Latte\Essential\TranslatorExtension(@App\Model\MyTranslator)

Richard17
Člen | 21
+
0
-

Dakujem krásne všetkým za pomoc už mi to ide…

Editoval Richard17 (8. 6. 4:33)