diff --git a/conf/lang/de/vm/sounds.xml b/conf/lang/de/vm/sounds.xml
new file mode 100644
index 0000000000..ad9dc2e136
--- /dev/null
+++ b/conf/lang/de/vm/sounds.xml
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mod/say/mod_say_de/mod_say_de.c b/src/mod/say/mod_say_de/mod_say_de.c
index 7212a5f581..667f3f6669 100644
--- a/src/mod/say/mod_say_de/mod_say_de.c
+++ b/src/mod/say/mod_say_de/mod_say_de.c
@@ -40,6 +40,7 @@
* Anthony Minessale II
* Michael B. Murdock
* Daniel Swarbrick
+ * Christian Benke
*
* mod_say_de.c -- Say for German
*
@@ -80,17 +81,27 @@ SWITCH_MODULE_DEFINITION(mod_say_de, mod_say_de_load, NULL, NULL);
return SWITCH_STATUS_FALSE; \
}} \
-static switch_status_t play_group(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args)
+static switch_status_t play_group(switch_say_method_t method, switch_say_gender_t gender, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args)
{
if (a) {
- say_file("digits/%d.wav", a);
- say_file("digits/hundred.wav");
+ /*german nominativ for "one" in numbers like 21, 171, 4591 is flexed("ein" instead of "eins"), 2-9 are not*/
+ if ( a == 1 ) {
+ say_file("digits/s-%d.wav");
+ } else {
+ say_file("digits/%d.wav", a);
+ }
+ say_file("digits/hundred.wav");
}
if (b) {
if (b > 1) {
- say_file("digits/%d.wav", c);
+ /*german nominativ for "one" in numbers like 21, 171, 4591 is flexed, 2-9 are not*/
+ if ( c == 1 ) {
+ say_file("digits/s-%d.wav");
+ } else {
+ say_file("digits/%d.wav", c);
+ }
say_file("currency/and.wav");
if (method == SSM_COUNTED) {
say_file("digits/h-%d0.wav", b);
@@ -111,7 +122,15 @@ static switch_status_t play_group(switch_say_method_t method, int a, int b, int
if (method == SSM_COUNTED) {
say_file("digits/h-%d.wav", c);
} else {
- say_file("digits/%d.wav", c);
+ /*"one" used as an article is feminine or masculine in german, e.g. voicemail-message is feminine
+ only applies to the likes of 1, 101, 1001 etc.*/
+ if ( b == 0 && c == 1 && gender == SSG_FEMININE ) {
+ say_file("digits/%d_f.wav", c);
+ } else if ( b == 0 && c == 1 && what ) {
+ say_file("digits/s-%d.wav");
+ } else {
+ say_file("digits/%d.wav", c);
+ }
}
}
@@ -150,7 +169,7 @@ static switch_status_t de_say_general_count(switch_core_session_t *session, char
in = atoi(tosay);
- if (in != 0) {
+ if (in != 0) { /*fills the places-array with tosay(resp. in) from tail to front e.g. 84371 would be places[|1|7|3|4|8|0|0|0|], up to 1 billion minus 1*/
for (x = 8; x >= 0; x--) {
int num = (int) pow(10, x);
if ((places[(uint32_t) x] = in / num)) {
@@ -161,13 +180,13 @@ static switch_status_t de_say_general_count(switch_core_session_t *session, char
switch (say_args->method) {
case SSM_COUNTED:
case SSM_PRONOUNCED:
- if ((status = play_group(SSM_PRONOUNCED, places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
+ if ((status = play_group(SSM_PRONOUNCED, say_args->gender, places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
return status;
}
- if ((status = play_group(SSM_PRONOUNCED, places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
+ if ((status = play_group(SSM_PRONOUNCED, say_args->gender, places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
return status;
}
- if ((status = play_group(say_args->method, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
+ if ((status = play_group(say_args->method, say_args->gender, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
return status;
}
break;