开发简易在线翻译记忆库所需代码
计算机辅助翻译技术的核心技术之一就是翻译记忆技术,涉及到翻译记忆库的对齐生成、翻译记忆库的管理、翻译记忆库的检索、翻译记忆库的相似度匹配等等,因此对于译者而言,善用翻译记忆库将能极大提升翻译的效率。
在这篇文章中我们一起来看一下如何开发简易的在线翻译记忆库。
XML
XML是eXtensible Markup Language的缩写,译为“可扩展标记语言”。只有理解了XML才能把翻译行业的众多基于XML的数据交换标准搞清楚,比如存储翻译记忆的TMX、存储术语库的TBX、存储断句规则的SRX等等。
虽然现在主流的数据格式是json,一种更加简单轻便的数据存储格式,但在翻译行业常用的各类计算机辅助翻译工具中,XML的应用还是非常广的,所以对于翻译技术感兴趣的同学和老师还是有必要深入学习XML的。
首先,请大家观看两个我录制的基础视频:什么是XML和什么是DTD。
简单来说,XML中包含的是要传输的数据,DTD定义了要传输的数据以怎样的结构存在于XML中。
以上内容是我们了解翻译记忆库的基础,大家有时间的话最好能够全都看完。
TMX
IBM的工程师曾在博客中写过这样一篇文章本地化中的 XML:通过 TM 和 TMX 重用翻译
——在 XML 标准的帮助下减少翻译的时间和劳动量
其中提到:
翻译存储(Translation memory,TM)是一种支持文档片段(句子、段落或短语)翻译的语言工具,方法是在数据库中搜索类似的片段并建议数据库中发现的匹配。
TM 是现代计算机辅助翻译(CAT)工具的基本组成部分。它在翻译行业中非常普及,以至于人们常常用“翻译存储工具”代替“计算机辅助翻译工具”。但是,这些术语不应该互换,因为 CAT 技术还包括机器翻译(一种基于语言学规则并使用双语词典的计算机技术)。
TM 系统记住翻译人员输入的翻译。当翻译人员处理类似的文本时,系统提供以前保存的版本。这样在处理重复性文本如技术手册时可以节约大量的时间,还有助于保证术语的一致性。
在“计算机辅助翻译”领域,双语的句子大多是以“.tmx”格式的文件存储的,这种叫作“翻译记忆”(Translation Memory),作用就是先把翻译过的双语内容存在翻译记忆中,当译者翻译一个句子时,先看一下翻译记忆中有没有这个句子或者有没有与这个相似的句子,如果有就把句子原文和译文显示出来提示给译者,译者就可以省去很多时间和精力去瞎编。
就像Word文档都是以“.doc”或“.docx”、Excel文档都是以“.xls”或“.xlsx”的文件格式存储一样,翻译记忆也有自己的存储格式,国际通用的格式就是刚才提到的“.tmx”。“tmx”是“Translation Memory eXchange”的缩写,国际上有组织制定了这种文件存储的标准。
接下来我们看一个示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tmx version="1.4">
<header creationtool="Tmxmall" segtype="sentence" adminlang="zh-CN" srclang="zh-CN" datatype="xml" creationdate="20171022T155351Z" creationid="TM STUDIO"/>
<body>
<tu creationdate="20171022T155351Z" creationid="TM STUDIO">
<tuv xml:lang="zh-CN">
<seg>大会的主题是:********</seg>
</tuv>
<tuv xml:lang="en-US">
<seg>The theme of the Congress is: *********</seg>
</tuv>
</tu>
<tu creationdate="20171022T155351Z" creationid="TM STUDIO">
<tuv xml:lang="zh-CN">
<seg>全党同志一定要永远与人民同呼吸********</seg>
</tuv>
<tuv xml:lang="en-US">
<seg>In our Party, each and every one of us must always breathe the same breath as the people*********</seg>
</tuv>
</tu>
</body>
</tmx>
我们习惯上使用对齐软件来制作这样的翻译记忆文件,参见下面这个视频:
制作完成后的翻译记忆文件虽然是以“.tmx”格式存储,但是在不同的计算机辅助翻译工具中,它往往还会有其他的存储格式,比如在SDL Trados Studio中,它的格式就是“.sdltm”。
“.tmx”格式的文件适合在本地电脑打开,适合导入到计算机辅助翻译工具中供查询,但是不适合在线查询。我们不能把这个文件放到网盘、协作平台去查询。
市面上有不少工具支持“.tmx”的导入导出和查询,比如一者科技的语料快搜,SDL公司的TM Server(此为收费的服务器版)等。
对于译者或小的翻译团队而言,如果也想自己开发简易的在线翻译库呢?
开发简易在线翻译记忆库所需代码
我们以PHP为例,介绍如何在本地服务器上开发一个简易的在线翻译记忆库。
本地编程环境搭建
如果你使用的是Windows操作系统,可以安装XAMPP或者PHPStudy,相关教学视频参见以下网址的课时3和课时4:
如果你使用的是Mac操作系统,可以安装MAMP Pro,相关教学视频参见以下网址的课时7:
http://codeslator.edusoho.cn/course/2
大家也许会注意到以上课程是收费课程,不过你们可以先注册上面这个网站,以上视频都是可以免费观看的。
以下是所需的全部代码:
代码一:读取TMX文件中的双语数据
方法一:
<?php
header("content-type:text/html; charset=utf-8");
$xml = simplexml_load_file('source.tmx');
$json = json_encode($xml);
$jsondata = json_decode($json,true);
foreach ($jsondata["body"]["tu"] as $tu)
{
echo $tu["tuv"][0]["seg"]."<br>";
echo $tu["tuv"][1]["seg"]."<br>";
echo "<br>";
}
?>
方法二:
<?php
header("content-type:text/html; charset=utf-8");
$xml = simplexml_load_file('source.tmx');
foreach ($xml->body->tu as $tu)
{
echo $tu->tuv[0]->seg."<br>";
echo $tu->tuv[1]->seg."<br>";
echo "<br>";
}
?>
代码二:创建数据库
CREATE DATABASE fmprc
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
代码三:创建数据表
CREATE TABLE `tm`
(
`ID` INT(5) NOT NULL AUTO_INCREMENT ,
`zh_CN` VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`en_US` VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
PRIMARY KEY (`ID`)
)
ENGINE = InnoDB
CHARSET=utf8
COLLATE utf8_general_ci;
代码四:连接服务器
<?php
$dbhost = "localhost"; //数据库所在主机地址
$dbuser = "root"; //登录服务器所用的服务器用户名
$dbpass = "root"; //登录服务器所用的用户名密码
$conn = mysqli_connect($dbhost,$dbuser,$dbpass);
if(!$conn)
{
echo "服务器连接失败:".mysqli_connect_error();
}
?>
代码五:选择数据库
<?php
mysqli_select_db($conn,"fmprc");
mysqli_query($conn,"set names 'utf8'");
?>
代码六:导入翻译记忆至数据库
import.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>STITM</title>
</head>
<body>
<?php
$dbhost = "localhost"; //数据库所在主机地址
$dbuser = "root"; //登录服务器所用的服务器用户名
$dbpass = "root"; //登录服务器所用的用户名密码
$conn = mysqli_connect($dbhost,$dbuser,$dbpass);
if(!$conn)
{
echo "服务器连接失败:".mysqli_connect_error();
}
mysqli_select_db($conn,"fmprc");
mysqli_query($conn,"set names 'utf8'");
$xml = simplexml_load_file("source.tmx");
foreach($xml->body->tu as $tu)
{
$zh_CN = $tu->tuv[0]->seg;
$zh_CN = str_replace("'","\'",$zh_CN);
$en_US = $tu->tuv[1]->seg;
$en_US = str_replace("'","\'",$en_US);
$insert_sql = "INSERT INTO tm(zh_CN,en_US) VALUES('$zh_CN','$en_US')";
$import = mysqli_query($conn,$insert_sql);
if(!$import)
{
echo "<font color=red><b>翻译记忆插入失败:".$zh_CN.$en_US."</b></font>";
}
else{
echo "翻译记忆插入成功!"."<br>";
}
}
?>
</body>
</html>
代码七:查询翻译记忆库
search.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>STITM</title>
</head>
<body>
<form action = "result.php" method = "POST">
<table>
<tr>
<td>
<input type = "text" name = "zh_CN" placeholder = "中文检索词" />
</td>
<td>
<input type = "text" name = "en_US" placeholder = "英文检索词" />
</td>
<td>
<button type = "submit">搜索</button>
</td>
</tr>
</table>
</form>
</body>
</html>
代码八:显示翻译记忆库查询结果
result.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>STITM</title>
</head>
<body>
<table width = "100%" border = "1">
<tr>
<td>序号</td>
<td>中文</td>
<td>英文</td>
</tr>
<?php
$dbhost = "localhost"; //数据库所在主机地址
$dbuser = "root"; //登录服务器所用的服务器用户名
$dbpass = "root"; //登录服务器所用的用户名密码
$conn = mysqli_connect($dbhost,$dbuser,$dbpass);
if(!$conn)
{
echo "服务器连接失败:".mysqli_connect_error();
}
mysqli_select_db($conn,"fmprc");
mysqli_query($conn,"set names 'utf8'");
$zh_CN = $_POST["zh_CN"];
$en_US = $_POST["en_US"];
$sql = "SELECT * FROM tm WHERE zh_CN LIKE '%$zh_CN%' AND en_US LIKE '%$en_US%'";
$gettm = mysqli_query($conn,$sql);
if(!$gettm)
{
echo "无法获取翻译记忆,请检查问题!";
}
else{
while($row = mysqli_fetch_array($gettm,MYSQLI_ASSOC))
{
$row["zh_CN"] = preg_replace("/$zh_CN/u","<font color=blue><b>$zh_CN</b></font>",$row["zh_CN"]);
$row["en_US"] = preg_replace("/$en_US/u","<font color=red><b>$en_US</b></font>",$row["en_US"]);
echo "
<tr>
<td>{$row['ID']}</td>
<td>{$row['zh_CN']}</td>
<td>{$row['en_US']}</td>
</tr>";
}
}
?>
</table>
</body>
</html>
将以上代码输入到编辑器后,我们便能得到一个简易的在线翻译记忆库。但这个翻译记忆库只能在本地访问,如果想放到线上的话,还需要购买域名和服务器,相关视频在下方:
在《译者编程入门指南》一书的第六章,我详细介绍了如何开发简易的在线翻译记忆库: