Chinaunix
标题:
[分享] 使用有道API进行自动预翻译
[打印本页]
作者:
Perlvim
时间:
2013-03-27 10:32
标题:
[分享] 使用有道API进行自动预翻译
最近翻译了一些东西,发现如果每次有翻译提示,即使翻译的前言不搭后语,但如果将那些生词都提示出来了,也能帮助我尽快的掌握原文意思,进行翻译:
也可以将内容贴到有道词典中,获取翻译数据,但复制粘帖多了,就烦了,何不用Perl语言实现呢?
以下ID是我申请的,一个小时内不能用超过1000次,所有大家最好自己申请一个新的:
这是个模块,叫 Translate::Youdao
调用的时候:
#!perl
#
use 5.014;
use Translate::Youdao qw(translate_with_youdao);
my $need_translate_str = 'You can find the answers to these exercises in ( Answers for Chapter 16 ) on page 345.';
#$need_translate_str = 'We';
say translate_with_youdao($need_translate_str);
复制代码
模块保存在 Translate/Youdao.pm 中:
Youdao.rar
(1.1 KB, 下载次数: 17)
2013-03-27 10:32 上传
点击文件名下载附件
内容如下:
package Translate::Youdao;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(translate_with_youdao);
use 5.014;
use YAML qw(Dump);
use WebService::Simple;
use utf8;
my $service = WebService::Simple->new(
base_url => 'http://fanyi.youdao.com/openapi.do',
param => {
keyfrom => 'Songzan',
key => '363993902',
type => 'data',
doctype => 'json',
version => '1.1',
},
response_parser => 'JSON',
);
my $error_info = {
20 => 'text is long than 200 characters',
30 => 'could not process valid translate',
40 => 'Could not support this language',
50 => 'Invalid key',
};
#my $need_translate_str = 'We have used numerous methods throughout this book.';
#$need_translate_str = 'We';
#say translate_with_youdao($need_translate_str);
sub translate {
my $need_translate_str = shift;
state $count = 0;
$count++;
say "call Youdao API $count times";
$need_translate_str =~ s/n't / not /g;
$need_translate_str =~ s/'ll / will /g;
$need_translate_str =~ s/'re / are /g;
$need_translate_str =~ s/t's/t is/g;
if ($need_translate_str =~ /(['"]).*?\1/) {
LOOP_REPLACE:
foreach (1 .. 5) {
$need_translate_str =~ s/['"]/(/;
my $time = $need_translate_str =~ s/['"]/)/;
last LOOP_REPLACE if ($time eq '');
}
}
my $res = $service->get( { q => $need_translate_str } );
my $json = $res->parse_response;
my $error_code = $json->{errorCode};
if ($error_code == 0) {
my $translation = $json->{translation};
# say ref($translation);
my @lines = @{$translation};
my $str = join ' ', @lines;
# sleep(4);
return $str;
}
else {
say 'Warning!' . $error_info->{$error_code};
return 0;
}
}
sub translate_with_youdao {
my $en_str = shift;
if (length($en_str) < 199) {
return translate($en_str);
}
my @str_list = split /\h?\.\h/, $en_str;
my @cn_str_list = ();
foreach my $str (@str_list) {
if (length($str) < 199) {
# push @all_lines, "$line_number:$file";
push @cn_str_list, translate($str);
}
else {
my @sub_str_list = split /\h?[,\?]\h/, $str;
my @sub_cn_str_list = ();
foreach my $sub_str (@sub_str_list) {
if (length($sub_str) > 199) {
say "Length exceed 200 characters:";
say "<$sub_str>";
next;
}
push @sub_cn_str_list, translate($sub_str);
}
push @cn_str_list, @sub_cn_str_list;
}
}
my $cn_str = join ' ', @cn_str_list;
return $cn_str;
}
1;
复制代码
作者:
mcshell
时间:
2013-03-27 11:32
支持楼主 {:3_200:}
作者:
只是一个红薯
时间:
2013-03-27 11:43
学习了
作者:
owwa
时间:
2013-10-29 07:48
支持!学习!谢谢!!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2