Postup pro vícejazyčný web
- xciza
- Člen | 194
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
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:
- 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
- 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 tabulkuarticle_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
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
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
@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.
- Filip Procházka
- Moderator | 4668
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
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