【问题标题】:sfFormLanguage displaying languages in their respective languagesfFormLanguage 以各自的语言显示语言
【发布时间】:2010-05-12 08:40:23
【问题描述】:

有没有一种方法可以使用 sfFormLanguage 显示语言,但使用它们各自的语言?

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

我想要这个:英语、法语、西班牙语

【问题讨论】:

    标签: internationalization symfony1


    【解决方案1】:

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

    使用您自己的实现子类化 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);
      }
    }
    

    两个 sn-ps 都深受 symfony 原始类的启发,但我认为它们更好地解决了问题。请注意,不需要(或允许)任何文化选项,因为每种语言都应该以原生方式呈现。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我不明白更简单的选项。能详细点吗?
      • 只需创建您自己的表单,该表单指向您的语言更改操作 - 我在问题中添加了一个示例,表单的生成取决于您(sfForm、静态 HTML、PHP 等)
      【解决方案3】:

      我拥有的是这样的:

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

      带有链接。我发现这对于只扫描页面以查找他们的语言的人来说更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多