Giter Club home page Giter Club logo

yii2-languages-dispatcher's Introduction

Languages dispatcher

Build Status Coverage Status

Sets the web-application language

Installation

The preferred way to install this extension is through composer.

Either run

composer require --prefer-dist cetver/yii2-languages-dispatcher

or add

"cetver/yii2-languages-dispatcher": "^1.0"

to the require section of your composer.json file.

Usage

Update the web-application configuration file

return [
    'bootstrap' => ['languagesDispatcher'],
    'components' => [
        'languagesDispatcher' => [
            'class' => 'cetver\LanguagesDispatcher\Component',
            'languages' => ['en', 'ru'],
            // useful if you want to push the language handler at the beginning of beforeAction event handlers list
            'appendSetLanguageHandler' => false, // defaults to true
            /*
            or
            'languages' => function () {
                return \app\models\Language::find()->select('code')->column();
            },
            */
            // Order is important
            'handlers' => [
                [
                    // Detects a language based on host name
                    'class' => 'cetver\LanguagesDispatcher\handlers\HostNameHandler',
                    'request' => 'request', // optional, the Request component ID.                    
                    'hostMap' => [ // An array that maps hostnames to languages or a callable function that returns it.
                        'en.example.com' => 'en',
                        'ru.example.com' => 'ru'
                    ]
                ],
                [
                    // Detects a language from the query parameter.
                    'class' => 'cetver\LanguagesDispatcher\handlers\QueryParamHandler',
                    'request' => 'request', // optional, the Request component ID.
                    'queryParam' => 'language' // optional, the query parameter name that contains a language.
                ],
                [
                    // Detects a language from the session.
                    // Writes a language to the session, regardless of what handler detected it.
                    'class' => 'cetver\LanguagesDispatcher\handlers\SessionHandler',
                    'session' => 'session', // optional, the Session component ID.
                    'key' => 'language' // optional, the session key that contains a language.
                ],
                [
                    // Detects a language from the cookie.
                    // Writes a language to the cookie, regardless of what handler detected it.
                    'class' => 'cetver\LanguagesDispatcher\handlers\CookieHandler',
                    'request' => 'request', // optional, the Request component ID.
                    'response' => 'response', // optional, the Response component ID.
                    'cookieConfig' => [ // optional, the Cookie component configuration.
                        'class' => 'yii\web\Cookie',
                        'name' => 'language',
                        'domain' => '',
                        'expire' => strtotime('+1 year'),
                        'path' => '/',
                        'secure' => true | false, // depends on Request::$isSecureConnection
                        'httpOnly' => true,
                    ]
                ],
                [
                    // Detects a language from an authenticated user.
                    // Writes a language to an authenticated user, regardless of what handler detected it.
                    // Note: The property "identityClass" of the "User" component must be an instance of "\yii\db\ActiveRecord"
                    'class' => 'cetver\LanguagesDispatcher\handlers\UserHandler',
                    'user' => 'user',  // optional, the User component ID.
                    'languageAttribute' => 'language_code' // optional, an attribute that contains a language.
                ],
                [
                    // Detects a language from the "Accept-Language" header.
                    'class' => 'cetver\LanguagesDispatcher\handlers\AcceptLanguageHeaderHandler',
                    'request' => 'request', // optional, the Request component ID.
                ],
                [
                    // Detects a language from the "language" property.
                    'class' => 'cetver\LanguagesDispatcher\handlers\DefaultLanguageHandler',
                    'language' => 'en' // the default language.
                    /*
                    or
                    'language' => function () {
                        return \app\models\Language::find()
                            ->select('code')
                            ->where(['is_default' => true])
                            ->createCommand()
                            ->queryScalar();
                    },
                    */
                ]

            ],
        ],
    ],
];

Tests

Run the following commands

composer create-project --prefer-source cetver/yii2-languages-dispatcher
cd yii2-languages-dispatcher
vendor/bin/codecept run unit

For I18N support, take a look at

yii2-languages-dispatcher's People

Contributors

cetver avatar raven0us avatar vuquangthinh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

yii2-languages-dispatcher's Issues

setLanguage and AcceptLanguageHeaderHandler issue

Hi,
I had an issue with setting yii2 application language based on browser language. After debugging I found out that this line

$intersection = array_intersect($this->languages, $handler->getLanguages());
has an issue. If browser returns more languages that are accepted like I got, for instance pl,en,de then if you got languagesDispatcher languages set to ['en', 'pl', 'de'] in web.php config file then first language was set as default from this array which is 'en' , but it should set first language that is sent by the browser which is here 'pl'.

Anyway, when I have changed this line to this (switched params):
$intersection = array_intersect($handler->getLanguages(), $this->languages);
then browser langauge detection works fine.

Hope my explanation is clear enough for you to fix this in your code.

Thanks

Push setLanguage at the beginning of the beforeAction handler list

I'm talking about Component and the handler that's attached for EVENT_BEFORE_ACTION, the event that actually sets the language.

In a real life scenario, the language should always be handled first, before doing other things. A lot of modules including security ones (RBAC/Access Control) get attached on EVENT_BEFORE_ACTION as well. In my case, I need to know the language before doing dynamic stuff and I get the language too late.

Can we go
$app->on($app::EVENT_BEFORE_ACTION, [$this, 'setLanguage'], $app, false);? Am I missing something (why we wouldn't want that)?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.