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 => { fetch(process.env.LINGDOCS_DICTIONARY_URL).then(res => res.arrayBuffer()).then(data => {
const { entries } = readDictionary(data); const { entries } = readDictionary(data);
const filtered = entries.filter(e => ( 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 = [ const content = `module.exports = [
${filtered.reduce((text, entry) => ( ${filtered.reduce((text, entry) => (
text + `{ ts: ${entry.ts}, e: \`${entry.e.replace(/"/g, '\\"')}\` }, // ${entry.p} - ${entry.f} 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) { // function getFromTsS(entries) {

View File

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

View File

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

View File

@ -9,9 +9,11 @@ import {
Types as T, Types as T,
Examples, Examples,
defaultTextOptions as opts, defaultTextOptions as opts,
removeFVariants,
} from "@lingdocs/pashto-inflector"; } from "@lingdocs/pashto-inflector";
import words from "../words/nouns-adjs"; import words from "../words/nouns-adjs";
import {
firstVariation,
} from "../lib/text-tools";
// const masc = words.filter((w) => w.entry.c === "n. m."); // const masc = words.filter((w) => w.entry.c === "n. m.");
// const fem = words.filter((w) => w.entry.c === "n. f."); // 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 // 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"), // consonantFem: words.filter((w) => w.category === "consonant-fem"),
const amount = 40; const amount = 40;
function* questions () { export default function({level}: { level: 1 | 2 }) {
const wordPool = {...types}; function* questions () {
for (let i = 0; i < amount; i++) { const wordPool = {...types};
const gender = getRandomFromList(Object.keys(wordPool)); for (let i = 0; i < amount; i++) {
const typeToUse = getRandomFromList(Object.keys(wordPool[gender])); const base = level === 1
const question = getRandomFromList(wordPool[gender][typeToUse]).entry; ? wordPool
wordPool[gender][typeToUse] = wordPool[gender][typeToUse].filter(({ entry }) => entry.ts !== question.ts); : getRandomFromList([wordPool, exceptions]);
yield { const gender = getRandomFromList(Object.keys(base));
progress: makeProgress(i, amount), const typeToUse = getRandomFromList(Object.keys(base[gender]));
question, 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 Display({ question, callback }: QuestionDisplayProps<T.DictionaryEntry>) { function check(gender: "m" | "f") {
function check(gender: "m" | "f") { callback(!!question.c?.includes(gender));
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"> function Instructions() {
<Examples opts={opts}>{[ return <div>
removeFVariants({ p: question.p, f: question.f }) <h4>Choose the right gender for each word</h4>
]}</Examples> {level === 2 && <div> Exceptions included...</div>}
</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 <Game
return <h4> questions={questions}
Choose the right gender for each word Display={Display}
</h4>; timeLimit={level === 1 ? 65 : 85}
} Instructions={Instructions}
/>
export default function() {
return <Game questions={questions} Display={Display} timeLimit={65} 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 otherEquatives from "!babel-loader!mdx-loader!./equatives/other-equatives.mdx";
import * as nounsGender from "!babel-loader!mdx-loader!./nouns/nouns-gender.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 nounsPlural from "!babel-loader!mdx-loader!./nouns/nouns-plural.mdx";
import * as arabicPlurals from "!babel-loader!mdx-loader!./nouns/arabic-plurals.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"; import * as bundledPlurals from "!babel-loader!mdx-loader!./nouns/bundled-plurals.mdx";
@ -70,6 +71,10 @@ const contentTree = [
import: nounsGender, import: nounsGender,
slug: "nouns-gender", slug: "nouns-gender",
}, },
{
import: nounsUnisex,
slug: "nouns-unisex",
},
{ {
import: nounsPlural, import: nounsPlural,
slug: "nouns-plural", 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. 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", "غټ")} /> <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> </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", "ستړی")} /> <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", "لومړی")} /> <InflectionCarousel items={startingWord(words, "ey-stressed-unisex", "لومړی")} />
## Words with the "Pashtun" pattern ## 4. Words with the "Pashtun" pattern
<InflectionCarousel items={startingWord(words, "aanu-unisex", "پښتون")} /> <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. **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", "غل")} /> <InflectionCarousel items={startingWord(words, "short-irreg-unisex", "غل")} />

View File

@ -9,9 +9,15 @@ import {
} from "@lingdocs/pashto-inflector"; } from "@lingdocs/pashto-inflector";
import genderColors from "../../lib/gender-colors"; import genderColors from "../../lib/gender-colors";
import GenderGame from "../../components/GenderGame"; 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 femColor = genderColors.f;
export const mascColor = genderColors.m; export const mascColor = genderColors.m;
export const femEndingWConsonant = words.filter((w) => w.category === "consonant-fem");
export const Masc = () => ( export const Masc = () => (
<span style={{ backgroundColor: mascColor }}>masculine</span> <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 ## 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 /> - a consonant
- if a noun ends in a different *vowel*, it's <Fem /> - <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 }) { - 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.)
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>;
}
<GenderTable rows={[ <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 ## 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" }} /> <IrregularFem />
- <InlinePs opts={opts} ps={{p:"غېږ", f:"gheG", e:"bosom"}} />
- <InlinePs opts={opts} ps={{p:"میاشت", f:"miyaasht", e:"month"}} /> 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 ### 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" }, 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={[ <GenderGame level={2} />
{
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 👧"},
},
},
]} />

View File

@ -8,6 +8,7 @@ import {
defaultTextOptions as opts, defaultTextOptions as opts,
} from "@lingdocs/pashto-inflector"; } from "@lingdocs/pashto-inflector";
import Table from "../../components/Table"; import Table from "../../components/Table";
import Link from "../../components/Link";
export function PluralTable({ children, inflection }) { export function PluralTable({ children, inflection }) {
return ( 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. 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 ## 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 ### 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: 1527813293, e: "red; hot" }, // سور
{ ts: 1600080053835, e: "riding, mounted" }, // سور { ts: 1600080053835, e: "riding, mounted" }, // سور
{ ts: 1527813068, e: "cold" }, // سوړ { ts: 1527813068, e: "cold" }, // سوړ
// { ts: 1575924767041, e: "shepherd" }, // شپون { ts: 1575924767041, e: "shepherd" }, // شپون
// { ts: 1610448014063, e: "large flat basket" }, // شکور // { ts: 1610448014063, e: "large flat basket" }, // شکور
{ ts: 1527813172, e: "bent" }, // کوږ { ts: 1527813172, e: "bent" }, // کوږ
{ ts: 1527811973, e: "deaf" }, // کوڼ { ts: 1527811973, e: "deaf" }, // کوڼ
@ -40,7 +40,8 @@ module.exports = [
{ ts: 1576889120767, e: "wet" }, // لوند { ts: 1576889120767, e: "wet" }, // لوند
{ ts: 1527812927, e: "full, satisfied" }, // موړ { ts: 1527812927, e: "full, satisfied" }, // موړ
{ ts: 1527812908, e: "guest" }, // مېلمه { ts: 1527812908, e: "guest" }, // مېلمه
// { ts: 1527813810, e: "namaz" }, // نمونځ
{ ts: 1579463171333, e: "cleansed" }, // نوږ { ts: 1579463171333, e: "cleansed" }, // نوږ
{ ts: 1576113803291, e: "small" }, // ووړ { ts: 1576113803291, e: "small" }, // ووړ
{ ts: 1527819244, e: "host" }, // کوربه
{ ts: 1527812908, e: "guest" }, // مېلمه
]; ];

View File

@ -1,18 +1,18 @@
module.exports = [ 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: 1527814147, e: `blanket, coving, quilt` }, // بړستن - bRastun
{ ts: 1527818707, e: `wedge; gusset (in a shirt)` }, // ترخځ - turkhúdz { 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: 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: 1527813294, e: `comb` }, // ږمنځ - Gmundz
{ ts: 1527811580, e: `needle, injection; pillar, mast` }, // ستن - stun { 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: 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: 1527817456, e: `skirt, portion of clothing hanging down from the waist; foot, base (eg. of a mountain)` }, // لمن - lamun
{ ts: 1527822725, e: `span` }, // لوېشت - lwesht { ts: 1527822725, e: `span` }, // لوېشت - lwesht
{ ts: 1527811609, e: `claw, paw` }, // منګل - mangul { ts: 1527811609, e: `claw, paw` }, // منګل - mangul
{ ts: 1527812922, e: `month` }, // میاشت - miyaasht
{ ts: 1527815417, e: `day` }, // ورځ - wradz
{ ts: 1527821684, e: `cloud` }, // ورېځ - wurédz { 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