ご注意
この記事の内容は、古いXOOPSのバージョンをベースとしており、
現在は保証の限りではありません。
現在、多言語化においては、別途AutoLogin & Multi Language Module用のSysUiltモジュールをご用意しております
The Easiest Multi-Language Hack (EMLH) の拡張
XOOPSの多言語対応Hackは幾つかあるが、GIJOEさんのお手軽多言語ハックは、ほんとにお手軽で、Marcan版のHackのようにXOOPSのモジュールにまで修正を行わなくとも良いので、とても便利なHackです。
ただそのままだとコンテンツだけが多言語の対象で、Marcan版のようにメインメニューやXOOPSのLanguageファイルの内容は反映され無いため、少々多言語対応としては物足りなさを感じる事もあります。
そこで、Marcan版の一部を転用してLanguageファイル切替にもとりあえず対応できるようにしてみました。
GIJOE版のEMLHをセットアップ後、添付のcommon.php を include/common.phpと入れ替えるだけでOKなはずです。
但し、easiestml.php内の
// list the language names separated with comma
define('EASIESTML_LANGNAMES','english,japanese');
の部分が、きっちりとXOOPSのLanguageと対応するように定義されている必要があります。
添付のcommon.phpは、XOOPS2.0.9.3にGIJOE版AutoLogin Hack適用後のものを修正しています。
2005/04/07 : 一部PukiWikiとの相性確保部分を修正し、common.phpを入れ替えました。
現在判明しているEMLHの不具合とその対処
小生が多用しているPukiWikiModでは、幾つかの点でEMLHとの共存で問題がある。
1.easiestml_langパラメータの扱い
PukiWikiModは、PukiWikiの「?ページ名」というパラメータに対応するために、$_GETパラメータでなく、$_SERVER['QUERY_STRING']を解釈する。EMLHのeasiestml_langパラメータが付加された時点で、このパラメータをページ名と誤解してしまうため、うまく動作しない。これについては上記common.phpのHackにて受け取ったeasiestml_langを$_SERVER['QUERY_STRING']から消し去る事でPukiWikiをだませるように対応済みである。
2.静的URLモードでのeasiestml_langパラメータの受け渡し
PukiWikiModで静的URLモードを使用する場合に、.htaccessでのRewrite定義が、他のパラメータを受けわたすように出来ていないので、/modules/pukiwiki/123.html?easiestml_lang=xlang:jaなどというURLをうまく処理できない。
これについては、.htaccessの定義を以下に変更する事によってうまくいきそうだ。
# 静的ページ風URLオプションを使用する場合は
# 以下を環境に応じて修正後 # を削除して有効にしてください。
RewriteEngine on
RewriteRule ^([0-9]*)\.html(#[^\?]*)?(\?(.*))?$ /modules/pukiwiki/index.php?pgid=$1&$4$2 [QSA]
4.<head>内のヘッダのdescriptionメタタグの扱い
PukiWikiModでは、コンテンツの内容をstrip_tagsしたものの部分文字列をdescriptionメタタグにセットしているが、この部分に[mlimg]や[xlang:ja]などがそのままわたされ、EMLH側で処理を行うようになってしまう。
この場合、[mlimg]の処理では予期せぬHTMLタグが挿入されるし、[xlang:ja]・・・[/xlang:ja]の部分も、部分文字列を抽出されてタグが対応しない状態でdescriptionメタタグにセットされる場合もあり、予期せぬ動作をしてしまう。
[mlimg]に関しては、同等の機能を持つインラインプラグインmlimg.inc.phpを用意する事で回避できるが、タグの不整合に関しては、/modules/pukiwiki/pukiwiki.php内の修正が必要となる。
とりあえず現在は、
// desciption
$xoopsTpl->assign("xoops_meta_description",mb_strcut(preg_replace("/\s+/","",strip_tags($body)),0,200));
という部分を
// desciption
$t_body=$body;
if (defined('EASIESTML_LANGS')) {
$lang_tags=explode(',',EASIESTML_LANGS);
foreach($lang_tags as $lang_tag) {
$t_body= preg_replace('/\[\/?'.preg_quote($lang_tag).'\]/','',$t_body);
}
}
$xoopsTpl->assign("xoops_meta_description",mb_strcut(preg_replace("/\s+/","",strip_tags($t_body)),0,200));
に修正しを行った。
PukiWikiModでは、ページをXOOPSブロックとして利用できるが、この部分ではサーバー側で別途対象ページを特別なパラメータ付きでHTTPリクエストを行い取得した内容をキャッシュファイルに格納して表示するようになっている。
このページリクエスト時に、現在はサーバ側では表示言語を意識していないためデフォルトの言語しかブロックには表示できない。
そこで、ブロック表示部分を修正して現在の表示言語によってサーバ側でのブロックページリクエスト時にも言語指定を行うようにして、さらに言語毎にキャッシュを持つようにした。
さらに、上記のmlimgプラグインも、XOOPSブロック表示時にきちんと現在表示しているページのURLを再現できるために、ブロック表示時にプラグイン内の特別なcallbackを呼び出せるようなプラグイン拡張呼出機能を追加した。
上記のmlimgプラグインを使用してブロック表示する場合、本pukiwiki_page.phpに入れ替える必要があります
修正後の、/modules/pukiwiki/blocks/pukiwiki_page.phpは、
<?php
// $Id: pukiwiki_page.php,v 1.12 2005/02/23 00:16:41 nao-pon Exp $
function b_pukiwiki_page_show($options)
{
global $xoopsConfig;
$show_page = ($options[0])? $options[0] : "";
$cache_time = (empty($options[1]))? 0 : $options[1];
$cache_time = (int)$cache_time * 60;
$cache_no = (empty($options[2]))? "0" : $options[2];
if (!empty($_GET['easiestml_lang'])) {
$lang_cache='.'.$GLOBALS['easiestml_langname'];
} else if (!empty($_COOKIE['easiestml_langname'])) {
$lang_cache='.'.$_COOKIE['easiestml_langname'];
}
$cache_file = XOOPS_ROOT_PATH."/modules/pukiwiki/cache/p/xoops_block_{$cache_no}{$lang_cache}.dat";
$wiki_url = XOOPS_URL.'/modules/pukiwiki/';
if (file_exists($cache_file) && filemtime($cache_file) > time() - $cache_time)
{
$data = join('',@file($cache_file));
}
else
{
$error_str = $data = "";
if ($show_page)
{
if (!empty($_GET['easiestml_lang'])|| !empty($_COOKIE['easiestml_lang'])) {
$lang_para='&easiestml_lang='.(!empty($_GET['easiestml_lang']) ?$_GET['easiestml_lang']:$_COOKIE['easiestml_lang']);
}
$url = $wiki_url.'index.php?xoops_block=1&cmd=read&page='.rawurlencode($show_page).$lang_para;
include_once(XOOPS_ROOT_PATH."/class/snoopy.php");
$snoopy = new Snoopy;
$snoopy->read_timeout = 10;
$snoopy->fetch($url);
if (strpos($snoopy->response_code,"200") === FALSE)
{
if (file_exists($cache_file))
$data = join('',@file($cache_file));
else
$data = $error_str = $snoopy->response_code;
}
else
{
if (isset($snoopy->error) && !empty($snoopy->error))
$data = $error_str = $snoopy->error;
else
$data = $snoopy->results;
}
}
// Fatal, Parseエラーが出た場合
if (preg_match("#<b>(Fatal|Parse) error</b>:#",$data))
$data = "";
if ($data != $error_str)
{
//マルチドメイン対応
$data = preg_replace("/(<[^>]+(href|action|src)=(\"|'))https?:\/\/".$_SERVER["HTTP_HOST"]."(:[\d]+)?/i","$1",$data);
// SID 自動付加環境 は SID を削除
if (ini_get("session.use_trans_sid"))
{
$data = preg_replace("/(&|\?)?".preg_quote(ini_get("session.name"),"/")."=[0-9a-f]{32}/","",$data);
}
if ($fp = fopen($cache_file,"wb"))
{
fputs($fp,$data);
fclose($fp);
}
}
}
$data = preg_replace('/\{__PUKI_BLOCK_CALLBACK__\:\:([^\(]*?)\(([^\)]*?)\)\s*\}/e', 'b_pukiwiki_plugin_callback("$1","$2")', $data);
if (strpos($data,"nobunobu") !== FALSE)
{
global $xoopsUser,$xoopsModule,$xoopsConfig;
$uname = ($xoopsUser)? $xoopsUser->uname() : $xoopsConfig['anonymous'];
//名前欄置換
$data = str_replace("nobunobu",$uname,$data);
}
// 外部リンクマーク用 class設定
$data = preg_replace("/(<a[^>]+?)(href=(\"|')?(?!https?:\/\/".$_SERVER["HTTP_HOST"].")http)/","$1class=\"ext\" $2",$data);
// CSS Link を発行
$css_url = (file_exists(XOOPS_THEME_PATH.'/'.$xoopsConfig['theme_set'].'/pukiwiki.css'))?
XOOPS_THEME_URL.'/'.$xoopsConfig['theme_set'].'/pukiwiki.css'
:
$wiki_url.'skin/default.ja.css';
$css_tag = '<link rel="stylesheet" href="'.$css_url.'" type="text/css" media="screen" charset="shift_jis" />';
// 管理画面の CSS
if(file_exists( XOOPS_ROOT_PATH."/modules/pukiwiki/cache/css.css"))
{
$css_tag .= "\n".'<link rel="stylesheet" href="'.$wiki_url.'cache/css.css" type="text/css" media="screen" charset="shift_jis" />'."\n";
}
// ページ用の .css
$css_tag .= b_pukiwiki_page_get_page_css_tag($show_page,$wiki_url);
// ヘッダ情報付加
global $xoopsTpl;
if ($xoopsTpl)
{
$xoopsTpl->assign('xoops_block_header',$xoopsTpl->get_template_vars('xoops_block_header').$css_tag);
}
else
{
$data = $css_tag."\n".$data;
}
$block['title'] = "PukiWiki - {$show_page}";
$block['content'] = $data;
return $block;
}
function b_pukiwiki_plugin_callback($func, $args){
$retstr = '';
$plugin_dir=dirname(dirname(__FILE__)).'/plugin';
if (file_exists($plugin_dir.'/'.$func.'.inc.php')) {
require_once($plugin_dir.'/'.$func.'.inc.php');
$func_name = 'plugin_'.$func.'_block_callback';
if (function_exists($func_name)) {
if ($args) {
$arg_array = explode(',', $args);
}
$retstr = call_user_func_array($func_name, $arg_array);
// echo $plugin_dir .":". $func_name. '(' . $args . ') = ' .$retstr;
}
}
return $retstr;
}
function b_pukiwiki_page_edit($options)
{
$form = "";
$form .= "PukiWiki Page Name: ";
$form .= "<input type='text' name='options[]' value='".$options[0]."' /><br />";
$form .= "Block cache: ";
$form .= "<input type='text' name='options[]' value='".$options[1]."' />(min)<br />";
$form .= "Cache file number: ";
$form .= "<input type='text' name='options[]' value='".$options[2]."' />";
return $form;
}
// ページ名のエンコード
function b_pukiwiki_page_encode($key)
{
$enkey = '';
$arych = preg_split("//", $key, -1, PREG_SPLIT_NO_EMPTY);
foreach($arych as $ch)
{
$enkey .= sprintf("%02X", ord($ch));
}
return $enkey;
}
// [[ ]] を取り除く
function b_pukiwiki_page_strip_bracket($str)
{
if(preg_match("/^\[\[(.*)\]\]$/",$str,$match))
{
$str = $match[1];
}
return $str;
}
// ページ専用CSSタグを得る
function b_pukiwiki_page_get_page_css_tag($page,$wiki_url)
{
$page = b_pukiwiki_page_strip_bracket($page);
$ret = '';
$_page = '';
$dir = XOOPS_ROOT_PATH."/modules/pukiwiki/cache/";
foreach(explode('/',$page) as $val)
{
$_page = ($_page)? $_page."/".$val : $val;
$_pagecss_file = b_pukiwiki_page_encode($_page).".css";
if(file_exists($dir.$_pagecss_file))
{
$ret .= '<link rel="stylesheet" href="'.$wiki_url.'cache/'.$_pagecss_file.'" type="text/css" media="screen" charset="shift_jis" />'."\n";
}
}
return $ret;
}
となる。
- XOOPS 2.0.10へアップデートして、このハックが動作しなくなりました。2.0.10のcommon.phpは2.0.9.xとちょっと違うんですが、違いを全部直しても動作してません。私が直してみたファイルはこちらです。http://www.yuji.eu.org/common.txt -- Yuji
- すいません。ディレクトリー名をportuguesebrとjapanesebrからportuguesebrutfとjapaneseutfへ変えて、リインストールしてもクッキーには古いデータがあって、どっちも正しく表示されてなかったんです。 -- Yuji