sfFormLanguage以各自的语言显示语言

时间:2010-05-12 08:40:24

标签: internationalization symfony1

有没有办法使用sfFormLanguage显示语言,但是用各自的语言显示?

我的意思是,而不是:英语,法语,西班牙语

我想要这个: English,Français,Español

3 个答案:

答案 0 :(得分:2)

我知道这个问题被标记为已回答,但我只是偶然发现了同样的问题并想以更通用的方式解决它,这就是我所拥有的。

使用您自己的实现子类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原始课程的启发,但我认为它们可以更好地解决问题。请注意,不需要(或允许)任何文化选项,因为每种语言都应该以原生方式呈现。

答案 1 :(得分:0)

不,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>

答案 2 :(得分:0)

我拥有的是:

<?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 ?>

有链接。我觉得那些只是扫描页面寻找他们语言的人更容易。