unisex words and 2 levels on gendering game

This commit is contained in:
lingdocs 2021-09-01 17:22:37 +04:00
parent 4d2c91e290
commit 0410642492
17 changed files with 449 additions and 150 deletions

View File

@ -16,14 +16,14 @@ const pConsonants = ["ب", "پ", "ت", "ټ", "ث", "ج", "چ", "ح", "خ", "څ",
fetch(process.env.LINGDOCS_DICTIONARY_URL).then(res => res.arrayBuffer()).then(data => {
const { entries } = readDictionary(data);
const filtered = entries.filter(e => (
e.c?.startsWith("n. f.") && pConsonants.includes(e.p.slice(-1))
e.c === "n. m." && ["ا", "ه", "ي"].includes(e.p.slice(-1)) && (!["u", "h"].includes(e.g.slice(-1)))
));
const content = `module.exports = [
${filtered.reduce((text, entry) => (
text + `{ ts: ${entry.ts}, e: \`${entry.e.replace(/"/g, '\\"')}\` }, // ${entry.p} - ${entry.f}
`), "")}
];`;
fs.writeFileSync(path.join(verbsPath, "my-words.js"), content);
fs.writeFileSync(path.join(verbsPath, "query-results.js"), content);
});
// function getFromTsS(entries) {

View File

@ -11,7 +11,6 @@ import TableOfContents from "./TableOfContents";
import Footer from "./Footer";
const Chapter = ({ children: chapter }) => {
console.log(chapter)
const Content = chapter.content;
function handleShare() {
if (!navigator.share) {

View File

@ -32,6 +32,11 @@ function Game<T>({ questions, Display, timeLimit, Instructions }: GameInput<T>)
// post results
setFinish("pass");
rewardRef.current?.rewardMe();
setCurrent(undefined);
}
function handleQuit() {
setFinish(null);
setCurrent(undefined);
}
function handleRestart() {
const newQuestionBox = questions();
@ -64,8 +69,8 @@ function Game<T>({ questions, Display, timeLimit, Instructions }: GameInput<T>)
<div className="progress" style={{ height: "5px" }}>
<div className={`progress-bar bg-${progressColor}`} role="progressbar" style={{ width: getProgressWidth() }} />
</div>
<div className="d-flex flex-row-reverse mt-2">
{current && <CountdownCircleTimer
{current && <div className="d-flex flex-row-reverse mt-2">
<CountdownCircleTimer
key={timerKey}
isPlaying={!!current && !finish}
size={30}
@ -74,20 +79,23 @@ function Game<T>({ questions, Display, timeLimit, Instructions }: GameInput<T>)
duration={timeLimit}
colors="#555555"
onComplete={handleTimeOut}
/>}
</div>
/>
{!finish && <button onClick={handleQuit} className="btn btn-outline-secondary btn-sm mr-2">Quit</button>}
</div>}
<Reward ref={rewardRef} config={{ lifetime: 130, spread: 90, elementCount: 125 }} type="confetti">
<div className="py-3">
{finish === null &&
(current
? <Display question={current.question} callback={handleCallback} />
? <div>
<Display question={current.question} callback={handleCallback} />
</div>
: <div>
<div>
<div className="pt-3">
{/* TODO: ADD IN TEXT DISPLAY OPTIONS HERE TOO - WHEN WE START USING THEM*/}
<Instructions />
</div>
<div>
<button className="btn btn-primary mt-4" onClick={handleAdvance}>Start</button>
<button className="btn btn-primary mt-4" onClick={handleRestart}>Start</button>
</div>
</div>)
}
@ -115,7 +123,7 @@ function failMessage(progress: Progress | undefined, finish: "time out" | "fail"
: pDone < 55
? { message: "Fail", face: "😕" }
: pDone < 78
? { message: "You've almost got it!", face: "😩" }
? { message: "You almost got it!", face: "😩" }
: { message: "Nooo! So close!", face: "😭" };
return finish === "fail"
? `${message} ${face}`

View File

@ -9,9 +9,11 @@ import {
Types as T,
Examples,
defaultTextOptions as opts,
removeFVariants,
} from "@lingdocs/pashto-inflector";
import words from "../words/nouns-adjs";
import {
firstVariation,
} from "../lib/text-tools";
// const masc = words.filter((w) => w.entry.c === "n. m.");
// const fem = words.filter((w) => w.entry.c === "n. f.");
@ -32,47 +34,70 @@ const types: Record<string, CategorySet> = {
},
// TODO add ې fem words and balance gender
};
const exceptions: Record<string, CategorySet> = {
masc: {
exceptionPeopleMasc: words.filter((w) => w.category === "exception-people-masc"),
},
fem: {
consonantFem: words.filter((w) => w.category === "consonant-fem"),
exceptionPeopleFem: words.filter((w) => w.category === "exception-people-fem"),
},
}
// consonantFem: words.filter((w) => w.category === "consonant-fem"),
const amount = 40;
function* questions () {
const wordPool = {...types};
for (let i = 0; i < amount; i++) {
const gender = getRandomFromList(Object.keys(wordPool));
const typeToUse = getRandomFromList(Object.keys(wordPool[gender]));
const question = getRandomFromList(wordPool[gender][typeToUse]).entry;
wordPool[gender][typeToUse] = wordPool[gender][typeToUse].filter(({ entry }) => entry.ts !== question.ts);
yield {
progress: makeProgress(i, amount),
question,
};
export default function({level}: { level: 1 | 2 }) {
function* questions () {
const wordPool = {...types};
for (let i = 0; i < amount; i++) {
const base = level === 1
? wordPool
: getRandomFromList([wordPool, exceptions]);
const gender = getRandomFromList(Object.keys(base));
const typeToUse = getRandomFromList(Object.keys(base[gender]));
const question = getRandomFromList(base[gender][typeToUse]).entry;
base[gender][typeToUse] = base[gender][typeToUse].filter(({ entry }) => entry.ts !== question.ts);
yield {
progress: makeProgress(i, amount),
question,
};
}
}
}
function Display({ question, callback }: QuestionDisplayProps<T.DictionaryEntry>) {
function check(gender: "m" | "f") {
callback(!!question.c?.includes(gender));
function Display({ question, callback }: QuestionDisplayProps<T.DictionaryEntry>) {
function check(gender: "m" | "f") {
callback(!!question.c?.includes(gender));
}
return <div>
<div className="mb-4" style={{ fontSize: "larger" }}>
<Examples opts={opts}>{[
{
p: firstVariation(question.p),
f: firstVariation(question.f),
e: level === 2 ? firstVariation(question.e) : undefined,
}
]}</Examples>
</div>
<div className="mt-4">
<button style={{ background: genderColors.f, color: "black" }} className="btn btn-lg mr-3" onClick={() => check("f")}>Feminine</button>
<button style={{ background: genderColors.m, color: "black" }} className="btn btn-lg ml-3" onClick={() => check("m")}>Masculine</button>
</div>
</div>
}
return <div>
<div className="mb-4">
<Examples opts={opts}>{[
removeFVariants({ p: question.p, f: question.f })
]}</Examples>
function Instructions() {
return <div>
<h4>Choose the right gender for each word</h4>
{level === 2 && <div> Exceptions included...</div>}
</div>
<div className="mt-4">
<button style={{ background: genderColors.f, color: "black" }} className="btn btn-lg mr-3" onClick={() => check("f")}>Feminine</button>
<button style={{ background: genderColors.m, color: "black" }} className="btn btn-lg ml-3" onClick={() => check("m")}>Masculine</button>
</div>
</div>
}
}
function Instructions() {
return <h4>
Choose the right gender for each word
</h4>;
}
export default function() {
return <Game questions={questions} Display={Display} timeLimit={65} Instructions={Instructions} />
return <Game
questions={questions}
Display={Display}
timeLimit={level === 1 ? 65 : 85}
Instructions={Instructions}
/>
};

View File

@ -0,0 +1,35 @@
import React from "react";
import {
InlinePs,
defaultTextOptions as opts,
} from "@lingdocs/pashto-inflector";
import genderColors from "../lib/gender-colors";
export default function GenderTable({ rows }) {
return <table className="table" style={{ tableLayout: "fixed" }}>
<thead>
<tr>
<th scope="col">Masculine</th>
<th scope="col">Feminine</th>
</tr>
</thead>
<tbody>
{rows.map((row, i) => (
<tr key={`gender-row${i}`}>
{["masc", "fem"].map((gender) => {
const item = row[gender];
return <td key={`row-${i}-${gender}`} style={{ background: genderColors[gender === "masc" ? "m" : "f"] }}>
{item.ending && <div>
{typeof item.ending === "string" ? item.ending
: <InlinePs opts={opts}>{item.ending}</InlinePs>}
</div>}
<div>
{item.ending ? "eg. " : ""}<InlinePs opts={opts}>{item.ex}</InlinePs>
</div>
</td>
})}
</tr>
))}
</tbody>
</table>;
}

View File

@ -14,6 +14,7 @@ import * as subjunctiveHabitualEquative from "!babel-loader!mdx-loader!./equativ
import * as otherEquatives from "!babel-loader!mdx-loader!./equatives/other-equatives.mdx";
import * as nounsGender from "!babel-loader!mdx-loader!./nouns/nouns-gender.mdx";
import * as nounsUnisex from "!babel-loader!mdx-loader!./nouns/nouns-unisex.mdx";
import * as nounsPlural from "!babel-loader!mdx-loader!./nouns/nouns-plural.mdx";
import * as arabicPlurals from "!babel-loader!mdx-loader!./nouns/arabic-plurals.mdx";
import * as bundledPlurals from "!babel-loader!mdx-loader!./nouns/bundled-plurals.mdx";
@ -70,6 +71,10 @@ const contentTree = [
import: nounsGender,
slug: "nouns-gender",
},
{
import: nounsUnisex,
slug: "nouns-unisex",
},
{
import: nounsPlural,
slug: "nouns-plural",

View File

@ -35,7 +35,7 @@ Below are the **5 basic patterns for inflecting** nouns and adjectives. Notice h
Don't worry about memorizing them all perfectly to start. Instead keep looking back and use them as guides to help you as you get familiar with the inflections over time.
## Words ending in a consonant / <InlinePs opts={opts} ps={{ p: "ه", f: "a" }} />
## 1. Words ending in a consonant / <InlinePs opts={opts} ps={{ p: "ـه", f: "a" }} />
<InflectionCarousel items={startingWord(words, "consonant-unisex", "غټ")} />
@ -67,21 +67,21 @@ Notice how it does not use the first feminine inflection <InlinePs opts={opts} p
</details>
## Words ending in an unstressed <InlinePs opts={opts} ps={{ p: "ی", f: "ey" }} />
## 2. Words ending in an unstressed <InlinePs opts={opts} ps={{ p: "ی", f: "ey" }} />
<InflectionCarousel items={startingWord(words, "ey-unstressed-unisex", "ستړی")} />
## Words ending in a stressed <InlinePs opts={opts} ps={{ p: "ی", f: "éy" }} />
## 3. Words ending in a stressed <InlinePs opts={opts} ps={{ p: "ی", f: "éy" }} />
<InflectionCarousel items={startingWord(words, "ey-stressed-unisex", "لومړی")} />
## Words with the "Pashtun" pattern
## 4. Words with the "Pashtun" pattern
<InflectionCarousel items={startingWord(words, "aanu-unisex", "پښتون")} />
**Note**: Nouns in this pattern will often only use the first inflection for the plural. Adjectives will use the 1st inflection for all 3 reasons.
## Shorter irregular words
## 5. Shorter irregular words
<InflectionCarousel items={startingWord(words, "short-irreg-unisex", "غل")} />

View File

@ -9,9 +9,15 @@ import {
} from "@lingdocs/pashto-inflector";
import genderColors from "../../lib/gender-colors";
import GenderGame from "../../components/GenderGame";
import { firstVariation } from "../../lib/text-tools";
import GenderTable from "../../components/GenderTable";
import Link from "../../components/Link";
import words from "../../words/nouns-adjs";
export const femColor = genderColors.f;
export const mascColor = genderColors.m;
export const femEndingWConsonant = words.filter((w) => w.category === "consonant-fem");
export const Masc = () => (
<span style={{ backgroundColor: mascColor }}>masculine</span>
);
@ -24,41 +30,16 @@ All nouns in Pashto are either <Masc /> or <Fem />. Thankfully, you can pretty m
## Gender by Ending
Basically:
**<span style={{ backgroundColor: mascColor }}>Masculine</span> words end in:**
- if a noun ends in a *consonant* (including ی - y at the end) or a shwa sound <InlinePs opts={opts} ps={{ p: "ـه", f: "u" }} /> it's <Masc />
- if a noun ends in a different *vowel*, it's <Fem />
- a consonant
- <InlinePs opts={opts} ps={{ p: "ی", f: "ey" }} />
- <InlinePs opts={opts} ps={{ p: "ـه", f: "u" }} />
- <InlinePs opts={opts} ps={{ p: "وی", f: "ooy" }} /> or <InlinePs opts={opts} ps={{ p: "ای", f: "aay" }} />
Well... almost. 😉 There are a few exceptions and it's a little more complicated than that.
**<span style={{ backgroundColor: femColor }}>Feminine</span> words end in:**
export function GenderTable({ rows }) {
return <table className="table" style={{ tableLayout: "fixed" }}>
<thead>
<tr>
<th scope="col">Masculine</th>
<th scope="col">Feminine</th>
</tr>
</thead>
<tbody>
{rows.map((row, i) => (
<tr key={`gender-row${i}`}>
{["masc", "fem"].map((gender) => {
const item = row[gender];
return <td key={`row-${i}-${gender}`} style={{ background: gender === "masc" ? mascColor : femColor }}>
{item.ending && <div>
{typeof item.ending === "string" ? item.ending
: <InlinePs opts={opts}>{item.ending}</InlinePs>}
</div>}
<div>
{item.ending ? "eg. " : ""}<InlinePs opts={opts}>{item.ex}</InlinePs>
</div>
</td>
})}
</tr>
))}
</tbody>
</table>;
}
- all the other vowels (<InlinePs opts={opts} ps={{ p: "ا", f: "aa" }} />, <InlinePs opts={opts} ps={{ p: "ـه", f: "a" }} />, <InlinePs opts={opts} ps={{ p: "ي", f: "ee" }} />, <InlinePs opts={opts} ps={{ p: "ۍ", f: "uy" }} />, etc.)
<GenderTable rows={[
{
@ -123,27 +104,36 @@ export function GenderTable({ rows }) {
},
]} />
Words ending in <InlinePs opts={opts} ps={{p:"و", f:"oo"}} /> can be either <Masc /> or <Fem />.
**A couple of other things to watch out for:**
Words ending in <InlinePs opts={opts} ps={{ p: "ه", f: "u" }} /> can also be <Fem /> plural, as in <InlinePs opts={opts} ps={{ p: "اوبه", f: "oobu", e: "water" }} />
- Words ending in <InlinePs opts={opts} ps={{p:"و", f:"oo"}} /> can be either <Masc /> or <Fem />.
- Words ending in <InlinePs opts={opts} ps={{ p: "ـه", f: "u" }} /> can also be <Fem /> plural, as in <InlinePs opts={opts} ps={{ p: "اوبه", f: "oobu", e: "water" }} />
**Here's a little game to practice identifying the genders of words:**
**🕹 Here's a little game to practice identifying the genders of words:**
<GenderGame />
<GenderGame level={1} />
## Exceptions
### Feminine words that lost their <InlinePs opts={opts} ps={{ p: "ه", f: "a" }} />
### Feminine words that lost their <InlinePs opts={opts} ps={{ p: "ـه", f: "a" }} />
Some <Fem /> words have had their <InlinePs opts={opts} ps={{p:"ه", f:"a"}} />'s on the end chopped off. This makes them look like masculine nouns, but actually the do behave (and get inflected) just like other feminine nouns.
Some <Fem /> words have had their <InlinePs opts={opts} ps={{p:"ـه", f:"a"}} />'s on the end chopped off. This makes them look like masculine nouns, but actually they do behave (and get inflected) just like other feminine nouns. For example, the word <InlinePs opts={opts} ps={{p:"ورځ", f:"wradz", e:"day"}} /> ends in a consanant, but it is <Fem />, and it <Link to="/inflection/inflection-intro">inflects</Link> just like any other feminine word ending with an <InlinePs opts={opts} ps={{p:"ـه", f:"a"}} />, ie. <InlinePs opts={opts} ps={{p:"ورځې", f:"wradze", e: "days - plural" }} />.
For example, the word <InlinePs opts={opts} ps={{p:"لار", f:"laar", e:"road/way"}} /> ends in a consanant, but it's feminine. 🤔 Why? It's just that the <InlinePs opts={opts} ps={{p:"ه", f:"a"}} /> on the end is usually left out. For the singular/plain form the word, you will hear people say either <InlinePs opts={opts} ps={{p:"لار", f:"laar" }} /> or <InlinePs opts={opts} ps={{p:"لاره", f:"laara" }} />, sometimes with or without the <InlinePs opts={opts} ps={{p:"ه", f:"a"}} /> on the end. But regardless, the word is always considered <Fem />, and it inflects just like any other feminine word ending with an <InlinePs opts={opts} ps={{p:"ه", f:"a"}} />. (eg. <InlinePs opts={opts} ps={{p:"لارې", f:"laare", e: "roads" }} />)
Here are some other <Fem /> words that have lost their <InlinePs opts={opts} ps={{p:"ـه", f:"a"}} /> ending:
Here are a few other <Fem /> words that have lost their <InlinePs opts={opts} ps={{p:"ه", f:"a"}} /> ending:
export function IrregularFem() {
return <ul>
{femEndingWConsonant.map(({ entry }) => (
<li key={entry.ts}>
<InlinePs opts={opts} ps={{ p: entry.p, f: firstVariation(entry.f), e: firstVariation(entry.e) }} />
</li>
))}
</ul>;
}
- <InlinePs opts={opts} ps={{p:"څنګل", f:"tsangúl", e: "elbow" }} />
- <InlinePs opts={opts} ps={{p:"غېږ", f:"gheG", e:"bosom"}} />
- <InlinePs opts={opts} ps={{p:"میاشت", f:"miyaasht", e:"month"}} />
<IrregularFem />
Note that some words can be said with or without an <InlinePs opts={opts} ps={{p:"ـه", f:"a"}} /> on the end. For instance for the word "road/way" you will hear people saying both <InlinePs opts={opts} ps={{ p: "لار", f: "laar" }} /> and <InlinePs opts={opts} ps={{ p: "لاره", f: "laara" }} />.
### Words for people
@ -174,49 +164,8 @@ Some words are used to describe people who obviously have a gender and they *tot
ex: { p: "خور", f: "khor", e: "sister" },
},
},
{
masc: {
ex: {p: "بوډا", f: "booDáa", e: "old man" },
},
fem: {
ex: {p: "بوډۍ", f: "booDúy", e: "old woman" },
},
}
]} />
But many other words for people will change and follow the rules for their masculine and feminine forms...
**🕹 Let's try the game again, this time with the exceptions included:**
<GenderTable rows={[
{
masc: {
ex: { p: "ډاکټر", f: "DakTár", e: "male doctor 👨‍⚕️" },
},
fem: {
ex: { p: "ډاکټره", f: "DakTára", e: "female doctor 👩‍⚕️" },
},
},
{
masc: {
ex: {p:"نرس", f:"nurs", e:"male nurse"},
},
fem: {
ex: {p: "نرسه", f:"nursa", e: "female nurse" },
},
},
{
masc: {
ex: {p: "ښووونکی", f:"xowóonkey", e: "male teacher 👨‍🏫" },
},
fem: {
ex: { p: "ښووونکې", f: "xowóonke", e: "female teacher 👩‍🏫" },
},
},
{
masc: {
ex: {p: "لمسی", f: "lmaséy", e: "grandson 👦"},
},
fem: {
ex: {p: "لمسۍ", f: "lmasúy", e: "granddaughter 👧"},
},
},
]} />
<GenderGame level={2} />

View File

@ -8,6 +8,7 @@ import {
defaultTextOptions as opts,
} from "@lingdocs/pashto-inflector";
import Table from "../../components/Table";
import Link from "../../components/Link";
export function PluralTable({ children, inflection }) {
return (
@ -28,11 +29,9 @@ export function PluralTable({ children, inflection }) {
In Pashto **there are many, many ways that nouns become plural**. It may seem overwhelming at first to learn *all* these different ways of nouns becoming plural. In the beginning, just look at a few. Then keep coming back and see if you're getting familiar with all the different ways that nouns become plural.
The first way is *inflect* a word if possible. Not all words inflect, but if they do, you can use the first inflection to make them plural.
## Plural by Inflection
There are lots of different ways that nouns inflect. Here are some examples using the various types of words and their inflections to show a plural meaning.
The first way is <Link to="/inflection/inflection-intro">inflect</Link> a word if possible. Not all words inflect, but if they do, you can use the first inflection to make them plural.
### With masculine nouns

View File

@ -0,0 +1,224 @@
---
title: Unisex Nouns
---
import {
Examples,
InlinePs,
defaultTextOptions as opts,
} from "@lingdocs/pashto-inflector";
import Table from "../../components/Table";
import Link from "../../components/Link";
import GenderTable from "../../components/GenderTable";
There are many words for people and animals in Pashto that can be used in both masculine and feminine forms.
## Unisex words follow inflection patterns
To make the male and female forms you just follow the <Link to="/inflection/inflection-patterns">5 inflection patterns</Link>. If you haven't mastered the <Link to="/inflection/inflection-patterns">5 inflection patterns</Link> yet, don't worry, we'll review how each of them works with the unisex nouns below.
### 1. Words ending in a consonant / <InlinePs opts={opts} ps={{ p: "ـه", f: "a" }} />
Just like with other words ending in a consonant, you add an <InlinePs opts={opts} ps={{ p: "ـه", f: "a" }} /> on the end to make them feminine.
<GenderTable rows={[
{
masc: {
ex: { p: "ډاکټر", f: "DakTár", e: "male doctor 👨‍⚕️" },
},
fem: {
ex: { p: "ډاکټره", f: "DakTára", e: "female doctor 👩‍⚕️" },
},
},
{
masc: {
ex: {p:"نرس", f:"nurs", e:"male nurse"},
},
fem: {
ex: {p: "نرسه", f:"nursa", e: "female nurse" },
},
},
]} />
### 2. Words ending in an unstressed <InlinePs opts={opts} ps={{ p: "ی", f: "ey" }} />
With the feminine form the <InlinePs opts={opts} ps={{ p: "ی", f: "ey" }} /> on the end becomes <InlinePs opts={opts} ps={{ p: "ې", f: "e" }} />.
<GenderTable rows={[
{
masc: {
ex: {
p: "ملګری",
f: "malgúrey",
e: "male friend 👦",
},
},
fem: {
ex: {
p: "ملګرې",
f: "malgúre",
e: "female friend 👧",
},
},
},
{
masc: {
ex: {p: "ښووونکی", f:"xowóonkey", e: "male teacher 👨‍🏫" },
},
fem: {
ex: { p: "ښووونکې", f: "xowóonke", e: "female teacher 👩‍🏫" },
},
},
]} />
### 3. Words ending in a stressed <InlinePs opts={opts} ps={{ p: "ی", f: "éy" }} />
If the accent comes on the end of the word, the femine form is a little different. With these words the <InlinePs opts={opts} ps={{ p: "ی", f: "éy" }} /> on the end becomes <InlinePs opts={opts} ps={{ p: "ۍ", f: "úy" }} />.
<GenderTable rows={[
{
masc: {
ex: {
p: "پاکستانی",
f: "paakistaanéy",
e: "A Pakistani man",
},
},
fem: {
ex: {
p: "پاکستانۍ",
f: "paakistaanúy",
e: "A Pakistani woman",
},
},
},
{
masc: {
ex: {p: "لمسی", f: "lmaséy", e: "grandson 👦"},
},
fem: {
ex: {p: "لمسۍ", f: "lmasúy", e: "granddaughter 👧"},
},
},
]} />
### 4. Words with the "Pashtun" pattern
Well...
<GenderTable rows={[
{
masc: {
ex: {
p: "پښتون",
f: "puxtóon",
e: "a male Pashtun",
},
},
fem: {
ex: {
p: "پښتنه",
f: "puxtaná",
e: "a female Pashtun",
},
},
},
{
masc: {
ex: {
p: "شپون",
f: "shpoon",
e: "male shepherd",
},
},
fem: {
ex: {
p: "شپنه",
f: "shpaná",
e: "female shepherd",
},
}
},
{
masc: {
ex: {
p: "مېلمه",
f: "melmá",
e: "a male guest",
},
},
fem: {
ex: {
p: "مېلمنه",
f: "melmaná",
e: "a female guest",
},
},
},
{
masc: {
ex: {
p: "کوربه",
f: "korbá",
e: "male host",
},
},
fem: {
ex: {
p: "کوربنه",
f: "korbaná",
e: "female host",
},
}
}
]} />
### 5. Shorter irregular words
You get the idea...
<GenderTable rows={[
{
masc: {
ex: {
p: "غل",
f: "ghul",
e: "male thief",
},
},
fem: {
ex: {
p: "غله",
f: "ghla",
e: "female thief",
},
}
},
{
masc: {
ex: {
p: "خر",
f: "khur",
e: "male donkey",
},
},
fem: {
ex: {
p: "خره",
f: "khra",
e: "female donkey",
},
}
}
]} />
<!--
{
masc: {
ex: {p: "بوډا", f: "booDáa", e: "old man" },
},
fem: {
ex: {p: "بوډۍ", f: "booDúy", e: "old woman" },
},
}
-->

3
src/lib/text-tools.ts Normal file
View File

@ -0,0 +1,3 @@
export function firstVariation(s: string): string {
return s.split(/[,|;]/)[0].trim();
}

View File

@ -29,7 +29,7 @@ module.exports = [
{ ts: 1527813293, e: "red; hot" }, // سور
{ ts: 1600080053835, e: "riding, mounted" }, // سور
{ ts: 1527813068, e: "cold" }, // سوړ
// { ts: 1575924767041, e: "shepherd" }, // شپون
{ ts: 1575924767041, e: "shepherd" }, // شپون
// { ts: 1610448014063, e: "large flat basket" }, // شکور
{ ts: 1527813172, e: "bent" }, // کوږ
{ ts: 1527811973, e: "deaf" }, // کوڼ
@ -40,7 +40,8 @@ module.exports = [
{ ts: 1576889120767, e: "wet" }, // لوند
{ ts: 1527812927, e: "full, satisfied" }, // موړ
{ ts: 1527812908, e: "guest" }, // مېلمه
// { ts: 1527813810, e: "namaz" }, // نمونځ
{ ts: 1579463171333, e: "cleansed" }, // نوږ
{ ts: 1576113803291, e: "small" }, // ووړ
{ ts: 1527819244, e: "host" }, // کوربه
{ ts: 1527812908, e: "guest" }, // مېلمه
];

View File

@ -1,18 +1,18 @@
module.exports = [
{ ts: 1527814150, e: `road, way, path` }, // لار - laar
{ ts: 1527815417, e: `day` }, // ورځ - wradz
{ ts: 1527812922, e: `month` }, // میاشت - miyaasht
{ ts: 1527823306, e: `elbow` }, // څنګل - tsangúl
{ ts: 1527813824, e: `bosom, breast; wrestling` }, // غېږ - gheG
{ ts: 1527820524, e: `pelt, skin, hide, leather` }, // څرمن - tsarmún
{ ts: 1527814147, e: `blanket, coving, quilt` }, // بړستن - bRastun
{ ts: 1527818707, e: `wedge; gusset (in a shirt)` }, // ترخځ - turkhúdz
{ ts: 1527822792, e: `narrow mattress used as a bed or a couch, reversible rug` }, // توشک - toshák
{ ts: 1527820524, e: `pelt, skin, hide, leather` }, // څرمن - tsarmún
{ ts: 1527823306, e: `elbow` }, // څنګل - tsangúl
{ ts: 1527813294, e: `comb` }, // ږمنځ - Gmundz
{ ts: 1527811580, e: `needle, injection; pillar, mast` }, // ستن - stun
{ ts: 1527813824, e: `bosom, breast; wrestling` }, // غېږ - gheG
{ ts: 1527815779, e: `swearing, name-calling, verbal abuse, bad language` }, // کنځل - kundzul
{ ts: 1527814150, e: `road, way, path` }, // لار - laar
{ ts: 1527817456, e: `skirt, portion of clothing hanging down from the waist; foot, base (eg. of a mountain)` }, // لمن - lamun
{ ts: 1527822725, e: `span` }, // لوېشت - lwesht
{ ts: 1527811609, e: `claw, paw` }, // منګل - mangul
{ ts: 1527812922, e: `month` }, // میاشت - miyaasht
{ ts: 1527815417, e: `day` }, // ورځ - wradz
{ ts: 1527821684, e: `cloud` }, // ورېځ - wurédz
]

View File

@ -0,0 +1,13 @@
module.exports = [
{ ts: 1527821971, e: `second wife of own husband` }, // بن - bun
{ ts: 1527816397, e: `aunt` }, // ترور - tror
{ ts: 1578704593901, e: `aunt (paternal uncle's wife)` }, // تندار - tandaar
{ ts: 1527812785, e: `sister` }, // خور - khor
{ ts: 1527812861, e: `daughter` }, // لور - loor
{ ts: 1527812928, e: `mother, mom` }, // مور - mor
{ ts: 1527812912, e: `lady, woman, wife` }, // مېرمن - mermán
{ ts: 1527816476, e: `stepsister, half sister` }, // مېرېنۍ خور - merenuy khor
{ ts: 1527823521, e: `daughter-in-law` }, // نږور - nGor
{ ts: 1527816350, e: `brothers wife, sister-in-law` }, // ورندار - wrundaar
{ ts: 1527816485, e: `wife of husbands brother, wife of brother-in-law` }, // یور - yor
];

