Symfonyの恩恵を受けている部分だと思うのですが、EC-CUBE4では過去のEC-CUBEよりも比較的簡単に多言語対応ECサイトを作ることができます。
そのベースとなる言語切り替えの部分の仕組みをご紹介します。

※商品やカテゴリと言った管理画面から登録するデータ部分は自動で切り替わったりするわけではないので、両方登録する仕組みを作るか併記する仕組みを作る必要があります。通じやすい英語で最初から登録しておくのも1つの手でしょう。

デフォルト言語について

EC-CUBEではデフォルト言語は日本語に初期設定されています。これを英語に変更するには.envでECCUBE_LOCALE=enという記述を行うだけです。

英語の翻訳ファイルが最初から用意されているので、Git版のEC-CUBEを使えば一瞬でEC-CUBEの英語化を行うことができます。英語以外の言語を使用する場合は自身で翻訳ファイルを作成してやる必要があります。

なお、パッケージ版のEC-CUBEでは標準テンプレートの日本語変換が行われているためにうまくいきません。Git版を使用することになります。

またデザインテンプレートは対応していないことが多いので自身でGit版の標準テンプレートをカスタマイズしていくのが良いでしょう。

言語切り替えについて

実は下記のSymfonyレファレンスに全て記載されています(笑)

https://symfony.com/doc/3.4/translation/locale.html

基本的にはkernel.requestに対するイベントをつかまえて$request->setLocale($locale);を行うだけで言語が切り替わり、対応した言語の翻訳ファイルを読み込みます。

なので言語切り替えボタンを押した時などにセッションへどの言語が選択されたかを保存し、その言語をsetLocaleするように実装してやれば実現することができます。

注意するポイントはSymfony標準のLocaleListenerよりも高い優先度を指定することです。調べたところ16でしたので17以上で指定を行うと良いでしょう。

LocaleListener

kernel.requestのイベントをつかまえるCustomize\EventSubscriber\LocaleSubscriberの例としては下記のようになります。ロジック部分はサイトによるので皆さんで考えて見てください。

 

<?php

namespace Customize\EventSubscriber;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class LocaleSubscriber implements EventSubscriberInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * Event constructor.
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface  $container)
    {
        $this->container = $container;
    }

    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST => [['onKernelRequest', 17]],
        ];
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        
        // ここで何かしらのロジックにより言語を決定する
        $locale = 'hogehoge';


        $request->setLocale($locale);
    }
}

ちょっとした疑問

ec-cube.coって.envや環境変数の切り替えはできるのだろうか?(.envをプラグインから書き換える等)
.env等を使わなくても、プラグイン形式でデフォルト言語と言語切り替え機能を実装してやればec-cube.coでも多言語化は実現可能ですが、少し.envや環境変数での指定が可能なのか疑問に思いました。


EC-CUBE4系プラグイン