开发简易在线翻译记忆库所需代码

计算机辅助翻译技术的核心技术之一就是翻译记忆技术,涉及到翻译记忆库的对齐生成、翻译记忆库的管理、翻译记忆库的检索、翻译记忆库的相似度匹配等等,因此对于译者而言,善用翻译记忆库将能极大提升翻译的效率。

在这篇文章中我们一起来看一下如何开发简易的在线翻译记忆库。

XML

XML是eXtensible Markup Language的缩写,译为“可扩展标记语言”。只有理解了XML才能把翻译行业的众多基于XML的数据交换标准搞清楚,比如存储翻译记忆的TMX、存储术语库的TBX、存储断句规则的SRX等等。

虽然现在主流的数据格式是json,一种更加简单轻便的数据存储格式,但在翻译行业常用的各类计算机辅助翻译工具中,XML的应用还是非常广的,所以对于翻译技术感兴趣的同学和老师还是有必要深入学习XML的。

首先,请大家观看两个我录制的基础视频:什么是XML和什么是DTD。

简单来说,XML中包含的是要传输的数据,DTD定义了要传输的数据以怎样的结构存在于XML中。

什么是XML?

什么是DTD?

以上内容是我们了解翻译记忆库的基础,大家有时间的话最好能够全都看完。

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>

将以上代码输入到编辑器后,我们便能得到一个简易的在线翻译记忆库。但这个翻译记忆库只能在本地访问,如果想放到线上的话,还需要购买域名和服务器,相关视频在下方:

如何购买一个自己的专属域名

如何购买主机并将域名绑定到主机上

如何通过FTP和文本编辑器更新网页代码

如何将本地代码和数据库更新到服务器上

在《译者编程入门指南》一书的第六章,我详细介绍了如何开发简易的在线翻译记忆库: