Kdyby/Translation a viacjazycny obsah v databaze

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

Zdravim, mal by som taky dotaz, respektíve by som si potreboval nieco objasnit. Pozeral som dokumentaciu Kdyby/Translation. A chápem že na základe zvoleneho jazyka sa mi nacita subor neon. Ale čo ak potrebujem ťahať texty z databaze? Musim si napísať ku Kdyby/Translation vlastné rozšírenie?

Hug0
Člen | 35
+
0
-

Ahoj,
nemusíš, už se o to postaral někdo jiný. Dokumentaci najdeš tady a výsledná tabulka potom může vypadata třeba takhle:

sloupce: (key | locale | message | update_at)
(messages.homepage.nadpis | cs_CZ | Nadpis | 2016–05–12 12:12:12)
(messages.homepage.nadpis | en_US | Title | 2016–05–12 15:12:12)

David Matějka
Moderator | 6445
+
+1
-

Aby nedoslo k nedorozumeni. Co chces prekladat? „Staticke“ texty (tzn ruzne polozky menu, chyby u formularu, titulky statickych stranek) a jen chces mit moznost to mit v db a treba editovat v db? nebo obsah, tzn treba clanky?

yelidric
Člen | 33
+
+1
-

@DavidMatějka samozrejme hovorim a článkoch a podobnom obsahu. Labels je podla mna zbytocne prekladat v databaze. Ale clanky, produkty aj s popiskami a podobne texty je lepsie mat v databaze.

iru
Člen | 110
+
0
-

Řeším podobný problém s tím, že u mne se jedná opravdu o titulky, popisky formulářů apod., potřebuji to mít k dispozici v databázi, aby si to mohl potom uživatel sám v administračním rozhraní překládat. Inspirovala jsem se dle @Hug0 , ale asi mám něco špatně:

InvalidArgumentException
There is no dumper associated with format „database“.

v config.neon mám:

extensions:
    translation: Kdyby\Translation\DI\TranslationExtension

translation:
	default: cs
	whitelist: [cs, en]
	fallback: [cs_CZ, cs, en]
	database:
	    loader: doctrine
	    table: translation
	    columns:
	        key: key
	        locale: locale
	        message: message
	        updatedAt: updated_at

zde si nejsem jistá, jestli toto je dobře:
database:
loader: doctrine

opsala jsem to z té dokumentace

Tabulku v databázi mám vytvořenou s názvem translation a sloupci: key, locale, message a updated_at

--
– Struktura tabulky translation
--

CREATE TABLE IF NOT EXISTS translation (
locale varchar(250) COLLATE utf8_unicode_ci NOT NULL,
message varchar(250) COLLATE utf8_unicode_ci NOT NULL,
updatedAt datetime NOT NULL,
key varchar(250) COLLATE utf8_unicode_ci NOT NULL,
id int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

dále BasePresenter

use Kdyby\Translation\Translator;
use Symfony\Component\Translation\Writer\TranslationWriter;


abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    /** @persistent */
    public $locale;


    /** @var Translator @inject */
    public $translator;

    /** @var TranslationWriter @inject */
    public $writer;



    public  function __construct(Nette\Database\Context $database)
    {
        $this->database=$database;

    }


    public function beforeRender()
    {

       $catalogue = $this->translator->getCatalogue('en'); //catalogue is object with all translations for given language

        $catalogue->set('messages.homepage.hello', 'Hi');   //using this method, you can change translations. Or add tran
        $catalogue->add(['messages.homepage.farewell' => 'Farewell']);  //using this method, you can add new translations. You have to save them in associative array: key => message

        $this->writer->writeTranslations($catalogue, 'database');   //with this, you save translations. If you use 'neon' or any other format instead of 'database', you can save all translation to neon files (or another supported format).

    }

Pomůžete mne prosím nasměrovat, jak to správně nastavit? Mám to na jinak funkčním webu, kde překlady fungují, ale ze souboru, teď se to pokouším předělat na to načítání z DB.

Editoval iru (9. 11. 2016 16:07)

iru
Člen | 110
+
0
-

dotaz je stále aktuální, stále se mi nepodařilo problém vyřešit, připadá mi, jako by to přes databázi skoro nikdo neřešil, nemůžu nic najít…

Ivorius
Nette Blogger | 119
+
0
-

@iru a máš vůbec staženou správnou verzi? Protože na tu database potřebuješ tuhle větev https://github.com/…/Translation – respektive Dumper a Loader asi.

Jinak v tvém kodu vidím, že používáš Nette Database, ale v configu máš Doctrinu. Takže správně by mohlo být loader: nettedb

iru
Člen | 110
+
0
-

@Ivorius děkuji, doplnila jsem nettedb, ale asi nemám správnou verzi v composer mám „kdyby/translation“: „^2.2“, a nevím, jak to změnit, jak tuto větev stáhnout pomocí composeru.

Shaman
Člen | 2
+
0
-

@iru musís si změnit composer.json. Za prvé přidat GitHub repository a za druhé změnit verzi kdyby-translation na požadovanou branch s přidáním prefixu ‚dev-‘. Pak spustit composer update.

...
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/Kdyby/Translation"
    }
],
"require": {
    ...
    "kdyby/translation": "dev-db-driver"
},
...
zapp
Člen | 32
+
0
-

@Shaman Takto se mi povedlo natáhnout větev s db driverem a propojení s databází funguje dobře, ale v této větvi není commit s úpravou latte makra pro překlad viz. níže a v master větvi zase není db drive. Poradí někdo co s tím, nebo si mám údělat fork a dopsat databázový driver?

Invoking filters via $template->translate($vars) is deprecated, use ($vars|translate)