| @@ -93,6 +93,12 @@ _tld t'Ild@ | |||
| v faU | |||
| x Iks | |||
| // Alphabets | |||
| _ar aR'AbIS | |||
| _cyr ky:R'IlIS | |||
| _he hEbr'E:IS | |||
| // Numbers | |||
| //======== | |||
| _0 'nUl | |||
| @@ -225,8 +225,9 @@ _₠ jU@roU | |||
| ♭ flat | |||
| ¬ n0t_|saIn | |||
| √ skw,e@r'u:t | |||
| ∞ Inf'InI2tI2 | |||
| ∞ Inf'InI2ti | |||
| ≠ n0t'i:kw@LtU | |||
| ∫ IntIgr@L | |||
| № nju:m@roU | |||
| । dVnda# | |||
| ● bl,aks'3:k@L | |||
| @@ -249,6 +250,140 @@ _₠ jU@roU | |||
| ʧ tSES | |||
| ʤ dZEZ | |||
| // Language names | |||
| _el gr'i:k | |||
| _cyr sI2r'IlIk | |||
| _hy A@m'i:ni@n | |||
| _he h'i:bru: | |||
| _ar 'ar@bIk | |||
| _dv t'A:na# | |||
| _hi h'Indi | |||
| _bn bEng'A:li | |||
| _gur g'U@mUki | |||
| _gu gu:dZ3r'A:ti | |||
| _or 0r'i@ | |||
| _ta t'amI2l | |||
| _kn k'A:na#d@ | |||
| _ml maleI'A:l@m | |||
| _si sI2nh'A:l@ | |||
| _th t'aI | |||
| _lo l'aU | |||
| _ti tI2b'Et@n | |||
| _my mj'A:nmA@ | |||
| _ka dZ'O@dZ@n | |||
| _ko k3r'i@n | |||
| _eth i:TI'0pIk | |||
| // Cyrillic letters | |||
| а a | |||
| б bE | |||
| в vE | |||
| г gE | |||
| д dE | |||
| е jE | |||
| ё jo | |||
| ж ZE | |||
| з zE | |||
| и I | |||
| й ,Ik@-*'atkOji | |||
| к ka | |||
| л El/1 | |||
| м Em | |||
| н En | |||
| о o | |||
| п pE | |||
| р Er | |||
| с Es | |||
| т tE | |||
| у u | |||
| ф Ef | |||
| х xa | |||
| ц tsE | |||
| ч tSE | |||
| ш Sa | |||
| щ StSa | |||
| ъ jEr | |||
| ы _^_RU | |||
| ь jer | |||
| э E | |||
| ю ju | |||
| я ja | |||
| // Arabic letters | |||
| ء h'amza | |||
| آ 'Elifm,adda# | |||
| أ 'Elifh,amza | |||
| ا 'Elif | |||
| ب bE? | |||
| ة t'E?maR2b'uta# | |||
| ت tE? | |||
| ث TE? | |||
| ج ZIm | |||
| ح hE? | |||
| خ xE? | |||
| د dEl/1 | |||
| ذ DEl/1 | |||
| ر R2A:? | |||
| ز zEjn | |||
| س si:n | |||
| ش Si:n | |||
| ص sO:d@- | |||
| ض dO:d@- | |||
| ط thA:? | |||
| ظ DA:? | |||
| ع ?ajn | |||
| غ Q"ajn | |||
| ف fE? | |||
| ق qO:f | |||
| ك kEf | |||
| ل lEm | |||
| م mi:m | |||
| ن nu|:n | |||
| ه hE? | |||
| و wO:w | |||
| ي jE? | |||
| َ a | |||
| ِ i | |||
| ُ u | |||
| ّ S'ada# | |||
| ْ suk'un | |||
| // Hebrew letters | |||
| א 'alef_ | |||
| ב bet_ | |||
| ג 'gimel_ | |||
| ד 'dalet_ | |||
| ה he_ | |||
| ו vav_ | |||
| ז z'ajin_ | |||
| ח xet_ | |||
| ט tet_ | |||
| י jod_ | |||
| ך kaf_ | |||
| כ kaf_ | |||
| ל l'amed_ | |||
| ם mem_ | |||
| מ mem_ | |||
| ן nun_ | |||
| נ nun_ | |||
| ס s'amex_ | |||
| ע ?'ajin_ | |||
| ף pe_ | |||
| פ pe_ | |||
| ץ ts'adi_ | |||
| צ ts'adi_ | |||
| ק kuf_ | |||
| ר ReS_ | |||
| ש Sin_ | |||
| ת tav_ | |||
| // phonetic modifiers | |||
| ː lENT@nd_ | |||
| U+2b0 aspI2reItI2d_ // supr-h | |||
| @@ -389,6 +524,7 @@ id $abbrev | |||
| ie aIi:_! $pause $only | |||
| i.e aIi:_! $pause | |||
| imo $abbrev | |||
| inlb $abbrev | |||
| irc $abbrev | |||
| irs $abbrev | |||
| itx $abbrev | |||
| @@ -443,6 +579,7 @@ utc $abbrev | |||
| uv $abbrev | |||
| VI $abbrev | |||
| wwii dVb@Lju:dVb@Lju:t'u: | |||
| xl $abbrev // not roman 40 | |||
| xxx $abbrev // not roman 30 | |||
| xy $abbrev | |||
| yd $abbrev | |||
| @@ -814,12 +951,14 @@ brie bri: | |||
| bridal braId@L | |||
| brigade $2 | |||
| brigadier brIga#d'i@3 | |||
| brioche bri:'oUS | |||
| broccoli br0k@li | |||
| brochure broUS3 | |||
| ?3 brochure broU'SU@r | |||
| brooch broUtS | |||
| budgerigar bVdZ@rIgA@ | |||
| buffet bVfeI | |||
| ?3 bulimia bUl'Imi@ | |||
| bunion bVnI2@n | |||
| bureaucracy bjU@'0kr@si | |||
| bursar b3:s3 | |||
| @@ -875,6 +1014,7 @@ carburetor kA@b@r'Et3 | |||
| ?3 carburetor kA@b@reIt3 | |||
| career k@r'i@3 | |||
| caress k@rEs | |||
| carousel kar@s'El | |||
| carpel kA@p@l | |||
| cascade $alt3 | |||
| cashier kaS'i@3 | |||
| @@ -1056,8 +1196,7 @@ convent k0nv@nt | |||
| converse $1 $only | |||
| converse $verb | |||
| convert $1 $noun | |||
| convict $1 $onlys | |||
| convict $verb | |||
| convict $2 $verb | |||
| convolute k0nv@l'u:t | |||
| coop ku:p | |||
| cooper ku:p3 | |||
| @@ -1483,7 +1622,6 @@ haha hA:h'A: | |||
| halleluiah halI2'lu:j@ | |||
| hallelujah halI2'lu:j@ | |||
| halloween $3 | |||
| hallucinate $alt3 | |||
| halogen hal@dZ@n | |||
| hanged haNd | |||
| harem hA:r'i:m | |||
| @@ -1641,6 +1779,7 @@ itinerary aIt'In@r@rI | |||
| ja jA: | |||
| jagged dZagI#d | |||
| jaguar dZagwA@ | |||
| jalapeno hA:l@p'eIn;oU | |||
| japan dZ@pan | |||
| jasmine dZazmIn | |||
| jedi dZEdaI | |||
| @@ -1651,6 +1790,7 @@ jukebox dZu:kb0ks | |||
| july dZu:l'aI | |||
| kaput $alt3 | |||
| karaoke karI'oUki | |||
| karate k@rA:ti | |||
| kebab k@bab | |||
| ?3 kebab k@bA:b | |||
| @@ -1936,6 +2076,7 @@ nosedive noUzdaIv | |||
| nosir noUs3: | |||
| not noUt // for noted, notable, etc | |||
| nots n0ts | |||
| (nôtre dame) noUtr@'dA:m | |||
| nott n0t | |||
| nothing nVTIN | |||
| notwithstanding $3 | |||
| @@ -2027,6 +2168,7 @@ oxymoron $3 | |||
| padre pA:dreI | |||
| paella paI'El@ | |||
| palling palIN | |||
| palsy pO:lzi | |||
| papa pa#p'A: | |||
| ?3 papa pA:p@ | |||
| papal peIp@L | |||
| @@ -2116,7 +2258,7 @@ pizzeria pi:ts@r'i@ | |||
| plaguing pleIgIN | |||
| playtest pleItEst | |||
| plaza plA:z@ | |||
| plebeian pl@b'i@n | |||
| plebeian pl@b'i:@n | |||
| plethora plET3r@ | |||
| plicate $2 | |||
| plumber plVm3 | |||
| @@ -2128,6 +2270,7 @@ poll poUl | |||
| polyamide p0lI'eImaId | |||
| polythene $1 | |||
| portend po@t'End | |||
| ?!3 portrait po@treIt | |||
| poseidon p@saId@n | |||
| posse p0si | |||
| postage poUstI2dZ | |||
| @@ -2370,19 +2513,18 @@ salad sal@d | |||
| salami $alt3 | |||
| saline seIlaIn | |||
| ?3 saline seIli:n | |||
| salmon sam@n | |||
| ?3 salon $alt3 | |||
| saloon $alt3 | |||
| san ,san $only | |||
| sardine $2 | |||
| satan seIt@n | |||
| satanist seIt@nIst | |||
| satanic $alt3 | |||
| saucepan sO:sp@n | |||
| saudi saUdi | |||
| saute sO:teI | |||
| ?3 savant sa#vA:nt | |||
| says sEz | |||
| scaly skeIlI | |||
| salmon sam@n | |||
| scalpel skalp@L | |||
| scared ske@d | |||
| scaring ske@rIN | |||
| @@ -2458,6 +2600,8 @@ sierra si:'e@r@ | |||
| signage saInI2dZ | |||
| signal sIgn@l // signaled | |||
| signer saIn3 | |||
| signoff s,aIn'0f | |||
| signon s,aIn'0n | |||
| signup saInVp | |||
| sikh si:k | |||
| silo saIloU | |||
| @@ -2932,7 +3076,6 @@ Belgrade $2 | |||
| Belize bEl'i:z | |||
| Bengal b,Eng'O:l | |||
| Benin bEnIn | |||
| Berlin b3:l'In | |||
| Bhutan bu:t'an | |||
| Bideford bIdIf@d | |||
| Bogota b0g@t'A: | |||
| @@ -2993,6 +3136,7 @@ Geneva dZ@ni:v@ | |||
| Gdansk g@-dansk | |||
| Gibraltar $2 | |||
| Gomera goUm'e@r@ | |||
| Gurmukhi gU@mUki | |||
| Harare ha#rA:ri | |||
| Hanoi han'OI | |||
| Havana ha#van@ | |||
| @@ -3073,6 +3217,7 @@ Moroccan m@r0k@n | |||
| Montana m0nt'an@ | |||
| Monte m0nt2i | |||
| Munich mju:nIk | |||
| Myanmar mjA:nmA@ | |||
| Nairobi naIr'oUbi | |||
| Naples neIp@Lz | |||
| Nauru naUru: | |||
| @@ -3136,6 +3281,7 @@ Sumatran su:m'A:tr@n | |||
| Suriname sU@rIn'am | |||
| Taipei t,aIp'eI | |||
| Taiwan taI'wA:n | |||
| Taiwanese taIw@n'i:z | |||
| Tawakoni ta#wA:k@ni | |||
| Tblisi t@-bli:si | |||
| Tehran te@r'A:n | |||
| @@ -3348,7 +3494,7 @@ Jacob dZeIk@b | |||
| Jacques Zak | |||
| Jamie dZeImi | |||
| Jared dZar@d | |||
| Jarred dZar@d | |||
| Jarrad dZar@d | |||
| Jesus dZi:z@s | |||
| Jonah dZoUn@ | |||
| José hoUs'eI | |||
| @@ -3496,6 +3642,7 @@ Tricia trIS@ | |||
| Vanessa $alt3 | |||
| Wallace w0lI#s | |||
| Wally w0li | |||
| ?3 William wIlj@m | |||
| Yves i:v | |||
| Yvonne $2 | |||
| Zoe zoUi | |||
| @@ -3510,6 +3657,7 @@ Boswell b0zwEl | |||
| Buchanan bju:k'an@n | |||
| Cabrillo ka#bri:oU | |||
| Campbell kamb@l | |||
| Capone ka#poUn | |||
| Carnegie kA@n@gi | |||
| Cohen koU@n | |||
| Cthulhu k@-Tu:l#u: | |||
| @@ -3529,6 +3677,7 @@ Gibson gIbs@n | |||
| Guinness gInIs | |||
| Hades heIdi:z | |||
| Hamilton ham@Lt@n | |||
| Hoosier hu:Z3 | |||
| Jacobi dZa#koUbi | |||
| Kendell kEnd@L | |||
| Kyocera kaI|@s'i@r@ | |||
| @@ -3555,7 +3704,9 @@ Rivera rI2ve@r@ | |||
| Rizzoli rI2zoUli | |||
| Rodrigues r0dr'i:gEz | |||
| Sanchez santSEz | |||
| Shakur Sa#kU@ | |||
| Tzu tsu: | |||
| Versace v3sA:tSi | |||
| Wii wi:: | |||
| Yaesu jeIsu: | |||
| Yamaha jam@hA: | |||
| @@ -53,7 +53,7 @@ | |||
| -) a (- a# | |||
| _) a (- 'eI | |||
| _) a (-half a# | |||
| X) a ($w_alt3+++ a# | |||
| X) a ($w_alt3++++ a# | |||
| sw) a (B 0 | |||
| a (Be# eI | |||
| w) a (Be# eI | |||
| @@ -155,6 +155,7 @@ | |||
| @) a (tious 'eI | |||
| n) a (tur eI | |||
| n) a (tura a | |||
| &) a (ture_ @ | |||
| sign) a (ture I | |||
| _) a (ve a | |||
| _) a (viat eI | |||
| @@ -499,6 +500,7 @@ | |||
| aise (_ 'eIz | |||
| _c) ais (l aS // 'caislin' | |||
| @l) ais (_ eI | |||
| portr) ai (t I# | |||
| .group al | |||
| _) al (@ a#l | |||
| @@ -532,6 +534,7 @@ | |||
| _) al (i al | |||
| _) al (ig a#l | |||
| X) al (in eIl | |||
| st) al (in A:l | |||
| _) ali (Be a#laI | |||
| &) ali (sC_ @lI | |||
| &) al (isCic @l | |||
| @@ -620,6 +623,7 @@ | |||
| f) all (ib al | |||
| _C) all (ow al | |||
| h) all (C O:l | |||
| h) all (uc a#l | |||
| sm) all O:l | |||
| st) all O:l | |||
| t) all O:l | |||
| @@ -686,7 +690,7 @@ | |||
| und) am (en @m | |||
| _) am (en a#m | |||
| ame (nab a#mi: | |||
| _l) ame (nt %amE | |||
| _l) am (ent a#m | |||
| amm (end a#m | |||
| amoeb a#mi:b | |||
| f) amil amIl | |||
| @@ -748,6 +752,7 @@ | |||
| &) an (ty_ @n | |||
| &) an (t_ @n | |||
| &) an (t_$w_alt an | |||
| ?3 &) an (t_$w_alt A:n | |||
| ?8 &) an (t_ a#n | |||
| _f) an (at a#n | |||
| pl) an (t_ an | |||
| @@ -900,7 +905,7 @@ | |||
| _p) ara (de @reI | |||
| &t) ar (_ 3 | |||
| st) ar (_ A@ | |||
| guit) ar (_ A@ | |||
| guit) ar 'A@ | |||
| _t) ar (_ A@ | |||
| &) ar (dis 3 | |||
| &) ar (diz 3 | |||
| @@ -1084,6 +1089,7 @@ | |||
| w) ast (e# eIst | |||
| .group at | |||
| _s) ata (n eIt@ | |||
| _g) ator eIt3 | |||
| &) ate (_$w_alt2 @t | |||
| pal) ate (_ @t | |||
| @@ -1101,7 +1107,7 @@ | |||
| par) ates (_ eIt|s | |||
| @) ated (++_ eItId | |||
| _s) ate (ll at@ | |||
| @) ati (_ 'A:tI | |||
| @) ati (_ 'A:ti | |||
| at (im_ 'eIt | |||
| @) ating (++_ eItIN | |||
| &) at (ive @t | |||
| @@ -1126,7 +1132,7 @@ | |||
| @) ath (An_ @T | |||
| athed (_ eIDd | |||
| athei eITI2I | |||
| &) athy =@TI2 | |||
| &) athy (_ =@TI2 | |||
| @) ath (is =@T | |||
| _) at (lan a#t | |||
| at (omi a#t | |||
| @@ -1231,7 +1237,7 @@ | |||
| .group b | |||
| b b | |||
| _) bh b | |||
| _) bh (@ b | |||
| _) b (L01Y b // allow _bl _br | |||
| _) bj (A bj | |||
| _) brz (e brz | |||
| @@ -1289,6 +1295,7 @@ | |||
| benevo b@nEv@ | |||
| _) be (o beI | |||
| be (qu bI2 | |||
| _) berlin %b3:lIn | |||
| _) ber (s b3 | |||
| be (see bI2 | |||
| be (sie bI2 | |||
| @@ -1594,7 +1601,7 @@ | |||
| co (ntrol+ k@ | |||
| conva (l k0nv@ | |||
| _) co (nvenA k@ | |||
| _) co (nvi k@ | |||
| _) co (nvi k0# | |||
| _) co (nvoy k0 | |||
| _) co (nw k0 | |||
| _) copy k0pI | |||
| @@ -2200,6 +2207,7 @@ | |||
| h) emorrh Em@r | |||
| sph) em @m | |||
| sph) em (e 'i:m | |||
| _s) ema (nti @ma | |||
| &) em (y_ @m | |||
| yst) em @m | |||
| yst) em (i Em | |||
| @@ -2378,6 +2386,7 @@ | |||
| erred (_ '3:d | |||
| er (_ 3: | |||
| er (B_ 3: | |||
| _c) ere (br 3ri: | |||
| &) ere (_ 3 | |||
| ere (_ 3: | |||
| &) er (s_ 3 | |||
| @@ -2987,7 +2996,7 @@ | |||
| &) ia (n i@ | |||
| @) ia (nic I'a | |||
| @) ia (nit I'a | |||
| @) ia (na i:'a | |||
| @) ia (na_ i:'a | |||
| ia (ng_ ja | |||
| _f) ia (nc I'0 | |||
| _f) iance I'0nseI | |||
| @@ -3467,6 +3476,7 @@ | |||
| an) ism (_S3d Iz@m | |||
| @iB) ism (_S3d Iz@m | |||
| @) ism (_S3de Iz@m | |||
| et) ism (_S3 Iz@m | |||
| is (o_ aIz | |||
| is (or_ aIz | |||
| iss (a_ 'Is | |||
| @@ -3575,6 +3585,7 @@ | |||
| _) ja (mai dZa# | |||
| _) jere (C dZEr@ | |||
| _) jes (ui dZEz | |||
| _) jiha (d dZI2hA: | |||
| _) joa (n@ dZoU'a | |||
| n) j (a_ j | |||
| j (ü j | |||
| @@ -4706,7 +4717,7 @@ | |||
| per (fec p3 | |||
| _) per (iC@@ p,Er | |||
| _) perini pErIn'i: | |||
| per (iph p3r | |||
| _) per (iph p3r | |||
| _) per (isc pEr | |||
| _) per (ish pEr | |||
| perme (a p3:mI | |||
| @@ -4946,7 +4957,7 @@ | |||
| _) re (i@P2 r,i: | |||
| _) rei (c raI | |||
| _) rei (l raI | |||
| _) rei (s raI | |||
| _) reis raIz | |||
| _) re (iss r%i: | |||
| _) rele (g rElI2 | |||
| rele (nt rI2lE | |||
| @@ -5845,6 +5856,7 @@ | |||
| _) zs (Y z | |||
| _) z (wY z | |||
| n) z (_ ts | |||
| @) zales (_ z'A:l@s | |||
| zei zaI | |||
| zes (_ zI2z | |||
| @@ -6051,6 +6063,7 @@ | |||
| // ñ nj | |||
| ñ _^_ES | |||
| _) ʻ (A ? // arabic | |||
| ' | |||
| ! _:Ekskl@meIS@n_: | |||
| @@ -5421,6 +5421,12 @@ _ˇ lEfEle:n^i:l | |||
| _¡ AlSo:indEks | |||
| // Alphabets | |||
| _ar 'AR2Ab | |||
| _cry ts'iR2ill | |||
| _he h'e:bER2 | |||
| // Main Exceptions List | |||
| //===================== | |||
| @@ -703,6 +703,27 @@ zwanger $alt | |||
| Vlaander $alt | |||
| // -s is not a suffix | |||
| as $alt | |||
| bres $alt | |||
| chaos $alt $1 | |||
| es $alt | |||
| fles $alt | |||
| fris $alt | |||
| glas $alt | |||
| mes $alt | |||
| moeras $alt | |||
| was $alt // gewas | |||
| // -s, just remove 's' from the plural | |||
| charges $alt2 | |||
| curves $alt2 | |||
| droogtes $alt2 | |||
| groeves $alt2 | |||
| hoeves $alt2 | |||
| reserves $alt2 | |||
| marges $alt2 | |||
| marge mArZ@ | |||
| // words where -age is [a:Q@] not French ['a:Z@] | |||
| drage $alt | |||
| @@ -1370,9 +1391,6 @@ meppel $alt | |||
| moesel muz@l | |||
| vondel $alt | |||
| // -s is not plural | |||
| chaos xa:Os | |||
| // all words on _aard are treated as suffix in the rules. | |||
| @@ -30,7 +30,7 @@ | |||
| m) ach (in %a:S | |||
| _) af (C@P2 'Af | |||
| _) affich %AfiS | |||
| age (_N 'a:Z@ | |||
| age (_ 'a:Z@ | |||
| ages (_S1 s | |||
| age (_$w_alt a:Q@ | |||
| aille (_ 'Aj@ | |||
| @@ -45,6 +45,7 @@ | |||
| @) ant (e_ 'Ant | |||
| @) ant (en_ 'Ant | |||
| @) ant (er_ 'Ant | |||
| @) ares (_ a:r'Es | |||
| aris (_ 'a:rIs | |||
| arissen (_ 'a:rIs@n | |||
| a (tor_ 'a: | |||
| @@ -243,8 +244,10 @@ | |||
| @) ent (st_ 'Ent | |||
| @) ent (ste_ 'Ent | |||
| ag) ent 'Ent | |||
| @j) es (_ @s | |||
| @j) es (_S1 s | |||
| @z) es (_S1 s | |||
| @) es (_S2qd 'Es // double the previous vowel | |||
| @) es (_$w_alt2S1 s // just remove 's' | |||
| KAC) es (_S2e @s | |||
| @) essen (_S5qd 'Es@n | |||
| @) eres (_S4qd @r'Es | |||
| @@ -400,6 +403,9 @@ | |||
| _) in (C@P2 'In | |||
| // _) in (gP2 'In | |||
| io (nage iO | |||
| io (de_ i'o: | |||
| iodes (_ i'o:d@s | |||
| is (_ Is | |||
| @) isch (_ =is | |||
| @) ische (_ =is@ | |||
| @) isme (_ 'Ism@ | |||
| @@ -449,6 +455,7 @@ _) inn (@P2 'I // ?? inneren | |||
| management ma:nIdZm@nt | |||
| _) mee (@P3 m'e: | |||
| menu (_ m@ny | |||
| _) mi (cro mi | |||
| _) mi (s@ m%I | |||
| _) mis (anC miz | |||
| _) mis (commP3 m'Is | |||
| @@ -526,6 +533,7 @@ _) inn (@P2 'I // ?? inneren | |||
| _) openings (P8 'o:p@nINs | |||
| _) op (era 'o:p | |||
| _) op (tion Op | |||
| os (_ Os | |||
| ou (che_ u | |||
| ouch (en_ uS | |||
| d) ou (blu u | |||
| @@ -620,6 +628,7 @@ _) inn (@P2 'I // ?? inneren | |||
| sj S | |||
| @) sje (_ sj@ | |||
| @) s (_S1 s | |||
| @) s (_$w_alt =s | |||
| sc (oop sk | |||
| sc (opi sk | |||
| @@ -702,6 +711,7 @@ _) inn (@P2 'I // ?? inneren | |||
| uw (_ yU | |||
| _) uit (@P3 'Wyt | |||
| us (_ 8s | |||
| u (sie_ 'y | |||
| @) ute (_ 'yt | |||
| uu (r_ 'y | |||
| @@ -41,6 +41,11 @@ _stk b'ax& | |||
| _tld tS'iU | |||
| ?1 _tld til | |||
| // alphabets | |||
| _ar 'a*aby | |||
| _cyr si*'ilikU | |||
| _he eb*'aIkU | |||
| // character names | |||
| @@ -372,38 +377,38 @@ do $u $nounf | |||
| da $u $nounf | |||
| dos $u $nounf | |||
| das $u $nounf | |||
| dum $u | |||
| duma $u | |||
| duns $u | |||
| dumas $u | |||
| dum $u $nounf | |||
| duma $u $nounf | |||
| duns $u $nounf | |||
| dumas $u $nounf | |||
| em $u // in,on,at | |||
| no nu $u $nounf | |||
| na $u $nounf | |||
| num $u | |||
| numa $u | |||
| nuns $u | |||
| numas $u | |||
| num $u $nounf | |||
| numa $u $nounf | |||
| nuns $u $nounf | |||
| numas $u $nounf | |||
| por $u $nounf // by,for,through | |||
| pelo $u $nounf | |||
| ?2 pela $u $nounf p'el& | |||
| ao $u | |||
| ao $u $nounf | |||
| à ,a: | |||
| à $atend $atstart $accent | |||
| aos $u | |||
| às ,a:s | |||
| aos $u $nounf | |||
| às ,a:s $nounf | |||
| para $u // for,to | |||
| pro $u $nounf | |||
| pra $u | |||
| pros $u | |||
| pras $u | |||
| prò $u | |||
| prà $u | |||
| pròs $u | |||
| pràs $u | |||
| pra $u $nounf | |||
| pros $u $nounf | |||
| pras $u $nounf | |||
| prò $u $nounf | |||
| prà $u $nounf | |||
| pròs $u $nounf | |||
| pràs $u $nounf | |||
| com $u // with | |||
| ?2 sem // without | |||
| @@ -660,6 +665,7 @@ atrozes $alt | |||
| austera $alt | |||
| austero $alt | |||
| autora $alt2 | |||
| avesso $alt2 | |||
| axé aSE | |||
| baqueta $alt2 | |||
| beco $alt2 | |||
| @@ -696,6 +702,8 @@ cateto $alt2 | |||
| catorze $alt2 | |||
| cebola $alt2 | |||
| cefaleia $alt | |||
| cerca $alt | |||
| cerca $alt2 $noun | |||
| cerco $alt $verb | |||
| cesta $alt2 | |||
| cesto $alt2 | |||
| @@ -361,6 +361,7 @@ _estend) e (L06_ e | |||
| _vend) e (L06_ e | |||
| respond) e (L06_ e // cor- | |||
| _aborrec) e (L07_ e | |||
| _rejuvenec) e (L07_ e | |||
| _adoec) e (L07_ e | |||
| _amanhec) e (L07_ e | |||
| _anoitec) e (L07_ e | |||
| @@ -398,6 +399,7 @@ entend) e (L07_ e | |||
| padec) e (L07_ e // com- | |||
| parec) e (L07_ e // a- rea- com- desa- | |||
| preend) e (L07_ e // sur- com- | |||
| _perec) e (L07_ e | |||
| respond) e (L07_ e // cor- | |||
| torc) e (L07_ e // con- | |||
| venc) e (L07_ e // con- | |||
| @@ -430,6 +432,7 @@ respond) e (L07_ e // cor- | |||
| _alb) e (rguL02_ E | |||
| _enx) e (rguL02_ E | |||
| _bez) e (rrL03_ e | |||
| _rejuven) e (çL03_ e | |||
| _inv) e (rtL03_ e | |||
| _f) e (rvL03_ e | |||
| _p) e (scL03_ E | |||
| @@ -354,20 +354,17 @@ phoneme t | |||
| vls alv stop | |||
| voicingswitch d | |||
| lengthmod 2 | |||
| Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | |||
| Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
| // IF prevPhW(isVowel) OR prevPhW(n) THEN | |||
| IF prevPhW(isVowel) THEN // test, don't reduce [t] after [n] | |||
| IF nextPhW(isVowel) AND nextPh(isUnstressed) THEN | |||
| IF next2Ph(n) AND next2Ph(notWordStart) THEN | |||
| ELSE | |||
| ChangePhoneme(t#) | |||
| ENDIF | |||
| IF nextPhW(isVowel) AND nextPh(isUnstressed) AND NOT next2PhW(n) THEN | |||
| IF prevPhW(isVowel) THEN | |||
| ChangePhoneme(t#) | |||
| ELIF prevPhW(n) THEN | |||
| WAV(ustop/t, 60) | |||
| ENDIF | |||
| ENDIF | |||
| Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | |||
| Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
| IF nextPh(isPause2) THEN | |||
| WAV(ustop/t_) | |||
| ELIF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN | |||
| @@ -40,7 +40,7 @@ phoneme &~ | |||
| ipa ɐU+0303 | |||
| length 180 | |||
| IF thisPh(isFinalVowel) THEN | |||
| FMT(vnasal/W_n) | |||
| FMT(vnasal/a#_n2) | |||
| ELSE | |||
| FMT(vnasal/a#_n) | |||
| ENDIF | |||
| @@ -1814,6 +1814,9 @@ include ph_icelandic | |||
| phonemetable vi base | |||
| include ph_vietnam | |||
| phonemetable vi-hue vi | |||
| include ph_vietnam_hue | |||
| phonemetable zhy base | |||
| include ph_zh_yue | |||
| @@ -1390,6 +1390,24 @@ static int NextItem(int type) | |||
| static int NextItemMax(int max) | |||
| {//============================== | |||
| // Get a number, but restrict value to max | |||
| int value; | |||
| char msg[80]; | |||
| value = NextItem(tNUMBER); | |||
| if(value > max) | |||
| { | |||
| sprintf(msg, "Value %d is greater than maximum %d", value, max); | |||
| error(msg, NULL); | |||
| value = max; | |||
| } | |||
| return(value); | |||
| } | |||
| static int NextItemBrackets(int type, int control) | |||
| {//=============================================== | |||
| // Expect a parameter inside parantheses | |||
| @@ -2794,17 +2812,17 @@ int CompilePhoneme(int compile_phoneme) | |||
| break; | |||
| case i_PAUSE_BEFORE: | |||
| value = NextItem(tNUMBER); | |||
| value = NextItemMax(255); | |||
| *prog_out++ = (i_PAUSE_BEFORE << 8) + value; | |||
| break; | |||
| case i_PAUSE_AFTER: | |||
| value = NextItem(tNUMBER); | |||
| value = NextItemMax(255); | |||
| *prog_out++ = (i_PAUSE_AFTER << 8) + value; | |||
| break; | |||
| case i_SET_LENGTH: | |||
| value = NextItem(tNUMBER); | |||
| value = NextItemMax(511); | |||
| if(after_if == 0) | |||
| { | |||
| phoneme_out->std_length = value/2; | |||
| @@ -2489,6 +2489,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| int ix; | |||
| unsigned int digit_count=0; | |||
| char *p; | |||
| ALPHABET *alphabet; | |||
| int dict_flags0=0; | |||
| MatchRecord match1; | |||
| MatchRecord match2; | |||
| @@ -2685,6 +2686,13 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| match1.points = 1; | |||
| p += (wc_bytes-1); | |||
| } | |||
| if(((alphabet = AlphabetFromChar(letter)) != NULL) && (alphabet->language != 0) && (alphabet->offset != tr->letter_bits_offset)) | |||
| { | |||
| // switch to the nominated language for this alphabet | |||
| sprintf(phonemes,"%c%s",phonSWITCH, WordToString2(alphabet->language)); | |||
| return(0); | |||
| } | |||
| } | |||
| } | |||
| @@ -591,15 +591,19 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control) | |||
| int letter; | |||
| int len; | |||
| int ix; | |||
| int save_option_phonemes; | |||
| char *p2; | |||
| char *pbuf; | |||
| ALPHABET *alphabet; | |||
| int language; | |||
| int phontab_1; | |||
| char capital[20]; | |||
| char ph_buf[80]; | |||
| char ph_buf2[80]; | |||
| char ph_alphabet[80]; | |||
| char hexbuf[6]; | |||
| ph_buf[0] = 0; | |||
| ph_alphabet[0] = 0; | |||
| capital[0] = 0; | |||
| n_bytes = utf8_in(&letter,word); | |||
| @@ -627,6 +631,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control) | |||
| return(0); | |||
| } | |||
| #ifdef deleted | |||
| if((ph_buf[0] == 0) && (tr->translator_name != L('e','n'))) | |||
| { | |||
| // speak as English, check whether there is a translation for this character | |||
| @@ -643,6 +648,67 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control) | |||
| return(0); | |||
| } | |||
| } | |||
| #endif | |||
| alphabet = AlphabetFromChar(letter); | |||
| if(alphabet != current_alphabet) | |||
| { | |||
| current_alphabet = alphabet; | |||
| if((alphabet != NULL) && !(alphabet->flags & AL_DONT_NAME)) | |||
| { | |||
| if(Lookup(translator, alphabet->name, ph_alphabet) == 0) // the original language for the current voice | |||
| { | |||
| // Can't find the local name for this alphabet, use the English name | |||
| phontab_1 = tr->phoneme_tab_ix; | |||
| ph_alphabet[2] = SetTranslator2("en"); // overwrites previous contents of translator2 | |||
| if(Lookup(translator2, alphabet->name, &ph_alphabet[3]) != 0) | |||
| { | |||
| ph_alphabet[0] = phonPAUSE; | |||
| ph_alphabet[1] = phonSWITCH; | |||
| len = strlen(&ph_alphabet[3]) + 3; | |||
| ph_alphabet[len] = phonSWITCH; // switch back | |||
| ph_alphabet[len+1] = phontab_1; | |||
| ph_alphabet[len+2] = 0; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| // caution: SetWordStress() etc don't expect phonSWITCH + phoneme table number | |||
| if(ph_buf[0] == 0) | |||
| { | |||
| if((alphabet != NULL) && (alphabet->language != 0) && !(alphabet->flags & AL_NOT_LETTERS)) | |||
| language = alphabet->language; | |||
| else | |||
| language = L('e','n'); | |||
| if(language != tr->translator_name) | |||
| { | |||
| // speak in the language for this alphabet (or English) | |||
| ph_buf[2] = SetTranslator2(WordToString2(language)); | |||
| LookupLetter(translator2, letter, word[n_bytes], &ph_buf[3], control & 1); | |||
| if(ph_buf[3] == phonSWITCH) | |||
| { | |||
| // another level of language change | |||
| ph_buf[2] = SetTranslator2(&ph_buf[4]); | |||
| LookupLetter(translator2, letter, word[n_bytes], &ph_buf[3], control & 1); | |||
| } | |||
| SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
| if(ph_buf[3] != 0) | |||
| { | |||
| ph_buf[0] = phonPAUSE; | |||
| ph_buf[1] = phonSWITCH; | |||
| len = strlen(&ph_buf[3]) + 3; | |||
| ph_buf[len] = phonSWITCH; // switch back | |||
| ph_buf[len+1] = tr->phoneme_tab_ix; | |||
| ph_buf[len+2] = 0; | |||
| } | |||
| } | |||
| } | |||
| if(ph_buf[0] == 0) | |||
| { | |||
| @@ -695,10 +761,11 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control) | |||
| } | |||
| len = strlen(phonemes); | |||
| if(tr->langopts.accents & 2) | |||
| sprintf(ph_buf2,"%c%s%s",0xff,ph_buf,capital); | |||
| sprintf(ph_buf2,"%c%s%s%s",0xff,ph_alphabet,ph_buf,capital); | |||
| else | |||
| sprintf(ph_buf2,"%c%s%s",0xff,capital,ph_buf); // the 0xff marker will be removed or replaced in SetSpellingStress() | |||
| sprintf(ph_buf2,"%c%s%s%s",0xff,ph_alphabet,capital,ph_buf); // the 0xff marker will be removed or replaced in SetSpellingStress() | |||
| if((len + strlen(ph_buf2)) < N_WORD_PHONEMES) | |||
| { | |||
| strcpy(&phonemes[len],ph_buf2); | |||
| @@ -714,23 +781,25 @@ void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars) | |||
| int ix; | |||
| unsigned int c; | |||
| int n_stress=0; | |||
| int prev = 0; | |||
| int count; | |||
| unsigned char buf[N_WORD_PHONEMES]; | |||
| for(ix=0; (c = phonemes[ix]) != 0; ix++) | |||
| { | |||
| if(c == phonSTRESS_P) | |||
| if((c == phonSTRESS_P) && (prev != phonSWITCH)) | |||
| { | |||
| n_stress++; | |||
| } | |||
| buf[ix] = c; | |||
| buf[ix] = prev = c; | |||
| } | |||
| buf[ix] = 0; | |||
| count = 0; | |||
| prev = 0; | |||
| for(ix=0; (c = buf[ix]) != 0; ix++) | |||
| { | |||
| if((c == phonSTRESS_P) && (n_chars > 1)) | |||
| if((c == phonSTRESS_P) && (n_chars > 1) && (prev != phonSWITCH)) | |||
| { | |||
| count++; | |||
| @@ -761,10 +830,8 @@ void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars) | |||
| c = phonPAUSE_NOLINK; // pause following a primary stress | |||
| else | |||
| c = phonPAUSE_VSHORT; | |||
| // else | |||
| // continue; // remove marker | |||
| } | |||
| *phonemes++ = c; | |||
| *phonemes++ = prev = c; | |||
| } | |||
| if(control >= 2) | |||
| *phonemes++ = phonPAUSE_NOLINK; | |||
| @@ -1,5 +1,5 @@ | |||
| /*************************************************************************** | |||
| * Copyright (C) 2005 to 2011 by Jonathan Duddington * | |||
| * Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||
| * email: [email protected] * | |||
| * * | |||
| * This program is free software; you can redistribute it and/or modify * | |||
| @@ -58,7 +58,7 @@ static const char *ungot_word = NULL; | |||
| static int end_of_input; | |||
| static int ignore_text=0; // set during <sub> ... </sub> to ignore text which has been replaced by an alias | |||
| static int audio_text=0; // set during <audio> ... </audio> | |||
| static int audio_text=0; // set during <audio> ... </audio> | |||
| static int clear_skipping_text = 0; // next clause should clear the skipping_text flag | |||
| int count_characters = 0; | |||
| static int sayas_mode; | |||
| @@ -110,7 +110,7 @@ static const unsigned short punct_chars[] = {',','.','?','!',':',';', | |||
| 0xff1a, // fullwidth colon | |||
| 0xff1b, // fullwidth semicolon | |||
| 0xff1f, // fullwidth question mark | |||
| 0}; | |||
| @@ -448,7 +448,7 @@ static int GetC_get(void) | |||
| end_of_input = 1; | |||
| return(0); | |||
| } | |||
| if(!end_of_input) | |||
| { | |||
| if(option_multibyte == espeakCHARS_16BIT) | |||
| @@ -563,8 +563,8 @@ static void UngetC(int c) | |||
| } | |||
| static const char *WordToString2(unsigned int word) | |||
| {//================================================ | |||
| const char *WordToString2(unsigned int word) | |||
| {//============================================ | |||
| // Convert a language mnemonic word into a string | |||
| int ix; | |||
| static char buf[5]; | |||
| @@ -961,7 +961,7 @@ static int AnnouncePunctuation(Translator *tr, int c1, int *c2_ptr, char *output | |||
| if(attributes & CLAUSE_BIT_SENTENCE) | |||
| return(attributes); | |||
| return(short_pause); | |||
| } // end of AnnouncePunctuation | |||
| @@ -1078,7 +1078,7 @@ static const char *VoiceFromStack() | |||
| } | |||
| p += (strlen(p) + 1); | |||
| } | |||
| if(voice_name_specified == 0) | |||
| voice_name[0] = 0; // forget a previous voice name if a language is specified | |||
| } | |||
| @@ -1248,7 +1248,7 @@ static wchar_t *GetSsmlAttribute(wchar_t *pw, const char *name) | |||
| static int attrcmp(const wchar_t *string1, const char *string2) | |||
| {//============================================================ | |||
| int ix; | |||
| if(string1 == NULL) | |||
| return(1); | |||
| @@ -1334,7 +1334,7 @@ static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out) | |||
| } | |||
| if(*pw == '-') | |||
| { | |||
| pw++; | |||
| pw++; | |||
| sign = -1; | |||
| } | |||
| value = (double)wcstod(pw,&tail); | |||
| @@ -1485,10 +1485,10 @@ static int GetVoiceAttributes(wchar_t *pw, int tag_type) | |||
| age = GetSsmlAttribute(pw,"age"); | |||
| gender = GetSsmlAttribute(pw,"gender"); | |||
| } | |||
| if((tag_type != SSML_VOICE) && (lang==NULL)) | |||
| return(0); // <s> or <p> without language spec, nothing to do | |||
| ssml_sp = &ssml_stack[n_ssml_stack++]; | |||
| attrcopy_utf8(ssml_sp->language,lang,sizeof(ssml_sp->language)); | |||
| @@ -1592,7 +1592,7 @@ static int ReplaceKeyName(char *outbuf, int index, int &outix) | |||
| {"underscore ", 0xe05f}, | |||
| {"double-quote ", '"'}, | |||
| {NULL, 0}}; | |||
| int ix; | |||
| int letter; | |||
| char *p; | |||
| @@ -1624,7 +1624,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb | |||
| int voice_change_flag; | |||
| wchar_t *px; | |||
| wchar_t *attr1; | |||
| wchar_t *attr2; | |||
| wchar_t *attr2; | |||
| wchar_t *attr3; | |||
| int terminator; | |||
| char *uri; | |||
| @@ -1688,7 +1688,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb | |||
| tag_name[ix] = 0; | |||
| px = &xml_buf[ix]; // the tag's attributes | |||
| if(tag_name[0] == '/') | |||
| { | |||
| // closing tag | |||
| @@ -2268,7 +2268,7 @@ f_input = f_in; // for GetC etc | |||
| } | |||
| xml_buf[n_xml_buf] = 0; | |||
| c2 = ' '; | |||
| self_closing = 0; | |||
| if(xml_buf[n_xml_buf-1] == '/') | |||
| { | |||
| @@ -2276,9 +2276,9 @@ f_input = f_in; // for GetC etc | |||
| xml_buf[n_xml_buf-1] = ' '; | |||
| self_closing = 1; | |||
| } | |||
| terminator = ProcessSsmlTag(xml_buf,buf,ix,n_buf,self_closing); | |||
| if(terminator != 0) | |||
| { | |||
| if(end_clause_after_tag) | |||
| @@ -2286,7 +2286,7 @@ f_input = f_in; // for GetC etc | |||
| buf[ix] = ' '; | |||
| buf[ix++] = 0; | |||
| if(terminator & CLAUSE_BIT_VOICE) | |||
| { | |||
| strcpy(voice_change, current_voice_id); | |||
| @@ -2397,7 +2397,7 @@ f_input = f_in; // for GetC etc | |||
| if(iswspace(c1)) | |||
| { | |||
| char *p_word; | |||
| if(tr->translator_name == 0x6a626f) | |||
| { | |||
| // language jbo : lojban | |||
| @@ -2514,7 +2514,7 @@ if(option_ssml) parag=1; | |||
| // Because of an xml tag, we are waiting for the | |||
| // next non-blank character to decide whether to end the clause | |||
| // i.e. is dot followed by an upper-case letter? | |||
| if(!iswspace(c1)) | |||
| { | |||
| if(!IsAlpha(c1) || !iswlower(c1)) | |||
| @@ -2548,7 +2548,7 @@ if(option_ssml) parag=1; | |||
| if((punct = lookupwchar(punct_chars,c1)) != 0) | |||
| { | |||
| punct_data = punct_attributes[punct]; | |||
| if(punct_data & PUNCT_IN_WORD) | |||
| { | |||
| // Armenian punctuation inside a word | |||
| @@ -2579,7 +2579,7 @@ if(option_ssml) parag=1; | |||
| announced_punctuation = c1; | |||
| } | |||
| } | |||
| if((punct_data & PUNCT_SAY_NAME) && (announced_punctuation == 0)) | |||
| { | |||
| // used for elipsis (and 3 dots) if a pronunciation for elipsis is given in *_list | |||
| @@ -2626,7 +2626,7 @@ if(option_ssml) parag=1; | |||
| if(c1 == '.') | |||
| { | |||
| if((tr->langopts.numbers & NUM_ORDINAL_DOT) && | |||
| if((tr->langopts.numbers & NUM_ORDINAL_DOT) && | |||
| (iswdigit(cprev) || (IsRomanU(cprev) && (IsRomanU(cprev2) || iswspace(cprev2))))) // lang=hu | |||
| { | |||
| // dot after a number indicates an ordinal number | |||
| @@ -2643,7 +2643,7 @@ if(option_ssml) parag=1; | |||
| else | |||
| if(c_next == '\'') | |||
| { | |||
| is_end_clause = 0; // eg. u.s.a.'s | |||
| is_end_clause = 0; // eg. u.s.a.'s | |||
| } | |||
| if(iswlower(c_next)) | |||
| { | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.46.37 20.Feb.13"; | |||
| const char *version_string = "1.46.38 27.Feb.13"; | |||
| const int version_phdata = 0x014636; | |||
| int option_device_number = -1; | |||
| @@ -48,6 +48,7 @@ | |||
| #define OFFSET_GREEK 0x380 | |||
| #define OFFSET_CYRILLIC 0x420 | |||
| #define OFFSET_ARMENIAN 0x530 | |||
| #define OFFSET_HEBREW 0x590 | |||
| #define OFFSET_ARABIC 0x600 | |||
| #define OFFSET_THAANA 0x780 // Divehi/Maldives | |||
| #define OFFSET_DEVANAGARI 0x900 | |||
| @@ -60,12 +61,61 @@ | |||
| #define OFFSET_KANNADA 0xc80 | |||
| #define OFFSET_MALAYALAM 0xd00 | |||
| #define OFFSET_SINHALA 0x0d80 | |||
| #define OFFSET_THAI 0x0e00 | |||
| #define OFFSET_LAO 0x0e80 | |||
| #define OFFSET_TIBET 0x0f00 | |||
| #define OFFSET_GEORGIAN 0x1080 | |||
| #define OFFSET_MYANMAR 0x1000 | |||
| #define OFFSET_GEORGIAN 0x10a0 | |||
| #define OFFSET_KOREAN 0x1100 | |||
| #define OFFSET_ETHIOPIC 0x1200 | |||
| ALPHABET alphabets [] = { | |||
| {"_el", OFFSET_GREEK, 0x380, 0x3ff, L('e','l'), AL_DONT_NAME | AL_NOT_LETTERS}, | |||
| {"_cyr", OFFSET_CYRILLIC, 0x400, 0x52f, 0, 0}, | |||
| {"_hy", OFFSET_ARMENIAN, 0x530, 0x58f, L('h','y'), 0}, | |||
| {"_he", OFFSET_HEBREW, 0x590, 0x5ff, 0, 0}, | |||
| {"_ar", OFFSET_ARABIC, 0x600, 0x6ff, 0, 0}, | |||
| {"_dv", OFFSET_THAANA, 0x780, 0x7bf, 0, 0}, | |||
| {"_hi", OFFSET_DEVANAGARI, 0x900, 0x97f,L('h','i'), 0}, | |||
| {"_bn", OFFSET_BENGALI, 0x0980, 0x9ff, 0, 0}, | |||
| {"_gur", OFFSET_GURMUKHI, 0xa00, 0xa7f, 0, 0}, | |||
| {"_gu", OFFSET_GUJARATI, 0xa80, 0xaff, 0, 0}, | |||
| {"_or", OFFSET_ORIYA, 0xb00, 0xb7f, 0, 0}, | |||
| {"_ta", OFFSET_TAMIL, 0xb80, 0xbff, L('t','a'), 0}, | |||
| {"_te", OFFSET_TELUGU, 0xc00, 0xc7f, 0, 0}, | |||
| {"_kn", OFFSET_KANNADA, 0xc80, 0xcff, L('k','n'), 0}, | |||
| {"_ml", OFFSET_MALAYALAM,0xd00, 0xd7f, L('m','l'), 0}, | |||
| {"_si", OFFSET_SINHALA, 0xd80, 0xdff, 0, 0}, | |||
| {"_th", OFFSET_THAI, 0xe00, 0xe7f, 0, 0}, | |||
| {"_lo", OFFSET_LAO, 0xe80, 0xeff, 0, 0}, | |||
| {"_ti", OFFSET_TIBET, 0xf00, 0xfff, 0, 0}, | |||
| {"_my", OFFSET_MYANMAR, 0x1000,0x109f, 0, 0}, | |||
| {"_ka", OFFSET_GEORGIAN, 0x10a0,0x10ff, L('k','a'), 0}, | |||
| {"_ko", OFFSET_KOREAN, 0x1100,0x11ff, 0, 0}, | |||
| {"_eth", OFFSET_ETHIOPIC, 0x1200,0x139f, 0, 0}, | |||
| {NULL, 0, 0, 0, 0, 0} | |||
| }; | |||
| ALPHABET *AlphabetFromChar(int c) | |||
| {//=============================== | |||
| // Find the alphabet from a character. | |||
| ALPHABET *alphabet = alphabets; | |||
| while(alphabet->name != NULL) | |||
| { | |||
| if((c >= alphabet->range_min) && (c <= alphabet->range_max)) | |||
| { | |||
| return(alphabet); | |||
| } | |||
| alphabet++; | |||
| } | |||
| return(NULL); | |||
| } | |||
| static void Translator_Russian(Translator *tr); | |||
| @@ -93,7 +143,7 @@ static void SetLetterBits(Translator *tr, int group, const char *string) | |||
| {//===================================================================== | |||
| int bits; | |||
| unsigned char c; | |||
| bits = (1L << group); | |||
| while((c = *string++) != 0) | |||
| tr->letter_bits[c] |= bits; | |||
| @@ -242,7 +292,7 @@ static const char transpose_map_latin[] = { | |||
| // common letter pairs, encode these as a single byte | |||
| // 2 bytes, using the transposed character codes | |||
| static const short pairs_ru[] = { | |||
| static const short pairs_ru[] = { | |||
| 0x010c, // ла 21052 0x23 | |||
| 0x010e, // на 18400 | |||
| 0x0113, // та 14254 | |||
| @@ -279,7 +329,7 @@ static const short pairs_ru[] = { | |||
| static const unsigned int replace_cyrillic_latin[] = | |||
| static const unsigned int replace_cyrillic_latin[] = | |||
| {0x430,'a', | |||
| 0x431,'b', | |||
| 0x446,'c', | |||
| @@ -413,7 +463,7 @@ Translator *SelectTranslator(const char *name) | |||
| 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; | |||
| } | |||
| @@ -496,7 +546,7 @@ Translator *SelectTranslator(const char *name) | |||
| // tr->langopts.intonation_group = 4; | |||
| // 'diminished' is an unstressed final syllable | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.unstressed_wd1 = 0; | |||
| tr->langopts.unstressed_wd2 = 2; | |||
| tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels | |||
| @@ -532,7 +582,7 @@ Translator *SelectTranslator(const char *name) | |||
| tr->langopts.param[LOPT_PREFIXES] = 1; | |||
| tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x100; // devoice at end of word | |||
| 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; | |||
| // tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN; | |||
| SetLetterVowel(tr,'y'); | |||
| @@ -549,7 +599,7 @@ Translator *SelectTranslator(const char *name) | |||
| tr->langopts.stress_rule = STRESSPOSN_1L; | |||
| tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable | |||
| SetLetterBitsRange(tr,LETTERGP_B,0x26,0x30); // vowel signs, and virama | |||
| tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 | |||
| tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 | |||
| tr->langopts.numbers = 1; | |||
| } | |||
| break; | |||
| @@ -578,7 +628,7 @@ Translator *SelectTranslator(const char *name) | |||
| // character codes offset by 0x380 | |||
| static const char el_vowels[] = {0x10,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x35,0x37,0x39,0x3f,0x45,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0}; | |||
| static const char el_fvowels[] = {0x2d,0x2e,0x2f,0x35,0x37,0x39,0x45,0x4d,0}; // ε η ι υ έ ή ί ύ | |||
| static const char el_voiceless[]= {0x38,0x3a,0x3e,0x40,0x42,0x43,0x44,0x46,0x47,0}; // θ κ ξ π ς σ τ φ χ | |||
| static const char el_voiceless[]= {0x38,0x3a,0x3e,0x40,0x42,0x43,0x44,0x46,0x47,0}; // θ κ ξ π ς σ τ φ χ | |||
| static const char el_consonants[]={0x32,0x33,0x34,0x36,0x38,0x3a,0x3b,0x3c,0x3d,0x3e,0x40,0x41,0x42,0x43,0x44,0x46,0x47,0x48,0}; | |||
| static const wchar_t el_char_apostrophe[] = {0x3c3,0}; // σ | |||
| @@ -602,7 +652,7 @@ Translator *SelectTranslator(const char *name) | |||
| tr->langopts.unstressed_wd2 = 2; | |||
| tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels | |||
| tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA; | |||
| tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA; | |||
| tr->langopts.numbers2 = 0x2 | NUM2_MULTIPLE_ORDINAL; // variant form of numbers before thousands | |||
| if(name2 == L_grc) | |||
| @@ -618,7 +668,7 @@ Translator *SelectTranslator(const char *name) | |||
| static const short stress_lengths_eo[8] = {150, 150, 230, 180, 0, 0, 300, 320}; | |||
| static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,22, 22,21 }; | |||
| static const wchar_t eo_char_apostrophe[2] = {'l',0}; | |||
| SetupTranslator(tr,stress_lengths_eo,stress_amps_eo); | |||
| tr->charset_a0 = charsets[3]; // ISO-8859-3 | |||
| @@ -627,7 +677,7 @@ Translator *SelectTranslator(const char *name) | |||
| // tr->langopts.word_gap = 1; | |||
| tr->langopts.vowel_pause = 2; | |||
| tr->langopts.stress_rule = STRESSPOSN_2R; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| // tr->langopts.unstressed_wd1 = 3; | |||
| tr->langopts.unstressed_wd2 = 2; | |||
| @@ -651,13 +701,13 @@ Translator *SelectTranslator(const char *name) | |||
| // stress last syllable if it doesn't end in vowel or "s" or "n" | |||
| // 'diminished' is an unstressed final syllable | |||
| tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; | |||
| tr->langopts.unstressed_wd1 = 0; | |||
| tr->langopts.unstressed_wd2 = 2; | |||
| tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels | |||
| tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ROMAN | NUM_ROMAN_AFTER; | |||
| tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL; | |||
| tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL; | |||
| if(name2 == L('c','a')) | |||
| { | |||
| @@ -667,7 +717,7 @@ Translator *SelectTranslator(const char *name) | |||
| else | |||
| if(name2 == L('a','n')) | |||
| { | |||
| tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; | |||
| } | |||
| else | |||
| if(name2 == L_pap) | |||
| @@ -805,7 +855,7 @@ Translator *SelectTranslator(const char *name) | |||
| tr->charset_a0 = charsets[2]; // ISO-8859-2 | |||
| tr->langopts.stress_rule = STRESSPOSN_1L; | |||
| tr->langopts.stress_flags = 0x10; | |||
| tr->langopts.stress_flags = 0x10; | |||
| tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; | |||
| tr->langopts.max_initial_consonants = 5; | |||
| tr->langopts.spelling_stress = 1; | |||
| @@ -884,7 +934,7 @@ SetLengthMods(tr,3); // all equal | |||
| 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 = 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.accents = 2; // "capital" after letter name | |||
| } | |||
| break; | |||
| @@ -919,7 +969,7 @@ SetLengthMods(tr,3); // all equal | |||
| 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 = 0x10 | 0x20000; | |||
| tr->langopts.stress_flags = 0x10 | 0x20000; | |||
| tr->langopts.vowel_pause = 1; | |||
| tr->langopts.unstressed_wd1 = 2; | |||
| tr->langopts.unstressed_wd2 = 2; | |||
| @@ -974,7 +1024,7 @@ SetLengthMods(tr,3); // all equal | |||
| { | |||
| static const unsigned char stress_amps_tr[8] = {18,16, 20,21, 20,21, 21,20 }; | |||
| static const short stress_lengths_tr[8] = {190,180, 230,230, 0,0, 250,250}; | |||
| tr->letter_bits_offset = OFFSET_CYRILLIC; | |||
| memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
| SetLetterBits(tr,LETTERGP_A,(char *)ru_vowels); | |||
| @@ -1173,9 +1223,9 @@ SetLengthMods(tr,3); // all equal | |||
| 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 = 0x6 | 0x10 | 0x2000 | 0x20000; | |||
| tr->langopts.stress_flags = 0x6 | 0x10 | 0x2000 | 0x20000; | |||
| tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN; | |||
| tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS; | |||
| tr->langopts.numbers2 = NUM2_MULTIPLE_ORDINAL | NUM2_NO_TEEN_ORDINALS; | |||
| SetLetterVowel(tr,'y'); | |||
| ResetLetterBits(tr,0x2); | |||
| SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y | |||
| @@ -1223,7 +1273,7 @@ SetLengthMods(tr,3); // all equal | |||
| tr->charset_a0 = charsets[2]; // ISO-8859-2 | |||
| tr->langopts.stress_rule = STRESSPOSN_1L; | |||
| tr->langopts.stress_flags = 0x16; | |||
| tr->langopts.stress_flags = 0x16; | |||
| tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; | |||
| tr->langopts.max_initial_consonants = 5; | |||
| tr->langopts.spelling_stress = 1; | |||
| @@ -1259,11 +1309,11 @@ SetLengthMods(tr,3); // all equal | |||
| memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
| SetLetterBitsRange(tr,LETTERGP_A,0x05,0x16); // vowel letters | |||
| SetLetterBitsRange(tr,LETTERGP_A,0x4a,0x73); // + vowel signs, and virama | |||
| SetLetterBitsRange(tr,LETTERGP_B,0x4a,0x73); // vowel signs, and virama | |||
| SetLetterBitsRange(tr,LETTERGP_C,0x1a,0x46); // the main consonant range | |||
| tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words | |||
| tr->langopts.suffix_add_e = tr->letter_bits_offset + 0x4a; //virama | |||
| tr->langopts.numbers = NUM_OMIT_1_THOUSAND | NUM_SINGLE_STRESS_L | NUM_DFRACTION_7; | |||
| @@ -1292,7 +1342,7 @@ SetLengthMods(tr,3); // all equal | |||
| SetupTranslator(tr,stress_lengths_sq,stress_amps_sq); | |||
| tr->langopts.stress_rule = STRESSPOSN_2R; | |||
| tr->langopts.stress_flags = 0x16 + 0x100; | |||
| tr->langopts.stress_flags = 0x16 + 0x100; | |||
| 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 | |||
| @@ -1324,7 +1374,7 @@ SetLengthMods(tr,3); // all equal | |||
| tr->langopts.vowel_pause = 1; | |||
| tr->langopts.stress_rule = STRESSPOSN_2R; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.stress_flags = 0x6 | 0x10; | |||
| tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_SINGLE_AND | NUM_OMIT_1_HUNDRED; | |||
| tr->langopts.break_numbers = 0x49249268; // for languages which have numbers for 100,000 and 1,000,000 | |||
| @@ -1343,7 +1393,7 @@ SetLengthMods(tr,3); // all equal | |||
| tr->langopts.stress_rule = STRESSPOSN_1L; | |||
| tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable | |||
| tr->langopts.spelling_stress = 1; | |||
| tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 | |||
| tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000 | |||
| if(name2 == L('t','a')) | |||
| { | |||
| @@ -1604,7 +1654,7 @@ PH('V','#'),PH('I','3'),PH('I','2'),PH('E','3')}; | |||
| /*2*/ {'o', '8', '8', 'o', '8', '8'}, // O | |||
| /*3*/ {'i', 'I', 'i', 'a', 'I', 'a'}, // I Uses 3,4,5 columns. | |||
| /*4*/ {'i', PH('I','#'), 'i', 'i', PH('I','#'), 'i'}, // I# | |||
| /*5*/ {'E', PH('E','#'), 'E', 'e', PH('E','#'), 'e'}, // E# | |||
| /*5*/ {'E', PH('E','#'), 'E', 'e', PH('E','#'), 'e'}, // E# | |||
| /*6*/ {'E', PH('E','2'), 'E', 'e', PH('E','2'), 'e'}, // E2 Uses 3,4,5 columns. | |||
| /*7*/ {PH('j','a'), 'V', PH('j','a'), 'A', 'V', 'A'}, // V# | |||
| /*8*/ {PH('j','a'), 'I', PH('j','a'), 'e', 'I', 'e'}, // I3 Uses 3,4,5 columns. | |||
| @@ -77,6 +77,7 @@ static int prev_clause_pause=0; | |||
| static int max_clause_pause = 0; | |||
| static int any_stressed_words; | |||
| int pre_pause; | |||
| ALPHABET *current_alphabet; | |||
| // these were previously in translator class | |||
| @@ -874,6 +875,7 @@ int TranslateWord(Translator *tr, char *word_start, int next_pause, WORD_TAB *wt | |||
| unpron_phonemes[0] = 0; | |||
| prefix_phonemes[0] = 0; | |||
| end_phonemes[0] = 0; | |||
| current_alphabet = NULL; | |||
| if(tr->data_dictlist == NULL) | |||
| { | |||
| @@ -902,6 +904,12 @@ int TranslateWord(Translator *tr, char *word_start, int next_pause, WORD_TAB *wt | |||
| spell_word = 0; | |||
| if((word_length == 1) && (wflags & FLAG_TRANSLATOR2)) | |||
| { | |||
| // retranslating a 1-character word using a different language, say its name | |||
| spell_word = 1; | |||
| } | |||
| if(option_sayas == SAYAS_KEY) | |||
| { | |||
| if(word_length == 1) | |||
| @@ -1061,6 +1069,8 @@ if((wmark > 0) && (wmark < 8)) | |||
| return(FLAG_SPELLWORD); // a mixture of languages, retranslate as individual letters, separated by spaces | |||
| return(0); | |||
| } | |||
| strcpy(word_phonemes, phonemes); | |||
| return(0); // ?? | |||
| } | |||
| else | |||
| if(found == 0) | |||
| @@ -1098,7 +1108,7 @@ if((wmark > 0) && (wmark < 8)) | |||
| if(strcmp(&unpron_phonemes[1],"en")==0) | |||
| return(FLAG_SPELLWORD); // _^_en must have been set in TranslateLetter(), not *_rules | |||
| return(0); | |||
| } | |||
| } | |||
| #ifdef deleted | |||
| p = &wordx[word_length-3]; // this looks wrong. Doesn't consider multi-byte chars. | |||
| @@ -1158,6 +1168,8 @@ if(end_type & SUFX_UNPRON) | |||
| { | |||
| return(0); | |||
| } | |||
| strcpy(word_phonemes, phonemes); | |||
| return(0); | |||
| } | |||
| } | |||
| @@ -1713,6 +1725,7 @@ int SetTranslator2(const char *new_language) | |||
| new_phoneme_tab = -1; | |||
| translator2_language[0] = 0; | |||
| } | |||
| translator2->phoneme_tab_ix = new_phoneme_tab; | |||
| } | |||
| } | |||
| return(new_phoneme_tab); | |||
| @@ -1953,12 +1966,14 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| if(switch_phonemes >= 0) | |||
| { | |||
| // re-translate the word using the new translator | |||
| wtab[0].flags |= FLAG_TRANSLATOR2; | |||
| flags = TranslateWord(translator2, word, next_pause, wtab); | |||
| // strcpy((char *)p,translator2->word_phonemes); | |||
| if(p[0] == phonSWITCH) | |||
| { | |||
| // the second translator doesn't want to process this word | |||
| switch_phonemes = -1; | |||
| // switch_phonemes = -1; | |||
| return(FLAG_SPELLWORD); | |||
| } | |||
| } | |||
| if(switch_phonemes < 0) | |||
| @@ -2050,8 +2065,16 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| if(switch_phonemes >= 0) | |||
| { | |||
| // this word uses a different phoneme table | |||
| SetPlist2(&ph_list2[n_ph_list2],phonSWITCH); | |||
| ph_list2[n_ph_list2++].tone_ph = switch_phonemes; // temporary phoneme table number | |||
| if(ph_list2[n_ph_list2-1].phcode == phonSWITCH) | |||
| { | |||
| //previous phoneme is also a phonSWITCH, just change its phoneme table number | |||
| n_ph_list2--; | |||
| } | |||
| else | |||
| { | |||
| SetPlist2(&ph_list2[n_ph_list2],phonSWITCH); | |||
| } | |||
| ph_list2[n_ph_list2++].tone_ph = switch_phonemes; // temporary phoneme table number | |||
| } | |||
| // remove initial pause from a word if it follows a hyphen | |||
| @@ -2078,7 +2101,9 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| ph_list2[n_ph_list2].phcode = ph_code; | |||
| ph_list2[n_ph_list2].sourceix = 0; | |||
| ph_list2[n_ph_list2].synthflags = embedded_flag; | |||
| ph_list2[n_ph_list2++].tone_ph = *p++; | |||
| ph_list2[n_ph_list2++].tone_ph = *p; | |||
| SelectPhonemeTable(*p); | |||
| p++; | |||
| } | |||
| else | |||
| if(ph->type == phSTRESS) | |||
| @@ -111,6 +111,7 @@ | |||
| #define FLAG_INDIVIDUAL_DIGITS 0x80000 // speak number as individual digits | |||
| #define FLAG_DELETE_WORD 0x100000 // don't speak this word, it has been spoken as part of the previous word | |||
| #define FLAG_CHAR_REPLACED 0x200000 // characters have been replaced by .replace in the *_rules | |||
| #define FLAG_TRANSLATOR2 0x400000 // retranslating using a different language | |||
| #define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix | |||
| #define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout | |||
| @@ -258,6 +259,21 @@ extern PARAM_STACK param_stack[]; | |||
| extern const int param_defaults[N_SPEECH_PARAM]; | |||
| typedef struct { | |||
| const char *name; | |||
| int offset; | |||
| unsigned short range_min, range_max; | |||
| int language; | |||
| int flags; | |||
| } ALPHABET; | |||
| extern ALPHABET alphabets[]; | |||
| extern ALPHABET *current_alphabet; | |||
| // alphabet flags | |||
| #define AL_DONT_NAME 0x01 // don't speak the alphabet name | |||
| #define AL_NOT_LETTERS 0x02 // don't use the language for speaking letters | |||
| #define AL_NOT_WORDS 0x04 // don't use the language to speak words | |||
| #define N_LOPTS 21 | |||
| #define LOPT_DIERESES 1 | |||
| @@ -664,6 +680,8 @@ int IsAlpha(unsigned int c); | |||
| int isspace2(unsigned int c); | |||
| int towlower2(unsigned int c); | |||
| void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa); | |||
| const char *WordToString2(unsigned int word); | |||
| ALPHABET *AlphabetFromChar(int c); | |||
| Translator *SelectTranslator(const char *name); | |||
| int SetTranslator2(const char *name); | |||