2013-04-03 73 views
3

我有用於不同語言的.po和編譯的.mo語言文件。 但語言翻譯不適用於Zend表單驗證錯誤消息。 我不想爲fr.php使用額外的.php文件。ZF2 - 如何翻譯Zend表單驗證錯誤消息?

我從click here

$translator = new Zend\I18n\Translator\Translator(); 
$translator->addTranslationFile(
    'phpArray' 
    'resources/languages/en.php', 
    'default', 
    'en_US' 
); 

Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 

任何解決方案如何實現它在ZF2得到這個代碼。

+0

如果你有'.po'和'.mo'翻譯文件,爲什麼要添加一個'.php'文件?你還沒有說明你的代碼的問題是什麼? – Havelock

+0

我只是想添加翻譯在Zend表單驗證錯誤,這是無法翻譯,因爲我使用echo $ this-> formElementerrors( $ form-> get('username'));其中包裹錯誤消息 – Arvind

回答

1

只需添加您的.po.mo文件,而不是.php的,即是這樣的:

$translator = new Zend\I18n\Translator\Translator(); 
$translator->addTranslationFile(
    'gettext' 
    'resources/languages/fr.mo', 
    'default', 
    'fr_FR' 
); 
Zend\Validator\AbstractValidator::setDefaultTranslator($translator); 

然後把它翻譯,使用

echo $this->formElementErrors($form->get("username"), 
           array('message' => $this->translate("errormessage")) 
); 

我不知道是怎麼回事在ZF2中進行翻譯的性能,但是在使用.php文件的ZF1中,文件比其他任何方法都快。

+0

感謝您可以幫助我如何更改zf2中zend窗體形成的按鈕上的文本? – Arvind

+0

不客氣。你的意思是*如何翻譯按鈕上的文字* – Havelock

+0

Yes.But我從控制器具有Zend的形式翻譯實例,同時調用Zend的形式instance.Is有什麼辦法讓服務定位在Zend的形式 – Arvind

5

我不贊成所選答案:P

當添加新的翻譯到您的配置,做使用默認的翻譯文本域。語法如下:

$translator->addTranslationFile(
    $type, 
    $resource, 
    $textDomain, //<-- this is the important one 
    $lang 
); 

在您的示例中,您已將文件添加到default-textdomain。不幸的是,這給它帶來了很多麻煩,因爲它不會像預期的那樣工作。每當你添加翻譯文件,將它們添加到你自己的文本域!

之後,您需要做的就是分配Zend\Form\View\Helper您的文本域。這是由以下完成:

// For Labels 
$this->formLabel()->setTranslatorTextDomain('your-textdomain'); 

// For Buttons (input type submit) 
$this->formButton()->setTranslatorTextDomain('your-textdomain'); 

// For Error-Messages 
$this->formElementErrors()->setTranslatorTextDomain('your-textdomain'); 

如何獲得的ServiceManager到表格?

這也很簡單。簡單之一是使用constructor-injection並將ServiceManagerServiceLocator注入您的表單的__construct()。在控制器級,這將是這個樣子:

$serviceLocator = $this->getServiceLocator(); 
$form   = new My\Form($serviceLocator); 

更深入地介紹了FORM-依賴可以發現on my Blog,在這裏我說明上依賴於數據庫的連接的Zend\Form\Element\Select - 元素的人口。

關於譯者本身

另外一點需要注意的是:只要有連接到您的配置名稱爲translator譯者-服務,它會自動連接到形式爲默認的轉換。這是我經常在模塊中使用的配置示例:

'translator' => array(
    'locale' => 'de_DE', 
    'translation_file_patterns' => array(
     array(
      'type'  => 'phparray', 
      'base_dir' => __DIR__ . '/lang', 
      'pattern' => '%s.php', 
      'text_domain' => __NAMESPACE__, 
     ), 
    ), 
), 
+0

+1的詳細答案 – Havelock

+0

文本域的要點是什麼?我發現它是關於命名空間的東西......所以我想這是爲了避免與其他可能翻譯相同文本的模塊衝突? –

+1

@DominicWatson正是這個。命名空間基本上只是一種常見的最佳做法,這包括語言資源。 – Sam