2017-03-02 4 views
0

나는 po 파일을 사용하는 번역기로 Zend Framework 3 Application을 사용하고 있습니다.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을 사용할 수 있습니다. 다음 TranslatorFactory

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

그리고

: (당신은 아마 일부 사용자 데이터를 얻을 수 있도록, 즉 공장에서 컨테이너를 얻을)을 할 수있는 하나 개의 방법이 될 것이다

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

방금 ​​대답을 조금 업데이트했습니다 ... 조금 오래 걸렸습니다. 아마도 조금 혼란 스럽 겠지만 필요한 경우 자세한 내용을 문의하십시오. –

+0

다시 한번 감사드립니다. 나는 생각한다 - 우리는이 위임자와 함께 "$ this-> translate ($ msg)'가 호출 될 때마다 (그리고 로케일을 설정할 것임) 번역기 서비스를"포장 "하고 있는가? 불행히도 내가 그것을 작동하게 만들 수 없다, 응용 프로그램 모듈의 module.config.php에 구성을 추가했고, /Application/src/Factory/TranslatorFactory.php 파일에 TranslatorFactory 클래스를 만들었습니다. – Ivomasterche

관련 문제