Skip to content

Commit

Permalink
feat: add option force-override
Browse files Browse the repository at this point in the history
  • Loading branch information
huglx committed Oct 15, 2024
1 parent 2f0c314 commit bdf8f9b
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ enum class ImportTranslationResolution {
KEEP,
OVERRIDE,
NEW,
FORCE_OVERRIDE,
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ class ImportTranslationResolvableDto(
- KEEP: Translation is not changed
- OVERRIDE: Translation is overridden
- NEW: New translation is created)
- NEW: New translation is created
- FORCE_OVERRIDE: Translation is updated, created or kept.
""",
example = "OVERRIDE",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package io.tolgee.service.key

import io.tolgee.constants.Message
import io.tolgee.dtos.KeyImportResolvableResult
import io.tolgee.dtos.cacheable.LanguageDto
import io.tolgee.dtos.request.ScreenshotInfoDto
import io.tolgee.dtos.request.translation.importKeysResolvable.ImportKeysResolvableItemDto
import io.tolgee.dtos.request.translation.importKeysResolvable.ImportTranslationResolution
Expand All @@ -11,11 +12,7 @@ import io.tolgee.exceptions.NotFoundException
import io.tolgee.exceptions.PermissionException
import io.tolgee.formats.convertToIcuPlurals
import io.tolgee.formats.convertToPluralIfAnyIsPlural
import io.tolgee.model.Language
import io.tolgee.model.Project
import io.tolgee.model.Project_
import io.tolgee.model.Screenshot
import io.tolgee.model.UploadedImage
import io.tolgee.model.*
import io.tolgee.model.enums.Scope
import io.tolgee.model.key.Key
import io.tolgee.model.key.Key_
Expand Down Expand Up @@ -91,6 +88,18 @@ class ResolvingKeyImporter(
}
}

if (resolvable.resolution == ImportTranslationResolution.FORCE_OVERRIDE) {
addOrUpdateTranslation(
key,
language,
resolvable.text,
translationsToModify::add,
isNew,
existingTranslation,
)
return@translations
}

if (isEmpty || (!isNew && resolvable.resolution == ImportTranslationResolution.OVERRIDE)) {
translationsToModify.add(TranslationToModify(existingTranslation!!, resolvable.text, false))
return@translations
Expand All @@ -116,6 +125,28 @@ class ResolvingKeyImporter(
return result
}

private fun addOrUpdateTranslation(
key: Key,
language: LanguageDto,
translationText: String,
addToList: (TranslationToModify) -> Boolean,
new: Boolean,
existingTranslation: Translation?,
) {
if (new) {
val translation =
Translation(translationText).apply {
this.key = key
this.language = entityManager.getReference(Language::class.java, language.id)
}
addToList(TranslationToModify(translation, translationText, true))
} else {
if (existingTranslation != null) {
addToList(TranslationToModify(existingTranslation, translationText, false))
}
}
}

private fun handlePluralizationAndSave(
isExistingKeyPlural: Boolean,
translationsToModify: MutableList<TranslationToModify>,
Expand Down Expand Up @@ -180,10 +211,11 @@ class ResolvingKeyImporter(
val locations = images.map { it.location }

val allReferences =
screenshotService.getKeyScreenshotReferences(
importedKeys,
locations,
).toMutableList()
screenshotService
.getKeyScreenshotReferences(
importedKeys,
locations,
).toMutableList()

val referencesToDelete = mutableListOf<KeyScreenshotReference>()

Expand Down Expand Up @@ -253,6 +285,10 @@ class ResolvingKeyImporter(
key: Key,
languageTag: String,
): Boolean {
if (resolvable.resolution == ImportTranslationResolution.FORCE_OVERRIDE) {
return false
}

if (translationExists && resolvable.resolution == ImportTranslationResolution.NEW) {
errors.add(
listOf(Message.TRANSLATION_EXISTS.code, key.namespace?.name, key.name, languageTag),
Expand Down Expand Up @@ -308,12 +344,13 @@ class ResolvingKeyImporter(
val namespaceJoin: Join<Key, Namespace> = root.fetch(Key_.namespace, JoinType.LEFT) as Join<Key, Namespace>

val predicates =
keys.map { (namespace, name) ->
cb.and(
cb.equal(root.get(Key_.name), name),
cb.equalNullable(namespaceJoin.get(Namespace_.name), namespace),
)
}.toTypedArray()
keys
.map { (namespace, name) ->
cb.and(
cb.equal(root.get(Key_.name), name),
cb.equalNullable(namespaceJoin.get(Namespace_.name), namespace),
)
}.toTypedArray()

val projectIdPath = root.get(Key_.project).get(Project_.id)

Expand All @@ -323,10 +360,12 @@ class ResolvingKeyImporter(
}

private val existingKeys by lazy {
this.getAllByNamespaceAndName(
projectId = projectEntity.id,
keys = keysToImport.map { it.namespace to it.name },
).associateBy { (it.namespace?.name to it.name) }.toMutableMap()
this
.getAllByNamespaceAndName(
projectId = projectEntity.id,
keys = keysToImport.map { it.namespace to it.name },
).associateBy { (it.namespace?.name to it.name) }
.toMutableMap()
}

private val languages by lazy {
Expand All @@ -335,16 +374,19 @@ class ResolvingKeyImporter(
}

private val keyLanguagesMap by lazy {
keysToImport.mapNotNull {
val key = existingKeys[it.namespace to it.name] ?: return@mapNotNull null
val keyLanguages = it.translations.keys.mapNotNull { tag -> languages[tag] }
key to keyLanguages
}.toMap()
keysToImport
.mapNotNull {
val key = existingKeys[it.namespace to it.name] ?: return@mapNotNull null
val keyLanguages = it.translations.keys.mapNotNull { tag -> languages[tag] }
key to keyLanguages
}.toMap()
}

private val existingTranslations by lazy {
translationService.get(keyLanguagesMap)
.groupBy { it.key.namespace?.name to it.key.name }.map { (key, translations) ->
translationService
.get(keyLanguagesMap)
.groupBy { it.key.namespace?.name to it.key.name }
.map { (key, translations) ->
key to translations.associateBy { it.language.tag }
}.toMap()
}
Expand Down

0 comments on commit bdf8f9b

Please sign in to comment.