相关疑难解决方法(0)

如何调试gettext无法在PHP中工作?

我想在php 5.5中使用php gettext扩展(在win2008服务器上,使用IIS7).我这样做:

<?php

$locale = "es";
if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
textdomain("messages");

echo gettext("Hello world");

?>
Run Code Online (Sandbox Code Playgroud)

使用此文件夹结构:

locale/es/LC_MESSAGES/messages.mo
Run Code Online (Sandbox Code Playgroud)

但它总是只返回Hello世界而不是正确的翻译现在(基于我缺乏西班牙语技能)是在messages.po文件中:

msgid ""
msgstr ""
"Project-Id-Version: TestXlations\n"
"POT-Creation-Date: 2014-04-19 08:15-0500\n"
"PO-Revision-Date: 2014-04-19 09:18-0500\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.3\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: c:/dev\n"

msgid "Hello world"
msgstr "Hola World"
Run Code Online (Sandbox Code Playgroud)

这从cmd行和IIS失败.所以我看到gettext调用等并执行它但它没有读取翻译文件.我该如何进一步调试?即使删除翻译文件,我也会得到相同的行为.

php localization gettext internationalization setlocale

15
推荐指数
4
解决办法
1万
查看次数

使用PHP Gettext而无需安装区域设置

我一直在寻找开源项目国际化的选择:

  • 每个人似乎都推荐的Gettext显然需要将"语言环境"安装在"系统上"才能使用.请参阅PHP手册中的这个注释,它反映了我的具体情况.这个问题也提出了同样的问题.这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境.此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪.

  • Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,因此我认为这不是我的选择.有些人说你可以从Zend框架中拆分它,但我不知道如何.如果有人能告诉我需要哪些文件(我已经下载了Zend框架的tarball)来挑选,我会愿意使用Zend_Translate.

  • 阵列.这就是我现在正在做的事情,但它并不理想,因为:

    • 当大多数翻译不被当前页面使用时,它将占用大量内存来定义每个翻译.
    • 我发现自己复制数组中的密钥有问题,这已经变成了1000行代码,而我几乎没有添加任何东西......
    • 这意味着非程序员无法真正翻译,而POedit是每个人都希望使用的标准.

我可以以某种方式读取.mo没有Gettext或Zend_Translate的文件,还是我必须使用Gettext?如果是这样,我如何使所有语言环境都能正常工作,就像我上面链接的问题一样?

编辑:我现在愿意使用Zend_Translate.我只需要弄清楚我需要哪些文件(如果将它们合并到一个文件中会很棒) - 我不希望在我的项目中使用整个Zend Framework.


更新:我有兴趣看看有多大的开源项目处理i18n:

因此,就我所见,这三个随机项目中没有一个使用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.

php arrays gettext zend-translate php-gettext

12
推荐指数
1
解决办法
4091
查看次数

Windows上的PHP gettext

有一些关于gettext(w/Poedit)的教程......不幸的是,它主要用于UNIX环境.更不幸的是,我在Windows XP上运行我的WAMP服务器(但我正在为UNIX环境开发),并且没有一个教程可以让gettext正常工作.在手册页(http://us3.php.net/manual/en/book.gettext.php)中,它似乎是Windows环境中的不同进程.我已经在评论中尝试了一些解决方案,但我仍然无法让它工作!拜托,我花了很多时间在这上面,希望有人可以指出我正确的方向让这个东西上班!(而且我确信还有其他人与我分享我的挫折感).到目前为止,我的设置,我只输出"Hello World!" 而我应该得到翻译的字符串.

这是我的设置/代码到目前为止:

<?php
// test.php
if (!defined('LC_MESSAGES')) {
    define('LC_MESSAGES', 6);

}
$locale = "deu_DEU"; // apparently the locales are different on a WINDOWS platform

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("greetings", ".\locale");
textdomain("greetings");


echo _("Hello World"); 

?>
Run Code Online (Sandbox Code Playgroud)

文件夹结构

root:     C:\Program Files\WampServer 2\www
test.php: C:\Program Files\WampServer 2\www\site
.po:      C:\Program Files\WampServer 2\www\site\locale\deu_DEU\LC_MESSAGES\greetings.po
.mo:      C:\Program Files\WampServer 2\www\site\locale\deu_DEU\LC_MESSAGES\greetings.mo

请指教!谢谢你的时间 :)

php windows gettext

10
推荐指数
2
解决办法
1万
查看次数

如何在没有过滤器列表的情况下使用Locale :: acceptFromHttp?

locale_accept_from_http是ICU API的基本包装,uloc_acceptLanguageFromHTTP但PHP/PECL实现似乎存在根本缺陷,它使用系统整套语言环境而不是将列表作为参数?

例如,用户说HTTP_ACCEPT_LANGUAGE = zh-HK;q=0.2, fr,即用户阅读繁体中文或法文,更喜欢后者.例如,您有一个提供繁体中文和简体中文文章的新闻网站.使用API Locale::acceptFromHttp只会返回fr.

<?php
var_dump (Locale::acceptFromHttp ("zh-HK;q=0.2,fr"));
?>
Run Code Online (Sandbox Code Playgroud)

输出:

string(2) "fr"
Run Code Online (Sandbox Code Playgroud)

php localization icu

7
推荐指数
1
解决办法
1441
查看次数

用gettext但没有语言环境麻烦的i18n?

我正在寻找一种符合标准的方法来存储Web应用程序的多语言内容.到目前为止,我已经使用了自己的"translate()"函数,这些函数从数据库中的文件或字典表中读取数据.但是,如果您使用Web应用程序的不同副本,则在数据库表中保持字典最新是非常麻烦的.

我喜欢gettext,因为有很多可用的工具.但是,我为不同的平台开发应用程序.我绝对不愿意处理setlocale()和consorts的糟糕方式 - 即不同系统之间的许多不同的区域设置字符串变体,您需要提供这些变体才能使其正常工作.永远不能.我有一组语言 - 比如de,en和es - 我想加载适当的字典并使用_()而不需要触及setlocale()或bindtexdomain()一次.

这是否可以使用gettext?或者有人知道另一个简单,小巧,快速(!)i18n的PHP解决方案,可以使用.po/.mo文件,最好不需要PHP扩展吗?

php translation gettext internationalization

5
推荐指数
1
解决办法
2226
查看次数