FuelPHPで多言語対応させる

作成日: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;
}