diff --git a/package-lock.json b/package-lock.json index e2606c5df..2ea15b870 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "interslavic", - "version": "1.22.7", + "version": "1.22.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "interslavic", - "version": "1.22.7", + "version": "1.22.8", "license": "MIT", "dependencies": { "@ag-grid-community/client-side-row-model": "25.2.0", diff --git a/src/components/Modals/DetailModal/DetailModal.tsx b/src/components/Modals/DetailModal/DetailModal.tsx index 0f419049b..fddcf4839 100644 --- a/src/components/Modals/DetailModal/DetailModal.tsx +++ b/src/components/Modals/DetailModal/DetailModal.tsx @@ -8,6 +8,7 @@ import { t } from 'translations'; import { hideModalDialog, setAlphabetTypeAction } from 'actions'; import { IMainState } from 'reducers'; +import { expandAbbr } from "utils/abbreviations"; import { getCaseTips } from 'utils/getCaseTips'; import { getCyrillic } from 'utils/getCyrillic'; import { getGlagolitic } from 'utils/getGlagolitic'; @@ -17,13 +18,10 @@ import { getNumeralType, getPartOfSpeech, getPronounType, - getVerbDetails, isAnimated, - isComparative, isIndeclinable, isPlural, isSingular, - isSuperlative, } from 'utils/wordDetails'; import { LineSelector } from 'components/LineSelector'; @@ -59,12 +57,14 @@ class DetailModalInternal extends Component { return null; } - const pos = getPartOfSpeech(this.props.details); + const { word, add, details } = this.props; return ( <>
- {this.renderTitle(pos)} + + {this.formatStr(word)} {this.formatStr(add)} ({expandAbbr(details)}) +
{!short && ( - {item.details} + + {translateAbbr(item.details)} + )}
@@ -240,7 +244,9 @@ export const ResultsCard = /> ) : renderOriginal(item, alphabets, caseQuestions, index)} {item.to !== 'isv' && short && ( - {item.details} + + {translateAbbr(item.details)} + )}
diff --git a/src/translations/data.json b/src/translations/data.json index 2823a44c8..545999a6e 100644 --- a/src/translations/data.json +++ b/src/translations/data.json @@ -701,7 +701,7 @@ "sl": "Piškotke in druge sledilne tehnologije uporabljamo za izboljšanje vaše uporabniške izkušnje med brskanjem po naši spletni strani, za prikazovanje personaliziranih vsebin oz. targetiranih oglasov, za analizo obiskov naše spletne strani in za vpogled v to, iz kje prihajajo naši gostje. Z brskanjem po naši spletni strani soglašate z našo rabo piškotkov in drugih sledilnih tehnologij.", "hr": "Koristimo kolačiće i druge tehnologije za praćenje kako bismo poboljšali vaše iskustvo pregledavanja naše web stranice, prikazali vam personalizirani sadržaj i ciljane oglase, te analizirali promet na našoj web stranici i razumjeli odakle dolaze naši posjetitelji. Pregledavanjem naše web stranice pristajete na upotrebu kolačića i ostalih tehnologija za praćenje.", "sr": "Kористимо колачиће и остале технологије за праћење како би побољшали вашу претрагу на нашем веб сајту, како би вам приказали персонализовани садржај и циљане рекламе, анализирали посете на нашем сајту и разумели одакле наши посетиоци сајта долазе. Прегледањем нашег сајта, пристајете на коришћење колачића и других технологија праћења.", - "mk": "", + "mk": "Користиме колачиња и други технологии за следење за да го подобриме вашето пребарување на нашата веб-страница, да ви прикажеме персонализирана содржина и насочени реклами, да ги анализираме посетите на нашата страница и да разбереме од каде доаѓаат нашите посетители. Со прелистување на нашата страница, се согласувате со употребата на колачиња и други технологии за следење.", "bg": "Ние използваме бисквитки и други, проследяващи, технологии, за да подобрим сърфирането ви в нашия сайт, като ви покажем персонализирано съдържание и реклами, да анализираме трафика на нашия сайт и да разберем откъде идват нашите посетители. Разглеждайки нашия уебсайт, вие се съгласявате с използването на бисквитки и други технологии за проследяване." }, "gdprAlertOk": { @@ -743,11 +743,11 @@ "pl": "Umowa Google Analytics", "cs": "Dohoda Google Analytics", "sk": "Dohoda Google Analytics", - "sl": "", + "sl": "Pogodba Google Analytics", "hr": "Sporazum Google Analytics", - "sr": "", - "mk": "", - "bg": "" + "sr": "Sporazum Google Analytics", + "mk": "Договор на Google Analytics", + "bg": "Споразумение с Google Analytics" }, "searchSensitiveLettersForInterslavic": { "en": "Search sensitive letters for Interslavic", @@ -1193,10 +1193,10 @@ "pl": "rodzaj męski albo żeński", "cs": "muž. nebo žen. rod", "sk": "muž. alebo žen. rod", - "sl": "srednji ali ženski spol", - "hr": "srednji ili ženski rod", - "sr": "средњи или женски род", - "mk": "среден или женски род", + "sl": "moški ali ženski spol", + "hr": "muški ili ženski rod", + "sr": "мушки или женски род", + "mk": "машки или женски род", "bg": "мъж. или жен. род" }, "noun-countable": { @@ -1253,7 +1253,7 @@ "pl": "żywotny", "cs": "životné", "sk": "životné", - "sl": "animirani", + "sl": "živi", "hr": "živa", "sr": "жива", "mk": "жива", @@ -1367,18 +1367,18 @@ "numeral-differential": { "en": "differential", "isv": "različajuči", - "ru": "видовое", - "uk": "[видовий]", - "be": "відавы", + "ru": "разделительное", + "uk": "роздільний", + "be": "раздзельны", "pl": "wieloraki", "cs": "druhová", "sk": "druhová", - "sl": "[mnogovrsten]", - "hr": "[višestruki]", - "sr": "[вишеструки]", - "mk": "[видови]", - "bg": "[различително]", - "comment": "This term is used only in some languages, for example in Polish (liczebnik wieloraki), Czech (druhová číslovka). Example: dvojaki, trojaki etc." + "sl": "ločilni", + "hr": "distributivni", + "sr": "дистрибутивни", + "mk": "разделив", + "bg": "различително", + "comment": "Examples: dvojaki, trojaki etc." }, "numeral-multiplicative": { "en": "multiplicative", @@ -1485,6 +1485,21 @@ "mk": "неопределена", "bg": "неопределително" }, + "pronoun-reciprocal": { + "en": "pronoun", + "isv": "vzajemnyj", + "ru": "взаимное", + "uk": "взаємний", + "be": "узаемны", + "pl": "zaimek", + "cs": "vzájemné", + "sk": "vzájomné", + "sl": "vzajemni", + "hr": "uzajamna", + "sr": "узајамна", + "mk": "заемна", + "bg": "реципрочно" + }, "pronoun-reflexive": { "en": "reflexive", "isv": "refleksivny", @@ -1546,49 +1561,49 @@ "bg": "въпросително" }, "verb-imperfective": { - "en": "imperfective", - "isv": "nesovršeny", - "ru": "несовершенный", - "uk": "недоконане", - "be": "недасканалы", - "pl": "niedokonany", - "cs": "nedokonavé", - "sk": "nedokonavé", - "sl": "nedovršni", - "hr": "nesvršeni", - "sr": "несвршени", - "mk": "несовршен", - "bg": "несвършен" + "en": "imperfective aspect", + "isv": "nesovršeny vid", + "ru": "несовершенный вид", + "uk": "недоконаний вид", + "be": "незакончанае трыванне", + "pl": "aspekt niedokonany", + "cs": "nedokonavý vid", + "sk": "nedokonavý vid", + "sl": "nedovršni víd", + "hr": "nesvršeni vid", + "sr": "несвршени вид", + "mk": "несовршен вид", + "bg": "несвършен вид" }, "verb-perfective": { - "en": "perfective", - "isv": "sovršeny", - "ru": "совершенный", - "uk": "доконане", - "be": "дасканалы", - "pl": "dokonany", - "cs": "dokonavé", - "sk": "dokonavé", - "sl": "dovršni", - "hr": "svršeni", - "sr": "свршени", - "mk": "совршен", - "bg": "свършен" + "en": "perfective aspect", + "isv": "sovršeny vid", + "ru": "совершенный вид", + "uk": "доконаний вид", + "be": "закончанае трыванне", + "pl": "aspekt dokonany", + "cs": "dokonavý vid", + "sk": "dokonavý vid", + "sl": "dovršni víd", + "hr": "svršeni vid", + "sr": "свршени вид", + "mk": "совршен вид", + "bg": "свършен вид" }, "verb-imperfectiveOrPerfective": { - "en": "imperfective / perfective", - "isv": "nesovršeny / sovršeny", - "ru": "несовершенный / совершенный", - "uk": "недоконане / доконане", - "be": "недасканалы / дасканалы", - "pl": "niedokonany / dokonany", - "cs": "nedokonavé / dokonavé", - "sk": "nedokonavé / dokonavé", - "sl": "nedovršni / dovršni", - "hr": "nesvršeni / svršeni", - "sr": "несвршени / свршени", - "mk": "несовршен / совршен", - "bg": "несвършен / свършен" + "en": "imperfective/perfective aspect", + "isv": "nesovršeny/sovršeny vid", + "ru": "несовершенный/совершенный вид", + "uk": "недоконаний/доконаний вид", + "be": "закончанае/незакончанае трыванне", + "pl": "aspekt niedokonany/dokonany", + "cs": "nedokonavý/dokonavý vid", + "sk": "nedokonavý/dokonavý vid", + "sl": "nedovršni/dovršni víd", + "hr": "nesvršeni/svršeni vid", + "sr": "несвршени/свршени вид", + "mk": "несовршен/совршен вид", + "bg": "несвършен/свършен вид" }, "verb-intransitive": { "en": "intransitive", @@ -1639,16 +1654,16 @@ "en": "main", "isv": "glavny", "ru": "основной", - "uk": "", + "uk": "головне", "be": "асноўны", - "pl": "", - "cs": "", - "sk": "", - "sl": "", - "hr": "", - "sr": "", - "mk": "", - "bg": "" + "pl": "główny", + "cs": "hlavní", + "sk": "hlavné", + "sl": "glavni", + "hr": "glavni", + "sr": "главни", + "mk": "главен", + "bg": "главен" }, "verb-auxiliar": { "en": "auxiliar", @@ -1809,10 +1824,10 @@ "pl": "pozytywny", "cs": "pozitiv", "sk": "pozitív", - "sl": "pozitivna", + "sl": "osnovnik", "hr": "pozitiv", "sr": "позитив", - "mk": "позитивен", + "mk": "позитив", "bg": "положителна" }, "comparative": { @@ -1821,13 +1836,13 @@ "ru": "сравнительная", "uk": "вищий", "be": "вышэйшая", - "pl": "porównanie", + "pl": "wyższy", "cs": "komparativ", "sk": "komparatív", "sl": "primernik", "hr": "komparativ", "sr": "компаратив", - "mk": "компаративен", + "mk": "компаратив", "bg": "сравнителна" }, "superlative": { @@ -1836,15 +1851,60 @@ "ru": "превосходная", "uk": "найвищий", "be": "найвышэйшая", - "pl": "doskonały", + "pl": "najwyższy", "cs": "superlativ", "sk": "superlatív", "sl": "presežnik", "hr": "superlativ", "sr": "суперлатив", - "mk": "суперлативен", + "mk": "суперлатив", "bg": "превъзходна" }, + "positive-degree": { + "en": "positive degree", + "isv": "pozitivny stupenj", + "ru": "положительная степень", + "uk": "звичайний ступінь", + "be": "звычайная ступень", + "pl": "stopień pozytywny", + "cs": "pozitiv", + "sk": "pozitív", + "sl": "osnovnik", + "hr": "pozitiv", + "sr": "позитив", + "mk": "позитив", + "bg": "положителна степен" + }, + "comparative-degree": { + "en": "comparative degree", + "isv": "sravniteljny stupenj", + "ru": "сравнительная степень", + "uk": "вищий ступінь", + "be": "вышэйшая ступень", + "pl": "stopień wyższy", + "cs": "komparativ", + "sk": "komparatív", + "sl": "primernik", + "hr": "komparativ", + "sr": "компаратив", + "mk": "компаратив", + "bg": "сравнителна степен" + }, + "superlative-degree": { + "en": "superlative degree", + "isv": "superlativny stupenj", + "ru": "превосходная степень", + "uk": "найвищий ступінь", + "be": "найвышэйшая ступень", + "pl": "stopień najwyższy", + "cs": "superlativ", + "sk": "superlatív", + "sl": "presežnik", + "hr": "superlativ", + "sr": "суперлатив", + "mk": "суперлатив", + "bg": "превъзходна степен" + }, "present": { "en": "present", "isv": "nastoječe", @@ -3213,7 +3273,7 @@ }, "wordErrorEmptyTextValidation": { "en": "Enter the text", - "isv": "Vpiši tekst", + "isv": "Vpišite tekst", "ru": "Введите текст", "uk": "Введіть текст", "be": "Увядзіце тэкст", @@ -3228,7 +3288,7 @@ }, "sendErrorConfirmExit": { "en": "The entered data was not sent. Are you sure you want to close the window?", - "isv": "Vpisane dane ne byli poslane. Napravdu li hočeš zatvoriti okno?", + "isv": "Vpisane dane ne byli poslane. Napravdu li hočete zatvoriti okno?", "ru": "Введённые данные не отправлены. Вы уверены что хотите закрыть окно?", "uk": "Введені дані не були надіслані. Ви впевнені, що хочете закрити вікно?", "be": "Уведзеныя даныя не былі адпраўленыя. Вы ўпэўнены, што хочаце зачыніць акно?", @@ -3273,7 +3333,7 @@ }, "captchaError": { "en": "Сonfirm you are not a robot", - "isv": "Podtvrdi, že ne jesi robot", + "isv": "Podtvrdite, že ne jeste robot", "ru": "Подтвердите, что вы не робот", "uk": "Підтвердьте, що ви не робот", "be": "Пацвердзіце, што вы не робат", @@ -3420,5 +3480,665 @@ "sr": "Реч није универзално разумљива у свим словенским језицима", "mk": "Зборот не е универзално разбирлив во сите словенски јазици", "bg": "Думата не е универсално разбираема във всички слаавянски езици" + }, + "abbr-adjective": { + "en": "adj.", + "isv": "prid.", + "ru": "прил.", + "uk": "прикм.", + "be": "прым.", + "pl": "przym.", + "cs": "příd.", + "sk": "príd.", + "sl": "prid.", + "hr": "prid.", + "sr": "прид.", + "mk": "прид.", + "bg": "прил." + }, + "abbr-adverb": { + "en": "adv.", + "isv": "prisl.", + "ru": "нареч.", + "uk": "присл.", + "be": "прысл.", + "pl": "przysł.", + "cs": "přísl.", + "sk": "prísl.", + "sl": "prisl.", + "hr": "pril.", + "sr": "прил.", + "mk": "прилог", + "bg": "наречие" + }, + "abbr-comparative-degree": { + "en": "comp.", + "isv": "sravn.", + "ru": "сравн.", + "uk": "вищ.", + "be": "выш.", + "pl": "porów.", + "cs": "komp.", + "sk": "komp.", + "sl": "prim.", + "hr": "komp.", + "sr": "комп.", + "mk": "комп.", + "bg": "сравн." + }, + "abbr-conjunction": { + "en": "conj.", + "isv": "sveznik", + "ru": "союз", + "uk": "спол.", + "be": "злуч.", + "pl": "spójnik", + "cs": "spojka", + "sk": "spojka", + "sl": "veznik", + "hr": "veznik", + "sr": "везник", + "mk": "сврзник", + "bg": "съюз" + }, + "abbr-interjection": { + "en": "intj.", + "isv": "medž.", + "ru": "межд.", + "uk": "вигук", + "be": "выкл.", + "pl": "wykrz.", + "cs": "citosl.", + "sk": "citosl.", + "sl": "medm.", + "hr": "usklik", + "sr": "узвик", + "mk": "извик", + "bg": "межд." + }, + "abbr-pronoun-reflexive": { + "en": "refl.", + "isv": "refl.", + "ru": "возвр.", + "uk": "звор.", + "be": "звар.", + "pl": "zwr.", + "cs": "zvr.", + "sk": "zvr.", + "sl": "povr.", + "hr": "povr.", + "sr": "повр.", + "mk": "повр.", + "bg": "възвр." + }, + "abbr-pronoun-reciprocal": { + "en": "rec.", + "isv": "vzaj.", + "ru": "взаим.", + "uk": "взаєм.", + "be": "узаем.", + "pl": "wzajem.", + "cs": "vzájem.", + "sk": "vzájom.", + "sl": "vzaj.", + "hr": "uzaj.", + "sr": "узај.", + "mk": "заем.", + "bg": "реципр." + }, + "abbr-pronoun-relative": { + "en": "rel.", + "isv": "rel.", + "ru": "отн.", + "uk": "відн.", + "be": "адн.", + "pl": "wzgl.", + "cs": "vstaž.", + "sk": "vzťaž.", + "sl": "ozir.", + "hr": "odn.", + "sr": "одн.", + "mk": "одн.", + "bg": "отн." + }, + "abbr-suffix": { + "en": "suffix", + "isv": "sufiks", + "ru": "суффикс", + "uk": "суфікс", + "be": "суфікс", + "pl": "sufiks", + "cs": "přípona", + "sk": "prípona", + "sl": "pripona", + "hr": "sufiks", + "sr": "суфикс", + "mk": "суфикс", + "bg": "наставка" + }, + "abbr-superlative-degree": { + "en": "sup.", + "isv": "sup.", + "ru": "прев.", + "uk": "найв.", + "be": "найв.", + "pl": "dosk.", + "cs": "sup.", + "sk": "sup.", + "sl": "pres.", + "hr": "sup.", + "sr": "суп.", + "mk": "суп.", + "bg": "прев." + }, + "abbr-verb": { + "en": "v.", + "isv": "gl.", + "ru": "гл.", + "uk": "д.", + "be": "дз.", + "pl": "cz.", + "cs": "sl.", + "sk": "sl.", + "sl": "gl.", + "hr": "gl.", + "sr": "гл.", + "mk": "гл.", + "bg": "гл." + }, + "abbr-verb-auxiliar": { + "en": "aux.", + "isv": "pom.", + "ru": "вспом.", + "uk": "допом.", + "be": "дапам.", + "pl": "pom.", + "cs": "pom.", + "sk": "pom.", + "sl": "pom.", + "hr": "pom.", + "sr": "пом.", + "mk": "пом.", + "bg": "спом." + }, + "abbr-verb-imperfective": { + "en": "ipf.", + "isv": "nesov.", + "ru": "несов.", + "uk": "недок.", + "be": "незак.", + "pl": "niedok.", + "cs": "nedok.", + "sk": "nedok.", + "sl": "nedov.", + "hr": "nesv.", + "sr": "несв.", + "mk": "несов.", + "bg": "несв." + }, + "abbr-verb-imperfectiveOrPerfective": { + "en": "ipf./pf.", + "isv": "nesov./sov.", + "ru": "несов./сов.", + "uk": "недок./док.", + "be": "незак./зак.", + "pl": "niedok./dok.", + "cs": "nedok./dok.", + "sk": "nedok./dok.", + "sl": "nedov./dov.", + "hr": "nesv./sv.", + "sr": "несв./св.", + "mk": "несов./сов.", + "bg": "несв./св." + }, + "abbr-verb-intransitive": { + "en": "intr.", + "isv": "nepr.", + "ru": "непер.", + "uk": "непер.", + "be": "непер.", + "pl": "nieprz.", + "cs": "nepř.", + "sk": "nepr.", + "sl": "nepr.", + "hr": "nepr.", + "sr": "непр.", + "mk": "непр.", + "bg": "непр." + }, + "abbr-verb-perfective": { + "en": "pf.", + "isv": "sov.", + "ru": "сов.", + "uk": "док.", + "be": "зак.", + "pl": "dok.", + "cs": "dok.", + "sk": "dok.", + "sl": "dov.", + "hr": "sv.", + "sr": "св.", + "mk": "сов.", + "bg": "св." + }, + "abbr-verb-reflexive": { + "en": "refl.", + "isv": "svr.", + "ru": "возвр.", + "uk": "звор.", + "be": "звар.", + "pl": "zwr.", + "cs": "zvr.", + "sk": "zvr.", + "sl": "povr.", + "hr": "povr.", + "sr": "повр.", + "mk": "повр.", + "bg": "възвр." + }, + "abbr-noun-animated": { + "en": "anim.", + "isv": "živ.", + "ru": "одуш.", + "uk": "жив.", + "be": "адуш.", + "pl": "żyw.", + "cs": "živ.", + "sk": "živ.", + "sl": "živ.", + "hr": "živ.", + "sr": "жив.", + "mk": "жив.", + "bg": "одуш." + }, + "abbr-noun-neuter": { + "en": "n.", + "isv": "sr.", + "ru": "ср.", + "uk": "сер.", + "be": "н.", + "pl": "n.", + "cs": "st.", + "sk": "sr.", + "sl": "sr.", + "hr": "sr.", + "sr": "ср.", + "mk": "ср.", + "bg": "ср." + }, + "abbr-noun-feminine": { + "en": "f.", + "isv": "ž.", + "ru": "ж.", + "uk": "жін.", + "be": "ж.", + "pl": "ż.", + "cs": "ž.", + "sk": "ž.", + "sl": "ž.", + "hr": "ž.", + "sr": "ж.", + "mk": "ж.", + "bg": "ж." + }, + "abbr-noun-indeclinable": { + "en": "indecl.", + "isv": "neskl.", + "ru": "нескл.", + "uk": "невідм.", + "be": "нескл.", + "pl": "nieodm.", + "cs": "neskl.", + "sk": "neskl.", + "sl": "nedol.", + "hr": "neskl.", + "sr": "непр.", + "mk": "немен.", + "bg": "нескл." + }, + "abbr-noun-masculine": { + "en": "m.", + "isv": "m.", + "ru": "м.", + "uk": "чол.", + "be": "м.", + "pl": "m.", + "cs": "m.", + "sk": "m.", + "sl": "m.", + "hr": "m.", + "sr": "м.", + "mk": "м.", + "bg": "м." + }, + "abbr-noun-masculineOrFeminine": { + "en": "m./f.", + "isv": "m./ž.", + "ru": "м./ж.", + "uk": "чол./жін.", + "be": "м./ж.", + "pl": "m./ż.", + "cs": "m./ž.", + "sk": "m./ž.", + "sl": "m./ž.", + "hr": "m./ž.", + "sr": "м./ж.", + "mk": "м./ж.", + "bg": "м./ж." + }, + "abbr-noun-plural": { + "en": "pl.", + "isv": "mn.", + "ru": "мн.", + "uk": "мн.", + "be": "мн.", + "pl": "mn.", + "cs": "mn.", + "sk": "mn.", + "sl": "mn.", + "hr": "mn.", + "sr": "мн.", + "mk": "мн.", + "bg": "мн." + }, + "abbr-noun-singular": { + "en": "sg.", + "isv": "jed.", + "ru": "ед.", + "uk": "одн.", + "be": "адз.", + "pl": "pojed.", + "cs": "jed.", + "sk": "jed.", + "sl": "ed.", + "hr": "jed.", + "sr": "јед.", + "mk": "ед.", + "bg": "ед." + }, + "abbr-numeral": { + "en": "num.", + "isv": "čisl.", + "ru": "числ.", + "uk": "числ.", + "be": "ліч.", + "pl": "licz.", + "cs": "čísl.", + "sk": "čisl.", + "sl": "št.", + "hr": "broj", + "sr": "број", + "mk": "број", + "bg": "числ." + }, + "abbr-numeral-cardinal": { + "en": "card.", + "isv": "kol.", + "ru": "кол.", + "uk": "кіл.", + "be": "кол.", + "pl": "głów.", + "cs": "zákl.", + "sk": "zákl.", + "sl": "glav.", + "hr": "osn.", + "sr": "осн.", + "mk": "осн.", + "bg": "бройн." + }, + "abbr-numeral-collective": { + "en": "coll.", + "isv": "sbor.", + "ru": "соб.", + "uk": "збір.", + "be": "збор.", + "pl": "zbior.", + "cs": "soub.", + "sk": "súb.", + "sl": "loč.", + "hr": "zb.", + "sr": "зб.", + "mk": "кол.", + "bg": "събир." + }, + "abbr-numeral-differential": { + "en": "diff.", + "isv": "razl.", + "ru": "вид.", + "uk": "вид.", + "be": "від.", + "pl": "wielor.", + "cs": "druh.", + "sk": "druh.", + "sl": "mnogovr.", + "hr": "višest.", + "sr": "вишест.", + "mk": "вид.", + "bg": "разл." + }, + "abbr-numeral-fractional": { + "en": "fract.", + "isv": "ulom.", + "ru": "дроб.", + "uk": "дроб.", + "be": "дроб.", + "pl": "ułam.", + "cs": "podíl.", + "sk": "zlom.", + "sl": "del.", + "hr": "razl.", + "sr": "разл.", + "mk": "дроб.", + "bg": "дроб." + }, + "abbr-numeral-multiplicative": { + "en": "mult.", + "isv": "množ.", + "ru": "множ.", + "uk": "мульт.", + "be": "мульт.", + "pl": "mnoż.", + "cs": "násob.", + "sk": "násob.", + "sl": "množ.", + "hr": "množ.", + "sr": "мулт.", + "mk": "множ.", + "bg": "умнож." + }, + "abbr-numeral-ordinal": { + "en": "ord.", + "isv": "pored.", + "ru": "поряд.", + "uk": "пор.", + "be": "парад.", + "pl": "porząd.", + "cs": "řad.", + "sk": "rad.", + "sl": "vrst.", + "hr": "red.", + "sr": "ред.", + "mk": "ред.", + "bg": "ред." + }, + "abbr-numeral-substantivized": { + "en": "subst.", + "isv": "subst.", + "ru": "субст.", + "uk": "субст.", + "be": "субст.", + "pl": "rzecz.", + "cs": "subst.", + "sk": "subst.", + "sl": "sam.", + "hr": "supst.", + "sr": "супст.", + "mk": "супст.", + "bg": "субст." + }, + "abbr-particle": { + "en": "particle", + "isv": "čestica", + "ru": "частица", + "uk": "частка", + "be": "часціца", + "pl": "part.", + "cs": "částice", + "sk": "častica", + "sl": "členek", + "hr": "čestica", + "sr": "речца", + "mk": "честичка", + "bg": "частица" + }, + "abbr-phrase": { + "en": "phrase", + "isv": "izraz", + "ru": "фраза", + "uk": "фраза", + "be": "выраз", + "pl": "wyrażenie", + "cs": "fráze", + "sk": "fráza", + "sl": "stavek", + "hr": "izraz", + "sr": "фраза", + "mk": "фраза", + "bg": "фраза" + }, + "abbr-prefix": { + "en": "prefix", + "isv": "prědrastka", + "ru": "приставка", + "uk": "префікс", + "be": "прыстаўка", + "pl": "przedrostek", + "cs": "předpona", + "sk": "predpona", + "sl": "predpona", + "hr": "prefiks", + "sr": "префикс", + "mk": "претставка", + "bg": "представка" + }, + "abbr-preposition": { + "en": "prep.", + "isv": "prědl.", + "ru": "предл.", + "uk": "прийм.", + "be": "прын.", + "pl": "przyimek", + "cs": "předl.", + "sk": "predl.", + "sl": "predlog", + "hr": "prijedlog", + "sr": "предлог", + "mk": "предлог", + "bg": "предлог" + }, + "abbr-pronoun": { + "en": "pron.", + "isv": "zaim.", + "ru": "мест.", + "uk": "займ.", + "be": "займ.", + "pl": "zaim.", + "cs": "zájm.", + "sk": "zám.", + "sl": "zaim.", + "hr": "zamj.", + "sr": "зам.", + "mk": "зам.", + "bg": "мест." + }, + "abbr-pronoun-demonstrative": { + "en": "dem.", + "isv": "ukaz.", + "ru": "указ.", + "uk": "вказ.", + "be": "указ.", + "pl": "wskaz.", + "cs": "ukaz.", + "sk": "ukaz.", + "sl": "kaz.", + "hr": "pokaz.", + "sr": "показ.", + "mk": "показ.", + "bg": "показ." + }, + "abbr-pronoun-indefinite": { + "en": "indef.", + "isv": "neozn.", + "ru": "неопр.", + "uk": "неозн.", + "be": "неазн.", + "pl": "nieokr.", + "cs": "neur.", + "sk": "neur.", + "sl": "nedol.", + "hr": "neod.", + "sr": "неод.", + "mk": "неопр.", + "bg": "неопр." + }, + "abbr-pronoun-interrogative": { + "en": "int.", + "isv": "pyt.", + "ru": "вопр.", + "uk": "пит.", + "be": "пыт.", + "pl": "pyt.", + "cs": "táz.", + "sk": "opyt.", + "sl": "vpr.", + "hr": "upit.", + "sr": "упит.", + "mk": "праш.", + "bg": "въпр." + }, + "abbr-pronoun-personal": { + "en": "pers.", + "isv": "osob.", + "ru": "личн.", + "uk": "особ.", + "be": "асаб.", + "pl": "osob.", + "cs": "osob.", + "sk": "osob.", + "sl": "oseb.", + "hr": "osob.", + "sr": "личн.", + "mk": "личн.", + "bg": "личн." + }, + "abbr-pronoun-possessive": { + "en": "poss.", + "isv": "prisv.", + "ru": "прит.", + "uk": "присв.", + "be": "прын.", + "pl": "dzier.", + "cs": "přivl.", + "sk": "privl.", + "sl": "svoj.", + "hr": "prisv.", + "sr": "присв.", + "mk": "присв.", + "bg": "прит." + }, + "abbr-verb-transitive": { + "en": "tr.", + "isv": "pr.", + "ru": "пер.", + "uk": "пер.", + "be": "пер.", + "pl": "prz.", + "cs": "př.", + "sk": "pr.", + "sl": "pr.", + "hr": "pr.", + "sr": "пр.", + "mk": "пр.", + "bg": "пр." } } diff --git a/src/utils/abbreviations/analyzeAbbr.ts b/src/utils/abbreviations/analyzeAbbr.ts new file mode 100644 index 000000000..516d348ca --- /dev/null +++ b/src/utils/abbreviations/analyzeAbbr.ts @@ -0,0 +1,75 @@ +import { + getGender, + getNumeralType, + getPartOfSpeech, + getPronounType, + getVerbDetails, + isAnimated, + isComparative, + isIndeclinable, + isPlural, + isSingular, + isSuperlative +} from "../wordDetails"; + +const t = (key: string): string => key; + +export function analyzeAbbr(abbr: string): string[] { + const pos = getPartOfSpeech(abbr); + if (!pos) { + return []; + } + + const arr = [t(pos)]; + switch (pos) { + case 'noun': { + const gender = getGender(abbr); + const animated = isAnimated(abbr); + arr.push(t('noun-' + gender)); + if (gender.startsWith('masculine')) { + arr.push(t(animated ? 'noun-animated' : 'noun-inanimate')); + } + if (isIndeclinable(abbr)) { + arr.push(t('noun-indeclinable')); + } + if (isPlural(abbr)) { + arr.push(t('noun-plural')); + } + if (isSingular(abbr)) { + arr.push(t('noun-singular')); + } + break; + } + case 'adjective': { + if (isComparative(abbr)) { + arr.push(t('comparative-degree')); + } else if (isSuperlative(abbr)) { + arr.push(t('superlative-degree')); + } + break; + } + case 'verb': { + const verbDetails = getVerbDetails(abbr); + if (verbDetails) { + arr.push(...verbDetails.map((e) => t('verb-' + e))); + } + break; + } + case 'numeral': { + const numeralType = getNumeralType(abbr); + if (numeralType) { + arr.push(t('numeral-' + numeralType)); + } + break; + } + case 'pronoun': { + const pronounType = getPronounType(abbr); + if (pronounType) { + arr.push(t('pronoun-' + pronounType)); + } + break; + } + } + + return arr; +} diff --git a/src/utils/abbreviations/expandAbbr.test.ts b/src/utils/abbreviations/expandAbbr.test.ts new file mode 100644 index 000000000..39a12090b --- /dev/null +++ b/src/utils/abbreviations/expandAbbr.test.ts @@ -0,0 +1,73 @@ +import { setLang, t } from "translations"; + +import { expandAbbr } from "./expandAbbr"; + +describe('expandAbbr', () => { + beforeAll(() => { + setLang('en'); + }); + + test.each([ + ['adj.', ['adjective']], + ['adj.comp.', ['adjective', 'comparative-degree']], + ['adj.sup.', ['adjective', 'superlative-degree']], + ['adv.', ['adverb']], + ['conj.', ['conjunction']], + ['f.', ['noun', 'noun-feminine']], + ['f.indecl.', ['noun', 'noun-feminine', 'noun-indeclinable']], + ['f.pl.', ['noun', 'noun-feminine', 'noun-plural']], + ['f.sg.', ['noun', 'noun-feminine', 'noun-singular']], + ['intj.', ['interjection']], + ['m.', ['noun', 'noun-masculine', 'noun-inanimate']], + ['m./f.', ['noun', 'noun-masculineOrFeminine', 'noun-inanimate']], + ['m.indecl./f.indecl.', ['noun', 'noun-masculine', 'noun-inanimate', 'noun-indeclinable']], // TODO: should be 'noun-masculineOrFeminine' + ['m.anim.', ['noun', 'noun-masculine', 'noun-animated']], + ['m.anim.indecl.', ['noun', 'noun-masculine', 'noun-animated', 'noun-indeclinable']], + ['m.indecl.', ['noun', 'noun-masculine', 'noun-inanimate', 'noun-indeclinable']], + ['m.pl.', ['noun', 'noun-masculine', 'noun-inanimate', 'noun-plural']], + ['m.sg.', ['noun', 'noun-masculine', 'noun-inanimate', 'noun-singular']], + ['n.', ['noun', 'noun-neuter']], + ['n.indecl.', ['noun', 'noun-neuter', 'noun-indeclinable']], + ['n.pl.', ['noun', 'noun-neuter', 'noun-plural']], + ['n.sg.', ['noun', 'noun-neuter', 'noun-singular']], + ['num.', ['numeral']], + ['num.card.', ['numeral', 'numeral-cardinal']], + ['num.coll.', ['numeral', 'numeral-collective']], + ['num.diff.', ['numeral', 'numeral-differential']], + ['num.fract.', ['numeral', 'numeral-fractional']], + ['num.mult.', ['numeral', 'numeral-multiplicative']], + ['num.ord.', ['numeral', 'numeral-ordinal']], + ['num.subst.', ['numeral', 'numeral-substantivized']], + ['particle', ['particle']], + ['phrase', ['phrase']], + ['prefix', ['prefix']], + ['prep.', ['preposition']], + ['pron.dem.', ['pronoun', 'pronoun-demonstrative']], + ['pron.indef.', ['pronoun', 'pronoun-indefinite']], + ['pron.int.', ['pronoun', 'pronoun-interrogative']], + ['pron.pers.', ['pronoun', 'pronoun-personal']], + ['pron.poss.', ['pronoun', 'pronoun-possessive']], + ['pron.rec.', ['pronoun', 'pronoun-reciprocal']], + ['pron.refl.', ['pronoun', 'pronoun-reflexive']], + ['pron.rel.', ['pronoun', 'pronoun-relative']], + ['suffix', ['suffix']], + ['v.aux. ipf.', ['verb', 'verb-auxiliar', 'verb-imperfective']], + ['v.aux. pf.', ['verb', 'verb-auxiliar', 'verb-perfective']], + ['v.intr. ipf.', ['verb', 'verb-intransitive', 'verb-imperfective']], + ['v.intr. ipf./pf.', ['verb', 'verb-intransitive', 'verb-imperfectiveOrPerfective']], + ['v.intr. pf.', ['verb', 'verb-intransitive', 'verb-perfective']], + ['v.ipf.', ['verb', 'verb-imperfective']], + ['v.pf.', ['verb', 'verb-perfective']], + ['v.refl. ipf.', ['verb', 'verb-reflexive', 'verb-imperfective']], + ['v.refl. ipf./pf.', ['verb', 'verb-reflexive', 'verb-imperfectiveOrPerfective']], + ['v.refl. pf.', ['verb', 'verb-reflexive', 'verb-perfective']], + ['v.tr. ipf.', ['verb', 'verb-transitive', 'verb-imperfective']], + ['v.tr. ipf./pf.', ['verb', 'verb-transitive', 'verb-imperfectiveOrPerfective']], + ['v.tr. pf.', ['verb', 'verb-transitive', 'verb-perfective']], + ['invalid', []], + ['', []], + ])('should expand abbreviation %s correctly', (abbr, expectedParts) => { + const expected = expectedParts.map(key => t(key)).join(', '); + expect(expandAbbr(abbr)).toEqual(expected); + }); +}); diff --git a/src/utils/abbreviations/expandAbbr.ts b/src/utils/abbreviations/expandAbbr.ts new file mode 100644 index 000000000..772032bba --- /dev/null +++ b/src/utils/abbreviations/expandAbbr.ts @@ -0,0 +1,14 @@ +import { t } from "translations"; + +import { analyzeAbbr } from "./analyzeAbbr"; + +export function expandAbbr(abbr: string): string { + const analyzed = analyzeAbbr(abbr); + + return analyzed.filter(shouldBeShownToUser).map((key) => t(key)).join(', '); +} + +function shouldBeShownToUser(verbModifier: string): boolean { + // "main verb" (as opposed to auxiliary) doesn't make sense to show in the UI + return verbModifier !== 'verb-main'; +} diff --git a/src/utils/abbreviations/index.ts b/src/utils/abbreviations/index.ts new file mode 100644 index 000000000..36ed8622f --- /dev/null +++ b/src/utils/abbreviations/index.ts @@ -0,0 +1,2 @@ +export { expandAbbr } from './expandAbbr'; +export { translateAbbr } from './translateAbbr'; diff --git a/src/utils/abbreviations/translateAbbr.test.ts b/src/utils/abbreviations/translateAbbr.test.ts new file mode 100644 index 000000000..e38d11161 --- /dev/null +++ b/src/utils/abbreviations/translateAbbr.test.ts @@ -0,0 +1,72 @@ +import { setLang, t } from "translations"; + +import { translateAbbr } from "./translateAbbr"; + +describe('translateAbbr', () => { + beforeAll(() => { + setLang('en'); + }); + + test.each([ + ['adj.', 'adj.'], + ['adj.comp.', 'adj. comp.'], + ['adj.sup.', 'adj. sup.'], + ['adv.', 'adv.'], + ['conj.', 'conj.'], + ['f.', 'f.'], + ['f.indecl.', 'f. indecl.'], + ['f.pl.', 'f. pl.'], + ['f.sg.', 'f. sg.'], + ['intj.', 'intj.'], + ['m.', 'm.'], + ['m./f.', 'm./f.'], + ['m.indecl./f.indecl.', 'm. indecl.'], // TODO: should be 'm./f. indecl.' + ['m.anim.', 'm. anim.'], + ['m.anim.indecl.', 'm. anim. indecl.'], + ['m.indecl.', 'm. indecl.'], + ['m.pl.', 'm. pl.'], + ['m.sg.', 'm. sg.'], + ['n.', 'n.'], + ['n.indecl.', 'n. indecl.'], + ['n.pl.', 'n. pl.'], + ['n.sg.', 'n. sg.'], + ['num.', 'num.'], + ['num.card.', 'num. card.'], + ['num.coll.', 'num. coll.'], + ['num.diff.', 'num. diff.'], + ['num.fract.', 'num. fract.'], + ['num.mult.', 'num. mult.'], + ['num.ord.', 'num. ord.'], + ['num.subst.', 'num. subst.'], + ['particle', 'particle'], + ['phrase', 'phrase'], + ['prefix', 'prefix'], + ['prep.', 'prep.'], + ['pron.dem.', 'pron. dem.'], + ['pron.indef.', 'pron. indef.'], + ['pron.int.', 'pron. int.'], + ['pron.pers.', 'pron. pers.'], + ['pron.poss.', 'pron. poss.',], + ['pron.rec.', 'pron. rec.'], + ['pron.refl.', 'pron. refl.'], + ['pron.rel.', 'pron. rel.'], + ['suffix', 'suffix'], + ['v.aux. ipf.', 'v. aux. ipf.'], + ['v.aux. pf.', 'v. aux. pf.'], + ['v.intr. ipf.', 'v. intr. ipf.'], + ['v.intr. ipf./pf.', 'v. intr. ipf./pf.'], + ['v.intr. pf.', 'v. intr. pf.'], + ['v.ipf.', 'v. ipf.'], + ['v.pf.', 'v. pf.'], + ['v.refl. ipf.', 'v. refl. ipf.'], + ['v.refl. ipf./pf.', 'v. refl. ipf./pf.'], + ['v.refl. pf.', 'v. refl. pf.'], + ['v.tr. ipf.', 'v. tr. ipf.'], + ['v.tr. ipf./pf.', 'v. tr. ipf./pf.'], + ['v.tr. pf.', 'v. tr. pf.'], + ['invalid', 'invalid'], + ['', ''], + ])('should expand abbreviation %s correctly', (abbr, expected) => { + expect(translateAbbr(abbr)).toEqual(expected); + }); +}); diff --git a/src/utils/abbreviations/translateAbbr.ts b/src/utils/abbreviations/translateAbbr.ts new file mode 100644 index 000000000..b9b0554f9 --- /dev/null +++ b/src/utils/abbreviations/translateAbbr.ts @@ -0,0 +1,17 @@ +import { t } from "translations"; + +import { analyzeAbbr } from "./analyzeAbbr"; + +export function translateAbbr(abbr: string): string { + const analyzed = analyzeAbbr(abbr); + if (analyzed.length === 0) { + return abbr; + } + + return analyzed.filter(shouldBeShownInAbbreviation).map((key) => t(`abbr-${key}`)).join(' '); +} + +function shouldBeShownInAbbreviation(key: string): boolean { + return key !== 'verb-main' && key !== 'noun' && key !== 'noun-inanimate'; +} + diff --git a/src/utils/wordDetails/wordDetails.ts b/src/utils/wordDetails/wordDetails.ts index 1979cd388..cb9b624fe 100644 --- a/src/utils/wordDetails/wordDetails.ts +++ b/src/utils/wordDetails/wordDetails.ts @@ -221,6 +221,9 @@ export function getPronounType(details: string): string { if (arr.includes('refl')) { return 'reflexive'; } + if (arr.includes('rec')) { + return 'reciprocal'; + } if (arr.includes('rel')) { return 'relative'; }