orisai / translation-contracts

Interface for translator and translatable messages
Mozilla Public License 2.0
2 stars 0 forks source link

Zadost o radu #1

Open JStika opened 1 week ago

JStika commented 1 week ago

Musel jsem upgradovat kody na php 8.3 a prisel jsem o pohodu pouziti https://github.com/h4kuna/gettext-latte. Ted pouzivam https://github.com/contributte/translation (data z db). V latte funguje bez problemu. Ale uz to nelze pouzit ve formularich, presenterch a modelech.

Potreboval bych globalni funkci jakou vidim zde t(...), kterou bych mohl nahradit volani _(...) ve formularich, presenterch a modelech. Musi vychazet z Nette\Localization\Translator jako

public Nette\Localization\Translator $translator;

Pozadam Vas o radu jak na to.

Dekuji

mabar commented 1 week ago

To je jednoduché, stačí si implementovat můj interface jako adaptér - interně v něm volat překladač, který interface z Nette implementuje

Zrovna pro gettext jsem jeden nedávno psal:

use h4kuna\Gettext\GettextSetup;
use Orisai\Exceptions\Logic\NotImplemented;
use Orisai\TranslationContracts\Translatable;
use Orisai\TranslationContracts\Translator;
use function _;

final class TranslatorAdapter implements Translator
{

    private GettextSetup $gettextSetup;

    public function __construct(GettextSetup $gettextSetup)
    {
        $this->gettextSetup = $gettextSetup;
    }

    public function translate(string $id, array $parameters = [], ?string $locale = null): string
    {
        if ($parameters !== []) {
            throw NotImplemented::create()
                ->withMessage('Message parameters are not supported with gettext setup.');
        }

        if ($locale !== null) {
            $originalLocale = $this->gettextSetup->getLanguage();
            $this->gettextSetup->setLanguage($locale);
            try {
                return _($id);
            } finally {
                $this->gettextSetup->setLanguage($originalLocale);
            }
        }

        return _($id);
    }

    public function translateMessage(Translatable $message, ?string $locale = null): string
    {
        return $this->translate(
            $message->getId(),
            $message->getParameters(),
            $locale ?? $message->getLocale(),
        );
    }

}

Pak už jen nastavíš překladač pro zkratku podle dokumentace.

JStika commented 1 week ago

Dekuji za odpoved. Asi jsme si neporozumeli. S nettte v3.x je https://github.com/h4kuna/gettext-latte nepouzitelne, proto jsem presel na pouziti https://github.com/contributte/translation. Asi jsem uz stary, nebo blby.

Potrebuji nejak zprovoznit t(...) jak to vidim zde https://github.com/orisai/translation-contracts/blob/v1.x/src/shortcut.php.

Napriklad s nette v2.x v presenter-u z metody handleSave jsem poslal: $this->presenter->payload->message = _("Uspesne ulozene")

Jak to udelat ted s nette v3.x, ale uz bez gettext? $this->presenter->payload->message = t("Uspesne ulozene")

Dekuji za odpoved.

mabar commented 1 week ago

Ta má implementace adaptéru s gettextem je jen příklad. Místo GettextSetup si vyžádáš v konstruktoru translator, který aktuálně používáš a upravíš si implementaci podle něj. Pak si nastavíš adaptér do TranslaterHolder podle dokumentace.

Funkce si z TranslateHolder získá adaptér překladače, adaptér interně přeloží zprávu skrze tebou použitý překladač.

JStika commented 2 days ago

Porad to nechapu (: