diff --git a/autoload.php b/autoload.php index efd1b2d6c08..64b41e7e44c 100644 --- a/autoload.php +++ b/autoload.php @@ -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', diff --git a/includes/language/LanguageConverter.php b/includes/language/LanguageConverter.php index 4ca37112421..b341ff28443 100644 --- a/includes/language/LanguageConverter.php +++ b/includes/language/LanguageConverter.php @@ -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', diff --git a/includes/language/LanguageConverterFactory.php b/includes/language/LanguageConverterFactory.php index 92a9a0261ca..bb0bf93c8c1 100644 --- a/includes/language/LanguageConverterFactory.php +++ b/includes/language/LanguageConverterFactory.php @@ -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, ], diff --git a/includes/language/converters/ShConverter.php b/includes/language/converters/ShConverter.php new file mode 100644 index 00000000000..dd01032176a --- /dev/null +++ b/includes/language/converters/ShConverter.php @@ -0,0 +1,156 @@ + 'џ', + '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; + } +} diff --git a/includes/languages/data/Names.php b/includes/languages/data/Names.php index 6c43b86da9a..2d62af738ad 100644 --- a/includes/languages/data/Names.php +++ b/includes/languages/data/Names.php @@ -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) diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 60cd6e7578f..ea7d38ac8b6 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -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", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 7121af6f33e..a2f9e902930 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -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}}", diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php index 81affc2292a..dd18dc95a22 100644 --- a/languages/messages/MessagesSh.php +++ b/languages/messages/MessagesSh.php @@ -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'; diff --git a/languages/messages/MessagesSh_cyrl.php b/languages/messages/MessagesSh_cyrl.php new file mode 100644 index 00000000000..eb70f6d143a --- /dev/null +++ b/languages/messages/MessagesSh_cyrl.php @@ -0,0 +1,12 @@ + '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'; diff --git a/tests/phpunit/includes/api/query/ApiQueryLanguageinfoTest.php b/tests/phpunit/includes/api/query/ApiQueryLanguageinfoTest.php index 304cbe20bfa..502e8b7da7e 100644 --- a/tests/phpunit/includes/api/query/ApiQueryLanguageinfoTest.php +++ b/tests/phpunit/includes/api/query/ApiQueryLanguageinfoTest.php @@ -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', [ diff --git a/tests/phpunit/languages/LanguageConverterFactoryTest.php b/tests/phpunit/languages/LanguageConverterFactoryTest.php index 9134e4d448a..04a67e2466f 100644 --- a/tests/phpunit/languages/LanguageConverterFactoryTest.php +++ b/tests/phpunit/languages/LanguageConverterFactoryTest.php @@ -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' ], diff --git a/tests/phpunit/languages/converters/ShConverterTest.php b/tests/phpunit/languages/converters/ShConverterTest.php new file mode 100644 index 00000000000..969651673ff --- /dev/null +++ b/tests/phpunit/languages/converters/ShConverterTest.php @@ -0,0 +1,110 @@ +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' ); + } +} diff --git a/tests/phpunit/unit/includes/language/LanguageFallbackTest.php b/tests/phpunit/unit/includes/language/LanguageFallbackTest.php index e3a9b807cf1..1f1e45711d9 100644 --- a/tests/phpunit/unit/includes/language/LanguageFallbackTest.php +++ b/tests/phpunit/unit/includes/language/LanguageFallbackTest.php @@ -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() { diff --git a/tests/phpunit/unit/includes/language/LanguageFallbackTestTrait.php b/tests/phpunit/unit/includes/language/LanguageFallbackTestTrait.php index 3b12a25c101..f76b174ba19 100644 --- a/tests/phpunit/unit/includes/language/LanguageFallbackTestTrait.php +++ b/tests/phpunit/unit/includes/language/LanguageFallbackTestTrait.php @@ -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 ], ]; } }