ali-translator / buffered-translation
手动粘贴到文档中的文本通过缓冲翻译,使用一种方法(适用于数据库来源)
v1.2.3
2024-07-16 12:54 UTC
Requires
- php: ^7.4
- ext-intl: *
- ali-translator/text-template: ^1.0.2
- ali-translator/translator: ^0
Requires (Dev)
- php: ^7.4
- phpunit/phpunit: ^9.0
- symfony/var-dumper: ^5.0
Suggests
- ali-translator/auto-html-translation: Parses html document, and translate included texts
- ali-translator/translator-js-integrate: Integrate this packet to frontend js
- ali-translator/url-template: Helps on url parameters resolving (as language, country, etc.)
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
建议的软件包
- ali-translator/translator-js-integrate - 将此软件包集成到前端js中
- ali-translator/auto-html-translation - 解析html文档,并翻译包含的文本
- ali-translator/url-template - 帮助解决URL语言解析问题
测试
在数据包中存在docker-compose文件,并提供了测试环境。
docker-compose run php composer install docker-compose run php vendor/bin/phpunit