Chương trình này tự động gửi 1 nội dung lên trên server vdict.net để dịch và in ra kết quả.
Yêu cầu: tạo 1 tập tin chứa các chuỗi cần dịch. Chương trình sẽ gửi từng dòng lên server vdict.net và lấy về chuỗi đã dịch ra (dùng E-V Shuttle engine - ai không muốn dùng wine và E-V shuttle ##### thì lấy cái này về nghịch chơi chơi). Mỗi dòng không quá 500 ký tự (để vdict không lọc bỏ)
Thử nghiệm trên Ubuntu
Yêu cầu hệ thống hỗ trợ: LWP::UserAgen
Code:
#!/usr/bin/perl
# Auto translate E-V, version 0.1
# Nguyễn Đình Trung, 2008
use warnings;
use strict;
#Cài LWP::UserAgent từ CPAN. Cứ chạy 'sudo cpan' từ dòng lệnh, và chương trình sẽ hỏi 1 vài câu
#Lúc nào vào đến dấu nhắc dòng lệnh thì gõ
#install LWP::UserAgent để cài mô-đun này xuống
require LWP::UserAgent;
#Khai báo chương trình con và các tham số của nó.
#Chương trình con tên là trans, được định nghĩa sau, và lấy 1 tham số là 1 biến vô hướng
sub trans($);
#Khi dùng use strict, ta phải khai báo các biến
#Biến cục bộ: my $tên_biến
#Biến toàn cục: our $tên_biến
my $line;
#Lấy tên tâp tin, được cho dưới dòng lệnh
#Ta nhập tập tin làm tham số cho chương trình, nên dòng này sẽ ghi tên tập tin vào trong biến $input
my $input = shift;
#Mở tập tin $input, gán cho nó file-handle tên là FI
open FI, $input or die $!;
#Chạy chương trình con trans với từng dòng nhận được
while (defined ($line = <FI>)){
print trans($line)."\n";
}
#Chương trình con trans
sub trans($){
#Tạo đối tượng LWP UserAgent
#Giống như 1 trình duyệt web vậy!!! Xem thêm trên http://cpan.org
my $ua = LWP::UserAgent->new;
#Đọc thiết lập proxy từ môi trường Linux
$ua->env_proxy;
#url trỏ tới trang dịch tự động của vdict
my $url = 'http://vdict.com/?autotranslation';
#Khai báo hash form. Hash là 1 cấu trúc kiểu associative array, tức là 'A'=>'1', 'B'=>'2', 'C'=>'3'...
my %form;
# Tạo con trỏ $form trỏ tới %form
my $form=\%form;
#Trong form dịch tự động, có 2 trường là langpair (cái hộp chọn dịch từ tiếng j sang tiếng j) và sourcetext (nội dung cần dịch)
$form{langpair} = 'en|vi|1';
#Câu lệnh shift này dùng để lấy tham số truyền cho chương trình con.
$form{sourcetext} = shift;
#Gửi form theo phương thức POST
my $response = $ua->post($url, \%form);
#Nếu có nội dung trả về, kiểm tra xem đó có phải là chuỗi báo server qúa bận không, nếu ko phải thì trả về kết quả
if ($response->is_success){
my $content= $response->content;
if ($content =~ /translated by VDict\.com\/\/(.*)\/\/translated by VDict\.com/) {
#Biểu thức chính quy ở trên sẽ lọc ra nội dung nằm giữa 2 đoạn
#"translated by VDict.com// ... (nội dung lấy ra) .. //translated by VDict.com"
if ($1 eq "Our translation server is too busy, please try again later"){
trans($form{sourcetext});
} else {
return $1;
}
}
}
else {
die $response->status_line;
}
}
Xem Thêm :