2013-08-13 29 views
5

Tôi đang sử dụng khung công tác zend 2 và tôi muốn thay đổi ngôn ngữ ứng dụng bằng cách nhấp vào liên kết ví dụ.ZF2-Tự động thay đổi ngôn ngữ ứng dụng trên Zend Framework 2

đây là cấu hình định tuyến của tôi:

'route' => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]', 

và tôi đã định nghĩa en ngôn ngữ mặc định:

'defaults' => array(
    'lang'  => 'en', 
        ), 

trên module.php tôi:

public function onBootstrap ($e) { 

     $eventManager= $e->getApplication()->getEventManager(); 

     $routeCallback = function ($e) { 
      $availableLanguages = array ('fr', 'en'); 
      $defaultLanguage = 'en'; 
      $language = ""; 
      $fromRoute = false; 
      //see if language could be find in url 
      if ($e->getRouteMatch()->getParam('lang')) { 
       $language = $e->getRouteMatch()->getParam('lang'); 
       $fromRoute = true; 

       //or use language from http accept 
      } else { 
       $headers = $e->getApplication()->getRequest()->getHeaders(); 
       if ($headers->has('Accept-Language')) { 
        $headerLocale = $headers->get('Accept-Language')->getPrioritized(); 
        $language = substr($headerLocale[0]->getLanguage(), 0,2); 
       } 
      } 
      if(!in_array($language, $availableLanguages)) { 
       $language = $defaultLanguage; 
      } 
      $e->getApplication()->getServiceManager()->get('translator')->setLocale($language); 

     }; 

     $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_ROUTE, $routeCallback); 
    } 

Bây giờ công trình này hoàn toàn, nhưng tôi muốn cho phép người dùng thay đổi ngôn ngữ chỉ bằng cách nhấp vào liên kết chẳng hạn.

Bất kỳ đề xuất nào ??

Cảm ơn bạn đã trợ giúp!

+0

'tdutrion' trong #zftalk kênh IRC giới thiệu: https://github.com/juriansluiman/SlmLocale để định tuyến bằng vistor web từ các vị trí và ngôn ngữ khác nhau. –

+0

dòng này tiết kiệm cho tôi, '$ e-> getApplication() -> getServiceManager() -> get ('translator') -> setLocale ($ language);' nhưng sử dụng zf3 tôi chỉ thay đổi thành '$ e-> getApplication () -> getServiceManager() -> get ('MvcTranslator') -> setLocale ($ language); 'File: Module.php. Cảm ơn. – rafaelphp

Trả lời

0

từ kinh nghiệm của tôi là một phương pháp hay để luôn lưu trữ ngôn ngữ trong url. Bằng cách này, bạn sẽ có một địa chỉ duy nhất cho các trang bằng các ngôn ngữ khác nhau. Nếu không trên cùng một url, nội dung khác nhau sẽ được hiển thị cho từng ngôn ngữ và bạn sẽ không biết ngôn ngữ nào được hiển thị cho bot, điều quan trọng nếu ứng dụng là một trang web. Sử dụng phương pháp này không khó để cung cấp các liên kết đa ngôn ngữ cho người dùng.

+0

Vâng, đó là những gì tôi đã làm. tôi có một địa chỉ duy nhất thay đổi địa chỉ là tham số ngôn ngữ. Như tôi đã nói điều này hoạt động thực sự, Bây giờ những gì tôi cần là thay đổi ngôn ngữ theo nhu cầu của người dùng. vì vậy tôi cần phải thay đổi dafault _en_ ​​để có các url như thế này: '/ fr/controller_name/action_name/..' – blackbishop

+0

Tôi muốn tạo url ngôn ngữ của mỗi bộ điều khiển cho mỗi hành động. Bởi vì, url có thể khác nhau cho mục đích SEO và một số trang có thể không có nội dung bằng các ngôn ngữ khác, nếu trường hợp này xảy ra, trình điều khiển có thể tạo url mặc định (trang chủ của ngôn ngữ). nếu không có một preg_replace, bạn có thể thay đổi phần ngôn ngữ của url. – bkilinc

+0

Ý kiến ​​của bạn là thực hành tốt nhất. Nhưng tôi không nhấn nút bình chọn lên, bởi vì nó không phải là giải pháp cho câu hỏi. –

1

Có lẽ nó đến muộn nhưng đây là giải pháp cho câu hỏi của bạn:

"Bây giờ làm việc này một cách hoàn hảo, nhưng tôi muốn cho phép người dùng thay đổi ngôn ngữ chỉ bằng cách nhấp vào liên kết ví dụ"

bạn có thể làm một menu trong menu của bạn như thế này (sử dụng bootstrap)

<ul class="dropdown-menu"> 
          <li><a href="<?= $this->url($this->route, array('lang' => 'fr'));?>"> 
           <span class="flag fr"></span> Français 
          </a></li> 
          <li><a href="<?=$this->url($this->route, array('lang' => 'en'));?>"> 
           <span class="flag gb"></span> English 
          </a></li> 
         </ul> 

Đảm bảo rằng po/mo/và tập tin Traduction khác của bạn được phù hợp với mô hình "fr \ en" vv .. .

Và nó sẽ hoạt động hoàn hảo.

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