Postup pro vícejazyčný web

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

Ahoj,
chtěl bych se zeptat jak je nejlepší postupovat při tvorbě vícejazyčného webu? Rozchodit translator hned na začátku a překládat postupně nebo vše až na konec? Web bude primárně v němčině, ale kód budu psát klasicky v angličtině. Jazyky pak budou Němčina (jako defaultní) a Angličtina. Plus pak v administraci si uživatel bude moci libovolně měnit texty – Jak zajistit překlad těchto textů (do databáze?) a jak je potom vytáhnout dle zvoleného jazyku?

Díky

Tomáš Kolinger
Člen | 136
+
0
-

Statické překlady pomocí translátoru překládám již pro vývoji, resp. píši anglickou verzi, podle které se pak můžou dopsat další jazyky. Dělat vše najednou by bylo víc pracné a určitě by si na něco zapomněl. S tím ti určitě pomůže Kdyby\Translation.

Překlady záznamů v databázi jsou už složitější. Nejdřív si musíš uvědomit co vlastně potřebuješ, protože existuje několik cest jak obsah překládat, například:

  1. Každá verze webu bude nezávislá, takže článek bude mít u sebe jen nějaké lang_id a při výpisu si budu prostě vše filtrovat
  2. Web bude symetrický a budu chtít článek přeložit do všech jazyků – budu tedy mít tabulku articles a k tomu tabulku article_translations, kde budu mít například přeložený titulek, obsah a k tomu patřičné lang_id a article_id. Pří výpisu budu vždy joinovat do translations podle article_id a vybraného lang_id.

Editoval Tomáš Kolinger (25. 4. 2014 9:03)

akadlec
Člen | 1326
+
0
-

Systémové hlášky nějakým translatorem, třeba výborným Filipovým Kdyby/Translation a samotné texty(články) pak přes DB. V nějakém adminu si např. uděláš rozhraní pro vkládání těchto textů a budeš je vkládat v různých jazykových mutacích. Jak budeš řešit ukládání je na tobě a celkově aplikaci, např. můžeš mít jden článek a k nemu uloženy překlady a celé provázáno. Při načítání pro zobrazení si pak jen uděláš select podle zvoleného jazyka.

xciza
Člen | 194
+
0
-

Tak zkouším rozchodit kdyby/translation a vše šlo v pohodě až jsem narazil na použití. jedu podle návodu na GITu. Do Default presenteru jsem si podle návodu přidal:

/** @persistent */
   public $locale;

   /** @var \Kdyby\Translation\Translator */
   protected $translator;

   public function injectTranslator(\Kdyby\Translation\Translator $translator) {
       $this->translator = $translator;
   }

Pak vytvořil jazykové neon soubory pro en a de (kde de je výchozí jazyk), v default presenteru v metodě renderDefault jsem napsal

echo $this->translator->translate('messages.homepage.hello');

Ale do stránky mě to vypíše „homepage.hello“ místo „Hello World“ z jazykového souboru. V debug baru mě to hlásí, že chybí překlady (Missing translations). Co by mohlo být špatně prosím? Díky

David Zadražil
Člen | 62
+
0
-

@xciza: Na to jsem narazil taky, ještě jsem neměl čas to ohlásit, nebo jsem jenom něco přehlédl. Nicméně si zaregistruj rozšíření v bootstrapu a nikoli v neonu a poběží to. Nebo mě to jako prozatimní workaround fungovalo.

xciza
Člen | 194
+
0
-

Aha, aha, díky. Měl jsem to jak v configu tak v bootstrapu. Ale když to nechám v bootstrapu tak to již jde…

akadlec
Člen | 1326
+
0
-

co máte za verze nette?

xciza
Člen | 194
+
0
-

2.1 staženou pomocí composeru

David Zadražil
Člen | 62
+
0
-

@akadlec: nejde to ale ani v poslední :)

xciza
Člen | 194
+
0
-

Ještě bych k tomu měl dotaz:
V návodu jsem nenašel jak se na daný jazyk přesměrovat pomocí buttonu? Mám klasicky vlaječky pro němčinu a angličtinu. Němčina bude defaultní, ale samozřejmě je potřeba se na ní přepnout zpět z en verze.

one-two
Člen | 80
+
0
-
<a n:href="this, locale => 'de'">DE</a>
<a n:href="this, locale => 'en'">EN</a>

přičemž locale je ten @persistent

xciza
Člen | 194
+
0
-

Díky,
když mám tu proměnou $locale v BasePresenteru a ostatní od něj dědí, neměl bych se na ní taky dostat z jiného presenteru?

sKopheK
Člen | 207
+
0
-

Musíš ji mít jako public, jinak to ani s persistentama nefunguje.

/** @persistent */
public $locale;
xciza
Člen | 194
+
0
-

public ji mam, ale když ji chci v jinym presenteru dumpnout tak se mě to nedaří a píše že není proměnná definovaná…

Filip Procházka
Moderator | 4668
+
0
-

Pokud máš tu proměnnou v basepresenteru a je public, tak je přístupná v jiných presenterech. Není možné aby nebyla. Určitě dědíš od toho basepresenteru? Něco děláš špatně, musí tam být :)

Ale bez kódu ti nemáme jak poradit.


Ten bug s těmi překlady je hodně divný. Mimochodem, jestli to nebude tím, že slovníky se hledají při kompilaci a když pak slovník přidáte, tak si toho translator nevšimne. Stačilo by přitom smazat cache :)

Takže ten translator extension můžete kluci zase vrátit do configu :)

xciza
Člen | 194
+
0
-

V BasePresenteru mám:

/** @persistent */
public $locale;

/** @var \Kdyby\Translation\Translator */
protected $translator;

public function injectTranslator(\Kdyby\Translation\Translator $translator) {
    $this->translator = $translator;
}

protected function createTemplate($class = NULL) {
    $template = parent::createTemplate($class);
    $template->registerHelperLoader(callback($this->translator->createTemplateHelpers(), 'loader'));

    return $template;
}

a presenter:

class DefaultPresenter extends \App\Presenters\BasePresenter

@Filip Procházka: s tím translátorem máš pravdu. Stačilo smazat jenom cache