1

Sonata管理バンドルを使用してi18n管理サイトを構築しています。ここで、管理者ユーザーのロケール セットを使用してロケールと翻訳を変更したいと考えています。のように、私には 2 人の管理者ユーザーがいます。1 人は en(userA)で、もう 1 人は zh(UserB)です。ユーザーのロケールは、ユーザー管理ダッシュボードでそれぞれ en/zh に設定されています。</p>

私の管理サービス:</p>

services:
    sonata.admin.post:
        class: Acme\StoreBundle\Admin\PostAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: "Content", label: "Project", label_translator_strategy: sonata.admin.label.strategy.underscore }
        arguments:
            - ~
            - Acme\StoreBundle\Entity\Product
            - ~
        calls:
            - [ setTranslationDomain, [AcmeStoreBundle]]
            - [ setLabelTranslatorStrategy, [ @sonata.admin.label.strategy.native ]]

次に、私の Resources/translations/AcmeStoreBundle.en.xliff と Resources/translations/AcmeStoreBundle.zh.xliff をそのまま:</p>

<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>label.product.name</source>
                <target>Product Name</target>  ##---> zh is diffrent here!!!
            </trans-unit>
        </body>
    </file>
</xliff>

次に、UserA で admin にログインすると、メッセージ (製品名) は OK です。しかし、私は UserB でログインし、メッセージはまだ en locale(product name) です。もちろん、userB の parameters.yml (%locale%) でグローバル ロケールを変更できますが、これは userA には適していません。

では、サイトのロケール (メッセージまたは翻訳) を別の管理者のユーザー ロケールに変更するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

0

ログイン成功ハンドラーを拡張し、セッションでユーザーのロケールを設定できます。例えば:

# app/config/config.yml
services:
    login_success_handler:
        parent: security.authentication.success_handler
        class:  MyVendor\MyBundle\LoginSuccessHandler

更新: security.yml でこのリスナーを必ず指定してください。

# app/config/security.yml
security:
    firewalls:
        secured_area:
            pattern:   ^/
            anonymous: ~
            form_login:
                login_path: login
                check_path: login_check
                success_handler: login_success_handler

次に、ログイン成功ハンドラ クラスを追加します。

class LoginSuccessHandler extends DefaultAuthenticationSuccessHandler
{
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        $locale = $token->getUser()->getLocale()

        $request->getSession()->set('_locale', $locale);
        $request->setLocale($locale);

        return parent::onAuthenticationSuccess($request, $token);
    }
}

次に、Symfony のドキュメントにあるものと同様またはまったく同じLocaleListener を作成できます。_locale唯一の違いは、ルートを定義しない場合は、次のように変更できることです。

if ($locale = $request->attributes->get('_locale')) {
    $request->getSession()->set('_locale', $locale);
} else {
    $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}

ただに

$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
于 2014-12-23T06:56:48.030 に答える