--- freeswitch.svn/conf/lang/fr/vm/sounds.xml 2010-02-15 13:40:03.000000000 +0100 +++ freeswitch-1.0.5-20100215-0400/conf/lang/fr/vm/sounds.xml 2010-02-15 17:55:26.000000000 +0100 @@ -1,9 +1,9 @@ - - + + @@ -11,7 +11,8 @@ - + + @@ -19,7 +20,7 @@ - + @@ -27,7 +28,7 @@ - + @@ -35,7 +36,7 @@ - + @@ -43,25 +44,26 @@ - + - + - + + + + - + - - - - - - + + + + @@ -69,28 +71,48 @@ - + + + + + + + + + + + + - - + + + + + + + + + + + + + + + - - - + @@ -98,8 +120,15 @@ - + + + + + + + + + @@ -107,17 +136,87 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -125,7 +224,7 @@ - + @@ -133,7 +232,7 @@ - + @@ -141,7 +240,7 @@ - + @@ -149,15 +248,17 @@ - + - + - + + + @@ -165,28 +266,27 @@ - + + + - + - + - + - - - - - - + + + @@ -194,7 +294,7 @@ - + @@ -202,35 +302,39 @@ - + - + - + - + + - + + - + + - + + @@ -238,9 +342,40 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file --- freeswitch.svn/conf/lang/fr/fr.xml 2009-10-22 20:16:05.000000000 +0200 +++ freeswitch-1.0.5-20100215-0400/conf/lang/fr/fr.xml 2010-02-24 10:57:37.000000000 +0100 @@ -1,8 +1,24 @@ - + - + + + + + + + + + + + + + + + + + --- freeswitch.svn/src/mod/say/mod_say_fr/mod_say_fr.c 2009-07-01 13:27:45.000000000 +0200 +++ freeswitch-1.0.5-20100215-0400/src/mod/say/mod_say_fr/mod_say_fr.c 2010-02-24 12:53:05.000000000 +0100 @@ -39,8 +39,9 @@ * * Anthony Minessale II * Michael B. Murdock + * Stephane Alnet * - * mod_say_fr.c -- Say for English + * mod_say_fr.c -- Say for French * */ @@ -51,6 +52,14 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_say_fr_load); SWITCH_MODULE_DEFINITION(mod_say_fr, mod_say_fr_load, NULL, NULL); +typedef enum language_variant_fr { + LANGUAGE_VARIANT_FR_BE, /* fr-BE */ + LANGUAGE_VARIANT_FR_CA, /* fr-CA */ + LANGUAGE_VARIANT_FR_CH, /* fr-CH */ + LANGUAGE_VARIANT_FR_FR, /* fr-FR (default) */ + LANGUAGE_VARIANT_FR_LU, /* fr-LU */ +} language_variant_fr; + #define say_num(num, t) { \ char tmp[80];\ switch_status_t tstatus;\ @@ -70,6 +79,47 @@ return SWITCH_STATUS_FALSE;\ }}\ +static language_variant_fr fr_select_variant(char const*chan_lang) +{ + if(chan_lang[0] == 'f' && chan_lang[1] == 'r' + && (chan_lang[2] == '-' || chan_lang[2] == '_')) { + if(chan_lang[3] == 'B' && chan_lang[4] == 'E') { + return LANGUAGE_VARIANT_FR_BE; + } + if(chan_lang[3] == 'C' && chan_lang[4] == 'A') { + return LANGUAGE_VARIANT_FR_CA; + } + if(chan_lang[3] == 'C' && chan_lang[4] == 'H') { + return LANGUAGE_VARIANT_FR_CH; + } + if(chan_lang[3] == 'L' && chan_lang[4] == 'U') { + return LANGUAGE_VARIANT_FR_LU; + } + } + return LANGUAGE_VARIANT_FR_FR; +} + +static language_variant_fr get_variant(switch_core_session_t *session) +{ + switch_channel_t *channel; + const char *lang = NULL, *chan_lang = NULL; + + switch_assert(session); + channel = switch_core_session_get_channel(session); + switch_assert(channel); + + lang = switch_channel_get_variable(channel, "language"); + if (!lang) { + chan_lang = switch_channel_get_variable(channel, "default_language"); + if (!chan_lang) { + chan_lang = "fr-FR"; + } + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "No language specified - Using [%s]\n", chan_lang); + } else { + chan_lang = lang; + } + return fr_select_variant(chan_lang); +} static switch_status_t fr_spell(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method, switch_input_args_t *args) { @@ -80,10 +130,17 @@ if (a >= 48 && a <= 57) { say_file("digits/%d.wav", a - 48); } else { - if (type == SST_NAME_SPELLED) { + switch(type) { + case SST_NAME_SPELLED: + case SST_URL: + case SST_EMAIL_ADDRESS: say_file("ascii/%d.wav", a); - } else if (type == SST_NAME_PHONETIC) { + break; + case SST_NAME_PHONETIC: say_file("phonetic-ascii/%d.wav", a); + break; + default: + break; } } } @@ -91,20 +148,38 @@ return SWITCH_STATUS_SUCCESS; } -static switch_status_t play_group(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args) +/* See e.g. http://forum.wordreference.com/showthread.php?t=254731 */ +/* Variant for fr-FR, fr-LU, fr-CA */ +static switch_status_t play_group_fr1(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args) { if (a) { + if(a > 1) { say_file("digits/%d.wav", a); say_file("digits/hundred.wav"); + } else { + say_file("digits/hundred.wav"); + } } if (b) { if (b > 1) { - say_file("digits/%d0.wav", b); - } else { + if(b == 7 || b == 9) { + if(c == 1) { /* 71 and 91 */ say_file("digits/%d%d.wav", b, c); c = 0; + } else { /* 70, 72..79, 90, 92..99 */ + say_file("digits/%d0.wav", b-1); + c = c + 10; + } + } else { /* 20..69, 80..89 */ + say_file("digits/%d0.wav", b); + if(c == 1 && b != 8) { /* 21, 31, 41, 51, 61 */ + say_file("currency/and.wav"); + } + } + } else { /* 10..19 */ + c = c + 10; } } @@ -123,6 +198,66 @@ return SWITCH_STATUS_SUCCESS; } +/* Variant for fr-BE, fr-CH */ +static switch_status_t play_group_fr2(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args) +{ + + if (a) { + if(a > 1) { + say_file("digits/%d.wav", a); + say_file("digits/hundred.wav"); + } else { + say_file("digits/hundred.wav"); + } + } + + if (b) { + if (b > 1) { + if(b == 7 || b == 9) { + say_file("digits/%d0n.wav", b); + } else { /* 20..69, 80..89 */ + say_file("digits/%d0.wav", b); + if(c == 1 && b != 8) { /* 21, 31, 41, 51, 61 */ + say_file("currency/and.wav"); + } + } + } else { /* 10..19 */ + c = c + 10; + } + } + + if (c) { + if (method == SSM_COUNTED) { + say_file("digits/h-%d.wav", c); + } else { + say_file("digits/%d.wav", c); + } + } + + if (what && (a || b || c)) { + say_file(what); + } + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t play_group(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args) +{ + language_variant_fr variant; + + variant = get_variant(session); + switch(variant) { + case LANGUAGE_VARIANT_FR_CA: /* fr-CA */ + case LANGUAGE_VARIANT_FR_FR: /* fr-FR (default) */ + case LANGUAGE_VARIANT_FR_LU: /* fr-LU */ + return play_group_fr1(method,a,b,c,what,session,args); + case LANGUAGE_VARIANT_FR_BE: /* fr-BE */ + case LANGUAGE_VARIANT_FR_CH: /* fr-CH */ + return play_group_fr2(method,a,b,c,what,session,args); + } + return SWITCH_STATUS_FALSE; +} + static char *strip_commas(char *in, char *out, switch_size_t len) { char *p = in, *q = out; @@ -310,38 +445,26 @@ if (hours) { say_num(hours, SSM_PRONOUNCED); - if (hours == 1) { say_file("time/hour.wav"); } else { - say_file("time/hours.wav"); - } - } else { say_file("digits/0.wav"); - say_file("time/hours.wav"); + say_file("time/hour.wav"); } if (minutes) { say_num(minutes, SSM_PRONOUNCED); - if (minutes == 1) { say_file("time/minute.wav"); } else { - say_file("time/minutes.wav"); - } - } else { say_file("digits/0.wav"); - say_file("time/minutes.wav"); + say_file("time/minute.wav"); } if (seconds) { say_num(seconds, SSM_PRONOUNCED); - if (seconds == 1) { say_file("time/second.wav"); } else { - say_file("time/seconds.wav"); - } - } else { say_file("digits/0.wav"); - say_file("time/seconds.wav"); + say_file("time/second.wav"); } return SWITCH_STATUS_SUCCESS; @@ -370,36 +493,25 @@ if (say_date) { say_file("time/day-%d.wav", tm.tm_wday); - say_file("time/mon-%d.wav", tm.tm_mon); + if(tm.tm_mday > 1) { + say_num(tm.tm_mday, SSM_PRONOUNCED); + } else { say_num(tm.tm_mday, SSM_COUNTED); + } + say_file("time/mon-%d.wav", tm.tm_mon); say_num(tm.tm_year + 1900, SSM_PRONOUNCED); } if (say_time) { - int32_t hour = tm.tm_hour, pm = 0; - - if (hour > 12) { - hour -= 12; - pm = 1; - } else if (hour == 12) { - pm = 1; - } else if (hour == 0) { - hour = 12; - pm = 0; - } + int32_t hour = tm.tm_hour; say_num(hour, SSM_PRONOUNCED); - - if (tm.tm_min > 9) { - say_num(tm.tm_min, SSM_PRONOUNCED); - } else if (tm.tm_min) { - say_file("time/oh.wav"); + say_file("time/hour.wav"); + if(tm.tm_min) { + say_file("currency/and.wav"); say_num(tm.tm_min, SSM_PRONOUNCED); - } else { - say_file("time/oclock.wav"); + say_file("time/minute.wav"); } - - say_file("time/%s.wav", pm ? "p-m" : "a-m"); } return SWITCH_STATUS_SUCCESS; @@ -434,17 +546,13 @@ /* If negative say "negative" */ if (sbuf[0] == '-') { - say_file("currency/negative.wav"); + say_file("currency/minus.wav"); dollars++; } /* Say dollar amount */ fr_say_general_count(session, dollars, type, method, args); - if (atoi(dollars) == 1) { - say_file("currency/dollar.wav"); - } else { - say_file("currency/dollars.wav"); - } + say_file("currency/euro.wav"); /* Say "and" */ say_file("currency/and.wav"); @@ -452,14 +560,10 @@ /* Say cents */ if (cents) { fr_say_general_count(session, cents, type, method, args); - if (atoi(cents) == 1) { say_file("currency/cent.wav"); } else { - say_file("currency/cents.wav"); - } - } else { say_file("digits/0.wav"); - say_file("currency/cents.wav"); + say_file("currency/cent.wav"); } return SWITCH_STATUS_SUCCESS; @@ -469,7 +573,6 @@ static switch_status_t fr_say(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method, switch_input_args_t *args) { - switch_say_callback_t say_cb = NULL; switch (type) { @@ -495,6 +598,16 @@ case SST_CURRENCY: say_cb = fr_say_money; break; + case SST_TELEPHONE_NUMBER: + case SST_TELEPHONE_EXTENSION: + case SST_URL: + case SST_EMAIL_ADDRESS: + case SST_POSTAL_ADDRESS: + case SST_ACCOUNT_NUMBER: + case SST_SHORT_DATE_TIME: + say_cb = fr_spell; + break; + default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unknown Say type=[%d]\n", type); break;