Index: apps/app_voicemail.c =================================================================== --- apps/app_voicemail.c (revision 201531) +++ apps/app_voicemail.c (working copy) @@ -6806,7 +6806,7 @@ res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' q H 'digits/kai' M ", NULL); else if (!strcasecmp(chan->language,"pt_BR")) res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' Ad 'digits/pt-de' B 'digits/pt-de' Y 'digits/pt-as' HM ", NULL); - else if (!strcasecmp(chan->language,"tw")) /* CHINESE (Taiwan) syntax */ + else if (!strncasecmp(chan->language, "zh", 2)) /* CHINESE (Taiwan) syntax */ res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "qR 'vm-received'", NULL); else { res = ast_say_date_with_format(chan, t, AST_DIGIT_ANY, chan->language, "'vm-received' q 'digits/at' IMp", NULL); @@ -8163,7 +8163,7 @@ } /* CHINESE (Taiwan) syntax */ -static int vm_intro_tw(struct ast_channel *chan, struct vm_state *vms) +static int vm_intro_zh(struct ast_channel *chan, struct vm_state *vms) { int res; /* Introduce messages they have */ @@ -8242,8 +8242,8 @@ return vm_intro_no(chan, vms); } else if (!strcasecmp(chan->language, "ru")) { /* RUSSIAN syntax */ return vm_intro_multilang(chan, vms, "n"); - } else if (!strcasecmp(chan->language, "tw")) { /* CHINESE (Taiwan) syntax */ - return vm_intro_tw(chan, vms); + } else if (!strncasecmp(chan->language, "zh", 2)) { /* CHINESE (Taiwan) syntax */ + return vm_intro_zh(chan, vms); } else if (!strcasecmp(chan->language, "ua")) { /* UKRAINIAN syntax */ return vm_intro_multilang(chan, vms, "n"); } else if (!strcasecmp(chan->language, "he")) { /* HEBREW syntax */ @@ -8333,7 +8333,7 @@ return res; } -static int vm_instructions_tw(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int skipadvanced, int in_urgent) +static int vm_instructions_zh(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int skipadvanced, int in_urgent) { int res = 0; /* Play instructions and wait for new command */ @@ -8359,8 +8359,8 @@ static int vm_instructions(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int skipadvanced, int in_urgent) { - if (vms->starting && !strcasecmp(chan->language, "tw")) { /* CHINESE (Taiwan) syntax */ - return vm_instructions_tw(chan, vmu, vms, skipadvanced, in_urgent); + if (vms->starting && !strncasecmp(chan->language, "zh", 2)) { /* CHINESE (Taiwan) syntax */ + return vm_instructions_zh(chan, vmu, vms, skipadvanced, in_urgent); } else { /* Default to ENGLISH */ return vm_instructions_en(chan, vmu, vms, skipadvanced, in_urgent); } @@ -8814,7 +8814,7 @@ * * \return zero on success, -1 on error. */ -static int vm_browse_messages_tw(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu) +static int vm_browse_messages_zh(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu) { int cmd=0; @@ -8855,8 +8855,8 @@ return vm_browse_messages_pt(chan, vms, vmu); } else if (!strcasecmp(chan->language, "gr")){ return vm_browse_messages_gr(chan, vms, vmu); /* GREEK */ - } else if (!strcasecmp(chan->language, "tw")){ - return vm_browse_messages_tw(chan, vms, vmu); /* CHINESE (Taiwan) */ + } else if (!strncasecmp(chan->language, "zh", 2)){ + return vm_browse_messages_zh(chan, vms, vmu); /* CHINESE (Taiwan) */ } else if (!strcasecmp(chan->language, "he")) { return vm_browse_messages_he(chan, vms, vmu); /* HEBREW */ } else { /* Default to English syntax */ Index: UPGRADE.txt =================================================================== --- UPGRADE.txt (revision 201530) +++ UPGRADE.txt (working copy) @@ -25,10 +25,17 @@ If you are not using autoload=yes in modules.conf you will need to ensure it is set to load. If not, then any module which uses RTP (such as chan_sip) will not be able to send or receive calls. + * The app_dahdiscan.c file has been removed, but the dialplan app DAHDIScan still remains. It now exists within app_chanspy.c and retains the exact same functionality as before. +* Support for Taiwanese was incorrectly supported with the "tw" language code. + In reality, the "tw" language code is reserved for the Twi language, native + to Ghana. If you were previously using the "tw" language code, you should + switch to using either "zh" (for Mandarin Chinese) or "zh_TW" for Taiwan + specific localizations. + From 1.6.1 to 1.6.2: * The res_indications module has been removed. Its functionality was important @@ -36,6 +43,12 @@ Two applications previously provided by res_indications, PlayTones and StopPlayTones, have been moved into a new module, app_playtones. +* Support for Taiwanese was incorrectly supported with the "tw" language code. + In reality, the "tw" language code is reserved for the Twi language, native + to Ghana. If you were previously using the "tw" language code, you should + switch to using either "zh" (for Mandarin Chinese) or "zh_TW" for Taiwan + specific localizations. + From 1.6.0.1 to 1.6.1: * The ast_agi_register_multiple() and ast_agi_unregister_multiple() @@ -50,6 +63,12 @@ should be reviewed to ensure it can properly react to failure of registration or unregistration of its API commands. +* Support for Taiwanese was incorrectly supported with the "tw" language code. + In reality, the "tw" language code is reserved for the Twi language, native + to Ghana. If you were previously using the "tw" language code, you should + switch to using either "zh" (for Mandarin Chinese) or "zh_TW" for Taiwan + specific localizations. + * The ast_agi_fdprintf() API call has been renamed to ast_agi_send() to better match what it really does, and the argument order has been changed to be consistent with other API calls that perform similar @@ -93,6 +112,12 @@ * The "Join" event from app_queue now uses the CallerIDNum header instead of the CallerID header to indicate the CallerID number. +* Support for Taiwanese was incorrectly supported with the "tw" language code. + In reality, the "tw" language code is reserved for the Twi language, native + to Ghana. If you were previously using the "tw" language code, you should + switch to using either "zh" (for Mandarin Chinese) or "zh_TW" for Taiwan + specific localizations. + From 1.6.1 to 1.6.2: * The default console now will use colors according to the default background @@ -125,3 +150,10 @@ func_sprintf, and is no longer included in func_strings. If you use this function and do not use 'autoload=yes' in modules.conf, you will need to explicitly load func_sprintf for it to be available. + +* Support for Taiwanese was incorrectly supported with the "tw" language code. + In reality, the "tw" language code is reserved for the Twi language, native + to Ghana. If you were previously using the "tw" language code, you should + switch to using either "zh" (for Mandarin Chinese) or "zh_TW" for Taiwan + specific localizations. + Index: main/say.c =================================================================== --- main/say.c (revision 201530) +++ main/say.c (working copy) @@ -343,7 +343,7 @@ 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); 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); 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); -static int ast_say_number_full_tw(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd); +static int ast_say_number_full_zh(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd); static int ast_say_number_full_gr(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd); 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); 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); @@ -380,7 +380,7 @@ 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); 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); 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); -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); +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); 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); 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); @@ -390,7 +390,7 @@ static int ast_say_time_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_pt_BR(struct ast_channel *chan, time_t t, const char *ints, const char *lang); -static int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_time_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_time_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang); @@ -403,7 +403,7 @@ static int ast_say_datetime_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_pt_BR(struct ast_channel *chan, time_t t, const char *ints, const char *lang); -static int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang); +static int ast_say_datetime_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_gr(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_ge(struct ast_channel *chan, time_t t, const char *ints, const char *lang); static int ast_say_datetime_hu(struct ast_channel *chan, time_t t, const char *ints, const char *lang); @@ -460,8 +460,8 @@ return(ast_say_number_full_pt(chan, num, ints, language, options, audiofd, ctrlfd)); } else if (!strcasecmp(language, "se") ) { /* Swedish syntax */ return(ast_say_number_full_se(chan, num, ints, language, options, audiofd, ctrlfd)); - } else if (!strcasecmp(language, "tw") || !strcasecmp(language, "zh") ) { /* Taiwanese / Chinese syntax */ - return(ast_say_number_full_tw(chan, num, ints, language, audiofd, ctrlfd)); + } else if (!strncasecmp(language, "zh", 2) ) { /* Taiwanese / Chinese syntax */ + return(ast_say_number_full_zh(chan, num, ints, language, audiofd, ctrlfd)); } else if (!strcasecmp(language, "gr") ) { /* Greek syntax */ return(ast_say_number_full_gr(chan, num, ints, language, audiofd, ctrlfd)); } else if (!strcasecmp(language, "ru") ) { /* Russian syntax */ @@ -2242,8 +2242,8 @@ return res; } -/*! \brief ast_say_number_full_tw: Taiwanese / Chinese syntax */ -static int ast_say_number_full_tw(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd) +/*! \brief ast_say_number_full_zh: Taiwanese / Chinese syntax */ +static int ast_say_number_full_zh(struct ast_channel *chan, int num, const char *ints, const char *language, int audiofd, int ctrlfd) { int res = 0; int playh = 0; @@ -2318,7 +2318,7 @@ last_length = strlen(buf); num -= ((num / 1000) * 1000); } else if (num < 100000000) { /* 100,000,000 */ - res = ast_say_number_full_tw(chan, num / 10000, ints, language, audiofd, ctrlfd); + res = ast_say_number_full_zh(chan, num / 10000, ints, language, audiofd, ctrlfd); if (res) return res; snprintf(buf, 10, "%d", num); @@ -2328,7 +2328,7 @@ snprintf(fn, sizeof(fn), "digits/wan"); } else { if (num < 1000000000) { /* 1,000,000,000 */ - res = ast_say_number_full_tw(chan, num / 100000000, ints, language, audiofd, ctrlfd); + res = ast_say_number_full_zh(chan, num / 100000000, ints, language, audiofd, ctrlfd); if (res) return res; snprintf(buf, 10, "%d", num); @@ -3489,8 +3489,8 @@ return (ast_say_date_with_format_pl(chan, t, ints, lang, format, tzone)); } else if (!strcasecmp(lang, "pt") || !strcasecmp(lang, "pt_BR")) { /* Portuguese syntax */ return (ast_say_date_with_format_pt(chan, t, ints, lang, format, tzone)); - } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) { /* Taiwanese / Chinese syntax */ - return (ast_say_date_with_format_tw(chan, t, ints, lang, format, tzone)); + } else if (!strncasecmp(lang, "zh", 2) ) { /* Taiwanese / Chinese syntax */ + return (ast_say_date_with_format_zh(chan, t, ints, lang, format, tzone)); } else if (!strcasecmp(lang, "th") ) { /* Thai syntax */ return (ast_say_date_with_format_th(chan, t, ints, lang, format, tzone)); } else if (!strcasecmp(lang, "gr") ) { /* Greek syntax */ @@ -5807,7 +5807,7 @@ } /* Taiwanese / Chinese syntax */ -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) +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) { struct timeval when = { t, 0 }; struct ast_tm tm; @@ -5999,7 +5999,7 @@ /* Yesterday */ res = wait_file(chan, ints, "digits/yesterday", lang); } else { - res = ast_say_date_with_format_tw(chan, t, ints, lang, "YBdA", tzone); + res = ast_say_date_with_format_zh(chan, t, ints, lang, "YBdA", tzone); } } break; @@ -6024,14 +6024,14 @@ res = wait_file(chan, ints, "digits/yesterday", lang); } else if (beg_today - 86400 * 6 < t) { /* Within the last week */ - res = ast_say_date_with_format_tw(chan, t, ints, lang, "A", tzone); + res = ast_say_date_with_format_zh(chan, t, ints, lang, "A", tzone); } else { - res = ast_say_date_with_format_tw(chan, t, ints, lang, "YBdA", tzone); + res = ast_say_date_with_format_zh(chan, t, ints, lang, "YBdA", tzone); } } break; case 'R': - res = ast_say_date_with_format_tw(chan, t, ints, lang, "kM", tzone); + res = ast_say_date_with_format_zh(chan, t, ints, lang, "kM", tzone); break; case 'S': /* Seconds */ @@ -6054,7 +6054,7 @@ } break; case 'T': - res = ast_say_date_with_format_tw(chan, t, ints, lang, "HMS", tzone); + res = ast_say_date_with_format_zh(chan, t, ints, lang, "HMS", tzone); break; case ' ': case ' ': @@ -6088,9 +6088,8 @@ return(ast_say_time_pt(chan, t, ints, lang)); } else if (!strcasecmp(lang, "pt_BR") ) { /* Brazilian Portuguese syntax */ return(ast_say_time_pt_BR(chan, t, ints, lang)); - } else if (!strcasecmp(lang, "tw") ) { /* Taiwanese syntax */ - } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) { /* Taiwanese / Chinese syntax */ - return(ast_say_time_tw(chan, t, ints, lang)); + } else if (!strncasecmp(lang, "zh", 2) ) { /* Taiwanese / Chinese syntax */ + return(ast_say_time_zh(chan, t, ints, lang)); } else if (!strcasecmp(lang, "gr") ) { /* Greek syntax */ return(ast_say_time_gr(chan, t, ints, lang)); } else if (!strcasecmp(lang, "th") ) { @@ -6314,7 +6313,7 @@ } /* Taiwanese / Chinese syntax */ -int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +int ast_say_time_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang) { struct timeval when = { t, 0 }; struct ast_tm tm; @@ -6406,8 +6405,8 @@ return(ast_say_datetime_pt(chan, t, ints, lang)); } else if (!strcasecmp(lang, "pt_BR") ) { /* Brazilian Portuguese syntax */ return(ast_say_datetime_pt_BR(chan, t, ints, lang)); - } else if (!strcasecmp(lang, "tw") || !strcasecmp(lang, "zh") ) { /* Taiwanese / Chinese syntax */ - return(ast_say_datetime_tw(chan, t, ints, lang)); + } else if (!strncasecmp(lang, "zh", 2) ) { /* Taiwanese / Chinese syntax */ + return(ast_say_datetime_zh(chan, t, ints, lang)); } else if (!strcasecmp(lang, "gr") ) { /* Greek syntax */ return(ast_say_datetime_gr(chan, t, ints, lang)); } else if (!strcasecmp(lang, "th") ) { /* Thai syntax */ @@ -6703,7 +6702,7 @@ } /* Taiwanese / Chinese syntax */ -int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang) +int ast_say_datetime_zh(struct ast_channel *chan, time_t t, const char *ints, const char *lang) { struct timeval when = { t, 0 }; struct ast_tm tm;