arteq / tmx-utils
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- phpstan/phpstan: ^0.12.14
- phpunit/phpunit: 5.*
README
描述
一个简单的库,用于处理翻译行业使用的 Translation Memory eXchange 文件。可以用来读取/写入或分割大文件为小文件。
更多关于 TMX 标准: http://xml.coverpages.org/tmxSpec971212.html
安装
运行 composer 从 Packagist 获取项目
$ composer require arteq/tmx-utils
可选:你可以运行测试(phpUnit,CS-Fixer,PHPStan)
$ make
注意:代码质量测试需要 PHP 7.x。如果你运行 PHP 5.6,可以使用简化版的 composer_php56.json
文件,并且只运行 phpUnit 测试
$ env COMPOSER=composer_php56.json composer install
$ make phpunit
库本身在 PHP 5.x 和 7.x 上都能正常运行。
读取器
Reader 类用于提取翻译单元,并以多维数组的形式返回。数组的第一个键级别由翻译单元 id 组成,第二个键是段语言代码,值是段文本本身。所有其他属性和元素属性都被忽略。
用法
$reader = new ArteQ\Tmx\Reader('file.tmx');
// get all translation units
$units = $reader->get();
var_dump($unit);
// get single translation unit by its id
$unit = $reader->get('tu-123');
var_dump($unit);
// get all translation units for given language code
$unitsLang = $reader->getLang('en_UK');
var_dump($unitsLang);
写入器
Writer 类用于创建 TMX 文件。可以使用 set($tuid, $xmlLang, $value = '')
方法逐个将翻译单元添加到内部数据内存中,或使用 setArray(array $data)
从数组中一次性添加所有翻译单元。这种方法可以进一步操作数据,例如通过 id 获取翻译单元,修改或删除它。要保存数据到文件,请使用 write()
。
用法 - 简单
$tmx = new Writer('file.tmx');
// set two segments for one translation unit identified by id 'tuid-123'
$tmx->set('tuid-123', 'pl_PL', 'Tekst polski');
$tmx->set('tuid-123', 'en_EN', 'English text');
// add additional attribute
$tmx->setAttribute('id-123', 'creationid', 'user-123');
// add additional property
$tmx->setProperty('id-123', 'client', 'ACME Ltd.');
// save data to file
$tmx->write();
对于非常大的文件,其中包含大量翻译单元,你只想保存到 TMX 文件而不进行任何数据操作,应使用流式方法。每个翻译单元逐个添加,并且每 1000 个单元刷新到磁盘一次。这样做可以降低内存使用,因为不需要将整个数据集保留在内存中。
用法 - 流式
// expected data format
$data = [
'tuid-1' => [
'pl' => 'tekst polski',
'en' => 'english text',
'_attributes' => [
'attr1' => 'value1',
'attr2' => 'value2',
],
],
'tuid-2' => [
'pl' => 'inny tekst',
'_properties' => [
'type1' => 'value1',
'type2' => 'value2',
],
],
'tuid-3' => [
'pl' => 'kolejny tekst',
'en' => 'another text',
]
];
$tmx = new Writer('file.tmx');
$tmx->writeStart();
foreach ($data as $tuid => $tuvs)
{
$tmx->writeTu($tuid, $tuvs);
}
$tmx->writeEnd();
有关更多示例,请参阅 tests/WriterTest.php。
致谢
TMX 读取器/写入器的初始版本基于 Maxime Maupeu 的项目,可在他的 GitHub 上找到。
分割器
分割器可用于读取大 TMX(文件大小为多个 GB)并保存为更小文件的块,以便在第三方软件中进行更容易的操作。它使用流 XMLReader
和 XMLWriter
,因此内存使用非常低,因为不需要将整个文件读入内存。输入文件的 TMX 标头元素在输出文件中插入,没有任何更改。
将保存在每个块中的翻译单元数(<tu>
)由 setLimit() 函数设置。
用法
$splitter = new ArteQ\Tmx\Splitter('large.tmx');
$splitter->setLimit(1000);
$splitter->split();
var_dump($splitter->getStats());
注意
- 输入和输出文件都假设使用 UTF-8 编码。
- 输出文件的名称将附加一个数字以表示顺序(例如:
file_000.tmx
,file_001.tmx
等)。 - 由于使用了用于简单性的 writeRaw() 函数,输出文件可能没有完美的 XML 元素缩进。