Symfony验证程序翻译

时间:2018-07-26 13:05:35

标签: symfony

我刚刚开始使用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),并使用键模式造成混乱(例如,我使用蛇形保护套)?

2 个答案:

答案 0 :(得分:0)

解决方案是将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']
        ]
    );

答案 1 :(得分:0)

您只是尝试过

  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