Nucleus

ブログの多言語化

2007年7月5日

ブログの一部を英語化した。これ用に、一つ簡単なプラグイン(NP_text)を製作した。ソースコードは、記事の続きに。

1)まず、english.php と japanese-euc.php を用意し、スキンディレクトリに配置(nucleus/language/japanese-euc.phpを参考のこと)。

2)スキンの必要な箇所をすべて、<%text(XXXXX)%>に置き換える。

3)head.inc の冒頭に、
<%plugin(text,header,text/html)%>
を記述(HTTPヘッダ送信のための記述;将来、<%text%>タグがコアでサポートされるときのことを考え、<%plugin%>タグとして表記)。

4)HTML タグを、次のように記述。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%text(_SKIN_LANG)%>" lang="<%text(_SKIN_LANG)%>">
ただし、_SKIN_LANG として、en と ja-JP を用意。

5)META タグを、次のように記述。
<meta http-equiv="Content-Type" content="text/html; charset=<%text(_CHARSET)%>" />


6)英語で使用したいブログのindex.phpに、次の2行を挿入。
$text_language='english.php';
include('../../nucleus/nucleus/language/english.php');


<?php 
class NP_text extends NucleusPlugin { 
    function getName() { return 'NP_text'; }
    function getMinNucleusVersion() { return 220; }
    function getAuthor()  { return 'Katsumi'; }
    function getVersion() { return '0.1.2'; }
    function getURL() {return 'http://www.recfor.net/nucleus/index.php?itemid=385';}
    function getDescription() { return $this->getName().' plugin'; } 
    function supportsFeature($what) { return ($what=='SqlTablePrefix')?1:0; }
    function getEventList() { return array('InitSkinParse'); }
    var $skindir=false;
    var $language=false;
    var $included=false;
    function event_InitSkinParse(&$data){
        global $text_language,$DIR_SKINS;
        $skin=&$data['skin'];
        $this->skindir=$DIR_SKINS.$skin->getIncludePrefix();
        $this->language=ereg_replace( '[\\|/]', '', getLanguageName()).'.php';
        if (isset($text_language)) $this->includePHP($text_language);
    }
    function doIf($text='',$compare=''){
        if (preg_match('/[^0-9a-zA-Z_]/',$text) || !defined($text)) exit('ERROR:'.__LINE__);
        eval('$text='.$text.';');
        return ($text==$compare);
    }
    function doSkinVar(&$skintype,$text,$prefix=0){
        if ($text=='header' && is_string($prefix)) {
            header('Content-Type: '.preg_replace('![^a-zA-Z0-9/\.]+!','',$prefix).'; charset='._CHARSET);
            return;
        } elseif ($text=='include' && is_string($prefix)) return $this->includePHP($prefix);
        if (!$this->included) $this->includePHP('language');
        if (preg_match('/[^0-9a-zA-Z_]/',$text) || !defined($text)) return;
        eval('$text='.$text.';');
        echo $text;
    }
    function includePHP($prefix){
        $file=$this->_checkFile($prefix,$this->skindir,$this->language);
        if ($file===false) return;
        include_once($file);
        $this->included=true;
    }
    function _checkFile($prefix,$skindir,$language){
        if (substr($prefix,-4)=='.php' && file_exists($file=$skindir.$prefix)) return $file;
        elseif ($prefix=='language' && file_exists($file=$skindir.$language)) return $file;
        elseif (file_exists($file=$skindir.$prefix.$language)) return $file;
        elseif ($prefix=='language' && file_exists($file=$skindir.'english.php')) return $file;
        elseif (file_exists($file=$skindir.$prefix.'english.php')) return $file;
        return false;
    }
}
?>

コメント

コメントはありません

コメント送信