2014-03-19 56 views
3

我有兩個模塊 - 應用程序和StickyNotes。我需要在所有頁面上使用翻譯。ZF2翻譯

我的操作:

1)鑑於:<?=$this->translate('Home');?>

2)在應用程序\ Module.php:

public function onBootstrap(MvcEvent $e) 
{ 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    $eventManager = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
    $app = $e->getParam('application'); 
    $app->getEventManager()->attach('render', array($this, 'setLayoutTitle')); 
    $translator->setLocale('ru_RU'); 
    echo $translator->getLocale(); //ru_RU 
} 

3)在StickyNotes \ Module.php:

public function onBootstrap(MvcEvent $e) 
{ 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    $translator->setLocale('ru_RU'); 
    echo $translator->getLocale(); //ru_RU 
} 

4)應用程序\ .. \ module.config.php:

'service_manager' => array(
    'factories' => array(
     'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
    ), 
), 

'aliases' => array(
    'translator' => 'MvcTranslator', 
), 

'translator' => array(
    'locale' => 'en_US', 
    'translation_file_patterns' => array(
     array(
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
     ), 
    ), 
), 

5)StickyNotes \ .. \ module.config.php相同:

'service_manager' => array(
    'factories' => array(
     'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
    ), 
), 

'aliases' => array(
    'translator' => 'MvcTranslator', 
), 

'translator' => array(
    'locale' => 'en_US', 
    'translation_file_patterns' => array(
     array(
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
     ), 
    ), 
), 

,如果我嘗試$translator->getLocale();輸出 'ru_RU',但翻譯不`噸的工作。

此外,如果我手動將'locale' => 'en_US',更改爲'locale' => 'ru_RU', 翻譯工作正常。感謝您的答案!

+0

你嘗試刪除 '區域'=> 'EN_US' 在module.config.php? – Oyeme

+0

不知道它是否相關,但你的別名數組應該在'service_manager'數組中 – Crisp

+0

如果我刪除'locale',我有這個異常'致命錯誤:未捕獲異常'Zend \ I18n \ Exception \ ExtensionNotLoadedException'帶有消息'Zend \ I18n \ Translator組件需要intl PHP擴展'。關於'別名' - 如果我添加'service_manager',顯示錯誤 - 別名已包括在內。 – Walllter

回答

2
在應用程序\模塊

。PHP

public function onBootstrap(MvcEvent $e) { 
     $translator = $e->getApplication()->getServiceManager()->get('translator'); 
      $lang = $e->getRequest()->getQuery('lang'); // new language 
      $session = new Container('base'); 
      if($lang == null && $lang == ''){ 
       if ($session->offsetExists('lang')) { 
        $lang = $session->offsetGet('lang'); // current language 
       }else{ 
        $lang = Settings::DEFAULT_LANGUAGE; // default language 
       } 
      } 
      $session->offsetSet('lang', $lang); 
      $loc = Settings::$locations[$lang]; 
      $translator 
      ->setLocale($loc) 
      ->setFallbackLocale(Settings::DEFAULT_LANGUAGE .'_' . Settings::DEFAULT_LOCATION); 
    } 

和設置類

class Settings{ 
    const DEFAULT_LOCATION = 'IR'; 
    const DEFAULT_LANGUAGE = 'fa'; 

    public static $locations = array(
     'fa'=>'fa_IR', 
      'sa'=>'sa_SA',//Arabic (sa, sa-SA) 
     'tr'=>'tr_TR', 
     'en'=>'en_US' 
    ); 
} 
+0

解決了,謝謝。我刪除了 ''factories'=> array('translator'=>'Zend \ I18n \ Translator \ TranslatorServiceFactory',),' 並且所有翻譯都正常。 – Walllter

1

放翻譯的配置只有在應用程序\ module.config.php並確保您有應用模塊的語言文件夾,並把*的.mo和*上.po文件。

在事實上,你並不需要設置區域各模塊中。只有投入應用\ Module.php

在poEdit的目錄 - >屬性 - >來源關鍵詞>選中「翻譯」字存在,而且最好是先。

末,<?=$this->translate('Home');?>棄用。使用 <?php echo $this->translate('Home');?>

更新1:
抱歉,此代碼<?=$this->translate('Home');?>未過時但PHP手冊推薦是<?php echo $this->translate('Home');?>

http://php.net/manual/en/language.basic-syntax.phpmode.php

+0

我試圖做你說的一切,但翻譯仍然無法正常工作。我不知道這個解決方案有多好,但對我來說它的工作:在引導 '$ viewModel = $ e-> getApplication() - > getMvcEvent() - > getViewModel(); $ viewModel-> language = $ session-> offsetGet('lang');' 在視圖中:' translate('Home','default',$ language); ?>' – Walllter

+0

這是什麼?!? $ viewModel-> language = $ session-> offsetGet('lang'); –

+0

從會話中放入語言視圖模型。 – Walllter

1

此問題是由於缺乏國際擴展的

所以才需要執行以下步驟:

我必須安裝PHP國際擴展:

sudo apt-get install php5-intl 

的Apache重新啓動:

sudo service apache2 restart 

檢查哪些擴展編譯:

php -m