我正在开展一个项目,我需要为其进行翻译。所以我决定在php中使用gettext,但它有时会工作。
所以我有一个名为lng的文件夹,在这里我有一个php文件,它调用我的lang文件来翻译我的页面。
以下是代码:
<?php
if(isset($_GET['lang']) != '')
{
setcookie('lang',$_GET['lang'], time() + 365*24*3600, null, null, false, true);
$_SESSION['lang'] = $_GET['lang'];
$language = $_GET['lang'];
}
else if(isset($_SESSION['lang']) != '' )
{
$language = $_SESSION['lang'];
}
else if(isset($_COOKIE['lang']) != '')
{
$_SESSION['lang'] = $_COOKIE['lang'];
$language = $_SESSION['lang'];
}else{
$language = 'fr';
}
putenv("LANG=$language");
setlocale(LC_MESSAGES, $language);
$domain = 'trad';
bindtextdomain($domain, 'locale/');
textdomain($domain);
?>
所以我可以检查我的$ _SESSION和$ _COOKIE,没问题,他给我'en'或'fr',但他没有翻译我的档案,我不知道为什么。
对于lng中的文件夹,它是:locale / en / LC_MESSAGES / trad.po(或.mo)。 我尝试使用LC_ALL和LC_MESSAGES,但这不会改变结果。
我错过了什么或做错了什么吗?
非常感谢!
学家
答案 0 :(得分:4)
我遇到了同样的问题。重启Apache Service为我解决了
答案 1 :(得分:0)
你不是在使用Windows吗?如果是这样,您必须使用windows locale names。以下是我在Linux上以及在Windows上工作的课程的一部分(它只有更多的语言环境名称选项):
...
private function setLocaleByLang($lang)
{
$map = array(
'cs' => array('cs_CZ.UTF-8', 'cs_CZ', 'cs', 'czech'),
'en' => array('en_US.UTF-8', 'en_US', 'en', 'english'),
'de' => array('de_DE.UTF-8', 'de_DE', 'de', 'german'),
'pl' => array('pl_PL.UTF-8', 'pl_PL', 'pl', 'polish'),
'sk' => array('sk_SK.UTF-8', 'sk_SK', 'sk', 'slovak')
);
$locale = key_exists($lang, $map) ? $map[$lang] : $lang;
setlocale(LC_ALL, $locale);
putenv('LC_ALL=' . $lang); // for windows and gettext
}
...
答案 2 :(得分:0)
我遇到了同样的错误。我的情况有点不同,我开始认为它与线程有关,尽管它发生在我改变我的代码之后。
我有一个语言栏:
<?php
include_once (dirname(__FILE__) . "/resources/config.php");
?>
<div id='language_bar'>
<a style="margin-left:50px" href="./index.php?locale=es_ES">
<img src='<?php echo $config['paths']['images']['lang']?>/es_ES.gif'/>
</a>
<a href="./index.php?locale=en_UK">
<img src='<?php echo $config['paths']['images']['lang']?>/en_UK.gif'/>
</a>
<a href="./index.php?locale=de_DE">
<img src='<?php echo $config['paths']['images']['lang']?>/de_DE.gif'/>
</a>
</div>
配置文件:
if (isset($_GET['locale'])) {
$locale = $_GET['locale'];
setcookie('locale', $locale, time() + 60 * 60 * 24 * 30);
} else {
if(isset($_COOKIE['locale'])) {
error_log('En _COOKIE');
$locale = $_COOKIE['locale'];
}
else {
$locale = $config['localization']['default_locale'];
setcookie('locale', $locale, time() + 60 * 60 * 24 * 30);
}
}
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
error_log('setlocale->'.setlocale(LC_ALL, "0")." Env ->". getenv("LC_ALL"));
error_log(_("Submit"));
我的主页有一些div通过jQuery进行交互,并以级联方式重新加载。有时,其中一些(随机)给出一个默认的字符串值。
默认情况下,它是西班牙语(es_ES),并且在几次单击强制div刷新后,一些字符串以英语(en_UK原始字符串)打印。而且更重要的是。如果我切换到德语(de_DE),在第一次刷新后我得到德语中的每个字符串,gettext开始用西班牙语重新输出字符串,过了一会儿,用英语。
请注意,我在php日志中添加了调试行。他们真的很有趣:
当事情顺利时:
[Thu May 31 00:28:51 2012] [error] [client ::1] setlocale->es_ES Env ->es_ES
[Thu May 31 00:28:51 2012] [error] [client ::1] Aplicar, referer: xxxxxxxx/index.php
何时不:
[Thu May 31 00:29:45 2012] [error] [client ::1] setlocale->es_ES Env ->es_ES, referer: xxxxxxxxx/index.php
[Thu May 31 00:29:45 2012] [error] [client ::1] Submit, referer: xxxxxxxx/index.php
所以我猜它的_()函数失败了(我总是使用别名)。为了以防万一,我在函数上循环了10000次,并且在翻译时它给出了10.000次点击或10.000次错误,因此整个http请求都失败了,或者没有。
我为写这么多而道歉,但我真的很感激帮助我指出了正确的方向。 (此错误不仅发生在@ my localhost,还发生在我的在线测试服务器上)
¿可能与我为每个连接设置区域设置这一事实有关吗?
我的在线“游乐场”是:
Linux server8.nixiweb.com 2.6.32-71.29.1.el6.x86_64#1 SMP Mon Jun 27 19:49:27 BST 2011 x86_64
我的服务器:
Linux filete 3.2.0-24-generic#39-Ubuntu SMP Mon May 21 16:52:17 UTC 2012 x86_64 PHP版本5.3.10-1ubuntu3.1
请注意,两者都是64位
答案 3 :(得分:0)
我遇到了同样的问题。有时字符串被翻译,有时候不会被翻译。我有3个服务器用于此应用程序和5个开发人员&#39;机器,都有同样的问题。
我通过删除来解决它:
bindtextdomain("domain", "/locale");
将.mo文件直接链接到gettext默认文件夹:
sudo ln -sf /myproject/locale/en/LC_MESSAGES/domain.mo /usr/share/locale/en/LC_MESSAGES/domain.mo
我使用的是Ubuntu 14.04。