【问题标题】:Silex form validator translations not being set from Yaml未从 Yaml 设置 Silex 表单验证器翻译
【发布时间】:2017-05-31 23:26:59
【问题描述】:
// Forms
$app->register(new FormServiceProvider());
$app->register(new Silex\Provider\ValidatorServiceProvider());

// Locale
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
  'locale' => 'en',
  'locale_fallback' => 'en'
));

$app['translator']->addLoader('yaml', new Symfony\Component\Translation\Loader\YamlFileLoader());
$app['translator']->addResource('yaml', $app['root_dir'] .'/config/poseidon/locales/en.yml', 'en');
$app['translator']->addResource('yaml', $app['root_dir'] .'/config/poseidon/locales/validators.en.yml', 'en', 'validators');

这就是我的 index.php 的一部分。消息域很好,但验证器域不是。这是因为 xlf 文件中的默认表单翻译意味着我正在加载的 yml 文件不适用。

例如,如果我编辑 xlf 文件并删除:

此值不应为空。

然后是我的 yml 文件:

# validators.en.yml

This value should not be blank.: This is a required field

将被加载,并将此密钥添加到验证器数组中。但是,似乎只要正在加载这些默认 xlf 文件,我的 yaml 文件中的任何内容都无法覆盖验证器翻译域。

任何帮助将不胜感激,因为我不知道为什么会发生这种情况。谢谢。

编辑:

这实际上与我的想法相反,我补充说:

echo $app['translator']->trans(
                        'This value should not be blank.',
                        array(), 
                        'validators'
                    );

在翻译器添加资源并获得预期结果之后,这意味着当加载 FormServiceProvider 时,默认的 xlf 文件会覆盖消息目录验证器域中当前存在的文件。

所以,如果有人知道如何防止它这样做,那就太好了,谢谢。

【问题讨论】:

    标签: php forms translation silex


    【解决方案1】:
    (
        [0] => Array
            (
                [0] => xliff
                [1] => /Silex/vendor/symfony/form/Symfony/Component/Form/Resources/translations/validators.en.xlf
                [2] => validators
            )
    
        [1] => Array
            (
                [0] => xliff
                [1] => /Silex/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf
                [2] => validators
            )
    
        [2] => Array
            (
                [0] => yaml
                [1] => /Silex/web/../config/poseidon/locales/validators.en.yml
                [2] => validators
            )
    
        [3] => Array
            (
                [0] => yaml
                [1] => /Silex/web/../config/poseidon/locales/en.yml
                [2] => messages
            )
    
    )
    

    这不是最理想的解决方案,但我编辑了 Translator 类并反转数组,如上所示,以确保 xliff 文件在 yml 文件之前加载,现在一切正常。

    我确实需要找到一个不编辑 Translator 类的解决方案。

    【讨论】:

      【解决方案2】:

      查看this solution on the Silex Github page:
      注册(在你的情况下在 index.php 中):

      $app['locale'] = 'fr';
      
      $app->register(new TranslationServiceProvider());
      $app->register(new ValidatorServiceProvider());
      
      $app['validator'];
      $app['translator'] = $app->share(
          $app->extend(
              'translator',
              function ($translator, $app) {
                  $translator->addLoader('yaml', new YamlFileLoader());
                  $translator->addResource('yaml', 'path/to/validators.fr.yml', 'fr', 'validators');
      
                  return $translator;
              }
          )
      );
      

      $app['translator'] 之前调用$app['validator'] 会触发它的注册方法,因此之后会加载yaml 文件。

      我遇到了同样的问题,这个解决了。

      【讨论】:

        【解决方案3】:

        在最近的 silex 版本中,使用

        $app['locale'] = 'fr';
        
        $app->register(new TranslationServiceProvider());
        $app->register(new ValidatorServiceProvider());
        
        $app['validator'];
        $app['translator'] = $app->extend(
            'translator',
            function ($translator, $app) {
                $translator->addLoader('yaml', new YamlFileLoader());
                $translator->addResource('yaml', 'path/to/validators.fr.yml', 'fr', 'validators');
        
                return $translator;
            }
        );
        

        没有 «share» 方法

        【讨论】:

          猜你喜欢
          • 2012-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-15
          • 1970-01-01
          相关资源
          最近更新 更多