用户可以从网站上手动更改语言。但是为了获得更好的用户体验,我想根据用户的浏览器语言自动更改它。我有一个全局Controller,可以使用init()然后重定向。
请给我一些正确操作的提示。
答案 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';
}