我正在尝试翻译位于module/Application/config/module.config.php
配置文件中的面包屑,如:
'navigation' => array(
'default' => array(
array(
'label' => \Application\Util\Translator::translate('Home'),
'route' => 'home',
'resource' => 'route/home',
'pages' => array(
),
),
面包屑Home
应以法语显示为Accueil
。
翻译器适用于其他应用程序。但是没有一个面包屑被翻译过来。语言资源文件已经过一次又一次的验证和编辑。
在完全相同的配置文件中,是翻译器
configuration:
'service_manager' => array(
'factories' => array(
'account_navigation' => 'Application\Navigation\Service\AccountNavigationFactory',
'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
'Application\Collector\RouteCollector' => 'Application\Service\RouteCollectorServiceFactory',
),
),
'translator' => array(
'locale' => 'fr_FR', // langue par défaut
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
),
),
'translation_files' => array(
array(
'type' => 'phpArray',
'filename' => __DIR__ . '/../../../vendor/zendframework/zendframework/resources/languages/fr/Zend_Validate.php',
'locale' => 'fr_FR'
),
array(
'type' => 'gettext',
'filename' => __DIR__ . '/../../../vendor/zf-commons/zfc-user/src/ZfcUser/language/fr_FR.mo',
'locale' => 'fr_FR'
),
array(
'type' => 'phpArray',
'filename' => __DIR__ . '/../language/fr_FR.php',
'locale' => 'fr_FR'
)
)
),
我的应用程序引导程序如下:
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$sm = $e->getParam('application')->getServiceManager();
// Add ACL information to the Navigation view helper
$authorize = $sm->get('BjyAuthorize\Service\Authorize');
$acl = $authorize->getAcl();
$role = $authorize->getIdentity();
\Zend\View\Helper\Navigation::setDefaultAcl($acl);
\Zend\View\Helper\Navigation::setDefaultRole($role);
$id = $sm->get('zfcuser_auth_service')->getIdentity();
if (! is_null($id)) {
$em = $sm->get('Doctrine\ORM\EntityManager');
$usr = $em->find('Application\Entity\User', $id->getId());
$blameableListener = new \Gedmo\Blameable\BlameableListener();
$blameableListener->setUserValue($usr);
$em->getEventManager()->addEventSubscriber($blameableListener);
} else {
// redirection
if (isset($_SERVER['SERVER_NAME']) && preg_match('/monxxxxx/', $_SERVER['SERVER_NAME'])) {
$strategy = new RedirectionStrategy();
$strategy->setRedirectRoute('driver/login');
$eventManager->attach($strategy);
}
}
if ($sm->has('MvcTranslator')) {
\Zend\Validator\AbstractValidator::setDefaultTranslator($sm->get('MvcTranslator'));
}
Locale::setDefault('fr_FR');
// custom layout
$e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', function($e) {
$route = $e->getRouteMatch();
$controller = $e->getTarget();
// change layout for login
if($route->getParam('controller') == 'zfcuser' && $route->getParam('action') == 'login'){
$controller->layout('layout/login');
}
}, 100);
// Log the exceptions
$application = $e->getApplication();
$sm = $application->getServiceManager();
$sharedManager = $application->getEventManager()->getSharedManager();
$sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
function($e) use ($sm) {
if ($e->getParam('exception') && strpos($e->getParam('exception'), 'are not authorized') === false) {
$sm->get('Zend\Log\Logger')->crit($e->getParam('exception'));
$toEmail = "xxxxx@xxxxx.com";
$toName = "Service IT";
$subject = "Exception error";
$body = $e->getParam('exception');
\Application\Util\Common::sendMail($toEmail, $toName, $subject, $body);
}
}
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__
)
)
);
}
public function init($moduleManager)
{
$moduleManager->loadModule('ZfcUser');
}
}
我在ZF2上2.2.5
。
答案 0 :(得分:1)
可能是一个愚蠢的问题,但你有PHP gettext模块(通过你的phpinfo()
验证)?如果是,您可以更轻松地将_('Translatable string')
用于需要翻译的字符串。您在.mo
文件夹(.po
,language
旁边等)中有src
和public
个文件。)。
(上述问题是因为您似乎在为此付出了很多努力,即使您的代码显示您使用gettext
作为翻译器,这应该允许您已经翻译静态字符串,例如{{ 1}}在配置文件中)
以下图片为例,它是我自己的ZF2供应商模块的基本设置:
接下来,您需要Poedit(免费版本应该充足。)
注意:确保始终使用Poedit编辑home
文件。
使用Poedit打开.mo/.po
文件夹中的文件,无需"翻译"字符串与它们应该使用的语言相同的字符串,除非您使用字符串的快捷方式(即。"索引"字符串应显示"显示概述",但请不要& #39; t:p)
在Poedit中,您可以选择添加在文件中搜索的其他字符串,还可以添加其他文件扩展名。我建议你看看这些字符串:
language
$this->translate()
和这些文件扩展名:
这样你已经涵盖了基础知识。当然您的设置可能不同,因此请根据需要进行修改。
最后,您需要在模块配置中注册_()
PHP扩展的用法。您需要为每个模块执行此操作,因为您需要提供语言文件夹路径,因为这是您的模块应该在的位置。被翻译(尽管你可以自由地使它成为全球性的,并且如果必须的话,有一个巨大的翻译文件,不推荐)。
将以下位添加到gettext
文件中:
module.config.php
完成上述所有操作后,翻译面包屑的方法应该如下:
'translator' => [
'locale' => 'en_US', // This line needs to be in the "root" config, feel free to override with/per module settings and/or user settings
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
],
],
],
答案 1 :(得分:0)
似乎是命名空间Zend\View\Helper\Navigation\Breadcrumbs
;在您的服务管理器中没有正确实例化。因此,翻译器将无法工作,因为它也由服务经理提供为依赖性
您应该做的是验证在加载面包屑时是否实际解析了Zend\View\Helper\Navigation\Breadcrumbs::line#113
。至少这一个。
您还可以检查htmlify
的{{1}}方法,以测试是否启用了翻译器。