From 92047fec996bfabb3366e264ed161e4423259f8b Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Wed, 18 Jun 2008 22:08:30 +0000 Subject: [PATCH] Add support for saying numbers in Hebrew. (closes issue #11662) Reported by: greenfieldtech Patches: say.c.patch-12042008 uploaded by greenfieldtech (license 369) Hebrew-Sounds.ods uploaded by greenfieldtech (with signficant changes to the spreadsheet by me) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@123769 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- doc/lang/hebrew.ods | Bin 0 -> 23290 bytes main/say.c | 592 ++++++++++++++++++++++++++++++++------------ 2 files changed, 431 insertions(+), 161 deletions(-) create mode 100644 doc/lang/hebrew.ods diff --git a/doc/lang/hebrew.ods b/doc/lang/hebrew.ods new file mode 100644 index 0000000000000000000000000000000000000000..f8b0f54df5a785250c843fd3461520f2d16d5cbc GIT binary patch literal 23290 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 Se1PPS>*pVxJvIFE?tcI{lZsjZ literal 0 Hc-jL100001 diff --git a/main/say.c b/main/say.c index ede9e98da9..84002f1bf9 100644 --- a/main/say.c +++ b/main/say.c @@ -353,6 +353,7 @@ static int ast_say_number_full_ge(struct ast_channel *chan, int num, const char static int ast_say_enumeration_full_en(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd); static int ast_say_enumeration_full_da(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd); static int ast_say_enumeration_full_de(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd); +static int ast_say_enumeration_full_he(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd); /* Forward declarations of ast_say_date, ast_say_datetime and ast_say_time functions */ static int ast_say_date_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang); @@ -363,6 +364,7 @@ static int ast_say_date_nl(struct ast_channel *chan, time_t t, const char *ints, static int ast_say_date_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_date_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_date_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_date_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_date_with_format_en(struct ast_channel *chan, time_t time, const char *ints, const char *lang, const char *format, const char *timezone); static int ast_say_date_with_format_da(struct ast_channel *chan, time_t time, const char *ints, const char *lang, const char *format, const char *timezone); @@ -386,6 +388,7 @@ static int ast_say_time_pt_BR(struct ast_channel *chan, time_t t, const char *in static int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_time_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_de(struct ast_channel *chan, time_t t, const char *ints, const char *lang); @@ -396,11 +399,13 @@ static int ast_say_datetime_pt_BR(struct ast_channel *chan, time_t t, const char static int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_datetime_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_from_now_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_from_now_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_from_now_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_from_now_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_datetime_from_now_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang) { @@ -1169,146 +1174,169 @@ static int ast_say_number_full_fr(struct ast_channel *chan, int num, const char -/*! \brief ast_say_number_full_he: Hebrew syntax */ -/* Extra sounds needed: - 1F: feminin 'one' - ve: 'and' - 1hundred: 1 hundred - 2hundred: 2 hundreds - 2thousands: 2 thousand - thousands: plural of 'thousand' - 3sF 'Smichut forms (female) - 4sF - 5sF - 6sF - 7sF - 8sF - 9sF - 3s 'Smichut' forms (male) - 4s - 5s - 6s - 7s - 9s - 10s - 11s - 12s - 13s - 14s - 15s - 16s - 17s - 18s - 19s - -TODO: 've' should sometimed be 'hu': -* before 'shtaym' (2, F) -* before 'shnaym' (2, M) -* before 'shlosha' (3, M) -* before 'shmone' (8, M) -* before 'shlosim' (30) -* before 'shmonim' (80) - -What about: -'sheva' (7, F)? -'tesha' (9, F)? -*/ +/* Hebrew syntax */ +/* Check doc/lang/hebrew-digits.txt for information about the various + * recordings required to make this translation work properly */ #define SAY_NUM_BUF_SIZE 256 -static int ast_say_number_full_he(struct ast_channel *chan, int num, - const char *ints, const char *language, const char *options, - int audiofd, int ctrlfd) +static int ast_say_number_full_he(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd) { int res = 0; - int state = 0; /* no need to save anything */ - int mf = 1; /* +1 = Masculin; -1 = Feminin */ + int state = 0; /* no need to save anything */ + int mf = -1; /* +1 = Masculin; -1 = Feminin */ + int tmpnum = 0; + char fn[SAY_NUM_BUF_SIZE] = ""; - ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: started. " - "num: %d, options=\"%s\"\n", - num, options - ); - if (!num) - return ast_say_digits_full(chan, 0,ints, language, audiofd, ctrlfd); - - if (options && !strncasecmp(options, "f",1)) - mf = -1; + + ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options); + + if (!num) { + return ast_say_digits_full(chan, 0, ints, language, audiofd, ctrlfd); + } + if (options && !strncasecmp(options, "m", 1)) { + mf = 1; + } + ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d\n", num, state, options, mf); /* Do we have work to do? */ - while (!res && (num || (state>0) )) { + while (!res && (num || (state > 0))) { /* first type of work: play a second sound. In this loop - * we can only play one sound file at a time. Thus playing - * a second one requires repeating the loop just for the + * we can only play one sound file at a time. Thus playing + * a second one requires repeating the loop just for the * second file. The variable 'state' remembers where we were. * state==0 is the normal mode and it means that we continue * to check if the number num has yet anything left. */ - ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, " - "state=%d, options=\"%s\", mf=%d\n", - num, state, options, mf - ); - if (state==1) { - snprintf(fn, sizeof(fn), "digits/hundred"); + ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, state=%d, options=\"%s\", mf=%d, tmpnum=%d\n", num, state, options, mf, tmpnum); + + if (state == 1) { + state = 0; + } else if (state == 2) { + if ((num >= 11) && (num < 21)) { + if (mf < 0) { + snprintf(fn, sizeof(fn), "digits/ve"); + } else { + snprintf(fn, sizeof(fn), "digits/uu"); + } + } else { + switch (num) { + case 1: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 2: + snprintf(fn, sizeof(fn), "digits/uu"); + break; + case 3: + if (mf < 0) { + snprintf(fn, sizeof(fn), "digits/ve"); + } else { + snprintf(fn, sizeof(fn), "digits/uu"); + } + break; + case 4: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 5: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 6: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 7: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 8: + snprintf(fn, sizeof(fn), "digits/uu"); + break; + case 9: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + case 10: + snprintf(fn, sizeof(fn), "digits/ve"); + break; + } + } state = 0; - } else if (state==2) { - snprintf(fn, sizeof(fn), "digits/ve"); + } else if (state == 3) { + snprintf(fn, sizeof(fn), "digits/1k"); state = 0; - } else if (state==3) { - snprintf(fn, sizeof(fn), "digits/thousands"); - state=0; - } else if (num <21) { - if (mf < 0) - snprintf(fn, sizeof(fn), "digits/%dF", num); - else + } else if (num < 0) { + snprintf(fn, sizeof(fn), "digits/minus"); + num = (-1) * num; + } else if (num < 20) { + if (mf < 0) { snprintf(fn, sizeof(fn), "digits/%d", num); + } else { + snprintf(fn, sizeof(fn), "digits/%dm", num); + } num = 0; - } else if (num < 100) { - snprintf(fn, sizeof(fn), "digits/%d", (num/10)*10); + } else if ((num < 100) && (num >= 20)) { + snprintf(fn, sizeof(fn), "digits/%d", (num / 10) * 10); num = num % 10; - if (num>0) state=2; - } else if (num < 200) { - snprintf(fn, sizeof(fn), "digits/1hundred"); - num = num - 100; - state=2; - } else if (num < 300) { - snprintf(fn, sizeof(fn), "digits/2hundred"); - num = num - 200; - state=2; - } else if (num < 1000) { - snprintf(fn, sizeof(fn), "digits/%d", (num/100)); - state=1; - num = num % 100; - } else if (num < 2000) { - snprintf(fn, sizeof(fn), "digits/thousand"); - num = num - 1000; - } else if (num < 3000) { - snprintf(fn, sizeof(fn), "digits/2thousand"); - num = num - 2000; - if (num>0) state=2; + if (num > 0) { + state = 2; + } + } else if ((num >= 100) && (num < 1000)) { + tmpnum = num / 100; + snprintf(fn, sizeof(fn), "digits/%d00", tmpnum); + num = num - (tmpnum * 100); + if ((num > 0) && (num < 11)) { + state = 2; + } + } else if ((num >= 1000) && (num < 10000)) { + tmpnum = num / 1000; + snprintf(fn, sizeof(fn), "digits/%dk", tmpnum); + num = num - (tmpnum * 1000); + if ((num > 0) && (num < 11)) { + state = 2; + } } else if (num < 20000) { - snprintf(fn, sizeof(fn), "digits/%ds",(num/1000)); + snprintf(fn, sizeof(fn), "digits/%dm", (num / 1000)); num = num % 1000; - state=3; + state = 3; } else if (num < 1000000) { - res = ast_say_number_full_he(chan, num / 1000, ints, language, options, audiofd, ctrlfd); - if (res) + res = ast_say_number_full_he(chan, num / 1000, ints, language, "m", audiofd, ctrlfd); + if (res) { return res; - snprintf(fn, sizeof(fn), "digits/thousand"); + } + snprintf(fn, sizeof(fn), "digits/1k"); num = num % 1000; - } else if (num < 1000000000) { - res = ast_say_number_full_he(chan, num / 1000000, ints, language, options, audiofd, ctrlfd); - if (res) + if ((num > 0) && (num < 11)) { + state = 2; + } + } else if (num < 2000000) { + snprintf(fn, sizeof(fn), "digits/million"); + num = num % 1000000; + if ((num > 0) && (num < 11)) { + state = 2; + } + } else if (num < 3000000) { + snprintf(fn, sizeof(fn), "digits/twomillion"); + num = num - 2000000; + if ((num > 0) && (num < 11)) { + state = 2; + } + } else if (num < 1000000000) { + res = ast_say_number_full_he(chan, num / 1000000, ints, language, "m", audiofd, ctrlfd); + if (res) { return res; + } snprintf(fn, sizeof(fn), "digits/million"); num = num % 1000000; + if ((num > 0) && (num < 11)) { + state = 2; + } } else { ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); res = -1; } + tmpnum = 0; if (!res) { if (!ast_streamfile(chan, fn, language)) { - if ((audiofd > -1) && (ctrlfd > -1)) + if ((audiofd > -1) && (ctrlfd > -1)) { res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); - else + } else { res = ast_waitstream(chan, ints); + } } ast_stopstream(chan); } @@ -2300,6 +2328,8 @@ static int say_enumeration_full(struct ast_channel *chan, int num, const char *i return(ast_say_enumeration_full_da(chan, num, ints, language, options, audiofd, ctrlfd)); } else if (!strcasecmp(language, "de") ) { /* German syntax */ return(ast_say_enumeration_full_de(chan, num, ints, language, options, audiofd, ctrlfd)); + } else if (!strcasecmp(language, "he")) { /* Hebrew syntax */ + return (ast_say_enumeration_full_he(chan, num, ints, language, options, audiofd, ctrlfd)); } /* Default to english */ @@ -2731,6 +2761,94 @@ static int ast_say_enumeration_full_de(struct ast_channel *chan, int num, const return res; } +static int ast_say_enumeration_full_he(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd) +{ + int res = 0; + char fn[256] = ""; + int mf = -1; /* +1 = Masculin; -1 = Feminin */ + ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: started. num: %d, options=\"%s\"\n", num, options); + + if (options && !strncasecmp(options, "m", 1)) { + mf = -1; + } + + ast_verbose(VERBOSE_PREFIX_3 "ast_say_digits_full: num: %d, options=\"%s\", mf=%d\n", num, options, mf); + + while (!res && num) { + if (num < 0) { + snprintf(fn, sizeof(fn), "digits/minus"); /* kind of senseless for enumerations, but our best effort for error checking */ + if (num > INT_MIN) { + num = -num; + } else { + num = 0; + } + } else if (num < 21) { + if (mf < 0) { + if (num < 10) { + snprintf(fn, sizeof(fn), "digits/f-0%d", num); + } else { + snprintf(fn, sizeof(fn), "digits/f-%d", num); + } + } else { + if (num < 10) { + snprintf(fn, sizeof(fn), "digits/m-0%d", num); + } else { + snprintf(fn, sizeof(fn), "digits/m-%d", num); + } + } + num = 0; + } else if ((num < 100) && num >= 20) { + snprintf(fn, sizeof(fn), "digits/%d", (num / 10) * 10); + num = num % 10; + } else if ((num >= 100) && (num < 1000)) { + int tmpnum = num / 100; + snprintf(fn, sizeof(fn), "digits/%d00", tmpnum); + num = num - (tmpnum * 100); + } else if ((num >= 1000) && (num < 10000)) { + int tmpnum = num / 1000; + snprintf(fn, sizeof(fn), "digits/%dk", tmpnum); + num = num - (tmpnum * 1000); + } else if (num < 20000) { + snprintf(fn, sizeof(fn), "digits/m-%d", (num / 1000)); + num = num % 1000; + } else if (num < 1000000) { + res = ast_say_number_full_he(chan, num / 1000, ints, language, "m", audiofd, ctrlfd); + if (res) { + return res; + } + snprintf(fn, sizeof(fn), "digits/1k"); + num = num % 1000; + } else if (num < 2000000) { + snprintf(fn, sizeof(fn), "digits/1m"); + num = num % 1000000; + } else if (num < 3000000) { + snprintf(fn, sizeof(fn), "digits/2m"); + num = num - 2000000; + } else if (num < 1000000000) { + res = ast_say_number_full_he(chan, num / 1000000, ints, language, "m", audiofd, ctrlfd); + if (res) { + return res; + } + snprintf(fn, sizeof(fn), "digits/1m"); + num = num % 1000000; + } else { + ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); + res = -1; + } + if (!res) { + if (!ast_streamfile(chan, fn, language)) { + if ((audiofd > -1) && (ctrlfd > -1)) { + res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); + } else { + res = ast_waitstream(chan, ints); + } + } + ast_stopstream(chan); + } + } + return res; +} + static int say_date(struct ast_channel *chan, time_t t, const char *ints, const char *lang) { if (!strcasecmp(lang, "en") ) { /* English syntax */ @@ -2749,6 +2867,8 @@ static int say_date(struct ast_channel *chan, time_t t, const char *ints, const return(ast_say_date_gr(chan, t, ints, lang)); } else if (!strcasecmp(lang, "ge") ) { /* Georgian syntax */ return(ast_say_date_ge(chan, t, ints, lang)); + } else if (!strcasecmp(lang, "he")) { /* Hebrew syntax */ + return (ast_say_date_he(chan, t, ints, lang)); } /* Default to English */ @@ -2962,6 +3082,39 @@ int ast_say_date_pt(struct ast_channel *chan, time_t t, const char *ints, const return res; } +/* Hebrew syntax */ +int ast_say_date_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +{ + struct tm tm; + char fn[256]; + int res = 0; + ast_localtime(&t, &tm, NULL); + if (!res) { + snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); + res = ast_streamfile(chan, fn, lang); + if (!res) { + res = ast_waitstream(chan, ints); + } + } + if (!res) { + snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); + res = ast_streamfile(chan, fn, lang); + if (!res) { + res = ast_waitstream(chan, ints); + } + } + if (!res) { + res = ast_say_number(chan, tm.tm_mday, ints, lang, "m"); + } + if (!res) { + res = ast_waitstream(chan, ints); + } + if (!res) { + res = ast_say_number(chan, tm.tm_year + 1900, ints, lang, "m"); + } + return res; +} + static int say_date_with_format(struct ast_channel *chan, time_t time, const char *ints, const char *lang, const char *format, const char *timezone) { if (!strcasecmp(lang, "en") ) { /* English syntax */ @@ -2971,17 +3124,17 @@ static int say_date_with_format(struct ast_channel *chan, time_t time, const cha } else if (!strcasecmp(lang, "de") ) { /* German syntax */ return(ast_say_date_with_format_de(chan, time, ints, lang, format, timezone)); } else if (!strcasecmp(lang, "es") || !strcasecmp(lang, "mx")) { /* Spanish syntax */ - return(ast_say_date_with_format_es(chan, time, ints, lang, format, timezone)); - } else if (!strcasecmp(lang, "he")) { /* Hebrew syntax */ - return(ast_say_date_with_format_he(chan, time, ints, lang, format, timezone)); - } else if (!strcasecmp(lang, "fr") ) { /* French syntax */ - return(ast_say_date_with_format_fr(chan, time, ints, lang, format, timezone)); - } else if (!strcasecmp(lang, "it") ) { /* Italian syntax */ - return(ast_say_date_with_format_it(chan, time, ints, lang, format, timezone)); - } else if (!strcasecmp(lang, "nl") ) { /* Dutch syntax */ - return(ast_say_date_with_format_nl(chan, time, ints, lang, format, timezone)); - } else if (!strcasecmp(lang, "pl") ) { /* Polish syntax */ - return(ast_say_date_with_format_pl(chan, time, ints, lang, format, timezone)); + return (ast_say_date_with_format_es(chan, time, ints, lang, format, timezone)); + } else if (!strcasecmp(lang, "he")) { /* Hebrew syntax */ + return (ast_say_date_with_format_he(chan, time, ints, lang, format, timezone)); + } else if (!strcasecmp(lang, "fr")) { /* French syntax */ + return (ast_say_date_with_format_fr(chan, time, ints, lang, format, timezone)); + } else if (!strcasecmp(lang, "it")) { /* Italian syntax */ + return (ast_say_date_with_format_it(chan, time, ints, lang, format, timezone)); + } else if (!strcasecmp(lang, "nl")) { /* Dutch syntax */ + return (ast_say_date_with_format_nl(chan, time, ints, lang, format, timezone)); + } else if (!strcasecmp(lang, "pl")) { /* Polish syntax */ + return (ast_say_date_with_format_pl(chan, time, ints, lang, format, timezone)); } else if (!strcasecmp(lang, "pt") || !strcasecmp(lang, "pt_BR")) { /* Portuguese syntax */ return(ast_say_date_with_format_pt(chan, time, ints, lang, format, timezone)); } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) { /* Taiwanese / Chinese syntax */ @@ -3665,25 +3818,24 @@ int ast_say_date_with_format_de(struct ast_channel *chan, time_t time, const cha * * The numbers of 3000--19000 are not handled well **/ #define IL_DATE_STR "AdBY" -#define IL_TIME_STR "IMp" +#define IL_TIME_STR "HM" /* NOTE: In Hebrew we do not support 12 hours, only 24. No AM or PM exists in the Hebrew language */ #define IL_DATE_STR_FULL IL_DATE_STR " 'digits/at' " IL_TIME_STR -int ast_say_date_with_format_he(struct ast_channel *chan, time_t time, - const char *ints, const char *lang, const char *format, - const char *timezone) +int ast_say_date_with_format_he(struct ast_channel *chan, time_t time, const char *ints, const char *lang, const char *format, const char *timezone) { /* TODO: This whole function is cut&paste from * ast_say_date_with_format_en . Is that considered acceptable? **/ struct tm tm; - int res=0, offset, sndoffset; + int res = 0, offset, sndoffset; char sndfile[256], nextmsg[256]; - if (!format) + if (!format) { format = IL_DATE_STR_FULL; + } - ast_localtime(&time,&tm,timezone); + ast_localtime(&time, &tm, timezone); - for (offset=0 ; format[offset] != '\0' ; offset++) { + for (offset = 0; format[offset] != '\0'; offset++) { ast_log(LOG_DEBUG, "Parsing %c (offset %d) in %s\n", format[offset], offset, format); switch (format[offset]) { /* NOTE: if you add more options here, please try to be consistent with strftime(3) */ @@ -3717,9 +3869,7 @@ int ast_say_date_with_format_he(struct ast_channel *chan, time_t time, * * At least in one of the pathes :-( */ - res = ast_say_number_full_he(chan, tm.tm_mday, - ints, lang, "m", -1, -1 - ); + res = ast_say_number_full_he(chan, tm.tm_mday, ints, lang, "m", -1, -1); break; case 'Y': /* Year */ res = ast_say_number_full_he(chan, tm.tm_year+1900, @@ -3727,44 +3877,19 @@ int ast_say_date_with_format_he(struct ast_channel *chan, time_t time, ); break; case 'I': - case 'l': /* 12-Hour */ - { - int hour = tm.tm_hour; - hour = hour%12; - if (hour == 0) hour=12; - - res = ast_say_number_full_he(chan, hour, - ints, lang, "f", -1, -1 - ); - } - break; + case 'l': /* 12-Hour -> we do not support 12 hour based langauges in Hebrew */ case 'H': case 'k': /* 24-Hour */ - /* With 'H' there is an 'oh' after a single- - * digit hour */ - if ((format[offset] == 'H') && - (tm.tm_hour <10)&&(tm.tm_hour>0) - ) { /* e.g. oh-eight */ - res = wait_file(chan,ints, "digits/oh",lang); - } - - res = ast_say_number_full_he(chan, tm.tm_hour, - ints, lang, "f", -1, -1 - ); + res = ast_say_number_full_he(chan, tm.tm_hour, ints, lang, "f", -1, -1); break; case 'M': /* Minute */ - res = ast_say_number_full_he(chan, tm.tm_min, - ints, lang,"f", -1, -1 - ); + if (tm.tm_min >= 0 && tm.tm_min <= 9) /* say a leading zero if needed */ + res = ast_say_number_full_he(chan, 0, ints, lang, "f", -1, -1); + res = ast_say_number_full_he(chan, tm.tm_min, ints, lang, "f", -1, -1); break; case 'P': case 'p': - /* AM/PM */ - if (tm.tm_hour > 11) - snprintf(nextmsg,sizeof(nextmsg), "digits/p-m"); - else - snprintf(nextmsg,sizeof(nextmsg), "digits/a-m"); - res = wait_file(chan,ints,nextmsg,lang); + /* AM/PM - There is no AM/PM in Hebrew... */ break; case 'Q': /* Shorthand for "Today", "Yesterday", or "date" */ @@ -5479,6 +5604,8 @@ static int say_time(struct ast_channel *chan, time_t t, const char *ints, const return(ast_say_time_gr(chan, t, ints, lang)); } else if (!strcasecmp(lang, "ge") ) { /* Georgian syntax */ return(ast_say_time_ge(chan, t, ints, lang)); + } else if (!strcasecmp(lang, "he")) { /* Hebrew syntax */ + return (ast_say_time_he(chan, t, ints, lang)); } /* Default to English */ @@ -5687,6 +5814,40 @@ int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const return res; } +/* Hebrew syntax */ +int ast_say_time_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +{ + struct tm tm; + int res = 0; + int hour; + + ast_localtime(&t, &tm, NULL); + hour = tm.tm_hour; + if (!hour) + hour = 12; + + if (!res) + res = ast_say_number_full_he(chan, hour, ints, lang, "f", -1, -1); + + if (tm.tm_min > 9) { + if (!res) + res = ast_say_number_full_he(chan, tm.tm_min, ints, lang, "f", -1, -1); + } else if (tm.tm_min) { + if (!res) { /* say a leading zero if needed */ + res = ast_say_number_full_he(chan, 0, ints, lang, "f", -1, -1); + } + if (!res) + res = ast_waitstream(chan, ints); + if (!res) + res = ast_say_number_full_he(chan, tm.tm_min, ints, lang, "f", -1, -1); + } else { + if (!res) + res = ast_waitstream(chan, ints); + } + if (!res) + res = ast_waitstream(chan, ints); + return res; +} static int say_datetime(struct ast_channel *chan, time_t t, const char *ints, const char *lang) { if (!strcasecmp(lang, "en") ) { /* English syntax */ @@ -5707,6 +5868,8 @@ static int say_datetime(struct ast_channel *chan, time_t t, const char *ints, co return(ast_say_datetime_gr(chan, t, ints, lang)); } else if (!strcasecmp(lang, "ge") ) { /* Georgian syntax */ return(ast_say_datetime_ge(chan, t, ints, lang)); + } else if (!strcasecmp(lang, "he")) { /* Hebrew syntax */ + return (ast_say_datetime_he(chan, t, ints, lang)); } /* Default to English */ @@ -5989,6 +6152,70 @@ int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, co return res; } +/* Hebrew syntax */ +int ast_say_datetime_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +{ + struct tm tm; + char fn[256]; + int res = 0; + int hour; + + ast_localtime(&t, &tm, NULL); + if (!res) { + snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); + res = ast_streamfile(chan, fn, lang); + if (!res) { + res = ast_waitstream(chan, ints); + } + } + if (!res) { + snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); + res = ast_streamfile(chan, fn, lang); + if (!res) { + res = ast_waitstream(chan, ints); + } + } + if (!res) { + res = ast_say_number(chan, tm.tm_mday, ints, lang, "f"); + } + + hour = tm.tm_hour; + if (!hour) { + hour = 12; + } + + if (!res) { + res = ast_say_number(chan, hour, ints, lang, "f"); + } + + if (tm.tm_min > 9) { + if (!res) { + res = ast_say_number(chan, tm.tm_min, ints, lang, "f"); + } + } else if (tm.tm_min) { + if (!res) { + /* say a leading zero if needed */ + res = ast_say_number(chan, 0, ints, lang, "f"); + } + if (!res) { + res = ast_waitstream(chan, ints); + } + if (!res) { + res = ast_say_number(chan, tm.tm_min, ints, lang, "f"); + } + } else { + if (!res) { + res = ast_waitstream(chan, ints); + } + } + if (!res) { + res = ast_waitstream(chan, ints); + } + if (!res) { + res = ast_say_number(chan, tm.tm_year + 1900, ints, lang, "f"); + } + return res; +} static int say_datetime_from_now(struct ast_channel *chan, time_t t, const char *ints, const char *lang) { if (!strcasecmp(lang, "en") ) { /* English syntax */ @@ -5999,6 +6226,8 @@ static int say_datetime_from_now(struct ast_channel *chan, time_t t, const char return(ast_say_datetime_from_now_pt(chan, t, ints, lang)); } else if (!strcasecmp(lang, "ge") ) { /* Georgian syntax */ return(ast_say_datetime_from_now_ge(chan, t, ints, lang)); + } else if (!strcasecmp(lang, "he")) { /* Georgian syntax */ + return (ast_say_datetime_from_now_he(chan, t, ints, lang)); } /* Default to English */ @@ -6137,6 +6366,47 @@ int ast_say_datetime_from_now_pt(struct ast_channel *chan, time_t t, const char return res; } +/* Hebrew syntax */ +int ast_say_datetime_from_now_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +{ + int res = 0; + time_t nowt; + int daydiff; + struct tm tm; + struct tm now; + char fn[256]; + + time(&nowt); + + ast_localtime(&t, &tm, NULL); + ast_localtime(&nowt, &now, NULL); + daydiff = now.tm_yday - tm.tm_yday; + if ((daydiff < 0) || (daydiff > 6)) { + /* Day of month and month */ + if (!res) { + snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); + res = ast_streamfile(chan, fn, lang); + if (!res) + res = ast_waitstream(chan, ints); + } + if (!res) { + res = ast_say_number(chan, tm.tm_mday, ints, lang, "f"); + } + } else if (daydiff) { + /* Just what day of the week */ + if (!res) { + snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); + res = ast_streamfile(chan, fn, lang); + if (!res) { + res = ast_waitstream(chan, ints); + } + } + } /* Otherwise, it was today */ + if (!res) { + res = ast_say_time(chan, t, ints, lang); + } + return res; +} /*********************************** GREEK SUPPORT ***************************************/ -- 2.47.3