diff --git a/UrlManager.php b/UrlManager.php index e88acdf..b1c8acf 100644 --- a/UrlManager.php +++ b/UrlManager.php @@ -201,11 +201,10 @@ public function createUrl($params) $languageRequired = false; } - // Do not use prefix for default language to prevent unnecessary redirect - if ($languageRequired - && $language === $this->getDefaultLanguage() - && !$this->enableDefaultLanguageUrlCode - && !$this->enableLanguagePersistence + // Do not use prefix for default language to prevent unnecessary redirect if there's no persistence and no detection + if ( + $languageRequired && $language===$this->getDefaultLanguage() && + !$this->enableDefaultLanguageUrlCode && !$this->enableLanguagePersistence && !$this->enableLanguageDetection ) { $languageRequired = false; } diff --git a/tests/RedirectTest.php b/tests/RedirectTest.php index d40b785..b115430 100644 --- a/tests/RedirectTest.php +++ b/tests/RedirectTest.php @@ -166,6 +166,16 @@ public function testRedirectsIfNoLanguageInUrlAndAcceptedLanguageWithCountryMatc ]); } + public function testNoRedirectIfNoLanguageInUrlAndAcceptedLanguageMatchesDefaultLanguage() + { + $this->mockUrlManager([ + 'languages' => ['en-US', 'en', 'de'], + ]); + $this->mockRequest('/site/page',[ + 'acceptableLanguages' => ['en'], + ]); + } + public function testRedirectsIfNoLanguageInUrlAndLanguageInSession() { $this->expectRedirect('/de/site/page'); diff --git a/tests/UrlCreationTest.php b/tests/UrlCreationTest.php index 14f87d5..7e1f7c5 100644 --- a/tests/UrlCreationTest.php +++ b/tests/UrlCreationTest.php @@ -221,4 +221,67 @@ public function testCreateUrlUppercaseLanguageIfEnabled() $this->assertEquals($this->prepareUrl('/en-US/foo/baz/bar?x=y'), Url::to(['/slug/action', 'language' => 'en-US', 'x' => 'y', 'term' => 'baz'])); } + public function testCreateResetUrlWithLanguageIfPersistenceAndDetectionEnabled() + { + $this->mockUrlManager([ + 'languages' => ['en-US', 'en', 'de'], + 'rules' => [ + '/foo//bar' => 'slug/action', + ], + ]); + $this->mockRequest('/de/site/page'); + $this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en'])); + } + + public function testCreateResetUrlWithLanguageIfPersistenceDisabled() + { + $this->mockUrlManager([ + 'languages' => ['en-US', 'en', 'de'], + 'enableLanguagePersistence' => false, + 'rules' => [ + '/foo//bar' => 'slug/action', + ], + ]); + $this->mockRequest('/de/site/page'); + $this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en'])); + } + + public function testCreateResetUrlWithLanguageIfDetectionDisabled() + { + $this->mockUrlManager([ + 'languages' => ['en-US', 'en', 'de'], + 'enableLanguageDetection' => false, + 'rules' => [ + '/foo//bar' => 'slug/action', + ], + ]); + $this->mockRequest('/de/site/page'); + $this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en'])); + } + + public function testCreateUrlWithoutDefaultLanguageIfPersistenceAndDetectionDisabled() + { + $this->mockUrlManager([ + 'languages' => ['en-US', 'en', 'de'], + 'enableLanguagePersistence' => false, + 'enableLanguageDetection' => false, + 'rules' => [ + '/foo//bar' => 'slug/action', + ], + ]); + $this->mockRequest('/de/site/page'); + $this->assertEquals($this->prepareUrl('/demo/action'), Url::to(['/demo/action', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en'])); + $this->assertEquals($this->prepareUrl('/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en'])); + } }