How to Work with the User's Locale

The locale of the current user is stored in the request and is accessible via the Request object:

現在のユーザーのロケールはリクエストに保存され、Request オブジェクトを介してアクセスできます。
1
2
3
4
5
6
use Symfony\Component\HttpFoundation\Request;

public function index(Request $request)
{
    $locale = $request->getLocale();
}

To set the user's locale, you may want to create a custom event listener so that it's set before any other parts of the system (i.e. the translator) need it:

ユーザーのロケールを設定するには、システムの他の部分 (翻訳者など) が必要とする前に設定されるように、カスタム イベント リスナーを作成することをお勧めします。
1
2
3
4
5
6
7
public function onKernelRequest(RequestEvent $event)
{
    $request = $event->getRequest();

    // some logic to determine the $locale
    $request->setLocale($locale);
}

Note

ノート

The custom listener must be called before LocaleListener, which initializes the locale based on the current request. To do so, set your listener priority to a higher value than LocaleListener priority (which you can obtain by running the debug:event kernel.request command).

カスタム リスナーは、現在のリクエストに基づいてロケールを初期化する LocaleListener の前に呼び出す必要があります。これを行うには、リスナーの優先度を LocaleListener の優先度 (debug:event kernel.request コマンドを実行して取得できます) よりも高い値に設定します。

Read Making the Locale "Sticky" during a User's Session for more information on making the user's locale "sticky" to their session.

ユーザーのロケールをセッションに「固定」する方法の詳細については、ユーザーのセッション中にロケールを「固定」するを参照してください。

Note

ノート

Setting the locale using $request->setLocale() in the controller is too late to affect the translator. Either set the locale via a listener (like above), the URL (see next) or call setLocale() directly on the translator service.

コントローラーで $request->setLocale() を使用してロケールを設定するのは、翻訳者に影響を与えるには遅すぎます。リスナー (上記のように) または URL (次を参照) を介してロケールを設定するか、トランスレータ サービスで直接 setLocale() を呼び出します。

See the How to Work with the User's Locale section below about setting the locale via routing.

ルーティングによるロケールの設定については、以下の「ユーザーのロケールを操作する方法」セクションを参照してください。

The Locale and the URL

Since you can store the locale of the user in the session, it may be tempting to use the same URL to display a resource in different languages based on the user's locale. For example, http://www.example.com/contact could show content in English for one user and French for another user. Unfortunately, this violates a fundamental rule of the Web: that a particular URL returns the same resource regardless of the user. To further muddy the problem, which version of the content would be indexed by search engines?

ユーザーのロケールをセッションに保存できるため、同じ URL を使用して、ユーザーのロケールに基づいて異なる言語でリソースを表示したくなるかもしれません。たとえば、http://www.example.com/contact は、あるユーザーには英語でコンテンツを表示し、別のユーザーにはフランス語でコンテンツを表示できます。残念ながら、これは、特定の URL はユーザーに関係なく同じリソースを返すという Web の基本ルールに違反しています。問題をさらに混乱させるために、コンテンツのどのバージョンが検索エンジンによって索引付けされるのでしょうか?

A better policy is to include the locale in the URL using the special _locale parameter:

より適切なポリシーは、特別な _locale パラメータを使用して URL にロケールを含めることです。
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// src/Controller/ContactController.php
namespace App\Controller;

// ...
class ContactController extends AbstractController
{
    #[Route(
        path: '/{_locale}/contact',
        name: 'contact',
        requirements: [
            '_locale' => 'en|fr|de',
        ],
    )]
    public function contact()
    {
    }
}

When using the special _locale parameter in a route, the matched locale is automatically set on the Request and can be retrieved via the getLocale() method. In other words, if a user visits the URI /fr/contact, the locale fr will automatically be set as the locale for the current request.

ルートで特別な _locale パラメータを使用すると、一致したロケールがリクエストに自動的に設定され、getLocale() メソッドを介して取得できます。つまり、ユーザーが URI /fr/contact にアクセスすると、ロケール fr が現在の要求のロケールとして自動的に設定されます。

You can now use the locale to create routes to other translated pages in your application.

ロケールを使用して、アプリケーション内の他の翻訳済みページへのルートを作成できるようになりました。

Tip

ヒント

Define the locale requirement as a container parameter to avoid hardcoding its value in all your routes.

ロケール要件をコンテナー パラメーターとして定義して、すべてのルートでその値をハードコーディングしないようにします。

Setting a Default Locale

What if the user's locale hasn't been determined? You can guarantee that a locale is set on each user's request by defining a default_locale for the framework:

ユーザーのロケールが決定されていない場合はどうなりますか?フレームワークに default_locale を定義することで、ユーザーのリクエストごとにロケールが設定されることを保証できます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/packages/translation.yaml
framework:
    default_locale: en