Skip to content

Commit 698776b

Browse files
committed
Merge branch 'v3.8/241' into next
2 parents f03f4f9 + 8154fc5 commit 698776b

File tree

9 files changed

+69
-11
lines changed

9 files changed

+69
-11
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
## [Unreleased]
44

5+
- Added new OpenAI TTS voices: Verse, Marin, and Cedar.
6+
- Added support for Hebrew, Thai, and Vietnamese to the DeepL translator.
7+
- Bug fixes.
8+
- 新增 OpenAI TTS 语音:Verse、Marin 与 Cedar
9+
- DeepL 翻译器新增对希伯来语、泰语和越南语的支持
10+
- Bug 修复
11+
512
## [3.8.1] (2025/11/10)
613

714
- Add support for quick documentation translation in Rider and CLion.

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pluginGroup = cn.yiiguxing.plugin.translate
66
pluginRepositoryUrl = https://github.com/YiiGuxing/TranslationPlugin
77

88
# SemVer format -> https://semver.org
9-
pluginMajorVersion = 3.8.1
9+
pluginMajorVersion = 3.8.2
1010
pluginPreReleaseVersion =
1111
pluginBuildMetadata =
1212
autoSnapshotVersion = true

src/main/kotlin/cn/yiiguxing/plugin/translate/trans/deepl/DeeplSupportedLanguages.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ object DeeplSupportedLanguages : SupportedLanguages {
2626
Lang.FRENCH,
2727
Lang.GERMAN,
2828
Lang.GREEK,
29+
Lang.HEBREW,
2930
Lang.HUNGARIAN,
3031
Lang.INDONESIAN,
3132
Lang.ITALIAN,
@@ -42,8 +43,10 @@ object DeeplSupportedLanguages : SupportedLanguages {
4243
Lang.SLOVENIAN,
4344
Lang.SPANISH,
4445
Lang.SWEDISH,
46+
Lang.THAI,
4547
Lang.TURKISH,
4648
Lang.UKRAINIAN,
49+
Lang.VIETNAMESE,
4750
)
4851

4952
/**
@@ -65,6 +68,7 @@ object DeeplSupportedLanguages : SupportedLanguages {
6568
Lang.FRENCH,
6669
Lang.GERMAN,
6770
Lang.GREEK,
71+
Lang.HEBREW,
6872
Lang.HUNGARIAN,
6973
Lang.INDONESIAN,
7074
Lang.ITALIAN,
@@ -82,8 +86,10 @@ object DeeplSupportedLanguages : SupportedLanguages {
8286
Lang.SLOVENIAN,
8387
Lang.SPANISH,
8488
Lang.SWEDISH,
89+
Lang.THAI,
8590
Lang.TURKISH,
8691
Lang.UKRAINIAN,
92+
Lang.VIETNAMESE,
8793
)
8894
}
8995

@@ -105,6 +111,7 @@ private val adapter = object : BaseLanguageAdapter() {
105111
"FR" to Lang.FRENCH,
106112
"DE" to Lang.GERMAN,
107113
"EL" to Lang.GREEK,
114+
"HE" to Lang.HEBREW,
108115
"HU" to Lang.HUNGARIAN,
109116
"IT" to Lang.ITALIAN,
110117
"ID" to Lang.INDONESIAN,
@@ -127,8 +134,10 @@ private val adapter = object : BaseLanguageAdapter() {
127134
"SL" to Lang.SLOVENIAN,
128135
"ES" to Lang.SPANISH,
129136
"SV" to Lang.SWEDISH,
137+
"TH" to Lang.THAI,
130138
"TR" to Lang.TURKISH,
131139
"UK" to Lang.UKRAINIAN,
140+
"VI" to Lang.VIETNAMESE,
132141
)
133142
}
134143

src/main/kotlin/cn/yiiguxing/plugin/translate/trans/openai/OpenAiModel.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ enum class OpenAiGPTModel(override val modelId: String, override val modelName:
3434
/**
3535
* See: [OpenAi TTS Models](https://platform.openai.com/docs/models/tts)
3636
*/
37-
enum class OpenAiTTSModel(override val modelId: String, override val modelName: String) : OpenAiModel {
38-
TTS_1("tts-1", "TTS-1"),
39-
TTS_1_HD("tts-1-hd", "TTS-1 HD"),
37+
enum class OpenAiTTSModel(
38+
override val modelId: String,
39+
override val modelName: String,
40+
val isClassic: Boolean = false
41+
) : OpenAiModel {
42+
TTS_1("tts-1", "TTS-1", isClassic = true),
43+
TTS_1_HD("tts-1-hd", "TTS-1 HD", isClassic = true),
4044
GPT_4O_MINI_TTS("gpt-4o-mini-tts", "GPT-4o mini TTS"),
45+
}
46+
47+
fun OpenAiTTSModel.getSupportedVoices(): List<OpenAiTtsVoice> = if (isClassic) {
48+
OpenAiTtsVoice.getClassicVoices()
49+
} else {
50+
OpenAiTtsVoice.values().toList()
4151
}

src/main/kotlin/cn/yiiguxing/plugin/translate/trans/openai/OpenAiService.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,12 @@ class OpenAI(private val options: OpenAiService.OpenAIOptions) : OpenAiService {
9898
}
9999

100100
override fun speech(text: String, indicator: ProgressIndicator?): ByteArray {
101+
val supportedVoices = options.ttsModel.getSupportedVoices()
102+
val fixedVoice = options.ttsVoice.takeIf { it in supportedVoices } ?: supportedVoices.first()
101103
val request = SpeechRequest(
102104
model = options.ttsModel.modelId,
103105
input = text,
104-
voice = options.ttsVoice.value,
106+
voice = fixedVoice.value,
105107
speed = OpenAiTTSSpeed.get(options.ttsSpeed)
106108
)
107109
val endpoint = with(options) { if (useSeparateTtsApiSettings) ttsEndpoint else endpoint }

src/main/kotlin/cn/yiiguxing/plugin/translate/trans/openai/OpenAiTtsVoice.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,27 @@ enum class OpenAiTtsVoice(val value: String, val voiceName: String) {
1212
CORAL("coral", "Coral"),
1313
ECHO("echo", "Echo"),
1414
FABLE("fable", "Fable"),
15-
ONYX("onyx", "Onyx"),
1615
NOVA("nova", "Nova"),
16+
ONYX("onyx", "Onyx"),
1717
SAGE("sage", "Sage"),
1818
SHIMMER("shimmer", "Shimmer"),
19+
VERSE("verse", "Verse"),
20+
MARIN("marin", "Marin"),
21+
CEDAR("cedar", "Cedar");
22+
23+
companion object {
24+
private val unsupportedForClassic = setOf(
25+
BALLAD,
26+
VERSE,
27+
MARIN,
28+
CEDAR
29+
)
30+
31+
/**
32+
* Returns a list of voices that are supported by the classic TTS models (e.g. tts-1 and tts-1-hd).
33+
*/
34+
fun getClassicVoices(): List<OpenAiTtsVoice> {
35+
return values().filter { it !in unsupportedForClassic }
36+
}
37+
}
1938
}

src/main/kotlin/cn/yiiguxing/plugin/translate/trans/openai/ui/OpenAISettingsDialog.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.intellij.openapi.components.service
1212
import com.intellij.openapi.ui.ComponentValidator
1313
import com.intellij.openapi.ui.DialogWrapper
1414
import com.intellij.openapi.ui.ValidationInfo
15+
import com.intellij.ui.CollectionComboBoxModel
1516
import com.intellij.ui.DocumentAdapter
1617
import com.intellij.ui.GotItTooltip
1718
import com.intellij.util.containers.orNull
@@ -132,8 +133,10 @@ class OpenAISettingsDialog(private val configType: ConfigType) : DialogWrapper(f
132133
ConfigType.TRANSLATOR -> openAiState.model =
133134
it.item as? OpenAiGPTModel ?: OpenAiGPTModel.values().first()
134135

135-
ConfigType.TTS -> commonStates.ttsModel =
136-
it.item as? OpenAiTTSModel ?: OpenAiTTSModel.values().first()
136+
ConfigType.TTS -> {
137+
commonStates.ttsModel = it.item as? OpenAiTTSModel ?: OpenAiTTSModel.values().first()
138+
updateVoicesAndFixSelection()
139+
}
137140
}
138141
}
139142
}
@@ -305,7 +308,7 @@ class OpenAISettingsDialog(private val configType: ConfigType) : DialogWrapper(f
305308
updateApiEndpoint()
306309
if (configType == ConfigType.TTS) {
307310
ui.modelComboBox.selected = commonStates.ttsModel
308-
ui.ttsVoiceComboBox.selected = commonStates.ttsVoice
311+
updateVoicesAndFixSelection()
309312
ui.ttsSpeedSlicer.value = commonStates.ttsSpeed
310313
ui.apiEndpointField.isEnabled = isAzure ||
311314
ui.ttsApiSettingsTypeComboBox.selected === OpenAISettingsUI.TtsApiSettingsType.SEPARATE
@@ -320,6 +323,15 @@ class OpenAISettingsDialog(private val configType: ConfigType) : DialogWrapper(f
320323
ui.showComponents(componentType)
321324
}
322325

326+
private fun updateVoicesAndFixSelection() {
327+
val currentVoice = commonStates.ttsVoice
328+
val supportedVoices = commonStates.ttsModel.getSupportedVoices()
329+
if (currentVoice !in supportedVoices) {
330+
commonStates.ttsVoice = supportedVoices.first()
331+
}
332+
ui.ttsVoiceComboBox.model = CollectionComboBoxModel(supportedVoices, commonStates.ttsVoice)
333+
}
334+
323335
private fun showTipsIfAzureChecked() {
324336
if (provider == ServiceProvider.Azure) {
325337
val id = TranslationPlugin.generateId("tooltip.openai.azure")

src/main/kotlin/cn/yiiguxing/plugin/translate/util/Http.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ object Http {
2020

2121
const val MIME_TYPE_FORM = "application/x-www-form-urlencoded"
2222

23-
const val CHROMIUM_VERSION = "130.0.2849.68"
23+
const val CHROMIUM_VERSION = "144.0.3719.92"
2424

2525
val CHROMIUM_MAJOR_VERSION: Int = CHROMIUM_VERSION.substringBefore('.').toInt()
2626

src/main/resources/META-INF/actions/jupyter.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
<separator/>
88

99
<add-to-group group-id="JupyterEditorPopupActions" relative-to-action="EditorCopy" anchor="before"/>
10-
<add-to-group group-id="JupyterConsoleEditorPopupActions" anchor="first"/>
1110
</group>
1211
<group id="Translation.JupyterOutputPopupActions">
1312
<separator/>

0 commit comments

Comments
 (0)