use super::*;
#[must_use]
pub fn yucatec_maya() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("yua", "Yucatec Maya", 31)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("pʼ", Plosive, Bilabial, false)
.consonant("tʼ", Plosive, Alveolar, false)
.consonant("kʼ", Plosive, Velar, false)
.consonant("t͡sʼ", Affricate, Alveolar, false)
.consonant("t͡ʃʼ", Affricate, Postalveolar, false)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("aː", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn swahili() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("sw", "Swahili", 29)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("θ", Fricative, Dental, false)
.consonant("ð", Fricative, Dental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("r", Trill, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn yoruba() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("yo", "Yoruba", 25)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥"), Cow::Borrowed("˧"), Cow::Borrowed("˩"), ])
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("k͡p", Plosive, LabialVelar, false)
.consonant("ɡ͡b", Plosive, LabialVelar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn zulu() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("zu", "Zulu", 52)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ɓ", Plosive, Bilabial, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡sʰ", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ɦ", Fricative, Glottal, true)
.consonant("ɬ", LateralFricative, Alveolar, false)
.consonant("ɮ", LateralFricative, Alveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("ǀ", Plosive, Dental, false)
.consonant("ǀʰ", Plosive, Dental, false)
.consonant("ɡǀ", Plosive, Dental, true)
.consonant("ŋǀ", Nasal, Dental, true)
.consonant("ǃ", Plosive, Alveolar, false)
.consonant("ǃʰ", Plosive, Alveolar, false)
.consonant("ɡǃ", Plosive, Alveolar, true)
.consonant("ŋǃ", Nasal, Alveolar, true)
.consonant("ǁ", LateralFricative, Alveolar, false)
.consonant("ǁʰ", LateralFricative, Alveolar, false)
.consonant("ɡǁ", LateralFricative, Alveolar, true)
.consonant("ŋǁ", Nasal, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn thai() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("th", "Thai", 30)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˧"), Cow::Borrowed("˨˩"), Cow::Borrowed("˨˩˦"), Cow::Borrowed("˦˥"), Cow::Borrowed("˩˧˥"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɤ", CloseMid, Back, false)
.vowel("o", CloseMid, Back, true)
.vowel("ɔ", OpenMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɯ", Close, Back, false)
.build()
}
#[must_use]
pub fn vietnamese() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("vi", "Vietnamese", 33)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˧"), Cow::Borrowed("˨˩˦"), Cow::Borrowed("˧˥"), Cow::Borrowed("˧˩˧"), Cow::Borrowed("˧ˀ˥"), Cow::Borrowed("˨˩ˀ"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("ɯ", Close, Back, false)
.vowel("ɤ", CloseMid, Back, false)
.vowel("a", Open, Central, false)
.vowel("ă", NearOpen, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɤ̆", CloseMid, Back, false)
.build()
}
#[must_use]
pub fn tagalog() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("tl", "Tagalog", 23)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn turkish() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("tr", "Turkish", 29)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("y", Close, Front, true)
.vowel("e", CloseMid, Front, false)
.vowel("ø", CloseMid, Front, true)
.vowel("ɯ", Close, Back, false)
.vowel("u", Close, Back, true)
.vowel("a", Open, Back, false)
.vowel("o", CloseMid, Back, true)
.build()
}
#[must_use]
pub fn finnish() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("fi", "Finnish", 33)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("ʋ", Approximant, Labiodental, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("b", Plosive, Bilabial, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("æ", NearOpen, Front, false)
.vowel("y", Close, Front, true)
.vowel("ø", CloseMid, Front, true)
.vowel("ɑ", Open, Back, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("æː", NearOpen, Front, false)
.vowel("yː", Close, Front, true)
.vowel("øː", CloseMid, Front, true)
.vowel("ɑː", Open, Back, false)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn hawaiian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("haw", "Hawaiian", 18)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("k", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn nahuatl() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("nah", "Nahuatl", 23)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("kʷ", Plosive, LabialVelar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("t͡ɬ", Affricate, Alveolar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ɬ", LateralFricative, Alveolar, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", CloseMid, Back, true)
.build()
}
#[must_use]
pub fn latin() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("la", "Latin", 28)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("kʷ", Plosive, LabialVelar, false)
.consonant("ɡʷ", Plosive, LabialVelar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn classical_arabic() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ar", "Arabic", 34)
.stress(StressPattern::Free)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("tˤ", Plosive, Alveolar, false) .consonant("dˤ", Plosive, Alveolar, true) .consonant("k", Plosive, Velar, false)
.consonant("q", Plosive, Uvular, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("θ", Fricative, Dental, false)
.consonant("ð", Fricative, Dental, true)
.consonant("ðˤ", Fricative, Dental, true) .consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("sˤ", Fricative, Alveolar, false) .consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("ħ", Fricative, Pharyngeal, false)
.consonant("ʕ", Fricative, Pharyngeal, true)
.consonant("h", Fricative, Glottal, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("a", Open, Central, false)
.vowel("i", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("aː", Open, Central, false)
.vowel("iː", Close, Front, false)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn koine_greek() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("grc", "Koine Greek", 22)
.stress(StressPattern::PitchAccent)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("θ", Fricative, Dental, false)
.consonant("x", Fricative, Velar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn literary_chinese() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("lzh", "Literary Chinese", 40)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥"), Cow::Borrowed("˧˥"), Cow::Borrowed("˥˩"), Cow::Borrowed("˩ʔ"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡sʰ", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ɕ", Fricative, Palatal, false)
.consonant("ʑ", Fricative, Palatal, true)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɑ", Open, Back, false)
.vowel("ɨ", Close, Central, false)
.vowel("u", Close, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("ɔ", OpenMid, Back, true)
.vowel("ə", Mid, Central, false)
.vowel("æ", NearOpen, Front, false)
.vowel("ɐ", NearOpen, Central, false)
.build()
}
#[must_use]
pub fn mandarin() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("zh", "Mandarin Chinese", 28)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥˥"), Cow::Borrowed("˧˥"), Cow::Borrowed("˨˩˦"), Cow::Borrowed("˥˩"), Cow::Borrowed("˧"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡sʰ", Affricate, Alveolar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ʈ͡ʂ", Affricate, Retroflex, false)
.consonant("ʈ͡ʂʰ", Affricate, Retroflex, false)
.consonant("ʂ", Fricative, Retroflex, false)
.consonant("ɻ", Approximant, Retroflex, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("ɕ", Fricative, Palatal, false)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("x", Fricative, Velar, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("ɤ", CloseMid, Back, false)
.vowel("e", OpenMid, Front, false)
.vowel("i", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("y", Close, Front, true)
.build()
}
#[must_use]
pub fn hindi() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("hi", "Hindi", 44)
.stress(StressPattern::Free)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ɡʱ", Plosive, Velar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("d͡ʑʱ", Affricate, Palatal, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ʈ", Plosive, Retroflex, false)
.consonant("ʈʰ", Plosive, Retroflex, false)
.consonant("ɖ", Plosive, Retroflex, true)
.consonant("ɖʱ", Plosive, Retroflex, true)
.consonant("ɳ", Nasal, Retroflex, true)
.consonant("t̪", Plosive, Dental, false)
.consonant("t̪ʰ", Plosive, Dental, false)
.consonant("d̪", Plosive, Dental, true)
.consonant("d̪ʱ", Plosive, Dental, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("bʱ", Plosive, Bilabial, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("j", Approximant, Palatal, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʋ", Approximant, Labiodental, true)
.consonant("ɕ", Fricative, Palatal, false)
.consonant("ʂ", Fricative, Retroflex, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ɦ", Fricative, Glottal, true)
.consonant("f", Fricative, Labiodental, false)
.vowel("ə", Mid, Central, false) .vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ɛː", OpenMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("ɔː", OpenMid, Back, true)
.build()
}
#[must_use]
pub fn japanese() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ja", "Japanese", 20)
.stress(StressPattern::PitchAccent)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("ɸ", Fricative, Bilabial, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ɕ", Fricative, Palatal, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("ɾ", TapFlap, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, false) .build()
}
#[must_use]
pub fn spanish() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("es", "Spanish", 24)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Dental, false)
.consonant("d", Plosive, Dental, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("θ", Fricative, Dental, false) .consonant("s", Fricative, Alveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("β", Fricative, Bilabial, true) .consonant("ð", Fricative, Dental, true) .consonant("ɣ", Fricative, Velar, true) .consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʎ", LateralApproximant, Palatal, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("rr", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn french() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("fr", "French", 36)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʁ", Fricative, Uvular, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("ɥ", Approximant, Palatal, true) .vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Front, false)
.vowel("ɑ", Open, Back, false)
.vowel("y", Close, Front, true)
.vowel("ø", CloseMid, Front, true)
.vowel("œ", OpenMid, Front, true)
.vowel("ə", Mid, Central, false)
.vowel("u", Close, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("ɔ", OpenMid, Back, true)
.vowel("ɛ̃", OpenMid, Front, false)
.vowel("ɑ̃", Open, Back, false)
.vowel("œ̃", OpenMid, Front, true)
.vowel("ɔ̃", OpenMid, Back, true)
.build()
}
#[must_use]
pub fn german() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("de", "German", 37)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("p͡f", Affricate, Labiodental, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ç", Fricative, Palatal, false) .consonant("x", Fricative, Velar, false) .consonant("h", Fricative, Glottal, false)
.consonant("ʁ", Fricative, Uvular, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("ɪ", NearClose, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("ʊ", NearClose, Back, true)
.vowel("ʏ", NearClose, Front, true)
.vowel("œ", OpenMid, Front, true)
.vowel("ə", Mid, Central, false)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ɛː", OpenMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.vowel("yː", Close, Front, true)
.vowel("øː", CloseMid, Front, true)
.build()
}
#[must_use]
pub fn russian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ru", "Russian", 38)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʲ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("bʲ", Plosive, Bilabial, true)
.consonant("t", Plosive, Dental, false)
.consonant("tʲ", Plosive, Dental, false)
.consonant("d", Plosive, Dental, true)
.consonant("dʲ", Plosive, Dental, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʲ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ɡʲ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("fʲ", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("vʲ", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("sʲ", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("zʲ", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("ɕː", Fricative, Palatal, false) .consonant("x", Fricative, Velar, false)
.consonant("xʲ", Fricative, Velar, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("mʲ", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("nʲ", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("lʲ", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("rʲ", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("ɨ", Close, Central, false)
.vowel("u", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("a", Open, Central, false)
.build()
}
#[must_use]
pub fn korean() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ko", "Korean", 26)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("p͈", Plosive, Bilabial, false) .consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("t͈", Plosive, Alveolar, false) .consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("k͈", Plosive, Velar, false) .consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("t͡ɕ͈", Affricate, Palatal, false) .consonant("s", Fricative, Alveolar, false)
.consonant("s͈", Fricative, Alveolar, false) .consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("ɾ", TapFlap, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɯ", Close, Back, false)
.build()
}
#[must_use]
pub fn portuguese() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("pt", "Portuguese", 33)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Dental, false)
.consonant("d", Plosive, Dental, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʎ", LateralApproximant, Palatal, true)
.consonant("r", TapFlap, Alveolar, true) .consonant("ʁ", Fricative, Uvular, true) .consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɐ", NearOpen, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɨ", Close, Central, false)
.vowel("ẽ", CloseMid, Front, false)
.vowel("ã", Open, Central, false)
.vowel("õ", CloseMid, Back, true)
.vowel("ĩ", Close, Front, false)
.vowel("ũ", Close, Back, true)
.build()
}
#[must_use]
pub fn italian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("it", "Italian", 30)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʎ", LateralApproximant, Palatal, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn dutch() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("nl", "Dutch", 32)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʀ", Trill, Uvular, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("y", Close, Front, true)
.vowel("u", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("ø", CloseMid, Front, true)
.vowel("o", CloseMid, Back, true)
.vowel("ɛ", OpenMid, Front, false)
.vowel("œ", OpenMid, Front, true)
.vowel("ɔ", OpenMid, Back, true)
.vowel("a", Open, Central, false)
.vowel("ɛi", CloseMid, Front, false)
.vowel("œy", CloseMid, Front, true)
.vowel("ɑu", Open, Back, false)
.build()
}
#[must_use]
pub fn polish() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("pl", "Polish", 35)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʂ", Affricate, Retroflex, false)
.consonant("d͡ʐ", Affricate, Retroflex, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʂ", Fricative, Retroflex, false)
.consonant("ʐ", Fricative, Retroflex, true)
.consonant("ɕ", Fricative, Palatal, false)
.consonant("ʑ", Fricative, Palatal, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("x", Fricative, Velar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("ɨ", Close, Central, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn bengali() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("bn", "Bengali", 37)
.stress(StressPattern::Free)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ɡʱ", Plosive, Velar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("d͡ʑʱ", Affricate, Palatal, true)
.consonant("ʈ", Plosive, Retroflex, false)
.consonant("ʈʰ", Plosive, Retroflex, false)
.consonant("ɖ", Plosive, Retroflex, true)
.consonant("ɖʱ", Plosive, Retroflex, true)
.consonant("t̪", Plosive, Dental, false)
.consonant("t̪ʰ", Plosive, Dental, false)
.consonant("d̪", Plosive, Dental, true)
.consonant("d̪ʱ", Plosive, Dental, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("bʱ", Plosive, Bilabial, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("ɦ", Fricative, Glottal, true)
.consonant("j", Approximant, Palatal, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("ɽ", TapFlap, Retroflex, true)
.consonant("l", LateralApproximant, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("æ", NearOpen, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.build()
}
#[must_use]
pub fn tamil() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ta", "Tamil", 28)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("t̪", Plosive, Dental, false)
.consonant("ʈ", Plosive, Retroflex, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("k", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɳ", Nasal, Retroflex, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("j", Approximant, Palatal, true)
.consonant("ʋ", Approximant, Labiodental, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("ɻ", Approximant, Retroflex, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ɭ", LateralApproximant, Retroflex, true)
.vowel("a", Open, Central, false)
.vowel("aː", Open, Central, false)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.build()
}
#[must_use]
pub fn urdu() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ur", "Urdu", 47)
.stress(StressPattern::Free)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ɡʱ", Plosive, Velar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("q", Plosive, Uvular, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("d͡ʑʱ", Affricate, Palatal, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ʈ", Plosive, Retroflex, false)
.consonant("ʈʰ", Plosive, Retroflex, false)
.consonant("ɖ", Plosive, Retroflex, true)
.consonant("ɖʱ", Plosive, Retroflex, true)
.consonant("ɳ", Nasal, Retroflex, true)
.consonant("t̪", Plosive, Dental, false)
.consonant("t̪ʰ", Plosive, Dental, false)
.consonant("d̪", Plosive, Dental, true)
.consonant("d̪ʱ", Plosive, Dental, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("bʱ", Plosive, Bilabial, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("j", Approximant, Palatal, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("ʋ", Approximant, Labiodental, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false) .consonant("x", Fricative, Velar, false) .consonant("ɣ", Fricative, Velar, true) .consonant("ɦ", Fricative, Glottal, true)
.vowel("ə", Mid, Central, false)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ɛː", OpenMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("ɔː", OpenMid, Back, true)
.build()
}
#[must_use]
pub fn amharic() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("am", "Amharic", 34)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("pʼ", Plosive, Bilabial, false)
.consonant("tʼ", Plosive, Alveolar, false)
.consonant("kʼ", Plosive, Velar, false)
.consonant("t͡ʃʼ", Affricate, Postalveolar, false)
.consonant("t͡sʼ", Affricate, Alveolar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("ä", Open, Central, false)
.vowel("u", Close, Back, true)
.vowel("i", Close, Front, false)
.vowel("a", Open, Central, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɨ", Close, Central, false)
.vowel("o", CloseMid, Back, true)
.build()
}
#[must_use]
pub fn hausa() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ha", "Hausa", 35)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥"), Cow::Borrowed("˩"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("ʔʲ", Plosive, Palatal, false)
.consonant("ɓ", Plosive, Bilabial, true)
.consonant("ɗ", Plosive, Alveolar, true)
.consonant("kʼ", Plosive, Velar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("a", Open, Central, false)
.vowel("aː", Open, Central, false)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn indonesian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("id", "Indonesian", 24)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.consonant("w", Approximant, LabialVelar, true)
.vowel("i", Close, Front, false)
.vowel("u", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("ə", Mid, Central, false)
.vowel("a", Open, Central, false)
.build()
}
#[must_use]
pub fn persian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("fa", "Persian", 29)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("q", Plosive, Uvular, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("æ", NearOpen, Front, false)
.vowel("ɑ", Open, Back, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn hebrew() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("he", "Hebrew", 28)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("χ", Fricative, Uvular, false)
.consonant("ʁ", Fricative, Uvular, true)
.consonant("ħ", Fricative, Pharyngeal, false)
.consonant("ʕ", Fricative, Pharyngeal, true)
.consonant("h", Fricative, Glottal, false)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn georgian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ka", "Georgian", 33)
.stress(StressPattern::Free)
.consonant("b", Plosive, Bilabial, true)
.consonant("d", Plosive, Alveolar, true)
.consonant("ɡ", Plosive, Velar, true)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("pʼ", Plosive, Bilabial, false)
.consonant("tʼ", Plosive, Alveolar, false)
.consonant("kʼ", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("t͡sʰ", Affricate, Alveolar, false)
.consonant("t͡ʃʰ", Affricate, Postalveolar, false)
.consonant("t͡sʼ", Affricate, Alveolar, false)
.consonant("t͡ʃʼ", Affricate, Postalveolar, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn czech() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("cs", "Czech", 35)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("x", Fricative, Velar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("r̝", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("a", Open, Central, false)
.vowel("aː", Open, Central, false)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn hungarian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("hu", "Hungarian", 39)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("c", Plosive, Palatal, false)
.consonant("ɟ", Plosive, Palatal, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("y", Close, Front, true)
.vowel("yː", Close, Front, true)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ø", CloseMid, Front, true)
.vowel("øː", CloseMid, Front, true)
.vowel("a", Open, Back, true)
.vowel("aː", Open, Back, false)
.vowel("o", CloseMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn romanian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("ro", "Romanian", 28)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("d͡ʒ", Affricate, Postalveolar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("ʒ", Fricative, Postalveolar, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ə", Mid, Central, false)
.vowel("ɨ", Close, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn burmese() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("my", "Burmese", 37)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥"), Cow::Borrowed("˧ˀ"), Cow::Borrowed("˨˩"), Cow::Borrowed("˩ʔ"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("d͡ʑ", Affricate, Palatal, true)
.consonant("θ", Fricative, Dental, false)
.consonant("ð", Fricative, Dental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("m̥", Nasal, Bilabial, false)
.consonant("n̥", Nasal, Alveolar, false)
.consonant("ŋ̊", Nasal, Velar, false)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn khmer() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("km", "Khmer", 42)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ɓ", Plosive, Bilabial, true)
.consonant("ɗ", Plosive, Alveolar, true)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɨ", Close, Central, false)
.vowel("ə", Mid, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ɛː", OpenMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("ɨː", Close, Central, false)
.vowel("əː", Mid, Central, false)
.vowel("ɔː", OpenMid, Back, true)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn somali() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("so", "Somali", 32)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˥"), Cow::Borrowed("˩"), ])
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("ɖ", Plosive, Retroflex, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("q", Plosive, Uvular, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("ɣ", Fricative, Velar, true)
.consonant("ħ", Fricative, Pharyngeal, false)
.consonant("ʕ", Fricative, Pharyngeal, true)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", OpenMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", OpenMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", OpenMid, Back, true)
.vowel("uː", Close, Back, true)
.build()
}
#[must_use]
pub fn quechua() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("qu", "Quechua", 27)
.stress(StressPattern::Fixed)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("q", Plosive, Uvular, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("t͡ʃʰ", Affricate, Postalveolar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("qʰ", Plosive, Uvular, false)
.consonant("pʼ", Plosive, Bilabial, false)
.consonant("tʼ", Plosive, Alveolar, false)
.consonant("t͡ʃʼ", Affricate, Postalveolar, false)
.consonant("kʼ", Plosive, Velar, false)
.consonant("qʼ", Plosive, Uvular, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("a", Open, Central, false)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn guarani() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("gn", "Guarani", 28)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("d", Plosive, Alveolar, true) .consonant("ɡ", Plosive, Velar, true) .consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("r", TapFlap, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("a", Open, Central, false)
.vowel("e", CloseMid, Front, false)
.vowel("i", Close, Front, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɨ", Close, Central, false)
.vowel("ã", Open, Central, false)
.vowel("ẽ", CloseMid, Front, false)
.vowel("ĩ", Close, Front, false)
.vowel("õ", CloseMid, Back, true)
.vowel("ũ", Close, Back, true)
.vowel("ɨ̃", Close, Central, false)
.build()
}
#[must_use]
pub fn icelandic() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("is", "Icelandic", 30)
.stress(StressPattern::Free)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("p", Plosive, Bilabial, false)
.consonant("t", Plosive, Alveolar, false)
.consonant("k", Plosive, Velar, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("d", Plosive, Alveolar, true)
.consonant("ɡ", Plosive, Velar, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("v", Fricative, Labiodental, true)
.consonant("θ", Fricative, Dental, false)
.consonant("ð", Fricative, Dental, true)
.consonant("s", Fricative, Alveolar, false)
.consonant("ç", Fricative, Palatal, false)
.consonant("h", Fricative, Glottal, false)
.consonant("ɬ", LateralFricative, Alveolar, false)
.consonant("m̥", Nasal, Bilabial, false)
.consonant("n̥", Nasal, Alveolar, false)
.consonant("ŋ̊", Nasal, Velar, false)
.consonant("r", Trill, Alveolar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("ɪ", NearClose, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("ɛ", OpenMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("ɔ", OpenMid, Back, true)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.build()
}
#[must_use]
pub fn wolof() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("wo", "Wolof", 33)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("q", Plosive, Uvular, false)
.consonant("mb", Plosive, Bilabial, true)
.consonant("nd", Plosive, Alveolar, true)
.consonant("ŋɡ", Plosive, Velar, true)
.consonant("ɲɟ", Plosive, Palatal, true)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("χ", Fricative, Uvular, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ɲ", Nasal, Palatal, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("e", CloseMid, Front, false)
.vowel("a", Open, Central, false)
.vowel("o", CloseMid, Back, true)
.vowel("iː", Close, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("aː", Open, Central, false)
.vowel("oː", CloseMid, Back, true)
.build()
}
#[must_use]
pub fn lao() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("lo", "Lao", 29)
.stress(StressPattern::Tonal)
.tones(vec![
Cow::Borrowed("˧"), Cow::Borrowed("˨˩"), Cow::Borrowed("˥˩"), Cow::Borrowed("˦˥"), Cow::Borrowed("˩˧˥"), Cow::Borrowed("˧˥"), ])
.consonant("p", Plosive, Bilabial, false)
.consonant("pʰ", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("tʰ", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("kʰ", Plosive, Velar, false)
.consonant("ʔ", Plosive, Glottal, false)
.consonant("t͡ɕ", Affricate, Palatal, false)
.consonant("t͡ɕʰ", Affricate, Palatal, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("h", Fricative, Glottal, false)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("w", Approximant, LabialVelar, true)
.consonant("j", Approximant, Palatal, true)
.vowel("i", Close, Front, false)
.vowel("iː", Close, Front, false)
.vowel("ɯ", Close, Back, false)
.vowel("ɯː", Close, Back, false)
.vowel("u", Close, Back, true)
.vowel("uː", Close, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("eː", CloseMid, Front, false)
.vowel("ia", CloseMid, Front, false)
.build()
}
#[must_use]
pub fn mongolian() -> PhonemeInventory {
use Backness::*;
use Height::*;
use Manner::*;
use Place::*;
PhonemeInventoryBuilder::with_capacity("mn", "Mongolian", 35)
.stress(StressPattern::Free)
.consonant("p", Plosive, Bilabial, false)
.consonant("b", Plosive, Bilabial, true)
.consonant("t", Plosive, Alveolar, false)
.consonant("d", Plosive, Alveolar, true)
.consonant("k", Plosive, Velar, false)
.consonant("ɡ", Plosive, Velar, true)
.consonant("t͡s", Affricate, Alveolar, false)
.consonant("d͡z", Affricate, Alveolar, true)
.consonant("t͡ʃ", Affricate, Postalveolar, false)
.consonant("f", Fricative, Labiodental, false)
.consonant("s", Fricative, Alveolar, false)
.consonant("z", Fricative, Alveolar, true)
.consonant("ʃ", Fricative, Postalveolar, false)
.consonant("x", Fricative, Velar, false)
.consonant("χ", Fricative, Uvular, false)
.consonant("ɮ", LateralFricative, Alveolar, true)
.consonant("m", Nasal, Bilabial, true)
.consonant("n", Nasal, Alveolar, true)
.consonant("ŋ", Nasal, Velar, true)
.consonant("l", LateralApproximant, Alveolar, true)
.consonant("r", Trill, Alveolar, true)
.vowel("a", Open, Back, false)
.vowel("o", CloseMid, Back, true)
.vowel("u", Close, Back, true)
.vowel("ɔ", OpenMid, Back, true)
.vowel("e", CloseMid, Front, false)
.vowel("ø", CloseMid, Front, true)
.vowel("i", Close, Front, false)
.vowel("aː", Open, Back, false)
.vowel("oː", CloseMid, Back, true)
.vowel("uː", Close, Back, true)
.vowel("ɔː", OpenMid, Back, true)
.vowel("eː", CloseMid, Front, false)
.vowel("øː", CloseMid, Front, true)
.vowel("iː", Close, Front, false)
.build()
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! inventory_test {
($name:ident, $fn:ident, $code:expr, $consonants:expr, $vowels:expr) => {
#[test]
fn $name() {
let inv = $fn();
assert_eq!(inv.language_code, $code);
assert_eq!(inv.consonant_count(), $consonants, "{} consonants", $code);
assert_eq!(inv.vowel_count(), $vowels, "{} vowels", $code);
assert_eq!(
inv.consonant_count() + inv.vowel_count(),
inv.phonemes.len(),
"{} total",
$code
);
}
};
}
inventory_test!(test_maya, yucatec_maya, "yua", 21, 10);
inventory_test!(test_swahili, swahili, "sw", 26, 5);
inventory_test!(test_yoruba, yoruba, "yo", 18, 7);
inventory_test!(test_zulu, zulu, "zu", 42, 5);
inventory_test!(test_thai, thai, "th", 21, 9);
inventory_test!(test_vietnamese, vietnamese, "vi", 22, 11);
inventory_test!(test_tagalog, tagalog, "tl", 18, 5);
inventory_test!(test_turkish, turkish, "tr", 20, 8);
inventory_test!(test_finnish, finnish, "fi", 17, 16);
inventory_test!(test_hawaiian, hawaiian, "haw", 8, 10);
inventory_test!(test_nahuatl, nahuatl, "nah", 16, 8);
inventory_test!(test_latin, latin, "la", 18, 10);
inventory_test!(test_classical_arabic, classical_arabic, "ar", 28, 6);
inventory_test!(test_koine_greek, koine_greek, "grc", 17, 5);
inventory_test!(test_literary_chinese, literary_chinese, "lzh", 27, 12);
inventory_test!(test_mandarin, mandarin, "zh", 21, 7);
inventory_test!(test_hindi, hindi, "hi", 34, 10);
inventory_test!(test_japanese, japanese, "ja", 20, 5);
inventory_test!(test_spanish, spanish, "es", 23, 5);
inventory_test!(test_french, french, "fr", 21, 16);
inventory_test!(test_german, german, "de", 23, 16);
inventory_test!(test_russian, russian, "ru", 36, 6);
inventory_test!(test_korean, korean, "ko", 19, 7);
inventory_test!(test_portuguese, portuguese, "pt", 23, 14);
inventory_test!(test_italian, italian, "it", 23, 7);
inventory_test!(test_dutch, dutch, "nl", 19, 13);
inventory_test!(test_polish, polish, "pl", 29, 6);
inventory_test!(test_amharic, amharic, "am", 27, 7);
inventory_test!(test_hausa, hausa, "ha", 25, 10);
inventory_test!(test_indonesian, indonesian, "id", 18, 6);
inventory_test!(test_czech, czech, "cs", 25, 10);
inventory_test!(test_hungarian, hungarian, "hu", 25, 14);
inventory_test!(test_romanian, romanian, "ro", 21, 7);
inventory_test!(test_burmese, burmese, "my", 30, 7);
inventory_test!(test_khmer, khmer, "km", 24, 18);
inventory_test!(test_somali, somali, "so", 22, 10);
inventory_test!(test_quechua, quechua, "qu", 24, 3);
inventory_test!(test_guarani, guarani, "gn", 16, 12);
inventory_test!(test_icelandic, icelandic, "is", 22, 8);
#[test]
fn test_czech_unique_r_raised() {
let cs = czech();
assert!(
cs.has("r̝"),
"Czech ř (raised alveolar trill) must be present"
);
}
#[test]
fn test_hungarian_front_rounded_vowels() {
let hu = hungarian();
assert!(
hu.has("y"),
"Hungarian y (front rounded close) must be present"
);
assert!(
hu.has("ø"),
"Hungarian ø (front rounded close-mid) must be present"
);
assert!(hu.has("yː"), "Hungarian long yː must be present");
assert!(hu.has("øː"), "Hungarian long øː must be present");
}
#[test]
fn test_hungarian_palatal_stops() {
let hu = hungarian();
assert!(
hu.has("c"),
"Hungarian voiceless palatal stop c must be present"
);
assert!(
hu.has("ɟ"),
"Hungarian voiced palatal stop ɟ must be present"
);
}
#[test]
fn test_romanian_central_close_vowel() {
let ro = romanian();
assert!(
ro.has("ɨ"),
"Romanian ɨ (unique central close vowel) must be present"
);
}
#[test]
fn test_maya_ejectives() {
let m = yucatec_maya();
assert!(m.has("pʼ"));
assert!(m.has("tʼ"));
assert!(m.has("kʼ"));
}
#[test]
fn test_yoruba_tones() {
let yo = yoruba();
assert_eq!(yo.tones.as_ref().unwrap().len(), 3);
}
#[test]
fn test_zulu_clicks() {
let zu = zulu();
assert!(zu.has("ǀ"));
assert!(zu.has("ǃ"));
assert!(zu.has("ǁ"));
}
#[test]
fn test_hawaiian_minimal() {
let haw = hawaiian();
assert_eq!(haw.consonant_count(), 8);
}
#[test]
fn test_vietnamese_tones() {
let vi = vietnamese();
assert_eq!(vi.tones.as_ref().unwrap().len(), 6);
}
#[test]
fn test_arabic_pharyngeals() {
let ar = classical_arabic();
assert!(ar.has("ħ"));
assert!(ar.has("ʕ"));
assert!(ar.has("q")); }
#[test]
fn test_arabic_emphatics() {
let ar = classical_arabic();
assert!(ar.has("tˤ"));
assert!(ar.has("sˤ"));
}
#[test]
fn test_latin_labialized_velars() {
let la = latin();
assert!(la.has("kʷ"));
assert!(la.has("ɡʷ"));
}
#[test]
fn test_koine_greek_stress() {
let grc = koine_greek();
assert_eq!(grc.stress, StressPattern::PitchAccent);
}
#[test]
fn test_literary_chinese_tones() {
let lzh = literary_chinese();
assert_eq!(lzh.tones.as_ref().unwrap().len(), 4);
}
#[test]
fn test_amharic_ejectives() {
let am = amharic();
assert!(am.has("pʼ"));
assert!(am.has("tʼ"));
assert!(am.has("kʼ"));
assert!(am.has("t͡ʃʼ"));
assert!(am.has("t͡sʼ"));
}
#[test]
fn test_hausa_tones() {
let ha = hausa();
assert_eq!(ha.tones.as_ref().unwrap().len(), 2);
}
#[test]
fn test_hausa_implosives() {
let ha = hausa();
assert!(ha.has("ɓ"));
assert!(ha.has("ɗ"));
assert!(ha.has("kʼ"));
}
#[test]
fn test_indonesian_nasals() {
let id = indonesian();
assert!(id.has("ɲ"));
assert!(id.has("ŋ"));
}
#[test]
fn test_burmese_tones() {
let my = burmese();
assert_eq!(my.tones.as_ref().unwrap().len(), 4);
}
#[test]
fn test_burmese_voiceless_nasals() {
let my = burmese();
assert!(
my.has("m̥"),
"Burmese voiceless bilabial nasal m̥ must be present"
);
assert!(
my.has("n̥"),
"Burmese voiceless alveolar nasal n̥ must be present"
);
assert!(
my.has("ŋ̊"),
"Burmese voiceless velar nasal ŋ̊ must be present"
);
}
#[test]
fn test_burmese_glottal_stop() {
let my = burmese();
assert!(my.has("ʔ"), "Burmese glottal stop ʔ must be present");
}
#[test]
fn test_khmer_implosives() {
let km = khmer();
assert!(km.has("ɓ"), "Khmer implosive ɓ must be present");
assert!(km.has("ɗ"), "Khmer implosive ɗ must be present");
}
#[test]
fn test_khmer_vowel_length() {
let km = khmer();
assert!(km.has("a"));
assert!(km.has("aː"));
assert!(km.has("i"));
assert!(km.has("iː"));
}
#[test]
fn test_somali_pharyngeals() {
let so = somali();
assert!(so.has("ħ"), "Somali pharyngeal ħ must be present");
assert!(so.has("ʕ"), "Somali pharyngeal ʕ must be present");
}
#[test]
fn test_somali_uvular_retroflex() {
let so = somali();
assert!(so.has("q"), "Somali uvular q must be present");
assert!(so.has("ɖ"), "Somali retroflex ɖ must be present");
}
#[test]
fn test_somali_tones() {
let so = somali();
assert_eq!(so.tones.as_ref().unwrap().len(), 2);
}
#[test]
fn test_quechua_three_vowels() {
let qu = quechua();
assert!(qu.has("i"), "Quechua i must be present");
assert!(qu.has("a"), "Quechua a must be present");
assert!(qu.has("u"), "Quechua u must be present");
assert_eq!(qu.vowel_count(), 3, "Quechua three-vowel system");
}
#[test]
fn test_quechua_ejectives_and_aspirates() {
let qu = quechua();
assert!(qu.has("pʼ"), "Quechua bilabial ejective pʼ must be present");
assert!(qu.has("tʼ"), "Quechua alveolar ejective tʼ must be present");
assert!(qu.has("kʼ"), "Quechua velar ejective kʼ must be present");
assert!(qu.has("qʼ"), "Quechua uvular ejective qʼ must be present");
assert!(qu.has("pʰ"), "Quechua aspirated pʰ must be present");
assert!(qu.has("qʰ"), "Quechua aspirated uvular qʰ must be present");
assert!(qu.has("q"), "Quechua plain uvular q must be present");
}
#[test]
fn test_quechua_stress_fixed() {
let qu = quechua();
assert_eq!(qu.stress, StressPattern::Fixed);
}
#[test]
fn test_guarani_nasal_vowels() {
let gn = guarani();
assert!(gn.has("ã"), "Guarani nasal ã must be present");
assert!(gn.has("ẽ"), "Guarani nasal ẽ must be present");
assert!(gn.has("ĩ"), "Guarani nasal ĩ must be present");
assert!(gn.has("õ"), "Guarani nasal õ must be present");
assert!(gn.has("ũ"), "Guarani nasal ũ must be present");
assert!(gn.has("ɨ̃"), "Guarani nasal ɨ̃ must be present");
assert_eq!(gn.vowel_count(), 12, "Guarani 6 oral + 6 nasal vowels");
}
#[test]
fn test_guarani_glottal_stop() {
let gn = guarani();
assert!(gn.has("ʔ"), "Guarani glottal stop ʔ must be present");
}
#[test]
fn test_icelandic_voiceless_nasals() {
let is = icelandic();
assert!(
is.has("m̥"),
"Icelandic voiceless bilabial nasal m̥ must be present"
);
assert!(
is.has("n̥"),
"Icelandic voiceless alveolar nasal n̥ must be present"
);
assert!(
is.has("ŋ̊"),
"Icelandic voiceless velar nasal ŋ̊ must be present"
);
}
#[test]
fn test_icelandic_voiceless_lateral_fricative() {
let is = icelandic();
assert!(
is.has("ɬ"),
"Icelandic voiceless lateral fricative ɬ must be present"
);
}
#[test]
fn test_icelandic_aspirated_stops() {
let is = icelandic();
assert!(is.has("pʰ"), "Icelandic aspirated pʰ must be present");
assert!(is.has("tʰ"), "Icelandic aspirated tʰ must be present");
assert!(is.has("kʰ"), "Icelandic aspirated kʰ must be present");
}
}