|
|
@@ -121,11 +121,6 @@ ALPHABET *AlphabetFromChar(int c) |
|
|
|
|
|
|
|
static void Translator_Russian(Translator *tr); |
|
|
|
|
|
|
|
static void SetLetterVowel(Translator *tr, int c) |
|
|
|
{ |
|
|
|
tr->letter_bits[c] = (tr->letter_bits[c] & 0x40) | 0x81; // keep value for group 6 (front vowels e,i,y) |
|
|
|
} |
|
|
|
|
|
|
|
static void ResetLetterBits(Translator *tr, int groups) |
|
|
|
{ |
|
|
|
// Clear all the specified groups |
|
|
@@ -479,11 +474,9 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_af[8] = { 170, 140, 220, 220, 0, 0, 250, 270 }; |
|
|
|
SetupTranslator(tr, stress_lengths_af, NULL); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.vowel_pause = 0x30; |
|
|
|
tr->langopts.param[LOPT_DIERESES] = 1; |
|
|
|
tr->langopts.param[LOPT_PREFIXES] = 1; |
|
|
|
SetLetterVowel(tr, 'y'); // add 'y' to vowels |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_SINGLE_AND | NUM_ROMAN | NUM_1900; |
|
|
|
tr->langopts.accents = 1; |
|
|
@@ -493,7 +486,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
{ |
|
|
|
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); |
|
|
|
tr->letter_bits_offset = OFFSET_ETHIOPIC; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words |
|
|
@@ -512,12 +504,10 @@ Translator *SelectTranslator(const char *name) |
|
|
|
case L('b', 'g'): // Bulgarian |
|
|
|
{ |
|
|
|
SetCyrillicLetters(tr); |
|
|
|
SetLetterVowel(tr, 0x2a); |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_5; |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x107; // devoice at end of word, and change voicing to match a following consonant (except v) |
|
|
|
tr->langopts.param[LOPT_REDUCE] = 2; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_SINGLE_AND | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS; |
|
|
|
tr->langopts.thousands_sep = ' '; // don't allow dot as thousands separator |
|
|
|
} |
|
|
@@ -533,7 +523,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_bn, stress_amps_bn); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable |
|
|
|
tr->letter_bits_offset = OFFSET_BENGALI; |
|
|
|
SetIndicLetters(tr); // call this after setting OFFSET_BENGALI |
|
|
@@ -571,7 +560,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_cy, stress_amps_cy); |
|
|
|
|
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_14; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
|
|
|
|
// 'diminished' is an unstressed final syllable |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
@@ -581,8 +569,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_OMIT_1_HUNDRED; |
|
|
|
|
|
|
|
SetLetterVowel(tr, 'w'); // add letter to vowels and remove from consonants |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
} |
|
|
|
break; |
|
|
|
case L('d', 'a'): // Danish |
|
|
@@ -590,9 +576,7 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_da[8] = { 160, 140, 200, 200, 0, 0, 220, 230 }; |
|
|
|
SetupTranslator(tr, stress_lengths_da, NULL); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.param[LOPT_PREFIXES] = 1; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; |
|
|
|
} |
|
|
|
break; |
|
|
@@ -601,7 +585,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_de[8] = { 150, 130, 200, 200, 0, 0, 270, 270 }; |
|
|
|
static const unsigned char stress_amps_de[] = { 20, 20, 20, 20, 20, 22, 22, 20 }; |
|
|
|
SetupTranslator(tr, stress_lengths_de, stress_amps_de); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.word_gap = 0x8; // don't use linking phonemes |
|
|
|
tr->langopts.vowel_pause = 0x30; |
|
|
|
tr->langopts.param[LOPT_PREFIXES] = 1; |
|
|
@@ -609,7 +592,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.param[LOPT_LONG_VOWEL_THRESHOLD] = 175/2; |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use de_rules for unpronouncable rules |
|
|
|
} |
|
|
|
break; |
|
|
@@ -631,7 +613,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_en[8] = { 182, 140, 220, 220, 0, 0, 248, 275 }; |
|
|
|
SetupTranslator(tr, stress_lengths_en, NULL); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = 0x08; |
|
|
|
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900; |
|
|
|
tr->langopts.param[LOPT_COMBINE_WORDS] = 2; // allow "mc" to cmbine with the following word |
|
|
@@ -667,7 +648,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetLetterBits(tr, LETTERGP_Y, el_fvowels); // front vowels: ε η ι υ _ |
|
|
|
|
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished |
|
|
|
tr->langopts.unstressed_wd1 = 0; |
|
|
|
tr->langopts.unstressed_wd2 = 2; |
|
|
@@ -694,7 +674,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->char_plus_apostrophe = eo_char_apostrophe; |
|
|
|
|
|
|
|
tr->langopts.vowel_pause = 2; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
|
tr->langopts.unstressed_wd2 = 2; |
|
|
|
|
|
|
@@ -714,7 +693,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_es, stress_amps_es); |
|
|
|
|
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
|
|
|
|
// stress last syllable if it doesn't end in vowel or "s" or "n" |
|
|
|
// 'diminished' is an unstressed final syllable |
|
|
@@ -740,7 +718,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.roman_suffix = utf8_ordinal; |
|
|
|
} else if (name2 == L_pap) { |
|
|
|
// stress last syllable unless word ends with a vowel |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2; |
|
|
|
} else |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use es_rules for unpronouncable rules |
|
|
@@ -751,7 +728,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_eu[8] = { 200, 200, 200, 200, 0, 0, 210, 230 }; // very weak stress |
|
|
|
static const unsigned char stress_amps_eu[8] = { 16, 16, 18, 18, 18, 18, 18, 18 }; |
|
|
|
SetupTranslator(tr, stress_lengths_eu, stress_amps_eu); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2L; // ?? second syllable, but not on a word-final vowel |
|
|
|
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED; |
|
|
|
tr->langopts.param[LOPT_SUFFIX] = 1; |
|
|
|
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_VIGESIMAL; |
|
|
@@ -795,13 +771,11 @@ Translator *SelectTranslator(const char *name) |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_fi, stress_amps_fi); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_2_TO_HEAVY; // move secondary stress from light to a following heavy syllable |
|
|
|
tr->langopts.param[LOPT_IT_DOUBLING] = 1; |
|
|
|
tr->langopts.long_stop = 130; |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA + NUM_ALLOW_SPACE; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.spelling_stress = 1; |
|
|
|
tr->langopts.intonation_group = 3; // less intonation, don't raise pitch at comma |
|
|
|
} |
|
|
@@ -809,14 +783,12 @@ Translator *SelectTranslator(const char *name) |
|
|
|
case L('f', 'r'): // french |
|
|
|
{ |
|
|
|
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM; // don't use secondary stress |
|
|
|
tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
tr->langopts.accents = 2; // Say "Capital" after the letter. |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_AFTER | NUM_VIGESIMAL | NUM_DFRACTION_4; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
} |
|
|
|
break; |
|
|
|
case L('g', 'a'): // irish |
|
|
@@ -850,7 +822,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISCII; |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = 6; // stress on last heaviest syllable, excluding final syllable |
|
|
|
tr->langopts.stress_flags = S_MID_DIM | S_FINAL_DIM; // use 'diminished' for unstressed final syllable |
|
|
|
tr->langopts.numbers = NUM_SWAP_TENS; |
|
|
|
tr->langopts.break_numbers = 0x14aa8; // for languages which have numbers for 100,000 and 100,00,000, eg Hindi |
|
|
@@ -861,7 +832,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
else if (name2 == L('g', 'u')) { |
|
|
|
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); |
|
|
|
tr->letter_bits_offset = OFFSET_GUJARATI; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
} else if (name2 == L('n', 'e')) { |
|
|
|
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); |
|
|
|
tr->langopts.break_numbers = 0x2aaaa8; |
|
|
@@ -888,7 +858,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_hr, stress_amps_hr); |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_NO_2; |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; |
|
|
|
tr->langopts.max_initial_consonants = 5; |
|
|
@@ -900,8 +869,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.replace_chars = replace_cyrillic_latin; |
|
|
|
tr->langopts.our_alphabet = OFFSET_CYRILLIC; // don't say "cyrillic" before letter names |
|
|
|
|
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
SetLetterVowel(tr, 'r'); |
|
|
|
} |
|
|
|
break; |
|
|
|
case L('h', 't'): // Haitian Creole |
|
|
@@ -918,7 +885,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
|
|
|
|
|
tr->langopts.vowel_pause = 0x20; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_NO_AUTO_2 | 0x8000 | S_HYPEN_UNSTRESS; |
|
|
|
tr->langopts.unstressed_wd1 = 2; |
|
|
|
tr->langopts.param[LOPT_IT_DOUBLING] = 1; |
|
|
@@ -929,7 +895,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.decimal_sep = ','; |
|
|
|
tr->langopts.max_roman = 899; |
|
|
|
tr->langopts.min_roman = 1; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.spelling_stress = 1; |
|
|
|
SetLengthMods(tr, 3); // all equal |
|
|
|
} |
|
|
@@ -945,7 +910,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const char hy_consonants2[] = { 0x45, 0 }; |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_hy, NULL); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; // default stress on final syllable |
|
|
|
|
|
|
|
tr->letter_bits_offset = OFFSET_ARMENIAN; |
|
|
|
memset(tr->letter_bits, 0, sizeof(tr->letter_bits)); |
|
|
@@ -965,7 +929,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const unsigned char stress_amps_id[8] = { 16, 18, 18, 18, 20, 22, 22, 21 }; |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_id, stress_amps_id); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_ROMAN; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
|
tr->langopts.accents = 2; // "capital" after letter name |
|
|
@@ -977,7 +940,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const wchar_t is_lettergroup_B[] = { 'c', 'f', 'h', 'k', 'p', 't', 'x', 0xfe, 0 }; // voiceless conants, including 'þ' ?? 's' |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_is, NULL); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_NO_2; |
|
|
|
tr->langopts.param[LOPT_IT_LENGTHEN] = 0x11; // remove lengthen indicator from unstressed vowels |
|
|
|
tr->langopts.param[LOPT_REDUCE] = 2; |
|
|
@@ -986,7 +948,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetLetterBits(tr, 4, "kpst"); // Letter group F |
|
|
|
SetLetterBits(tr, 3, "jvr"); // Letter group H |
|
|
|
tr->letter_groups[1] = is_lettergroup_B; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SINGLE_AND | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_1900; |
|
|
|
tr->langopts.numbers2 = 0x2; |
|
|
|
} |
|
|
@@ -997,7 +958,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const unsigned char stress_amps_it[8] = { 17, 15, 18, 16, 20, 22, 22, 22 }; |
|
|
|
SetupTranslator(tr, stress_lengths_it, stress_amps_it); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2 | S_FINAL_DIM_ONLY | S_PRIORITY_STRESS; |
|
|
|
tr->langopts.vowel_pause = 1; |
|
|
|
tr->langopts.unstressed_wd1 = 0; |
|
|
@@ -1011,7 +971,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.numbers2 = NUM2_NO_TEEN_ORDINALS; |
|
|
|
tr->langopts.roman_suffix = utf8_ordinal; |
|
|
|
tr->langopts.accents = 2; // Say "Capital" after the letter. |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
} |
|
|
|
break; |
|
|
|
case L_jbo: // Lojban |
|
|
@@ -1020,11 +979,9 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const wchar_t jbo_punct_within_word[] = { '.', ',', '\'', 0x2c8, 0 }; // allow period and comma within a word, also stress marker (from LOPT_CAPS_IN_WORD) |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_jbo, NULL); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant |
|
|
|
tr->punct_within_word = jbo_punct_within_word; |
|
|
|
tr->langopts.param[LOPT_CAPS_IN_WORD] = 2; // capitals indicate stressed syllables |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.max_lengthmod = 368; |
|
|
|
} |
|
|
|
break; |
|
|
@@ -1041,7 +998,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetLetterBits(tr, LETTERGP_C, ka_consonants); |
|
|
|
SetLetterBits(tr, LETTERGP_VOWEL2, ka_vowels); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_NO_2; |
|
|
|
tr->letter_bits_offset = OFFSET_GEORGIAN; |
|
|
|
tr->langopts.max_initial_consonants = 7; |
|
|
@@ -1077,7 +1033,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
case L('k', 'l'): // Greenlandic |
|
|
|
{ |
|
|
|
SetupTranslator(tr, stress_lengths_equal, stress_amps_equal); |
|
|
|
tr->langopts.stress_rule = 12; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; |
|
|
|
} |
|
|
@@ -1094,7 +1049,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetLetterBits(tr, LETTERGP_Y, ko_ivowels); |
|
|
|
SetLetterBits(tr, LETTERGP_G, (const char *)ko_voiced); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = 8; // ?? 1st syllable if it is heavy, else 2nd syllable |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words |
|
|
|
tr->langopts.numbers = NUM_OMIT_1_HUNDRED; |
|
|
|
tr->langopts.numbers2 = NUM2_MYRIADS; |
|
|
@@ -1110,8 +1064,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_ku, stress_amps_ku); |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_AND_HUNDRED; |
|
|
|
tr->langopts.max_initial_consonants = 2; |
|
|
|
} |
|
|
@@ -1122,10 +1074,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
case L('l', 'a'): // Latin |
|
|
|
{ |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; // includes a,e,i,o,u-macron |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; |
|
|
|
tr->langopts.unstressed_wd1 = 0; |
|
|
|
tr->langopts.unstressed_wd2 = 2; |
|
|
|
tr->langopts.param[LOPT_DIERESES] = 1; |
|
|
|
tr->langopts.numbers = NUM_ROMAN; |
|
|
|
tr->langopts.max_roman = 5000; |
|
|
@@ -1134,7 +1082,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
case L('l', 't'): // Lithuanian |
|
|
|
{ |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; |
|
|
|
tr->langopts.unstressed_wd1 = 0; |
|
|
|
tr->langopts.unstressed_wd2 = 2; |
|
|
@@ -1151,7 +1098,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_lv, stress_amps_lv); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.spelling_stress = 1; |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_4 | NUM_ORDINAL_DOT; |
|
|
@@ -1173,7 +1119,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->letter_groups[0] = tr->letter_groups[7] = vowels_cyrillic; |
|
|
|
tr->letter_bits_offset = OFFSET_CYRILLIC; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_3R; // antipenultimate |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_2; |
|
|
|
tr->langopts.numbers2 = 0x8a; // variant numbers before thousands,milliards |
|
|
|
} |
|
|
@@ -1182,7 +1127,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
{ |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_3; |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; // penultimate |
|
|
|
tr->langopts.numbers = 1; |
|
|
|
} |
|
|
|
break; |
|
|
@@ -1190,12 +1134,10 @@ Translator *SelectTranslator(const char *name) |
|
|
|
{ |
|
|
|
static const short stress_lengths_nl[8] = { 160, 135, 210, 210, 0, 0, 260, 280 }; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.vowel_pause = 0x30; // ?? |
|
|
|
tr->langopts.param[LOPT_DIERESES] = 1; |
|
|
|
tr->langopts.param[LOPT_PREFIXES] = 1; |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT; |
|
|
|
tr->langopts.ordinal_indicator = "e"; |
|
|
@@ -1208,8 +1150,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_no[8] = { 160, 140, 200, 200, 0, 0, 220, 230 }; |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_no, NULL); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT; |
|
|
|
} |
|
|
|
break; |
|
|
@@ -1219,7 +1159,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_om[8] = { 200, 200, 200, 200, 0, 0, 200, 200 }; |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_om, stress_amps_om); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | 0x80000; |
|
|
|
tr->langopts.numbers = NUM_OMIT_1_HUNDRED | NUM_HUNDRED_AND; |
|
|
|
tr->langopts.numbers2 = 0x200; // say "thousands" before its number |
|
|
@@ -1233,14 +1172,12 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_pl, stress_amps_pl); |
|
|
|
|
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY; // mark unstressed final syllables as diminished |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x9; |
|
|
|
tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2; |
|
|
|
tr->langopts.numbers2 = NUM2_THOUSANDS_VAR3; |
|
|
|
tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt) |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
} |
|
|
|
break; |
|
|
|
case L('p', 't'): // Portuguese |
|
|
@@ -1251,12 +1188,10 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_pt, stress_amps_pt); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_INITIAL_2 | S_PRIORITY_STRESS; |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN_CAPITALS; |
|
|
|
tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS | NUM2_ORDINAL_NO_AND; |
|
|
|
tr->langopts.max_roman = 5000; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
ResetLetterBits(tr, 0x2); |
|
|
|
SetLetterBits(tr, 1, "bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y |
|
|
|
tr->langopts.param[LOPT_ALT] = 2; // call ApplySpecialAttributes2() if a word has $alt or $alt2 |
|
|
@@ -1270,7 +1205,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_ro, stress_amps_ro); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_VOWEL_UNSTRESSED | S_FINAL_DIM_ONLY; |
|
|
|
|
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
@@ -1299,7 +1233,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_sk, stress_amps_sk); |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; |
|
|
|
tr->langopts.max_initial_consonants = 5; |
|
|
@@ -1314,8 +1247,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
if (name2 == L('c', 's')) |
|
|
|
tr->langopts.numbers2 = 0x108; // variant numbers before milliards |
|
|
|
|
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
SetLetterVowel(tr, 'r'); |
|
|
|
ResetLetterBits(tr, 0x20); |
|
|
|
SetLetterBits(tr, 5, sk_voiced); |
|
|
|
} |
|
|
@@ -1325,7 +1256,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_ta, stress_amps_ta); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
|
tr->langopts.spelling_stress = 1; |
|
|
|
|
|
|
@@ -1347,7 +1277,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
break; |
|
|
|
case L('s', 'l'): // Slovenian |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_2; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; // Temporary |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x103; |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x76; // [v] don't count this character at start of word |
|
|
@@ -1366,9 +1295,7 @@ Translator *SelectTranslator(const char *name) |
|
|
|
|
|
|
|
SetupTranslator(tr, stress_lengths_sq, stress_amps_sq); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2 | S_FINAL_VOWEL_UNSTRESSED; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_DFRACTION_4; |
|
|
|
tr->langopts.accents = 2; // "capital" after letter name |
|
|
|
} |
|
|
@@ -1379,8 +1306,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
static const short stress_lengths_sv[8] = { 160, 135, 220, 220, 0, 0, 250, 280 }; |
|
|
|
SetupTranslator(tr, stress_lengths_sv, stress_amps_sv); |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
SetLetterVowel(tr, 'y'); |
|
|
|
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_1900; |
|
|
|
tr->langopts.accents = 1; |
|
|
|
} |
|
|
@@ -1395,7 +1320,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.vowel_pause = 1; |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_2R; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; |
|
|
|
tr->langopts.max_initial_consonants = 4; // for example: mwngi |
|
|
|
|
|
|
@@ -1412,7 +1336,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_ta2, stress_amps_ta); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; // use 'diminished' for unstressed final syllable |
|
|
|
tr->langopts.spelling_stress = 1; |
|
|
|
tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 |
|
|
@@ -1429,7 +1352,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
tr->letter_bits_offset = OFFSET_MALAYALAM; |
|
|
|
tr->langopts.numbers = NUM_OMIT_1_THOUSAND | NUM_OMIT_1_HUNDRED; |
|
|
|
tr->langopts.numbers2 = NUM2_OMIT_1_HUNDRED_ONLY; |
|
|
|
tr->langopts.stress_rule = 13; // 1st syllable, unless 1st vowel is short and 2nd is long |
|
|
|
} else if (name2 == L('k', 'n')) { |
|
|
|
tr->letter_bits_offset = OFFSET_KANNADA; |
|
|
|
tr->langopts.numbers = 0x1; |
|
|
@@ -1451,7 +1373,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_tr, stress_amps_tr); |
|
|
|
tr->encoding = ESPEAKNG_ENCODING_ISO_8859_9; |
|
|
|
|
|
|
|
tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress |
|
|
|
tr->langopts.dotless_i = 1; |
|
|
|
tr->langopts.param[LOPT_SUFFIX] = 1; |
|
|
@@ -1467,7 +1388,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
{ |
|
|
|
SetCyrillicLetters(tr); |
|
|
|
SetupTranslator(tr, stress_lengths_fr, stress_amps_fr); |
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; // no automatic secondary stress |
|
|
|
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_4; |
|
|
|
} |
|
|
@@ -1510,7 +1430,6 @@ Translator *SelectTranslator(const char *name) |
|
|
|
SetupTranslator(tr, stress_lengths_vi, stress_amps_vi); |
|
|
|
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable |
|
|
|
|
|
|
|
tr->langopts.stress_rule = STRESSPOSN_1L; |
|
|
|
tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word |
|
|
|
tr->letter_groups[0] = tr->letter_groups[7] = vowels_vi; |
|
|
|
tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() |
|
|
@@ -1585,7 +1504,6 @@ static void Translator_Russian(Translator *tr) |
|
|
|
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word |
|
|
|
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 1; |
|
|
|
tr->langopts.param[LOPT_REDUCE] = 2; |
|
|
|
tr->langopts.stress_rule = 5; |
|
|
|
tr->langopts.stress_flags = S_NO_AUTO_2; |
|
|
|
|
|
|
|
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; |