我记得几个月前使用gettext运行一些测试,以下代码完美运行:
putenv('LANG=l33t');
putenv('LANGUAGE=l33t');
putenv('LC_MESSAGES=l33t');
if (defined('LC_MESSAGES')) // available if PHP was compiled with libintl
{
setlocale(LC_MESSAGES, 'l33t');
}
else
{
setlocale(LC_ALL, 'l33t');
}
bindtextdomain('default', './locale'); // ./locale/l33t/LC_MESSAGES/default.mo
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
echo _('Hello World!'); // h3110 w0r1d!
Run Code Online (Sandbox Code Playgroud)
这非常有效(如果我没记错的话,在Windows XP和CentOS下),这很好,因为我可以使用任意 "语言环境",而不必担心它们是否安装在系统上.然而,这似乎不再起作用,我想知道为什么......
我可以在各种语言环境中来回切换,只要setlocale()调用没有返回false(如果系统上的语言环境可用/已安装),翻译就会显示相关内容.
这并不完美(如果我可以将gettext指向任意翻译目录而不必测试是否存在语言环境,那将是很好的),但这是可以接受的.我稍后会再进行一些测试.
setlocale()总是返回false(即使使用LC_ALL而不是LC_MESSAGES),除非我使用一些有效的Windows语言环境,例如eng,deu或ptg- 在这种情况下,语言环境似乎正确设置但翻译仍未显示.我现在无法测试,因为我已经打开了数百个标签但是我认为第一次调用该脚本会产生正确的转换(重启Apache不会起作用).
我不确定这是否与PHP Bug#49349有关.我将测试这是几个小时.
有没有办法在不同的操作系统中可靠地使用gettext扩展(不是纯PHP实现,如php-gettext或Zend Translate Adapter)(可能有自定义语言环境 …
我一直在寻找开源项目国际化的选择:
每个人似乎都推荐的Gettext显然需要将"语言环境"安装在"系统上"才能使用.请参阅PHP手册中的这个注释,它反映了我的具体情况.这个问题也提出了同样的问题.这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境.此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪.
Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,因此我认为这不是我的选择.有些人说你可以从Zend框架中拆分它,但我不知道如何.如果有人能告诉我需要哪些文件(我已经下载了Zend框架的tarball)来挑选,我会愿意使用Zend_Translate.
阵列.这就是我现在正在做的事情,但它并不理想,因为:
我可以以某种方式读取.mo没有Gettext或Zend_Translate的文件,还是我必须使用Gettext?如果是这样,我如何使所有语言环境都能正常工作,就像我上面链接的问题一样?
编辑:我现在愿意使用Zend_Translate.我只需要弄清楚我需要哪些文件(如果将它们合并到一个文件中会很棒) - 我不希望在我的项目中使用整个Zend Framework.
更新:我有兴趣看看有多大的开源项目处理i18n:
setlocale('C')以获得通用语言环境并避开整个setlocale混乱.因此,就我所见,这三个随机项目中没有一个使用Zend_Translate,也没有直接使用gettext.
也许使用C语言环境是个好主意,在文本域名中存储语言名称,然后从那里开始.
所以这就是我所拥有的:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
Run Code Online (Sandbox Code Playgroud)
但我仍然只是得到英文字符串,即使我已经使用poedit,msgfmt等来制作相应的文件.我也试过重启Apache.
我在Zend_Navigation,Zend_Translate和所需路由的组合方面遇到了一些困难.
我的站点导航是通过基于XML文件的Zend_Navigation完成的.我现在已经基于Zend_Translate添加了对站点的翻译,并添加到以下更改路由到引导程序:
protected function _initRoutes()
$config = new Zend_Config($this->getOptions());
$languages = array_keys($config->languages->toArray());
$zl = new Zend_Locale();
$lang = in_array($zl->getLanguage(), $languages)
? $zl->getLanguage() : 'en';
$zfc = Zend_Controller_Front::getInstance();
// add language to default route
$route = new Zend_Controller_Router_Route(
':lang/:module/:controller/:action/*',
array('controller'=>'index',
'action' => 'index',
'module'=>'default',
'lang'=>$lang));
$router = $zfc->getRouter();
$router->addRoute('default', $route);
$zfc->setRouter($router);
Run Code Online (Sandbox Code Playgroud)
然后我用preDispatc方法创建了一个View_Helper:
$language = $request->getParam('lang','');
if ($language !== 'en' && $language !== 'da')
$request->setParam('lang','en');
$language = $request->getParam('lang');
if ($language == 'en')
$locale = 'en_EN';
else
$locale = 'da_DK';
$zl = new …Run Code Online (Sandbox Code Playgroud) php zend-framework zend-translate zend-navigation zend-route
我正在尝试在Zend Framework中实现基于URL的翻译,以便我的网站对SEO友好.这意味着除了默认路由之外,我还需要如下所示的URL.
zend.local/en/module
zend.local/en/controller
zend.local/en/module/controller
zend.local/en/controller/action
Run Code Online (Sandbox Code Playgroud)
以上是我现在遇到的问题; 其余的应该没问题.我添加了一个控制器插件,用于获取lang参数,以便我可以在preDispatch方法中设置区域设置和转换对象.以下是我的一些路线(存储在.ini文件中):
; Language + module
; Language + controller
resources.router.routes.lang1.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.lang1.route = "(^[a-zA-Z]{2})/(\w+$)"
resources.router.routes.lang1.defaults.controller = index
resources.router.routes.lang1.defaults.action = index
resources.router.routes.lang1.map.1 = "lang"
resources.router.routes.lang1.map.2 = "module"
; Language + module + controller
; Language + controller + action
resources.router.routes.lang2.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.lang2.route = "(^[a-zA-Z]{2})/(\w+)/(\w+$)"
resources.router.routes.lang2.defaults.module = default
resources.router.routes.lang2.defaults.action = index
resources.router.routes.lang2.map.1 = "lang"
resources.router.routes.lang2.map.2 = "controller"
resources.router.routes.lang2.map.3 = "action"
Run Code Online (Sandbox Code Playgroud)
正如评论所示,几个URL结构将匹配相同的路由,这使我的应用程序错误地解释了格式.例如,lang1路由将匹配以下两个URL :
zend.local/en/mymodule
zend.local/en/mycontroller
Run Code Online (Sandbox Code Playgroud)
在第一个URL中,"mymodule"用作模块名称,这是正确的.但是,在第二个URL中,"mycontroller"用作模块名称,这不是我想要的.在这里,我希望它使用"默认"模块和"mycontroller"作为控制器.这同样适用于之前的 …
我必须根据用户想要的语言动态更改语言环境.
我可以像这样设置Application/Module.php中的语言环境:
public function onBootstrap(MvcEvent $e)
{
$translator = $e->getApplication()->getServiceManager()->get('translator');
$translator->setLocale('hu_HU');
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想更改语言,我怎么能在控制器中执行此操作?我尝试了这个,但在此之后,我可以只为这一个请求而不是全局更改语言环境.
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('srb_SRB');
Run Code Online (Sandbox Code Playgroud) 通常我使用以下代码在View中进行用户翻译:
<?php echo $this->translate("hello"); ?>
Run Code Online (Sandbox Code Playgroud)
如何在Controller中获得翻译?
我有一个Zend翻译问题.我已经在bootstrap中配置了zend translate,如下所示
public function _initTranslate() {
$locale = new Zend_Locale();
Zend_Registry::set('Zend_Locale', $locale);
$translate = new Zend_Translate(array(
'adapter' => 'ini'
)
);
$translate->addTranslation(
array(
'content' => APPLICATION_PATH . '/configs/languages/pt.ini',
'locale' => 'pt'
)
);
$translate->addTranslation(
array(
'content' => APPLICATION_PATH . '/configs/languages/en.ini',
'locale' => 'en'
)
);
$translate->setLocale($locale);
Zend_Registry::set('Zend_Translate', $translate);
}
Run Code Online (Sandbox Code Playgroud)
我添加了语言,在我的视图中我使用了翻译助手,但它向我展示了以下错误
Notice: The language 'en' has to be added before it can be used.
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php
on line 443
Notice: No translation for the language 'en' available.
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php
on line …Run Code Online (Sandbox Code Playgroud) 我正在创建一个具有多语言功能的网站.我搜索并发现zend_translate是翻译文本的最佳方式.但我已经用简单的PHP(没有框架)开始我的网站,并完成了许多模块.但现在我想在我的网站中使用翻译器翻译php文本和文本来自数据库(mysql)
我可以使用gettext(),但我无权在我的实时服务器上安装gettext(),所以我选择了zend_translate.所以任何人都可以帮助我使用zend_translate使用zend框架而不复制整个zend库文件.或者给我另一种方式.
谢谢.
我正在尝试注册一个自定义数据库翻译器加载器。
为此,我的灵感来自: Feeding Zend Translator
我在(module.config.php)中有以下工厂代码:
'service_manager' => array(
'factories' => array(
'translator' => function($sm){
$translator = new \V1\Service\DatabaseTranslationService();
return $translator->createService($sm);
},
),
),
Run Code Online (Sandbox Code Playgroud)
DatabaseTranslationService 看起来像这样:
$config = $serviceLocator->get('Config');
$trConfig = isset($config['translator']) ? $config['translator'] : array();
$translator = new \Zend\I18n\Translator\Translator();
$translator->getPluginManager()->setInvokableClass('database', '\Foo\I18n\Translator\Loader\DatabaseTranslator', true);
$translator->addTranslationFile('database', 'en_EN');
return $translator;
Run Code Online (Sandbox Code Playgroud)
但似乎没有使用“setInvokableClass”:我收到了这个错误:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for database
Run Code Online (Sandbox Code Playgroud)
有谁知道如何正确注册翻译器
我是Zend框架3的新手,并试图翻译路线,我已经部分成功.我能够翻译主路线并将其重定向到所需的位置,但对于子路线,翻译工作但重定向不起作用.能帮到我吗,我的代码如下.
module.config.php
'router' => [
'router_class' => TranslatorAwareTreeRouteStack::class,
'routes' => [
'setting' => [
'type' => Segment::class,
'options' => [
'route' => '/{locale}/{setting}',
'defaults' => [
'locale' => 'de',
'controller' => Controller\SettingController::class,
'action' => 'index',
],
],
'may_terminate'=>true,
'child_routes' =>[
'add' =>[
'type' =>'Segment',
'options' =>[
'route' =>'/{add}',
'defaults'=> [
'controller' => Controller\SettingController::class,
'action' => 'add',
],
],
],
],
],
],
],
Run Code Online (Sandbox Code Playgroud)
Module.php
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$language_session = new …Run Code Online (Sandbox Code Playgroud) php zend-translate zend-route zend-framework2 zend-framework3
zend-translate ×10
php ×6
gettext ×2
zend-route ×2
arrays ×1
locale ×1
multilingual ×1
php-gettext ×1
setlocale ×1
url-routing ×1