| Happy Linux | XOOPS Cube |
Japanese Japanese Chinese ( Taiwan ) Traditional Chinese Korean Korean French French Portguese Portguese English English
Welcome Guest 
Search 検索
Google PageRank
http://xc.ohwada.jp/ modules/rssc/single_feed.php?
PageRank 0 PageRank
Main Menu メニュー
Login ログイン
ユーザー名:

パスワード:


パスワード紛失

新規登録
Sponsor

XCL 2.1.4 言語の切替え

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 .6 | 投稿日時 2008-4-13 13:36 | 最終変更
ken  管理人   投稿数: 88
上段の国旗をクリックすると、言語設定を切替える

(1) テーマファイルを新設する
- themes/xxx/themes.html

(2) 言語指定のURLを設定する preload を新設する
- preload/utf8_tpl.class.php

(3) 言語設定を切替える preload を新設する
- preload/utf8_language_name.class.class.php

(4) 管理者テーマファイルを変更する
- modules/legacy/admin/theme/admin_theme.html
投票数:94 平均点:3.72
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-13 13:42 | 最終変更
ken  管理人   投稿数: 88
上段に 国旗 と 言語指定のURL を設置する

デフォルトのテーマファイルをコピーして、下記を追加する
themes/xxx/theme.html
<a href="<{$utf8_language_url}>xc_language=ja">
  <img src="<{$xoops_url}>/images/flags/flag_jp.png" width="20" height="14" alt="Japanese" />
   Japanese
</a>
<a href="<{$utf8_language_url}>xc_language=en">
  <img src="<{$xoops_url}>/images/flags/flag_uk.png" width="20" height="14" alt="English" />
   English
</a>

$utf8_language_url は preload/utf8_tpl.class.php で設定される

切り替わったことが分かるように、言語毎にテーマを用意しておく。

文字化け対策

IE6 では日本語を指定したときに、韓国語が文字化けが発生します。
HTML の言語種別が 日本語 (ja) だと、日本語に該当しない文字を処理できないようです。

なお、FireFox では発生しません。

この行を変更する
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<{$xoops_langcode}>" lang="<{$xoops_langcode}>">
  ↓
<html xmlns="http://www.w3.org/1999/xhtml">

この行を削除する
<meta http-equiv="content-language" content="<{$xoops_langcode}>" />
投票数:118 平均点:3.22
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-13 13:48 | 最終変更
ken  管理人   投稿数: 88
言語指定のURLを設定する preload を新設する

query がないときは
xxx.php ? xc_language=xx
query があるときは
xxx.php?abc=123 &map; xc_language=xx
のように表示する

preload/utf8_tpl.class.php
class utf8_tpl extends XCube_ActionFilter
{
    function postFilter() 
    {
		global $xoopsTpl;
		$xoopsTpl->assign( 'utf8_language_url', $this->get_utf8_language_url() );
    }
    
	function get_utf8_language_url()
	{
		$query = null;
		$arr   = null;

		if ( isset($_GET) && is_array($_GET) ) {
			$arr = $_GET;
			unset($arr['xc_language']);
		}

		if ( isset($arr) && is_array($arr) ) {
			$query = '?';
			foreach ( $arr as $k => $v ) {
				$query .= $k . '=' . $v . '&amp;';
			}
		} else {
			$query = '?';
		}

		$url = htmlspecialchars( $_SERVER['PHP_SELF'], ENT_QUOTES) . $query;
		return $url;
	}
}
投票数:71 平均点:4.51
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-13 13:55 | 最終変更
ken  管理人   投稿数: 88
言語設定を切替える preload を新設する

xc_language=xx が指定されたら、言語ファイルを切替える

preload/utf8_language_name.class.class.php
class utf8_language_name extends XCube_ActionFilter
{
	function preFilter() 
	{
		$this->mController->mRoot->mDelegateManager->add("Legacy_Controller.GetLanguageName", array(&$this, "get_language_name"));
	}

	function postFilter()
	{
		if ( isset( $_COOKIE['xc_language'] ) ) {
	    	$GLOBALS['xoopsConfig']['language'] = $this->get_language( $_COOKIE['xc_language'] );
    	}
    }

	function get_language_name( &$language ) 
	{
		$cookie_expire = time() + 86400;	// one day
		$cookie_path   = '/' ;
		$post = null;
		if ( isset($_POST['xc_language']) ) {
			$post = $_POST['xc_language'];
			setcookie( 'xc_language', $post, $cookie_expire, $cookie_path ) ;
		} elseif ( isset($_GET['xc_language']) ) {
			$post = $_GET['xc_language'];
			setcookie( 'xc_language', $post, $cookie_expire, $cookie_path ) ;
		} elseif ( isset($_COOKIE['xc_language']) ) {
			$post = $_COOKIE['xc_language'];
		}
		$language = $this->get_language( $post );
		$this->set_utf8();
	}

