2013-04-12 10 views
7

Nie otrzymuję it! Czy ktoś może wyjaśnić, jak tłumaczyć etykiety formularzy? Prosty przykład byłby świetny.Jak tłumaczyć etykiety formularzy w Zend Framework 2?

Z góry dziękuję!


klasa Search \ Form \ CourseSearchForm

... 

class CourseSearchForm extends Form { 

    ... 

    public function __construct(array $cities) { 
     parent::__construct('courseSearch'); 
     ... 
     $this->add(array(
      'name' => 'city', 
      'type' => 'Zend\Form\Element\Select', 
      'options' => array(
       'label' => 'Stadt', 
       'value_options' => $this->cities, 
       'id' => 'searchFormCity', 
      ), 
     )); 
     ... 
    } 
} 

widok skrypt /module/Search/view/search/search/search-form.phtml

<?php echo $this->form()->openTag($form); ?> 
<dl> 
    ... 
    <dt><label><?php echo $form->get('city')->getLabel(); ?></label></dt> 
    <dd><?php echo $this->formRow($form->get('city'), null, false, false); ?></dd> 
    ... 
</dl> 
<?php echo $this->form()->closeTag(); ?> 
<!-- The formRow(...) is my MyNamespace\Form\View\Helper (extends Zend\Form\View\Helper\FormRow); the fourth argument of it disables the label. --> 

The module/Application/config/module.config.php jest skonfigurowany:

return array(
    'router' => ... 
    'service_manager' => array(
     'factories' => array(
      'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
     ), 
    ), 
    'translator' => array(
     'locale' => 'de_DE', 
     'translation_file_patterns' => array(
      array(
       'type'  => 'gettext', 
       'base_dir' => __DIR__ . '/../language', 
       'pattern' => '%s.mo', 
      ), 
     ), 
    ), 
    'controllers' => ... 
    'view_manager' => ... 
); 

ja też edytowane mój pogląd i skorzystać z pomocnika FormLabel wyświetlania:

<dt><label><?php echo $this->formLabel($form->get('city')); ?></label></dt> 

Ponadto I debugowane ten FormLabel w miejscu, gdzie jest używany tranlator (linie 116-120) - - wydaje się być w porządku.

Ale nadal nie działa.


EDIT

The (testowe) przedmioty do etykiet, dodałem do pliku de_DE.po ręcznie, są tranlated. Problemem z boku ZF2 było to, że użyłem w skrypcie widoku $form->get('city')->getLabel() zamiast $this->formlabel($form->get('city')).

Problem polega na tym, że etykiety nie są dodawane do pliku de_DE.po. Ale nie jest to już kwestia ZF2, więc zaakceptowałem odpowiedź Rubena i otwieram nowe pytanie dotyczące Poedit.

+1

proszę dodać trochę kodu, co masz obecnie. Ułatwi Ci to pomóc i zobaczyć, na czym polega problem. – Ruben

+0

Dziękuję za szybką odpowiedź! Dodałem odpowiedni kod teraz. – automatix

Odpowiedz

8

Zamiast:

<?php echo $form->get('city')->getLabel(); ?> 

Należy użyć widoku formlabel pomocnika. Ten helper automatycznie używa twojego tłumacza podczas renderowania, jeśli wstawiłeś go do ServiceManager. Najprawdopodobniej trzeba będzie go w module module.config.php danej aplikacji:

'service_manager' => array(
     'factories' => array(
      'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
     ), 
    ), 

    'translator' => array(
     'locale' => 'en_US', 
     'translation_file_patterns' => array(
      array(
       'type'  => 'gettext', 
       'base_dir' => __DIR__ . '/../language', 
       'pattern' => '%s.mo', 
      ), 
     ), 
    ), 

Kiedy używasz pomocnika widok formlabel:

echo $this->formLabel($form->get('city')); 

I oczywiście upewnić się twoje tłumaczenia są w twojej. plik po.

+0

Konfiguracja 'module.config.php' jest skonfigurowana i teraz edytowałem również mój widok i użyłem pomocnika widoku FormLabel'. Debugowałem 'FormLabel' w miejscu, w którym używany jest tranlator (linie [116-120] (https://github.com/zendframework/zf2/blob/master/library/Zend/Form/View/Helper /FormLabel.php#L116)) - wydaje się być w porządku. Ale wciąż nie działa. – automatix

+0

Czy jesteś pewien, że tłumaczenia są w twoim pliku .po? Czy sprawdziłeś, czy PoEdit analizuje wartości etykiet i czy przetłumaczyłeś je w określonych ustawieniach narodowych? – Ruben

+0

Z pewnością był to problem. Zobacz zaktualizowaną odpowiedź powyżej oraz moją drugą odpowiedź [tutaj] (http://stackoverflow.com/questions/15969607/what-is-the-recomended-way-best-practice-to-poedit-translate-strings-without-a) . – automatix

1

@Ruben mówi prawo!

Ja używam PoEdit wygenerować moje * .mo pliki i mieć pewność, aby uzyskać wszystkie tłumaczenia w pliku, tworzę gdzieś (w widoku na przykład) plik o nazwie _lan.Phtml z całego tekstu do przetłumaczenia:

<?php echo $this->translate("My label"); 
... ?> 

Oczywiście Poedit musi być skonfigurowany tak, aby znaleźć moje słowo. sprawdzić to how to configure it

+0

Ładne proste obejście. Dziękuję Ci! Dobry pomysł na tę sprawę, jeśli nie będę działał. – automatix

+1

zrobić coś podobnego, używając Poedit, ale nie ma potrzeby dodatkowego pliku: https://coderwall.com/p/atvtbw – aimfeld

4

Myślę, że problem jest to, że etykiety nie są wykrywane przez poedit (lub podobnego narzędzia), więc trzeba dodać je ręcznie do katalogów poedit (.po)

aby struny label wykrywane za pomocą narzędzi takich jak poedit, struny muszą być stosowane wewnątrz translate() funkcję lub _() (inne funkcje mogą być dodawane w katalog/properties/źródła kluczowych)

jako _() funkcja nie jest użytkownikiem w ZF2 (dzisiaj), więc mały hack to dodać namaszczenie tak w index.php (nie trzeba nic przerabiać, w ten sposób, w poedit params):

// in index.php 
function _($str) 
{ 
    return $str; 
} 

w kodzie, wystarczy użyć go, gdy struny są poza funkcją przełożenia

//... 
    $this->add(array(
     'name' => 'city', 
     'type' => 'Zend\Form\Element\Select', 
     'options' => array(
      'label' => _('myLabel') , // <------ will be detected by poedit 
      'value_options' => $this->cities, 
      'id' => 'searchFormCity', 
     ), 
    )); 
//... 

lub tak, jeśli wolisz

$myLabel = _('any label string'); // <--- added to poedit catalog 
//... 
     'options' => array(
      'label' => $myLabel , 
      'value_options' => $this->cities, 
      'id' => 'searchFormCity', 
     ), 
+0

HI @aromatix używam tłumaczenia językowe w Zend 2 projektu uczenia się gdy używam $ this-> add (array ( 'name' => "username", 'type' => 'Zend \ Form \ Element \ Text', 'options' => array ( 'label' => _ ("Twoja nazwa użytkownika"), // znalazłem błąd krytyczny na tej pozycji ), )); Błąd krytyczny: Wywołanie niezdefiniowanej funkcji Incuser \ Form \ _() _() do przetłumaczenia etykiety formularza powoduje błąd krytyczny Używam teraz php 5.3.1. Proszę mi pomóc, nie jestem w stanie rozgryźć tego problemu. –