diff --git a/src/Appwrite/Platform/Tasks/DevGenerateTranslations.php b/src/Appwrite/Platform/Tasks/DevGenerateTranslations.php index 8250c15302..4850534814 100644 --- a/src/Appwrite/Platform/Tasks/DevGenerateTranslations.php +++ b/src/Appwrite/Platform/Tasks/DevGenerateTranslations.php @@ -58,20 +58,34 @@ class DevGenerateTranslations extends Action // \file_put_contents($dir . '/' . $file, \json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | 0)); // continue; + $missingKeys = []; + foreach ($mainKeys as $key) { if (!(\in_array($key, $fileKeys))) { - if ($dryRun) { - Console::warning("{$file} missing translation for {$key}"); - } else { - $language = \explode('.', $file)[0]; + $missingKeys[] = $key; + } + } + + if (\count($missingKeys) > 0) { + if ($dryRun) { + $keys = \implode(', ', $missingKeys); + Console::warning("{$file} missing translation for: {$keys}"); + } else { + $language = \explode('.', $file)[0]; + $json = \json_decode(\file_get_contents($dir . '/' . $file), true); + + foreach ($missingKeys as $missingKey) { $translation = $this->generateTranslation($language, $mainJson[$key]); - $json = \json_decode(\file_get_contents($dir . '/' . $file), true); - $json[$key] = $translation; - \file_put_contents($dir . '/' . $file, \json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | 0)); - - Console::success("Generated {$key} for {$language}"); + // This puts new key at beginning to prevent merge conflict issue and ending comma + $newPair = []; + $newPair[$missingKey] = $translation; + $json = \array_merge($newPair, $json); } + + \file_put_contents($dir . '/' . $file, \json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | 0)); + + Console::success("Generated {$key} for {$language}"); } } } @@ -81,21 +95,24 @@ class DevGenerateTranslations extends Action private function generateTranslation(string $targetLanguage, string $enTranslation): string { - $response = Client::fetch('https://api.openai.com/v1/chat/completions', [ + $placeholders = []; + + $id = 0; + $pattern = '/{{\w+}}/'; + + $enTranslation = preg_replace_callback($pattern, function ($match) use (&$id, &$placeholders) { + $placeholders[$id] = $match[0]; + $key = ""; + $id++; + return $key; + }, $enTranslation); + + $response = Client::fetch('https://api-free.deepl.com/v2/translate', [ 'content-type' => Client::CONTENT_TYPE_APPLICATION_JSON, - 'Authorization' => 'Bearer ' . $this->apiKey + 'Authorization' => 'DeepL-Auth-Key ' . $this->apiKey ], Client::METHOD_POST, [ - 'model' => 'gpt-4-1106-preview', // https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo - 'messages' => [ - [ - 'role' => 'system', - 'content' => "Please translate the message user provides from English language to target language. Target language is language of country with country code {$targetLanguage}. Do not translate text inside {{ and }} placeholders. Provide only translated text." - ], - [ - 'role' => 'user', - 'content' => $enTranslation - ] - ] + 'target_lang' => $targetLanguage, + 'text' => [$enTranslation] ], [], 60); $body = \json_decode($response->getBody(), true); @@ -104,6 +121,14 @@ class DevGenerateTranslations extends Action throw new Exception($response->getBody() . ' with status code ' . $response->getStatusCode() . ' for language ' . $targetLanguage . ' and message ' . $enTranslation); } - return $body['choices'][0]['message']['content']; + $targetTranslation = $body['translations'][0]['text']; + + $id = 0; + foreach ($placeholders as $placeholder) { + $targetTranslation = \str_replace("", $placeholder, $targetTranslation); + $id++; + } + + return $targetTranslation; } }