From d7d79b8770c46d08b2b0c26da35cc927fbb61eeb Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Fri, 1 Sep 2023 12:27:42 +1200 Subject: [PATCH] FIX Remove translation values that match english source values --- src/Translator.php | 87 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/Translator.php b/src/Translator.php index 342954e..f7b198a 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -56,8 +56,10 @@ public function run() $this->setJsonAndYmlFileTimes(); $this->transifexPullSource(); $this->mergeYaml(); + $this->removeEnglishStringsFromYamlTranslations(); $this->cleanYaml(); $this->mergeJson(); + $this->removeEnglishStringsFromJsonTranslations(); } if ($this->doCollectStrings) { $this->collectStrings(); @@ -304,6 +306,55 @@ private function mergeYaml(): void $this->log('Finished merging ' . count($this->originalYaml) . ' yaml files'); } + /** + * Transifex may add english strings to translation yaml files, remove them + */ + private function removeEnglishStringsFromYamlTranslations(): void + { + $this->log('Removing english from yml translation files'); + $enPath = ''; + $enYaml = null; + $count = 0; + foreach (array_keys($this->originalYaml) as $path) { + if (!file_exists($path)) { + continue; + } + if (!$enPath) { + $enPath = preg_replace('#/[^/\.]+\.yml#', '/en.yml', $path); + } + if (!$enYaml) { + $enYaml = Yaml::parse(file_get_contents($enPath)); + } + if ($enPath === $path) { + continue; + } + // Remove any keys where the value is the same as the source english value + $contentYaml = Yaml::parse(file_get_contents($path)); + foreach (array_keys($contentYaml) as $countryCode) { + foreach (array_keys($contentYaml[$countryCode]) as $className) { + foreach (array_keys($contentYaml[$countryCode][$className]) as $key) { + $value = $contentYaml[$countryCode][$className][$key] ?? null; + $enValue = $enYaml['en'][$className][$key] ?? null; + if ($value === $enValue) { + unset($contentYaml[$countryCode][$className][$key]); + $count++; + } + // Remove any className nodes that have had all their keys removed + if ( + isset($contentYaml[$countryCode][$className]) + && empty($contentYaml[$countryCode][$className]) + ) { + unset($contentYaml[$countryCode][$className]); + } + } + } + } + // Write back to local + file_put_contents($path, Yaml::dump($contentYaml)); + } + $this->log("Removed $count english string(s) from yml translation files"); + } + private $blankEnStrings; private function removeBlankStrings(array &$sourceData) @@ -397,6 +448,42 @@ private function mergeJson(): void $this->log('Finished merging ' . count($this->originalJson) . ' json files'); } + /** + * Transifex may add english strings to translation json files, remove them + */ + private function removeEnglishStringsFromJsonTranslations(): void + { + $this->log('Removing english from json translation files'); + $enPath = ''; + $enJson = null; + $count = 0; + foreach (array_keys($this->originalJson) as $path) { + if (!file_exists($path)) { + continue; + } + if (!$enPath) { + $enPath = preg_replace('#/[^/\.]+\.json$#', '/en.json', $path); + } + if (!$enJson) { + $enJson = $this->jsonDecode(file_get_contents($enPath)); + } + if ($enPath === $path) { + continue; + } + // Remove any keys where the value is the same as the source english value + $contentJson = $this->jsonDecode(file_get_contents($path)); + foreach (array_keys($contentJson) as $key) { + if (array_key_exists($key, $enJson) && $enJson[$key] === $contentJson[$key]) { + unset($contentJson[$key]); + $count++; + } + } + // Write back to local + file_put_contents($path, $this->jsonEncode($contentJson)); + } + $this->log("Removed $count english string(s) from json translation files"); + } + /** * Run text collector on the given modules */