From 816a82372702849b4813e1ca1824b57c7656e43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=8F=20=E3=81=BE=E3=82=8B=E3=81=A1?= =?UTF-8?q?=E3=81=B7=E3=82=8D=E3=81=A8=E3=81=93=E3=82=8B?= <36994795+ToshihiroMakuuchi@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:33:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Add=20support=20for=20Japanese=20voice?= =?UTF-8?q?=20language=20=F0=9F=87=AF=F0=9F=87=B5=20(#3261)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Created tts_jp.cpp and added "TR_VOICE_JAPANESE" to the *.h file. * Commented out once because the build did not work * fix: Define `JP` as a TTS language, - Fixes the undefined reference to `jpLanguagePack` error - put things in alphabetical order as the comment suggests it should be * chore: Add `JP` to Companion voice language list --------- Co-authored-by: Peter Feerick --- companion/src/generaledit/generalsetup.cpp | 4 +- radio/src/CMakeLists.txt | 4 +- radio/src/translations.h | 4 +- radio/src/translations/cn.h | 1 + radio/src/translations/cz.h | 1 + radio/src/translations/da.h | 1 + radio/src/translations/de.h | 1 + radio/src/translations/en.h | 1 + radio/src/translations/es.h | 1 + radio/src/translations/fi.h | 1 + radio/src/translations/fr.h | 1 + radio/src/translations/it.h | 1 + radio/src/translations/jp.h | 5 +- radio/src/translations/nl.h | 1 + radio/src/translations/pl.h | 1 + radio/src/translations/pt.h | 1 + radio/src/translations/se.h | 1 + radio/src/translations/tts_jp.cpp | 133 +++++++++++++++++++++ radio/src/translations/tw.h | 1 + 19 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 radio/src/translations/tts_jp.cpp diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 8b32d6e32..63eca9074 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -348,12 +348,12 @@ void GeneralSetupPanel::populateVoiceLangCB() QComboBox * b = ui->voiceLang_CB; QString strings[] = { tr("English"), tr("Danish"), tr("Dutch"), tr("French"), tr("Italian"), tr("German"), tr("Czech"), tr("Slovak"), tr("Spanish"), tr("Polish"), tr("Portuguese"), tr("Russian"), - tr("Swedish"), tr("Hungarian"), tr("Chinese"), NULL}; + tr("Swedish"), tr("Hungarian"), tr("Chinese"), tr("Japanese"), NULL}; // Note: these align with the radio NOT computer locales - TODO harmonise with ISO and one list!!! QString langcode[] = { "en", "da", "nl","fr", "it", "de", "cz", "sk", "es", "pl", "pt", "ru", - "se", "hu", "cn", NULL}; + "se", "hu", "cn", "jp", NULL}; b->clear(); for (int i=0; strings[i]!=NULL; i++) { diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 960bec0ed..fabdc46a0 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -2,8 +2,8 @@ include(CMakeForceCompiler) include(Bitmaps) set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S NV14) -set(RADIO_LANGUAGES CZ DA DE EN ES FI FR IT PT SK SE PL HU NL CN TW JP) -set(TTS_LANGUAGES CZ DA DE EN ES FR IT PT SK SE PL HU NL RU CN) +set(RADIO_LANGUAGES CN CZ DA DE EN ES FI FR IT JP PT SK SE PL HU NL TW) +set(TTS_LANGUAGES CN CZ DA DE EN ES FR IT JP PT SK SE PL HU NL RU) set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}") set_property(CACHE PCB PROPERTY STRINGS ${PCB_TYPES}) diff --git a/radio/src/translations.h b/radio/src/translations.h index ff27227f1..6f56dcc52 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -838,11 +838,13 @@ extern const LanguagePack ruLanguagePack; extern const LanguagePack seLanguagePack; extern const LanguagePack skLanguagePack; extern const LanguagePack cnLanguagePack; +extern const LanguagePack jpLanguagePack; extern const LanguagePack * const languagePacks[]; #if defined(LANGUAGE_PACKS_DEFINITION) const LanguagePack * const languagePacks[] = { // alphabetical order + &cnLanguagePack, &czLanguagePack, &daLanguagePack, &deLanguagePack, @@ -851,13 +853,13 @@ const LanguagePack * const languagePacks[] = { &frLanguagePack, &huLanguagePack, &itLanguagePack, + &jpLanguagePack, &nlLanguagePack, &plLanguagePack, &ptLanguagePack, &ruLanguagePack, &seLanguagePack, &skLanguagePack, - &cnLanguagePack, NULL }; #endif diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 428b00e92..e0d2c16f1 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -1236,3 +1236,4 @@ #define TR_VOICE_SLOVAK "斯洛伐克语" #define TR_VOICE_SWEDISH "瑞典语" #define TR_VOICE_TAIWANESE "中文-台湾国语" +#define TR_VOICE_JAPANESE "日文" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 6b2d6e5a6..39aefe25d 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -1238,3 +1238,4 @@ #define TR_VOICE_SLOVAK "Slovenština" #define TR_VOICE_SWEDISH "Švédština" #define TR_VOICE_TAIWANESE "Tchajwanština" +#define TR_VOICE_JAPANESE "Japonština" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index ed924633b..f300847ed 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -1251,3 +1251,4 @@ #define TR_VOICE_SLOVAK "Slovakisk" #define TR_VOICE_SWEDISH "Svensk" #define TR_VOICE_TAIWANESE "Taiwanesisk" +#define TR_VOICE_JAPANESE "Japansk" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index f579c2a31..0a89405bc 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -1237,3 +1237,4 @@ #define TR_VOICE_SLOVAK "Slowenisch" #define TR_VOICE_SWEDISH "Schwedisch" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanisch" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 9bd1fd3c3..0c2a0ce45 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -1230,3 +1230,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 2467dc533..ea04d8ee4 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -1241,3 +1241,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 0c31ea16b..4005eff5e 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -1254,3 +1254,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 6d5838add..3c5b2f312 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -1259,3 +1259,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index da3e318c1..68f14bfbb 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -1246,3 +1246,4 @@ #define TR_VOICE_SLOVAK "Slovacco" #define TR_VOICE_SWEDISH "Svedese" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Giapponese" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 9247a31f1..8ce77d005 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -31,8 +31,7 @@ #define TR_MIN_PLURAL2 2 #define TR_MAX_PLURAL2 2 -// For this number of minute in the last decimal place singular form is used in -// plural +// For this number of minute in the last decimal place singular form is used in plural #define TR_USE_SINGULAR_IN_PLURAL 1 #define TR_USE_PLURAL2_SPECIAL_CASE 0 // If the number of minutes is above this value PLURAL2 is used @@ -925,7 +924,6 @@ #define TR_UNIT "ユニット" #define TR_TELEMETRY_NEWSENSOR INDENT "新規追加" #define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "チャンネル範囲") -#define TR_RXFREQUENCY TR("Rx Freqency", "受信サーボ周波数") #define TR_ANTENNACONFIRM1 "外部アンテナ" #if defined(PCBX12S) #define TR_ANTENNA_MODES "内部","確認","モデル毎","内部+外部" @@ -1233,3 +1231,4 @@ #define TR_VOICE_SLOVAK "スロバキア-SK" #define TR_VOICE_SWEDISH "スウェーデン-SV" #define TR_VOICE_TAIWANESE "中文-TW" +#define TR_VOICE_JAPANESE "日本-JP" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 19d8c6f91..eb0c5c048 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -1251,3 +1251,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index ac7d493c8..b87dac392 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -1235,3 +1235,4 @@ #define TR_VOICE_SLOVAK "Słowacki" #define TR_VOICE_SWEDISH "Szwedzki" #define TR_VOICE_TAIWANESE "Tajwański" +#define TR_VOICE_JAPANESE "Japonês" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 6db836ea9..06603ecb4 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -1244,3 +1244,4 @@ #define TR_VOICE_SLOVAK "Slovak" #define TR_VOICE_SWEDISH "Swedish" #define TR_VOICE_TAIWANESE "Taiwanese" +#define TR_VOICE_JAPANESE "Japanese" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 79a764c0f..2fe622337 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -1277,3 +1277,4 @@ #define TR_VOICE_SLOVAK "Slovakiska" #define TR_VOICE_SWEDISH "Svenska" #define TR_VOICE_TAIWANESE "Taiwanesiska" +#define TR_VOICE_JAPANESE "Japanska" diff --git a/radio/src/translations/tts_jp.cpp b/radio/src/translations/tts_jp.cpp new file mode 100644 index 000000000..190f93ddd --- /dev/null +++ b/radio/src/translations/tts_jp.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +enum JapanesePrompts { + JP_PROMPT_NUMBERS_BASE = 0, + JP_PROMPT_ZERO = JP_PROMPT_NUMBERS_BASE+0, //02-99 + JP_PROMPT_HUNDRED = JP_PROMPT_NUMBERS_BASE+100, //100,200 .. 900 + JP_PROMPT_THOUSAND = JP_PROMPT_NUMBERS_BASE+109, //1000 + JP_PROMPT_AND = JP_PROMPT_NUMBERS_BASE+110, + JP_PROMPT_MINUS = JP_PROMPT_NUMBERS_BASE+111, + JP_PROMPT_POINT = JP_PROMPT_NUMBERS_BASE+112, + JP_PROMPT_UNITS_BASE = 113, + JP_PROMPT_POINT_BASE = 167, //.0 - .9 +}; + + + #define JP_PUSH_UNIT_PROMPT(u, p) jp_pushUnitPrompt((u), (p), id) + +I18N_PLAY_FUNCTION(jp, pushUnitPrompt, uint8_t unitprompt, int16_t number) +{ + if (number == 1) + PUSH_UNIT_PROMPT(unitprompt, 0); + else + PUSH_UNIT_PROMPT(unitprompt, 1); +} + +I18N_PLAY_FUNCTION(jp, playNumber, getvalue_t number, uint8_t unit, uint8_t att) +{ + if (number < 0) { + PUSH_NUMBER_PROMPT(JP_PROMPT_MINUS); + number = -number; + } + + + int8_t mode = MODE(att); + if (mode > 0) { + if (mode == 2) { + number /= 10; + } + div_t qr = div((int)number, 10); + if (qr.rem) { + PLAY_NUMBER(qr.quot, 0, 0); + PUSH_NUMBER_PROMPT(JP_PROMPT_POINT_BASE + qr.rem); + number = -1; + } + else { + number = qr.quot; + } + } + + int16_t tmp = number; + + if (number >= 1000) { + PLAY_NUMBER(number / 1000, 0, 0); + PUSH_NUMBER_PROMPT(JP_PROMPT_THOUSAND); + number %= 1000; + if (number == 0) + number = -1; + } + if (number >= 100) { + PUSH_NUMBER_PROMPT(JP_PROMPT_HUNDRED + (number/100)-1); + number %= 100; + if (number == 0) + number = -1; + } + if (number >= 0) { + PUSH_NUMBER_PROMPT(JP_PROMPT_ZERO + number); + } + + if (unit) { + JP_PUSH_UNIT_PROMPT(unit, tmp); + } +} + +I18N_PLAY_FUNCTION(jp, playDuration, int seconds PLAY_DURATION_ATT) +{ + if (seconds == 0) { + PLAY_NUMBER(seconds, 0, 0); + return; + } + + if (seconds < 0) { + PUSH_NUMBER_PROMPT(JP_PROMPT_MINUS); + seconds = -seconds; + } + + uint8_t tmp; + if (IS_PLAY_LONG_TIMER()) { + tmp = seconds / 60; + if (seconds % 60 >= 30) tmp += 1; + if (tmp > 0) PLAY_NUMBER(tmp, UNIT_MINUTES, 0); + } else { + tmp = seconds / 3600; + seconds %= 3600; + if (tmp > 0 || IS_PLAY_TIME()) { + PLAY_NUMBER(tmp, UNIT_HOURS, 0); + } + + tmp = seconds / 60; + seconds %= 60; + if (tmp > 0) { + PLAY_NUMBER(tmp, UNIT_MINUTES, 0); + if (seconds > 0) PUSH_NUMBER_PROMPT(JP_PROMPT_AND); + } + + if (seconds > 0) { + PLAY_NUMBER(seconds, UNIT_SECONDS, 0); + } + } +} + +LANGUAGE_PACK_DECLARE(jp, TR_VOICE_JAPANESE); + diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index fa49e78a6..bc140aba2 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -1234,3 +1234,4 @@ #define TR_VOICE_SLOVAK "斯洛伐克語" #define TR_VOICE_SWEDISH "瑞典語" #define TR_VOICE_TAIWANESE "中文-台灣國語" +#define TR_VOICE_JAPANESE "日文"