2012-10-18 40 views
6

Tôi đang cố gắng có trình chuyển đổi ngôn ngữ trên trang web symfony 2.1 của mình.Đặt ngôn ngữ trong Symfony 2.1

Tôi đã theo dõi official documentation, đặt các tệp dịch nhưng đặt ngôn ngữ với $ request-> setLocale ('en_US'); dường như không hoạt động. Sau một số nghiên cứu, tôi tìm thấy this question cung cấp một câu trả lời bắt đầu với số listener technique này.

Tuy nhiên, tôi vẫn không cố gắng làm việc đó, tôi không chắc chắn về tuyên bố người nghe của mình, có vấn đề gì không?

điều khiển của tôi:

public function englishAction(Request $request) 
{ 
    $this->get('session')->set('_locale', 'en_US'); 
    return $this->redirect($request->headers->get('referer')); 
} 

khai dịch vụ trong config.yml:

services: 
    my_listener: 
     class:  "FK\MyWebsiteBundle\Listener\LocaleListener" 

định tuyến của tôi:

homepage: 
    pattern: /{_locale} 
    defaults: { _controller: FKMyWebsiteBundle:Default:index, _locale: en } 
    requirements: 
     _locale: en|fr|cn 
about: 
    pattern: /{_locale}/about 
    defaults: { _controller: FKMyWebsiteBundle:Default:about, _locale: en } 
    requirements: 
     _locale: en|fr|cn 
+0

Chính xác nhu cầu của bạn là gì? Một ví dụ về trường hợp sử dụng? Có thể bạn không cần người nghe này – webda2l

+0

@ webda2l Tôi chỉ muốn cho phép khách truy cập chọn ngôn ngữ của trang web. Mã trong câu trả lời của bạn không hoạt động nhưng tôi đoán tôi phải thay đổi tuyến đường của mình, tôi sẽ làm việc thêm một số điều trên đó .. –

+0

Tôi có đang thiết lập đúng người nghe không? LocaleListener của tôi sẽ được gọi như thế này? –

Trả lời

9

Việc kê khai của LocaleListener trong yml (lấy cảm hứng từ hiện tại khai báo LocaleListener mới: \ vendor \ symfony \ symfony \ src \ Symfony \ Bundle \ FrameworkBundle \ Tài nguyên \ config \ Web.xml)

services: 
    my_listener: 
     class: "FK\MyWebsiteBundle\Listener\LocaleListener" 
     arguments: [%locale%] 
     tags: 
      - { name: kernel.event_subscriber } 

Một số đoạn:

Một switcher ngôn ngữ trong mẫu của bạn:

{% for locale in ['en', 'fr', 'cn'] %} 
    <li {% if locale == app.request.locale %}class="active"{% endif %}> 
     <a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : locale})) }}">{{ locale }}</a> 
    </li> 
{% endfor %} 

Một chuyển hướng với sự thay đổi miền địa phương từ một bộ điều khiển:

$LocalizedUrl = $this->get('router')->generate(
    $request->attributes->get('_route'), 
    ['_locale' => $locale] + $request->attributes->get('_route_params') 
); 

return new \Symfony\Component\HttpFoundation\RedirectResponse($LocalizedUrl); 
+0

@ webda2I Dường như được làm việc thực sự tốt đẹp. Phải đi ngay bây giờ, sẽ chơi nhiều hơn khi tôi trở lại và có lẽ sẽ chấp nhận câu trả lời vì nó có vẻ là làm việc tốt :) Tôi không chắc chắn để hiểu mã mặc dù: ( –

+0

Hoạt động tốt đẹp kể từ khi tôi thêm dịch vụ đúng trong các dịch vụ Trong bộ điều khiển của tôi, tôi sử dụng: $ this-> get ('session') -> set ('_ locale', 'en_US'); trả về $ this-> redirect ($ request-> headers-> get (' referlets ')); –

+0

Ok tuyệt vời Việc khai báo cơ bản trong YML phải làm việc nhưng nếu bạn làm XML với service.xml, thì tốt hơn. :) – webda2l

0

Bạn sẽ nhận được cá thể phiên dịch được liên kết với vùng chứa hạt nhân symfony của bạn:

$this->container->get('translator')->setLocale('fr'); 
Các vấn đề liên quan