ali-translator / translator
翻译器
v0.8.8
2024-04-21 09:27 UTC
Requires
- php: >=7.4
Requires (Dev)
- ext-pdo: *
- phpunit/phpunit: ^9.0
- symfony/var-dumper: ^5.0
Suggests
- ali-translator/auto-html-translation: Parses html document, and translate included texts
- ali-translator/buffered-translation: Manually pasted text on document for translation, by means of buffering is translated by one approach (helpful for DB sources)
- 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/translator
简化翻译器
单方向翻译器初始化示例(一个原始语言和一个翻译语言)
use \ALI\Translator\Source\Sources\MySqlSource\MySqlSource; use \ALI\Translator\PlainTranslator\PlainTranslatorFactory; $originalLanguageAlias = 'en'; $translationLanguageAlias = 'ru'; $connection = new PDO(SOURCE_MYSQL_DNS, SOURCE_MYSQL_USER, SOURCE_MYSQL_PASSWORD); $source = new MySqlSource($connection, $originalLanguageAlias); // Install source $installer = $source->generateInstaller(); if($installer->isInstalled()){ $installer->install(); // $installer->destroy(); } $plainTranslator = (new PlainTranslatorFactory())->createPlainTranslator($source, $translationLanguageAlias); $plainTranslator->saveTranslate('Hello','Привет'); $plainTranslator->translate('Hello', true); // -> 'Привет' $plainTranslator->translateAll(['Hello']); // -> ['Привет'] // Try translate not exist phrase $plainTranslator->translate('Goodbye', false); // -> null $plainTranslator->translate('Goodbye', true); // With fallback -> 'Goodbye' $plainTranslator->delete('Hello');
复杂翻译器
如果您需要少量原始和翻译语言,此方法适用于您
use \ALI\Translator\Translator; use \ALI\Translator\Source\SourceInterface; use \ALI\Translator\Source\SourcesCollection; use \ALI\Translator\PlainTranslator\PlainTranslator; /** @var SourceInterface $firsSource */ /** @var SourceInterface $secondSource */ $sourceCollection = new SourcesCollection(); $sourceCollection->addSource($firsSource,['ua', 'ru']); $sourceCollection->addSource($secondSource); // Second source for all another translation languages $translator = new Translator($sourceCollection); $translator->saveTranslate('en', 'ru', 'Hello', 'Привет'); $translator->translate('en', 'ru', 'Hello'); // Also, if you need, you always can transform translator to plainTranslator to work simplification $plainTranslator = new PlainTranslator('en', 'ru', $translator);
参数解析
/** @var \ALI\Translator\PlainTranslator\PlainTranslatorInterface $plainTranslator */ // Simple parameter $translatedPhrase = $plainTranslator->translate('Осталось {number}', true); echo MessageFormatter::formatMessage('ru_RU', $translatedPhrase, ['number' => 25]); // -> 'Осталось 25' // Plural forms $translatedPhrase = $plainTranslator->translate('Осталось {placeLeft, plural, =0{# мест} one{# место} few{# места} other{# мест}}', true); echo MessageFormatter::formatMessage('ru_RU', $translatedPhrase, [ 'placeLeft' => 1, ]); // -> 'Осталось 1 место'
缺失翻译的捕获器
包允许设置在tranlsate
方法失败后运行的短语捕获器
use ALI\Translator\TranslatorInterface; use ALI\Translator\MissingTranslateCatchers\CollectorMissingTranslatesCatcher; /** @var TranslatorInterface $translator */ $translator->addMissingTranslationCatchers(function (string $searchPhrase, TranslatorInterface $translator){ ... }); // Or use existed CollectorMissingTranslatesCatcher $collectorMissingTranslatesCatcher = new CollectorMissingTranslatesCatcher(); $translator->addMissingTranslationCatchers($collectorMissingTranslatesCatcher); $translator->translate('Hello 123'); $collectorMissingTranslatesCatcher->getOriginalPhraseCollectionsByLanguageAlias('ru')->getAll(); // -> ['Hello 123']
短语装饰器
如果您需要在输出之前装饰原始短语或翻译短语,请参阅本部分。
示例,现有装饰器在保存原始短语之前将数字替换为"0",并在翻译后恢复正确的数字。
use ALI\Translator\Decorators\PhraseDecorators\OriginalDecorators\ReplaceNumbersOriginalDecorator; use ALI\Translator\Decorators\PhraseDecorators\OriginalPhraseDecoratorManager; use ALI\Translator\Decorators\PhraseDecorators\TranslateDecorators\RestoreNumbersTranslateDecorator; use ALI\Translator\Decorators\PhraseDecorators\TranslatePhraseDecoratorManager; use ALI\Translator\Decorators\PhraseTranslatorDecorator; use ALI\Translator\TranslatorInterface; use ALI\Translator\PlainTranslator\PlainTranslator; /** @var TranslatorInterface $translator */ $originalDecoratorManger = new OriginalPhraseDecoratorManager([ new ReplaceNumbersOriginalDecorator(), ]); $translateDecoratorManager = new TranslatePhraseDecoratorManager([ new RestoreNumbersTranslateDecorator(), ]); $phraseTranslatorDecorator = new PhraseTranslatorDecorator($translator, $originalDecoratorManger, $translateDecoratorManager); // For simplifying $plainPhraseTranslatorDecorator = new PlainTranslator('en', 'ua', $phraseTranslatorDecorator); $plainPhraseTranslatorDecorator->saveTranslate('Hello 123 Hi 000', 'Привіт 123 Хай 000'); // and when translate text with another numbers, you get previous saved translation $plainPhraseTranslatorDecorator->translate('Hello 555 Hi 8676', true); // -> 'Привіт 555 Хай 8676'
原始分组
可选性,您可以向原始短语添加组。这对于多个不同进程添加原始短语的情况非常有用,当其中一个进程从它们中删除其依赖项时,为了决定是否从翻译器中删除原始短语,请使用组。如果原始短语现在没有组,请删除它们。
use ALI\Translator\OriginalGroups\Repository\Mysql\MysqlOriginalGroupRepository; use ALI\Translator\OriginalGroups\Repository\Mysql\MySqlRepositoryConfig; use ALI\Translator\Source\SourceInterface; use \PDO; /** @var SourceInterface $translatorSource */ /** @var PDO $pdo */ $mysqlConfig = new MySqlRepositoryConfig($pdo); $groupRepositories = new MysqlOriginalGroupRepository($mysqlConfig, $translatorSource); // Installing $installer = $groupRepositories->generateInstaller(); if(!$installer->isInstalled()){ $installer->install(); // $installer->destroy(); } // Use cases $groupRepositories->addGroups(['Hello world','test'],['default','models']); $groupRepositories->getGroups(['Hello world','test']); $groupRepositories->getOriginalsByGroup('default', 0 , 20); $groupRepositories->removeGroups(['Hello world','test'],['default']); $groupRepositories->removeAllGroups(['Hello world','test']);
可用源
- MySqlSource - 建议与 ali-translator/buffered-translation 一起使用以减少对源请求的数量
- CsvFileSource - csv 源。文件将类似于
en-ua.csv
语言
为了方便,该包中集成了几个类,用于帮助处理语言。
LanguageInterface
- 具有方法 getTitle()
、getIsoCode()
和 getAlias()
LanguageRepositoryInterface
- 具有方法 save(LanguageInterface $language, $isActive)
、find($alias)
、findByIsoCode($isoCode)
和 getAll($onlyActive)
以及存储库接口的实现:ArrayLanguageRepository
(ArrayLanguageRepositoryFactory
)和 MySqlLanguageRepository
建议包
- ali-translator/buffered-translation - 通过缓冲区将手动粘贴到文档中的文本进行翻译,对于数据库源非常有用
- ali-translator/translator-js-integrate - 将此包集成到前端 JavaScript
- ali-translator/auto-html-translation - 解析 HTML 文档,并翻译包含的文本
- ali-translator/url-template - 帮助解决 URL 语言
测试
包中存在 docker-compose 文件,用于测试环境。
docker-compose up -d
docker-compose exec php bash
docker-compose run php composer install
docker-compose run php vendor/bin/phpunit