Gettext a Nette 2.2 (nepřekládá)

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

Zdravím,
snažím se rozchodit překlady pomocí GetTextu na Nette 2.2.2 a bohužel neúspěšně i když všechno nasvědčuje tomu, že by to mělo fungovat :X

  1. Nainstaloval jsem GetText extension která se hlásí v PHP infu
  2. Nainstaloval jsem GetText pro Nette od h4kuna
  3. Do Bootstrapu jsem přidal „\h4kuna\GettextLatte\DI\GettextLatteExtension::register($configurator);“ Tady jsem to musel trošku upravit, protože původní registrator „\h4kuna\DI\GettextLatteExtension::register($configurator);“ neexistuje.
  4. Do neonu jsem přidal:
gettextLatte:
	localePath: %appDir%/../locale/
	langs: {'cs' : 'cs_CZ.utf8'}

samozřejmě všechny cesty jsou správně.

  1. Vytvořil jsem si CLI, které mi vytáhne všechny texty a vytvoří z toho *.po soubor níže přikládám ukázku už přeloženého souboru přes PoEdit:
# Gettext keys exported by GettextExtractor
# Created: 2014-08-18T22:50:49+02:00
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.7\n"
"Language: cs_CZ\n"

# default.latte:17
msgid "Address search"
msgstr "Vyhledávání adres"

# default.latte:30
msgid "Addresses"
msgstr "Adresy"

# @layout.latte:48
msgid "All suppliers"
msgstr "Všechny dodavatelé"

# default.latte:7
msgid "Delete"
msgstr "Vymazat"

# load.latte:22
msgid "Does not matter"
msgstr "Nerozhoduje"

# HomePresenter.php:21
# HomePresenter.php:21
msgid "Heslo:"
msgstr "Heslo:"

.....
  1. V BasePresenteru jsem si injektnul translátor a nastavil do šablony: „$this->template->setTranslator($translator);“
  2. Přes příkaz „msgfmt“ jsem vytvořil messages.mo soubor.

Výsledek je takový, že to vypisuje původní texty co jsou v šablonách a nepřekládá je to. Když jsem se trošku štoural v tom addonu, tak v metodě:

public function translate($message, $count = NULL) {
	$data = func_get_args();
    if (!self::$translator) {
        return call_user_func_array('parent::t', $data);
    }

    $key = $this->oneParam ? 1 : 2;
    $numArgs = func_num_args();
    $isPlural = FALSE;

    if ($numArgs > $key && is_numeric($data[$key])) {
        $isPlural = TRUE;
        $this->pluralData($data);
    }

    $fce = $this->prefix();
    $slice = $this->method($isPlural, $fce);
    $t = call_user_func_array($fce, array_slice($data, 0, $slice));

    $diff = $this->foundReplace($data[0]);
    if ($diff) {
        return vsprintf($t, array_slice($data, $diff));
    }
    return $t;
}

mě to spadne na:

if (!self::$translator) {
    return call_user_func_array('parent::t', $data);
}

takže to vráti ze statické metody „t“ to samé co jde ze šabloony. Proč self:$translator není nastavený nechápu a ani nevím jakou magii se tam nastavuje :)) Zkusil jsem restartovat i Apache a bohužel bez výsledku.

Napadá někoho co dělám ještě špatně ? :(

Tomáš Votruba
Moderator | 1114
+
+2
-

Ahoj, pro překlady ti doporučuji kvalitní a udržovanou Kdyby\Translation. Nemusíš se v tom šťourat a na Nette 2.2 funguje

jasin755
Člen | 116
+
0
-

Jaké jsou vyhody nevýhody Symfony Translatoru oproti GetTextu?

edit:
Dívám se na Kdyby/Translation a popravdě me stejně více zaujalo řešení přes GetText. Kdyby/Translation mě připadne težkopádný (a pro naše copywritery určitě bude pohodlnější překládat přes Poedit :))

Editoval jasin755 (19. 8. 2014 0:31)

Tomáš Votruba
Moderator | 1114
+
+2
-

Výhody:

  • aktivní podpora
  • aktivní uživatelé (2000 stažení měsíčně vs 67 stažení)
  • určuje locale z http, session, url…, případně vlastní
  • umožňuje ukládání do session
  • kvalitní komponenta ze Symfony (návody, zaručený dlouhodobý vývoj)
  • nemusel bys zakládat tento post :)
  • automatická registrace maker do šablon
  • má jednoduchý extract command
  • samostatné fórum

Poedit můžeš používat. Co by ne? :)

Editoval Tomáš Votruba (19. 8. 2014 0:46)

h4kuna
Backer | 740
+
0
-

Ahoj pro Nette 2.2 je nová verze 1.3 která ještě není nastavená jako stable. Použití gettextu mi momentálně nefunguje pod wampem 64bit. Na linuxovém stroji vše jede. Ta metoda co jsi uvedl je jen pro kompatibilitu s ITranslatorem, jinak ITranslator nepoužívej a ani ve formech setTranslator(). Více méně je určená k tomu aby ti zpříjemnila zápis gettextu do šablony. Případně mi napiš na mail. Taky umí pamatovat si jazyk v session, číst ho z url a prohlížeče používá nativní gettext.

Editoval h4kuna (19. 8. 2014 7:42)