Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Gettext-无翻译_Php_Windows_Translation_Gettext_Poedit - Fatal编程技术网

PHP Gettext-无翻译

PHP Gettext-无翻译,php,windows,translation,gettext,poedit,Php,Windows,Translation,Gettext,Poedit,我试图使用PHP gettext扩展来翻译一些字符串。所有函数似乎都返回了正确的值,但调用gettext()/\只返回原始字符串。PO/MO文件似乎正确,我相信我已正确设置了目录。我在Windows上运行带有PHP5.3.10的WAMP服务器(也尝试运行5.3.4和5.3.8,因为我有安装) 首先,请参见/new2/www/index.php: $locale = 'esn'; # returns Spanish_Spain.1252 in var dump putenv("LC_ALL={$

我试图使用PHP gettext扩展来翻译一些字符串。所有函数似乎都返回了正确的值,但调用
gettext()
/
\
只返回原始字符串。PO/MO文件似乎正确,我相信我已正确设置了目录。我在Windows上运行带有PHP5.3.10的WAMP服务器(也尝试运行5.3.4和5.3.8,因为我有安装)

首先,请参见
/new2/www/index.php

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump

putenv("LC_ALL={$locale}"); // Returns TRUE
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252'

$domain = 'messages';
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8
textdomain($domain); // Returns'messages'

print gettext("In the dashboard"); // Prints the original text, not the translation.
exit;
我创建了以下文件结构:

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
我还尝试将
Spanish_Spanish.1252
替换为:
es_es
esn
esp
Spanish
Spanish_Spanish

用于生成生产任务单的采购订单文件如下(仅给出相关条目):

这是使用PoEdit生成的。在添加任何新的.MO文件后,我重新启动了Apache。还要注意的是,我以前在Gettext中使用Zend_Translate,它的翻译是正确的。不过,我希望依赖本机gettext扩展,部分原因是我正在尝试创建自己的轻量级框架

任何帮助都将不胜感激

编辑:修改目录结构。注意-将能够在24小时内尝试最近的答案。

查看。它在windows和linux上也适用于我。数组中的最后一个值适用于windows。可以找到语言名称列表。我的目录在里面

./locales/en/LC_MESSAGES/domain.mo
         /cs/LC_MESSAGES/domain.mo

问题还可能是,当您更改*.po和*.mo文件时,必须重新启动Apache服务器。这可能是个问题,因此您可以使用变通方法-始终将这些文件重命名为新名称,然后它们将被重新加载。

建议:您可能需要.mo文件的完整区域设置。这可能是Spanish_西班牙.UTF8或esn_esn.UTF8或esn_esp.UTF8(不是1252,因为您更改了代码库)

要跟踪它要查找的目录,可以安装Process monitor(http://technet.microsoft.com/en-us/sysinternals/bb896645). 它会在信息上输出bucket负载,但您应该能够找到正在查找的文件/目录

(我的另一个想法是检查文件权限——但如果您在Zend_Translate中已经有类似的内容,那么可能不是原因,但无论如何都值得检查)


如果不是很好,很抱歉-但可能会给你一个线索。

我在我的XAMPP实例上设置了这个,并解决了这个问题

  • 完全的setlocale在Windows上不起作用,因此它返回的内容是不相关的
  • 对于Windows,您可以使用标准语言/国家代码设置区域设置(在本例中,es_es是西班牙所说的西班牙语)
  • 在您的区域设置目录下创建es_es/LC_MESSAGES/。这是您的messages.mo文件所在的位置

    $locale = 'es_ES'; 
    
    putenv("LC_ALL={$locale}"); // Returns TRUE
    
    $domain = 'messages';
    bindtextdomain($domain, './locale'); 
    bind_textdomain_codeset($domain, 'UTF-8'); 
    textdomain($domain); // Returns'messages'
    
    print gettext("In the dashboard"); 
    exit;
    
我不确定这是否会造成不同,但我在创建po文件时做了两件事。在文件->首选项下的poEdit中,我将行尾格式更改为Windows。在我用poEdit创建了初始po之后,我在Notepad++中打开了该文件,并将编码类型切换为UTF-8,因为poEdit没有这样做

我希望这至少为你指明了正确的方向

参考资料


我从未尝试在Windows上使用gettext,但每次我在linux系统上遇到gettext问题时,原因都是没有安装合适的语言包。

您的代码将此作为
bindtextdomain
的返回值:

C:\wamp\www\new2\www\locale
使用
Spanish_Spania.1252的
setlocale
消息的
textdomain
,调用
gettext
将在以下路径中查找:

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo
但您创建了以下文件结构:

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
         ^^
         www/ missing here
编辑

好吧,那没用。我已经在Windows上创建了一个测试脚本,并像您一样使用POEdit:

$locale = "Dutch_Netherlands.1252";
putenv("LC_ALL=$locale"); // 'true'
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252'
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale'
textdomain("messages"); // 'messages'

echo _("Hello world"); // 'Hallo wereld'
我的文件夹结构如下所示:

D:\work\so\l10n\
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po
    \test.php
希望有帮助,尽管它看起来和你的差不多。我在网上发现了一些东西:

  • 在.po文件中设置字符集很重要
  • 本地化文件中的空格可能有一个UTF8选项,因此要小心键查找失败。首先测试的最好方法可能是根本不带空格的键

您的区域设置和目录不应该是
es_es.UTF-8
?@mario我已经尝试过该区域设置和目录,但是
setlocale()
然后返回false。@FandaI已经尝试过使用Windows区域设置名称(包括
esn
esp
——就像我的问题一样)。我刚刚从您链接到的帖子中直接尝试了几个示例,将区域设置设置为
数组('de_de.UTF-8'、'de_de'、'de'、'german')
。我为每个值创建了一个
locale/[VALUE-FROM-ARRAY]/LC\u MESSAGES/MESSAGES.mo
文件,并在重试之前重新启动了Apache-不走运。不过,所有函数都返回正确。还有什么建议吗?你有没有试着把lang subdir重命名为2个字母的代码?(locales/de/LC…?@jasir请阅读我的原始问题;每当我的.MO文件发生更改时,我都会重新启动Apache。谢谢。啊,很抱歉-我复制的不正确。我实际上创建了
C:\wamp\www\new2\www\locale\Spanish…
等。我现在将修改我的问题。不过,谢谢你发现了这一点!谢谢你-我会看一看稍后再查看流程监视器,看看它是否对我有帮助。这可能正是我想要的。
D:\work\so\l10n\
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po
    \test.php