Skip to content

Commit

Permalink
fix: Error on translation to the same language.
Browse files Browse the repository at this point in the history
MT Error doesn't end with 500 anymore, but only with logged error
  • Loading branch information
JanCizmar committed Mar 29, 2022
1 parent 4717886 commit fd3f497
Show file tree
Hide file tree
Showing 10 changed files with 366 additions and 338 deletions.
@@ -1,7 +1,7 @@
package io.tolgee.cache

import io.tolgee.AbstractSpringTest
import io.tolgee.component.machineTranslation.providers.AwsTranslationProvider
import io.tolgee.component.machineTranslation.providers.AwsMtValueProvider
import io.tolgee.component.machineTranslation.providers.GoogleTranslationProvider
import io.tolgee.constants.Caches
import io.tolgee.constants.MtServiceType
Expand Down Expand Up @@ -50,7 +50,7 @@ abstract class AbstractCacheTest : AbstractSpringTest() {

@Autowired
@MockBean
lateinit var awsTranslationProvider: AwsTranslationProvider
lateinit var awsTranslationProvider: AwsMtValueProvider

@BeforeEach
fun setup() {
Expand Down
@@ -1,17 +1,17 @@
package io.tolgee.component.machineTranslation

import io.sentry.Sentry
import io.tolgee.configuration.tolgee.InternalProperties
import io.tolgee.constants.Caches
import io.tolgee.constants.MtServiceType
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking
import org.springframework.beans.factory.annotation.Autowired
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.config.ConfigurableBeanFactory
import org.springframework.cache.CacheManager
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.Lazy
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Component

Expand All @@ -28,9 +28,7 @@ class MtServiceManager(
private val cacheManager: CacheManager
) {

@set:Autowired
@set:Lazy
lateinit var mtServiceManagerCachingProxy: MtServiceManagerCachingProxy
private val logger = LoggerFactory.getLogger(this::class.java)

private val providers by lazy {
MtServiceType.values().associateWith { applicationContext.getBean(it.providerClass) }
Expand All @@ -55,9 +53,6 @@ class MtServiceManager(
}
}

/**
* Translates a text using All services
*/
fun translate(
text: String,
sourceLanguageTag: String,
Expand All @@ -70,23 +65,55 @@ class MtServiceManager(
return getFaked(params)
}

return findInCache(params) ?: translateWithProvider(params)
}

private fun findInCache(
params: TranslationParams,
): TranslateResult? {
return params.findInCache()?.let {
TranslateResult(
translatedText = it,
actualPrice = 0,
usedService = serviceType
usedService = params.serviceType
)
} ?: let {
val price = calculatePrice(params.text, params.serviceType)
val result = TranslateResult(
params.serviceType.getProvider()
.translate(params.text, params.sourceLanguageTag, params.targetLanguageTag),
price,
params.serviceType
}
}

private fun translateWithProvider(params: TranslationParams): TranslateResult {
var translated: String? = null
try {
translated = params.serviceType.getProvider()
.translate(params.text, params.sourceLanguageTag, params.targetLanguageTag)
} catch (e: Exception) {
logger.error(
"""An exception occurred while translating
|text "${params.text}"
|from ${params.sourceLanguageTag}
|to ${params.targetLanguageTag}"""".trimMargin()
)
result.translatedText?.let { params.cacheResult(it) }
return result
logger.error(e.stackTraceToString())
Sentry.captureException(e)
}

val price = translated?.let {
calculatePrice(
params.text,
params.serviceType,
params.sourceLanguageTag,
params.targetLanguageTag
)
} ?: 0

val result = TranslateResult(
translated,
price,
params.serviceType
)

result.translatedText?.let { params.cacheResult(it) }

return result
}

private fun getParams(
Expand All @@ -107,7 +134,7 @@ class MtServiceManager(
return TranslateResult(
"${params.text} translated with ${params.serviceType.name} " +
"from ${params.sourceLanguageTag} to ${params.targetLanguageTag}",
calculatePrice(params.text, params.serviceType),
calculatePrice(params.text, params.serviceType, params.sourceLanguageTag, params.targetLanguageTag),
params.serviceType
)
}
Expand Down Expand Up @@ -161,15 +188,25 @@ class MtServiceManager(
/**
* Returns sum price of all translations
*/
fun calculatePrice(text: String, service: MtServiceType): Int {
return service.getProvider().calculatePrice(text)
fun calculatePrice(
text: String,
service: MtServiceType,
sourceLanguageTag: String,
targetLanguageTag: String
): Int {
return service.getProvider().calculatePrice(text, sourceLanguageTag, targetLanguageTag)
}

/**
* Returns sum price of all translations
*/
fun calculatePriceAll(text: String, services: List<MtServiceType>): Int {
return services.getProviders().values.sumOf { it.calculatePrice(text) }
fun calculatePriceAll(
text: String,
services: List<MtServiceType>,
sourceLanguageTag: String,
targetLanguageTag: String
): Int {
return services.getProviders().values.sumOf { it.calculatePrice(text, sourceLanguageTag, targetLanguageTag) }
}

fun List<MtServiceType>.getProviders():
Expand Down

This file was deleted.

Expand Up @@ -11,5 +11,5 @@ interface MtValueProvider {
/**
* Calculates credit price of the provider
*/
fun calculatePrice(text: String): Int
fun calculatePrice(text: String, sourceLanguageTag: String, targetLanguageTag: String): Int
}
@@ -0,0 +1,54 @@
package io.tolgee.component.machineTranslation.providers

import io.tolgee.component.machineTranslation.LanguageTagConvertor
import io.tolgee.component.machineTranslation.MtValueProvider

abstract class AbstractMtValueProvider : MtValueProvider {
abstract val supportedLanguages: Array<String>

private val String.toSuitableTag: String?
get() {
return LanguageTagConvertor.findSuitableTag(supportedLanguages, this)
}

override fun translate(text: String, sourceLanguageTag: String, targetLanguageTag: String): String? {
val suitableSourceTag = sourceLanguageTag.toSuitableTag
val suitableTargetTag = targetLanguageTag.toSuitableTag

if (suitableSourceTag.isNullOrEmpty() || suitableTargetTag.isNullOrEmpty()) {
return null
}

if (suitableSourceTag == suitableTargetTag) {
return text
}

return translateViaProvider(text, suitableSourceTag, suitableTargetTag)
}

override fun calculatePrice(text: String, sourceLanguageTag: String, targetLanguageTag: String): Int {
val suitableSourceTag = sourceLanguageTag.toSuitableTag
val suitableTargetTag = targetLanguageTag.toSuitableTag

if (suitableSourceTag.isNullOrEmpty() ||
suitableTargetTag.isNullOrEmpty() ||
suitableSourceTag == suitableTargetTag
) {
return 0
}

return calculateProviderPrice(text)
}

/**
* Translates the text via provider.
* All inputs are already checked.
*/
protected abstract fun translateViaProvider(text: String, sourceTag: String, targetTag: String): String?

/**
* Calculates provider's credit price.
* All inputs are already checked.
*/
protected abstract fun calculateProviderPrice(text: String): Int
}
@@ -0,0 +1,115 @@
package io.tolgee.component.machineTranslation.providers

import com.amazonaws.services.translate.AmazonTranslate
import com.amazonaws.services.translate.model.TranslateTextRequest
import com.amazonaws.services.translate.model.TranslateTextResult
import io.tolgee.configuration.tolgee.machineTranslation.AwsMachineTranslationProperties
import org.springframework.beans.factory.config.ConfigurableBeanFactory
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Component

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
class AwsMtValueProvider(
private val awsMachineTranslationProperties: AwsMachineTranslationProperties,
private val amazonTranslate: AmazonTranslate?
) : AbstractMtValueProvider() {
override val isEnabled: Boolean
get() = !awsMachineTranslationProperties.accessKey.isNullOrEmpty() &&
!awsMachineTranslationProperties.secretKey.isNullOrEmpty()

override fun calculateProviderPrice(text: String): Int {
return text.length * 100
}

override fun translateViaProvider(text: String, sourceTag: String, targetTag: String): String? {
val request: TranslateTextRequest = TranslateTextRequest()
.withText(text)
.withSourceLanguageCode(sourceTag)
.withTargetLanguageCode(targetTag)
val result: TranslateTextResult = translateService.translateText(request)
return result.translatedText
}

private val translateService by lazy {
amazonTranslate ?: throw IllegalStateException("AmazonTranslate is not injected")
}

override val supportedLanguages = arrayOf(
"af",
"sq",
"am",
"ar",
"hy",
"az",
"bn",
"bs",
"bg",
"ca",
"zh",
"zh-TW",
"hr",
"cs",
"da ",
"fa-AF",
"nl ",
"en",
"et",
"fa",
"tl",
"fi",
"fr",
"fr-CA",
"ka",
"de",
"el",
"gu",
"ht",
"ha",
"he ",
"hi",
"hu",
"is",
"id ",
"ga",
"it",
"ja",
"kn",
"kk",
"ko",
"lv",
"lt",
"mk",
"ms",
"ml",
"mt",
"mr",
"mn",
"no",
"ps",
"pl",
"pt",
"pt-PT",
"pa",
"ro",
"ru",
"sr",
"si",
"sk",
"sl",
"so",
"es",
"es-MX",
"sw",
"sv",
"ta",
"te",
"th",
"tr",
"uk",
"ur",
"uz",
"vi",
"cy"
)
}

0 comments on commit fd3f497

Please sign in to comment.