sfFormLanguage отображает языки на соответствующем языке - PullRequest
0 голосов
/ 12 мая 2010

Есть ли способ отображения языков с использованием sfFormLanguage, но на соответствующем языке?

Я имею в виду, вместо этого: Английский, Французский, Испанский

Я хочу это: English, Français, Español

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Я знаю, что этот вопрос помечен как ответивший, но я наткнулся на ту же проблему и хотел решить ее более общим способом, вот что у меня есть.

Подкласс sfFormLanguage с вашей собственной реализацией и просто переопределите configure ():

class myFormLanguage extends sfFormLanguage {
  public function configure()
  {
    $this->setValidators(array(
      'language' => new sfValidatorI18nChoiceLanguage(array('languages' => $this->options['languages'])),
    ));

    $this->setWidgets(array(
      'language' => new myWidgetFormI18nChoiceLanguage(array('languages' => $this->options['languages'])),
    ));
  }
}

Как видите, для фактического выбора используется другой виджет, реализация которого показана ниже.

class myWidgetFormI18nChoiceLanguage extends sfWidgetFormChoice
  protected function configure($options = array(), $attributes = array())
  {
    parent::configure($options, $attributes);

    $this->addOption('languages');
    $this->addOption('add_empty', false);

    // get the desired language codes
    $languageCodes = isset($options['languages']) ? $options['languages'] : null;
    if ($languageCodes == null) {
        $languageCodes = array_keys(sfCultureInfo::getInstance()->getLanguages());
    }
    $languages = array();
    // for each language code add the language to the choices by querying a corresponding culture info instance
    foreach ($languageCodes as $lc) {
        $languages = array_merge($languages, sfCultureInfo::getInstance($lc)->getLanguages(array($lc))); 
    }

    $addEmpty = isset($options['add_empty']) ? $options['add_empty'] : false;
    if (false !== $addEmpty)
    {
      $languages = array_merge(array('' => true === $addEmpty ? '' : $addEmpty), $languages);
    }

    $this->setOption('choices', $languages);
  }
}

Оба фрагмента вдохновлены оригинальными классами Symfony, но я думаю, что они решают проблему намного лучше. Обратите внимание, что никакой культурный вариант не требуется (или не разрешен), так как каждый язык должен быть представлен изначально.

0 голосов
/ 13 мая 2010

Что у меня есть это:

<?php  $languages = array('en' => 'English', 'es' => 'Español', 'ca' => 'Català'); ?>
<?php foreach (array_keys($languages) as $lang):?>
    <?php echo link_to($languages[$lang], 'language/changeLanguage?lang='.$lang)?>
<?php endforeach ?>

со ссылками. Я считаю, что это проще для людей, которые просто просматривают страницу в поисках своего языка.

0 голосов
/ 12 мая 2010

Нет, sfFormLanguage полностью сформирован и упакован в вакуум, поэтому вы должны принять его как есть. Это удобный код, который я использовал сам, но я думаю, было бы неплохо иметь некоторые параметры конфигурации.

Тем не менее, это должно быть довольно легко написать свое собственное, углубившись в класс sfFormLanguage и изменив части, которые выполняют поиск культуры, и вместо этого используют статический список вашего собственного создания.

Существует еще более простой вариант: просто создайте свой собственный выпадающий список, который подключается к форме sfFormLanguage в ожидаемой форме:

<form action="/change-language">

  <label for="language">Language</label>
  <select name="language" id="language">
    <option value="es">Español</option>
    <option value="en" selected="selected">English</option>
    <option value="fr">Français</option>
  </select>

  <input type="submit" value="ok">
</form>
...