中文简繁体互转时,使用直译很简单,Delphi中使用LCMapStringW这个API。
但是如果要追求完美,考虑两岸用词习惯,就需要考虑“语义”,有两种情况:
(1)字还是基本是那个字,只是写法不同。如:
-
周期 - 週期
-
周杰伦 - 周傑倫
(2)字都变了。如:
- 文件 - 檔案
- 程序 - 程式
周和週:◎ “周”作姓、朝代时,繁体也为“周”,与简体同形。◎ 圈子、周围、周到、星期的“周”繁体为“週”。◎ 周chou(賙),接济。
语义就要涉及上下文分析,有点AI在里面,就不那么容易了。
微软Word和金山WPS的“中文简繁体”转换都不是简单的直译,有加AI。
百度的在线翻译也有加AI。(不过“下周期末考试”和“这周期末考试”翻译结果不同,可能训练素材不全)
调用百度翻译API,需要先去这里申请开通:http://api.fanyi.baidu.com/
Delphi中调用百度翻译API,如下:
function TranslateWordByHttp(AFromLanguage,AToLanguage:PacroCultureInfo;AText:WideString):WideString;
var
vParam:TStringList;
vMS:TMemoryStream;
S:Ansistring;
WS:WideString;
vHTTP:TIdHTTP;
MD5: TIdHashMessageDigest5;
vResult:TJSONObject;
vR:TJSONArray;
begin
Result:='';
vParam:=TStringList.Create;
vMS:=TMemoryStream.Create;
vHTTP:=TIdHttp.Create(nil);
try
vParam.Values['appid']:=C_appid;
vParam.Values['from']:=AFromLanguage^.BaiDu_Abbreviate;
vParam.Values['to']:=AToLanguage^.BaiDu_Abbreviate;
vParam.Values['q']:=AText;
vParam.Values['salt']:=InttoStr(Random(32768));
//vParam.Values['dict']:='1';
//拼接appid+q+salt+密钥:
//S:=vParam.Values['appid']+S+vParam.Values['salt']+C_secret;
S:=C_appid;
vMS.Write(S[1],Length(S));
//按要求,必须UTF8,Delphi下S必须定义为AnsiString
S:=UTF8Encode(AText);
vMS.Write(S[1],Length(S));
S:=vParam.Values['salt'];
vMS.Write(S[1],Length(S));
S:=C_secret;
vMS.Write(S[1],Length(S));
MD5 := TIdHashMessageDigest5.Create;
vMS.Position:=0;
//不能用HashStringAsHex,因为它定义的string其实是widestring,utf8隐含会又被转成unicode
vParam.Values['sign']:=MD5.HashStreamAsHex(vMS).ToLower();
MD5.Free;
vMS.Clear;
vHTTP.Request.ContentType:='application/x-www-form-urlencoded';
vHTTP.Post('http://api.fanyi.baidu.com/api/trans/vip/translate',vParam,vMS);
Setlength(S,vMS.Size);
Move(vMS.Memory^,S[1],vMS.Size);
//不需要转码
//WS:=UTF8Decode(S);
//得到内容字串:
//'{"from":"zh","to":"cht","trans_result":[{"src":"\u8d44\u672c\u4e3b\u4e49","dst":"\u8cc7\u672c\u4e3b\u7fa9"}]}'
vResult:=TJSONObject(TJSONObject.ParseJSONValue(S));
try
if vResult.Values['error_code']=nil then
begin
vR:=TJSONArray(vResult.Values['trans_result']);
if vR.Count>0 then
begin
//不需要转码
//WS:=UTF8Decode(S);
result:=TJSONString(TJSONObject(vR.Items[0]).Values['dst']).Value;
end;
end;
finally
vResult.Free;
end;
finally
vHttp.Free;
vMS.Free;
vParam.Free;
end;
end;
我测试了结果是OK的,有加入AI功能。
本来想网上找一个词汇对照库,没有找到合适的。
ZhConversion.php内容大概是这样的:
'𪎈' => '䴬',
'𪎉' => '麲',
'𪎊' => '麨',
'𪎋' => '䴴',
'𪎌' => '麳',
'𪚏' => '𪘀',
'𪚐' => '𪘯',
'' => '棡',
'0多只' => '0多隻',
'0天后' => '0天後',
'0只' => '0隻',
'0余' => '0餘',
'1天后' => '1天後',
'1只' => '1隻',
'2天后' => '2天後',
'2只' => '2隻',
'3天后' => '3天後',
'3只' => '3隻',
'4天后' => '4天後',
'4只' => '4隻',
'5天后' => '5天後',
'5只' => '5隻',
'6天后' => '6天後',
'6只' => '6隻',
'7天后' => '7天後',
'7只' => '7隻',
'8天后' => '8天後',
'8只' => '8隻',
'9天后' => '9天後',
'9只' => '9隻',
'〇只' => '〇隻',
'〇余' => '〇餘',
'一干二净' => '一乾二淨',
查找了一下“周期”这个词,没有。放弃。
《简体繁体字对照表全3.csv》内容大概是这样的:
[转换方向] [添加或修改] [转换为] [词性]
简繁双向 计算机 電腦 名词
简繁双向 0出现 0出現 名词
简繁双向 0出現 0出現 名词
简繁双向 0出線 0出線 名词
简繁双向 0出线 0出線 名词
简繁双向 0只支持 0只支持 名词
简繁双向 0只支援 0只支援 名词
简繁双向 0周后 0周後 名词
简繁双向 0天后 0天後 名词
简繁双向 0只 0隻 名词
简繁双向 0余 0餘 名词
简繁双向 0出 0齣 名词
简繁双向 1只支持 1只支持 名词
简繁双向 1只支援 1只支援 名词
简繁双向 1周后 1周後 名词
简繁双向 1天后 1天後 名词
简繁双向 1只 1隻 名词
简繁双向 1余 1餘 名词
简繁双向 2只支持 2只支持 名词
简繁双向 2只支援 2只支援 名词
简繁双向 2周后 2周後 名词
也用“周期”查了一下,没有。“1周后”也没翻译成“1週後”,放弃。