3

我正在做一个项目,我需要为它进行用户翻译。所以我决定在 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 但这不会改变结果。

我错过了什么或做错了什么吗?

非常感谢!

J。

4

4 回答 4

6

I've got the same problem. Restart Apache Service solved it for me

于 2012-12-13T14:42:26.437 回答
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"));

我的主页有一些通过 jQuery 交互的 div,并在级联中重新加载。有时,其中一些(随机)给出默认字符串值。

默认情况下,它是西班牙语(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

所以我猜这是 _() 函数失败(我总是使用别名)。为了以防万一,我在函数上循环了 10.000 次,它在翻译时给出了 10.000 次点击或 10.000 次错误,因此对于整个 http 请求它都会失败,或者没有。

我很抱歉写了这么多,但我真的很感激能帮助我指明正确的方向。(这个错误不仅发生在@我的本地主机上,也发生在我的在线测试服务器上)

¿ 可能与我为每个连接设置区域设置这一事实有关?

我的在线“游乐场”是:

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 位

于 2012-05-30T22:35:32.073 回答
0

你不是用windows吗?如果是这样,您必须使用windows 语言环境名称。这是我在 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
}
...
于 2012-05-09T01:27:16.260 回答
0

我有同样的问题。有时字符串被翻译,有时没有。我有 3 台服务器用于这个应用程序和 5 台开发人员的机器,都存在同样的问题。

我通过删除来解决它:

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。

于 2016-01-28T12:11:25.113 回答