Аlready supported in Bosnian, it will be useful to have it for Serbo-Croatian interface localization.
Description
Details
Related Objects
Event Timeline
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 word | case1 | case2 |
| Wikipedija | Wikipediji | Wikipediju |
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.
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)
| English | base word | genitiv | dativ | akuzativ | vokativ | instrumental | lokativ |
| Wikibooks | Wikiknjige | Wikiknjiga | Wikiknjigama | Wikiknjige | Wikiknjige | Wikiknjigama | Wikiknjigama |
| Wikidata | Wikipodaci | Wikipodataka | Wikipodacima | Wikipodatke | Wikipodaci | Wikipodacima | Wikipodacima |
| Wikifunctions | Wikifunkcije | Wikifunkcija | Wikifunkcijama | Wikifunkcije | Wikifunkcije | Wikifunkcijama | Wikifunkcijama |
| Wikimedia Commons | Wikimedijina ostava | Wikimedijine ostave | Wikimedijinoj ostavi | Wikimedijinu ostavu | Wikimedijina ostavo | Wikimedijinom ostavom | Wikimedijinoj ostavi |
| Wikinews | Wikinovosti | Wikinovosti | Wikinovostima | Wikinovosti | Wikinovosti | Wikinovostima | Wikinovostima |
| Wikipedia | Wikipedija | Wikipedije | Wikipediji | Wikipediju | Wikipedijo | Wikipedijom | Wikipediji |
| Wikiquote | Wikicitat | Wikicitata | Wikicitatu | Wikicitat | Wikicitate | Wikicitatom | Wikicitatu |
| Wikisource | Wikiteka | Wikiteke | Wikiteci | Wikiteku | Wikiteko | Wikitekom | Wikiteci |
| Wikispecies | Wikivrste | Wikivrsta | Wikivrstama | Wikivrste | Wikivrste | Wikivrstama | Wikivrstama |
| Wikiversity | Wikiverzitet | Wikiverziteta | Wikiverzitetu | Wikiverzitet | Wikiverzitete | Wikiverzitetom | Wikiverzitetu |
| Wikivoyage | Wikivodič | Wikivodiča | Wikivodiču | Wikivodič | Wikivodiču | Wikivodičem | Wikivodiču |
| Wiktionary | Wikirječnik | Wikirječnika | Wikirječniku | Wikirječnik | Wikirječniče | Wikirječnikom | Wikirječniku |
For other, non-included projects:
| English | base word | genitiv | dativ | akuzativ | vokativ | instrumental | lokativ |
| $1 | $1 | projekta $1 | projektu $1 | projekt $1 | projekte $1 | projektom $1 | projektu $1 |
Serbo-Croatian Cyrillic (sh-Cyrl):
(sorted by the English word for consistency, English terms bolded, italics = no changes)
| English | base word | генитив | датив | акузатив | вокатив | инструментал | локатив |
| Wikibooks | Викикњиге | Викикњига | Викикњигама | Викикњиге | Викикњиге | Викикњигама | Викикњигама |
| Wikidata | Википодаци | Википодатака | Википодацима | Википодатке | Википодаци | Википодацима | Википодацима |
| Wikifunctions | Викифункције | Викифункција | Викифункцијама | Викифункције | Викифункције | Викифункцијама | Викифункцијама |
| Wikimedia Commons | Викимедијина остава | Викимедијине оставе | Викимедијиној остави | Викимедијину оставу | Викимедијина оставо | Викимедијином оставом | Викимедијиној остави |
| Wikinews | Викиновости | Викиновости | Викиновостима | Викиновости | Викиновости | Викиновостима | Викиновостима |
| Wikipedia | Википедија | Википедије | Википедији | Википедију | Википедијо | Википедијом | Википедији |
| Wikiquote | Викицитат | Викицитата | Викицитату | Викицитат | Викицитате | Викицитатом | Викицитату |
| Wikisource | Викитека | Викитеке | Викитеци | Викитеку | Викитеко | Викитеком | Викитеци |
| Wikispecies | Викиврсте | Викиврста | Викиврстама | Викиврсте | Викиврсте | Викиврстама | Викиврстама |
| Wikiversity | Викиверзитет | Викиверзитета | Викиверзитету | Викиверзитет | Викиверзитете | Викиверзитетом | Викиверзитету |
| Wikivoyage | Викиводич | Викиводича | Викиводичу | Викиводич | Викиводичу | Викиводичем | Викиводичу |
| Wiktionary | Викиречник | Викиречника | Викиречнику | Викиречник | Викиречниче | Викиречником | Викиречнику |
For other, non-included projects:
| English | base 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
Change #1116217 had a related patch set uploaded (by Msz2001; author: Msz2001):
[mediawiki/extensions/WikimediaMessages@master] Add GRAMMAR table for Serbo-Croatian
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.
Test wiki created on Patch demo by Aca using patch(es) linked to this task:
http://patchdemo.wmcloud.org/wikis/0b4830fab1/w/
Change #1116216 merged by jenkins-bot:
[mediawiki/core@master] Add support for GRAMMAR in Serbo-Croatian
Change #1116217 merged by jenkins-bot:
[mediawiki/extensions/WikimediaMessages@master] Add GRAMMAR table for Serbo-Croatian
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
Change #1123019 merged by jenkins-bot:
[mediawiki/core@master] Fix warning that $grammarForms['sh'] is undefined