Chinaunix

标题: [分享] 使用有道API进行自动预翻译 [打印本页]

作者: Perlvim    时间: 2013-03-27 10:32
标题: [分享] 使用有道API进行自动预翻译
最近翻译了一些东西,发现如果每次有翻译提示,即使翻译的前言不搭后语,但如果将那些生词都提示出来了,也能帮助我尽快的掌握原文意思,进行翻译:

也可以将内容贴到有道词典中,获取翻译数据,但复制粘帖多了,就烦了,何不用Perl语言实现呢?

以下ID是我申请的,一个小时内不能用超过1000次,所有大家最好自己申请一个新的:

这是个模块,叫 Translate::Youdao

调用的时候:
  1. #!perl
  2. #
  3. use 5.014;
  4. use Translate::Youdao qw(translate_with_youdao);

  5. my $need_translate_str = 'You can find the answers to these exercises in ( Answers for Chapter 16 ) on page 345.';
  6. #$need_translate_str = 'We';
  7. say translate_with_youdao($need_translate_str);
复制代码
模块保存在 Translate/Youdao.pm 中:
Youdao.rar (1.1 KB, 下载次数: 17)

内容如下:
  1. package Translate::Youdao;

  2. use Exporter;
  3. our @ISA = qw(Exporter);
  4. our @EXPORT_OK = qw(translate_with_youdao);

  5. use 5.014;
  6. use YAML qw(Dump);
  7. use WebService::Simple;
  8. use utf8;

  9. my $service = WebService::Simple->new(
  10.   base_url        => 'http://fanyi.youdao.com/openapi.do',
  11.   param           => {
  12.     keyfrom => 'Songzan',
  13.     key     => '363993902',
  14.     type    => 'data',
  15.     doctype => 'json',
  16.     version => '1.1',
  17.   },
  18.   response_parser => 'JSON',
  19. );

  20. my $error_info = {
  21.   20 => 'text is long than 200 characters',
  22.   30 => 'could not process valid translate',
  23.   40 => 'Could not support this language',
  24.   50 => 'Invalid key',
  25. };

  26. #my $need_translate_str = 'We have used numerous methods throughout this book.';
  27. #$need_translate_str = 'We';
  28. #say translate_with_youdao($need_translate_str);

  29. sub translate {
  30.   my $need_translate_str = shift;
  31.   state $count = 0;
  32.   $count++;
  33.   say "call Youdao API $count times";
  34.   $need_translate_str =~ s/n't / not /g;
  35.   $need_translate_str =~ s/'ll / will /g;
  36.   $need_translate_str =~ s/'re / are /g;
  37.   $need_translate_str =~ s/t's/t is/g;
  38.   if ($need_translate_str =~ /(['"]).*?\1/) {
  39.     LOOP_REPLACE:
  40.     foreach (1 .. 5) {
  41.       $need_translate_str =~ s/['"]/(/;
  42.       my $time = $need_translate_str =~ s/['"]/)/;
  43.       last LOOP_REPLACE if ($time eq '');
  44.     }
  45.   }
  46.   my $res = $service->get( { q => $need_translate_str } );
  47.   my $json = $res->parse_response;
  48.   my $error_code = $json->{errorCode};
  49.   if ($error_code == 0) {
  50.     my $translation = $json->{translation};
  51.     # say ref($translation);
  52.     my @lines = @{$translation};
  53.     my $str = join ' ', @lines;
  54.     # sleep(4);
  55.     return $str;
  56.   }
  57.   else {
  58.     say 'Warning!' . $error_info->{$error_code};
  59.     return 0;
  60.   }
  61. }

  62. sub translate_with_youdao {
  63.   my $en_str = shift;
  64.   if (length($en_str) < 199) {
  65.     return translate($en_str);
  66.   }
  67.   my @str_list = split /\h?\.\h/, $en_str;
  68.   my @cn_str_list = ();
  69.   foreach my $str (@str_list) {
  70.     if (length($str) < 199) {
  71.       # push @all_lines, "$line_number:$file";
  72.       push @cn_str_list, translate($str);
  73.     }
  74.     else {
  75.       my @sub_str_list = split /\h?[,\?]\h/, $str;
  76.       my @sub_cn_str_list = ();
  77.       foreach my $sub_str (@sub_str_list) {
  78.         if (length($sub_str) > 199) {
  79.           say "Length exceed 200 characters:";
  80.           say "<$sub_str>";
  81.           next;
  82.         }
  83.         push @sub_cn_str_list, translate($sub_str);
  84.       }
  85.       push @cn_str_list, @sub_cn_str_list;
  86.     }
  87.   }
  88.   my $cn_str = join ' ', @cn_str_list;
  89.   return $cn_str;
  90. }

  91. 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