vanengers/catalog-translator

翻译MessageCatalog并将其保存到磁盘

v1.0.2 2024-01-04 16:03 UTC

This package is auto-updated.

Last update: 2024-09-04 17:32:29 UTC


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代码转换为区域设置,反之亦然。