0
// 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 文件会覆盖消息目录验证器域中当前存在的文件。

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

4

3 回答 3

0
(
    [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 类的解决方案。

于 2013-07-11T13:04:35.153 回答
0

在 Silex Github 页面上查看此解决方案
注册(在您的情况下为 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['validator']before$app['translator']会触发它的 register 方法,因此 yaml 文件会在之后加载。

我有同样的问题,这解决了它。

于 2015-03-21T22:19:27.087 回答
0

在最近的 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»方法

于 2017-05-31T15:26:59.753 回答