2011-10-07 42 views

Trả lời

2

Sử dụng tham số _locale trong định nghĩa định tuyến của bạn tự động thiết lập miền địa phương sử dụng.

Xem http://symfony.com/doc/current/book/translation.html#the-locale-and-the-url

+0

Vâng, đó là những gì tôi đã làm cho mỗi trang, tuy nhiên tôi cũng muốn cho phép người dùng chọn ngôn ngữ mà anh ấy muốn bằng cách chọn ngôn ngữ đó trong danh sách. – cvsoftware

11

Bạn cần phải gọi $this->get('session')->setLocale($locale) (thay thế 'phiên' của 'yêu cầu' cho Symfony 2.1) bên trong điều khiển của bạn.

tôi đã tạo ra một hình thức, mà tôi vượt qua một loạt các ngôn ngữ:

<?php 
class LanguageType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $langs = $options['languages']; 
     $langs = array_combine($langs, $langs); 
     foreach ($langs as &$lang) { 
      $lang = \Locale::getDisplayName($lang); 
     } 

     $builder->add('language', 'choice', array(
      'choices' => $langs, 
      'required' => false, 
     )); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'languages' => array('fr_FR', 'en_GB'), 
      'csrf_protection' => false, 
     ); 
    } 

    public function getName() 
    { 
     return 'my_language'; 
    } 
} 

tôi gửi đơn này đến một hành động riêng biệt trong một bộ điều khiển, trong đó tôi thiết lập miền địa phương và trả về một chuyển hướng đến trang cuối cùng:

<?php 
class LanguageController extends Controller 
{ 
    public function switchLanguageAction() 
    { 
     $form = $this->get('form.factory')->create(
      new LanguageType(), 
      array('language' => $this->get('session')->getLocale()), 
      array('languages' => $this->container->getParameter('roger.admin.languages', null)) 
     ); 

     $request = $this->get('request'); 
     $form->bindRequest($request); 
     $referer = $request->headers->get('referer'); 

     if ($form->isValid()) { 
      $locale = $form->get('language')->getData(); 
      $router = $this->get('router'); 

      // Create URL path to pass it to matcher 
      $urlParts = parse_url($referer); 
      $basePath = $request->getBaseUrl(); 
      $path = str_replace($basePath, '', $urlParts['path']); 

      // Match route and get it's arguments 
      $route = $router->match($path); 
      $routeAttrs = array_replace($route, array('_locale' => $locale)); 
      $routeName = $routeAttrs['_route']; 
      unset($routeAttrs['_route']); 

      // Set Locale 
      $this->get('session')->setLocale($locale); 

      return new RedirectResponse($router->generate($routeName, $routeAttrs)); 
     } 

     return new RedirectResponse($referer); 
    } 
} 

Làm việc với bất kỳ ngôn ngữ hợp lệ nào (bạn chuyển tùy chọn 'ngôn ngữ' khi tạo biểu mẫu), với điều kiện mở rộng phần mở rộng PHP. Nếu không, bạn cần phải thay thế \Locale::getDisplayName($lang) bằng danh sách tên miền địa phương được tạo theo cách thủ công.

+0

Chỉ cần cẩn thận: liên kết giới thiệu có thể bị một số chuyên viên đánh giá quá mức, sau đó '$ router-> match()' sẽ ném một ngoại lệ vì sẽ không có kết quả phù hợp.Một dự phòng có thể được tốt đẹp ở đây :-) –

5

Tôi chưa làm điều này với biểu mẫu, nhưng chỉ đơn giản là với hình ảnh cờ nhỏ ở đầu màn hình. Mỗi cờ là một liên kết đến trang hiện tại, nhưng với mã ngôn ngữ gồm hai chữ cái trong URL được thay thế bằng ngôn ngữ của lá cờ tương ứng. Mẫu bố trí của tôi có đoạn mã sau:

Chức năng replaceLanguageInUrl được định nghĩa trong lớp mở rộng cành của tôi:

public function getFunctions() 
{ 
    return array(
     'replaceLanguageInUrl' => new \Twig_Function_Method($this, 'replaceLanguageInUrl'), 
    ); 
}  

public function replaceLanguageInUrl($currentLanguage, $newLanguage, $url) 
{ 

    //EDIT BEGIN 
    if (strpos($url,$currentLanguage) == false) { 
     $url = getBaseUrl($url).'/'.$currentLanguage; 
    } 
    //EDIT END 
    return str_replace('/' . $currentLanguage . '/', '/' . $newLanguage . '/', $url); 
} 

Khi một lá cờ được nhấp, cùng một trang web được tải, nhưng trong ngôn ngữ mới . Điều này cũng sẽ tự động đặt ngôn ngữ mới trong phiên.

2

Tôi đã làm nó với địa phương quá nhưng một cái gì đó đơn giản hơn so với giải pháp của wdev, tôi đã sử dụng một số hình ảnh (cờ) làm nút. Khi cờ được nhấp, vị trí mới được đặt và trang được làm mới (với chuyển hướng) bằng ngôn ngữ mới. Bạn cần sử dụng Symfony's translation system. Đây là mã:

Bộ điều khiển:

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

public function chineseAction(Request $request) 
{ 
    $this->get('session')->setLocale('zh_CN'); 
    return $this->redirect($request->headers->get('referer')); 
} 

public function frenchAction(Request $request) 
{ 
    $this->get('session')->setLocale('fr_FR'); 
    return $this->redirect($request->headers->get('referer')); 
} 

mẫu:

<ul class="nav pull-right"> 
    <li> 
      <a href="{{ path('english') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-en.png') }}" alt="English Language" height="30" width="18" /></a> 
    </li> 
    <li> 
      <a href="{{ path('chinese') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-cn.jpg') }}" alt="Chinese Language" height="30" width="18" /></a> 
    </li> 
    <li> 
     <a href="{{ path('french') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-fr.png') }}" alt="French Language" height="30" width="18" /></a> 
    </li> 
</ul> 

Edit: Giải pháp này làm việc với Symfony2.0, cho Symfony2.1 kiểm tra this question

31

Cách đơn giản nhất Tôi đã tìm thấy là để làm điều đó trực tiếp trong mẫu cành. Ít nhất, nó hoạt động với 2.2:

<ul class="lang-menu"> 
    <li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'ca'})) }}">Català</a></li> 
    <li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'en'})) }}">English</a></li> 
</ul> 
+0

giải pháp tuyệt vời và nhẹ !! – eav

+0

không hoạt động đối với tôi, truyền lỗi trong một số trang "Một ngoại lệ đã được ném trong khi hiển thị mẫu (" Không thể tạo URL cho tuyến đường được đặt tên "" vì đường dẫn không tồn tại. ")" url –

+0

Nó hoạt động tuyệt vời cho tôi. Q: Bạn học nó ở đâu, trong docu chính thức (cuốn sách Symfony2)? – mario

Các vấn đề liên quan