CakePHP3の多言語化についての質問です。
やりたいことは、全ページのフッターに言語を選択するセレクトボックスを設置して、手動でも言語を変換できるようにしたいと考えています。
実装には、関数__()を利用して、src/localeフォルダを作成し、配下に、各言語フォルダとその中に、.poファイルと.moファイルを作成するやり方です。切り替えには、bootstrap.phpに、ini_set('intl.default_locale', 'ロケールID'); を 追加してページを変更したいと考えています。
とりあえず、よい方法かどうかはわからないのですが、
Template/Element に lang.ctpを作りそこに、下記のようなコードを追加しました。lang.ctpはLayout/default.phpより読み込まれ、すべてに適応します。要は、セレクトフォームよりpostで渡ってきた、ロケールIDをクッキーにセットして、bootstrap.phpのini_set('intl.default_locale', 'ロケールID')のロケールIDを変えようとしてます。
<?php if(filter_input(INPUT_POST, 'lang' )){ $lg = filter_input( INPUT_POST, "lang" ); setcookie( 'lang', $lg ); //クッキーにセット } $request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI' ); //URIを取得 $param = ereg_replace('/?$', '', $request_uri); $params = array(); if ('' != $param) { $params = explode('/', $param); //切り分けて配列にいれる。 } if(!isset($params[3])||!isset($params[4])){ //私の環境では、コントローラーが[3]、アクションが[4]です。 $url_a = 'indexs'; //URIがない場合 ルートの時 $url_c = 'index'; // 〃 }else{ $url_a = $params[3]; $url_c = $params[4]; } ?> <section id="footer"> <div class="container"> <?=$this->Form->create(null,[ 'type' => 'post', 'url' => ['controller' => $url_a, 'action' => $url_c ]] ) ?> <?php $lang = filter_input(INPUT_COOKIE, 'lang' ); ?> <?=$this->Form->select( 'lang' , [ ['value'=> 'ja', 'text'=> 'Japanese' ] , ['value'=>'en_US', 'text'=> 'English' ] , ['value'=>'test', 'text'=> 'test'] , ],['default' => $lang]) ?> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?> </div> </section>
次に、config/bootstrap.phpに下記を追加して、各ページのセレクトボックスから保存されたクッキー情報(ロケールID)をセットしています。
$lang = filter_input(INPUT_COOKIE, 'lang' ); ini_set('intl.default_locale', $lang);
そこでわからないことが2つでてきました。
① 同一のコントローラー内のアクションでは、クッキーが保持され、セレクトボックスからのポストよりクッキー保存がうまくいくいきセレクトボックスで表示した言語で表示されるのですが、コントローラーが変わると、クッキーが、保持されず、どうやら次のコントローラーで別のクッキーが作られているので、コントローラーが変わるともう一度セレクトボックスで言語を指定しなくてはいけなくなります。
おそらく、setcookie()の部分のオプションがおかしいのだとおもったので、
下記のようにかいたのですが、サイト全体に共通するような形でクッキーが保持されません。
setcookie( 'lang', $lg, 0 , '/' );
どのように全体にでもクッキーを適応するのかがわかりません。
② サイトURLのルートからのアクセスだと、セレクトボックスで選択しても、クッキーに保存されません。なので、セレクトボックスが機能しないです。
URLのルートでは、もともとは、ルーティングでindexに設定した、コントローラーとアクション(私の場合、indexs/index)を設定しています。なのでURIが表示されないので、フォームからポストするときは、ポスト先をindexs/index になるようにしています。しかし、ルートへのアクセスからだとセレクトボックスでクッキーに保存できませんでした。
私自身、フレームワークを利用しはじめてから、1か月くらいなので、よくわかってない部分の方が多いので、どこにどのように書けばよいのかが、非効率になっていると思います。おそらく、もっと楽にできると思うので、手動で言語を変換する際に、もっとよい方法がありましたら、上記の回答以外にもアドバイスください。よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 14:59