unisex words and 2 levels on gendering game
This commit is contained in:
parent
4d2c91e290
commit
0410642492
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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}`
|
||||
|
|
|
@ -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,32 +34,50 @@ 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 () {
|
||||
export default function({level}: { level: 1 | 2 }) {
|
||||
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);
|
||||
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 Display({ question, callback }: QuestionDisplayProps<T.DictionaryEntry>) {
|
||||
function check(gender: "m" | "f") {
|
||||
callback(!!question.c?.includes(gender));
|
||||
}
|
||||
return <div>
|
||||
<div className="mb-4">
|
||||
<div className="mb-4" style={{ fontSize: "larger" }}>
|
||||
<Examples opts={opts}>{[
|
||||
removeFVariants({ p: question.p, f: question.f })
|
||||
{
|
||||
p: firstVariation(question.p),
|
||||
f: firstVariation(question.f),
|
||||
e: level === 2 ? firstVariation(question.e) : undefined,
|
||||
}
|
||||
]}</Examples>
|
||||
</div>
|
||||
<div className="mt-4">
|
||||
|
@ -65,14 +85,19 @@ function Display({ question, callback }: QuestionDisplayProps<T.DictionaryEntry>
|
|||
<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>;
|
||||
}
|
||||
function Instructions() {
|
||||
return <div>
|
||||
<h4>Choose the right gender for each word</h4>
|
||||
{level === 2 && <div>⚠ Exceptions included...</div>}
|
||||
</div>
|
||||
}
|
||||
|
||||
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}
|
||||
/>
|
||||
};
|
||||
|
|
|
@ -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>;
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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", "غل")} />
|
||||
|
||||
|
|
|
@ -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} />
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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" },
|
||||
},
|
||||
}
|
||||
-->
|
|
@ -0,0 +1,3 @@
|
|||
export function firstVariation(s: string): string {
|
||||
return s.split(/[,|;]/)[0].trim();
|
||||
}
|
|
@ -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" }, // مېلمه
|
||||
];
|
|
@ -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
|
||||
]
|
|
@ -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
|
||||
];
|
|
@ -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
Loading…
Reference in New Issue