ali-translator/buffered-translation

手动粘贴到文档中的文本通过缓冲翻译,使用一种方法(适用于数据库来源)

v1.2.3 2024-07-16 12:54 UTC

README

手动粘贴到文档中的文本,使用缓冲,通过一种方法进行翻译(适用于数据库来源)。此软件包包括以下供应商

安装

$ composer require ali-translator/buffered-translation

快速入门

由于此软件包扩展自 ali-translator/translator,您需要创建 $translator 和一个包装器,其包含其翻译的向量 - $plainTranslator

use ALI\BufferTranslation\BufferTranslation;
use ALI\Translator\PlainTranslator\PlainTranslator;
use ALI\Translator\Languages\LanguageRepositoryInterface;

/** @var PlainTranslator $plainTranslator */
/** @var LanguageRepositoryInterface $languageRepository */

$bufferTranslation = new BufferTranslation($plainTranslator, $languageRepository);

将创建的 $bufferTranslation 移动到文档创建过程中

/** @var \ALI\BufferTranslation\BufferTranslation $bufferTranslation */
?>
<h1>
    <?= $bufferTranslation->add('Hello World!') ?>
</h1>
<p>
    <?= $bufferTranslation->add('Hello {name}', ['name' => 'Tom']) ?>    
</p>

使用“逻辑变量”进行复数模板

?>
<p>
    <?= $bufferTranslation->add(
            '{name} has {plural(appleNumbers,"=0[no one apple] =1[one apple] other[many apples]")}', 
            [
                'appleNumbers' => 0,
                'name' => 'Tom',
            ]
    ) ?>
    <?= $bufferTranslation->add($stringFromDb, [], [BufferContentOptions::OPTION_WITH_HTML_ENCODING => true]) ?>  
</p>

自定义翻译后修改

<script>
    alert('<?= $bufferTranslation->add($errorText, [], [
                  BufferContentOptions::MODIFIER_CALLBACK => function (string $translation): string {
                       return Html::escapeJavaScriptStringValue($translation);
                  },
         ]) ?>');
</script>

然后翻译此缓冲文档

use ALI\BufferTranslation\BufferTranslation;

/** @var BufferTranslation $bufferTranslation */
/** @var string $html */

echo $bufferTranslation->translateBuffer($html);

多级参数及其选项

$html = '<div class="test">' . $bufferTranslation->add('Hello {child}. Hi {object}', [
        'child' => [
            'content' => 'Tom and {secondName}',
            'parameters' => [
                'secondName' => [
                    'content' => 'Andrea',
                    'options' => [
                        BufferContentOptions::WITH_CONTENT_TRANSLATION => true,
                    ]
                ],
            ],
        ],
        'object' => 'sun',
    ]) . '</div>';
$translatedHtml = $bufferTranslation->translateBuffer($html);

翻译是递归的。

逻辑变量

模板支持是在基于 "ali-translator/text-template" 软件包的基础上实现的,该软件包也支持“逻辑变量”。这些变量使用“函数”来修改内容。更多详细信息请参阅软件包链接。
示例
Поїздка {uk_choosePrepositionBySonority('Поїздка', 'в/у', 'Львів')} Львів

选项

每个缓冲短语都有翻译选项参数,具有以下功能

  • BufferContentOptions::WITH_CONTENT_TRANSLATION - 此布尔参数表示是否翻译包含的参数。默认情况下,此值设置为“false”。
  • BufferContentOptions::WITH_FALLBACK 此布尔参数确定在找不到翻译时是否返回原始文本。默认情况下,此值设置为“true”。
  • BufferContentOptions::WITH_HTML_ENCODING - 对输出文本使用HTML编码。
  • BufferContentOptions::MODIFIER_CALLBACK - 自定义翻译后修改器。

翻译缓冲文本片段

如果您只需要翻译单个缓冲文本,请使用 translateBufferFragment 方法

$translatedHtml = $bufferTranslation->translateBuffer($pieceOfHtml);

此方法仅翻译给定上下文中的找到的密钥,而不是所有缓冲文本。

翻译缓冲数组

注意:翻译缓冲数组比编译文本的正常翻译效率低,不应被视为首选选项。

/**
* @param array|null $columnsForTranslation - null means "all string columns"
* @param bool $isItBufferFragment - Choose whether you want to translate the entire buffer or only the existing keys in the text
 */
$translatedBufferedArray = $bufferTranslation->translateArrayWithBuffers($bufferedArray, $columnsForTrnasl, $columnsForTranslation);

提示

  • 如果您已经有一个缓冲密钥并想在另一个模板中使用它,可以使用此脚本
$bufferTranslation->add('Some {text}',[
    'text' => $bufferTranslation->getTextTemplateItemByBufferKey($alreadyBufferedTextKey) 
]);
  • 如果您同时使用多个 BufferedTranslation 服务(例如,如果代码中的文本语言和来自数据库的动态文本的语言不同)并且需要在使用第二个模板时使用其中一个文本的翻译,建议这样做
$buffer = $firstBufferTranslation->add('Some {text}',[
    'text' => $secondBufferTranslation->createAndAddTextTemplateItem('текст') 
]);

稍后,在“解决”之前,您需要调用 preTranslateAllInsideTextTemplates 方法,该方法将翻译所有注册的模板

$firstBufferTranslation->preTranslateAllInsideTextTemplates();
$secondBufferTranslation->preTranslateAllInsideTextTemplates();

$buffer = $firstBufferTranslation->translateBuffer($buffer);
$result = $secondBufferTranslation->translateBuffer($buffer);

更多详细信息请参阅测试代码:./tests/unit/FewBufferTranslationServiceAtOnceTest.php

建议的软件包

测试

在数据包中存在docker-compose文件,并提供了测试环境。

docker-compose run php composer install
docker-compose run php vendor/bin/phpunit