Skip to content

Commit f681040

Browse files
authored
Merge pull request #143 from cebe/patch-1
Fix Url Matching for similar patterns
2 parents 6f0c49e + 329bb26 commit f681040

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

.travis.yml

+5
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,8 @@ install:
88
- travis_retry composer clear-cache
99
- export PATH="$HOME/.composer/vendor/bin:$PATH"
1010
- travis_retry composer install --prefer-dist --no-interaction --no-progress
11+
- travis_retry composer require --dev phpunit/phpunit:^6.0 --prefer-dist --no-interaction --no-progress
12+
13+
script:
14+
- php -doutput_buffering=On vendor/bin/phpunit
15+

README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ language code are no longer accessible:
145145
### Language Configuration
146146

147147
All languages **including the default language** must be configured in the `languages`
148-
parameter of the `localeUrls` component. You should list more specific language
149-
codes before the similar looking generic ones (i.e. 'en-US' before 'en'):
148+
parameter of the `localeUrls` component:
150149

151150
'languages' => ['en-US', 'en-UK', 'en', 'fr', 'de-AT', 'de'],
152151

UrlManager.php

+9
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,15 @@ protected function processLocaleUrl($normalized)
352352
$parts[] = $value;
353353
}
354354
}
355+
// order by length to make longer patterns match before short patterns, e.g. put "en-GB" before "en"
356+
usort($parts, function($a, $b) {
357+
$la = mb_strlen($a);
358+
$lb = mb_strlen($b);
359+
if ($la === $lb) {
360+
return 0;
361+
}
362+
return $la < $lb ? 1 : -1;
363+
});
355364
$pattern = implode('|', $parts);
356365
if (preg_match("#^($pattern)\b(/?)#i", $pathInfo, $m)) {
357366
$this->_request->setPathInfo(mb_substr($pathInfo, mb_strlen($m[1].$m[2])));

tests/UrlManagerTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ public function testSetsLanguageFromUrl()
3333
$this->assertEquals('site/page', $request->pathInfo);
3434
}
3535

36+
public function testSetsLanguageFromUrlOrder()
37+
{
38+
$this->mockUrlManager([
39+
'languages' => ['en', 'en-US', 'de'],
40+
]);
41+
$this->mockRequest('/en-us/site/page');
42+
$this->assertEquals('en-US', Yii::$app->language);
43+
$this->assertEquals('en-US', Yii::$app->session->get('_language'));
44+
$cookie = Yii::$app->response->cookies->get('_language');
45+
$this->assertNotNull($cookie);
46+
$this->assertEquals('en-US', $cookie->value);
47+
$request = Yii::$app->request;
48+
$this->assertEquals('site/page', $request->pathInfo);
49+
}
50+
3651
public function testSetsLanguageFromUrlIfUppercaseEnabled()
3752
{
3853
$this->mockUrlManager([

0 commit comments

Comments
 (0)