Windows环境下的PHP gettext

11
有一些有关gettext(使用Poedit)的教程……不幸的是,它们大多是针对UNIX环境的。更不幸的是,我在Windows XP上运行我的WAMP服务器(但我正在为UNIX环境开发),没有一个教程可以让gettext正常工作。从手册页面上看,它在Windows环境下是一个不同的过程。我尝试了评论中的一些解决方案,但仍然无法使其正常工作!我花了很多时间在这个问题上,希望有人能指引我正确的方向来解决这个问题!(我相信还有其他人和我一样感到沮丧。)到目前为止,我只得到输出“Hello World!”,而我应该得到已翻译的字符串。

这是我的设置/代码:

// 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"); 

文件夹结构

根目录:     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

"_" 函数的定义是什么?" - Vladislav Rastrusny
2
地域混乱是我转向http://framework.zend.com/manual/de/zend.translate.html的原因。 - Pekka
你为什么要定义 LC_MESSAGES - Alix Axel
@AlixAxel - 因为 LC_MESSAGES 不一定被定义。根据我的经验,在Windows上它从来不存在。 - Álvaro González
6个回答

7
我在本地机器上使用gettext时遇到了问题,经过一些搜索,我找到了这个页面,解决了我的问题:http://www.kipras.com/blog/getting-gettext-to-work-in-apache-on-windows/96 以下是该网页的引用:

On Linux servers (or any other servers apart windows), the way to do it is this:

setlocale(LC_MESSAGES, “en_US”);

The correct way to set locality on windows is this:

putenv(“LC_ALL=en_US”);

1
旧链接已经失效,目前可用的链接是http://www.kipras.com/blog/getting-gettext-to-work-in-apache-on-windows/96。 - Matthew Cline
为什么要踩!这是一个旧答案。如果有错误,请评论或发布新答案。 - wesamly
2023年了,它还在运转! - undefined

2

我曾经遇到过同样的问题,并且花了将近一天的时间去解决。最终,我找到了一个非常简单的解决方案,就是卸载 WAMP Server(版本2.1),并安装一个更新的版本(WampServer 2.1e - 32位)。很奇怪,但它完全解决了问题。

这是对我有效的示例代码:

<?php

    $locale = "deu_DEU";

    putenv("LC_ALL=$locale");
    setlocale(LC_ALL, $locale);

    bindtextdomain("greetings", "./locale");
    textdomain("greetings");

    echo _("Hello World");

?>

希望这能有所帮助。

不要忘记在WAMP服务器的PHP扩展菜单中激活php_gettext。 - Hamid
对我来说解决了问题。PHP 5.2.x、gettext和Windows似乎存在一个bug。请参考这篇文章:https://dev59.com/qnA75IYBdhLWcg3wP2gg - Michel

0

这是对我有效的解决方案。它适用于最新的wampserver。(来源:http://www.extradrm.com/blog/?p=1035

1)从此处下载php-gettext:https://launchpad.net/php-gettext/+download并解压缩

2)将包根目录中找到的以下文件添加到test-language.php所在的同一文件夹中: - gettext.inc - gettext.php - streams.php

3)打开您的php.ini并注释掉wampserver php_gettext.dll:

;extension=php_gettext.dll

4) 这是新的测试文件 test-language.php

<?php
error_reporting(E_ALL | E_STRICT);

// define constants
define('PROJECT_DIR', realpath('./'));
define('LOCALE_DIR', 'C:/wamp/www/test/locale');
define('DEFAULT_LOCALE', 'es_ES');

require_once('gettext.inc');

$supported_locales = array('en_US', 'sr_CS', 'de_CH','es_ES');
$encoding = 'UTF-8';

$locale = (isset($_GET['lang']))? $_GET['lang'] : DEFAULT_LOCALE;

//var_dump($locale);die();

// gettext setup
T_setlocale(LC_MESSAGES, $locale);
// Set the text domain as 'messages'
$domain = 'messages';
bindtextdomain($domain, LOCALE_DIR);
// bind_textdomain_codeset is supported only in PHP 4.2.0+
if (function_exists('bind_textdomain_codeset'))
bind_textdomain_codeset($domain, $encoding);
textdomain($domain);

echo gettext("HELLO_WORLD");
?>

在完成所有这些步骤后,您必须创建locale文件夹、en_US(或其他语言)文件夹、LC_MESSAGES文件夹,然后将messages.po文件放入其中。

0

我没有进行全面的调查,但我确定你犯了一个错误,那就是使用了无效的区域设置代码 - 即使在Windows上,地区设置代码也是相同的 - 这些是gettext区域设置,它们是跨平台的。

请尝试仅使用“de”作为区域设置代码,应该可以工作。还要确保你的PHP安装并激活了gettext扩展(使用phpinfo检查)。


4
Windows中的本地代码与PHP手册中的gettext()条目不同。 - Alix Axel

0
可能有点晚了,但我遇到类似的问题,直到我在我的WAMP php设置中启用了“短标记”,才解决了这个问题。

-3

这是因为我没有安装本地化文件。


1
这解释了为什么它不起作用,但并没有真正帮助如何使其工作。 - Álvaro González
我没有安装本地化语言环境是什么意思?复制链接或者输入三行文本肯定很痛苦。 - Čamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接