From c29c6c719f71ebfbf638fb257f35a0af0946e8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Via=C4=8Das=C5=82a=C5=AD=20Chalikin?= Date: Mon, 29 Jan 2024 11:50:45 +0300 Subject: [PATCH] Fix narrator --- accessibility.h | 7 + frontend/drivers/platform_darwin.m | 3 +- frontend/drivers/platform_unix.c | 239 ++++++++++------------- frontend/drivers/platform_win32.c | 31 ++- frontend/frontend_driver.h | 2 +- retroarch.c | 24 +-- tasks/task_translation.c | 296 +++++++++++++++-------------- 7 files changed, 290 insertions(+), 312 deletions(-) diff --git a/accessibility.h b/accessibility.h index 1d1c2a7adfe8..0787225cdb4a 100644 --- a/accessibility.h +++ b/accessibility.h @@ -143,6 +143,13 @@ bool accessibility_speak_priority( unsigned accessibility_narrator_speech_speed, const char* speak_text, int priority); +bool narrator_speak_priority( + bool accessibility_enable, + const char *voice, + unsigned accessibility_narrator_speech_speed, + const char *speak_text, + int priority); + access_state_t *access_state_get_ptr(void); #endif diff --git a/frontend/drivers/platform_darwin.m b/frontend/drivers/platform_darwin.m index 98167d82d9c8..272dd1cd3f9c 100644 --- a/frontend/drivers/platform_darwin.m +++ b/frontend/drivers/platform_darwin.m @@ -884,11 +884,10 @@ static bool is_narrator_running_macos(void) return (kill(speak_pid, 0) == 0); } -static bool accessibility_speak_macos(int speed, +static bool accessibility_speak_macos(const char* voice, int speed, const char* speak_text, int priority) { int pid; - const char *voice = get_user_language_iso639_1(false); char* language_speaker = accessibility_mac_language_code(voice); char* speeds[10] = {"80", "100", "125", "150", "170", "210", "260", "310", "380", "450"}; diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index 4f2390ee5d29..b0c82d30ce0a 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -82,7 +82,6 @@ #include "../../msg_hash.h" #include "../../paths.h" #include "../../retroarch.h" -#include "../../translation_defines.h" #include "../../verbosity.h" #ifdef HAVE_MENU @@ -798,7 +797,7 @@ static void check_proc_acpi_sysfs_battery(const char *node, } fill_pathname_join_special(path, basenode, "type", sizeof(path)); - + if (!filestream_exists(path)) goto status; @@ -2789,152 +2788,106 @@ static bool is_narrator_running_unix(void) return (kill(speak_pid, 0) == 0); } -/** - * Returns the espeak-compatible string representation of the translation language enum value. - */ -static const char* espeak_get_str(enum translation_lang id) -{ - switch (id) - { - case TRANSLATION_LANG_EN: - return "en"; - case TRANSLATION_LANG_ES: - return "es"; - case TRANSLATION_LANG_FR: - return "fr"; - case TRANSLATION_LANG_IT: - return "it"; - case TRANSLATION_LANG_DE: - return "de"; - case TRANSLATION_LANG_JP: - return "ja"; - case TRANSLATION_LANG_NL: - return "nl"; - case TRANSLATION_LANG_CS: - return "cs"; - case TRANSLATION_LANG_DA: - return "da"; - case TRANSLATION_LANG_SV: - return "sv"; - case TRANSLATION_LANG_HR: - return "hr"; - case TRANSLATION_LANG_KO: - return "ko"; - case TRANSLATION_LANG_ZH_CN: - case TRANSLATION_LANG_ZH_TW: - return "cmn"; - case TRANSLATION_LANG_CA: - return "ca"; - case TRANSLATION_LANG_BG: - return "bg"; - case TRANSLATION_LANG_BN: - return "bn"; - case TRANSLATION_LANG_EU: - return "eu"; - case TRANSLATION_LANG_AZ: - return "az"; - case TRANSLATION_LANG_AR: - return "ar"; - case TRANSLATION_LANG_SQ: - return "sq"; - case TRANSLATION_LANG_AF: - return "af"; - case TRANSLATION_LANG_EO: - return "eo"; - case TRANSLATION_LANG_ET: - return "et"; - case TRANSLATION_LANG_FI: - return "fi"; - case TRANSLATION_LANG_KA: - return "ka"; - case TRANSLATION_LANG_EL: - return "el"; - case TRANSLATION_LANG_GU: - return "gu"; - case TRANSLATION_LANG_HT: - return "ht"; - case TRANSLATION_LANG_HE: - return "he"; - case TRANSLATION_LANG_HI: - return "hi"; - case TRANSLATION_LANG_HU: - return "hu"; - case TRANSLATION_LANG_IS: - return "is"; - case TRANSLATION_LANG_ID: - return "id"; - case TRANSLATION_LANG_GA: - return "ga"; - case TRANSLATION_LANG_KN: - return "kn"; - case TRANSLATION_LANG_LA: - return "la"; - case TRANSLATION_LANG_LV: - return "lv"; - case TRANSLATION_LANG_LT: - return "lt"; - case TRANSLATION_LANG_MK: - return "mk"; - case TRANSLATION_LANG_MS: - return "ms"; - case TRANSLATION_LANG_MT: - return "mt"; - case TRANSLATION_LANG_NO: - return "nb"; - case TRANSLATION_LANG_FA: - return "fa"; - case TRANSLATION_LANG_PL: - return "pl"; - case TRANSLATION_LANG_PT: - return "pt"; - case TRANSLATION_LANG_RO: - return "ro"; - case TRANSLATION_LANG_RU: - return "ru"; - case TRANSLATION_LANG_SR: - return "sr"; - case TRANSLATION_LANG_SK: - return "sk"; - case TRANSLATION_LANG_SL: - return "sl"; - case TRANSLATION_LANG_SW: - return "sw"; - case TRANSLATION_LANG_TA: - return "ta"; - case TRANSLATION_LANG_TE: - return "te"; - case TRANSLATION_LANG_TH: - return "th"; - case TRANSLATION_LANG_TR: - return "tr"; - case TRANSLATION_LANG_UK: - return "uk"; - case TRANSLATION_LANG_BE: - return "be"; - case TRANSLATION_LANG_UR: - return "ur"; - case TRANSLATION_LANG_VI: - return "vi"; - case TRANSLATION_LANG_CY: - return "cy"; - case TRANSLATION_LANG_AST: - case TRANSLATION_LANG_TL: - case TRANSLATION_LANG_GL: - case TRANSLATION_LANG_YI: - case TRANSLATION_LANG_DONT_CARE: - case TRANSLATION_LANG_LAST: - break; - } +static const char* accessibility_unix_language_code(const char* language) +{ + if ( + string_is_equal(language, "en") || + string_is_equal(language, "it") || + string_is_equal(language, "sv") || + string_is_equal(language, "fr") || + string_is_equal(language, "de") || + string_is_equal(language, "he") || + string_is_equal(language, "id") || + string_is_equal(language, "es") || + string_is_equal(language, "nl") || + string_is_equal(language, "ro") || + string_is_equal(language, "th") || + string_is_equal(language, "ja") || + string_is_equal(language, "sk") || + string_is_equal(language, "hi") || + string_is_equal(language, "ar") || + string_is_equal(language, "hu") || + string_is_equal(language, "el") || + string_is_equal(language, "ru") || + string_is_equal(language, "nb") || + string_is_equal(language, "da") || + string_is_equal(language, "fi") || + string_is_equal(language, "tr") || + string_is_equal(language, "ko") || + string_is_equal(language, "pl") || + string_is_equal(language, "cs") || + string_is_equal(language, "eo") || + string_is_equal(language, "vi") || + string_is_equal(language, "fa") || + string_is_equal(language, "uk") || + string_is_equal(language, "be") || + string_is_equal(language, "hr") || + string_is_equal(language, "bg") || + string_is_equal(language, "bn") || + string_is_equal(language, "eu") || + string_is_equal(language, "az") || + string_is_equal(language, "sq") || + string_is_equal(language, "af") || + string_is_equal(language, "et") || + string_is_equal(language, "ka") || + string_is_equal(language, "gu") || + string_is_equal(language, "ht") || + string_is_equal(language, "is") || + string_is_equal(language, "ga") || + string_is_equal(language, "kn") || + string_is_equal(language, "la") || + string_is_equal(language, "lv") || + string_is_equal(language, "lt") || + string_is_equal(language, "mk") || + string_is_equal(language, "ms") || + string_is_equal(language, "mt") || + string_is_equal(language, "sr") || + string_is_equal(language, "sl") || + string_is_equal(language, "sw") || + string_is_equal(language, "ta") || + string_is_equal(language, "te") || + string_is_equal(language, "ur") || + string_is_equal(language, "cy") + ) + return language; + else if ( + string_is_equal(language, "no") || + string_is_equal(language, "nb") + ) + return "nb"; + else if (string_is_equal(language, "en_gb")) + return "en-gb"; + else if ( + string_is_equal(language, "ca") || + string_is_equal(language, "ca_ES@valencia") + ) + return "ca"; + else if ( + string_is_equal(language, "pt_pt") || + string_is_equal(language, "pt") + ) + return "pt"; + else if (string_is_equal(language, "pt_bt")) + return "pt-br"; + else if ( + string_is_equal(language, "zh") || + string_is_equal(language, "zh_cn") || + string_is_equal(language, "zh_tw") || + string_is_equal(language, "zh-CN") || + string_is_equal(language, "zh-TW") + ) + return "cmn"; + else if (string_is_equal(language, "zh_hk")) + return "yue"; + /* default voice as fallback */ return "en"; } -static bool accessibility_speak_unix(int speed, +static bool accessibility_speak_unix(const char* voice, int speed, const char* speak_text, int priority) { int pid; - settings_t *settings = config_get_ptr(); - unsigned target_lang = settings->uints.ai_service_target_lang; - const char *language = espeak_get_str((enum translation_lang)target_lang); + const char* language = accessibility_unix_language_code(voice); char* voice_out = (char*)malloc(3 + strlen(language)); char* speed_out = (char*)malloc(3 + 3); const char* speeds[10] = {"80", "100", "125", "150", "170", "210", "260", "310", "380", "450"}; @@ -2994,7 +2947,7 @@ static bool accessibility_speak_unix(int speed, /* Tell the system that we'll ignore the exit status of the child * process. This prevents zombie processes. */ signal(SIGCHLD, SIG_IGN); - } + } } end: diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index ffccd7c8c281..5166b160bdd2 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -831,7 +831,7 @@ static const char *accessibility_win_language_id(const char* language) return "401"; else if (string_is_equal(language,"hu")) return "040e"; - else if (string_is_equal(language,"zh_tw") || string_is_equal(language,"zh")) + else if (string_is_equal(language, "zh_tw") || string_is_equal(language,"zh")) return "804"; else if (string_is_equal(language,"el")) return "408"; @@ -896,13 +896,15 @@ static const char *accessibility_win_language_code(const char* language) return "Microsoft Naayf Desktop"; else if (string_is_equal(language,"hu")) return "Microsoft Szabolcs Desktop"; - else if (string_is_equal(language,"zh_tw") || string_is_equal(language,"zh")) + else if (string_is_equal(language, "zh_tw") + || string_is_equal(language,"zh-TW") + || string_is_equal(language,"zh")) return "Microsoft Zhiwei Desktop"; else if (string_is_equal(language,"el")) return "Microsoft Stefanos Desktop"; else if (string_is_equal(language,"ru")) return "Microsoft Pavel Desktop"; - else if (string_is_equal(language,"nb")) + else if (string_is_equal(language,"no") || string_is_equal(language,"nb")) return "Microsoft Jon Desktop"; else if (string_is_equal(language,"da")) return "Microsoft Helle Desktop"; @@ -910,7 +912,7 @@ static const char *accessibility_win_language_code(const char* language) return "Microsoft Heidi Desktop"; else if (string_is_equal(language,"zh_hk")) return "Microsoft Danny Desktop"; - else if (string_is_equal(language,"zh_cn")) + else if (string_is_equal(language,"zh_cn") || (string_is_equal(language,"zh-CN")) return "Microsoft Kangkang Desktop"; else if (string_is_equal(language,"tr")) return "Microsoft Tolga Desktop"; @@ -918,8 +920,24 @@ static const char *accessibility_win_language_code(const char* language) return "Microsoft Heami Desktop"; else if (string_is_equal(language,"pl")) return "Microsoft Adam Desktop"; - else if (string_is_equal(language,"cs")) + else if (string_is_equal(language,"cs")) return "Microsoft Jakub Desktop"; + else if (string_is_equal(language,"vi")) + return "Microsoft An Desktop"; + else if (string_is_equal(language,"hr")) + return "Microsoft Matej Desktop"; + else if (string_is_equal(language,"bg")) + return "Microsoft Ivan Desktop"; + else if (string_is_equal(language,"ms")) + return "Microsoft Rizwan Desktop"; + else if (string_is_equal(language,"sl")) + return "Microsoft Lado Desktop"; + else if (string_is_equal(language,"ta")) + return "Microsoft Valluvar Desktop"; + else if (string_is_equal(language,"en_gb")) + return "Microsoft George Desktop"; + else if (string_is_equal(language,"ca") || string_is_equal(language,"ca_ES@valencia")) + return "Microsoft Herena Desktop"; return ""; } @@ -1016,11 +1034,10 @@ static bool is_narrator_running_windows(void) return false; } -static bool accessibility_speak_windows(int speed, +static bool accessibility_speak_windows(const char* voice, int speed, const char* speak_text, int priority) { char cmd[512]; - const char *voice = get_user_language_iso639_1(true); const char *language = accessibility_win_language_code(voice); const char *langid = accessibility_win_language_id(voice); bool res = false; diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index 3278fedefa56..951920943980 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -111,7 +111,7 @@ typedef struct frontend_ctx_driver const char* (*get_cpu_model_name)(void); enum retro_language (*get_user_language)(void); bool (*is_narrator_running)(void); - bool (*accessibility_speak)(int speed, + bool (*accessibility_speak)(const char* voice, int speed, const char* speak_text, int priority); bool (*set_gamemode)(bool on); diff --git a/retroarch.c b/retroarch.c index 413eb025a4c6..12df92fe972a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -8339,6 +8339,17 @@ bool accessibility_speak_priority( bool accessibility_enable, unsigned accessibility_narrator_speech_speed, const char* speak_text, int priority) +{ + const char *voice = get_user_language_iso639_1(false); + return narrator_speak_priority(accessibility_enable, voice, accessibility_narrator_speech_speed, speak_text, priority); +} + +bool narrator_speak_priority( + bool accessibility_enable, + const char *voice, + unsigned accessibility_narrator_speech_speed, + const char *speak_text, + int priority) { access_state_t *access_st = access_state_get_ptr(); if (is_accessibility_enabled( @@ -8351,21 +8362,10 @@ bool accessibility_speak_priority( RARCH_LOG("Spoke: %s\n", speak_text); if (frontend && frontend->accessibility_speak) - return frontend->accessibility_speak(accessibility_narrator_speech_speed, speak_text, + return frontend->accessibility_speak(voice, accessibility_narrator_speech_speed, speak_text, priority); RARCH_LOG("Platform not supported for accessibility.\n"); - /* The following method is a fallback for other platforms to use the - AI Service url to do the TTS. However, since the playback is done - via the audio mixer, which only processes the audio while the - core is running, this playback method won't work. When the audio - mixer can handle playing streams while the core is paused, then - we can use this. */ -#if 0 -#if defined(HAVE_NETWORKING) - return accessibility_speak_ai_service(speak_text, voice, priority); -#endif -#endif } return true; diff --git a/tasks/task_translation.c b/tasks/task_translation.c index 3966077a122d..30800bd70cdd 100644 --- a/tasks/task_translation.c +++ b/tasks/task_translation.c @@ -110,6 +110,151 @@ typedef struct /* UTILITIES ---------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +/** + * Returns the string representation of the translation language enum value. + */ +static const char* ai_service_get_str(enum translation_lang id) +{ + switch (id) + { + case TRANSLATION_LANG_EN: + return "en"; + case TRANSLATION_LANG_ES: + return "es"; + case TRANSLATION_LANG_FR: + return "fr"; + case TRANSLATION_LANG_IT: + return "it"; + case TRANSLATION_LANG_DE: + return "de"; + case TRANSLATION_LANG_JP: + return "ja"; + case TRANSLATION_LANG_NL: + return "nl"; + case TRANSLATION_LANG_CS: + return "cs"; + case TRANSLATION_LANG_DA: + return "da"; + case TRANSLATION_LANG_SV: + return "sv"; + case TRANSLATION_LANG_HR: + return "hr"; + case TRANSLATION_LANG_KO: + return "ko"; + case TRANSLATION_LANG_ZH_CN: + return "zh-CN"; + case TRANSLATION_LANG_ZH_TW: + return "zh-TW"; + case TRANSLATION_LANG_CA: + return "ca"; + case TRANSLATION_LANG_BG: + return "bg"; + case TRANSLATION_LANG_BN: + return "bn"; + case TRANSLATION_LANG_EU: + return "eu"; + case TRANSLATION_LANG_AZ: + return "az"; + case TRANSLATION_LANG_AR: + return "ar"; + case TRANSLATION_LANG_AST: + return "ast"; + case TRANSLATION_LANG_SQ: + return "sq"; + case TRANSLATION_LANG_AF: + return "af"; + case TRANSLATION_LANG_EO: + return "eo"; + case TRANSLATION_LANG_ET: + return "et"; + case TRANSLATION_LANG_TL: + return "tl"; + case TRANSLATION_LANG_FI: + return "fi"; + case TRANSLATION_LANG_GL: + return "gl"; + case TRANSLATION_LANG_KA: + return "ka"; + case TRANSLATION_LANG_EL: + return "el"; + case TRANSLATION_LANG_GU: + return "gu"; + case TRANSLATION_LANG_HT: + return "ht"; + case TRANSLATION_LANG_HE: + return "he"; + case TRANSLATION_LANG_HI: + return "hi"; + case TRANSLATION_LANG_HU: + return "hu"; + case TRANSLATION_LANG_IS: + return "is"; + case TRANSLATION_LANG_ID: + return "id"; + case TRANSLATION_LANG_GA: + return "ga"; + case TRANSLATION_LANG_KN: + return "kn"; + case TRANSLATION_LANG_LA: + return "la"; + case TRANSLATION_LANG_LV: + return "lv"; + case TRANSLATION_LANG_LT: + return "lt"; + case TRANSLATION_LANG_MK: + return "mk"; + case TRANSLATION_LANG_MS: + return "ms"; + case TRANSLATION_LANG_MT: + return "mt"; + case TRANSLATION_LANG_NO: + return "no"; + case TRANSLATION_LANG_FA: + return "fa"; + case TRANSLATION_LANG_PL: + return "pl"; + case TRANSLATION_LANG_PT: + return "pt"; + case TRANSLATION_LANG_RO: + return "ro"; + case TRANSLATION_LANG_RU: + return "ru"; + case TRANSLATION_LANG_SR: + return "sr"; + case TRANSLATION_LANG_SK: + return "sk"; + case TRANSLATION_LANG_SL: + return "sl"; + case TRANSLATION_LANG_SW: + return "sw"; + case TRANSLATION_LANG_TA: + return "ta"; + case TRANSLATION_LANG_TE: + return "te"; + case TRANSLATION_LANG_TH: + return "th"; + case TRANSLATION_LANG_TR: + return "tr"; + case TRANSLATION_LANG_UK: + return "uk"; + case TRANSLATION_LANG_BE: + return "be"; + case TRANSLATION_LANG_UR: + return "ur"; + case TRANSLATION_LANG_VI: + return "vi"; + case TRANSLATION_LANG_CY: + return "cy"; + case TRANSLATION_LANG_YI: + return "yi"; + case TRANSLATION_LANG_DONT_CARE: + case TRANSLATION_LANG_LAST: + break; + } + + return ""; +} + /** * Returns true if the accessibility narrator is currently playing audio. */ @@ -156,8 +301,9 @@ static void accessibility_speak(const char *text) settings_t *settings = config_get_ptr(); unsigned speed = settings->uints.accessibility_narrator_speech_speed; bool narrator_on = settings->bools.accessibility_enable; + const char* voice = ai_service_get_str(settings->uints.ai_service_target_lang); - accessibility_speak_priority(narrator_on, speed, text, 10); + narrator_speak_priority(narrator_on, voice, speed, text, 10); #endif } @@ -175,10 +321,11 @@ static void translation_speak(const char *text) unsigned mode = settings->uints.ai_service_mode; unsigned speed = settings->uints.accessibility_narrator_speech_speed; bool narrator_on = settings->bools.accessibility_enable; + const char* voice = ai_service_get_str(settings->uints.ai_service_target_lang); /* Force the use of the narrator in Narrator modes (TTS) */ if (mode == 2 || mode == 4 || mode == 5 || narrator_on || access_st->enabled) - accessibility_speak_priority(true, speed, text, 10); + narrator_speak_priority(true, voice, speed, text, 10); #endif } @@ -329,151 +476,6 @@ void translation_release(bool inform) translation_hash_info(MSG_AI_AUTO_MODE_DISABLED); } -/** - * Returns the string representation of the translation language enum value. - */ -static const char* ai_service_get_str(enum translation_lang id) -{ - switch (id) - { - case TRANSLATION_LANG_EN: - return "en"; - case TRANSLATION_LANG_ES: - return "es"; - case TRANSLATION_LANG_FR: - return "fr"; - case TRANSLATION_LANG_IT: - return "it"; - case TRANSLATION_LANG_DE: - return "de"; - case TRANSLATION_LANG_JP: - return "ja"; - case TRANSLATION_LANG_NL: - return "nl"; - case TRANSLATION_LANG_CS: - return "cs"; - case TRANSLATION_LANG_DA: - return "da"; - case TRANSLATION_LANG_SV: - return "sv"; - case TRANSLATION_LANG_HR: - return "hr"; - case TRANSLATION_LANG_KO: - return "ko"; - case TRANSLATION_LANG_ZH_CN: - return "zh-CN"; - case TRANSLATION_LANG_ZH_TW: - return "zh-TW"; - case TRANSLATION_LANG_CA: - return "ca"; - case TRANSLATION_LANG_BG: - return "bg"; - case TRANSLATION_LANG_BN: - return "bn"; - case TRANSLATION_LANG_EU: - return "eu"; - case TRANSLATION_LANG_AZ: - return "az"; - case TRANSLATION_LANG_AR: - return "ar"; - case TRANSLATION_LANG_AST: - return "ast"; - case TRANSLATION_LANG_SQ: - return "sq"; - case TRANSLATION_LANG_AF: - return "af"; - case TRANSLATION_LANG_EO: - return "eo"; - case TRANSLATION_LANG_ET: - return "et"; - case TRANSLATION_LANG_TL: - return "tl"; - case TRANSLATION_LANG_FI: - return "fi"; - case TRANSLATION_LANG_GL: - return "gl"; - case TRANSLATION_LANG_KA: - return "ka"; - case TRANSLATION_LANG_EL: - return "el"; - case TRANSLATION_LANG_GU: - return "gu"; - case TRANSLATION_LANG_HT: - return "ht"; - case TRANSLATION_LANG_HE: - return "he"; - case TRANSLATION_LANG_HI: - return "hi"; - case TRANSLATION_LANG_HU: - return "hu"; - case TRANSLATION_LANG_IS: - return "is"; - case TRANSLATION_LANG_ID: - return "id"; - case TRANSLATION_LANG_GA: - return "ga"; - case TRANSLATION_LANG_KN: - return "kn"; - case TRANSLATION_LANG_LA: - return "la"; - case TRANSLATION_LANG_LV: - return "lv"; - case TRANSLATION_LANG_LT: - return "lt"; - case TRANSLATION_LANG_MK: - return "mk"; - case TRANSLATION_LANG_MS: - return "ms"; - case TRANSLATION_LANG_MT: - return "mt"; - case TRANSLATION_LANG_NO: - return "no"; - case TRANSLATION_LANG_FA: - return "fa"; - case TRANSLATION_LANG_PL: - return "pl"; - case TRANSLATION_LANG_PT: - return "pt"; - case TRANSLATION_LANG_RO: - return "ro"; - case TRANSLATION_LANG_RU: - return "ru"; - case TRANSLATION_LANG_SR: - return "sr"; - case TRANSLATION_LANG_SK: - return "sk"; - case TRANSLATION_LANG_SL: - return "sl"; - case TRANSLATION_LANG_SW: - return "sw"; - case TRANSLATION_LANG_TA: - return "ta"; - case TRANSLATION_LANG_TE: - return "te"; - case TRANSLATION_LANG_TH: - return "th"; - case TRANSLATION_LANG_TR: - return "tr"; - case TRANSLATION_LANG_UK: - return "uk"; - case TRANSLATION_LANG_BE: - return "be"; - case TRANSLATION_LANG_UR: - return "ur"; - case TRANSLATION_LANG_VI: - return "vi"; - case TRANSLATION_LANG_CY: - return "cy"; - case TRANSLATION_LANG_YI: - return "yi"; - case TRANSLATION_LANG_DONT_CARE: - case TRANSLATION_LANG_LAST: - break; - } - - return ""; -} - /* AUTOMATION --------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */