Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2] Jak tłumaczyć opisy pól w formularzach?
Forum PHP.pl > Forum > PHP > Frameworki
rcetra
Witam,

mam kolejny problem logistyczny. Zadanie wydaje się proste, formularze mają mieć tłumaczenia opisów pól.
Wszystko wydaje się proste, w szablonie *.twig czegoś w rodzaju:
  1. <h1>{{ 'text.show.title'|trans({}, 'BDKTranslatorBundle') }}</h1>

i po sprawie. Z formualrzami już nie ma tak prosto, bo formualrz domyślnie może wyglądać tak:
  1. <form method="post" {{ form_enctype(filter_form) }}>
  2. {{ form_label(filter_form) }}
  3. {{ form_errors(filter_form) }}
  4. {{ form_widget(filter_form) }}
  5. <p>
  6. <button type="submit">Filter</button>
  7. </p>
  8. </form>

...więc trzeba by zdefiniować odpowiednie teksty w samym pliku formularza *Type.php. Tylko, że tam nie mam dostępu do metody $this->get('translate').
Możecie mi podpowiedzieć, jakiś sposób tłumaczenie? Może to kwestia dodefiniowania czegoś w formularzu?

Mnie przychodzi albo tłumaczenie po stronie pliku twig każdego pola oddzielnie albo podmiana form_label(filter_form) podobnie jak podają na stronie http://symfony.com/doc/current/cookbook/fo...to-field-labels

Chyba, że mogę uzyskać dostęp do obiektu translatora jakoś z poziomu pliku *Type.php

Ciągle się uczę, proszę więc o wyrozumiałość. To pewnie jest oczywiste jak już się to wie.

--
Znalazłem coś takiego: http://sf.khepin.com/2012/01/form-label-tr...n-in-symfony-2/
Warto przetestować...
--
Niestety powyższa metoda kiepsko sobie radzi z polami entity kiedy mają być pokazane jako chceckboxy. Są wtedy tłumaczone wartości a nie sam opis pola.
--
Ostatecznie rzecz rozwiązałem średnio fajnie, ale działa i działa tak jak chcę. Może komuś się przyda.
W kontrolerze po utworzeniu obiektu fotmularza przekazuję obiekt z translatorem:
  1. ...
  2. $tft = new TextFilterType();
  3. $tft->setTr($this->get('translator'));
  4. $filter_form = $this->createForm($tft, $defaultData);
  5. ...

Same tłumaczenia umieściłem w Resources\translations\messages.pl.yml dzięki czemu nie muszę niczego więcej podawać translatorowi.
W samej klasie TextFilterType jest po prostu metoda:
  1. ...
  2. public function setTr($tr)
  3. {
  4. $this->tr = $tr;
  5. }
  6. ...

oczywiście gdzieś wcześniej deklaruję private $tr;
w samym formularzu używam już tylko
  1. ...
  2. public function buildForm(FormBuilder $builder, array $options)
  3. {
  4. $builder
  5. ->add('lang', 'entity', array(
  6. 'class' => 'BDKTranslatorBundle:TranslatorLang',
  7. 'property' => 'lng_name',
  8. 'multiple' => true,
  9. 'expanded' => true,
  10. 'label' => $this->tr->trans('text.filter.lang'),
  11. 'required' => false
  12. ))
  13. ...

Osobiście uważam, że to duże niedopatrzenie, że muszę dookoła trochę rzecz robić. W końcu opisy pól zwyke też się tłumaczy a zalecenie jest, żeby korzystać właśnie z katalogu Form do trzymania tam formatek.
Jeśli ktoś ma lepsze rozwiązanie, to poproszę bardzo, nawet na priv jakoś.
ano
W Symfony2 standardowe szablony pól formularzy / labela uwzględniają tłumaczenie.
Spójrz np na szablon form_label (czyli to co wywołujesz w Twigu: {{ form_label(form.input1) }}
https://github.com/symfony/symfony/blob/mas..._label.html.php
  1. <?php if ($required) { $attr['class'] = (isset($attr['class']) ? $attr['class'] : '').' required'; } ?>
  2. <label <?php foreach($attr as $k => $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?>>
  3. <?php echo $view->escape($view['translator']->trans($label, array(), $translation_domain)) ?>
  4. </label>


Widać tutaj, że następuje próba tłumaczenia tekstu labela.
Więc spróbuj ustawić sobie normalnie labele dla pól w swoim pliku *Type i następnie dodaj w pliku z tłumaczeniami ich przetłumaczone odpowiedniki. Powinno zadziałać.

... więc Twój kod
  1. public function buildForm(FormBuilder $builder, array $options)
  2. {
  3. $builder
  4. ->add('lang', 'entity', array(
  5. 'label' => $this->tr->trans('text.filter.lang'),
  6. ))


powoduje to, że następuje 'podwójne tłumaczenie' labela. (Najpierw to twoje tr->trans a potem trans z szablonu form_label).
Spróbuj zmienić na samo:
'label' => 'text.filter.lang'
i daj znać czy działa tak samo jak Twoja wersja.
rcetra
Hej, działa!

Wniosek jest taki, że to domyślne działanie tylko kiedy teksty są umieszczone w pliku messages.XX.yml.

Ta zmienna $translation_domain mnie intryguje, bo jest z tego co pamiętam parametrem skąd trans() ma brać teksty.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.