4

Symfony2.2 で奇妙な問題が発生しています。en/fr の 2 つの言語を使用するプロジェクトがあります。そこで、いつものように (Symfony2.0 と同じように) Ressources/Views/translations/ に "messages.en.yml" と "messages.fr.yml" という 2 つの翻訳ファイルを作成します。しかし、リクエスト オブジェクトとロケール セッションを設定しても、twig の翻訳は変更できませんでした。翻訳は常に default_locale (config.php) によって設定されます。

例 : default_locale = en の場合、fr (リクエストとセッション) で _locale オブジェクトを設定しても、(twig の) すべての Web サイトが en に翻訳されます。もちろん、手動で default_locale を fr に変更すると、Web サイトは当然 fr...

ただし、_localeセッションは機能しますが、ロケールリクエストが機能するかどうかはわかりません。もちろん、コントローラーでも翻訳が機能します...

私のファイルがあります:

config.yml:

framework:
#esi:            ~
translator:      { fallback: %locale% } # = en
# ...
default_locale: %locale% # = en

コントローラー:

public function indexAction()
{
    $this->get('session')->set('_locale', 'fr');
    $this->getRequest()->setLocale($lang);
    exit($this->getRequest()->getLocale()); // = fr
    exit($this->get('translator')->trans('Symfony2 is great')); // = Symfony2 est génial

    return $this->render('TestBundle:Controller:test.html.twig');

意見 :

{% block content %}
<p>lang : {{ app.request.locale }}</p> {#} = "fr", OK{#}
<p>{{ 'Symfony2 is great'|trans }}</p> {#} = "Symfony2 is great", WAIT WHAT?{#}

メソッドコントローラーの先頭にあるロケールに、要求されたロケール (セッションに保存されている) をそのように強制するために、自分自身を辞任する必要があります。

コントローラ:

if($this->get('session')->get('_locale')){
    $lang = $this->get('session')->get('_locale');
    $this->getRequest()->setLocale($lang);
}

つまり、リクエストオブジェクトの登録に問題があります...最後のコードはコントローラーでうまく機能し、app.request.localeを使用してtwigページのロケールをうまく表示しますが、翻訳は表示しないため.. . (下手な英語で申し訳ありません。助けてくれてありがとう)

4

2 に答える 2

0

ルーティングのパラメーター _locale は、ロケール値を保持します。

このページのこちらをご覧ください

Symfony - 本 - 翻訳 - ローカルと URL

Symfony 2.1 からは、次のようなロジックがあります。

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

URL にロケールを含めることをお勧めします。これは、特別な _locale パラメータを使用するルーティング システムで完全にサポートされています。

ローカルで販売したい場合、これは機能しなくなりました

$this->get('session')->set('_locale', 'fr');

現在、セッションの代わりにリクエストを使用できますが、カーネル リクエストでイベント リスナーを使用してシミュレートしない限り、Symfony 2.0 から _local を使用してセッション ロジックを使用することはできません。

于 2013-07-08T04:41:07.540 に答える