Захотелось мне чтобы суммы, даты и прочее на рідній мові проговаривались правильно, а то корявое звучание в контакт центрах меня просто убивает. Навести порядок в проговаривании нам поможет новая реализация работы говорилки(правка say.conf).
Для начала определимся с падежами
ССЫЛКА
Собственно то что нам нужно
uk Ukrainian nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
Для применения новых правил достаточно подправить say.conf и единожды сделать
say load new
Увидим сообщение что у нас все получилось. ну и теперь наша говорилка работает именно так как мы это зададим в самом файле say.conf
Синтаксис файла достаточно прост:
в секции [general] mode=new new -проговариваем на основании этого файла old - используя функции playback заложенные разработчиками.
!!!Для применения изменений в say.conf нужно перезагружать ПЛЕЙБЕК!!!
module reload app_playback.so
Формат говорилки таков: prefix:[format:]data
data, как правило, строка, заданная (либо числом, ASCII строка или дата/время в формате, указанном ниже), data доступна в правой части правила, как переменная ${SAY}.
format дополнительный аргумент и обычно используется только для даты и времени.
prefix используется для выбора стандарта произношения
Префиксы по умолчанию
num для чисел
enum для перечисления
date для даты
time для времени
datetime для даты и времени
char для строки символов
phonetic для фонетических строк
digit для числовых строк
Также можно создавать свои префиксы, что будет показано далее
ВАЖНО!! X Z N спец символ который нужно экранировать! [X] [N] [Z]
Правила обработки:
Если поле format пустое, или формат отсутствует, вся строка сравнивается с шаблоном в левой части
При первом совпадении, компоненты разделенные запятой из правой части произносятся по шаблону:
+ Компоненты с : повторно обрабатываются согласно правил
+ Компоненты без ‘:’ воспроизводятся как обычные файлы
Если поле format не пустое ,format разделяет фразу на части (отдельные символы, или имена файлов в одинарных кавычках), и потом файлы воспроизводятся, в то время как отдельные символы используются для генерации новых строк format:pat:data для обработки.
Даты/и Время подразумеваем что дата доступна в следующем формате YYYMMDDHHmm.ss-dow-doy
4 -год
2 – месяц,
2 – день,
2 – час
2 – минуты,
2 – секунды,
1 – день недели (dow)day-of-week,
3 – день года(doy) day-of-year.
Пример:
datetime::200604172030.00-4-102
datetime::. => date:AdBY ‘digits/at’ IMp:${SAY}
Формат проговора даты по умолчанию
Вот пример того что у меня получилось для Української мови:
[ua-base](!) _[n]um:0 => num:${SAY} _[n]um:0f => digits/${SAY:0:1} _[n]um:0. => num:${SAY:1} _[n]um:X => digits/${SAY} _[n]um:1f => digits/odna _[n]um:2f => digits/dvi _[n]um:Xf => num:${SAY:0:1} ; Tens _[n]um:1Xf => num:${SAY:0:2} _[n]um:1X => digits/${SAY} _[n]um:[2-9]0 => digits/${SAY} _[n]um:[2-9]0f => digits/${SAY:0:2} _[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1} _[n]um:[2-9][1-9]f => digits/${SAY:0:1}0, num:${SAY:1} ; Hundreds _[n]um:[1-9]00 => digits/${SAY} _[n]um:[1-9]00f => num:${SAY} _[n]um:XXX => num:${SAY:0:1}00, num:${SAY:1} _[n]um:XXXf => num:${SAY:0:1}00, num:${SAY:1} ; Thousands _[n]um:1XXX => num:${SAY:0:1}, digits/thousand, num:${SAY:1} _[n]um:[2-4]XXX => num:${SAY:0:1}, digits/thousands-i, num:${SAY:1} _[n]um:[5-9]XXX => num:${SAY:0:1}, digits/thousands, num:${SAY:1} _[n]um:X1XXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2} _[n]um:X[2-4]XXX => num:${SAY:0:2}, digits/thousands-i, num:${SAY:2} _[n]um:X[5-9]XXX => num:${SAY:0:2}, digits/thousands, num:${SAY:2} _[n]um:XX1XXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3} _[n]um:XX[2-4]XXX => num:${SAY:0:3}, digits/thousands-i, num:${SAY:3} _[n]um:XX[5-9]XXX => num:${SAY:0:3}, digits/thousands, num:${SAY:3} ; Millions _[n]um:1XXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1} _[n]um:[2-4]XXXXXX => num:${SAY:0:1}, digits/millions-i, num:${SAY:1} _[n]um:[5-9]XXXXXX => num:${SAY:0:1}, digits/millions, num:${SAY:1} _[n]um:X1XXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2} _[n]um:X[2-4]XXXXXX => num:${SAY:0:2}, digits/millions-i, num:${SAY:2} _[n]um:X[5-9]XXXXXX => num:${SAY:0:2}, digits/millions, num:${SAY:2} _[n]um:XX1XXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3} _[n]um:XX[2-4]XXXXXX => num:${SAY:0:3}, digits/millions-i, num:${SAY:3} _[n]um:XX[5-9]XXXXXX => num:${SAY:0:3}, digits/millions, num:${SAY:3} ; Billions _[n]um:1XXXXXXXXX => num:${SAY:0:1}, digits/billion, num:${SAY:1} _[n]um:[2-4]XXXXXXXXX => num:${SAY:0:1}, digits/billions-i, num:${SAY:1} _[n]um:[5-9]XXXXXXXXX => num:${SAY:0:1}, digits/billions, num:${SAY:1} _[n]um:X1XXXXXXXXX => num:${SAY:0:2}, digits/billion, num:${SAY:2} _[n]um:X[2-4]XXXXXXXXX => num:${SAY:0:2}, digits/billions-i, num:${SAY:2} _[n]um:X[5-9]XXXXXXXXX => num:${SAY:0:2}, digits/billions, num:${SAY:2} _[n]um:XX1XXXXXXXXX => num:${SAY:0:3}, digits/billion, num:${SAY:3} _[n]um:XX[2-4]XXXXXXXXX => num:${SAY:0:3}, digits/billions-i, num:${SAY:3} _[n]um:XX[5-9]XXXXXXXXX => num:${SAY:0:3}, digits/billions, num:${SAY:3} ; enumeration _e[n]um:X[mfn] => digits/h-${SAY} _e[n]um:1X[mfn] => digits/h-${SAY} _e[n]um:[2-9]0[mfn] => digits/h-${SAY} _e[n]um:[2-9][1-9][mfn] => num:${SAY:0:1}0, digits/h-${SAY:1} _e[n]um:[1-9]XX[mfn] => num:${SAY:0:1}, digits/hundred, enum:${SAY:1} [ua](ua-base,digit-base) ;CHAS _godu[n]:0 => num:${SAY}, digits/godun _godu[n]:1 => digits/odna, digits/goduna _godu[n]:2 => digits/dvi, digits/godunu _godu[n]:[3-4] => num:${SAY}, digits/godunu _godu[n]:[5-9] => num:${SAY}, digits/godun _godu[n]:0X => godun:${SAY:1} _godu[n]:1X => num:${SAY}, digits/godun _godu[n]:20 => num:${SAY}, digits/godun _godu[n]:2[1-4] => num:${SAY:0:1}0, godun:${SAY:1} _hvulu[n]:0 => num:${SAY}, digits/hvulun _hvulu[n]:1 => digits/odna, digits/hvuluna _hvulu[n]:2 => digits/dvi, digits/hvulunu _hvulu[n]:[3-4] => num:${SAY}, digits/hvulunu _hvulu[n]:[5-9] => num:${SAY}, digits/hvulun _hvulu[n]:0X => hvulun:${SAY:1} _hvulu[n]:1X => num:${SAY}, digits/hvulun _hvulu[n]:[2-5]0 => num:${SAY}, digits/hvulun _hvulu[n]:[2-5][1-9] => num:${SAY:0:1}0, hvulun:${SAY:1} _seku[n]d:0 => num:${SAY}, digits/secund _seku[n]d:1 => digits/odna, digits/secunda _seku[n]d:2 => digits/dvi, digits/secundu _seku[n]d:[3-4] => num:${SAY}, digits/secundu _seku[n]d:[5-9] => num:${SAY}, digits/secund _seku[n]d:0X => sekund:${SAY:1} _seku[n]d:1X => num:${SAY}, digits/secund _seku[n]d:[2-5]0 => num:${SAY}, digits/secund _seku[n]d:[2-5][1-9] => num:${SAY:0:1}0, sekund:${SAY:1} ;zagalnij chas _date:[hH]:. => godun:${SAY:8:2} ; hour _date:[M]:. => hvulun:${SAY:10:2} ; minute _date:[S]:. => sekund:${SAY:13:2} ; seconds _datetime::. => date:AdBY HMS:${SAY} ;GROSHI _gr[n]:. => num:${SAY}f, digits/grn${IF($[$[$[${SAY}%10]=1] & $[$[${SAY}%100]!=11]]?1:${IF($[$[$[$[${SAY}%10]>=2] & $[$[${SAY}%10]<=4]] & $[$[$[${SAY}%100]<10] | $[$[${SAY}%100]>=20]]]?2:5)})} _kop:. => num:${SAY}f, digits/kop${IF($[$[$[${SAY}%10]=1] & $[$[${SAY}%100]!=11]]?1:${IF($[$[$[$[${SAY}%10]>=2] & $[$[${SAY}%10]<=4]] & $[$[$[${SAY}%100]<10] | $[$[${SAY}%100]>=20]]]?2:5)})}
Особенности названия файлов:
grn1 гривня
grn2 гривні
grn5 гривень
kop1 копійка
kop2 копійки
kop5 копійок
Использование:
Playback(grn:21|say) – двадцять однa гривня
Playback(kop:21|say) – двадцять одна копійка
Обратите внимание что файлики вы должны сами наговаривать!
Желаю успешных локализаций)
Заметили ошибку, напишите пожалуйста! Спасибо.