我必须根据用户想要的语言动态更改语言环境。
我可以像这样设置Application / Module.php中的语言环境:
public function onBootstrap(MvcEvent $e)
{
$translator = $e->getApplication()->getServiceManager()->get('translator');
$translator->setLocale('hu_HU');
}
但是,如果我想更改语言,如何在控制器中执行此操作?我试过这个,但在此之后,我只能为这一个请求更改语言环境,而不是全局。
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('srb_SRB');
答案 0 :(得分:2)
在配置级别设置默认语言环境!请参阅ZendSkeletonApplications应用程序模块中的#61 of module.config.php
'translator' => array(
'locale' => 'en_US',
)
答案 1 :(得分:1)
我有同样的问题。在我的用户登录模块中,我在bootstrap上注册了MvcEvent:
where
然后,当该事件发生时,我根据URL中的信息设置区域设置:
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\SessionManager;
use Zend\Session\Container as SessionContainer;
use \Zend\I18n\Translator\TranslatorInterface;
...
public function onBootstrap(MvcEvent $event)
{
// Get event manager.
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
// Register the event listener method.
$sharedEventManager->attach(AbstractActionController::class,
MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
}
最后,这并没有真正使语言环境成为全局 - 相反,它只是为每个请求设置它。从代码的角度来看,净效果是相同的 - 即,我不必在每个控制器上设置语言环境。
希望有所帮助。
答案 2 :(得分:0)
这项工作对我来说:
public function onBootstrap(MvcEvent $e)
{
$localeFromHttp = \Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (false === stripos($localeFromHttp, '-')) {
$locale = $localeFromHttp . '_' . strtoupper($localeFromHttp);
$e->getApplication()
->getServiceManager()
->get('MvcTranslator')
->setLocale($locale);
}
else {
$e->getApplication()->getServiceManager()->get('MvcTranslator')->setFallbackLocale('en_US');
}
}
我的modal.config.php:
'service_manager' => array(
'abstract_factories' => array(
'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
'Zend\Log\LoggerAbstractServiceFactory',
),
'aliases' => array(
'translator' => 'MvcTranslator',
),
),
'service_manager' => array(
'factories' => array(
'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
),
),
'translator' => array(
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
'text_domain' => __NAMESPACE__,
),
),
),
答案 3 :(得分:0)
在modal.config文件中,我认为不需要以下内容,因为您已使用别名“MvcTranslator”进行翻译。
add(0, 0).
add(N, [R]) :-
N1 is N-1,
add(N1, [R|N]).
答案 4 :(得分:0)
在ZF2中,始终根据每个请求设置语言环境。您可以在引导程序上执行该操作:
// create a copy of HashMap as a TreeMap
NavigableMap<String, Order> navigableMap = new TreeMap<>(getOrderBook());
// remove unwanted entries (inverted condition)
navigableMap.entrySet().removeIf(e ->
!e.getValue().getPairName().equals("AB") ||
!e.getValue().getCompletedStatus().equals("InProgress") ||
!e.getValue().getOrderType().equals("Buy"));
// NavigableMap::lastEntry gets an entry with the highest key (by the comparator)
double zscore = sortedMap.lastEntry().getValue().getzScore();
以及以后在控制器中,如果要更改:
$translator = $event->getApplication()->getServiceManager()->get('translator');
$translator->setLocale($locale);
$translator->addTranslationFile(
'phpArray', DATA_PATH . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . $locale . '.php', 'default', $locale
);
如果您更改选定的语言环境,则必须再次添加翻译文件路径以使其起作用