【问题标题】:Symfony validator translationsSymfony 验证器翻译
【发布时间】:2018-07-26 13:05:35
【问题描述】:

我刚开始使用symfony validator,我真的很喜欢它,除了翻译部分,目前它使用我自己的翻译库,但我发现了translations for almost all languages 存储的validator.LOCALE.xlf 文件,我不知道如何使用它们。

我目前的验证人注册码是

$container->register('validator', \Symfony\Component\Validator\Validator\ValidatorInterface::class)
    ->setFactory(
        [
            new Reference('validator.builder'),
            'getValidator'
        ]
    );

$container->register('validator.builder', \Symfony\Component\Validator\ValidatorBuilderInterface::class)
    ->setFactory(
        [
            \Symfony\Component\Validator\Validation::class,
            'createValidatorBuilder'
        ]
    )
    ->addMethodCall(
        'setTranslator',
        [
            new Reference('translator') // Symfony translatorInterface
        ]
    )
    ->addMethodCall(
        'setTranslationDomain',
        [
            'messages'
        ]
    );

看起来我已经检查了整个验证器结构,如 RecursiveValidator、ContextualValidator、Contexts 等,但只是在某个地方缺少一个参数,另一方面 ConstraintViolationBuilder 只是简单地接受传递的翻译器并尝试通过它翻译约束消息,没有尝试使用任何 xlf 文件。

只是强制搜索所有验证器库文件也没有结果。

Symfony guilde 也没有帮助,因为它提供使用默认错误句子作为翻译键,并在您自己的翻译文件中使用此“键”,但是为什么要将已翻译的句子复制到您自己的文件中,以及当已经存在结构化文件(我说的是 .xlf)时,用键模式创建混乱(例如我使用蛇形案例)?

【问题讨论】:

    标签: symfony


    【解决方案1】:

    解决方案是将 xlf 文件加载器添加到您的翻译器中,并将 .xlf 翻译作为资源传递给它。

    类似的东西

    $container->register('translator.xlf_file_loader', \Symfony\Component\Translation\Loader\XliffFileLoader::class);
    $container->register('translator.php_file_loader', \Symfony\Component\Translation\Loader\PhpFileLoader::class);
    $container->register('translator', \Project\Framework\Translation\Translator::class)
        ->addArgument(
            new Reference('service_container')
        )
        ->addMethodCall(
            'addLoader',
            [
                'php',
                new Reference('translator.php_file_loader')
            ]
        )
        ->addMethodCall(
            'addLoader',
            [
                'xlf',
                new Reference('translator.xlf_file_loader')
            ]
        )
        ->addMethodCall('addResource', ['php', __DIR__ . '/../translation/lt.php', 'lt'])
        ->addMethodCall('addResource', ['php', __DIR__ . '/../translation/en.php', 'en'])
        ->addMethodCall('addResource', ['php', __DIR__ . '/../translation/ru.php', 'ru'])
    
        ->addMethodCall('addResource', ['xlf', __DIR__ . '/../../vendor/symfony/validator/Resources/translations/validators.lt.xlf', 'lt'])
        ->addMethodCall(
            'setFallbackLocales',
            [
                ['lt']
            ]
        );
    

    【讨论】:

      【解决方案2】:

      你有没有尝试过

      1. 更改应用配置中的语言环境:

        # config/packages/translation.yaml framework: default_locale: 'en' translator: fallbacks: ['en']

      Documentation

      1. 根据(用户)输入更改语言环境:

        public function onKernelRequest(GetResponseEvent $event)
         {
           $request = $event->getRequest();
        
           // some logic to determine the $locale
           $request->setLocale($locale);
         }
        

      Documentation

      【讨论】:

      • ValidatorBuilder#L324 如果没有设置翻译器,则覆盖区域设置,但如果是,翻译器会自行从请求中获取区域设置,无需额外代码。所以解决方法就是传递额外的翻译资源,翻译器会自动翻译所有内容。
      猜你喜欢
      • 2016-11-08
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多