diff --git a/apps/app_directory.c b/apps/app_directory.c index 285f1514b36aca37fb27957062615ebe8ee08511..be76d4b35b035e74876f84669d099be32cd822d1 100755 --- a/apps/app_directory.c +++ b/apps/app_directory.c @@ -156,17 +156,17 @@ static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char * if (v) { /* We have a match -- play a greeting if they have it */ snprintf(fn, sizeof(fn), "%s/vm/%s/greet", AST_SPOOL_DIR, v->name); - if (ast_fileexists(fn, NULL)) { - res = ast_streamfile(chan, fn); + if (ast_fileexists(fn, NULL, chan->language)) { + res = ast_streamfile(chan, fn, chan->language); if (!res) res = ast_waitstream(chan, AST_DIGIT_ANY); ast_stopstream(chan); } else { - res = ast_say_digit_str(chan, v->name); + res = ast_say_digit_str(chan, v->name, chan->language); } ahem: if (!res) - res = ast_streamfile(chan, "dir-instr"); + res = ast_streamfile(chan, "dir-instr", chan->language); if (!res) res = ast_waitstream(chan, AST_DIGIT_ANY); if (!res) @@ -189,9 +189,9 @@ ahem: } } else { if (found) - res = ast_streamfile(chan, "dir-nomore"); + res = ast_streamfile(chan, "dir-nomore", chan->language); else - res = ast_streamfile(chan, "dir-nomatch"); + res = ast_streamfile(chan, "dir-nomatch", chan->language); if (!res) res = 1; return res; @@ -219,7 +219,7 @@ static int directory_exec(struct ast_channel *chan, void *data) LOCAL_USER_ADD(u); top: if (!res) - res = ast_streamfile(chan, "dir-intro"); + res = ast_streamfile(chan, "dir-intro", chan->language); if (!res) res = ast_waitstream(chan, AST_DIGIT_ANY); ast_stopstream(chan); diff --git a/apps/app_playback.c b/apps/app_playback.c index 31ee069492c6ffe45a236543bb5292b6662f55c5..be2dfe26e537f73578f03e8b9b62a91caea3b3b9 100755 --- a/apps/app_playback.c +++ b/apps/app_playback.c @@ -31,18 +31,22 @@ LOCAL_USER_DECL; static int playback_exec(struct ast_channel *chan, void *data) { - int res; + int res = 0; struct localuser *u; if (!data) { ast_log(LOG_WARNING, "Playback requires an argument (filename)\n"); return -1; } LOCAL_USER_ADD(u); - ast_stopstream(chan); - res = ast_streamfile(chan, (char *)data); - if (!res) - res = ast_waitstream(chan, ""); - ast_stopstream(chan); + if (chan->state != AST_STATE_UP) + res = ast_answer(chan); + if (!res) { + ast_stopstream(chan); + res = ast_streamfile(chan, (char *)data, chan->language); + if (!res) + res = ast_waitstream(chan, ""); + ast_stopstream(chan); + } LOCAL_USER_REMOVE(u); return res; } diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 8fc6f500ff58e117e4e4beb4d72a5d3880637620..939587ff77b970b6722a50be723f0e9773307381 100755 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -81,15 +81,15 @@ static int announce_message(struct ast_channel *chan, char *dir, int msgcnt) { char *fn; int res; - res = ast_streamfile(chan, "vm-message"); + res = ast_streamfile(chan, "vm-message", chan->language); if (!res) { res = ast_waitstream(chan, AST_DIGIT_ANY); if (!res) { - res = ast_say_number(chan, msgcnt+1); + res = ast_say_number(chan, msgcnt+1, chan->language); if (!res) { fn = get_fn(dir, msgcnt); if (fn) { - res = ast_streamfile(chan, fn); + res = ast_streamfile(chan, fn, chan->language); free(fn); } } @@ -167,7 +167,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) if (mkdir(dir, 0700) && (errno != EEXIST)) ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dir, strerror(errno)); /* Stream an info message */ - if (silent || !ast_streamfile(chan, INTRO)) { + if (silent || !ast_streamfile(chan, INTRO, chan->language)) { /* Wait for the message to finish */ if (silent || !ast_waitstream(chan, "")) { fmt = ast_variable_retrieve(cfg, "general", "format"); @@ -182,7 +182,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n", (chan->callerid ? chan->callerid : "Unknown"), name, ext, chan->name); - if (ast_fileexists(fn, NULL) > 0) { + if (ast_fileexists(fn, NULL, chan->language) > 0) { msgnum++; continue; } @@ -268,7 +268,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) if (outmsg) { if (outmsg > 1) { /* Let them know it worked */ - ast_streamfile(chan, "vm-msgsaved"); + ast_streamfile(chan, "vm-msgsaved", chan->language); ast_waitstream(chan, ""); } /* Send e-mail if applicable */ @@ -323,7 +323,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "No voicemail configuration\n"); goto out; } - if (ast_streamfile(chan, "vm-login")) { + if (ast_streamfile(chan, "vm-login", chan->language)) { ast_log(LOG_WARNING, "Couldn't stream login file\n"); goto out; } @@ -339,7 +339,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) res = 0; goto out; } - if (ast_streamfile(chan, "vm-password")) { + if (ast_streamfile(chan, "vm-password", chan->language)) { ast_log(LOG_WARNING, "Unable to stream password file\n"); goto out; } @@ -359,7 +359,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) } else if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "No such user '%s' in config file\n", username); if (!valid) { - if (ast_streamfile(chan, "vm-incorrect")) + if (ast_streamfile(chan, "vm-incorrect", chan->language)) break; if (ast_waitstream(chan, "")) break; @@ -375,13 +375,13 @@ static int vm_execmain(struct ast_channel *chan, void *data) not deleted. */ do { fn = get_fn(dir, maxmsg); - if ((res = ast_fileexists(fn, NULL))>0) { + if ((res = ast_fileexists(fn, NULL, chan->language))>0) { maxmsg++; deleted[maxmsg] = 0; } free(fn); } while(res > 0); - if (ast_streamfile(chan, "vm-youhave")) + if (ast_streamfile(chan, "vm-youhave", chan->language)) goto out; if ((d=ast_waitstream(chan, AST_DIGIT_ANY)) < 0) goto out; @@ -389,10 +389,10 @@ static int vm_execmain(struct ast_channel *chan, void *data) if (!d) { /* If they haven't interrupted us, play the message count */ if (maxmsg > 0) { - if ((d = ast_say_number(chan, maxmsg)) < 0) + if ((d = ast_say_number(chan, maxmsg, chan->language)) < 0) goto out; } else { - if (ast_streamfile(chan, "vm-no")) + if (ast_streamfile(chan, "vm-no", chan->language)) goto out; if ((d=ast_waitstream(chan, AST_DIGIT_ANY)) < 0) goto out; @@ -400,7 +400,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) } if (!d) { /* And if they still haven't, give them the last word */ - if (ast_streamfile(chan, ((maxmsg == 1) ? "vm-message" : "vm-messages"))) + if (ast_streamfile(chan, ((maxmsg == 1) ? "vm-message" : "vm-messages"), chan->language)) goto out; if (ast_waitstream(chan, AST_DIGIT_ANY) < 0) goto out; @@ -416,7 +416,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) ast_log(LOG_EVENT, "User '%s' logged in on channel '%s' with %d message(s).\n", username, chan->name, maxmsg); if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "User '%s' logged in on channel %s with %d messages\n", username, chan->name, maxmsg); - if (!ast_streamfile(chan, "vm-instructions")) { + if (!ast_streamfile(chan, "vm-instructions", chan->language)) { for(;;) { if (chan->stream || (chan->trans && chan->trans->stream)) { d = ast_waitstream(chan, AST_DIGIT_ANY); @@ -424,7 +424,7 @@ static int vm_execmain(struct ast_channel *chan, void *data) if (!d && (state == STATE_MESSAGE_PLAYING)) { state = STATE_MESSAGE; /* If it runs out playing a message, then give directions */ - if (!(d = ast_streamfile(chan, "vm-msginstruct"))) + if (!(d = ast_streamfile(chan, "vm-msginstruct", chan->language))) d = ast_waitstream(chan, AST_DIGIT_ANY); ast_stopstream(chan); } @@ -440,12 +440,12 @@ restart: best based up on where they are. Ditto if they press the '*' key. */ switch(state) { case STATE_STARTING: - if (ast_streamfile(chan, "vm-instructions")) + if (ast_streamfile(chan, "vm-instructions", chan->language)) goto out; break; case STATE_MESSAGE: case STATE_MESSAGE_PLAYING: - if (ast_streamfile(chan, "vm-msginstruct")) + if (ast_streamfile(chan, "vm-msginstruct", chan->language)) goto out; break; default: @@ -460,14 +460,14 @@ restart: if (curmsg < maxmsg) { deleted[curmsg] = !deleted[curmsg]; if (deleted[curmsg]) { - if (ast_streamfile(chan, "vm-deleted")) + if (ast_streamfile(chan, "vm-deleted", chan->language)) goto out; } else { - if (ast_streamfile(chan, "vm-undeleted")) + if (ast_streamfile(chan, "vm-undeleted", chan->language)) goto out; } } else { - if (ast_streamfile(chan, "vm-nomore")) + if (ast_streamfile(chan, "vm-nomore", chan->language)) goto out; } break; @@ -480,7 +480,7 @@ restart: else if (d < 0) goto out; } else { - if (ast_streamfile(chan, "vm-nomore")) + if (ast_streamfile(chan, "vm-nomore", chan->language)) goto out; } state = STATE_MESSAGE_PLAYING; @@ -510,7 +510,7 @@ restart: else if (d < 0) goto out; } else { - if (ast_streamfile(chan, "vm-nomore")) + if (ast_streamfile(chan, "vm-nomore", chan->language)) goto out; } state = STATE_MESSAGE_PLAYING; @@ -518,7 +518,7 @@ restart: /* XXX Message compose? It's easy! Just read their # and, assuming it's in the config, call the routine as if it were called from the PBX proper XXX */ case '#': - if (ast_streamfile(chan, "vm-goodbye")) + if (ast_streamfile(chan, "vm-goodbye", chan->language)) goto out; if (ast_waitstream(chan, "")) goto out; diff --git a/asterisk.c b/asterisk.c index bec0894aee19d07b8f4f38bcaa2e7f2e86116bcc..4addf889c9ed4003ead9b47af2e32dd05e12695f 100755 --- a/asterisk.c +++ b/asterisk.c @@ -16,6 +16,7 @@ #include <asterisk/logger.h> #include <asterisk/options.h> #include <asterisk/cli.h> +#include <asterisk/channel.h> #include <stdio.h> #include <signal.h> #include <sched.h> @@ -32,6 +33,8 @@ int option_console=0; int option_highpriority=0; int fully_booted = 0; +char defaultlanguage[MAX_LANGUAGE] = DEFAULT_LANGUAGE; + #define HIGH_PRIORITY 1 #define HIGH_PRIORITY_SCHED SCHED_RR diff --git a/asterisk.h b/asterisk.h index f1c9fccdaa0fdb776c83b0e0e9e38d198cf87e35..c5b3d7eb067985b21531a1cda0e38bac7743dbe5 100755 --- a/asterisk.h +++ b/asterisk.h @@ -14,6 +14,8 @@ #ifndef _ASTERISK_H #define _ASTERISK_H +#define DEFAULT_LANGUAGE "en" + #define AST_CONFIG_DIR "/etc/asterisk" #define AST_MODULE_DIR "/usr/lib/asterisk/modules" #define AST_SPOOL_DIR "/var/spool/asterisk" diff --git a/configs/adtranvofr.conf.sample b/configs/adtranvofr.conf.sample index efd6af3f0beecfb8557f6218090ec2e6a795a91c..d1589cca7ded687ccc48f1d1a40290ed9153c6ac 100755 --- a/configs/adtranvofr.conf.sample +++ b/configs/adtranvofr.conf.sample @@ -2,9 +2,13 @@ ; Voice over Frame Relay (Adtran style) ; ; Configuration file -; + [interfaces] ; +; Default language +; +;language=en +; ; Lines for which we are the user termination. They accept incoming ; and outgoing calls. We use the default context on the first 8 lines ; used by internal phones. diff --git a/configs/modem.conf.sample b/configs/modem.conf.sample index d5989b4779b761fd41147bdf273c8ec729fcafea..7f6de5f345cdf56d8ce14cc105c33919804a2b74 100755 --- a/configs/modem.conf.sample +++ b/configs/modem.conf.sample @@ -13,6 +13,10 @@ context=remote ; driver=aopen ; +; Default language +; +;language=en +; ; We can optionally override the auto detection. This is necessary ; particularly if asterisk does not know about our kind of modem. ; diff --git a/configs/oss.conf.sample b/configs/oss.conf.sample index 138a7376bd448dbc61368fe2056f2046901ca7d2..e90d2554041fdf3132ebdf6466a55060339b5715 100755 --- a/configs/oss.conf.sample +++ b/configs/oss.conf.sample @@ -16,6 +16,10 @@ autoanswer=yes ; extension=s ; +; Default language +; +;language=en +; ; Silence supression can be enabled when sound is over a certain threshold. ; The value for the threshold should probably be between 500 and 2000 or so, ; but your mileage may vary. Use the echo test to evaluate the best setting. diff --git a/include/asterisk/file.h b/include/asterisk/file.h index fe0678f672b83a4ee87bca9d704fa0325366bbf7..25e38e29f031a00bf0d4a8d9894bcb9fe3099a95 100755 --- a/include/asterisk/file.h +++ b/include/asterisk/file.h @@ -43,14 +43,14 @@ int ast_format_register(char *name, char *exts, int format, int ast_format_unregister(char *name); -/* Start streaming a file */ -int ast_streamfile(struct ast_channel *c, char *filename); +/* Start streaming a file, in the preferred language if possible */ +int ast_streamfile(struct ast_channel *c, char *filename, char *preflang); /* Stop playback of a stream */ int ast_stopstream(struct ast_channel *c); /* See if a given file exists in a given format. If fmt is NULL, any format is accepted.*/ -int ast_fileexists(char *filename, char *fmt); +int ast_fileexists(char *filename, char *fmt, char *preflang); /* Rename a given file in a given format, or if fmt is NULL, then do so for all */ int ast_filerename(char *oldname, char *newname, char *fmt); diff --git a/include/asterisk/options.h b/include/asterisk/options.h index bc7cdbf16ec9e9f13acca26c3a7b8a2099150285..9cd0b5ef903e33b3e7390b40108149335d39804c 100755 --- a/include/asterisk/options.h +++ b/include/asterisk/options.h @@ -24,6 +24,7 @@ extern int option_nofork; extern int option_quiet; extern int option_console; extern int fully_booted; +extern char defaultlanguage[]; #define VERBOSE_PREFIX_1 " " #define VERBOSE_PREFIX_2 " == " diff --git a/include/asterisk/say.h b/include/asterisk/say.h index 2d78d2c7d0cbbef8e96d6b213314eb1b15a5ac52..cc54a060aedef21c2cba880afe9a099887d83ccd 100755 --- a/include/asterisk/say.h +++ b/include/asterisk/say.h @@ -21,9 +21,9 @@ extern "C" { #endif -int ast_say_number(struct ast_channel *chan, int num); -int ast_say_digits(struct ast_channel *chan, int num); -int ast_say_digit_str(struct ast_channel *chan, char *num); +int ast_say_number(struct ast_channel *chan, int num, char *lang); +int ast_say_digits(struct ast_channel *chan, int num, char *lang); +int ast_say_digit_str(struct ast_channel *chan, char *num, char *lang); #if defined(__cplusplus) || defined(c_plusplus) } diff --git a/include/asterisk/vmodem.h b/include/asterisk/vmodem.h index a45fbdf71aab5dfe6a69d654cbb8b336852ed97a..920bd417d056bbe006176576b3966bc852bcb601 100755 --- a/include/asterisk/vmodem.h +++ b/include/asterisk/vmodem.h @@ -79,6 +79,7 @@ struct ast_modem_pvt { char context[AST_MAX_EXTENSION]; char cid[AST_MAX_EXTENSION]; /* Caller ID if available */ char initstr[AST_MAX_INIT_STR]; /* Modem initialization String */ + char language[MAX_LANGUAGE]; /* default language */ char response[256]; /* Static response buffer */ struct ast_modem_driver *mc; /* Modem Capability */ struct ast_modem_pvt *next; /* Next channel in list */ diff --git a/say.c b/say.c index 41b66925e4da9171f051c6a3975eb319d819c2ca..fea77dd8cc5dfd1db6534e31c16acd6cb07f4ca5 100755 --- a/say.c +++ b/say.c @@ -17,14 +17,14 @@ #include <asterisk/say.h> #include <stdio.h> -int ast_say_digit_str(struct ast_channel *chan, char *fn2) +int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *lang) { char fn[256] = ""; int num = 0; int res = 0; while(fn2[num] && !res) { snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); - res = ast_streamfile(chan, fn); + res = ast_streamfile(chan, fn, lang); if (!res) res = ast_waitstream(chan, AST_DIGIT_ANY); ast_stopstream(chan); @@ -33,45 +33,51 @@ int ast_say_digit_str(struct ast_channel *chan, char *fn2) return res; } -int ast_say_digits(struct ast_channel *chan, int num) +int ast_say_digits(struct ast_channel *chan, int num, char *lang) { char fn2[256]; snprintf(fn2, sizeof(fn2), "%d", num); - return ast_say_digit_str(chan, fn2); + return ast_say_digit_str(chan, fn2, lang); } -int ast_say_number(struct ast_channel *chan, int num) +int ast_say_number(struct ast_channel *chan, int num, char *language) { int res = 0; int playh = 0; char fn[256] = ""; - while(num && !res) { - if (playh) { - snprintf(fn, sizeof(fn), "digits/hundred"); - playh = 0; - } else - if (num < 20) { - snprintf(fn, sizeof(fn), "digits/%d", num); - num = 0; - } else - if (num < 100) { - snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); - num -= ((num / 10) * 10); - } else { - if (num < 1000){ - snprintf(fn, sizeof(fn), "digits/%d", (num/100)); - playh++; + if (0) { + /* XXX Only works for english XXX */ + } else { + /* Use english numbers */ + language = "en"; + while(num && !res) { + if (playh) { + snprintf(fn, sizeof(fn), "digits/hundred"); + playh = 0; + } else + if (num < 20) { + snprintf(fn, sizeof(fn), "digits/%d", num); + num = 0; + } else + if (num < 100) { + snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); + num -= ((num / 10) * 10); } else { - ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); - res = -1; + if (num < 1000){ + snprintf(fn, sizeof(fn), "digits/%d", (num/100)); + playh++; + } else { + ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); + res = -1; + } } + if (!res) { + res = ast_streamfile(chan, fn, language); + if (!res) + res = ast_waitstream(chan, AST_DIGIT_ANY); + ast_stopstream(chan); + } + } - if (!res) { - res = ast_streamfile(chan, fn); - if (!res) - res = ast_waitstream(chan, AST_DIGIT_ANY); - ast_stopstream(chan); - } - } return res; }