EC-CUBE4でフロントのみ英語表示にする
以前、「EC-CUBE4の多言語機能」の記事で、.envのECCUBE_LOCALEでLocaleを変更するとフロントだけでなく管理画面もLocaleが変わるという解説をしました。英語圏に向けてECサイトを運営したい場合など、フロントだけ英語表示にして管理画面は日本語にしたいこともあると思います。今回は、フロントだけLocaleを変更する方法を解説します。
方針としては、Symfonyのkernel.requestイベントで、リクエストがフロントへのアクセスだった場合のみ、Localeを変更するようにします。これにはapp/Customize/EventListener/に以下のようなイベントリスナークラスを作成して行います。
app/Customize/EventListener/LocaleListener.php
<?php namespace Customize\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; class LocaleListener implements EventSubscriberInterface { public function __construct() { } public static function getSubscribedEvents(): array { // SymfonyのLocaleListenerより優先度を高くする。 return [ KernelEvents::REQUEST => [['onKernelRequest', 20]], ]; } public function onKernelRequest(GetResponseEvent $event) { $request = $event->getRequest(); $front = strpos($request->getRequestUri(), '/' . env('ECCUBE_ADMIN_ROUTE')) === 0 ? false : true; // FrontのみのLocaleを切り替え。 if ($front) { $request->setLocale('en'); } } }
やっていることはonKernelRequest()でHTTP RequestのURLをチェックし、管理画面でなければLocaleを設定しているだけです。注意点としてはSymfonyのデフォルトのLocaleListenerよりも先に処理をする必要がある点です。SymfonyのLocaleListenerの優先度は16なので(*1)、ここでは20としています。
ファイルを作成したらキャッシュをクリアすれば反映されます。
$ bin/console cache:clear
正常に反映されていれば、bin/console debug:event kernel.requestで登録したイベントリスナーが確認できます。
$ bin/console debug:event kernel.request
Registered Listeners for "kernel.request" Event
===============================================
------- ------------------------------------------------------------------------------------------------- ----------
Order Callable Priority
------- ------------------------------------------------------------------------------------------------- ----------
略
#9 Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest() 32
#10 Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::onKernelRequest() 24
#11 Customize\EventListener\LocaleListener::onKernelRequest() 20
#12 Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest() 16
#13 Symfony\Component\HttpKernel\EventListener\TranslatorListener::onKernelRequest() 10
#14 Symfony\Bundle\SecurityBundle\EventListener\FirewallListener::onKernelRequest() 8
略
------- ------------------------------------------------------------------------------------------------- ----------
これでフロントのみ英語Localeになります。
ただ、EC-CUBEのデフォルトのフロントテンプレートは翻訳に対応していないので、テキストなどは日本語のままです。 ログインページなどからログインエラーなどにすると、エラーメッセージが英語に切り替わっているのでLocaleが変わっていることが確認できます。

先日公開した多言語表示プラグインのResource/template/default4.0/からテンプレートをapp/templates/default/に持ってくればテキスト表示も翻訳されるはずです(*2)。
一応、これでフロントのみ英語表示にすることができます。実際に英語圏に向けてECサイトを運用しようとすると、カスタマイズしないといけない点は他にもまだまだありますが。
[参考]
https://symfony.com/doc/current/translation/locale.html
(*1) イベントリスナーの優先度は bin/console debug:event kernel.request で確認できます。
(*2) includeしているファイルのパス調整などは必要になります。
投稿日:2022/10/17 15:10