2017-03-02 122 views
0

我有Zend Framework 3應用程序與工作翻譯使用po文件。zf3更改區域設置取決於用戶選擇

我有這樣的配置在我的\設置\ global.php文件:

'translator' => [ 
    'locale' => 'en_US', 
    'translation_file_patterns' => [ 
     [ 
      'type'  => 'gettext', 
      'base_dir' => getcwd() . '/data/language/', 
      'pattern' => '/%s/general.mo', 
     ], 
    ], 
], 

當我改變的價值「區域設置」它的工作原理確定並找到正確的.po文件。 我需要能夠根據保存在數據庫中的用戶配置文件的值來設置區域設置。

我檢查了這裏的文檔http://zendframework.github.io/zend-i18n/translation/和這裏的教程https://docs.zendframework.com/tutorials/i18n/,但他們只是提到setLocale()方法,沒有解釋或例子。這裏有類似的線程Zend framework 2 : How to set locale globaly?,但它是ZF2,它不提供工作解決方案只是一些建議。

總結我的問題 - 我應該如何以及在哪裏使用setLocale()方法,以便在整個應用程序中有效,並且所有視圖文件中的$this->translate($message)將使用新的區域設置,而不是配置文件中使用的默認區域?

回答

0

你只需要設置PHP語言環境。爲此,請使用\Locale::setDefault('en-GB');

看看SlmLocale,這個特定的文件就是在那裏完成的。


雖然這是最簡單的方法,你也可以使用上我猜MvcTranslator的setLocale功能。爲此,您需要用自己的工廠覆蓋現有的工廠,因此可以裝飾原有的工廠。

如果你看看ConfigProvider file in zend-mvc-i18n,你可以看到在這裏使用別名和工廠來創建MVC轉換器。然後你可以看到問題工廠的工作原理,它基本上創建了一個裝飾翻譯器,如stated in the doc

默認情況下,服務管理器總是提供相同的實例(共享服務),就像單例一樣。

因此,我們要做的就是覆蓋這個配置(即確保你自己的模塊位於Zend\Mvc\I18nmodules.config.php之後)。然後,在模塊配置中,我們可以提供我們自己的翻譯器。

我們的翻譯基本上由文檔翻譯器組成,其中調用了setLocale。爲了做到這一點,我們可以使用delegator

return [ 
    'factories' => [ 
     TranslatorInterface::class => TranslatorServiceFactory::class, 
    ], 
    'delegators' => [ 
     TranslatorInterface::class => [ 
      \Application\Factory\TranslatorFactory::class, 
     ], 
    ], 
]; 

然後是TranslatorFactory

use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\DelegatorFactoryInterface; 

class TranslatorFactory implements DelegatorFactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null) 
    { 
     $translator = call_user_func($callback); 
     $translator->setLocale('en-GB'); 
     return $translator; 
    } 
} 

這將是這樣做(你得到的容器在那家工廠,所以你可以得到一些用戶的數據可能)的一種方式。


另一種解決方案是使用事件系統,並且只聲明事件偵聽器中的區域設置,以檢索用戶詳細信息。

+0

謝謝托馬斯,這真的有用,我也會嘗試與工廠,但我會感謝一些幫助。我認爲在這種情況下使用框架工具會更加一致。我會給其他人建議其他東西的機會,如果沒有人跳過,我會將您的答案標記爲「已接受」。再次感謝你, – Ivomasterche

+0

我剛剛更新了答案...這是一個稍長的IMO,可能在某個時候有點混淆,如果需要,請詢問更多細節。 –

+0

再次感謝您。我想我明白了 - 我們用這個委託人「包裝」翻譯服務,每次調用'$ this-> translate($ msg)'時都應該調用它(並設置語言環境)。不幸的是,我無法讓它工作,我已經將配置添加到應用程序模塊的module.config.php,並且我在/Application/src/Factory/TranslatorFactory.php文件中創建了TranslatorFactory類是這一切嗎? – Ivomasterche