如何使用用户浏览器语言Yii2自动更改语言?

时间:2019-02-28 16:04:31

标签: yii2

用户可以从网站上手动更改语言。但是为了获得更好的用户体验,我想根据用户的浏览器语言自动更改它。我有一个全局Controller,可以使用init()然后重定向。

请给我一些正确操作的提示。

1 个答案:

答案 0 :(得分:0)

您应该记住为用户选择的语言,如果他们以前选择过一种语言,我会将其存储在user_preference表的数据库中。

然后,您需要拦截请求,可以使用on beforeRequest属性在应用程序配置文件中完成。

如果您尚未存储当前用户的首选项,或者该用户是访客,请使用浏览器语言设置应用程序语言。

  

配置文件

use app\models\User;

...

'on beforeRequest' => function ($event) {

    $user_lang = '';

    if (!Yii::$app->user->isGuest) {

        // Check if you have stored a language preference for the user
        $user_lang = User::findIdentity(Yii::$app->user->id)->getUserPreference('lang');

    }

    if (!empty($user_lang)) {

        // If you have a stored preference for the user, use it
        Yii::$app->language = $user_lang;

    } else {

        // If you don't have a preference, use the browser language
        // Get the browser language from the headers
        $browser_lang = Yii::$app->request->headers->get('accept-language');

        // Alternatively get the headers from the event
        // $event->sender->request->headers->get('accept-language')

        // Calculate the language you want to provide based on the browser language
        $language_code = LanguageHelper::calculatei18nCode($browser_lang);

        Yii::$app->language = $language_code;

    }
},
...

如果您想保持配置文件的干净,可以使用过滤器来拦截请求。

您的LanguageHelper::calculatei18nCode($browser_lang)方法将尝试以可用语言找到与浏览器语言匹配的内容,如果找不到,则可以返回最接近的匹配项或默认的应用程序语言。

  

LanguageHelper

public static function calculatei18nCode ($browser_lang) {

    // For example, if you are offering one translation file for french
    if (stripos($browser_lang, 'fr')) {
        return 'fr';
    }

    ...

    return 'en';
}