作成日:2018-08-13, 更新日:2018-08-13
方針
・後日の修正が容易で、修正するファイルは少な目に。
・URLは「http://example.com/ja/〇〇」「http://example.com/en/〇〇」のようにする。
・言語指定が無ければ「http://example.com/ja/〇〇」にリダイレクト。
・想定外の言語指定も「http://example.com/ja/〇〇」にリダイレクト。
※勝手に日本語を英語に翻訳してくれたら、ありがたいんだけど・・・そこまでは無いっぽい。
修正内容
・「app/config/routes.php」は修正しない
・「core/classes/uri.php」を継承させて、ゴニョゴニョする
・「app/bootstrap.php」で継承させた「uri.php」を読み込ませる
・各言語のメッセージ
・その他
「core/classes/uri.php」を継承させて、ゴニョゴニョする
使いたい言語設定は・・・面倒なので、ココでまとめて記載しておく。
※config.phpとかに記載してもいいんだけど、修正するファイルを少なくしたい・・・。
▼「app/classes/uri.php」を新規作成(「core/classes/uri.php」を継承させる)
<?php
class Uri extends Fuel\Core\Uri {
public function __construct($uri = NULL) {
parent::__construct($uri);
$this->detect_language();
}
public function detect_language() {
// 使う言語設定
$aryLang = array(
'ja' => 'ja_JP.utf8', // 日本語
'en' => 'en_us.utf8', // 英語
// 'zh' => 'zh_CN.utf8', // 中国語
);
if ( ~特定の条件のとき~ ) {
// 何もしたくないときは「return」
return;
}
if( !count($this->segments) ) {
// セグメントが見つからない:「/ja」にリダイレクト
\Response::redirect('ja', 'location', 200);
}
$iptLang = $this->segments[0];
if ( !isset($aryLang[$iptLang]) ) {
// 指定外のlangのとき:「/ja」にリダイレクト
\Response::redirect('ja/' . implode('/', $this->segments), 'location', 200);
}
// 「app/config/routes.php」の修正を不要にするため、一つ目のセグメント削除する
// ※「ja/login」→「/login」にする
array_shift($this->segments);
$this->uri = implode('/', $this->segments);
// 「app/config/config.php」の書換え
\Config::set('language', $iptLang);
\Config::set('locale', $aryLang[$iptLang]);
return;
}
}
「app/bootstrap.php」で継承させた「uri.php」を読み込ませる
▼「\Autoloader::add_classes()」に追加
\Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'Uri' => APPPATH . 'classes/uri.php', ));
各言語のメッセージ
ちょっとしたメッセージ等の切替えは「app/lang/ja/〇〇〇.php」や「app/lang/en/〇〇〇.php」で用意。
▼日本語版を(app/lang/ja/hoge.php)を用意
return array( 'title' => '日本語のタイトル', );
▼英語版(app/lang/en/hoge.php)も用意
return array( 'title' => 'english title', );
▼呼び出し:
\Lang::load('hoge', 'hoge'); // 「\Lang::load(ファイル名, 変数名)」で読み込んで
echo \Lang::get('hoge.title'); // 「\Lang::get(変数名, キー)」で出力させる
▼でも、個人的に修正時が面倒(各言語にファイルを用意するのがイヤ)なので・・・下記のようにする
// 適当なトコに記載
public static function 〇〇〇($key='', $initVal=''){
$lang = \Config::get('language');
// 使う各言語の設定
$ary = array(
'title' => array(
'ja' => '日本語のタイトル',
'en' => 'english title',
),
'〇〇〇〇' => array(
'ja' => '〇〇〇〇',
'en' => '〇〇〇〇',
),
);
// 設定してるキーで、言語指定が無ければ強制的に「ja」を使う。
// 値が無ければ初期値($initVal)を使う
if ( isset($ary[$key]) ) {
if ( !isset($ary[$key][$lang]) ) {
$lang = 'ja';
}
if ( isset($ary[$key][$lang]) ) {
return $ary[$key][$lang];
}
}
return $initVal;
}
// コントローラーやビューから呼び出す
echo xxxx::〇〇〇('title')
その他
テンプレートをはじめとした処理を言語に併せて切り替える。
▼必要に応じて「\Config::get('language');」で好き勝手する。
switch(\Config::get('language')) {
case 'en':
〇〇〇;
break;
case 'ja':
default:
〇〇〇;
break;
}