2010-12-14 16:26:35 +00:00
|
|
|
|
<?php
|
|
|
|
|
|
|
2011-05-01 19:32:49 +00:00
|
|
|
|
class LanguageConverterTest extends MediaWikiLangTestCase {
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/** @var LanguageToTest */
|
2010-12-14 16:26:35 +00:00
|
|
|
|
protected $lang = null;
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/** @var TestConverter */
|
2010-12-14 16:26:35 +00:00
|
|
|
|
protected $lc = null;
|
|
|
|
|
|
|
2012-10-08 10:56:20 +00:00
|
|
|
|
protected function setUp() {
|
2011-05-01 19:32:49 +00:00
|
|
|
|
parent::setUp();
|
2010-12-14 16:26:35 +00:00
|
|
|
|
|
2018-07-25 14:57:23 +00:00
|
|
|
|
$this->setContentLang( 'tg' );
|
|
|
|
|
|
|
2016-02-17 09:09:32 +00:00
|
|
|
|
$this->setMwGlobals( [
|
2012-10-08 10:56:20 +00:00
|
|
|
|
'wgDefaultLanguageVariant' => false,
|
2016-02-17 09:09:32 +00:00
|
|
|
|
'wgRequest' => new FauxRequest( [] ),
|
2012-10-08 10:56:20 +00:00
|
|
|
|
'wgUser' => new User,
|
2016-02-17 09:09:32 +00:00
|
|
|
|
] );
|
2012-10-08 10:56:20 +00:00
|
|
|
|
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$this->lang = new LanguageToTest();
|
2012-10-08 10:56:20 +00:00
|
|
|
|
$this->lc = new TestConverter(
|
|
|
|
|
|
$this->lang, 'tg',
|
2018-07-23 16:44:55 +00:00
|
|
|
|
[ 'tg', 'tg-latn' ]
|
2012-10-08 10:56:20 +00:00
|
|
|
|
);
|
2010-12-14 16:26:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2012-10-08 10:56:20 +00:00
|
|
|
|
protected function tearDown() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
unset( $this->lc );
|
|
|
|
|
|
unset( $this->lang );
|
2012-10-08 10:56:20 +00:00
|
|
|
|
|
2011-06-15 21:22:08 +00:00
|
|
|
|
parent::tearDown();
|
2010-12-14 16:26:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantDefaults() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getHeaderVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantHeaders() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgRequest;
|
|
|
|
|
|
$wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getHeaderVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantHeaderWeight() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgRequest;
|
|
|
|
|
|
$wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getHeaderVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantHeaderWeight2() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgRequest;
|
|
|
|
|
|
$wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getHeaderVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantHeaderMulti() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgRequest;
|
|
|
|
|
|
$wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantUserOption() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgUser;
|
|
|
|
|
|
|
|
|
|
|
|
$wgUser = new User;
|
2011-06-15 21:32:08 +00:00
|
|
|
|
$wgUser->load(); // from 'defaults'
|
|
|
|
|
|
$wgUser->mId = 1;
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$wgUser->mDataLoaded = true;
|
|
|
|
|
|
$wgUser->mOptionsLoaded = true;
|
|
|
|
|
|
$wgUser->setOption( 'variant', 'tg-latn' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getUserVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantUserOptionForForeignLanguage() {
|
2013-06-12 12:13:04 +00:00
|
|
|
|
global $wgContLang, $wgUser;
|
|
|
|
|
|
|
|
|
|
|
|
$wgContLang = Language::factory( 'en' );
|
|
|
|
|
|
$wgUser = new User;
|
|
|
|
|
|
$wgUser->load(); // from 'defaults'
|
|
|
|
|
|
$wgUser->mId = 1;
|
|
|
|
|
|
$wgUser->mDataLoaded = true;
|
|
|
|
|
|
$wgUser->mOptionsLoaded = true;
|
|
|
|
|
|
$wgUser->setOption( 'variant-tg', 'tg-latn' );
|
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getUserVariant
|
|
|
|
|
|
* @covers LanguageConverter::getURLVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantHeaderUserVsUrl() {
|
2012-10-08 10:56:20 +00:00
|
|
|
|
global $wgContLang, $wgRequest, $wgUser;
|
2010-12-14 16:26:35 +00:00
|
|
|
|
|
|
|
|
|
|
$wgContLang = Language::factory( 'tg-latn' );
|
|
|
|
|
|
$wgRequest->setVal( 'variant', 'tg' );
|
|
|
|
|
|
$wgUser = User::newFromId( "admin" );
|
|
|
|
|
|
$wgUser->setId( 1 );
|
2011-06-15 21:22:08 +00:00
|
|
|
|
$wgUser->mFrom = 'defaults';
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$wgUser->mOptionsLoaded = true;
|
2013-02-14 11:22:13 +00:00
|
|
|
|
// The user's data is ignored because the variant is set in the URL.
|
2013-03-25 23:27:14 +00:00
|
|
|
|
$wgUser->setOption( 'variant', 'tg-latn' );
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantDefaultLanguageVariant() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgDefaultLanguageVariant;
|
|
|
|
|
|
|
|
|
|
|
|
$wgDefaultLanguageVariant = 'tg-latn';
|
|
|
|
|
|
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-24 10:54:02 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @covers LanguageConverter::getPreferredVariant
|
|
|
|
|
|
* @covers LanguageConverter::getURLVariant
|
|
|
|
|
|
*/
|
2013-10-23 22:51:31 +00:00
|
|
|
|
public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
|
2010-12-14 16:26:35 +00:00
|
|
|
|
global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
|
|
|
|
|
|
|
|
|
|
|
|
$wgContLang = Language::factory( 'tg-latn' );
|
|
|
|
|
|
$wgDefaultLanguageVariant = 'tg';
|
|
|
|
|
|
$wgRequest->setVal( 'variant', null );
|
|
|
|
|
|
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
|
|
|
|
|
|
}
|
2016-01-24 10:29:10 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Test exhausting pcre.backtrack_limit
|
2017-12-28 08:24:40 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @covers LanguageConverter::autoConvert
|
2016-01-24 10:29:10 +00:00
|
|
|
|
*/
|
|
|
|
|
|
public function testAutoConvertT124404() {
|
|
|
|
|
|
$testString = '';
|
|
|
|
|
|
for ( $i = 0; $i < 1000; $i++ ) {
|
|
|
|
|
|
$testString .= 'xxx xxx xxx';
|
|
|
|
|
|
}
|
|
|
|
|
|
$testString .= "\n<big id='в'></big>";
|
2017-11-15 03:37:27 +00:00
|
|
|
|
$old = ini_set( 'pcre.backtrack_limit', 200 );
|
2016-01-24 10:29:10 +00:00
|
|
|
|
$result = $this->lc->autoConvert( $testString, 'tg-latn' );
|
|
|
|
|
|
ini_set( 'pcre.backtrack_limit', $old );
|
|
|
|
|
|
// The в in the id attribute should not get converted to a v
|
|
|
|
|
|
$this->assertFalse(
|
|
|
|
|
|
strpos( $result, 'v' ),
|
|
|
|
|
|
"в converted to v despite being in attribue"
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2010-12-14 16:26:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Test converter (from Tajiki to latin orthography)
|
|
|
|
|
|
*/
|
|
|
|
|
|
class TestConverter extends LanguageConverter {
|
2016-02-17 09:09:32 +00:00
|
|
|
|
private $table = [
|
2010-12-14 16:26:35 +00:00
|
|
|
|
'б' => 'b',
|
|
|
|
|
|
'в' => 'v',
|
|
|
|
|
|
'г' => 'g',
|
2016-02-17 09:09:32 +00:00
|
|
|
|
];
|
2010-12-14 16:26:35 +00:00
|
|
|
|
|
|
|
|
|
|
function loadDefaultTables() {
|
2016-02-17 09:09:32 +00:00
|
|
|
|
$this->mTables = [
|
2010-12-14 16:26:35 +00:00
|
|
|
|
'tg-latn' => new ReplacementArray( $this->table ),
|
2013-02-14 11:22:13 +00:00
|
|
|
|
'tg' => new ReplacementArray()
|
2016-02-17 09:09:32 +00:00
|
|
|
|
];
|
2010-12-14 16:26:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class LanguageToTest extends Language {
|
|
|
|
|
|
function __construct() {
|
|
|
|
|
|
parent::__construct();
|
2016-02-17 09:09:32 +00:00
|
|
|
|
$variants = [ 'tg', 'tg-latn' ];
|
2010-12-14 16:26:35 +00:00
|
|
|
|
$this->mConverter = new TestConverter( $this, 'tg', $variants );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|