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 に変更できます。