88
99namespace skeeks \yii2 \multiLanguage ;
1010
11- use Yii ;
1211use yii \base \InvalidConfigException ;
1312use yii \web \Application ;
1413use yii \web \Request ;
@@ -23,91 +22,69 @@ class MultiLangRequest extends Request
2322 * @var
2423 */
2524 private $ _lang_url ;
25+ /**
26+ * @var
27+ */
28+ private $ _lang_from_url ;
2629
2730 /**
2831 * @return bool|string
2932 * @throws InvalidConfigException
3033 */
31- public function getLangUrl ()
34+ public function getUrl ()
3235 {
33- if (!\Yii:: $ app instanceof Application)
34- {
36+ //Работает только для web проекта
37+ if (!\Yii:: $ app instanceof Application) {
3538 return '' ;
3639 }
3740
3841 if ($ this ->_lang_url === null ) {
39- $ this ->_lang_url = $ this ->getUrl ();
40-
41- $ url_list = explode ('/ ' , $ this ->_lang_url );
42+ //Содержит строку с префиксом языка
43+ $ this ->_lang_url = parent ::getUrl ();
4244
43- $ lang_url = isset ($ url_list [1 ]) ? $ url_list [1 ] : null ;
45+ //Из строки выделяем язык
46+ $ url_list = explode ('/ ' , $ this ->_lang_url );
47+ $ lang_from_url = isset ($ url_list [1 ]) ? $ url_list [1 ] : null ;
4448
45- if ( $ lang_url == \Yii:: $ app -> multiLanguage -> default_lang )
46- {
49+ //Если этого языка нет среди доступных в настройках компонента, значит это не язык, просто возвращаем строку по сути определенную в parent::getUrl();
50+ if (! in_array ( $ lang_from_url , \Yii:: $ app -> multiLanguage -> langs )) {
4751 return $ this ->_lang_url ;
4852 }
4953
50- if (!in_array ($ lang_url , \Yii::$ app ->multiLanguage ->langs ))
51- {
54+ //Если этот язык является языком по умолчанию
55+ if ($ lang_from_url == \Yii::$ app ->multiLanguage ->default_lang ) {
56+ //TODO: преобразовать
5257 return $ this ->_lang_url ;
5358 }
5459
55- \Yii::$ app ->language = $ lang_url ;
56- \Yii::$ app ->setHomeUrl (\Yii::$ app ->homeUrl . $ lang_url );
60+ $ this ->_lang_from_url = $ lang_from_url ;
61+ //В настройки проекта записываем язык из строки запроса
62+ \Yii::$ app ->language = $ lang_from_url ;
63+ //Определение home page url, возможно тут надо переделать возможно надо переписать метод Request::getBaseUrl();
64+ \Yii::$ app ->homeUrl = \Yii::$ app ->homeUrl . $ lang_from_url ;
5765
58- if ( $ lang_url !== null && $ lang_url === $ lang_url &&
59- strpos ( $ this -> _lang_url , $ lang_url ) === 1 )
60- {
61- $ this ->_lang_url = substr ($ this ->_lang_url , strlen ($ lang_url )+ 1 );
62- }
66+
67+ //Если в запросе есть указание языка, то его нужно вырезать
68+ if ( $ lang_from_url !== null && strpos ( $ this -> _lang_url , $ lang_from_url ) === 1 ) {
69+ $ this ->_lang_url = substr ($ this ->_lang_url , strlen ($ lang_from_url ) + 1 );
70+ }
6371 }
6472
6573 return $ this ->_lang_url ;
6674 }
6775
68- protected function resolvePathInfo ()
69- {
70- $ pathInfo = $ this ->getLangUrl ();
7176
72- if (($ pos = strpos ($ pathInfo , '? ' )) !== false ) {
73- $ pathInfo = substr ($ pathInfo , 0 , $ pos );
74- }
75-
76- $ pathInfo = urldecode ($ pathInfo );
77-
78- // try to encode in UTF8 if not so
79- // http://w3.org/International/questions/qa-forms-utf-8.html
80- if (!preg_match ('%^(?:
81- [\x09\x0A\x0D\x20-\x7E] # ASCII
82- | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
83- | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
84- | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
85- | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
86- | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
87- | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
88- | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
89- )*$%xs ' , $ pathInfo )
90- ) {
91- $ pathInfo = utf8_encode ($ pathInfo );
92- }
93-
94- $ scriptUrl = $ this ->getScriptUrl ();
95- $ baseUrl = $ this ->getBaseUrl ();
96- if (strpos ($ pathInfo , $ scriptUrl ) === 0 ) {
97- $ pathInfo = substr ($ pathInfo , strlen ($ scriptUrl ));
98- } elseif ($ baseUrl === '' || strpos ($ pathInfo , $ baseUrl ) === 0 ) {
99- $ pathInfo = substr ($ pathInfo , strlen ($ baseUrl ));
100- } elseif (isset ($ _SERVER ['PHP_SELF ' ]) && strpos ($ _SERVER ['PHP_SELF ' ], $ scriptUrl ) === 0 ) {
101- $ pathInfo = substr ($ _SERVER ['PHP_SELF ' ], strlen ($ scriptUrl ));
102- } else {
103- throw new InvalidConfigException ('Unable to determine the path info of the current request. ' );
104- }
77+ /**
78+ * @return null|string
79+ */
80+ public function getHostInfo ()
81+ {
82+ $ hostInfo = parent ::getHostInfo ();
10583
106- if (isset ( $ pathInfo [ 0 ]) && $ pathInfo [ 0 ] === ' / ' ) {
107- $ pathInfo = substr ( $ pathInfo , 1 ) ;
84+ if ($ this -> _lang_from_url ) {
85+ $ hostInfo = $ hostInfo . " / " . $ this -> _lang_from_url ;
10886 }
10987
110- //print_r($pathInfo);die;
111- return (string ) $ pathInfo ;
88+ return $ hostInfo ;
11289 }
11390}
0 commit comments