vanengers / catalog-translator
翻译MessageCatalog并将其保存到磁盘
Requires
- ext-json: *
- deeplcom/deepl-php: dev-main
- nyholm/psr7: ^1.8@dev
- symfony/filesystem: *
- symfony/http-client: 4.4.51
- symfony/translation: *
Requires (Dev)
- phpunit/phpunit: ^9.5
README
将整个目录翻译并保存到磁盘以便重复使用。默认情况下我们使用DeepL进行翻译,但您可以使用任何您想要的翻译器。
此工具仅用于开发。在生产环境中不应使用此工具。
安装
composer require --dev vanengers/catalog-translator
使用方法
$translator = new Translator( MessageCatalogue $extracted, array $translateTo => [], ?ITranslateClient $external = null, string $translations_config_file = '' );
示例
首先创建一个包含基础语言键的目录,这是您想要从其翻译的语言。因此键与值相同。
$extracted = new \Symfony\Component\Translation\MessageCatalogue('en-GB',[ 'domain' => [ 'This is a base language key' => 'This is a base language key' ] ]);
创建一个要翻译到的区域数组。
$translateTo = ['nl-NL', 'de-DE'];
加载外部翻译器,在这种情况下我们使用DeepL。
$external = new \Vanengers\CatalogTranslator\Client\DeeplClient([ 'api_key' => 'your-deepl-api-key' ]);
存储和检索翻译的JSON文件的位置。如果文件不存在,将创建此文件。如果文件存在,将使用现有翻译,而不会再次进行翻译。
$translations_config_file = __DIR__ . '/translations.json';
外部翻译器
您可以使用任何想要的翻译器,只要它实现了ITranslateClient。
class CustomTranslator implements ITranslateClient {}
可用翻译器
DeepL
$external = new \Vanengers\CatalogTranslator\Client\DeeplClient([ 'api_key' => 'your-deepl-api-key' ]);
语言
每个外部翻译器都有自己的支持语言集。您可以通过在翻译器上调用getSourceLanguages()或getTargetLanguages()方法来检索这些语言。
$languages = $external->getSourceLanguages();
外部翻译器的iso和区域代码并不总是与它们相同。使用config/languages.json文件进行转换。您应该为每个外部客户端执行此操作,以便它与配置文件中的语言匹配。
我们在整个应用程序中使用区域设置,但外部翻译器可能会使用iso代码。这因外部翻译器而异
public function translate(string $text, string $source, string $target): string { $source = $this->fromLocaleToIso($source); $target = $this->fromLocaleToIso($source, true); return $this->api->translateText($text, $source, $target); }
在解析外部翻译器的语言时,将它们转换为区域设置。在这种情况下,我们有来自DeepL的语言对象。但这因外部翻译器而异。
public function getSourceLanguages(): array { return array_map(function(Language $language) { return new Lang($language->code, $language->name, $this->fromIsoToLocale($language->code, false)); }, $this->api->getSourceLanguages()); }
iso/区域转换异常
在catalog-translator中,我们使用区域设置。例如:en-GB受支持。当将区域设置en-GB转换为iso时,我们得到"gb",官方上这是一个正确的iso语言代码。
但是DeepL不允许此代码作为语言源。因此,当它是源语言时,将"gb"翻译为"en"。
但是DeepL接受"en-gb"作为目标语言的iso代码。
因此,在实现新的外部翻译器时请注意!使用languages.json文件将iso代码转换为区域设置,反之亦然。