	function set_utf8()
	{
		if (!defined('_CHARSET')) {
			define('_CHARSET', 'UTF-8');
		}
		$xoopsDB = $GLOBALS['xoopsDB'];
		if ( is_object($xoopsDB) ) {
			$xoopsDB->queryF("/*!40101 SET NAMES utf8 */");
		} else {
			die('not DB connect');
		}
		if ( function_exists('mb_internal_encoding') ) {
			mb_internal_encoding("UTF-8");
		}
	}

	function get_language( $post )
	{
		if ( $post == 'en' ) {
			return 'english';
		} elseif ( $post == 'tw' ) {
			return 'tw_utf-8';
		} elseif ( $post == 'ko' ) {
			return 'ko_utf8';
		} elseif ( $post == 'fr' ) {
			return 'fr_utf8';
		} elseif ( $post == 'pt' ) {
			return 'pt_utf8';
		}
		return 'ja_utf8';
	}
}



注意:
中国語 ( tw_utf-8 ) だけ、言語フォルダーの命名が違っています。
tw_utf-8 と uft と 8 の間に - が入っています。
投票数:59 平均点:4.75
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-13 14:17
ken  管理人   投稿数: 88
外国語のまま、管理者メニューに移動すると、
外国語なので「ホームページ」ボタンも分からず、うろたえます。

管理者メニューの中で、日本語に切替る手段を用意します

modules/legacy/admin/theme/admin_theme.html
<a href="?xc_language=ja">
  <img src="<{$xoops_url}>/images/flags/flag_jp.png" width="20" height="10" alt="Japanese" />
   Japanese
</a>
投票数:82 平均点:5.37
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-15 22:37 | 最終変更
ken  管理人   投稿数: 88
preFilter() と postFilter() の動作するプログラムの位置を示す

Legacy_Controller->executeCommon()

(1) _setupLanguage()
preFilter() 実行
{
// Legacy Kernel に言語を設定する
	$this->mController->mRoot->mDelegateManager->add("Legacy_Controller.GetLanguageName", array(&$this, "get_language_name"));
}

(2) _setupConfig()
{
	$configHandler = &xoops_gethandler('config');
	$this->mRoot->mContext->mXoopsConfig =& $configHandler->getConfigsByCat(XOOPS_CONF);

// xoopsConfig に格納されるのは、DBの値
	$GLOBALS['xoopsConfig'] = $this->mRoot->mContext->mXoopsConfig;

	$this->mRoot->mContext->mXoopsConfig['language'] = $this->mRoot->mLanguageManager->getLanguage();
}

(3) _processPostFilter()
postFilter() 実行
{
// xoopsConfig に言語を設定する
	$GLOBALS['xoopsConfig']['language'] = $this->get_language( $_COOKIE['xc_language'] );
}


下記の順番だと、postFilter() が不要になる

(2) _setupConfig()
{
	$configHandler = &xoops_gethandler('config');
	$this->mRoot->mContext->mXoopsConfig =& $configHandler->getConfigsByCat(XOOPS_CONF);
	$this->mRoot->mContext->mXoopsConfig['language'] = $this->mRoot->mLanguageManager->getLanguage();

// xoopsConfig に格納されるのは、preFilter() にて設定した言語
	$GLOBALS['xoopsConfig'] = $this->mRoot->mContext->mXoopsConfig;
}

要望を出してみた
set LanguageManager's LanguageName in $GLOBALS['xoopsConfig'
投票数:101 平均点:4.16
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-11-16 6:44
taka 
はじめまして。
XOOPS Cube Legacy 2.1.5を使っております。
多言後切り替えを使用したく、上記を参考にさせていただいております。ありがとうございます。

テーマの設定、preload設定を行ったのですがいまいちつかめておらずうまくいきません。

テーマを言語ごとに用意しておくとありますが、その言語とテーマの結びつけはどこで行う事を想定しておられますか?

また

preFilter() と postFilter() の動作するプログラムの位置を示す

は参考という事で、なにかしなければならないということではないとう理解でいいでしょうか?

上記がパラメータに応じて記述する場所におもえるのですが、何処に記述すれば良いのかわからず。。アドバイス御願い致します。
投票数:60 平均点:3.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009-7-24 11:05
ken  管理人   投稿数: 88
引用:
テーマを言語ごとに用意しておくとありますが、その言語とテーマの結びつけはどこで行う事を想定しておられますか?

言語の切替えとテーマの切替えは独立しています。
それぞれ preload で。

言語の切替え:preload/utf8_language_name.class.class.php

テーマの切替え:modules/legacy/preload/utf8_theme.class.php
投票数:71 平均点:4.23

  条件検索へ


XOOPS Cube PROJECT