Implement LanguageConverter for sh.wiki

This patch will implement a one-way transliterator (Latin->Cyrillic), per community consensus.

Bug: T268033
Change-Id: I6f3e7efe3630e9960584dca3a5ee55cb92ea722c
Co-Authored-By: Deni <deni@deni.dk>
Co-Authored-By: Winston Sung <winston21.sung@gmail.com>
This commit is contained in:
Acamicamacaraca 2021-10-05 21:55:15 +00:00 committed by Deni
parent bb228fff7e
commit a573bea01b
15 changed files with 539 additions and 237 deletions

View file

@ -2337,6 +2337,7 @@ $wgAutoloadLocalClasses = [
'SendPasswordResetEmailUpdate' => __DIR__ . '/includes/deferred/SendPasswordResetEmailUpdate.php',
'SerializedValueContainer' => __DIR__ . '/includes/libs/objectcache/serialized/SerializedValueContainer.php',
'SevenZipStream' => __DIR__ . '/maintenance/includes/SevenZipStream.php',
'ShConverter' => __DIR__ . '/includes/language/converters/ShConverter.php',
'ShiConverter' => __DIR__ . '/includes/language/converters/ShiConverter.php',
'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
'ShowSiteStats' => __DIR__ . '/maintenance/showSiteStats.php',

View file

@ -52,6 +52,7 @@ abstract class LanguageConverter implements ILanguageConverter {
'iu',
'kk',
'ku',
'sh',
'shi',
'sr',
'tg',
@ -73,6 +74,7 @@ abstract class LanguageConverter implements ILanguageConverter {
'iu' => 'iu',
'kk' => 'kk',
'ku' => 'ku',
'sh' => 'sh-latn',
'shi' => 'shi',
'sr' => 'sr',
'tg' => 'tg',

View file

@ -30,6 +30,7 @@ use KkConverter;
use KuConverter;
use Language;
use MediaWiki\StubObject\StubUserLang;
use ShConverter;
use ShiConverter;
use SrConverter;
use TgConverter;
@ -73,6 +74,9 @@ class LanguageConverterFactory {
'shi' => [
'class' => ShiConverter::class,
],
'sh' => [
'class' => ShConverter::class,
],
'sr' => [
'class' => SrConverter::class,
],

View file

@ -0,0 +1,156 @@
<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
/**
* Converts Serbo-Croatian from Latin script to Cyrillic script
*
* @ingroup Languages
*/
class ShConverter extends LanguageConverter {
/**
* @var string[]
*/
private $mToCyrillic = [
'dž' => 'џ',
'lj' => 'љ',
'nj' => 'њ',
'Dž' => 'Џ',
'DŽ' => 'Џ',
'Lj' => 'Љ',
'LJ' => 'Љ',
'Nj' => 'Њ',
'NЈ' => 'Њ',
'a' => 'а',
'b' => 'б',
'c' => 'ц',
'č' => 'ч',
'ć' => 'ћ',
'd' => 'д',
'đ' => 'ђ',
'e' => 'е',
'f' => 'ф',
'g' => 'г',
'h' => 'х',
'i' => 'и',
'j' => 'ј',
'k' => 'к',
'l' => 'л',
'm' => 'м',
'n' => 'н',
'o' => 'о',
'p' => 'п',
'r' => 'р',
's' => 'с',
'š' => 'ш',
't' => 'т',
'u' => 'у',
'v' => 'в',
'z' => 'з',
'ž' => 'ж',
'A' => 'А',
'B' => 'Б',
'C' => 'Ц',
'Č' => 'Ч',
'Ć' => 'Ћ',
'D' => 'Д',
'Đ' => 'Ђ',
'E' => 'Е',
'F' => 'Ф',
'G' => 'Г',
'H' => 'Х',
'I' => 'И',
'J' => 'Ј',
'K' => 'К',
'L' => 'Л',
'M' => 'М',
'N' => 'Н',
'O' => 'О',
'P' => 'П',
'R' => 'Р',
'S' => 'С',
'Š' => 'Ш',
'T' => 'Т',
'U' => 'У',
'V' => 'В',
'Z' => 'З',
'Ž' => 'Ж',
];
/** @inheritDoc */
public function getMainCode(): string {
return 'sh';
}
/** @inheritDoc */
public function getLanguageVariants(): array {
return [ 'sh-latn', 'sh-cyrl' ];
}
/** @inheritDoc */
public function getVariantsFallbacks(): array {
return [
'sh-cyrl' => 'sh-latn',
];
}
protected function loadDefaultTables() {
$this->mTables = [
'sh-cyrl' => new ReplacementArray( $this->mToCyrillic ),
'sh-latn' => new ReplacementArray(),
];
}
/**
* It would omit roman numbers
*
* @inheritDoc
*/
public function translate( $text, $toVariant ) {
$breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
// Lookahead assertion ensures $roman doesn't match the empty string
$roman = '(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
$reg = '/^' . $roman . '$|^' . $roman . $breaks . '|' . $breaks
. $roman . '$|' . $breaks . $roman . $breaks . '/';
$matches = preg_split( $reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
$m = array_shift( $matches );
$this->loadTables();
if ( !isset( $this->mTables[$toVariant] ) ) {
throw new MWException( "Broken variant table: "
. implode( ',', array_keys( $this->mTables ) ) );
}
$ret = $this->mTables[$toVariant]->replace( $m[0] );
$mstart = (int)$m[1] + strlen( $m[0] );
foreach ( $matches as $m ) {
$ret .= substr( $text, $mstart, (int)$m[1] - $mstart );
$ret .= parent::translate( $m[0], $toVariant );
$mstart = (int)$m[1] + strlen( $m[0] );
}
return $ret;
}
}

View file

@ -419,7 +419,9 @@ class Names {
'ses' => 'Koyraboro Senni', # Koyraboro Senni
'sg' => 'Sängö', # Sango/Sangho
'sgs' => 'žemaitėška', # Samogitian
'sh' => 'srpskohrvatski / српскохрватски', # Serbocroatian
'sh' => 'srpskohrvatski / српскохрватски', # Serbo-Croatian (multiple scripts - defaults to Latin)
'sh-cyrl' => 'српскохрватски (ћирилица)', # Serbo-Croatian (Cyrillic script)
'sh-latn' => 'srpskohrvatski (latinica)', # Serbo-Croatian (Latin script) (default)
'shi' => 'Taclḥit', # Tachelhit, Shilha (multiple scripts - defaults to Latin)
'shi-latn' => 'Taclḥit', # Tachelhit (Latin script)
'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (Tifinagh script)

View file

@ -3459,6 +3459,9 @@
"variantname-ike-cans": "ike-Cans",
"variantname-ike-latn": "ike-Latn",
"variantname-iu": "iu",
"variantname-sh-cyrl": "sh-Cyrl",
"variantname-sh-latn": "sh-Latn",
"variantname-sh": "sh",
"variantname-shi-tfng": "shi-Tfng",
"variantname-shi-latn": "shi-Latn",
"variantname-shi": "shi",

View file

@ -3702,6 +3702,9 @@
"variantname-ike-cans": "{{optional}}",
"variantname-ike-latn": "{{optional}}",
"variantname-iu": "{{optional}}",
"variantname-sh-cyrl": "{{optional}}",
"variantname-sh-latn": "{{optional}}",
"variantname-sh": "{{optional}}",
"variantname-shi-tfng": "{{optional}}",
"variantname-shi-latn": "{{optional}}",
"variantname-shi": "{{optional}}",

View file

@ -6,220 +6,7 @@
* @file
* @ingroup Languages
*
* @author Kaganer
* @author Kolega2357
* @author Nemo bis
* @author OC Ripper
* @author לערי ריינהארט
* @author Aca
*/
$fallback = 'bs, sr-el, sr-latn, hr';
$namespaceNames = [
NS_SPECIAL => 'Posebno',
NS_TALK => 'Razgovor',
NS_USER => 'Korisnik',
NS_USER_TALK => 'Razgovor_sa_korisnikom',
NS_PROJECT_TALK => 'Razgovor_o_$1',
NS_FILE => 'Datoteka',
NS_FILE_TALK => 'Razgovor_o_datoteci',
NS_MEDIAWIKI_TALK => 'Mediawiki_razgovor',
NS_TEMPLATE => 'Šablon',
NS_TEMPLATE_TALK => 'Razgovor_o_šablonu',
NS_HELP => 'Pomoć',
NS_HELP_TALK => 'Razgovor_o_pomoći',
NS_CATEGORY => 'Kategorija',
NS_CATEGORY_TALK => 'Razgovor_o_kategoriji',
];
# Some dummy translations to prevent language fallback for now
# @TODO: Check whether localising them is appropriate.
$namespaceGenderAliases = [];
$defaultDateFormat = 'dmy';
$datePreferences = [
'default',
'dmy',
'ymd',
'ISO 8601',
];
$datePreferenceMigrationMap = [
'default',
'mdy',
'dmy',
'ymd'
];
/** @phpcs-require-sorted-array */
$specialPageAliases = [
'Activeusers' => [ 'Aktivni_korisnici' ],
'Allmessages' => [ 'Sve_poruke' ],
'Allpages' => [ 'Sve_stranice' ],
'Ancientpages' => [ 'Najstarije_stranice' ],
'Blankpage' => [ 'Prazna_stranica' ],
'Booksources' => [ 'Traži_ISBN' ],
'BrokenRedirects' => [ 'Kriva_preusmjerenja' ],
'Categories' => [ 'Kategorije' ],
'Confirmemail' => [ 'E-mail_potvrda' ],
'Contributions' => [ 'Doprinosi' ],
'CreateAccount' => [ 'Stvori_račun' ],
'Deadendpages' => [ 'Mrtve_stranice' ],
'DeletedContributions' => [ 'Obrisani_doprinosi' ],
'DoubleRedirects' => [ 'Dvostruka_preusmjerenja' ],
'Emailuser' => [ 'E-mail', 'Elektronska_pošta' ],
'Export' => [ 'Izvezi' ],
'Fewestrevisions' => [ 'Najmanje_uređivane_stranice' ],
'FileDuplicateSearch' => [ 'Traži_kopije_datoteka' ],
'Filepath' => [ 'Putanja_datoteke' ],
'Import' => [ 'Uvezi' ],
'LinkSearch' => [ 'Traži_poveznice', 'Traži_linkove' ],
'Listadmins' => [ 'Popis_administratora' ],
'Listbots' => [ 'Popis_botova' ],
'Listgrouprights' => [ 'Popis_korisničkih_prava' ],
'Listredirects' => [ 'Popis_preusmjerenja' ],
'Listusers' => [ 'Popis_korisnika', 'Korisnički_popis' ],
'Lockdb' => [ 'Zaključaj_bazu' ],
'Log' => [ 'Evidencije', 'Registri' ],
'Lonelypages' => [ 'Usamljene_stranice', 'Siročad' ],
'Longpages' => [ 'Duge_stranice' ],
'MergeHistory' => [ 'Spoji_historiju' ],
'MIMEsearch' => [ 'MIME_pretraga' ],
'Mostcategories' => [ 'Najviše_kategorija' ],
'Mostimages' => [ 'Najviše_povezane_datoteke', 'Najviše_povezane_slike' ],
'Mostlinked' => [ 'Najviše_povezane_stranice' ],
'Mostlinkedcategories' => [ 'Najviše_povezane_kategorije', 'Najviše_korištene_kategorije' ],
'Mostlinkedtemplates' => [ 'Najviše_povezani_šabloni', 'Najviše_korišteni_šabloni' ],
'Mostrevisions' => [ 'Najviše_uređivane_stranice' ],
'Movepage' => [ 'Premjesti_stranicu' ],
'Mycontributions' => [ 'Moji_doprinosi' ],
'Mypage' => [ 'Moja_stranica' ],
'Mytalk' => [ 'Moj_razgovor' ],
'Myuploads' => [ 'Moje_postavljene_datoteke' ],
'Newimages' => [ 'Nove_datoteke', 'Nove_slike' ],
'Newpages' => [ 'Nove_stranice' ],
'Preferences' => [ 'Postavke' ],
'Prefixindex' => [ 'Prefiks_indeks', 'Stranice_po_prefiksu' ],
'Protectedpages' => [ 'Zaštićene_stranice' ],
'Protectedtitles' => [ 'Zaštićeni_naslovi' ],
'Randompage' => [ 'Slučajna_stranica' ],
'Randomredirect' => [ 'Slučajno_preusmjerenje' ],
'Recentchanges' => [ 'Nedavne_izmjene' ],
'Recentchangeslinked' => [ 'Povezane_izmjene' ],
'Revisiondelete' => [ 'Brisanje_izmjene' ],
'Search' => [ 'Traži' ],
'Shortpages' => [ 'Kratke_stranice' ],
'Specialpages' => [ 'Posebne_stranice' ],
'Statistics' => [ 'Statistike' ],
'Unblock' => [ 'Odblokiraj' ],
'Uncategorizedcategories' => [ 'Nekategorizirane_kategorije' ],
'Uncategorizedimages' => [ 'Nekategorizirane_datoteke', 'Nekategorizirane_slike' ],
'Uncategorizedpages' => [ 'Nekategorizirane_stranice' ],
'Uncategorizedtemplates' => [ 'Nekategorizirani_šabloni' ],
'Undelete' => [ 'Vrati' ],
'Unlockdb' => [ 'Otključaj_bazu' ],
'Unusedcategories' => [ 'Nekorištene_kategorije' ],
'Unusedimages' => [ 'Nekorištene_datoteke', 'Nekorištene_slike' ],
'Unusedtemplates' => [ 'Nekorišteni_šabloni' ],
'Unwatchedpages' => [ 'Negledane_stranice' ],
'Upload' => [ 'Postavi_datoteku' ],
'Userrights' => [ 'Korisnička_prava' ],
'Version' => [ 'Verzija' ],
'Wantedcategories' => [ 'Tražene_kategorije' ],
'Wantedfiles' => [ 'Tražene_datoteke' ],
'Wantedpages' => [ 'Tražene_stranice' ],
'Wantedtemplates' => [ 'Traženi_šabloni' ],
'Watchlist' => [ 'Spisak_praćenja' ],
'Whatlinkshere' => [ 'Što_vodi_ovdje' ],
'Withoutinterwiki' => [ 'Bez_interwikija' ],
];
/** @phpcs-require-sorted-array */
$magicWords = [
'currentday' => [ '1', 'TRENUTNIDAN', 'TRENUTAČNIDAN', 'CURRENTDAY' ],
'currentday2' => [ '1', 'TRENUTNIDAN2', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ],
'currentdayname' => [ '1', 'TRENUTNIDANIME', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ],
'currentdow' => [ '1', 'TRENUTNIDANSEDMICE', 'TRENUTAČNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ],
'currenthour' => [ '1', 'TRENUTNISAT', 'TRENUTAČNISAT', 'CURRENTHOUR' ],
'currentmonth' => [ '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ],
'currentmonth1' => [ '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ],
'currentmonthabbrev' => [ '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAČNIMJESECSKR', 'CURRENTMONTHABBREV' ],
'currentmonthname' => [ '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ],
'currentmonthnamegen' => [ '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAČNIMJESECROD', 'CURRENTMONTHNAMEGEN' ],
'currenttime' => [ '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ],
'currenttimestamp' => [ '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ],
'currentweek' => [ '1', 'TRENUTNASEDMICA', 'TRENUTAČNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ],
'currentyear' => [ '1', 'TRENUTNAGODINA', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ],
'forcetoc' => [ '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ],
'formatdate' => [ '0', 'formatdatuma', 'formatdate', 'dateformat' ],
'fullpagename' => [ '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ],
'fullpagenamee' => [ '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ],
'fullurl' => [ '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ],
'fullurle' => [ '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ],
'hiddencat' => [ '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ],
'img_baseline' => [ '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ],
'img_border' => [ '1', 'granica', 'obrub', 'border' ],
'img_bottom' => [ '1', 'dno', 'bottom' ],
'img_center' => [ '1', 'centar', 'c', 'središte', 'center', 'centre' ],
'img_framed' => [ '1', 'okvir', 'ram', 'frame', 'framed', 'enframed' ],
'img_frameless' => [ '1', 'bezokvira', 'bez_okvira', 'frameless' ],
'img_left' => [ '1', 'lijevo', 'levo', 'left' ],
'img_manualthumb' => [ '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ],
'img_middle' => [ '1', 'sredina', 'middle' ],
'img_none' => [ '1', 'n', 'ništa', 'bez', 'none' ],
'img_page' => [ '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ],
'img_right' => [ '1', 'desno', 'right' ],
'img_text_bottom' => [ '1', 'tekst-dno', 'text-bottom' ],
'img_text_top' => [ '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ],
'img_thumbnail' => [ '1', 'mini', 'minijatura', 'thumb', 'thumbnail' ],
'img_top' => [ '1', 'vrh', 'top' ],
'img_upright' => [ '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ],
'localday' => [ '1', 'LOKALNIDAN', 'LOCALDAY' ],
'localday2' => [ '1', 'LOKALNIDAN2', 'LOCALDAY2' ],
'localdayname' => [ '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ],
'localdow' => [ '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ],
'localhour' => [ '1', 'LOKALNISAT', 'LOCALHOUR' ],
'localmonth' => [ '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ],
'localmonth1' => [ '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ],
'localmonthabbrev' => [ '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ],
'localmonthname' => [ '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ],
'localmonthnamegen' => [ '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ],
'localtime' => [ '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ],
'localtimestamp' => [ '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ],
'localurl' => [ '0', 'LOKALNIURL:', 'LOCALURL:' ],
'localurle' => [ '0', 'LOKALNIURLE:', 'LOCALURLE:' ],
'localweek' => [ '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ],
'localyear' => [ '1', 'LOKALNAGODINA', 'LOCALYEAR' ],
'msg' => [ '0', 'POR:', 'MSG:' ],
'msgnw' => [ '0', 'NVPOR:', 'MSGNW:' ],
'namespace' => [ '1', 'IMENSKIPROSTOR', 'NAMESPACE' ],
'namespacee' => [ '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ],
'nocontentconvert' => [ '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ],
'noeditsection' => [ '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ],
'nogallery' => [ '0', '__BEZGALERIJE__', '__NOGALLERY__' ],
'notitleconvert' => [ '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ],
'notoc' => [ '0', '__BEZSADRŽAJA__', '__NOTOC__' ],
'numberofactiveusers' => [ '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ],
'numberofarticles' => [ '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ],
'numberofedits' => [ '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ],
'numberoffiles' => [ '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ],
'numberofpages' => [ '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ],
'numberofusers' => [ '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ],
'pagename' => [ '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ],
'pagenamee' => [ '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ],
'pagesize' => [ '1', 'VELICINASTRANICE', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ],
'plural' => [ '0', 'MNOŽINA:', 'PLURAL:' ],
'redirect' => [ '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ],
'revisionday' => [ '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ],
'revisionday2' => [ '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ],
'revisionid' => [ '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ],
'revisionmonth' => [ '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ],
'revisionmonth1' => [ '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ],
'revisiontimestamp' => [ '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ],
'revisionyear' => [ '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ],
'special' => [ '0', 'posebno', 'special' ],
'subst' => [ '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ],
'talkspace' => [ '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ],
'talkspacee' => [ '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ],
'toc' => [ '0', '__SADRŽAJ__', '__TOC__' ],
];
$linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
$fallback = 'sh-latn, sh-cyrl, bs, sr-el, sr-latn, hr';

View file

@ -0,0 +1,12 @@
<?php
/** Serbo-Croatian (Cyrillic script) (српскохрватски (ћирилица))
*
* To improve a translation please visit https://translatewiki.net
*
* @file
* @ingroup Languages
*
* @author Aca
*/
$fallback = 'sh, sh-latn';

View file

@ -0,0 +1,226 @@
<?php
/** Serbo-Croatian (Latin script) (srpskohrvatski (latinica))
*
* To improve a translation please visit https://translatewiki.net
*
* @file
* @ingroup Languages
*
* @author Aca
* @author Kaganer
* @author Kolega2357
* @author Nemo bis
* @author OC Ripper
* @author לערי ריינהארט
*/
$fallback = 'sh, sh-cyrl, bs, sr-el, sr-latn, hr';
$namespaceNames = [
NS_SPECIAL => 'Posebno',
NS_TALK => 'Razgovor',
NS_USER => 'Korisnik',
NS_USER_TALK => 'Razgovor_sa_korisnikom',
NS_PROJECT_TALK => 'Razgovor_o_$1',
NS_FILE => 'Datoteka',
NS_FILE_TALK => 'Razgovor_o_datoteci',
NS_MEDIAWIKI_TALK => 'Mediawiki_razgovor',
NS_TEMPLATE => 'Šablon',
NS_TEMPLATE_TALK => 'Razgovor_o_šablonu',
NS_HELP => 'Pomoć',
NS_HELP_TALK => 'Razgovor_o_pomoći',
NS_CATEGORY => 'Kategorija',
NS_CATEGORY_TALK => 'Razgovor_o_kategoriji',
];
# Some dummy translations to prevent language fallback for now
# @TODO: Check whether localising them is appropriate.
$namespaceGenderAliases = [];
$defaultDateFormat = 'dmy';
$datePreferences = [
'default',
'dmy',
'ymd',
'ISO 8601',
];
$datePreferenceMigrationMap = [
'default',
'mdy',
'dmy',
'ymd',
];
/** @phpcs-require-sorted-array */
$specialPageAliases = [
'Activeusers' => [ 'Aktivni_korisnici' ],
'Allmessages' => [ 'Sve_poruke' ],
'Allpages' => [ 'Sve_stranice' ],
'Ancientpages' => [ 'Najstarije_stranice' ],
'Blankpage' => [ 'Prazna_stranica' ],
'Booksources' => [ 'Traži_ISBN' ],
'BrokenRedirects' => [ 'Kriva_preusmjerenja' ],
'Categories' => [ 'Kategorije' ],
'Confirmemail' => [ 'E-mail_potvrda' ],
'Contributions' => [ 'Doprinosi' ],
'CreateAccount' => [ 'Stvori_račun' ],
'Deadendpages' => [ 'Mrtve_stranice' ],
'DeletedContributions' => [ 'Obrisani_doprinosi' ],
'DoubleRedirects' => [ 'Dvostruka_preusmjerenja' ],
'Emailuser' => [ 'E-mail', 'Elektronska_pošta' ],
'Export' => [ 'Izvezi' ],
'Fewestrevisions' => [ 'Najmanje_uređivane_stranice' ],
'FileDuplicateSearch' => [ 'Traži_kopije_datoteka' ],
'Filepath' => [ 'Putanja_datoteke' ],
'Import' => [ 'Uvezi' ],
'LinkSearch' => [ 'Traži_poveznice', 'Traži_linkove' ],
'Listadmins' => [ 'Popis_administratora' ],
'Listbots' => [ 'Popis_botova' ],
'Listgrouprights' => [ 'Popis_korisničkih_prava' ],
'Listredirects' => [ 'Popis_preusmjerenja' ],
'Listusers' => [ 'Popis_korisnika', 'Korisnički_popis' ],
'Lockdb' => [ 'Zaključaj_bazu' ],
'Log' => [ 'Evidencije', 'Registri' ],
'Lonelypages' => [ 'Usamljene_stranice', 'Siročad' ],
'Longpages' => [ 'Duge_stranice' ],
'MergeHistory' => [ 'Spoji_historiju' ],
'MIMEsearch' => [ 'MIME_pretraga' ],
'Mostcategories' => [ 'Najviše_kategorija' ],
'Mostimages' => [ 'Najviše_povezane_datoteke', 'Najviše_povezane_slike' ],
'Mostlinked' => [ 'Najviše_povezane_stranice' ],
'Mostlinkedcategories' => [ 'Najviše_povezane_kategorije', 'Najviše_korištene_kategorije' ],
'Mostlinkedtemplates' => [ 'Najviše_povezani_šabloni', 'Najviše_korišteni_šabloni' ],
'Mostrevisions' => [ 'Najviše_uređivane_stranice' ],
'Movepage' => [ 'Premjesti_stranicu' ],
'Mycontributions' => [ 'Moji_doprinosi' ],
'Mypage' => [ 'Moja_stranica' ],
'Mytalk' => [ 'Moj_razgovor' ],
'Myuploads' => [ 'Moje_postavljene_datoteke' ],
'Newimages' => [ 'Nove_datoteke', 'Nove_slike' ],
'Newpages' => [ 'Nove_stranice' ],
'Preferences' => [ 'Postavke' ],
'Prefixindex' => [ 'Prefiks_indeks', 'Stranice_po_prefiksu' ],
'Protectedpages' => [ 'Zaštićene_stranice' ],
'Protectedtitles' => [ 'Zaštićeni_naslovi' ],
'Randompage' => [ 'Slučajna_stranica' ],
'Randomredirect' => [ 'Slučajno_preusmjerenje' ],
'Recentchanges' => [ 'Nedavne_izmjene' ],
'Recentchangeslinked' => [ 'Povezane_izmjene' ],
'Revisiondelete' => [ 'Brisanje_izmjene' ],
'Search' => [ 'Traži' ],
'Shortpages' => [ 'Kratke_stranice' ],
'Specialpages' => [ 'Posebne_stranice' ],
'Statistics' => [ 'Statistike' ],
'Unblock' => [ 'Odblokiraj' ],
'Uncategorizedcategories' => [ 'Nekategorizirane_kategorije' ],
'Uncategorizedimages' => [ 'Nekategorizirane_datoteke', 'Nekategorizirane_slike' ],
'Uncategorizedpages' => [ 'Nekategorizirane_stranice' ],
'Uncategorizedtemplates' => [ 'Nekategorizirani_šabloni' ],
'Undelete' => [ 'Vrati' ],
'Unlockdb' => [ 'Otključaj_bazu' ],
'Unusedcategories' => [ 'Nekorištene_kategorije' ],
'Unusedimages' => [ 'Nekorištene_datoteke', 'Nekorištene_slike' ],
'Unusedtemplates' => [ 'Nekorišteni_šabloni' ],
'Unwatchedpages' => [ 'Negledane_stranice' ],
'Upload' => [ 'Postavi_datoteku' ],
'Userrights' => [ 'Korisnička_prava' ],
'Version' => [ 'Verzija' ],
'Wantedcategories' => [ 'Tražene_kategorije' ],
'Wantedfiles' => [ 'Tražene_datoteke' ],
'Wantedpages' => [ 'Tražene_stranice' ],
'Wantedtemplates' => [ 'Traženi_šabloni' ],
'Watchlist' => [ 'Spisak_praćenja' ],
'Whatlinkshere' => [ 'Što_vodi_ovdje' ],
'Withoutinterwiki' => [ 'Bez_interwikija' ],
];
/** @phpcs-require-sorted-array */
$magicWords = [
'currentday' => [ '1', 'TRENUTNIDAN', 'TRENUTAČNIDAN', 'CURRENTDAY' ],
'currentday2' => [ '1', 'TRENUTNIDAN2', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ],
'currentdayname' => [ '1', 'TRENUTNIDANIME', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ],
'currentdow' => [ '1', 'TRENUTNIDANSEDMICE', 'TRENUTAČNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ],
'currenthour' => [ '1', 'TRENUTNISAT', 'TRENUTAČNISAT', 'CURRENTHOUR' ],
'currentmonth' => [ '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ],
'currentmonth1' => [ '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ],
'currentmonthabbrev' => [ '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAČNIMJESECSKR', 'CURRENTMONTHABBREV' ],
'currentmonthname' => [ '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ],
'currentmonthnamegen' => [ '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAČNIMJESECROD', 'CURRENTMONTHNAMEGEN' ],
'currenttime' => [ '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ],
'currenttimestamp' => [ '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ],
'currentweek' => [ '1', 'TRENUTNASEDMICA', 'TRENUTAČNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ],
'currentyear' => [ '1', 'TRENUTNAGODINA', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ],
'forcetoc' => [ '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ],
'formatdate' => [ '0', 'formatdatuma', 'formatdate', 'dateformat' ],
'fullpagename' => [ '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ],
'fullpagenamee' => [ '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ],
'fullurl' => [ '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ],
'fullurle' => [ '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ],
'hiddencat' => [ '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ],
'img_baseline' => [ '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ],
'img_border' => [ '1', 'granica', 'obrub', 'border' ],
'img_bottom' => [ '1', 'dno', 'bottom' ],
'img_center' => [ '1', 'centar', 'c', 'središte', 'center', 'centre' ],
'img_framed' => [ '1', 'okvir', 'ram', 'frame', 'framed', 'enframed' ],
'img_frameless' => [ '1', 'bezokvira', 'bez_okvira', 'frameless' ],
'img_left' => [ '1', 'lijevo', 'levo', 'left' ],
'img_manualthumb' => [ '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ],
'img_middle' => [ '1', 'sredina', 'middle' ],
'img_none' => [ '1', 'n', 'ništa', 'bez', 'none' ],
'img_page' => [ '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ],
'img_right' => [ '1', 'desno', 'right' ],
'img_text_bottom' => [ '1', 'tekst-dno', 'text-bottom' ],
'img_text_top' => [ '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ],
'img_thumbnail' => [ '1', 'mini', 'minijatura', 'thumb', 'thumbnail' ],
'img_top' => [ '1', 'vrh', 'top' ],
'img_upright' => [ '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ],
'localday' => [ '1', 'LOKALNIDAN', 'LOCALDAY' ],
'localday2' => [ '1', 'LOKALNIDAN2', 'LOCALDAY2' ],
'localdayname' => [ '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ],
'localdow' => [ '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ],
'localhour' => [ '1', 'LOKALNISAT', 'LOCALHOUR' ],
'localmonth' => [ '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ],
'localmonth1' => [ '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ],
'localmonthabbrev' => [ '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ],
'localmonthname' => [ '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ],
'localmonthnamegen' => [ '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ],
'localtime' => [ '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ],
'localtimestamp' => [ '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ],
'localurl' => [ '0', 'LOKALNIURL:', 'LOCALURL:' ],
'localurle' => [ '0', 'LOKALNIURLE:', 'LOCALURLE:' ],
'localweek' => [ '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ],
'localyear' => [ '1', 'LOKALNAGODINA', 'LOCALYEAR' ],
'msg' => [ '0', 'POR:', 'MSG:' ],
'msgnw' => [ '0', 'NVPOR:', 'MSGNW:' ],
'namespace' => [ '1', 'IMENSKIPROSTOR', 'NAMESPACE' ],
'namespacee' => [ '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ],
'nocontentconvert' => [ '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ],
'noeditsection' => [ '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ],
'nogallery' => [ '0', '__BEZGALERIJE__', '__NOGALLERY__' ],
'notitleconvert' => [ '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ],
'notoc' => [ '0', '__BEZSADRŽAJA__', '__NOTOC__' ],
'numberofactiveusers' => [ '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ],
'numberofarticles' => [ '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ],
'numberofedits' => [ '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ],
'numberoffiles' => [ '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ],
'numberofpages' => [ '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ],
'numberofusers' => [ '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ],
'pagename' => [ '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ],
'pagenamee' => [ '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ],
'pagesize' => [ '1', 'VELICINASTRANICE', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ],
'plural' => [ '0', 'MNOŽINA:', 'PLURAL:' ],
'redirect' => [ '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ],
'revisionday' => [ '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ],
'revisionday2' => [ '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ],
'revisionid' => [ '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ],
'revisionmonth' => [ '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ],
'revisionmonth1' => [ '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ],
'revisiontimestamp' => [ '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ],
'revisionyear' => [ '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ],
'special' => [ '0', 'posebno', 'special' ],
'subst' => [ '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ],
'talkspace' => [ '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ],
'talkspacee' => [ '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ],
'toc' => [ '0', '__SADRŽAJ__', '__TOC__' ],
];
$linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';

View file

@ -44,20 +44,6 @@ class ApiQueryLanguageinfoTest extends ApiTestCase {
}
public function provideTestAllPropsForSingleLanguage() {
yield [
'sh',
[
'code' => 'sh',
'bcp47' => 'sh',
'autonym' => 'srpskohrvatski / српскохрватски',
'name' => 'Serbo-Croatian',
'fallbacks' => [ 'bs', 'sr-el', 'sr-latn', 'hr' ],
'dir' => 'ltr',
'variants' => [ 'sh' ],
'variantnames' => [ 'sh' => 'srpskohrvatski / српскохрватски' ],
]
];
yield [
'sr',
[

View file

@ -250,8 +250,8 @@ class LanguageConverterFactoryTest extends MediaWikiLangTestCase {
'ps', 'pt', 'pt-br', 'qu', 'qug', 'rgn', 'rif', 'rm', 'rmy', 'rn', 'ro',
'roa-rup', 'roa-tara', 'ru', 'rue', 'rup', 'ruq', 'ruq-cyrl', 'ruq-latn',
'rw', 'sa', 'sah', 'sat', 'sc', 'scn', 'sco', 'sd', 'sdc', 'sdh', 'se',
'sei', 'ses', 'sg', 'sgs', 'sh', 'shi-tfng', 'shi-latn', 'shn', 'shy-latn',
'si', 'simple', 'sk', 'skr', 'skr-arab', 'sl', 'sli', 'sm', 'sma', 'sn',
'sei', 'ses', 'sg', 'sgs', 'sh-cyrl', 'sh-latn', 'shi-tfng', 'shi-latn', 'shn',
'shy-latn', 'si', 'simple', 'sk', 'skr', 'skr-arab', 'sl', 'sli', 'sm', 'sma', 'sn',
'so', 'sq', 'sr-ec', 'sr-el', 'srn', 'ss', 'st', 'sty', 'stq', 'su', 'sv',
'sw', 'szl', 'szy', 'ta', 'tay', 'tcy', 'te', 'tet', 'tg-cyrl', 'tg-latn',
'th', 'ti', 'tk', 'tl', 'tly-latn', 'tn', 'to', 'tpi', 'tr', 'tru', 'ts', 'tt',
@ -363,6 +363,16 @@ class LanguageConverterFactoryTest extends MediaWikiLangTestCase {
]
];
yield 'sh' => [
'sh', 'sh-latn', 'ShConverter',
[ 'sh-latn', 'sh-cyrl' ],
[ 'sh-cyrl' => 'sh-latn' ],
[], [], [
'sh-latn' => 'bidirectional',
'sh-cyrl' => 'bidirectional'
]
];
yield 'shi' => [
'shi', 'shi', 'ShiConverter',
[ 'shi', 'shi-tfng', 'shi-latn' ],

View file

@ -0,0 +1,110 @@
<?php
/**
* @group Language
* @covers ShConverter
*/
class ShConverterTest extends MediaWikiIntegrationTestCase {
use LanguageConverterTestTrait;
/**
* @dataProvider provideAutoConvertToAllVariants
* @covers ShConverter::autoConvertToAllVariants
*/
public function testAutoConvertToAllVariants( $result, $value ) {
$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );
}
public static function provideAutoConvertToAllVariants() {
return [
[
[
'sh-latn' => 'g',
'sh-cyrl' => 'г',
],
'g'
],
[
[
'sh-latn' => 'г',
'sh-cyrl' => 'г',
],
'г'
],
];
}
/**
* @covers ShConverter::convertTo
*/
public function testConvertTo() {
$this->testConversionToLatin();
$this->testConversionToCyrillic();
}
/**
* Wrapper for testConvertTo() for Cyrillic
*/
public function testConversionToCyrillic() {
// A simple conversion of Latin to Cyrillic
$this->assertEquals( 'абвг',
$this->convertToCyrillic( 'abvg' )
);
// Same as above, but assert that -{}-s must be removed and not converted
$this->assertEquals( 'ljабnjвгdž',
$this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
);
// A simple conversion of Cyrillic to Cyrillic
$this->assertEquals( 'абвг',
$this->convertToCyrillic( 'абвг' )
);
// Same as above, but assert that -{}-s must be removed and not converted
$this->assertEquals( 'ljабnjвгdž',
$this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
);
// Roman numerals are not converted
$this->assertEquals( 'а I б II в III г IV шђжчћ',
$this->convertToCyrillic( 'a I b II v III g IV šđžčć' )
);
// Manual conversion rules work
$this->assertEquals( 'Cyrillic',
$this->convertToCyrillic( '-{sh-latn:Latin; sh-cyrl:Cyrillic;}-' )
);
}
/**
* Wrapper for testConvertTo() for Latin
*/
public function testConversionToLatin() {
// A simple conversion of Latin to Latin
$this->assertEquals( 'abvg',
$this->convertToLatin( 'abvg' )
);
// Same as above, but assert that -{}-s must be removed and not converted
$this->assertEquals( 'ljabnjvgdž',
$this->convertToLatin( '-{lj}-ab-{nj}-vg-{dž}-' )
);
// Manual conversion rules work
$this->assertEquals( 'Latin',
$this->convertToLatin( '-{sh-latn:Latin; sh-cyrl:Cyrillic;}-' )
);
}
/**
* Wrapper for converter::convertTo() method
* @param string $text
* @param string $variant
* @return string
*/
protected function convertTo( $text, $variant ) {
return $this->getLanguageConverter()->convertTo( $text, $variant );
}
protected function convertToCyrillic( $text ) {
return $this->convertTo( $text, 'sh-cyrl' );
}
protected function convertToLatin( $text ) {
return $this->convertTo( $text, 'sh-latn' );
}
}

View file

@ -16,7 +16,7 @@ class LanguageFallbackTest extends MediaWikiUnitTestCase {
'sco' => [ 'en' ],
'yi' => [ 'he' ],
'ruq' => [ 'ruq-latn', 'ro' ],
'sh' => [ 'bs', 'sr-el', 'sr-latn', 'hr' ],
'sh' => [ 'sh-latn', 'sh-cyrl', 'bs', 'sr-el', 'sr-latn', 'hr' ],
];
private function getLanguageNameUtils() {

View file

@ -119,7 +119,7 @@ trait LanguageFallbackTestTrait {
'sco' => [ 'sco', [ 'en' ] ],
'yi' => [ 'yi', [ 'he', 'en' ] ],
'ruq' => [ 'ruq', [ 'ruq-latn', 'ro', 'en' ] ],
'sh' => [ 'sh', [ 'bs', 'sr-el', 'sr-latn', 'hr', 'en' ] ],
'sh' => [ 'sh', [ 'sh-latn', 'sh-cyrl', 'bs', 'sr-el', 'sr-latn', 'hr', 'en' ] ],
];
}
@ -144,7 +144,7 @@ trait LanguageFallbackTestTrait {
'sco' => [ 'sco', [ 'en' ] ],
'yi' => [ 'yi', [ 'he' ] ],
'ruq' => [ 'ruq', [ 'ruq-latn', 'ro' ] ],
'sh' => [ 'sh', [ 'bs', 'sr-el', 'sr-latn', 'hr' ] ],
'sh' => [ 'sh', [ 'sh-latn', 'sh-cyrl', 'bs', 'sr-el', 'sr-latn', 'hr' ] ],
];
}
@ -231,9 +231,9 @@ trait LanguageFallbackTestTrait {
'yi on yi' => [ 'yi', 'yi', [ [ 'he', 'en' ], [ 'yi' ] ] ],
'sh on ruq' => [ 'sh', 'ruq',
[ [ 'bs', 'sr-el', 'sr-latn', 'hr', 'en' ], [ 'ruq', 'ruq-latn', 'ro' ] ], 2 ],
[ [ 'sh-latn', 'sh-cyrl', 'bs', 'sr-el', 'sr-latn', 'hr', 'en' ], [ 'ruq', 'ruq-latn', 'ro' ] ], 2 ],
'ruq on sh' => [ 'ruq', 'sh',
[ [ 'ruq-latn', 'ro', 'en' ], [ 'sh', 'bs', 'sr-el', 'sr-latn', 'hr' ] ], 2 ],
[ [ 'ruq-latn', 'ro', 'en' ], [ 'sh', 'sh-latn', 'sh-cyrl', 'bs', 'sr-el', 'sr-latn', 'hr' ] ], 2 ],
];
}
}