2013-01-10 42 views
5

裏面我有這種情況:翻譯引用另譯

unit: 
    sqkm: Square Kilometers 

my_translation: Size is %size% ## I want to append the value of unit.sqkm here ## 

有引用my_translation鍵內unit.sqkm翻譯的方法嗎?

編輯:請注意,我知道如何通過樹枝做到這一點。我的問題是:有沒有辦法在翻譯文件中做到這一點。

+1

你在翻譯文件中找到了一種方法嗎? – crmpicco

回答

1

您可以在其他翻譯中使用翻譯後的值。

{{ 'paragraph' | trans({ '%size%': 3, '%unit%': 'unit' | trans()}) }} 

哪裏unit本身就是一個翻譯的另一個關鍵。但是你的翻譯文件看起來是這樣的:

paragraph: Size is %size% %unit% 
unit: Square Kilometers 
+1

感謝您的回答,但我想在我的翻譯文件中做到這一點,而不是在視圖中。 – smoove

+0

@devsheeep這對於通過Twig實現相同的結果很有用,但是OP要求爲翻譯文件提供解決方案。 – crmpicco

1

在你的嫩枝模板,試試這個:

{{ 'my_translation' | trans({'%size%': size, 'unit.sqkm' : ('unit.sqkm'|trans)}) }} 
+0

感謝您的回答,但我想在我的翻譯文件中做到這一點,而不是在視圖中。 – smoove

1

我延長Symfony的Tanslator此:

<?php 

namespace Bundle\Program\Translation; 

use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator; 

class Translator extends BaseTranslator 
{ 
    /** 
    * Uses Symfony Translator to translate, but enables referencing other translations via @@[email protected]@ 
    */ 
    public function trans($id, array $parameters = array(), $domain = null, $locale = null) 
    { 
     $text = parent::trans($id, $parameters, $domain, $locale); 

     $translations = []; 

     $delimiter = "@@"; 
     $strLen = strlen($delimiter); 
     $pos = strpos($text, $delimiter); 

     while ($pos !== false) { 
      $startsAt = $pos + $strLen; 
      $endsAt = strpos($text, $delimiter, $startsAt); 
      $translations[] = $delimiter . substr($text, $startsAt, $endsAt - $startsAt) . $delimiter; 
      $pos = strpos($text, $delimiter, $endsAt + $strLen); 
     } 

     foreach ($translations as $translation) { 
      $translationTrim = str_replace($delimiter, '', $translation); 
      $text = str_replace($translation, $this->trans($translationTrim, $parameters, $domain, $locale), $text); 
     } 

     return $text; 
    } 
} 

,然後更換Symfony的翻譯class via參數:

parameters: 

    translator.class: Bundle\Program\Translation\Translator 

現在您可以通過@@ other.translation @@ INSIDE引用其他翻譯了。