~ubuntu-branches/ubuntu/karmic/asterisk/karmic-updates

« back to all changes in this revision

Viewing changes to main/say.c

  • Committer: Bazaar Package Importer
  • Author(s): Jean-Michel Dault, Faidon Liambotis, Tzafrir Cohen
  • Date: 2009-08-20 03:40:08 UTC
  • mfrom: (1.2.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090820034008-rg2s51o9ruqvmwml
Tags: 1:1.6.2.0~dfsg~beta4-0ubuntu1
* Merge from Debian.
  - Lsb patches dropped: fixed upstream
  - Patch for LP #350732 dropped: fixed upstream
* Added:
  - Add support for web interface
  - Don't enable voicetronix cards by default
  - Chown /dev/dahdi in init script
  - Add files for potential backports
  - Change maintainer
  - Standards version 3.8.3

* Debian changes

 [ Faidon Liambotis ]
 * Fix FTBFS on armel. (Closes: #532971)

 [ Tzafrir Cohen ]
 * New upstream beta.
 * Patch hardware_dtmf_mute_fix removed: Applied upstream.
 * No need for a separate app_directory_odbc (will use app_voicemail_odbc).
 * Fix name of voicemail 'openssl' dep. (Thomas Renard) (Closes: #539150)

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
#include "asterisk.h"
35
35
 
36
 
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 169794 $")
 
36
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 205223 $")
37
37
 
38
38
#include <netinet/in.h>
39
39
#include <time.h>
288
288
      \arg \b pt    - Portuguese
289
289
      \arg \b pt_BR - Portuguese (Brazil)
290
290
      \arg \b se    - Swedish
291
 
      \arg \b tw    - Taiwanese / Chinese
 
291
      \arg \b zh    - Taiwanese / Chinese
292
292
      \arg \b ru    - Russian
293
 
      \arg \b ge    - Georgian
 
293
      \arg \b ka    - Georgian
294
294
      \arg \b hu    - Hungarian
295
295
 
296
296
 \par Gender:
330
330
 
331
331
/* Forward declarations of language specific variants of ast_say_number_full */
332
332
static int ast_say_number_full_en(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
333
 
static int ast_say_number_full_cz(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
 
333
static int ast_say_number_full_cs(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
334
334
static int ast_say_number_full_da(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
335
335
static int ast_say_number_full_de(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
336
336
static int ast_say_number_full_en_GB(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
343
343
static int ast_say_number_full_pl(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
344
344
static int ast_say_number_full_pt(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
345
345
static int ast_say_number_full_se(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
346
 
static int ast_say_number_full_tw(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
 
346
static int ast_say_number_full_zh(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
347
347
static int ast_say_number_full_gr(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
348
348
static int ast_say_number_full_ru(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
349
 
static int ast_say_number_full_ge(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
 
349
static int ast_say_number_full_ka(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd);
350
350
static int ast_say_number_full_hu(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
351
351
static int ast_say_number_full_th(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd);
352
352
 
364
364
static int ast_say_date_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
365
365
static int ast_say_date_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
366
366
static int ast_say_date_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
367
 
static int ast_say_date_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
367
static int ast_say_date_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
368
368
static int ast_say_date_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
369
369
static int ast_say_date_th(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
370
370
static int ast_say_date_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
379
379
static int ast_say_date_with_format_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
380
380
static int ast_say_date_with_format_pl(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
381
381
static int ast_say_date_with_format_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
382
 
static int ast_say_date_with_format_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
 
382
static int ast_say_date_with_format_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
383
383
static int ast_say_date_with_format_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
384
384
static int ast_say_date_with_format_th(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone);
385
385
 
389
389
static int ast_say_time_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
390
390
static int ast_say_time_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
391
391
static int ast_say_time_pt_BR(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
392
 
static int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
392
static int ast_say_time_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
393
393
static int ast_say_time_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
394
 
static int ast_say_time_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
394
static int ast_say_time_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
395
395
static int ast_say_time_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
396
396
static int ast_say_time_th(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
397
397
static int ast_say_time_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
402
402
static int ast_say_datetime_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
403
403
static int ast_say_datetime_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
404
404
static int ast_say_datetime_pt_BR(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
405
 
static int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
405
static int ast_say_datetime_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
406
406
static int ast_say_datetime_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
407
 
static int ast_say_datetime_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
407
static int ast_say_datetime_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
408
408
static int ast_say_datetime_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
409
409
static int ast_say_datetime_th(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
410
410
static int ast_say_datetime_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
412
412
static int ast_say_datetime_from_now_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
413
413
static int ast_say_datetime_from_now_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
414
414
static int ast_say_datetime_from_now_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
415
 
static int ast_say_datetime_from_now_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
 
415
static int ast_say_datetime_from_now_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
416
416
static int ast_say_datetime_from_now_he(struct ast_channel *chan, time_t t, const char *ints, const char *lang);
417
417
 
418
418
static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang) 
429
429
/* Called from AGI */
430
430
static int say_number_full(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
431
431
{
432
 
        if (!strcasecmp(language, "en") ) {     /* English syntax */
433
 
           return(ast_say_number_full_en(chan, num, ints, language, audiofd, ctrlfd));
434
 
        } else if (!strcasecmp(language, "cz") ) {      /* Czech syntax */
435
 
           return(ast_say_number_full_cz(chan, num, ints, language, options, audiofd, ctrlfd));
436
 
        } else if (!strcasecmp(language, "da") ) {      /* Danish syntax */
437
 
           return(ast_say_number_full_da(chan, num, ints, language, options, audiofd, ctrlfd));
438
 
        } else if (!strcasecmp(language, "de") ) {      /* German syntax */
439
 
           return(ast_say_number_full_de(chan, num, ints, language, options, audiofd, ctrlfd));
440
 
        } else if (!strcasecmp(language, "en_GB") ) {   /* British syntax */
441
 
           return(ast_say_number_full_en_GB(chan, num, ints, language, audiofd, ctrlfd));
442
 
        } else if (!strcasecmp(language, "no") ) {      /* Norwegian syntax */
443
 
           return(ast_say_number_full_no(chan, num, ints, language, options, audiofd, ctrlfd));
444
 
        } else if (!strcasecmp(language, "es") || !strcasecmp(language, "mx")) {        /* Spanish syntax */
445
 
           return(ast_say_number_full_es(chan, num, ints, language, options, audiofd, ctrlfd));
446
 
        } else if (!strcasecmp(language, "fr") ) {      /* French syntax */
447
 
           return(ast_say_number_full_fr(chan, num, ints, language, options, audiofd, ctrlfd));
448
 
        } else if (!strcasecmp(language, "he") ) {      /* Hebrew syntax */
449
 
           return(ast_say_number_full_he(chan, num, ints, language, options, audiofd, ctrlfd));
450
 
        } else if (!strcasecmp(language, "hu") ) {      /* Hungarian syntax */
451
 
           return(ast_say_number_full_hu(chan, num, ints, language, audiofd, ctrlfd));
452
 
        } else if (!strcasecmp(language, "it") ) {      /* Italian syntax */
453
 
           return(ast_say_number_full_it(chan, num, ints, language, audiofd, ctrlfd));
454
 
        } else if (!strcasecmp(language, "nl") ) {      /* Dutch syntax */
455
 
           return(ast_say_number_full_nl(chan, num, ints, language, audiofd, ctrlfd));
456
 
        } else if (!strcasecmp(language, "pl") ) {      /* Polish syntax */
457
 
           return(ast_say_number_full_pl(chan, num, ints, language, options, audiofd, ctrlfd));
458
 
        } else if (!strcasecmp(language, "pt") || !strcasecmp(language, "pt_BR")) {     /* Portuguese syntax */
459
 
           return(ast_say_number_full_pt(chan, num, ints, language, options, audiofd, ctrlfd));
460
 
        } else if (!strcasecmp(language, "se") ) {      /* Swedish syntax */
461
 
           return(ast_say_number_full_se(chan, num, ints, language, options, audiofd, ctrlfd));
462
 
        } else if (!strcasecmp(language, "tw") || !strcasecmp(language, "zh") ) {       /* Taiwanese / Chinese syntax */
463
 
           return(ast_say_number_full_tw(chan, num, ints, language, audiofd, ctrlfd));
464
 
        } else if (!strcasecmp(language, "gr") ) {      /* Greek syntax */
465
 
           return(ast_say_number_full_gr(chan, num, ints, language, audiofd, ctrlfd));
466
 
        } else if (!strcasecmp(language, "ru") ) {      /* Russian syntax */
467
 
           return(ast_say_number_full_ru(chan, num, ints, language, options, audiofd, ctrlfd));
468
 
        } else if (!strcasecmp(language, "th") ) {      /* Thai syntax */
469
 
           return(ast_say_number_full_th(chan, num, ints, language, audiofd, ctrlfd));
470
 
        } else if (!strcasecmp(language, "ge") ) {      /* Georgian syntax */
471
 
           return(ast_say_number_full_ge(chan, num, ints, language, options, audiofd, ctrlfd));
 
432
        if (!strncasecmp(language, "en_GB", 5)) {     /* British syntax */
 
433
           return ast_say_number_full_en_GB(chan, num, ints, language, audiofd, ctrlfd);
 
434
        } else if (!strncasecmp(language, "en", 2)) { /* English syntax */
 
435
           return ast_say_number_full_en(chan, num, ints, language, audiofd, ctrlfd);
 
436
        } else if (!strncasecmp(language, "cs", 2)) { /* Czech syntax */
 
437
           return ast_say_number_full_cs(chan, num, ints, language, options, audiofd, ctrlfd);
 
438
        } else if (!strncasecmp(language, "cz", 2)) { /* deprecated Czech syntax */
 
439
                static int deprecation_warning = 0;
 
440
                if (deprecation_warning++ % 10 == 0) {
 
441
                        ast_log(LOG_WARNING, "cz is not a standard language code.  Please switch to using cs instead.\n");
 
442
                }
 
443
                return ast_say_number_full_cs(chan, num, ints, language, options, audiofd, ctrlfd);
 
444
        } else if (!strncasecmp(language, "da", 2)) { /* Danish syntax */
 
445
           return ast_say_number_full_da(chan, num, ints, language, options, audiofd, ctrlfd);
 
446
        } else if (!strncasecmp(language, "de", 2)) { /* German syntax */
 
447
           return ast_say_number_full_de(chan, num, ints, language, options, audiofd, ctrlfd);
 
448
        } else if (!strncasecmp(language, "es", 2)) { /* Spanish syntax */
 
449
           return ast_say_number_full_es(chan, num, ints, language, options, audiofd, ctrlfd);
 
450
        } else if (!strncasecmp(language, "fr", 2)) { /* French syntax */
 
451
           return ast_say_number_full_fr(chan, num, ints, language, options, audiofd, ctrlfd);
 
452
        } else if (!strncasecmp(language, "ge", 2)) { /* deprecated Georgian syntax */
 
453
                static int deprecation_warning = 0;
 
454
                if (deprecation_warning++ % 10 == 0) {
 
455
                        ast_log(LOG_WARNING, "ge is not a standard language code.  Please switch to using ka instead.\n");
 
456
                }
 
457
                return ast_say_number_full_ka(chan, num, ints, language, options, audiofd, ctrlfd);
 
458
        } else if (!strncasecmp(language, "gr", 2)) { /* Greek syntax */
 
459
           return ast_say_number_full_gr(chan, num, ints, language, audiofd, ctrlfd);
 
460
        } else if (!strncasecmp(language, "he", 2)) { /* Hebrew syntax */
 
461
           return ast_say_number_full_he(chan, num, ints, language, options, audiofd, ctrlfd);
 
462
        } else if (!strncasecmp(language, "hu", 2)) { /* Hungarian syntax */
 
463
                return ast_say_number_full_hu(chan, num, ints, language, audiofd, ctrlfd);
 
464
        } else if (!strncasecmp(language, "it", 2)) { /* Italian syntax */
 
465
           return ast_say_number_full_it(chan, num, ints, language, audiofd, ctrlfd);
 
466
        } else if (!strncasecmp(language, "ka", 2)) { /* Georgian syntax */
 
467
           return ast_say_number_full_ka(chan, num, ints, language, options, audiofd, ctrlfd);
 
468
        } else if (!strncasecmp(language, "mx", 2)) { /* deprecated Mexican syntax */
 
469
                static int deprecation_warning = 0;
 
470
                if (deprecation_warning++ % 10 == 0) {
 
471
                        ast_log(LOG_WARNING, "mx is not a standard language code.  Please switch to using es_MX instead.\n");
 
472
                }
 
473
                return ast_say_number_full_es(chan, num, ints, language, options, audiofd, ctrlfd);
 
474
        } else if (!strncasecmp(language, "nl", 2)) { /* Dutch syntax */
 
475
           return ast_say_number_full_nl(chan, num, ints, language, audiofd, ctrlfd);
 
476
        } else if (!strncasecmp(language, "no", 2)) { /* Norwegian syntax */
 
477
           return ast_say_number_full_no(chan, num, ints, language, options, audiofd, ctrlfd);
 
478
        } else if (!strncasecmp(language, "pl", 2)) { /* Polish syntax */
 
479
           return ast_say_number_full_pl(chan, num, ints, language, options, audiofd, ctrlfd);
 
480
        } else if (!strncasecmp(language, "pt", 2)) { /* Portuguese syntax */
 
481
           return ast_say_number_full_pt(chan, num, ints, language, options, audiofd, ctrlfd);
 
482
        } else if (!strncasecmp(language, "ru", 2)) { /* Russian syntax */
 
483
           return ast_say_number_full_ru(chan, num, ints, language, options, audiofd, ctrlfd);
 
484
        } else if (!strncasecmp(language, "se", 2)) { /* Swedish syntax */
 
485
           return ast_say_number_full_se(chan, num, ints, language, options, audiofd, ctrlfd);
 
486
        } else if (!strncasecmp(language, "th", 2)) { /* Thai syntax */
 
487
                return ast_say_number_full_th(chan, num, ints, language, audiofd, ctrlfd);
 
488
        } else if (!strncasecmp(language, "tw", 2)) { /* deprecated Taiwanese syntax */
 
489
                static int deprecation_warning = 0;
 
490
                if (deprecation_warning++ % 10 == 0) {
 
491
                        ast_log(LOG_WARNING, "tw is a standard language code for Twi, not Taiwanese.  Please switch to using zh_TW instead.\n");
 
492
                }
 
493
                return ast_say_number_full_zh(chan, num, ints, language, audiofd, ctrlfd);
 
494
        } else if (!strncasecmp(language, "zh", 2)) { /* Taiwanese / Chinese syntax */
 
495
           return ast_say_number_full_zh(chan, num, ints, language, audiofd, ctrlfd);
472
496
        }
473
497
 
474
498
        /* Default to english */
475
 
        return(ast_say_number_full_en(chan, num, ints, language, audiofd, ctrlfd));
 
499
        return ast_say_number_full_en(chan, num, ints, language, audiofd, ctrlfd);
476
500
}
477
501
 
478
502
/*! \brief  ast_say_number_full_en: English syntax */
549
573
        return res;
550
574
}
551
575
 
552
 
/*! \brief  ast_say_number_full_cz: Czech syntax */
 
576
/*! \brief  ast_say_number_full_cs: Czech syntax */
553
577
/* files needed:
554
578
 * 1m,2m - gender male
555
579
 * 1w,2w - gender female
570
594
 * tousand, milion are  gender male, so 1 and 2 is 1m 2m
571
595
 * miliard is gender female, so 1 and 2 is 1w 2w
572
596
 */
573
 
static int ast_say_number_full_cz(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
 
597
static int ast_say_number_full_cs(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
574
598
{
575
599
        int res = 0;
576
600
        int playh = 0;
613
637
                        } else if ( hundered == 2 ) {
614
638
                                ast_copy_string(fn, "digits/2ste", sizeof(fn));
615
639
                        } else {
616
 
                                        res = ast_say_number_full_cz(chan, hundered, ints, language, options, audiofd, ctrlfd);
 
640
                                res = ast_say_number_full_cs(chan, hundered, ints, language, options, audiofd, ctrlfd);
617
641
                                if (res)
618
642
                                        return res;
619
643
                                if (hundered == 3 || hundered == 4) {   
637
661
                                }
638
662
                        }
639
663
                        if ( left > 1 ) { /* we dont say "one thousand" but only thousand */
640
 
                                res = ast_say_number_full_cz(chan, left, ints, language, options, audiofd, ctrlfd);
 
664
                                res = ast_say_number_full_cs(chan, left, ints, language, options, audiofd, ctrlfd);
641
665
                                if (res) 
642
666
                                        return res;
643
667
                        }
2239
2263
        return res;
2240
2264
}
2241
2265
 
2242
 
/*! \brief  ast_say_number_full_tw: Taiwanese / Chinese syntax */
2243
 
static int ast_say_number_full_tw(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd)
 
2266
/*! \brief  ast_say_number_full_zh: Taiwanese / Chinese syntax */
 
2267
static int ast_say_number_full_zh(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd)
2244
2268
{
2245
2269
        int res = 0;
2246
2270
        int playh = 0;
2277
2301
                                        playz++;
2278
2302
                                        continue;
2279
2303
                                }
2280
 
                                if (strcasecmp(language,"twz") == 0)
2281
 
                                        snprintf(fn, sizeof(fn), "digits/%d", num);
2282
 
                                else
2283
 
                                        snprintf(fn, sizeof(fn), "digits/%d", num);
 
2304
                                snprintf(fn, sizeof(fn), "digits/%d", num);
2284
2305
                                num = 0;
2285
2306
                        } else  if (num < 100) {
2286
2307
                                snprintf(buf, 10, "%d", num);
2315
2336
                                        last_length = strlen(buf);
2316
2337
                                        num -= ((num / 1000) * 1000);
2317
2338
                                } else if (num < 100000000) { /* 100,000,000 */
2318
 
                                                res = ast_say_number_full_tw(chan, num / 10000, ints, language, audiofd, ctrlfd);
 
2339
                                                res = ast_say_number_full_zh(chan, num / 10000, ints, language, audiofd, ctrlfd);
2319
2340
                                                if (res)
2320
2341
                                                        return res;
2321
2342
                                                snprintf(buf, 10, "%d", num);
2325
2346
                                                snprintf(fn, sizeof(fn), "digits/wan");
2326
2347
                                } else {
2327
2348
                                        if (num < 1000000000) { /* 1,000,000,000 */
2328
 
                                                res = ast_say_number_full_tw(chan, num / 100000000, ints, language, audiofd, ctrlfd);
 
2349
                                                res = ast_say_number_full_zh(chan, num / 100000000, ints, language, audiofd, ctrlfd);
2329
2350
                                                if (res)
2330
2351
                                                        return res;
2331
2352
                                                snprintf(buf, 10, "%d", num);
2531
2552
/* Called from AGI */
2532
2553
static int say_enumeration_full(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
2533
2554
{
2534
 
        if (!strcasecmp(language, "en") ) {     /* English syntax */
2535
 
           return(ast_say_enumeration_full_en(chan, num, ints, language, audiofd, ctrlfd));
2536
 
        } else if (!strcasecmp(language, "da") ) {      /* Danish syntax */
2537
 
           return(ast_say_enumeration_full_da(chan, num, ints, language, options, audiofd, ctrlfd));
2538
 
        } else if (!strcasecmp(language, "de") ) {      /* German syntax */
2539
 
           return(ast_say_enumeration_full_de(chan, num, ints, language, options, audiofd, ctrlfd));
2540
 
        } else if (!strcasecmp(language, "he")) {       /* Hebrew syntax */
2541
 
                return (ast_say_enumeration_full_he(chan, num, ints, language, options, audiofd, ctrlfd));
2542
 
        } 
2543
 
        
 
2555
        if (!strncasecmp(language, "en", 2)) {        /* English syntax */
 
2556
           return ast_say_enumeration_full_en(chan, num, ints, language, audiofd, ctrlfd);
 
2557
        } else if (!strncasecmp(language, "da", 2)) { /* Danish syntax */
 
2558
           return ast_say_enumeration_full_da(chan, num, ints, language, options, audiofd, ctrlfd);
 
2559
        } else if (!strncasecmp(language, "de", 2)) { /* German syntax */
 
2560
           return ast_say_enumeration_full_de(chan, num, ints, language, options, audiofd, ctrlfd);
 
2561
        } else if (!strncasecmp(language, "he", 2)) { /* Hebrew syntax */
 
2562
                return ast_say_enumeration_full_he(chan, num, ints, language, options, audiofd, ctrlfd);
 
2563
        }
 
2564
 
2544
2565
        /* Default to english */
2545
 
        return(ast_say_enumeration_full_en(chan, num, ints, language, audiofd, ctrlfd));
 
2566
        return ast_say_enumeration_full_en(chan, num, ints, language, audiofd, ctrlfd);
2546
2567
}
2547
2568
 
2548
2569
/*! \brief  ast_say_enumeration_full_en: English syntax */
3060
3081
 
3061
3082
static int say_date(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
3062
3083
{
3063
 
        if (!strcasecmp(lang, "en") ) { /* English syntax */
3064
 
                return(ast_say_date_en(chan, t, ints, lang));
3065
 
        } else if (!strcasecmp(lang, "da") ) {  /* Danish syntax */
3066
 
                return(ast_say_date_da(chan, t, ints, lang));
3067
 
        } else if (!strcasecmp(lang, "de") ) {  /* German syntax */
3068
 
                return(ast_say_date_de(chan, t, ints, lang));
3069
 
        } else if (!strcasecmp(lang, "fr") ) {  /* French syntax */
3070
 
                return(ast_say_date_fr(chan, t, ints, lang));
3071
 
        } else if (!strcasecmp(lang, "hu") ) {  /* Hungarian syntax */
3072
 
                return(ast_say_date_hu(chan, t, ints, lang));
3073
 
        } else if (!strcasecmp(lang, "nl") ) {  /* Dutch syntax */
3074
 
                return(ast_say_date_nl(chan, t, ints, lang));
3075
 
        } else if (!strcasecmp(lang, "pt") || !strcasecmp(lang, "pt_BR")) {     /* Portuguese syntax */
3076
 
                return(ast_say_date_pt(chan, t, ints, lang));
3077
 
        } else if (!strcasecmp(lang, "gr") ) {                          /* Greek syntax */
3078
 
                return(ast_say_date_gr(chan, t, ints, lang));
3079
 
        } else if (!strcasecmp(lang, "th") ) {  /* Thai syntax */
3080
 
                return(ast_say_date_th(chan, t, ints, lang));
3081
 
        } else if (!strcasecmp(lang, "ge") ) {  /* Georgian syntax */
3082
 
                return(ast_say_date_ge(chan, t, ints, lang));
3083
 
        } else if (!strcasecmp(lang, "he")) {   /* Hebrew syntax */
3084
 
                return (ast_say_date_he(chan, t, ints, lang));
 
3084
        if (!strncasecmp(lang, "en", 2)) {        /* English syntax */
 
3085
                return ast_say_date_en(chan, t, ints, lang);
 
3086
        } else if (!strncasecmp(lang, "da", 2)) { /* Danish syntax */
 
3087
                return ast_say_date_da(chan, t, ints, lang);
 
3088
        } else if (!strncasecmp(lang, "de", 2)) { /* German syntax */
 
3089
                return ast_say_date_de(chan, t, ints, lang);
 
3090
        } else if (!strncasecmp(lang, "fr", 2)) { /* French syntax */
 
3091
                return ast_say_date_fr(chan, t, ints, lang);
 
3092
        } else if (!strncasecmp(lang, "ge", 2)) { /* deprecated Georgian syntax */
 
3093
                static int deprecation_warning = 0;
 
3094
                if (deprecation_warning++ % 10 == 0) {
 
3095
                        ast_log(LOG_WARNING, "ge is not a standard language code.  Please switch to using ka instead.\n");
 
3096
                }
 
3097
                return ast_say_date_ka(chan, t, ints, lang);
 
3098
        } else if (!strncasecmp(lang, "gr", 2)) { /* Greek syntax */
 
3099
                return ast_say_date_gr(chan, t, ints, lang);
 
3100
        } else if (!strncasecmp(lang, "he", 2)) { /* Hebrew syntax */
 
3101
                return ast_say_date_he(chan, t, ints, lang);
 
3102
        } else if (!strncasecmp(lang, "hu", 2)) { /* Hungarian syntax */
 
3103
                return ast_say_date_hu(chan, t, ints, lang);
 
3104
        } else if (!strncasecmp(lang, "ka", 2)) { /* Georgian syntax */
 
3105
                return ast_say_date_ka(chan, t, ints, lang);
 
3106
        } else if (!strncasecmp(lang, "nl", 2)) { /* Dutch syntax */
 
3107
                return ast_say_date_nl(chan, t, ints, lang);
 
3108
        } else if (!strncasecmp(lang, "pt", 2)) { /* Portuguese syntax */
 
3109
                return ast_say_date_pt(chan, t, ints, lang);
 
3110
        } else if (!strncasecmp(lang, "th", 2)) { /* Thai syntax */
 
3111
                return ast_say_date_th(chan, t, ints, lang);
3085
3112
        }
3086
3113
 
3087
3114
        /* Default to English */
3088
 
        return(ast_say_date_en(chan, t, ints, lang));
 
3115
        return ast_say_date_en(chan, t, ints, lang);
3089
3116
}
3090
3117
 
3091
3118
/* English syntax */
3405
3432
 
3406
3433
static int say_date_with_format(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone)
3407
3434
{
3408
 
        if (!strcasecmp(lang, "en") ) { /* English syntax */
3409
 
                return (ast_say_date_with_format_en(chan, t, ints, lang, format, tzone));
3410
 
        } else if (!strcasecmp(lang, "da") ) {  /* Danish syntax */
3411
 
                return(ast_say_date_with_format_da(chan, t, ints, lang, format, tzone));
3412
 
        } else if (!strcasecmp(lang, "de") ) {  /* German syntax */
3413
 
                return(ast_say_date_with_format_de(chan, t, ints, lang, format, tzone));
3414
 
        } else if (!strcasecmp(lang, "es") || !strcasecmp(lang, "mx")) {        /* Spanish syntax */
3415
 
                return (ast_say_date_with_format_es(chan, t, ints, lang, format, tzone));
3416
 
        } else if (!strcasecmp(lang, "he")) {   /* Hebrew syntax */
3417
 
                return (ast_say_date_with_format_he(chan, t, ints, lang, format, tzone));
3418
 
        } else if (!strcasecmp(lang, "fr")) {   /* French syntax */
3419
 
                return (ast_say_date_with_format_fr(chan, t, ints, lang, format, tzone));
3420
 
        } else if (!strcasecmp(lang, "it")) {   /* Italian syntax */
3421
 
                return (ast_say_date_with_format_it(chan, t, ints, lang, format, tzone));
3422
 
        } else if (!strcasecmp(lang, "nl")) {   /* Dutch syntax */
3423
 
                return (ast_say_date_with_format_nl(chan, t, ints, lang, format, tzone));
3424
 
        } else if (!strcasecmp(lang, "pl")) {   /* Polish syntax */
3425
 
                return (ast_say_date_with_format_pl(chan, t, ints, lang, format, tzone));
3426
 
        } else if (!strcasecmp(lang, "pt") || !strcasecmp(lang, "pt_BR")) {     /* Portuguese syntax */
3427
 
                return (ast_say_date_with_format_pt(chan, t, ints, lang, format, tzone));
3428
 
        } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) {       /* Taiwanese / Chinese syntax */
3429
 
                return (ast_say_date_with_format_tw(chan, t, ints, lang, format, tzone));
3430
 
        } else if (!strcasecmp(lang, "th") ) {  /* Thai syntax */
3431
 
                return (ast_say_date_with_format_th(chan, t, ints, lang, format, tzone));
3432
 
        } else if (!strcasecmp(lang, "gr") ) {  /* Greek syntax */
3433
 
                return (ast_say_date_with_format_gr(chan, t, ints, lang, format, tzone));
 
3435
        if (!strncasecmp(lang, "en", 2)) {      /* English syntax */
 
3436
                return ast_say_date_with_format_en(chan, t, ints, lang, format, tzone);
 
3437
        } else if (!strncasecmp(lang, "da", 2)) { /* Danish syntax */
 
3438
                return ast_say_date_with_format_da(chan, t, ints, lang, format, tzone);
 
3439
        } else if (!strncasecmp(lang, "de", 2)) { /* German syntax */
 
3440
                return ast_say_date_with_format_de(chan, t, ints, lang, format, tzone);
 
3441
        } else if (!strncasecmp(lang, "es", 2)) { /* Spanish syntax */
 
3442
                return ast_say_date_with_format_es(chan, t, ints, lang, format, tzone);
 
3443
        } else if (!strncasecmp(lang, "he", 2)) { /* Hebrew syntax */
 
3444
                return ast_say_date_with_format_he(chan, t, ints, lang, format, tzone);
 
3445
        } else if (!strncasecmp(lang, "fr", 2)) { /* French syntax */
 
3446
                return ast_say_date_with_format_fr(chan, t, ints, lang, format, tzone);
 
3447
        } else if (!strncasecmp(lang, "gr", 2)) { /* Greek syntax */
 
3448
                return ast_say_date_with_format_gr(chan, t, ints, lang, format, tzone);
 
3449
        } else if (!strncasecmp(lang, "it", 2)) { /* Italian syntax */
 
3450
                return ast_say_date_with_format_it(chan, t, ints, lang, format, tzone);
 
3451
        } else if (!strncasecmp(lang, "mx", 2)) { /* deprecated Mexican syntax */
 
3452
                static int deprecation_warning = 0;
 
3453
                if (deprecation_warning++ % 10 == 0) {
 
3454
                        ast_log(LOG_WARNING, "mx is not a standard language code.  Please switch to using es_MX instead.\n");
 
3455
                }
 
3456
                return ast_say_date_with_format_es(chan, t, ints, lang, format, tzone);
 
3457
        } else if (!strncasecmp(lang, "nl", 2)) { /* Dutch syntax */
 
3458
                return ast_say_date_with_format_nl(chan, t, ints, lang, format, tzone);
 
3459
        } else if (!strncasecmp(lang, "pl", 2)) { /* Polish syntax */
 
3460
                return ast_say_date_with_format_pl(chan, t, ints, lang, format, tzone);
 
3461
        } else if (!strncasecmp(lang, "pt", 2)) { /* Portuguese syntax */
 
3462
                return ast_say_date_with_format_pt(chan, t, ints, lang, format, tzone);
 
3463
        } else if (!strncasecmp(lang, "th", 2)) { /* Thai syntax */
 
3464
                return ast_say_date_with_format_th(chan, t, ints, lang, format, tzone);
 
3465
        } else if (!strncasecmp(lang, "tw", 2)) { /* deprecated Taiwanese syntax */
 
3466
                static int deprecation_warning = 0;
 
3467
                if (deprecation_warning++ % 10 == 0) {
 
3468
                        ast_log(LOG_WARNING, "tw is a standard language code for Twi, not Taiwanese.  Please switch to using zh_TW instead.\n");
 
3469
                }
 
3470
                return ast_say_date_with_format_zh(chan, t, ints, lang, format, tzone);
 
3471
        } else if (!strncasecmp(lang, "zh", 2)) { /* Taiwanese / Chinese syntax */
 
3472
                return ast_say_date_with_format_zh(chan, t, ints, lang, format, tzone);
3434
3473
        }
3435
3474
 
3436
3475
        /* Default to English */
3437
 
        return(ast_say_date_with_format_en(chan, t, ints, lang, format, tzone));
 
3476
        return ast_say_date_with_format_en(chan, t, ints, lang, format, tzone);
3438
3477
}
3439
3478
 
3440
3479
/* English syntax */
5743
5782
}
5744
5783
 
5745
5784
/* Taiwanese / Chinese syntax */
5746
 
int ast_say_date_with_format_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone)
 
5785
int ast_say_date_with_format_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang, const char *format, const char *tzone)
5747
5786
{
5748
5787
        struct timeval when = { t, 0 };
5749
5788
        struct ast_tm tm;
5935
5974
                                                /* Yesterday */
5936
5975
                                                res = wait_file(chan, ints, "digits/yesterday", lang);
5937
5976
                                        } else {
5938
 
                                                res = ast_say_date_with_format_tw(chan, t, ints, lang, "YBdA", tzone);
 
5977
                                                res = ast_say_date_with_format_zh(chan, t, ints, lang, "YBdA", tzone);
5939
5978
                                        }
5940
5979
                                }
5941
5980
                                break;
5960
5999
                                                res = wait_file(chan, ints, "digits/yesterday", lang);
5961
6000
                                        } else if (beg_today - 86400 * 6 < t) {
5962
6001
                                                /* Within the last week */
5963
 
                                                res = ast_say_date_with_format_tw(chan, t, ints, lang, "A", tzone);
 
6002
                                                res = ast_say_date_with_format_zh(chan, t, ints, lang, "A", tzone);
5964
6003
                                        } else {
5965
 
                                                res = ast_say_date_with_format_tw(chan, t, ints, lang, "YBdA", tzone);
 
6004
                                                res = ast_say_date_with_format_zh(chan, t, ints, lang, "YBdA", tzone);
5966
6005
                                        }
5967
6006
                                }
5968
6007
                                break;
5969
6008
                        case 'R':
5970
 
                                res = ast_say_date_with_format_tw(chan, t, ints, lang, "kM", tzone);
 
6009
                                res = ast_say_date_with_format_zh(chan, t, ints, lang, "kM", tzone);
5971
6010
                                break;
5972
6011
                        case 'S':
5973
6012
                                /* Seconds */
5990
6029
                                }
5991
6030
                                break;
5992
6031
                        case 'T':
5993
 
                                res = ast_say_date_with_format_tw(chan, t, ints, lang, "HMS", tzone);
 
6032
                                res = ast_say_date_with_format_zh(chan, t, ints, lang, "HMS", tzone);
5994
6033
                                break;
5995
6034
                        case ' ':
5996
6035
                        case '  ':
6010
6049
 
6011
6050
static int say_time(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
6012
6051
{
6013
 
        if (!strcasecmp(lang, "en") ) { /* English syntax */
6014
 
                return(ast_say_time_en(chan, t, ints, lang));
6015
 
        } else if (!strcasecmp(lang, "de") ) {  /* German syntax */
6016
 
                return(ast_say_time_de(chan, t, ints, lang));
6017
 
        } else if (!strcasecmp(lang, "fr") ) {  /* French syntax */
6018
 
                return(ast_say_time_fr(chan, t, ints, lang));
6019
 
        } else if (!strcasecmp(lang, "hu") ) {  /* Hungarian syntax */
 
6052
        if (!strncasecmp(lang, "en", 2)) {      /* English syntax */
 
6053
                return ast_say_time_en(chan, t, ints, lang);
 
6054
        } else if (!strncasecmp(lang, "de", 2)) { /* German syntax */
 
6055
                return ast_say_time_de(chan, t, ints, lang);
 
6056
        } else if (!strncasecmp(lang, "fr", 2)) { /* French syntax */
 
6057
                return ast_say_time_fr(chan, t, ints, lang);
 
6058
        } else if (!strncasecmp(lang, "ge", 2)) { /* deprecated Georgian syntax */
 
6059
                static int deprecation_warning = 0;
 
6060
                if (deprecation_warning++ % 10 == 0) {
 
6061
                        ast_log(LOG_WARNING, "ge is not a standard language code.  Please switch to using ka instead.\n");
 
6062
                }
 
6063
                return ast_say_time_ka(chan, t, ints, lang);
 
6064
        } else if (!strncasecmp(lang, "gr", 2)) { /* Greek syntax */
 
6065
                return ast_say_time_gr(chan, t, ints, lang);
 
6066
        } else if (!strncasecmp(lang, "he", 2)) { /* Hebrew syntax */
 
6067
                return ast_say_time_he(chan, t, ints, lang);
 
6068
        } else if (!strncasecmp(lang, "hu", 2)) { /* Hungarian syntax */
6020
6069
                return(ast_say_time_hu(chan, t, ints, lang));
6021
 
        } else if (!strcasecmp(lang, "nl") ) {  /* Dutch syntax */
6022
 
                return(ast_say_time_nl(chan, t, ints, lang));
6023
 
        } else if (!strcasecmp(lang, "pt") ) {  /* Portuguese syntax */
6024
 
                return(ast_say_time_pt(chan, t, ints, lang));
6025
 
        } else if (!strcasecmp(lang, "pt_BR") ) {       /* Brazilian Portuguese syntax */
6026
 
                return(ast_say_time_pt_BR(chan, t, ints, lang));
6027
 
        } else if (!strcasecmp(lang, "tw") ) {  /* Taiwanese syntax */
6028
 
        } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) {       /* Taiwanese / Chinese syntax */
6029
 
                return(ast_say_time_tw(chan, t, ints, lang));
6030
 
        } else if (!strcasecmp(lang, "gr") ) {                          /* Greek syntax */
6031
 
                return(ast_say_time_gr(chan, t, ints, lang));
6032
 
        } else if (!strcasecmp(lang, "th") ) {
 
6070
        } else if (!strncasecmp(lang, "ka", 2)) { /* Georgian syntax */
 
6071
                return ast_say_time_ka(chan, t, ints, lang);
 
6072
        } else if (!strncasecmp(lang, "nl", 2)) { /* Dutch syntax */
 
6073
                return ast_say_time_nl(chan, t, ints, lang);
 
6074
        } else if (!strncasecmp(lang, "pt_BR", 5)) { /* Brazilian Portuguese syntax */
 
6075
                return ast_say_time_pt_BR(chan, t, ints, lang);
 
6076
        } else if (!strncasecmp(lang, "pt", 2)) { /* Portuguese syntax */
 
6077
                return ast_say_time_pt(chan, t, ints, lang);
 
6078
        } else if (!strncasecmp(lang, "th", 2)) { /* Thai syntax */
6033
6079
                return(ast_say_time_th(chan, t, ints, lang));
6034
 
        } else if (!strcasecmp(lang, "ge") ) {  /* Georgian syntax */
6035
 
                return(ast_say_time_ge(chan, t, ints, lang));
6036
 
        } else if (!strcasecmp(lang, "he")) {   /* Hebrew syntax */
6037
 
                return (ast_say_time_he(chan, t, ints, lang));
 
6080
        } else if (!strncasecmp(lang, "tw", 2)) { /* deprecated Taiwanese syntax */
 
6081
                static int deprecation_warning = 0;
 
6082
                if (deprecation_warning++ % 10 == 0) {
 
6083
                        ast_log(LOG_WARNING, "tw is a standard language code for Twi, not Taiwanese.  Please switch to using zh_TW instead.\n");
 
6084
                }
 
6085
                return ast_say_time_zh(chan, t, ints, lang);
 
6086
        } else if (!strncasecmp(lang, "zh", 2)) { /* Taiwanese / Chinese syntax */
 
6087
                return ast_say_time_zh(chan, t, ints, lang);
6038
6088
        }
6039
6089
 
6040
6090
        /* Default to English */
6041
 
        return(ast_say_time_en(chan, t, ints, lang));
 
6091
        return ast_say_time_en(chan, t, ints, lang);
6042
6092
}
6043
6093
 
6044
6094
/* English syntax */
6250
6300
}
6251
6301
 
6252
6302
/* Taiwanese / Chinese  syntax */
6253
 
int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
6303
int ast_say_time_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
6254
6304
{
6255
6305
        struct timeval when = { t, 0 };
6256
6306
        struct ast_tm tm;
6328
6378
}
6329
6379
static int say_datetime(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
6330
6380
{
6331
 
        if (!strcasecmp(lang, "en") ) { /* English syntax */
6332
 
                return(ast_say_datetime_en(chan, t, ints, lang));
6333
 
        } else if (!strcasecmp(lang, "de") ) {  /* German syntax */
6334
 
                return(ast_say_datetime_de(chan, t, ints, lang));
6335
 
        } else if (!strcasecmp(lang, "fr") ) {  /* French syntax */
6336
 
                return(ast_say_datetime_fr(chan, t, ints, lang));
6337
 
        } else if (!strcasecmp(lang, "nl") ) {  /* Dutch syntax */
6338
 
                return(ast_say_datetime_nl(chan, t, ints, lang));
6339
 
        } else if (!strcasecmp(lang, "hu") ) {  /* Hungarian syntax */
6340
 
                return(ast_say_datetime_hu(chan, t, ints, lang));
6341
 
        } else if (!strcasecmp(lang, "pt") ) {  /* Portuguese syntax */
6342
 
                return(ast_say_datetime_pt(chan, t, ints, lang));
6343
 
        } else if (!strcasecmp(lang, "pt_BR") ) {       /* Brazilian Portuguese syntax */
6344
 
                return(ast_say_datetime_pt_BR(chan, t, ints, lang));
6345
 
        } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) {       /* Taiwanese / Chinese syntax */
6346
 
                return(ast_say_datetime_tw(chan, t, ints, lang));
6347
 
        } else if (!strcasecmp(lang, "gr") ) {                          /* Greek syntax */
6348
 
                return(ast_say_datetime_gr(chan, t, ints, lang));
6349
 
        } else if (!strcasecmp(lang, "th") ) {  /* Thai syntax */
6350
 
                return(ast_say_datetime_th(chan, t, ints, lang));
6351
 
        } else if (!strcasecmp(lang, "ge") ) {  /* Georgian syntax */
6352
 
                return(ast_say_datetime_ge(chan, t, ints, lang));
6353
 
        } else if (!strcasecmp(lang, "he")) {   /* Hebrew syntax */
6354
 
                return (ast_say_datetime_he(chan, t, ints, lang));
 
6381
        if (!strncasecmp(lang, "en", 2)) {        /* English syntax */
 
6382
                return ast_say_datetime_en(chan, t, ints, lang);
 
6383
        } else if (!strncasecmp(lang, "de", 2)) { /* German syntax */
 
6384
                return ast_say_datetime_de(chan, t, ints, lang);
 
6385
        } else if (!strncasecmp(lang, "fr", 2)) { /* French syntax */
 
6386
                return ast_say_datetime_fr(chan, t, ints, lang);
 
6387
        } else if (!strncasecmp(lang, "ge", 2)) { /* deprecated Georgian syntax */
 
6388
                static int deprecation_warning = 0;
 
6389
                if (deprecation_warning++ % 10 == 0) {
 
6390
                        ast_log(LOG_WARNING, "ge is not a standard language code.  Please switch to using ka instead.\n");
 
6391
                }
 
6392
                return ast_say_datetime_ka(chan, t, ints, lang);
 
6393
        } else if (!strncasecmp(lang, "gr", 2)) { /* Greek syntax */
 
6394
                return ast_say_datetime_gr(chan, t, ints, lang);
 
6395
        } else if (!strncasecmp(lang, "he", 2)) { /* Hebrew syntax */
 
6396
                return ast_say_datetime_he(chan, t, ints, lang);
 
6397
        } else if (!strncasecmp(lang, "hu", 2)) { /* Hungarian syntax */
 
6398
                return ast_say_datetime_hu(chan, t, ints, lang);
 
6399
        } else if (!strncasecmp(lang, "ka", 2)) { /* Georgian syntax */
 
6400
                return ast_say_datetime_ka(chan, t, ints, lang);
 
6401
        } else if (!strncasecmp(lang, "nl", 2)) { /* Dutch syntax */
 
6402
                return ast_say_datetime_nl(chan, t, ints, lang);
 
6403
        } else if (!strncasecmp(lang, "pt_BR", 5)) { /* Brazilian Portuguese syntax */
 
6404
                return ast_say_datetime_pt_BR(chan, t, ints, lang);
 
6405
        } else if (!strncasecmp(lang, "pt", 2)) { /* Portuguese syntax */
 
6406
                return ast_say_datetime_pt(chan, t, ints, lang);
 
6407
        } else if (!strncasecmp(lang, "th", 2)) { /* Thai syntax */
 
6408
                return ast_say_datetime_th(chan, t, ints, lang);
 
6409
        } else if (!strncasecmp(lang, "tw", 2)) { /* deprecated Taiwanese syntax */
 
6410
                static int deprecation_warning = 0;
 
6411
                if (deprecation_warning++ % 10 == 0) {
 
6412
                        ast_log(LOG_WARNING, "tw is a standard language code for Twi, not Taiwanese.  Please switch to using zh_TW instead.\n");
 
6413
                }
 
6414
                return ast_say_datetime_zh(chan, t, ints, lang);
 
6415
        } else if (!strncasecmp(lang, "zh", 2)) { /* Taiwanese / Chinese syntax */
 
6416
                return ast_say_datetime_zh(chan, t, ints, lang);
6355
6417
        }
6356
6418
 
6357
6419
        /* Default to English */
6358
 
        return(ast_say_datetime_en(chan, t, ints, lang));
 
6420
        return ast_say_datetime_en(chan, t, ints, lang);
6359
6421
}
6360
6422
 
6361
6423
/* English syntax */
6639
6701
}
6640
6702
 
6641
6703
/* Taiwanese / Chinese syntax */
6642
 
int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
6704
int ast_say_datetime_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
6643
6705
{
6644
6706
        struct timeval when = { t, 0 };
6645
6707
        struct ast_tm tm;
6765
6827
}
6766
6828
static int say_datetime_from_now(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
6767
6829
{
6768
 
        if (!strcasecmp(lang, "en") ) { /* English syntax */
6769
 
                return(ast_say_datetime_from_now_en(chan, t, ints, lang));
6770
 
        } else if (!strcasecmp(lang, "fr") ) {  /* French syntax */
6771
 
                return(ast_say_datetime_from_now_fr(chan, t, ints, lang));
6772
 
        } else if (!strcasecmp(lang, "pt") || !strcasecmp(lang, "pt_BR")) {     /* Portuguese syntax */
6773
 
                return(ast_say_datetime_from_now_pt(chan, t, ints, lang));
6774
 
        } else if (!strcasecmp(lang, "ge") ) {  /* Georgian syntax */
6775
 
                return(ast_say_datetime_from_now_ge(chan, t, ints, lang));
6776
 
        } else if (!strcasecmp(lang, "he")) {   /* Georgian syntax */
6777
 
                return (ast_say_datetime_from_now_he(chan, t, ints, lang));
 
6830
        if (!strncasecmp(lang, "en", 2)) {        /* English syntax */
 
6831
                return ast_say_datetime_from_now_en(chan, t, ints, lang);
 
6832
        } else if (!strncasecmp(lang, "fr", 2)) { /* French syntax */
 
6833
                return ast_say_datetime_from_now_fr(chan, t, ints, lang);
 
6834
        } else if (!strncasecmp(lang, "ge", 2)) { /* deprecated Georgian syntax */
 
6835
                static int deprecation_warning = 0;
 
6836
                if (deprecation_warning++ % 10 == 0) {
 
6837
                        ast_log(LOG_WARNING, "ge is not a standard language code.  Please switch to using ka instead.\n");
 
6838
                }
 
6839
                return ast_say_datetime_from_now_ka(chan, t, ints, lang);
 
6840
        } else if (!strncasecmp(lang, "he", 2)) { /* Hebrew syntax */
 
6841
                return ast_say_datetime_from_now_he(chan, t, ints, lang);
 
6842
        } else if (!strncasecmp(lang, "ka", 2)) { /* Georgian syntax */
 
6843
                return ast_say_datetime_from_now_ka(chan, t, ints, lang);
 
6844
        } else if (!strncasecmp(lang, "pt", 2)) { /* Portuguese syntax */
 
6845
                return ast_say_datetime_from_now_pt(chan, t, ints, lang);
6778
6846
        }
6779
6847
 
6780
6848
        /* Default to English */
6781
 
        return(ast_say_datetime_from_now_en(chan, t, ints, lang));
 
6849
        return ast_say_datetime_from_now_en(chan, t, ints, lang);
6782
6850
}
6783
6851
 
6784
6852
/* English syntax */
7400
7468
        To be able to play the sounds, each of the above tokens needs
7401
7469
        a corresponding sound file. (e.g. 200_.gsm).
7402
7470
*/
7403
 
static char* ast_translate_number_ge(int num, char* res, int res_len)
 
7471
static char* ast_translate_number_ka(int num, char* res, int res_len)
7404
7472
{
7405
7473
        char buf[256];
7406
7474
        int digit = 0;
7427
7495
 
7428
7496
        if (num < 40) {  /* ocda... */
7429
7497
                strncat(res, "20_ ", res_len - strlen(res) - 1);
7430
 
                return ast_translate_number_ge(num - 20, res, res_len);
 
7498
                return ast_translate_number_ka(num - 20, res, res_len);
7431
7499
        }
7432
7500
 
7433
7501
        if (num < 60) {  /* ormocda... */
7434
7502
                strncat(res, "40_ ", res_len - strlen(res) - 1);
7435
 
                return ast_translate_number_ge(num - 40, res, res_len);
 
7503
                return ast_translate_number_ka(num - 40, res, res_len);
7436
7504
        }
7437
7505
 
7438
7506
        if (num < 80) {  /* samocda... */
7439
7507
                strncat(res, "60_ ", res_len - strlen(res) - 1);
7440
 
                return ast_translate_number_ge(num - 60, res, res_len);
 
7508
                return ast_translate_number_ka(num - 60, res, res_len);
7441
7509
        }
7442
7510
 
7443
7511
        if (num < 100) {  /* otxmocda... */
7444
7512
                strncat(res, "80_ ", res_len - strlen(res) - 1);
7445
 
                return ast_translate_number_ge(num - 80, res, res_len);
 
7513
                return ast_translate_number_ka(num - 80, res, res_len);
7446
7514
        }
7447
7515
 
7448
7516
 
7457
7525
                } else {
7458
7526
                        snprintf(buf, sizeof(buf), "%d_ ", digit*100);
7459
7527
                        strncat(res, buf, res_len - strlen(res) - 1);
7460
 
                        return ast_translate_number_ge(remaining, res, res_len);
 
7528
                        return ast_translate_number_ka(remaining, res, res_len);
7461
7529
                }
7462
7530
        }
7463
7531
 
7473
7541
                digit = (num - remaining) / 1000;
7474
7542
 
7475
7543
                if (remaining == 0) {
7476
 
                        ast_translate_number_ge(digit, res, res_len);
 
7544
                        ast_translate_number_ka(digit, res, res_len);
7477
7545
                        strncat(res, " 1000", res_len - strlen(res) - 1);
7478
7546
                        return res;
7479
7547
                }
7480
7548
 
7481
7549
                if (digit == 1) {
7482
7550
                        strncat(res, "1000_ ", res_len - strlen(res) - 1);
7483
 
                        return ast_translate_number_ge(remaining, res, res_len);
 
7551
                        return ast_translate_number_ka(remaining, res, res_len);
7484
7552
                }
7485
7553
 
7486
 
                ast_translate_number_ge(digit, res, res_len);
 
7554
                ast_translate_number_ka(digit, res, res_len);
7487
7555
                strncat(res, " 1000_ ", res_len - strlen(res) - 1);
7488
 
                return ast_translate_number_ge(remaining, res, res_len);
7489
 
 
 
7556
                return ast_translate_number_ka(remaining, res, res_len);
7490
7557
        }
7491
7558
 
7492
7559
 
7501
7568
                digit = (num - remaining) / 1000000;
7502
7569
 
7503
7570
                if (remaining == 0) {
7504
 
                        ast_translate_number_ge(digit, res, res_len);
 
7571
                        ast_translate_number_ka(digit, res, res_len);
7505
7572
                        strncat(res, " 1000000", res_len - strlen(res) - 1);
7506
7573
                        return res;
7507
7574
                }
7508
7575
 
7509
 
                ast_translate_number_ge(digit, res, res_len);
 
7576
                ast_translate_number_ka(digit, res, res_len);
7510
7577
                strncat(res, " 1000000_ ", res_len - strlen(res) - 1);
7511
 
                return ast_translate_number_ge(remaining, res, res_len);
7512
 
 
 
7578
                return ast_translate_number_ka(remaining, res, res_len);
7513
7579
        }
7514
7580
 
7515
7581
 
7524
7590
                digit = (num - remaining) / 1000000000;
7525
7591
 
7526
7592
                if (remaining == 0) {
7527
 
                        ast_translate_number_ge(digit, res, res_len);
 
7593
                        ast_translate_number_ka(digit, res, res_len);
7528
7594
                        strncat(res, " 1000000000", res_len - strlen(res) - 1);
7529
7595
                        return res;
7530
7596
                }
7531
7597
 
7532
 
                ast_translate_number_ge(digit, res, res_len);
 
7598
                ast_translate_number_ka(digit, res, res_len);
7533
7599
                strncat(res, " 1000000000_ ", res_len - strlen(res) - 1);
7534
 
                return ast_translate_number_ge(remaining, res, res_len);
7535
 
 
 
7600
                return ast_translate_number_ka(remaining, res, res_len);
7536
7601
        }
7537
7602
 
7538
7603
        return res;
7541
7606
 
7542
7607
 
7543
7608
 
7544
 
/*! \brief  ast_say_number_full_ge: Georgian syntax */
7545
 
static int ast_say_number_full_ge(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
 
7609
/*! \brief  ast_say_number_full_ka: Georgian syntax */
 
7610
static int ast_say_number_full_ka(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
7546
7611
{
7547
7612
        int res = 0;
7548
7613
        char fn[512] = "";
7553
7618
                return ast_say_digits_full(chan, 0, ints, language, audiofd, ctrlfd);
7554
7619
 
7555
7620
 
7556
 
        ast_translate_number_ge(num, fn, 512);
 
7621
        ast_translate_number_ka(num, fn, 512);
7557
7622
 
7558
7623
 
7559
7624
 
7619
7684
 
7620
7685
 
7621
7686
/* Georgian syntax. e.g. "oriatas xuti tslis 5 noemberi". */
7622
 
static int ast_say_date_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
7687
static int ast_say_date_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
7623
7688
{
7624
7689
        struct timeval when = { t, 0 };
7625
7690
        struct ast_tm tm;
7659
7724
 
7660
7725
 
7661
7726
/* Georgian syntax. e.g. "otxi saati da eqvsi tsuti" */
7662
 
static int ast_say_time_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
7727
static int ast_say_time_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
7663
7728
{
7664
7729
        struct timeval when = { t, 0 };
7665
7730
        struct ast_tm tm;
7691
7756
 
7692
7757
 
7693
7758
/* Georgian syntax. Say date, then say time. */
7694
 
static int ast_say_datetime_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
7759
static int ast_say_datetime_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
7695
7760
{
7696
7761
        struct timeval when = { t, 0 };
7697
7762
        struct ast_tm tm;
7709
7774
 
7710
7775
 
7711
7776
/* Georgian syntax */
7712
 
static int ast_say_datetime_from_now_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
 
7777
static int ast_say_datetime_from_now_ka(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
7713
7778
{
7714
7779
        int res=0;
7715
7780
        int daydiff;
7787
7852
        if (num == 1) {                 /* singular */
7788
7853
            return "";
7789
7854
        }
7790
 
        if (num > 0 && num < 5) {       /* 2--5 get genative singular */
 
7855
        if (num > 0 && num < 5) {       /* 2--4 get genative singular */
7791
7856
            return "x1";
7792
7857
        } else {                        /* 5--19 get genative plural */
7793
7858
            return "x2";
7799
7864
        char *temp;
7800
7865
        int temp_len;
7801
7866
        const char *ending;
7802
 
        if (!strcasecmp(chan->language, "ru")) {                /* Russian */
7803
 
                ending = counted_noun_ending_slavic(num);
7804
 
        } else if(!strcasecmp(chan->language, "ua")) {          /* Ukrainian */
7805
 
                ending = counted_noun_ending_slavic(num);
7806
 
        } else if(!strcasecmp(chan->language, "ua")) {          /* Polish */
7807
 
                ending = counted_noun_ending_slavic(num);
7808
 
        } else {                                                /* English and default */
 
7867
        if (!strncasecmp(chan->language, "ru", 2)) {        /* Russian */
 
7868
                ending = counted_noun_ending_slavic(num);
 
7869
        } else if (!strncasecmp(chan->language, "ua", 2)) { /* Ukrainian */
 
7870
                ending = counted_noun_ending_slavic(num);
 
7871
        } else if (!strncasecmp(chan->language, "pl", 2)) { /* Polish */
 
7872
                ending = counted_noun_ending_slavic(num);
 
7873
        } else {                                            /* English and default */
7809
7874
                ending = counted_noun_ending_en(num);
7810
7875
        }
7811
7876
        temp = alloca((temp_len = (strlen(noun) + strlen(ending) + 1)));
7822
7887
 */
7823
7888
static const char *counted_adjective_ending_ru(int num, const char gender[])
7824
7889
{
7825
 
        if (num < 0) {
 
7890
        if (num < 0) {
7826
7891
            num *= -1;
7827
7892
        }
7828
7893
        num %= 100;             /* never pay attention to more than two digits */
7841
7906
        char *temp;
7842
7907
        int temp_len;
7843
7908
        const char *ending;
7844
 
        if (!strcasecmp(chan->language, "ru")) {                        /* Russian */
7845
 
                ending = counted_adjective_ending_ru(num, gender);
7846
 
        } else if (!strcasecmp(chan->language, "ua")) {                 /* Ukrainian */
7847
 
                ending = counted_adjective_ending_ru(num, gender);
7848
 
        } else if (!strcasecmp(chan->language, "pl")) {                 /* Polish */
7849
 
                ending = counted_adjective_ending_ru(num, gender);
7850
 
        } else {                                                        /* English and default */
 
7909
        if (!strncasecmp(chan->language, "ru", 2)) {           /* Russian */
 
7910
                ending = counted_adjective_ending_ru(num, gender);
 
7911
        } else if (!strncasecmp(chan->language, "ua", 2)) {    /* Ukrainian */
 
7912
                ending = counted_adjective_ending_ru(num, gender);
 
7913
        } else if (!strncasecmp(chan->language, "pl", 2)) {    /* Polish */
 
7914
                ending = counted_adjective_ending_ru(num, gender);
 
7915
        } else {                                               /* English and default */
7851
7916
                ending = "";
7852
7917
        }
7853
7918
        temp = alloca((temp_len = (strlen(adjective) + strlen(ending) + 1)));