设置gettext()的问题

时间:2011-05-16 18:40:18

标签: php gettext

我正在开发一个php应用程序。现在我想把它翻译成不同的语言 为此,我使用gettext()。但是我的配置有问题。我正确安装了库。我在代码周围gettext(textToTranslate),我创建了没有.mo和.po文件的问题。

我的index.php上的配置是(正在使用xampp,Ubuntu):

// Language
$lang = 'es_ES';

// Domain
$text_domain = 'project';

putenv('LC_ALL='.$lang);
setlocale(LC_ALL, $lang);

bindtextdomain($text_domain, './locale' );

bind_textdomain_codeset($text_domain, 'UTF-8');

textdomain($text_domain);

我的文件结构是:

/opt/lampp/htdocs/blanca/gettext/locale/es_ES/LC_MESSAGES/project.po 
/opt/lampp/htdocs/blanca/gettext/locale/es_ES/LC_MESSAGES/project.mo

但我仍然看到英文代码,qhich是默认语言。有人可以帮我吗?提前致谢

修改

@ubuntu:~$ locale -a
C
es_AR.utf8
es_BO.utf8
es_CL.utf8
es_CO.utf8
es_CR.utf8
es_DO.utf8
es_EC.utf8
es_ES.utf8
es_GT.utf8
es_HN.utf8
es_MX.utf8
es_NI.utf8
es_PA.utf8
es_PE.utf8
es_PR.utf8
es_PY.utf8
es_SV.utf8
es_US.utf8
es_UY.utf8
es_VE.utf8
POSIX

修改

strace命令下运行一个小PHP脚本

<?php
// Idioma

$lang = 'es_ES.utf8';

// Dominio

$text_domain = 'blanca';

// Dependiendo de tu OS putenv/setlocale configurarán tu idioma.

putenv('LC_ALL='.$lang);

setlocale(LC_ALL, $lang);



// La ruta a los archivos de traducción

bindtextdomain($text_domain, './gettext/locale' );
// El codeset del textdomain

bind_textdomain_codeset($text_domain, 'UTF-8');

// El Textdomain
textdomain($text_domain);

// Print a test message
echo gettext("User");


// Or use the alias _() for gettext()
echo _("User");
?> 

命令:strace -e trace=file -o test.txt php prog.php

  

GETCWD( “/选择/ LAMPP / htdocs中/布兰卡”,   4096)= 25   LSTAT( “/选择/ LAMPP / htdocs中/布兰卡/ prog.php”   {st_mode = S_IFREG | 0644,st_size = 521,   ...})= 0   LSTAT( “/选择/ LAMPP / htdocs中/布兰卡”,   {st_mode = S_IFDIR | 0777,st_size = 4096,   ...})= 0 lstat(“/ opt / lampp / htdocs”,   {st_mode = S_IFDIR | 0755,st_size = 4096,   ...})= 0 lstat(“/ opt / lampp”,   {st_mode = S_IFDIR | 0755,st_size = 4096,   ...})= 0 lstat(“/ opt”,   {st_mode = S_IFDIR | 0755,st_size = 4096,   ...})= 0   GETCWD( “/选择/ LAMPP / htdocs中/布兰卡”,   4096)= 25   LSTAT( “/选择/ LAMPP / htdocs中/布兰卡/./区域设置”,   0x7fffb2c1a670)= -1 ENOENT(没有这样的   文件或目录)   开放( “在/ usr / share / locale所/ locale.alias”   O_RDONLY)= 3   开放( “在/ usr / share / locale所/ es_ES.utf8 / LC_MESSAGES /布兰卡/ gettext.mo”   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   开放( “在/ usr / share / locale所/ es_ES / LC_MESSAGES /布兰卡/ gettext.mo”   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   开放( “在/ usr / share / locale所/ es.utf8 / LC_MESSAGES /布兰卡/ gettext.mo”   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   开放( “在/ usr / share / locale所/ ES / LC_MESSAGES /布兰卡/ gettext.mo”   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   打开( “/ USR /共享/区域设置LangPack的/ es_ES.utf8 / LC_MESSAGES /布兰卡/ gettext.mo”,   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   打开( “/ USR /共享/区域设置LangPack的/ es_ES / LC_MESSAGES /布兰卡/ gettext.mo”,   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   打开( “/ USR /共享/区域设置LangPack的/ es.utf8 / LC_MESSAGES /布兰卡/ gettext.mo”,   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)   打开( “/ USR /共享/区域设置LangPack的/ ES / LC_MESSAGES /布兰卡/ gettext.mo”,   O_RDONLY)= -1 ENOENT(没有这样的文件或   目录)

prog.php is located in my application directory.

4 个答案:

答案 0 :(得分:0)

我怀疑您尝试通过setlocale设置的区域设置在您的系统上不可用。命令locale -a(从shell运行)返回什么?确保已安装的语言环境的值匹配您尝试设置的语言环境。如果您的西班牙语语言环境丢失,那么要做的事情可能仍然是dpkg-reconfigure locales

我不知道原因,但事实是(或者可能,在2008年左右我在Debian或Ubunto上工作过),setlocale将失败,如果您的系统上未安装区域设置。这并不是显而易见的,因为您在应用程序中提供消息文件,并且似乎不依赖于任何系统区域设置文件或设置 - 但您知道,可能有原因。

答案 1 :(得分:0)

尝试setlocale(LC_MESSAGES,“es_ES”);

答案 2 :(得分:0)

我不确定如何在php中执行此操作,但在bash中

export LC_MESSAGES="LL_CC"

其中LL - 区域设置,CC - 国家/地区。像en_US或en_US.UTF8一样。我一天半的时间都在解决这个问题,只有出口LC_MESSAGES才有效。所以,我建议,在php中它将会是

putenv('LC_MESSAGES='.$lang);

答案 3 :(得分:0)

我尝试过帮助那些仍在寻找此事的人:PHP gettext doesn't works

希望有所帮助。