Skip to content

Commit cfdb9b6

Browse files
committed
Issue #59 Add more tests and rename to keepUppercaseLanguageCode
1 parent 257ceb5 commit cfdb9b6

File tree

5 files changed

+43
-9
lines changed

5 files changed

+43
-9
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,9 @@ codes before the similar looking generic ones (i.e. 'en-US' before 'en'):
154154
> **Note:** If you use country codes, they should always be configured in upper case letters
155155
> as shown above. The URLs will still always use lowercase codes. If a URL with an uppercase
156156
> code like `en-US` is used, the user will be redirected to the lowercase `en-us` variant.
157-
> The application language will always use the correct `en-US` code.
157+
> The application language will always use the correct `en-US` code. If you don't want to
158+
> redirect URLs with uppercase country code, you can set the `keepUppercaseLanguageCode`
159+
> option to `true`.
158160
159161
If you want your URL to optionally contain *any* country variant you can also use a wildcard pattern:
160162

UrlManager.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class UrlManager extends BaseUrlManager
5959
* @var bool whether to keep upper case language codes in URL. Default is `false` wich will e.g.
6060
* redirect `de-AT` to `de-at`.
6161
*/
62-
public $keepUpperCaseLanguageCode = false;
62+
public $keepUppercaseLanguageCode = false;
6363

6464
/**
6565
* @var string the name of the session key that is used to store the language. Default is '_language'.
@@ -215,7 +215,7 @@ public function createUrl($params)
215215
if (is_string($key)) {
216216
$language = $key;
217217
}
218-
if (!$this->keepUpperCaseLanguageCode) {
218+
if (!$this->keepUppercaseLanguageCode) {
219219
$language = strtolower($language);
220220
}
221221
// Remove any trailing slashes unless one is configured as suffix
@@ -266,7 +266,7 @@ protected function processLocaleUrl($request)
266266
// lowercase language, uppercase country
267267
list($language,$country) = $this->matchCode($code);
268268
if ($country!==null) {
269-
if ($code==="$language-$country" && !$this->keepUpperCaseLanguageCode) {
269+
if ($code==="$language-$country" && !$this->keepUppercaseLanguageCode) {
270270
$this->redirectToLanguage(strtolower($code));
271271
} else {
272272
$language = "$language-$country";

tests/RedirectTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function testRedirectsIfDefaultLanguageInUrl()
5151
$this->mockRequest('/en');
5252
}
5353

54-
public function testRedirectsIfLanguageWithUpperCaseCountryInUrl()
54+
public function testRedirectsIfLanguageWithUppercaseCountryInUrl()
5555
{
5656
$this->expectRedirect('/es-bo/site/page');
5757
$this->mockUrlManager([
@@ -60,16 +60,16 @@ public function testRedirectsIfLanguageWithUpperCaseCountryInUrl()
6060
$this->mockRequest('/es-BO/site/page');
6161
}
6262

63-
public function testNoRedirectIfLanguageWithUpperCaseCountryInUrlAndUppercaseEnabled()
63+
public function testNoRedirectIfLanguageWithUppercaseCountryInUrlAndUppercaseEnabled()
6464
{
6565
$this->mockUrlManager([
6666
'languages' => ['en-US', 'deutsch' => 'de', 'es-BO'],
67-
'keepUpperCaseLanguageCode' => true,
67+
'keepUppercaseLanguageCode' => true,
6868
]);
6969
$this->mockRequest('/es-BO/site/page');
7070
}
7171

72-
public function testRedirectsIfLanguageWithUpperCaseWildcardCountryInUrl()
72+
public function testRedirectsIfLanguageWithUppercaseWildcardCountryInUrl()
7373
{
7474
$this->expectRedirect('/es-bo/site/page');
7575
$this->mockUrlManager([

tests/UrlCreationTest.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,22 @@ public function testCreateUrlWithLanguageFromUrl()
6161
$this->assertEquals($this->prepareUrl('/de/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz']));
6262
}
6363

64+
public function testCreateUrlWithLanguageFromUrlIfUppercaseEnabled()
65+
{
66+
$this->mockUrlManager([
67+
'languages' => ['en-US', 'en', 'de'],
68+
'keepUppercaseLanguageCode' => true,
69+
'rules' => [
70+
'/foo/<term:.+>/bar' => 'slug/action',
71+
],
72+
]);
73+
$this->mockRequest('/en-US/site/page');
74+
$this->assertEquals($this->prepareUrl('/en-US/demo/action'), Url::to(['/demo/action']));
75+
$this->assertEquals($this->prepareUrl('/en-US/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y']));
76+
$this->assertEquals($this->prepareUrl('/en-US/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz']));
77+
$this->assertEquals($this->prepareUrl('/en-US/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz']));
78+
}
79+
6480
public function testCreateHomeUrlWithLanguageFromUrl()
6581
{
6682
$this->mockUrlManager([
@@ -192,7 +208,7 @@ public function testCreateUrlUppercaseLanguageIfEnabled()
192208
{
193209
$this->mockUrlManager([
194210
'languages' => ['en-US', 'en', 'de'],
195-
'keepUpperCaseLanguageCode' => true,
211+
'keepUppercaseLanguageCode' => true,
196212
'rules' => [
197213
'/foo/<term:.+>/bar' => 'slug/action',
198214
],

tests/UrlManagerTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,22 @@ public function testSetsLanguageFromUrl()
3333
$this->assertEquals('site/page', $request->pathInfo);
3434
}
3535

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

0 commit comments

Comments
 (0)