7

Symfony2プロジェクトがあり、Translationテキストを翻訳するためにコンポーネントを使用しています。yml私はそのようにファイルにすべての翻訳を持っています

translation-identifier: Translated text here

テキストを翻訳すると、次のようになりますTwig

'translation-identifier'|trans({}, 'domain')

問題は、場合によっては、同じ翻訳に 2 つの異なるテキストを使用したい (複数形ではない) ことです。これが私がそれをどのように機能させたいかです:

  1. yml異なるテキストを持つ必要がある翻訳用に、ファイルに2 つのテキストを定義します。それぞれに独自の一意のサフィックスがあります

    translation-identifier-suffix1
    
    translation-identifier-suffix2
    
  2. 選択するサフィックスを定義するグローバルルールを定義します。以下の疑似コード:

     public function getSuffix() {
       return rand(0, 10) < 5 ? '-suffix1' : '-suffix2';
     }
    
  3. Twig (および PHP) は同じように見えます。つまり、識別子だけをサフィックスなしで指定します。次に、トランスレータは識別子にサフィックスを追加し、一致を見つけようとします。一致するものがない場合は、サフィックスなしで再度一致を見つけようとします。

4

3 に答える 3

9

私の知る限り、翻訳コンポーネントはそれをサポートしていません。

ただし、同じ種類の動作が必要な場合は、翻訳サービスをオーバーライドすることで実行できます。

1) サービスをオーバーライドする

# app/config/config.yml
parameters:
    translator.class:      Acme\HelloBundle\Translation\Translator

まず、サービスのクラス名を保持するパラメーターを に設定することで、独自のクラスに設定できますapp/config/config.yml。参考までに: https://github.com/symfony/FrameworkBundle/blob/master/Resources/config/translation.xml

2) 提供されたトランスレータ クラスを拡張しsymfony framework bundleます。参考までに: https://github.com/symfony/FrameworkBundle/blob/master/Translation/Translator.php

trans3)プロバイダである関数を で上書きしますtranslator componenthttps://github.com/symfony/Translation/blob/master/Translator.php

お役に立てれば!

于 2013-03-22T09:21:12.290 に答える
5

誰かがそれを必要とする場合に備えて、これが拡張翻訳者クラスです

<?php

    namespace Acme\HelloBundle\Translation;

    use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator;
    use Symfony\Component\Translation\MessageSelector;
    use Symfony\Component\DependencyInjection\ContainerInterface;

    class Translator extends BaseTranslator {

        const SUFFIX_1 = '_suffix1';
        const SUFFIX_2 = '_suffix2';

        private $suffix;

        public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array()) {
            parent::__construct($container, $selector, $loaderIds, $options);
            $this->suffix = $this->getSuffix($container);
        }

        public function trans($id, array $parameters = array(), $domain = 'messages', $locale = null) {     
            if ($locale === null)
                $locale = $this->getLocale();

            if (!isset($this->catalogues[$locale]))
                $this->loadCatalogue($locale);

            if($this->suffix !== null && $this->catalogues[$locale]->has((string) ($id . $this->suffix), $domain))
                $id .= $this->suffix;

            return strtr($this->catalogues[$locale]->get((string) $id, $domain), $parameters);
        }

        private function getSuffix($container) {
            return rand(0, 10) < 5 ? self::SUFFIX_1 : self::SUFFIX_2;
        }

    }

?>
于 2013-03-22T15:42:57.467 に答える
5

translator.classSymfony 3 の時点で、パラメーターが使用されなくなっ たため、Venu の回答は完全には機能しなくなりました。

カスタム トランスレータ クラスをロードするには、コンパイラ パスを作成する必要があります。

<?php

namespace Acme\HelloBundle\DependencyInjection\Compiler;

use Acme\HelloBundle\Translation\Translator;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class TranslatorOverridePass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container->getDefinition('translator.default')->setClass(Translator::class);
    }
}

そして、このコンパイラ パスをコンテナーに追加する必要があります。

<?php

namespace Acme\HelloBundle;

use Acme\HelloBundle\DependencyInjection\Compiler\TranslatorOverridePass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeHelloBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new TranslatorOverridePass());
    }
}
于 2017-03-14T08:52:51.800 に答える