Skip to content

Commit

Permalink
Merge branch 'refs/heads/v3.6/next' into v3.6/213
Browse files Browse the repository at this point in the history
  • Loading branch information
YiiGuxing committed Jul 23, 2024
2 parents a12e3cd + 8cd8fff commit 08b4fe9
Show file tree
Hide file tree
Showing 18 changed files with 271 additions and 191 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@

## [3.6.3] (2024/07/22)

- The GPT-4o mini is now available in the OpenAI Translator engine.
- Alibaba Translate can now return the detected language.
- Fixed the issue where clicking on the status bar widget had no effect.
- GPT-4o mini 现已在 OpenAI 翻译引擎中可用
- 阿里翻译现在能返回检测到的语言
- 修复了状态栏徽标点击无效的问题

## [3.6.3] (2024/07/22)

- The GPT-4o mini is now available in the OpenAI Translator engine.
- Alibaba Translate can now return the detected language.
- Bug fixes.
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ pluginGroup = cn.yiiguxing.plugin.translate
pluginRepositoryUrl = https://github.com/YiiGuxing/TranslationPlugin

# SemVer format -> https://semver.org
pluginMajorVersion = 3.6.3
pluginMajorVersion = 3.6.4
pluginPreReleaseVersion =
pluginBuildMetadata =
autoSnapshotVersion = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ package cn.yiiguxing.plugin.translate.action
import cn.yiiguxing.intellij.compat.action.UpdateInBackgroundCompatComboBoxAction
import cn.yiiguxing.plugin.translate.message
import cn.yiiguxing.plugin.translate.trans.TranslateService
import cn.yiiguxing.plugin.translate.util.concurrent.errorOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.expireWith
import cn.yiiguxing.plugin.translate.util.concurrent.finishOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.*
import com.intellij.ide.DataManager
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.*
Expand Down Expand Up @@ -64,15 +61,20 @@ class SwitchEngineAction : UpdateInBackgroundCompatComboBoxAction(), DumbAware,
isActionPerforming = true
val component = e.getData(PlatformDataKeys.CONTEXT_COMPONENT)
val expireDisposable = getDisposable()
runAsync { TranslationEngineActionGroup() }
.expireWith(expireDisposable)
.successOnUiThread { group ->
if (isActionPerforming && !project.isDisposed) {
val dataContext = DataManager.getInstance().getDataContext(component)
group.createActionPopup(dataContext).showCenteredInCurrentWindow(project)
}
asyncLatch { latch ->
runAsync {
latch.await()
TranslationEngineActionGroup()
}
.finishOnUiThread(ModalityState.any()) { isActionPerforming = false }
.expireWith(expireDisposable)
.successOnUiThread { group ->
if (isActionPerforming && !project.isDisposed) {
val dataContext = DataManager.getInstance().getDataContext(component)
group.createActionPopup(dataContext).showCenteredInCurrentWindow(project)
}
}
.finishOnUiThread(ModalityState.any()) { isActionPerforming = false }
}
}

