From 7e1938fbd79e3841ab26b4f4ada21ef2de955c4b Mon Sep 17 00:00:00 2001 From: Andrey Janzen Date: Wed, 7 Aug 2013 10:33:15 +0700 Subject: [PATCH] Backport Request::getPreferredLanguage() from yii2 --- framework/web/CHttpRequest.php | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/framework/web/CHttpRequest.php b/framework/web/CHttpRequest.php index f83efad8c..c468f7e1a 100644 --- a/framework/web/CHttpRequest.php +++ b/framework/web/CHttpRequest.php @@ -975,14 +975,31 @@ class CHttpRequest extends CApplicationComponent } /** - * Returns the user preferred language. - * The returned language ID will be canonicalized using {@link CLocale::getCanonicalID}. - * @return string the user preferred language or false if the user does not have any. + * Returns the user-preferred language that should be used by this application. + * The language resolution is based on the user preferred languages and the languages + * supported by the application. The method will try to find the best match. + * @param array $languages a list of the languages supported by the application. + * If empty, this method will return the first language returned by [[getPreferredLanguages()]]. + * @return string the language that the application should use. false is returned if both [[getPreferredLanguages()]] + * and `$languages` are empty. */ - public function getPreferredLanguage() + public function getPreferredLanguage($languages=array()) { $preferredLanguages=$this->getPreferredLanguages(); - return !empty($preferredLanguages) ? CLocale::getCanonicalID($preferredLanguages[0]) : false; + if(empty($languages)) { + return !empty($preferredLanguages) ? CLocale::getCanonicalID($preferredLanguages[0]) : false; + } + foreach ($preferredLanguages as $preferredLanguage) { + $preferredLanguage=CLocale::getCanonicalID($preferredLanguage); + foreach ($languages as $language) { + $language=CLocale::getCanonicalID($language); + // en_us==en_us, en==en_us, en_us==en + if($language===$acceptedLanguage || strpos($acceptedLanguage,$language.'_')===0 || strpos($language,$acceptedLanguage.'_')===0) { + return $language; + } + } + } + return reset($languages); } /**