2015-01-10 13 views
10

Tôi có thể đặt ngôn ngữ (dựa trên cookie của người dùng) trên toàn cầu ở đâu? Làm cho ứng dụng hoạt động trong toàn bộ ứng dụng (bộ điều khiển, chế độ xem, v.v ..)yii2 đặt giá trị ngôn ngữ toàn cầu

Trong tài liệu tôi tìm thấy \Yii::$app->language = ''; nhưng, tôi có thể viết logic để thay đổi ngôn ngữ đúng cách?

Tôi mới trong yii, tôi nghĩ rằng tôi phải redeclare một số lớp thành phần hoặc một cái gì đó, có thể Yêu cầu lớp học?

Trả lời

11

Bạn nên sử dụng

\Yii::$app->language = ''; 

bên trong bộ điều khiển đó là cha mẹ cho tất cả các bộ điều khiển của bạn. Các tầng lớp phụ huynh nên bên trong thư mục thành phần, và nếu nó không phải là có sẵn hơn tạo ra các thành phần với một cái gì đó giống như

use yii\web\Controller; 
class MyController extends Controller 
{ 
    public function init() 
    { 
     parent::init(); 
     #add your logic: read the cookie and then set the language 
    } 
} 

Sau đó, bạn phải chắc chắn rằng tất cả các bộ điều khiển của bạn kéo dài MyController mới được tạo ra của bạn thay vì bản gốc.

Tôi hy vọng điều đó sẽ hữu ích.

0

Roman, bạn có thể đạt được mục tiêu của mình bằng cách sử dụng tệp cấu hình chính hoặc thông số. Chỉ cần tạo một biến như $sitelang = 'UK_ua'; thì bạn có thể sử dụng biến này qua Yii::$app->params['sitelang']

17

Bạn có thể đặt ngôn ngữ cơ sở của mình trong tệp cấu hình. Trong ứng dụng cơ bản, vị trí mặc định của nó là: /config/web.php, nâng cao: application-name/config/main.phpapplication-name/config/main-local.php.

$config = [ 
    'id' => 'basic', 
    'language' => 'nl', // Set the language here 
    'basePath' => dirname(__DIR__), 
    'bootstrap' => ['log'], 
    ... 
]; 
+0

Không hoạt động đối với mẫu cơ bản YII2 - ngôn ngữ hiển thị trang web vẫn còn 'vi' –

3

Câu trả lời được chấp nhận là một trong những rất tốt, nhưng chỉ trong trường hợp bạn muốn một cái gì đó "ngay cả toàn cầu hơn" bạn có thể sử dụng chức năng bootstrap, hoặc "trên beforeAction" để kích hoạt một chức năng (cả qua cấu hình):

Bootstrap:

$config = [ 
    ... 
    'bootstrap' => ['your\own\component'], 
    ... 
]; 

sau đó bạn có thể sử dụng init() -function của thành phần đó chẳng hạn.

"trên beforeaction":

$config = [ 
    'on beforeAction' => function($event) { 
     // set language 
    } 
]; 
+0

Bạn có thể vui lòng cung cấp ví dụ đầy đủ về mã để cài đặt ngôn ngữ là toàn cầu. Nó sẽ hữu ích cho tất cả các thành viên. –

-1

Tôi biết điều này là cũ nhưng, tôi thấy câu hỏi này trong khi tôi đang tìm kiếm một câu trả lời. Tôi cũng tìm thấy một hướng dẫn tốt đẹp, liên kết dưới đây.

Một trong những cách để làm điều đó để tạo ra một thành phần và bootstrap nó, như vậy:

Tạo một tập tin trong, nói, common/components/LanguageSelector.php

<?php 

namespace common\components; 

use yii\base\BootstrapInterface; 

class LanguageSelector implements \yii\base\BootstrapInterface 
{ 
    public $supportedLanguages = []; 

    public function bootstrap($app) 
    { 
     $preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages); 
     $app->language = $preferredLanguage; 
    } 
} 

Tôi bằng cách sử dụng mẫu ứng dụng nâng cao, bạn có thể điều chỉnh vị trí tệp và vùng tên khi cần.

Sau đó, trong tập tin cấu hình của bạn, bạn cần phải thêm thành phần này, giống như bạn đang bổ sung thêm một thành phần như gỡ lỗi, hoặc đăng nhập thành phần, như vậy:

'components' => [ 
    'languageSelector' => [ 
     'class' => 'common\components\LanguageSelector', 
     'supportedLanguages' => ['en-US', 'tr-TR'], 
    ], 
], 

Ngoài ra, bạn cần phải thêm thành phần này thành phần bootstrapped trong tệp cấu hình của bạn:

'bootstrap' => ['languageSelector', ...] 

Phương pháp này không dựa vào ngôn ngữ của trình duyệt của khách hàng. Bạn cũng có thể tìm thấy một ví dụ trên trang bên dưới về cách đạt được lựa chọn ngôn ngữ dựa trên tùy chọn. Nhưng về cơ bản những gì bạn cần làm là, trong ngôn ngữ của bạnPhần tử thành phần, nhận giá trị từ cookie và thay đổi ngôn ngữ cho phù hợp. Nếu không có cookie trong trình duyệt của người dùng, bạn có thể dự phòng ngôn ngữ trình duyệt.

https://github.com/samdark/yii2-cookbook/blob/master/book/i18n-selecting-application-language.md

0

Có nhiều câu trả lời cho câu hỏi của bạn, tùy thuộc vào logic của bạn. Nếu bạn có một quy tắc tĩnh:

return [ 
    ... 
    'language' => 'it', 
    ... 
]; 

Xem http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration

Nếu bạn muốn thực hiện việc đàm phán nội dung HTTP bình thường, bạn có một bộ phận chuyên dụng:

return [ 
    ... 
    'components' => [ 
     ... 
     'contentNegotiator' => [ 
      'class' => 'yii\filters\ContentNegotiator', 
      'languages' => ['en', 'it'], 
     ], 
     ... 
    ], 
]; 

Xem http://www.yiiframework.com/doc-2.0/guide-structure-filters.html#content-negotiator

Nếu bạn cần một cuộc đàm phán phức tạp hơn, bạn có thể tạo thành phần bootstrap. Dưới đây là ví dụ về ngôn ngữ được lấy từ tùy chọn người dùng cho người dùng đã đăng nhập hoặc được thương lượng cho khách. Lưu ý rằng bạn có thể quá tải ứng dụng của bạn với các hoạt động phức tạp, như lấy các ngôn ngữ được hỗ trợ từ một cơ sở dữ liệu.

/** 
* Select a language from user preferences or content negotiation 
*/ 
class LanguageSelector implements BootstrapInterface 
{ 
    public function bootstrap($app) 
    { 
     if (\Yii::$app->user->isGuest) { 
      $supportedLanguages = (new \yii\db\Query()) 
       ->select('iso639_1') 
       ->from('language') 
       ->orderBy(['priority' => SORT_ASC]) 
       ->column(); 

      $app->language = $app->request->getPreferredLanguage($supportedLanguages); 

     } else { 
      $app->language = Language::findOne(\Yii::$app->user->identity->language_id)->iso639_1; 
     } 
    } 
} 

Có một đọc tốt ở đây về chủ đề này: https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

0

Đến ứng dụng tập tin cấu hình frontend/main/config.php hoặc backend/main/config.php

$ config = [ 'language' => 'ru-RU']

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