0

test.php ファイルは、テスト用にいくつかのギリシャ文字をエコーし​​ます

<head>
<meta charset = "UTF-8" />
</head>
<?php
$language = "en_US";
$lang_path = "language";
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain("lang", $lang_path);
bind_textdomain_codeset("lang","UTF-8");
textdomain("lang");
echo gettext("α");
echo gettext("β");
echo gettext("γ");
echo gettext("δ");
echo gettext("ε");
echo gettext("ζ");
?>

私のフォルダとファイルは次のように構成されています

 language/en_US/LC_MESSAGES/lang.mo and lang.po

mo ファイルが正しくコンパイルされ、abcdez に変換される必要があります。poedit では、どこでも utf-8 を使用しています。コードは αβcδεζ を生成するため、文字 c のみが翻訳されます! サーバーを再起動しました。システムに en_US エンコーディングがインストールされていますが、なぜ 1 文字しか翻訳されないのか理解できません。

4

1 に答える 1

0

zendとcakephpコードを読んで書いた簡単な実装。複数形には対応しておらず、単に単語を置き換えるだけなので、1つの言語からだけではなく置き換えることができます。

test.php ファイル

<head>
<meta charset = "UTF-8" />
</head>
<?php
    require_once "gettext.php";
    echo __("something");
    echo __("α");
    echo __("β");
    echo __("γ");
    echo __("δ");
    echo __("ε");
    echo __("ζ");
?>

gettext.php ファイル

<?php
define('APPPATH','/opt/lampp/htdocs/test/');
/* please change APPPATH to an ultimate directory of the language folder */

/**
 * Loads the binary .mo file and returns array of translations
 *
 * @param string $filename Binary .mo file to load
 * @return mixed Array of translations on success or false on failure
 */
    function loadMo($filename) {
        $translations = false;

        // @codingStandardsIgnoreStart
        // Binary files extracted makes non-standard local variables
        if ($data = file_get_contents($filename)) {
            $translations = array();
            $header = substr($data, 0, 20);
            $header = unpack("L1magic/L1version/L1count/L1o_msg/L1o_trn", $header);
            extract($header);

            if ((dechex($magic) == '950412de' || dechex($magic) == 'ffffffff950412de') && $version == 0) {
                for ($n = 0; $n < $count; $n++) {
                    $r = unpack("L1len/L1offs", substr($data, $o_msg + $n * 8, 8));
                    $msgid = substr($data, $r["offs"], $r["len"]);
                    unset($msgid_plural);

                    if (strpos($msgid, "\000")) {
                        list($msgid, $msgid_plural) = explode("\000", $msgid);
                    }
                    $r = unpack("L1len/L1offs", substr($data, $o_trn + $n * 8, 8));
                    $msgstr = substr($data, $r["offs"], $r["len"]);

                    if (strpos($msgstr, "\000")) {
                        $msgstr = explode("\000", $msgstr);
                    }
                    $translations[$msgid] = $msgstr;

                    if (isset($msgid_plural)) {
                        $translations[$msgid_plural] =& $translations[$msgid];
                    }
                }
            }
        }
        // @codingStandardsIgnoreEnd

        return $translations;
    }   

    /*
        Your system folder must be ULTIMATE_PATH/language/$language
        where language is a parametre like en,el,fr or english or whatever
        domain is the name of the mo file without mo extension e.g. default
        You can pass this parameteres with the __ function below
    */
    function translate($singular, $language = null, $domain = null) {
        $directory = APPPATH."language/"; // your path to language folder
        if (strpos($singular, "\r\n") !== false) {
            $singular = str_replace("\r\n", "\n", $singular);
        }

        if (is_null($language) ) { // default el
            $language = "el";
        }

        if (is_null($domain)) {
            $domain = "default";
        }

        $localeDef = $directory . $language;
        $file = $localeDef."/".$domain;
        $translations = null;

                if (is_file($file . '.mo')) {
                    $translations = loadMo($file . '.mo');
                }

        if (!empty($translations[$singular])) {

                $trans = $translations[$singular];

                if (strlen($trans)) {
                    return $trans;
                }
            }

        return $singular;
    }
    /*
    take language (must be in language folder) from $_GET["lang"];
    */
    function __($singular) {
        if (!$singular) {
            return;
        }
        if (isset($_GET["lang"]) ) // you can use cookie, session etc
            $translated = translate($singular,$_GET["lang"]);
        else 
            $translated = translate($singular);
        return $translated;
    }
?>

私のコードでは、デフォルトの言語elがあり、GET ['lang']で言語を取得します。(これを COOKIE、SESSION などに変更できます。また、mo ファイルは default.mo という名前にする必要があります。(コードでも変更できます)。したがって、ディレクトリに次のものを含めることができます。

test.php
gettext.php
language/el/deafult.mo
language/en/default.mo

デフォルトは el/default.mo で、URL に ?lang=en を指定して en に変更できます。

于 2012-08-09T09:11:54.233 に答える