[asterisk-bugs] [JIRA] (ASTERISK-17088) [fr] Female gender missing for digit "one" in holdtime announcement

Joshua Colp (JIRA) noreply at issues.asterisk.org
Tue Dec 19 08:00:08 CST 2017


     [ https://issues.asterisk.org/jira/browse/ASTERISK-17088?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Joshua Colp updated ASTERISK-17088:
-----------------------------------

    Affects Version/s: 13.18.4

> [fr] Female gender missing for digit "one" in holdtime announcement
> -------------------------------------------------------------------
>
>                 Key: ASTERISK-17088
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-17088
>             Project: Asterisk
>          Issue Type: Bug
>          Components: Applications/app_queue
>    Affects Versions: 13.18.4
>            Reporter: Fossard Florent
>            Assignee: Clod Patry
>            Severity: Minor
>         Attachments: J17088.diff
>
>
> There's a problem with the the holdtime announcement in queues, gender is not changed for languages that need it.
> For example, in French, when the average holdtime is 1 minute, we hear "un minute" (file digits/1) instead of "une minute" (file digits/1F)
> Here is the code that reads the holdtime. Note that there's already commented on the need to manage the gender, but only for position announcement:
> apps/app_queue.c line 2432
> static int say_position(struct queue_ent *qe, int ringing)
> {
> ...
> res = ast_say_number(qe->chan, qe->pos, AST_DIGIT_ANY, qe->chan->language, NULL); /* Needs gender */
> ...
>         ast_verb(3, "Hold time for %s is %d minute(s) %d seconds\n", qe->parent->name, avgholdmins, avgholdsecs);
>         /* If the hold time is >1 min, if it's enabled, and if it's not
>            supposed to be only once and we have already said it, say it */
>     if ((avgholdmins+avgholdsecs) > 0 && qe->parent->announceholdtime &&
>         ((qe->parent->announceholdtime == ANNOUNCEHOLDTIME_ONCE && !qe->last_pos) ||
>         !(qe->parent->announceholdtime == ANNOUNCEHOLDTIME_ONCE))) {
>                 res = play_file(qe->chan, qe->parent->sound_holdtime);
>                 if (res)
>                         goto playout;
>                 if (avgholdmins >= 1) {
>                         res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, NULL); /* ========= HERE ========= */
>                         if (res)
>                                 goto playout;
>                         if (avgholdmins == 1) {
>                                 res = play_file(qe->chan, qe->parent->sound_minute);
>                                 if (res)
>                                         goto playout;
>                         } else {
>                                 res = play_file(qe->chan, qe->parent->sound_minutes);
>                                 if (res)
>                                         goto playout;
>                         }
>                 }
> I tried to add "f" to play female song, but that does not work.
> res = ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, "f");
> Yet in the say.c, it's used like that.:
> main/say.c line 6402
> int ast_say_time_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
> {
>         struct timeval when = { t, 0 };
>         struct ast_tm tm;
>         int res = 0;
>         ast_localtime(&when, &tm, NULL);
>         res = ast_say_number(chan, tm.tm_hour, ints, lang, "f"); /* ========= HERE ========= */
>         if (!res)
>                 res = ast_streamfile(chan, "digits/oclock", lang);
>         if (tm.tm_min) {
>                 if (!res)
>                 res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
>         }
>         return res;
> }
> ast_say_number_full_fr function implements the "f" option:
> main/say.c line 1132
> /*! \brief  ast_say_number_full_fr: French syntax
>         Extra sounds needed:
>         1F: feminin 'une'
>         et: 'and' */
> static int ast_say_number_full_fr(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd)
> {
>         int res = 0;
>         int playh = 0;
>         int playa = 0;
>         int mf = 1;                            /* +1 = male; -1 = female */
>         char fn[256] = "";
>         if (!num)
>                 return ast_say_digits_full(chan, 0, ints, language, audiofd, ctrlfd);
>         if (options && !strncasecmp(options, "f", 1))
>                 mf = -1;
>         while (!res && (num || playh || playa)) {
>                 if (num < 0) {
>                         ast_copy_string(fn, "digits/minus", sizeof(fn));
>                         if ( num > INT_MIN ) {
>                                 num = -num;
>                         } else {
>                                 num = 0;
>                         }
>                 } else if (playh) {
>                         ast_copy_string(fn, "digits/hundred", sizeof(fn));
>                         playh = 0;
>                 } else if (playa) {
>                         ast_copy_string(fn, "digits/et", sizeof(fn));
>                         playa = 0;
>                 } else if (num == 1) {
>                         if (mf < 0)
>                                 snprintf(fn, sizeof(fn), "digits/%dF", num);
>                         else
>                                 snprintf(fn, sizeof(fn), "digits/%d", num);
>                         num = 0;
> Do you know how to pass the "f" to the ast_say_number function? Is it a bug ?
> ****** ADDITIONAL INFORMATION ******
> -- Stopped music on hold on IAX2/zoiper-241
> -- Hold time for test is 1 minute(s) 0 seconds
> -- <IAX2/zoiper-241> Playing 'queue-holdtime.alaw' (language 'fr')
> -- <IAX2/zoiper-241> Playing 'digits/1.alaw' (language 'fr')    /* ========= not "digits/1F" ========= */
> -- <IAX2/zoiper-241> Playing 'queue-minute.alaw' (language 'fr')
> -- Told IAX2/zoiper-241 in test their queue position (which was 1)
> -- <IAX2/zoiper-241> Playing 'queue-thankyou.alaw' (language 'fr')
> -- Started music on hold, class 'default', on IAX2/zoiper-241
> queues.conf
> [general]
> persistentmembers = yes
> [test]
> announce-frequency = 30
> announce-holdtime = yes
> announce-position = no
> joinempty = yes
> member => SIP/user
> extensions.conf
> [general]
> language=fr
> [globals]
> [interne]
> exten => 1,1,Set(CHANNEL(language)=fr)
> same =>    n,queue(test)
> same =>    n,hangup()



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list