View File

@ -0,0 +1,38 @@
module.exports = [
{ ts: 1527821817, e: `uncle (paternal)` }, // اکا - akáa
{ ts: 1527816411, e: `father, grandfather (vocative or in child's speech)` }, // بابا - baabaa
{ ts: 1527819439, e: `king, ruler, president, padishah` }, // باچا - baacháa
{ ts: 1527823298, e: `sparrow-hawk, eagle` }, // باښه - baaxá
{ ts: 1527817718, e: `slave, servant, a human, person (as in a slave of God)` }, // بنده - bandá
{ ts: 1527815031, e: `prisoner, captive` }, // بندي - bandee
{ ts: 1527815142, e: `king` }, // پاچا - paachaa
{ ts: 1527817280, e: `leper` }, // جذامي - jUzaamee
{ ts: 1527814236, e: `pot smoker, pothead, someone addicted to marijuana, pot, hash` }, // چرسي - charsee
{ ts: 1578618561154, e: `Haji, someone who has gone on the Hajj` }, // حاجي - haajee
{ ts: 1527821193, e: `supporter, protector, defender, patron, saviour` }, // حامي - haamee
{ ts: 1591711877815, e: `washerman, someone who does the laundry` }, // دوبي - dobée
{ ts: 1527820139, e: `rabab player, rubab player` }, // ربابي - rabaabee
{ ts: 1619278755267, e: `troubling, pestering` }, // ربړنه - rabaRúna
{ ts: 1577066022588, e: `cupbearer, butler, bartender, alchohol maker` }, // ساقي - saaqée
{ ts: 1527822817, e: `soldier, warrior, guard` }, // سپاهي - sipaahee
{ ts: 1527812975, e: `barber, hairdresser` }, // سلماني - salmaanee
{ ts: 1527819414, e: `prince` }, // شاهزاده - shaahzaadá
{ ts: 1527818084, e: `drinker, drunkard, alcoholic, wine-bibber` }, // شرابي - sharaabee
{ ts: 1527821950, e: `prince` }, // شهزاده - shahzaadá
{ ts: 1588158828142, e: `hunter` }, // ښکاري - xkaaree
{ ts: 1527811789, e: `religious warrior for the faith (in Islam)` }, // غازي - ghaazee
{ ts: 1527815206, e: `judge, religious authority/judge` }, // قاضي - qaazee
{ ts: 1527818500, e: `contractor, supplier` }, // قراردادي - qaraardaadee
{ ts: 1527816446, e: `paternal uncle, term of address for elderly man` }, // کاکا - kaakaa
{ ts: 1595232159907, e: `begger, panhandler` }, // ګدا - gadáa
{ ts: 1527816512, e: `elder brother, general form of familiar and respectful address` }, // لالا - laalaa
{ ts: 1527812878, e: `uncle (maternal), respectful form of address` }, // ماما - maamaa
{ ts: 1610556640847, e: `census` }, // مردمشماري - mărdamshUmaaree
{ ts: 1527815484, e: `mullah, priest` }, // ملا - mUllaa
{ ts: 1527821714, e: `parallel, matching, appropriate, identical` }, // موازي - mUwaazée
{ ts: 1527816514, e: `shoemaker, shoe repairman, cobbler` }, // موچي - mochee
{ ts: 1527823093, e: `prophet` }, // نبي - nabee
{ ts: 1579041957559, e: `call, appeal, shout, summoning` }, // ندا - nadáa
{ ts: 1527816253, e: `grandson` }, // نواسه - nawaasa
{ ts: 1527819971, e: `governor` }, // والي - waalée
];

File diff suppressed because one or more lines are too long