Blog

concrete5.7で多言語サイトを作る時にグローバルエリアを言語ごとに切り替える方法

Posted by admin at 10:05 日時 2014/12/23

を考えてみたんですが、5.7 から導入された名前空間の恩恵ヤバい。自由度高すぎる。バージョン 5.6 までにあった「オーバーライド」の概念が 5.7 から変更されて、自由度が下がるのかなとちょっと心配してたんですが、全くの杞憂でした。

※ この方法はバージョン5.7.5以降、グローバルエリアが言語ごとに切り替わる機能が標準実装されたため、使えません。

やりたいこと

concrete5 の通常のエリアはページごとに違うので良いのですが、グローバルエリアはサイト内の全ページで共通の内容になります。多言語サイトを構築する際には、このグローバルエリアを言語ごとに分けたい場合があります。というか、ほぼ分ける必要があります。その際、5.6まではテーマ側でグローバルエリアを宣言する際にちょっとごにょごにょして、言語ごとに違う名前のエリア名になるようにしていました。例えば、Header Menu という名前のグローバルエリアがあったとして、日本語ページでは Header Menu Ja JP、フランス語ページでは Header Menu Fr FR というように(参考記事)。これが、5.7 ではテーマはいじらなくてもできました。ちなみにちなみに、5.6までで他言語サイトを作るにはInternationalizationという無料のアドオンを使用する必要がありましたが、5.7.3ではコアにマージされましたので、デフォルト機能で多言語サイトも作れるようになっちゃいました。素晴らしい!

オーバーライド用のGlobalArea.phpを作成する

グローバルエリアは、テーマでこのように宣言します。

$a = new GlobalArea('Header Menu');

つまり、GlobalArea クラスのコンストラクタで、文字列を受け取っているわけですね。ですので、コンストラクタの処理だけ変えてあげればよさそうです。そこで、コアの GlobalArea クラスを継承した、改造 GlobalArea クラスを作成しましょう。concrete5.7では、カスタマイズは application フォルダに入れることが決まりです。

/concrete/src/Area/GlobalArea.php → コアクラス

/application/src/Area/GlobalArea.php → 作成する改造クラス

中身はこんな感じ。コアの GlobalArea クラスを、use 演算子を使って CoreGlobalArea として読み込み、継承しています。

中身の解説は、今回は省きます。

カスタムクラスを使用するよう設定ファイルを変更する

次に、application/config/app.php の内容を下記のように書き換えます。単に GlobalArea というクラス名が呼ばれた時に、コアの GlobalArea クラスではなく、先ほど作成した改造 GlobalArea が呼ばれるように設定しています。

これでOK!編集モードで確認してみましょう。

グローバルエリア名が変わりました。通常のエリアはそのままになっています。

テーマでは Footer Site Title として宣言されているグローバルエリアが、日本語ページではFooter Site Title Japanese (Japan) というエリア名に変わっています。これで、他の言語のページとは別のグローバルエリアになったと言うわけです。

この application/config/app.php は非常に強力です。どのような設定が可能なのかは、concrete/config/app.php で確認できますが、クラスエイリアスだけでなく、サービスプロバイダーやルーティングも変更できることが分かります。こんなに自由度が高くていいんでしょうか。いいんです!concrete5素晴らしい!

追記:パッケージ化してみた

GitHubにて公開しています

zipでダウンロードはこちら

multilingual_global_areaフォルダをpackagesにアップロードするとインストール可能になります。


Share this entry