Xây dng mt ng dng t đin đơn gin
Công c cn thiết nht khi hc ngoi ng chính là t đin. Chc hn các bn cũng
như tôi luôn cm thy vt v khi phi tra t trên cun t đin dày cp. Gii pháp
đáng giá là s dng ng dng t đin trên máy vi tính. Mc dù hin nay các ng
dng t đin đã có nhiu nhưng vn là dân tin hc, tôi đã quyết định t xây dng
cho mình mt ng dng t đin riêng.
Cơ s d liu
Phn quan trng nht đối vi mt ng dng t đin chính là cơ s d liu (CSDL). Vic
xây dng CSDL cho t đin phi đảm bo được kh năng truy cp nhanh bi d liu ca
t đin thường khá ln, lên ti hàng chc nghìn t. Tht may, DICT.ORG
(www.dict.org) đã xây dng mt format (định dng) t đin rt d s dng, format này đã
được dùng đểy dng nhng b t đin khá ln. Dict format được mô t như sau: toàn
b CSDL được cha trong 2 file, mt file cha nghĩa ca t và mt file index. File index
bao gm tên t, v trí nghĩa ca t bt đầu trong file cha nghĩa và độ dài ca nghĩa. V
trí bt đầu và độ dài ca nghĩa được mã hoá theo cách như sau: S dng 64 ch cái:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
ch cái A tương đương s 0, ch cái B tương đương s 1 v.v... Gia t, v trí bt đầu và
độ dài nghĩa phân cách nhau bi ký t tab (ASCII 9). Mi dòng trong file index cha d
liu ca mt t. Các dòng phân cách nhau bi ký t xung dòng (ASCII 10).
Ví d trong file index ca t đin Đức-Vit có mt dòng như sau:
Abdeckung kbpP D3
N
hư vy nghĩa ca t Abdeckung trong file cha nghĩa s bt đầu ti offset kbpP (theo
mã 64 ký t) và có độ dài là D3.
Vic chuyn t mã cơ s 64 v cơ s 10 đưc thc hin như sau:
Đối vi v trí bt đầu: kbpP. Ta có k ( cơ s 64) = 36 ( cơ s 10), b = 27, p = 41, P =
15. Như vy chuyn sang cơ s 10, mã kbpP có giá tr là: 36*643 + 27*642 + 41*641 +
15*640 = 9550415
Đối vi độ dài nghĩa: D3. Ta có D = 3, 3 = 55. Như vy chuyn sang cơ s 10, mã D3
cơ s 64 có giá tr là: 247.
File index được sp xếp để gim bt thi gian tìm kiếm. Vic mã hoá theo cơ s 64 như
trên giúp cho kích thước file index gim xung rt nhiu so vi không mã hóa.
Còn cu trúc ca file cha nghĩa gm các phn như sau:
@headword
* tu loai (noun, verb...)
- dinh nghia 1
= cau vi du cho dinh nghia 1 + nghia cua cau do
- dinh nghia 2
= cau vi du cho dinh nghia 2 + nghia cua cau do
* tu loai
- dinh nghia 3
N
ghĩa ca mi t gm mt phn như trên, các nghĩa ca mi t ni tiếp nhau liên tc.
N
hư vy, các bn hoàn toàn có th xây dng cho mình các b t đin riêng. Tuy nhiên,
công vic nhp d liu li không h đơn gin chút nào. Nhưng, li mt ln na, chúng ta
tht may mn vì có mt s bn đã b công nhp sn mt s b t đin thông dng. Các
bn có th tham kho thêm ti: www.ttdomain.net/ttdownload/, www.informatik.uni-
leipzig.de/~duc/Dict/, huybien.vze.com... Ngoài ra còn rt nhiu b t đin chuyên dng
khác na, các bn có th tham kho thêm các địa ch trên hoc ti www.dict.org.
Xây dng chương trình
đây tôi xin trình bày cách s dng ngôn ng Visual C++ 6.0 và thư vin MFC. Các bn
hoàn toàn có th s dng các ngôn ng khác. Trong khuôn kh bài viết, tôi ch xin đưa ra
nhng phn ch yếu nht. Các phn như thiết kế giao din, b trí giao din v.v... các bn
có th tham kho chương trình mu và t sáng to thêm.
1. Các thành phn giao din cơ bn:
Edit Box: dùng để nhp t. Cài biến cho điu khin: 'Variable name: m_word,
Category: Value, Type: Cstring;'
WebBrowser: dùng để hin nghĩa ca t. Vic s dng WebBrowser ch nhm mc
đích hin th nghĩa trc quan và sinh động hơn bng cách x lý chui (s được đề cp sau
này). Bn có th thêm điu khin ActiveX Web Browser vào ng dng ca mình bng
cách chn Project->Add to Project->Components And Controls, chn trong thư mc
Registered ActiveX Controls điu khin Microsoft Web Browser. Cài biến cho điu
khin: 'Variable name : m_wordmean;'
Listbox, dùng để hin danh sách t. Cài biến cho điu khin: 'Variable name:
m_wordlist; Category: Control;'
Listbox, dùng để lưu tr d liu v t. Cài biến cho điu khin: 'Variable name:
m_worddata, Category:Control;'
2. Mã chương trình:
Np d liu vào các list box: bn đặt phn mã này s kin WM_OnInitDialog() để
d liu được np ngay t lúc khi động chương trình. đây, bn thay tên file index bng
tên file tương ng vi t đin bn s dng.
FILE *inFile;
inFile = fopen ('mydic.index','r');
if (inFile == NULL){
MessageBox ('Cannot open index file');
}else {
char * line;
char lineBuf[100];
line = (char *) lineBuf;
m_wordlist.ResetContent();
m_worddata.ResetContent();
CString word = '';
CString sWord = '';
CString sData = '';
while (!feof(inFile)){
fgets(line,99,inFile);
if (strlen(line)>=2){
word = line;
int pos = word.Find('\t',0);
sWord = word.Left(pos);
sData = word.Mid(pos+1,word.
GetLength()-pos-1);
if (sData.Find('\n',0) > 0){
sData = sData.Left(sData.
GetLength()-1); }
if (sWord.GetLength()>=1){
m_wordlist.AddString(sWord);
m_worddata.AddString(sData);}
} } }
fclose(inFile);
Hàm chuyn t mã cơ s 64 sang cơ s 10
int GetDemicalValue (CString str){
CString base64 = 'ABCDEFGHIJKLM-NOPQRSTUVWXYZabcdefghijklmnopqrstu-
vwxyz0123456789+/';
int decValue = 0;
int len = str.GetLength();
for (int i = 0; i<len; i++){
int pos = base64.Find(str.
GetAt(i),0);
decValue += (int)pow(64,len-i-
1)*pos;
}
return decValue;
}
Hàm x lý chui ký t nghĩa. Như đã đề cp trên, tôi s dng điu khin Web
Browser để hin th nghĩa cho thêm phn sinh động. Hàm này có tác dng x lý chui ký
t nghĩa bng cách thêm các tag HTML để nghĩa được th hin sinh động hơn ví d như:
các nghĩa con thì in đậm, ch đỏ, các ví d thì in nghiêng, ch xanh v.v...
CString ChangeStyle(CString wordmean){
CString meaning = wordmean;
meaning = meaning.Right(meaning.GetLength()-1);
int pos = meaning.Find('\n',1);
meaning.Insert(pos,'</b>');
meaning = '<b>' + meaning;
meaning.Replace('\n','<br>');
meaning.Replace('{','<font color=\'#FF0000\'><b>');
meaning.Replace('}','</b></font>');
meaning.Replace('[','<font color=\'#FF0000\'><b>');
meaning.Replace(']','</b></font>');
meaning.Replace('+',' ');
return meaning;
}
Hàm ly nghĩa ca t: hàm này có tác dng đọc t file cha nghĩa để ly nghĩa ca t,