Page MenuHomePhabricator

Implement GRAMMAR magic word for Serbo-Croatian localization
Closed, ResolvedPublic

Description

Аlready supported in Bosnian, it will be useful to have it for Serbo-Croatian interface localization.

Event Timeline

Msz2001 removed Aca as the assignee of this task.Jan 21 2025, 2:05 PM
Msz2001 subscribed.

Hi, @Aca!

I can help with adding these. But, as I don't speak this language, could you please provide me a table of words and their grammar forms that you'd like to have implemented?

Like for example these (of course, you can just send a list, not neccessarily a ready PHP excerpt): https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/WikimediaMessages/+/4fdf83e0917d097760f2d7edfb093de6a0c16abd/includes/Hooks.php#1380

Grammar support in MediaWiki works based on a dictionary lookup, so it can support a limited pre-defined set of words and cases. The grammar case symbols can be anything (e.g., a shortcut or a full name or anything that would be understandable and useful).

For example (of course, instead of case1 etc. some more descriptive name to be used right after the colon in {{GENDER:):

base wordcase1case2
WikipedijaWikipedijiWikipediju

Hi, @Msz2001 ! Thanks for your engagement! We're currently having an on-wiki discussion about standardizing names for several Wikimedia projects. I'll reach you out with my input following the discussion.

Grammar support in MediaWiki works based on a dictionary lookup, so it can support a limited pre-defined set of words and cases. […]

Some grammar functions work like that, but not all. The limiting factor is the complexity of the language's rules. Two examples:

  • LanguageFi.php: Several cases, but made to support sitenames only because the language's rules are complex
  • grammarTransformations/nb.json: One case, but supports basically everything, because the rules for this are easy and straightforward

Grammar support in MediaWiki works based on a dictionary lookup, so it can support a limited pre-defined set of words and cases. […]

Some grammar functions work like that, but not all. The limiting factor is the complexity of the language's rules. Two examples:

  • LanguageFi.php: Several cases, but made to support sitenames only because the language's rules are complex
  • grammarTransformations/nb.json: One case, but supports basically everything, because the rules for this are easy and straightforward

Ah, fair point! Since this task is about a Slavic language, I've automatically assumed it's non-trivial to implement in general :D (but that's true, I wasn't clear about that)

@Msz2001 Hi, here is a table of words with their grammar forms.

Serbo-Croatian Latin (sh-Latn):
(sorted by the English word for consistency, English terms bolded, italics = no changes)

Englishbase wordgenitivdativakuzativvokativinstrumentallokativ
WikibooksWikiknjigeWikiknjigaWikiknjigamaWikiknjigeWikiknjigeWikiknjigamaWikiknjigama
WikidataWikipodaciWikipodatakaWikipodacimaWikipodatkeWikipodaciWikipodacimaWikipodacima
WikifunctionsWikifunkcijeWikifunkcijaWikifunkcijamaWikifunkcijeWikifunkcijeWikifunkcijamaWikifunkcijama
Wikimedia CommonsWikimedijina ostavaWikimedijine ostaveWikimedijinoj ostaviWikimedijinu ostavuWikimedijina ostavoWikimedijinom ostavomWikimedijinoj ostavi
WikinewsWikinovostiWikinovostiWikinovostimaWikinovosti WikinovostiWikinovostimaWikinovostima
WikipediaWikipedijaWikipedijeWikipedijiWikipedijuWikipedijoWikipedijomWikipediji
WikiquoteWikicitatWikicitataWikicitatuWikicitatWikicitateWikicitatomWikicitatu
WikisourceWikitekaWikitekeWikiteciWikitekuWikitekoWikitekomWikiteci
WikispeciesWikivrsteWikivrstaWikivrstamaWikivrsteWikivrsteWikivrstamaWikivrstama
WikiversityWikiverzitetWikiverzitetaWikiverzitetuWikiverzitetWikiverziteteWikiverzitetomWikiverzitetu
WikivoyageWikivodičWikivodičaWikivodičuWikivodičWikivodičuWikivodičemWikivodiču
WiktionaryWikirječnikWikirječnikaWikirječnikuWikirječnikWikirječničeWikirječnikomWikirječniku

For other, non-included projects:

Englishbase wordgenitivdativakuzativvokativinstrumentallokativ
$1$1projekta $1projektu $1projekt $1projekte $1projektom $1projektu $1

Serbo-Croatian Cyrillic (sh-Cyrl):
(sorted by the English word for consistency, English terms bolded, italics = no changes)

Englishbase wordгенитивдативакузативвокативинструменталлокатив
WikibooksВикикњигеВикикњигаВикикњигамаВикикњигеВикикњигеВикикњигамаВикикњигама
WikidataВикиподациВикиподатакаВикиподацимаВикиподаткеВикиподациВикиподацимаВикиподацима
WikifunctionsВикифункцијеВикифункцијаВикифункцијамаВикифункцијеВикифункцијеВикифункцијамаВикифункцијама
Wikimedia Commons Викимедијина оставаВикимедијине оставеВикимедијиној оставиВикимедијину оставуВикимедијина оставоВикимедијином оставомВикимедијиној остави
WikinewsВикиновостиВикиновостиВикиновостимаВикиновости ВикиновостиВикиновостимаВикиновостима
WikipediaВикипедијаВикипедијеВикипедијиВикипедијуВикипедијоВикипедијомВикипедији
WikiquoteВикицитатВикицитатаВикицитатуВикицитатВикицитатеВикицитатомВикицитату
WikisourceВикитекаВикитекеВикитециВикитекуВикитекоВикитекомВикитеци
WikispeciesВикиврстеВикиврстаВикиврстамаВикиврстеВикиврстеВикиврстамаВикиврстама
WikiversityВикиверзитетВикиверзитетаВикиверзитетуВикиверзитетВикиверзитетеВикиверзитетомВикиверзитету
WikivoyageВикиводичВикиводичаВикиводичуВикиводичВикиводичуВикиводичемВикиводичу
WiktionaryВикиречникВикиречникаВикиречникуВикиречникВикиречничеВикиречникомВикиречнику

For other, non-included projects:

Englishbase wordгенитивдативакузативвокативинструменталлокатив
$1$1пројекта $1пројекту $1пројект $1пројекте $1пројектом $1пројекту $1

Change #1116216 had a related patch set uploaded (by Msz2001; author: Msz2001):

[mediawiki/core@master] Add support for GRAMMAR in Serbo-Croatian

https://gerrit.wikimedia.org/r/1116216

Change #1116217 had a related patch set uploaded (by Msz2001; author: Msz2001):

[mediawiki/extensions/WikimediaMessages@master] Add GRAMMAR table for Serbo-Croatian

https://gerrit.wikimedia.org/r/1116217

I've prepared patches with the grammar rules. However, I've noticed two things that stem rather from the LanguageConverter behavior:

  • W is not converted to В, e.g. Wikipedija is rendered as Wикипедија
  • Wikirječnik is converted into Викирјечник (with ј)

Correcting those is unlikely to require additional fixes to grammar tables, as they appear to be applied before converting language variants.

Yeah, actually, it seems like the LanguageCoverter doesn't support converting sitenames yet (T213578). For now, we can implement the Latin variants only.

Working as intended on PatchDemo, will look for someone for +2

Change #1116216 merged by jenkins-bot:

[mediawiki/core@master] Add support for GRAMMAR in Serbo-Croatian

https://gerrit.wikimedia.org/r/1116216

Change #1116217 merged by jenkins-bot:

[mediawiki/extensions/WikimediaMessages@master] Add GRAMMAR table for Serbo-Croatian

https://gerrit.wikimedia.org/r/1116217

Done, closing. Thanks for your help!

Aca assigned this task to Msz2001.
Nikerabbit subscribed.

This causes:

[2025-02-26T08:53:46.150105+00:00] error.ERROR: [992b81cf82ffa6cd03b9b314] /wiki/MediaWiki:Visualeditor-welcomedialog-title/sh   PHP Warning: Undefined array key "sh" {"exception":"[object] (ErrorException(code: 0): PHP Warning: Undefined array key \"sh\" at /srv/mediawiki/workdir/includes/languages/LanguageSh.php:46)
[stacktrace]
#0 /srv/mediawiki/workdir/includes/languages/LanguageSh.php(46): MWExceptionHandler::handleError()
#1 /srv/mediawiki/workdir/includes/parser/CoreParserFunctions.php(406): LanguageSh->convertGrammar()
#2 /srv/mediawiki/workdir/includes/parser/Parser.php(3488): MediaWiki\\Parser\\CoreParserFunctions::grammar()
#3 /srv/mediawiki/workdir/includes/parser/Parser.php(3143): MediaWiki\\Parser\\Parser->callParserFunction()
#4 /srv/mediawiki/workdir/includes/parser/PPFrame_Hash.php(280): MediaWiki\\Parser\\Parser->braceSubstitution()
#5 /srv/mediawiki/workdir/includes/parser/Parser.php(2970): MediaWiki\\Parser\\PPFrame_Hash->expand()
#6 /srv/mediawiki/workdir/includes/parser/Parser.php(1602): MediaWiki\\Parser\\Parser->replaceVariables()
#7 /srv/mediawiki/workdir/includes/parser/Parser.php(701): MediaWiki\\Parser\\Parser->internalParse()
#8 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2683): MediaWiki\\Parser\\Parser->parse()
#9 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2237): MediaWiki\\Output\\OutputPage->parseInternal()
#10 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2218): MediaWiki\\Output\\OutputPage->addWikiTextTitleInternal()
#11 /srv/mediawiki/workdir/includes/page/Article.php(1650): MediaWiki\\Output\\OutputPage->addWikiTextAsContent()
#12 /srv/mediawiki/workdir/includes/page/Article.php(718): Article->showMissingArticle()
#13 /srv/mediawiki/workdir/includes/page/Article.php(546): Article->generateContentOutput()
#14 /srv/mediawiki/workdir/includes/actions/ViewAction.php(78): Article->view()
#15 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(732): ViewAction->show()
#16 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(509): MediaWiki\\Actions\\ActionEntryPoint->performAction()
#17 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(145): MediaWiki\\Actions\\ActionEntryPoint->performRequest()
#18 /srv/mediawiki/workdir/includes/MediaWikiEntryPoint.php(202): MediaWiki\\Actions\\ActionEntryPoint->execute()
#19 /srv/mediawiki/workdir/index.php(58): MediaWiki\\MediaWikiEntryPoint->run()
#20 {main}
","exception_url":"/wiki/MediaWiki:Visualeditor-welcomedialog-title/sh","reqId":"992b81cf82ffa6cd03b9b314","caught_by":"mwe_handler"} []
[26-Feb-2025 08:53:46 UTC] PHP Warning:  Undefined array key "sh" in /srv/mediawiki/workdir/includes/languages/LanguageSh.php on line 46
[2025-02-26T08:53:46.150495+00:00] error.ERROR: [992b81cf82ffa6cd03b9b314] /wiki/MediaWiki:Visualeditor-welcomedialog-title/sh   PHP Warning: foreach() argument must be of type array|object, null given {"exception":"[object] (ErrorException(code: 0): PHP Warning: foreach() argument must be of type array|object, null given at /srv/mediawiki/workdir/includes/languages/LanguageSh.php:46)
[stacktrace]
#0 /srv/mediawiki/workdir/includes/languages/LanguageSh.php(46): MWExceptionHandler::handleError()
#1 /srv/mediawiki/workdir/includes/parser/CoreParserFunctions.php(406): LanguageSh->convertGrammar()
#2 /srv/mediawiki/workdir/includes/parser/Parser.php(3488): MediaWiki\\Parser\\CoreParserFunctions::grammar()
#3 /srv/mediawiki/workdir/includes/parser/Parser.php(3143): MediaWiki\\Parser\\Parser->callParserFunction()
#4 /srv/mediawiki/workdir/includes/parser/PPFrame_Hash.php(280): MediaWiki\\Parser\\Parser->braceSubstitution()
#5 /srv/mediawiki/workdir/includes/parser/Parser.php(2970): MediaWiki\\Parser\\PPFrame_Hash->expand()
#6 /srv/mediawiki/workdir/includes/parser/Parser.php(1602): MediaWiki\\Parser\\Parser->replaceVariables()
#7 /srv/mediawiki/workdir/includes/parser/Parser.php(701): MediaWiki\\Parser\\Parser->internalParse()
#8 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2683): MediaWiki\\Parser\\Parser->parse()
#9 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2237): MediaWiki\\Output\\OutputPage->parseInternal()
#10 /srv/mediawiki/workdir/includes/Output/OutputPage.php(2218): MediaWiki\\Output\\OutputPage->addWikiTextTitleInternal()
#11 /srv/mediawiki/workdir/includes/page/Article.php(1650): MediaWiki\\Output\\OutputPage->addWikiTextAsContent()
#12 /srv/mediawiki/workdir/includes/page/Article.php(718): Article->showMissingArticle()
#13 /srv/mediawiki/workdir/includes/page/Article.php(546): Article->generateContentOutput()
#14 /srv/mediawiki/workdir/includes/actions/ViewAction.php(78): Article->view()
#15 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(732): ViewAction->show()
#16 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(509): MediaWiki\\Actions\\ActionEntryPoint->performAction()
#17 /srv/mediawiki/workdir/includes/actions/ActionEntryPoint.php(145): MediaWiki\\Actions\\ActionEntryPoint->performRequest()
#18 /srv/mediawiki/workdir/includes/MediaWikiEntryPoint.php(202): MediaWiki\\Actions\\ActionEntryPoint->execute()
#19 /srv/mediawiki/workdir/index.php(58): MediaWiki\\MediaWikiEntryPoint->run()
#20 {main}
","exception_url":"/wiki/MediaWiki:Visualeditor-welcomedialog-title/sh","reqId":"992b81cf82ffa6cd03b9b314","caught_by":"mwe_handler"} []

Change #1123019 had a related patch set uploaded (by Msz2001; author: Msz2001):

[mediawiki/core@master] Fix warning that $grammarForms['sh'] is undefined

https://gerrit.wikimedia.org/r/1123019

Change #1123019 merged by jenkins-bot:

[mediawiki/core@master] Fix warning that $grammarForms['sh'] is undefined

https://gerrit.wikimedia.org/r/1123019

@Msz2001 This can be closed now, I guess?

Oh, right. I completely forgot about that.