From edad1e10a23fa7a8e8720aecb09ae2dd8bec18ec Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 9 Jul 2021 10:16:39 +0300 Subject: [PATCH] Fix for placeholder parameters changing names and becoming out of sync with existing translations. Relevant to #4402 --- .../translations/TranslationFileWriter.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/com/unciv/models/translations/TranslationFileWriter.kt b/core/src/com/unciv/models/translations/TranslationFileWriter.kt index 2d984e7726..ba96ef4683 100644 --- a/core/src/com/unciv/models/translations/TranslationFileWriter.kt +++ b/core/src/com/unciv/models/translations/TranslationFileWriter.kt @@ -109,6 +109,24 @@ object TranslationFileWriter { translationsOfThisLanguage++ } else stringBuilder.appendLine(" # Requires translation!") + // THE PROBLEM + // When we come to change params written in the TranslationFileWriter, + // this messes up the param name matching in existing translations. + // Tests fail and much manual work was required. + // SO, as a fix, for each translation where a single param is different than in the source line, + // we try to autocorrect it. + if (translationValue.contains('[')) { + val paramsOfKey = translationKey.getPlaceholderParameters() + val paramsOfValue = translationValue.getPlaceholderParameters() + val paramsOfKeyNotInValue = paramsOfKey.filterNot { it in paramsOfValue } + val paramsOfValueNotInKey = paramsOfValue.filterNot { it in paramsOfKey } + if (paramsOfKeyNotInValue.size == 1 && paramsOfValueNotInKey.size == 1) + translationValue = translationValue.replace( + "[" + paramsOfValueNotInKey.first() + "]", + "[" + paramsOfKeyNotInValue.first() + "]" + ) + } + val lineToWrite = translationKey.replace("\n", "\\n") + " = " + translationValue.replace("\n", "\\n") stringBuilder.appendLine(lineToWrite) @@ -204,7 +222,7 @@ object TranslationFileWriter { || parameter == "non-fresh water" || parameter == "Open Terrain" || parameter == "Rough Terrain" - -> "terrain" + -> "tileFilter" RulesetCache.getBaseRuleset().units.containsKey(parameter) -> "unit" RulesetCache.getBaseRuleset().tileImprovements.containsKey(parameter) || parameter == "Great Improvement"