/** * ContentController * lets us extend init() through this method on SiteTree. * we will override page init to change domains if the page locale is * different than the detected locale of the domain. * * 3 Things to be aware of (while developing.. these are all accounted for here): * ¥ Intended Locale of the Domain (.fr, .de, .com?) * ¥ Page's Locale in the Database * ¥ i18n locale that is in the header. * */ public function contentcontrollerInit() { if ($this->owner->hasExtension('Translatable')) { //find the correct locale $curLoc = TranslatableDomains::getLocaleFromHost(); // compare page locale vs domain's locale // low occurance of these not matching, but important if (Translatable::get_current_locale() != $curLoc) { // check to see if the page has a translation for the url, if so, translate. // helpful for homepages where / == /home but we want the german translation.. if ($this->owner->hasTranslation($curLoc)) { //if page exists and translation exists, redirect & show translation $correctPage = $this->owner->getTranslation($curLoc); Director::redirect($correctPage->Link()); } else { //otherwise, find requested page by url, determine locale, and put us in the right domain. $newUrl = TranslatableDomains::convertLocaleToTLD($withEndSlash = false) . $this->owner->Link(); Director::redirect($newUrl); } } else { i18n::set_locale($this->owner->Locale); } } }
/** * Test conversion of a url's locale to a TLD * (make sure a german page shows with a .de extension) */ function testConvertURLLocaleToTLD() { $orig_locale = Translatable::get_current_locale(); Translatable::set_current_locale('en_US'); $url = "http://www.mysite.co.uk:8888/home/"; $expectedResult = "mysite.com"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('de_DE'); $url = "http://mysite.com/home-de/"; $expectedResult = "another.de"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('en_GB'); $url = "http://sub.sub.mysite.com/home-gb/"; $expectedResult = "mysite.co.uk"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('fr_FR'); $url = "http://sub.localhost-jp/home-fr/"; $expectedResult = "localhost-fr"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale('ja_JP'); $url = "http://localhost-jp:8888/home-jp/"; $expectedResult = "localhost-jp"; $newURL = TranslatableDomains::setDomainByPageLocale($url); $newURLTLD = TranslatableDomains::getTLD($newURL); $this->assertTrue($newURLTLD == $expectedResult, "Failed converting {$url} to {$expectedResult}"); Translatable::set_current_locale($orig_locale); }