--- 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;