3

私はプロジェクトに取り組んでおり、そのためのユーザー翻訳が必要です。そこで、php で gettext を使用することにしましたが、時々機能します。

だから私はlngという名前のフォルダを持っていて、この中に私のページを翻訳するために私のlangファイルを呼び出すphpファイルがあります。

コードは次のとおりです。

<?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

私も同じ問題を抱えています。Apacheサービスを再起動して解決しました

于 2012-12-13T14:42:26.437 に答える
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

同じエラーが発生しています。私の場合は少し異なり、コードを変更してから発生したにもかかわらず、スレッド化と関係があると思い始めています。

私は言語バーを持っています:

<?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 要求全体で失敗したり、失敗したりしません。

たくさん書いて申し訳ありませんが、正しい方向に向けて助けていただければ幸いです。(このエラーは、@ my localhost だけでなく、オンライン テスト サーバーでも発生します)

¿私がすべての接続にロケールを設定しているという事実と何か関係があるのでしょうか?

私のオンラインの「遊び場」は次のとおりです。

Linux server8.nixiweb.com 2.6.32-71.29.1.el6.x86_64 #1 SMP 月 6 月 27 日 19:49:27 BST 2011 x86_64

私のサーバー:

Linux filete 3.2.0-24-generic #39-Ubuntu SMP 月 5 月 21 日 16:52:17 UTC 2012 x86_64 PHP バージョン 5.3.10-1ubuntu3.1

両方とも64ビットであることに注意してください

于 2012-05-30T22:35:32.073 に答える