arteq/tmx-utils

读取和写入 TMX 文件,简单的元素操作

v1.4.3 2020-12-15 12:41 UTC

This package is auto-updated.

Last update: 2024-09-15 20:47:15 UTC


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)并保存为更小文件的块,以便在第三方软件中进行更容易的操作。它使用流 XMLReaderXMLWriter,因此内存使用非常低,因为不需要将整个文件读入内存。输入文件的 TMX 标头元素在输出文件中插入,没有任何更改。

将保存在每个块中的翻译单元数(<tu>)由 setLimit() 函数设置。

用法

$splitter = new ArteQ\Tmx\Splitter('large.tmx');

$splitter->setLimit(1000);
$splitter->split();
var_dump($splitter->getStats());

注意

  1. 输入和输出文件都假设使用 UTF-8 编码。
  2. 输出文件的名称将附加一个数字以表示顺序(例如:file_000.tmxfile_001.tmx 等)。
  3. 由于使用了用于简单性的 writeRaw() 函数,输出文件可能没有完美的 XML 元素缩进。