2015-01-10 1 views
10

어디에서 사용자의 쿠키를 기반으로 언어를 설정할 수 있습니까? 전체 응용 프로그램 (컨트롤러, 뷰 등)에서 작동하게 만들기yii2 글로벌 언어 값을 설정하십시오.

문서에서 나는 \Yii::$app->language = '';을 찾았지만 올바른 논리로 언어를 변경할 수 있습니까?

저는 새로운 yii로 구성 요소 클래스 또는 무언가를 다시 선언해야한다고 생각합니다. 요청 클래스일까요?

답변

11

당신은 모든 컨트롤러에 부모 컨트롤러 내부

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

를 사용해야합니다. 그 후

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

같은 것을 함께 구성 요소를 만드는 것보다 사용할 수없는 경우 부모 클래스는 구성 요소 폴더 안에, 그리고해야한다, 당신은 모든 컨트롤러의 새로 만든 MyController에를 대신 확장 있는지 확인해야 원래 것.

도움이되기를 바랍니다.

0

로마, 주요 구성 파일 또는 매개 변수를 사용하여 목표를 달성 할 수 있습니다. $sitelang = 'UK_ua';과 같은 변수를 만든 다음 Yii::$app->params['sitelang']

17

구성 파일에서 기본 언어를 설정할 수 있습니다. 기본 응용 프로그램에서 기본 위치는 /config/web.php이며, 고급 내용은 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

YII2 기본 템플릿에서는 작동하지 않습니다. 사이트에서 볼 수있는 언어는 'en'입니다. –

3

구성을 통해 모두 (허용 된 대답은 매우 좋은 일이지만, 단지 경우에 당신이 뭔가를 원한다 "더 많은 글로벌"부트 스트랩 기능을 사용할 수 있습니다, 또는 "beforeAction의"기능을 실행하는 데) :

부트 스트랩 :

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

그런 다음 예를 들어 해당 구성 요소의 init() α- 함수를 사용할 수 있습니다. "beforeaction의"

:

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

전체적으로 언어를 설정하는 코드 예제를 제공해주십시오. 모든 회원에게 도움이 될 것입니다. –

-1

나는이 오래 알고 있지만 나는 대답을 검색하는 동안, 나는이 질문을 발견했다. 나는 또한 좋은 가이드, 아래 링크를 찾는다. 과 같이, 그것을 구성 요소를 생성하고 부트 스트랩을 할 수있는 방법

하나 :

공통/구성 요소, 말,에 파일을 생성/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; 
    } 
} 

난 고급 앱 템플릿을 사용하여 필요에 따라 파일 위치와 네임 스페이스를 조정할 수 있습니다.

그런 다음, 설정 파일에, 당신은 당신이 디버그와 같은 다른 구성 요소를 추가, 또는 로그 구성 요소를 너무 좋아하는 것처럼,이 구성 요소를 추가 할 필요가 : 또한

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

,이 구성 요소를 추가해야 설정 파일에 부트 스트랩 구성 요소 :

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

이 방법은 그러나 쿠키에 의존하지 않는, 그것은 클라이언트 브라우저의 언어에 의존한다. 또한 기본 설정 기반 언어 선택을 수행하는 방법에 대한 아래의 예제를 찾을 수 있습니다. 그러나 기본적으로해야 할 일은 languageSelector 구성 요소에서 쿠키의 값을 가져 와서 그에 따라 언어를 변경하는 것입니다. 사용자 브라우저에 쿠키가 없으면 브라우저 언어로 폴백 할 수 있습니다.

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

0

당신의 논리에 따라, 귀하의 질문에 많은 대답이 있습니다.

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

는 일반 HTTP 컨텐츠 협상을 구현하려면 http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration

, 당신은 전용 구성 요소가 참조 : 정적 규칙이있는 경우

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

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

좀 더 복잡한 협상이 필요한 경우 부트 스트랩 구성 요소. 다음은 로그인 한 사용자의 사용자 기본 설정에서 언어를 가져 오거나 게스트를 위해 협상 한 경우의 예입니다. 데이터베이스에서 지원되는 언어를 가져 오는 것과 같이 복잡한 작업으로 응용 프로그램을 오버로드 할 수 있습니다.

/** 
* 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; 
     } 
    } 
} 

이 주제에 대한 여기에 좋은 읽기있다 : https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

0

이동 응용 프로그램 구성 파일 프론트 엔드/주/config.php를 또는 백엔드/메인은/config.php를

$ 설정 = [ 'language'=> 'ru-RU']

관련 문제