override fun createPopupActionGroup(button: JComponent): DefaultActionGroup {
Expand Down Expand Up @@ -112,18 +114,23 @@ class SwitchEngineAction : UpdateInBackgroundCompatComboBoxAction(), DumbAware,
isButtonActionPerforming = true
val expireDisposable = getDisposable()
Disposer.register(expireDisposable) { isButtonActionPerforming = false }
runAsync { TranslationEngineActionGroup() }
.expireWith(expireDisposable)
.successOnUiThread { group ->
if (isButtonActionPerforming && isShowing) {
actionGroup = group
super.fireActionPerformed(event)
} else {
isButtonActionPerforming = false
}
asyncLatch { latch ->
runAsync {
latch.await()
TranslationEngineActionGroup()
}
.errorOnUiThread(ModalityState.any()) { isButtonActionPerforming = false }
.finishOnUiThread(ModalityState.any()) { disposable = null }
.expireWith(expireDisposable)
.successOnUiThread { group ->
if (isButtonActionPerforming && isShowing) {
actionGroup = group
super.fireActionPerformed(event)
} else {
isButtonActionPerforming = false
}
}
.errorOnUiThread(ModalityState.any()) { isButtonActionPerforming = false }
.finishOnUiThread(ModalityState.any()) { disposable = null }
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import cn.yiiguxing.plugin.translate.tts.TTSEngine
import cn.yiiguxing.plugin.translate.ui.settings.TranslationEngine
import cn.yiiguxing.plugin.translate.util.DisposableRef
import cn.yiiguxing.plugin.translate.util.Notifications
import cn.yiiguxing.plugin.translate.util.concurrent.asyncLatch
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
import com.intellij.notification.Notification
import com.intellij.notification.NotificationAction
Expand Down Expand Up @@ -38,12 +39,16 @@ class CheckGoogleNetworkStartupActivity : BaseStartupActivity() {

override fun onRunActivity(project: Project) {
val projectRef = DisposableRef.create(TranslationUIManager.disposable(project), project)
runAsync { TKK.testConnection() }
.successOnUiThread(projectRef, ModalityState.NON_MODAL) { p, res ->
asyncLatch { latch ->
runAsync {
latch.await()
TKK.testConnection()
}.successOnUiThread(projectRef, ModalityState.NON_MODAL) { p, res ->
if (!p.isDisposed && !res) {
showNotification(p)
}
}
}
}

private fun showNotification(project: Project) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cn.yiiguxing.plugin.translate.trans
import cn.yiiguxing.plugin.translate.action.TranslationEngineActionGroup
import cn.yiiguxing.plugin.translate.message
import cn.yiiguxing.plugin.translate.util.Notifications
import cn.yiiguxing.plugin.translate.util.concurrent.asyncLatch
import cn.yiiguxing.plugin.translate.util.concurrent.finishOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
import cn.yiiguxing.plugin.translate.util.e
Expand Down Expand Up @@ -65,15 +66,20 @@ object TranslationNotifications {
return
}
isActionPerforming = true
runAsync { TranslationEngineActionGroup() }
.successOnUiThread { group ->
asyncLatch { latch ->
runAsync {
latch.await()
TranslationEngineActionGroup()
}.successOnUiThread { group ->
if (component.isShowing) {
// Do not use `e.dataContext` directly because it is not an async data context.
val dataContext = DataManager.getInstance().getDataContext(component)
group.showActionPopup(dataContext)
}
}.finishOnUiThread(ModalityState.any()) {
isActionPerforming = false
}
.finishOnUiThread(ModalityState.any()) { isActionPerforming = false }
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ import cn.yiiguxing.plugin.translate.message
import cn.yiiguxing.plugin.translate.ui.LogoHeaderPanel
import cn.yiiguxing.plugin.translate.ui.UI
import cn.yiiguxing.plugin.translate.util.DisposableRef
import cn.yiiguxing.plugin.translate.util.concurrent.disposeAfterProcessing
import cn.yiiguxing.plugin.translate.util.concurrent.errorOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.expireWith
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
import cn.yiiguxing.plugin.translate.util.concurrent.*
import cn.yiiguxing.plugin.translate.util.getCommonMessage
import cn.yiiguxing.plugin.translate.util.w
import com.intellij.openapi.diagnostic.thisLogger
Expand Down Expand Up @@ -151,16 +148,21 @@ class DeeplSettingsDialog : DialogWrapper(false) {
postUsageInfo(service, null)

val dialogRef = DisposableRef.create(disposable, this)
runAsync { service.getUsage() }
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, usage ->
dialog.postUsageInfo(service, usage)
asyncLatch { latch ->
runAsync {
latch.await()
service.getUsage()
}
.errorOnUiThread(dialogRef) { dialog, error ->
thisLogger().w("Failed to get usage info.", error)
dialog.postUsageInfo(service, null, error)
}
.disposeAfterProcessing(dialogRef)
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, usage ->
dialog.postUsageInfo(service, usage)
}
.errorOnUiThread(dialogRef) { dialog, error ->
thisLogger().w("Failed to get usage info.", error)
dialog.postUsageInfo(service, null, error)
}
.disposeAfterProcessing(dialogRef)
}
}

private fun postUsageInfo(service: DeeplService, usage: DeeplService.Usage?, throwable: Throwable? = null) {
Expand Down Expand Up @@ -190,14 +192,19 @@ class DeeplSettingsDialog : DialogWrapper(false) {
// This is a modal dialog, so it needs to be invoked later.
SwingUtilities.invokeLater {
val dialogRef = DisposableRef.create(disposable, this)
runAsync { DeeplCredential.authKey to DeeplCredential.isAuthKeySet }
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, (key, isAuthKeySet) ->
dialog.authKey = key
dialog.isOK = isAuthKeySet
dialog.doGetUsageInfo()
asyncLatch { latch ->
runAsync {
latch.await()
DeeplCredential.authKey to DeeplCredential.isAuthKeySet
}
.disposeAfterProcessing(dialogRef)
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, (key, isAuthKeySet) ->
dialog.authKey = key
dialog.isOK = isAuthKeySet
dialog.doGetUsageInfo()
}
.disposeAfterProcessing(dialogRef)
}
}
super.show()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import cn.yiiguxing.plugin.translate.trans.openai.*
import cn.yiiguxing.plugin.translate.ui.selected
import cn.yiiguxing.plugin.translate.ui.settings.TranslationEngine
import cn.yiiguxing.plugin.translate.util.DisposableRef
import cn.yiiguxing.plugin.translate.util.concurrent.asyncLatch
import cn.yiiguxing.plugin.translate.util.concurrent.disposeAfterProcessing
import cn.yiiguxing.plugin.translate.util.concurrent.expireWith
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
Expand Down Expand Up @@ -298,20 +299,23 @@ class OpenAISettingsDialog(private val configType: ConfigType) : DialogWrapper(f
// This is a modal dialog, so it needs to be invoked later.
SwingUtilities.invokeLater {
val dialogRef = DisposableRef.create(disposable, this)
runAsync {
ApiKeys(
OpenAiCredentials.manager(ServiceProvider.OpenAI).credential,
OpenAiCredentials.manager(ServiceProvider.Azure).credential
)
}
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, apiKeys ->
dialog.apiKeys.copyFrom(apiKeys)
dialog.ui.apiKeyField.text = apiKeys[dialog.provider]
dialog.isApiKeySet = !apiKeys[dialog.provider].isNullOrEmpty()
dialog.verify()
asyncLatch { latch ->
runAsync {
latch.await()
ApiKeys(
OpenAiCredentials.manager(ServiceProvider.OpenAI).credential,
OpenAiCredentials.manager(ServiceProvider.Azure).credential
)
}
.disposeAfterProcessing(dialogRef)
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, apiKeys ->
dialog.apiKeys.copyFrom(apiKeys)
dialog.ui.apiKeyField.text = apiKeys[dialog.provider]
dialog.isApiKeySet = !apiKeys[dialog.provider].isNullOrEmpty()
dialog.verify()
}
.disposeAfterProcessing(dialogRef)
}
}

super.show()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import cn.yiiguxing.plugin.translate.ui.UI
import cn.yiiguxing.plugin.translate.ui.selected
import cn.yiiguxing.plugin.translate.ui.settings.TranslationEngine
import cn.yiiguxing.plugin.translate.util.DisposableRef
import cn.yiiguxing.plugin.translate.util.concurrent.asyncLatch
import cn.yiiguxing.plugin.translate.util.concurrent.disposeAfterProcessing
import cn.yiiguxing.plugin.translate.util.concurrent.expireWith
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
Expand Down Expand Up @@ -122,13 +123,18 @@ class YoudaoSettingsDialog : DialogWrapper(true) {
// This is a modal dialog, so it needs to be invoked later.
SwingUtilities.invokeLater {
val dialogRef = DisposableRef.create(disposable, this)
runAsync { credentialSettings.getAppKey() to credentialSettings.isAppKeySet }
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, (appKey, isAppKeySet) ->
dialog.appKey = appKey
dialog.isAppKeySet = isAppKeySet
asyncLatch { latch ->
runAsync {
latch.await()
credentialSettings.getAppKey() to credentialSettings.isAppKeySet
}
.disposeAfterProcessing(dialogRef)
.expireWith(disposable)
.successOnUiThread(dialogRef) { dialog, (appKey, isAppKeySet) ->
dialog.appKey = appKey
dialog.isAppKeySet = isAppKeySet
}
.disposeAfterProcessing(dialogRef)
}
}
super.show()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import cn.yiiguxing.plugin.translate.ui.UI.fillX
import cn.yiiguxing.plugin.translate.ui.UI.migLayout
import cn.yiiguxing.plugin.translate.ui.UI.wrap
import cn.yiiguxing.plugin.translate.util.DisposableRef
import cn.yiiguxing.plugin.translate.util.concurrent.asyncLatch
import cn.yiiguxing.plugin.translate.util.concurrent.disposeAfterProcessing
import cn.yiiguxing.plugin.translate.util.concurrent.expireWith
import cn.yiiguxing.plugin.translate.util.concurrent.successOnUiThread
Expand Down Expand Up @@ -67,13 +68,18 @@ class AppKeySettingsPanel(
appIdField.text = appKeySettings.appId
appKey = ""
val ref = DisposableRef.create(this, this)
runAsync { appKeySettings.getAppKey() to appKeySettings.isAppKeySet }
.expireWith(this)
.successOnUiThread(ref) { panel, (key, isAppKeySet) ->
panel.appKey = key
panel.isAppKeySet = isAppKeySet
asyncLatch { latch ->
runAsync {
latch.await()
appKeySettings.getAppKey() to appKeySettings.isAppKeySet
}
.disposeAfterProcessing(ref)
.expireWith(this)
.successOnUiThread(ref) { panel, (key, isAppKeySet) ->
panel.appKey = key
panel.isAppKeySet = isAppKeySet
}
.disposeAfterProcessing(ref)
}
}

fun apply() {
Expand Down
Loading

0 comments on commit 08b4fe9

Please sign in to comment.