From a06ab7b648e0da0cb1f0af92b1a5bf9627c02e4f Mon Sep 17 00:00:00 2001 From: Tilghman Lesher <tilghman@meg.abyt.es> Date: Wed, 18 Jun 2008 22:17:17 +0000 Subject: [PATCH] Merged revisions 123769 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r123769 | tilghman | 2008-06-18 17:08:30 -0500 (Wed, 18 Jun 2008) | 8 lines 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/trunk@123770 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- doc/lang/hebrew.ods | Bin 0 -> 23290 bytes main/say.c | 572 +++++++++++++++++++++++++++++++++----------- 2 files changed, 429 insertions(+), 143 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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 literal 0 HcmV?d00001 diff --git a/main/say.c b/main/say.c index 9a8e7d5360..46538b0622 100644 --- a/main/say.c +++ b/main/say.c @@ -353,6 +353,7 @@ static int ast_say_number_full_th(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); @@ -365,6 +366,7 @@ static int ast_say_date_gr(struct ast_channel *chan, time_t t, const char *ints, static int ast_say_date_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_date_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_date_th(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); @@ -391,6 +393,7 @@ static int ast_say_time_gr(struct ast_channel *chan, time_t t, const char *ints, static int ast_say_time_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_th(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); @@ -403,11 +406,13 @@ static int ast_say_datetime_gr(struct ast_channel *chan, time_t t, const char *i static int ast_say_datetime_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_th(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) { @@ -1180,147 +1185,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_debug(3, "ast_say_digits_full: started. " - "num: %d, options=\"%s\"\n", - num, options - ); - if (!num) + + 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; + } + 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_debug(3, "ast_say_digits_full: num: %d, " - "state=%d, options=\"%s\", mf=%d\n", - num, state, options, mf - ); + 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) { - ast_copy_string(fn, "digits/hundred", sizeof(fn)); state = 0; } else if (state == 2) { - ast_copy_string(fn, "digits/ve", sizeof(fn)); + 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 == 3) { - ast_copy_string(fn, "digits/thousands", sizeof(fn)); - state=0; - } else if (num < 21) { - if (mf < 0) - snprintf(fn, sizeof(fn), "digits/%dF", num); - else + snprintf(fn, sizeof(fn), "digits/1k"); + state = 0; + } 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) { + } 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) { - ast_copy_string(fn, "digits/1hundred", sizeof(fn)); - num = num - 100; - state = 2; - } else if (num < 300) { - ast_copy_string(fn, "digits/2hundred", sizeof(fn)); - 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) { - ast_copy_string(fn, "digits/thousand", sizeof(fn)); - num = num - 1000; - } else if (num < 3000) { - ast_copy_string(fn, "digits/2thousand", sizeof(fn)); - num = num - 2000; - if (num > 0) + 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; } 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; - ast_copy_string(fn, "digits/thousand", sizeof(fn)); + } + 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; - ast_copy_string(fn, "digits/million", sizeof(fn)); + } + snprintf(fn, sizeof(fn), "digits/million"); num = num % 1000000; + if ((num > 0) && (num < 11)) { + state = 2; + } } else { ast_debug(1, "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); } @@ -2461,6 +2488,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 */ @@ -2892,6 +2921,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 */ @@ -2914,6 +3031,8 @@ static int say_date(struct ast_channel *chan, time_t t, const char *ints, const return(ast_say_date_th(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 */ @@ -3201,6 +3320,40 @@ 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 timeval tv = { t, 0 }; + struct ast_tm tm; + char fn[256]; + int res = 0; + ast_localtime(&tv, &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 */ @@ -3210,17 +3363,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 */ @@ -4067,26 +4220,25 @@ int ast_say_date_with_format_th(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 timeval tv = { time, 0 }; struct ast_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(&tv, &tm, timezone); - for (offset=0 ; format[offset] != '\0' ; offset++) { + for (offset = 0; format[offset] != '\0'; offset++) { ast_debug(1, "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) */ @@ -4113,43 +4265,32 @@ int ast_say_date_with_format_he(struct ast_channel *chan, time_t time, break; case 'd': case 'e': /* Day of the month */ + /* I'm not sure exactly what the parameters + * audiofd and ctrlfd to + * ast_say_number_full_he mean, but it seems + * safe to pass -1 there. + * + * At least in one of the pathes :-( + */ 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, ints, lang, "f", -1, -1); 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); break; case 'M': /* Minute */ + 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) - ast_copy_string(nextmsg, "digits/p-m", sizeof(nextmsg)); - else - ast_copy_string(nextmsg, "digits/a-m", sizeof(nextmsg)); - 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" */ @@ -5843,6 +5984,8 @@ static int say_time(struct ast_channel *chan, time_t t, const char *ints, const return(ast_say_time_th(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 */ @@ -6099,6 +6242,41 @@ 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 timeval tv = { t, 0 }; + struct ast_tm tm; + int res = 0; + int hour; + + ast_localtime(&tv, &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 */ @@ -6123,6 +6301,8 @@ static int say_datetime(struct ast_channel *chan, time_t t, const char *ints, co return(ast_say_datetime_th(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 */ @@ -6469,6 +6649,71 @@ 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 timeval tv = { t, 0 }; + struct ast_tm tm; + char fn[256]; + int res = 0; + int hour; + + ast_localtime(&tv, &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 */ @@ -6479,6 +6724,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 */ @@ -6611,6 +6858,45 @@ 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; + struct timeval nowt = ast_tvnow(), tv = { t, 0 }; + int daydiff; + struct ast_tm tm; + struct ast_tm now; + char fn[256]; + + ast_localtime(&tv, &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 ***************************************/ -- GitLab