Chris@0: 'nb', Chris@0: 'pt' => 'pt-pt', Chris@0: 'zh' => 'zh-hans', Chris@0: 'zh-tw' => 'zh-hant', Chris@0: 'zh-hk' => 'zh-hant', Chris@0: 'zh-mo' => 'zh-hant', Chris@0: 'zh-cht' => 'zh-hant', Chris@0: 'zh-cn' => 'zh-hans', Chris@0: 'zh-sg' => 'zh-hans', Chris@0: 'zh-chs' => 'zh-hans', Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Test matching language from user agent. Chris@0: * Chris@0: * @dataProvider providerTestGetBestMatchingLangcode Chris@0: * @covers ::getBestMatchingLangcode Chris@0: */ Chris@0: public function testGetBestMatchingLangcode($accept_language, $expected) { Chris@0: $result = UserAgent::getBestMatchingLangcode($accept_language, $this->getLanguages(), $this->getMappings()); Chris@0: $this->assertSame($expected, $result); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testGetBestMatchingLangcode(). Chris@0: * Chris@0: * @return array Chris@0: * - An accept-language string. Chris@0: * - Expected best matching language code. Chris@0: */ Chris@0: public function providerTestGetBestMatchingLangcode() { Chris@0: // Random generator. Chris@0: $random = new Random(); Chris@0: Chris@0: return [ Chris@0: // Equal qvalue for each language, choose the site preferred one. Chris@0: ['en,en-US,fr-CA,fr,es-MX', 'en'], Chris@0: ['en-US,en,fr-CA,fr,es-MX', 'en'], Chris@0: ['fr,en', 'en'], Chris@0: ['en,fr', 'en'], Chris@0: ['en-US,fr', 'en-US'], Chris@0: ['fr,en-US', 'en-US'], Chris@0: ['fr,fr-CA', 'fr-CA'], Chris@0: ['fr-CA,fr', 'fr-CA'], Chris@0: ['fr', 'fr-CA'], Chris@0: ['fr;q=1', 'fr-CA'], Chris@0: ['fr,es-MX', 'fr-CA'], Chris@0: ['fr,es', 'fr-CA'], Chris@0: ['es,fr', 'fr-CA'], Chris@0: ['es-MX,de', 'es-MX'], Chris@0: ['de,es-MX', 'es-MX'], Chris@0: Chris@0: // Different cases and whitespace. Chris@0: ['en', 'en'], Chris@0: ['En', 'en'], Chris@0: ['EN', 'en'], Chris@0: [' en', 'en'], Chris@0: ['en ', 'en'], Chris@0: ['en, fr', 'en'], Chris@0: Chris@0: // A less specific language from the browser matches a more specific one Chris@0: // from the website, and the other way around for compatibility with Chris@0: // some versions of Internet Explorer. Chris@0: ['es', 'es-MX'], Chris@0: ['es-MX', 'es-MX'], Chris@0: ['pt', 'pt'], Chris@0: ['pt-PT', 'pt'], Chris@0: ['pt-PT;q=0.5,pt-BR;q=1,en;q=0.7', 'en'], Chris@0: ['pt-PT;q=1,pt-BR;q=0.5,en;q=0.7', 'en'], Chris@0: ['pt-PT;q=0.4,pt-BR;q=0.1,en;q=0.7', 'en'], Chris@0: ['pt-PT;q=0.1,pt-BR;q=0.4,en;q=0.7', 'en'], Chris@0: Chris@0: // Language code with several dashes are valid. The less specific language Chris@0: // from the browser matches the more specific one from the website. Chris@0: ['eh-oh-laa-laa', 'eh-oh-laa-laa'], Chris@0: ['eh-oh-laa', 'eh-oh-laa-laa'], Chris@0: ['eh-oh', 'eh-oh-laa-laa'], Chris@0: ['eh', 'eh-oh-laa-laa'], Chris@0: Chris@0: // Different qvalues. Chris@0: ['fr,en;q=0.5', 'fr-CA'], Chris@0: ['fr,en;q=0.5,fr-CA;q=0.25', 'fr'], Chris@0: Chris@0: // Silly wildcards are also valid. Chris@0: ['*,fr-CA;q=0.5', 'en'], Chris@0: ['*,en;q=0.25', 'fr-CA'], Chris@0: ['en,en-US;q=0.5,fr;q=0.25', 'en'], Chris@0: ['en-US,en;q=0.5,fr;q=0.25', 'en-US'], Chris@0: Chris@0: // Unresolvable cases. Chris@0: ['', FALSE], Chris@0: ['de,pl', FALSE], Chris@0: ['iecRswK4eh', FALSE], Chris@0: [$random->name(10, TRUE), FALSE], Chris@0: Chris@0: // Chinese langcodes. Chris@0: ['zh-cn, en-us;q=0.90, en;q=0.80, zh;q=0.70', 'zh-hans'], Chris@0: ['zh-tw, en-us;q=0.90, en;q=0.80, zh;q=0.70', 'zh-hant'], Chris@0: ['zh-hant, en-us;q=0.90, en;q=0.80, zh;q=0.70', 'zh-hant'], Chris@0: ['zh-hans, en-us;q=0.90, en;q=0.80, zh;q=0.70', 'zh-hans'], Chris@0: // @todo: This is copied from RFC4647 but our regex skips the numbers so Chris@0: // they where removed. Our code should be updated so private1-private2 is Chris@0: // valid. http://tools.ietf.org/html/rfc4647#section-3.4 Chris@0: ['zh-hant-CN-x-private-private, en-us;q=0.90, en;q=0.80, zh;q=0.70', 'zh-hant'], Chris@0: ['zh-cn', 'zh-hans'], Chris@0: ['zh-sg', 'zh-hans'], Chris@0: ['zh-tw', 'zh-hant'], Chris@0: ['zh-hk', 'zh-hant'], Chris@0: ['zh-mo', 'zh-hant'], Chris@0: ['zh-hans', 'zh-hans'], Chris@0: ['zh-hant', 'zh-hant'], Chris@0: ['zh-chs', 'zh-hans'], Chris@0: ['zh-cht', 'zh-hant'], Chris@0: ]; Chris@0: } Chris@0: Chris@0: }