Dịch thuật đa ngôn ngữ (dựa vào Google Translate) (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,954
Từ bài viết này:

http://www.giaiphapexcel.com/forum/...a-code-vba-Translate-thành-Function!&p=480229
Mình chợt có ý nghĩ tạo thành 1 ứng dụng để dịch thuật đa ngôn ngữ trên Excel (thông qua 1 UserForm)

Capture.JPG




























Thấy cũng đơn giản...
Ai có hứng thú hãy mang về phát triển thêm
(yêu cầu: máy phải kết nối Internet)
------------------------------------------
Tôi thường hay đọc các tài liệu và Help VBA bằng tiếng Anh nhưng trình độ Anh ngữ còn hạn chế nên cứ phải vào Google Translate để dịch... Giờ nếu dùng cái này thì chỉ việc Save nó thành một Add-In rồi cứ ngay trên Excel mà dịch luôn, khỏi cần nhảy qua nhảy lại cho mất công


Capture2.JPG













------------------------------------------------------
Mình gửi thêm bản mới (đã sửa lại theo anh siwtom)... Các bạn tải file Google Translator_4.xlsm nhé
------------------------------------------------------
Phiên bản mới nhất (cũng theo code của anh siwtom): File Translator_5.xlsm
 

File đính kèm

Lần chỉnh sửa cuối:
ANH CÓ THỂ SỬA ĐOẠN NÀY "With CreateObject("InternetExplorer.application")" TRÊN FORM CHO NGƯỜI DÙNG DỄ CHỌN ĐƯỢC KHÔNG. BAN ĐẦU MÁY EM BỊ LỖI SAU ĐÓ thấy đoạn này . DO MẮY EM CHẠY DEFAULT LÀ GOOGLE CHROME
 

File đính kèm

  • LOI.jpg
    LOI.jpg
    58.9 KB · Đọc: 325
Lần chỉnh sửa cuối:
Upvote 0
ANH CÓ THỂ SỬA ĐOẠN NÀY "With CreateObject("InternetExplorer.application")" TRÊN FORM CHO NGƯỜI DÙNG DỄ CHỌN ĐƯỢC KHÔNG. BAN ĐẦU MÁY EM BỊ LỖI SAU ĐÓ thấy đoạn này . DO MẮY EM CHẠY DEFAULT LÀ GOOGLE CHROME

Uả kỳ vậy? Máy nào mà chẳng có Internet Explore?
Dù Default là trình duyệt gì thì liên quan gì đến câu lệnh With CreateObject("InternetExplorer.application") nhỉ?
Máy tôi dùng mặc định Firefox nè, có sao đâu?
Các bạn khác đang dùng Chrome thí nghiệm tiếp giúp tôi với
 
Upvote 0
Chạy trên máy em toàn bung ra IE-"Internet Explorer" với giao diện dịch thuật của Google. Trong phần dịch của form thì không hiện cái gì.

Thông tin máy của em: Vista Home Premium (SP2) 32-bit, IE7.
 
Upvote 0
Uả kỳ vậy? Máy nào mà chẳng có Internet Explore?
Dù Default là trình duyệt gì thì liên quan gì đến câu lệnh With CreateObject("InternetExplorer.application") nhỉ?
Máy tôi dùng mặc định Firefox nè, có sao đâu?
Các bạn khác đang dùng Chrome thí nghiệm tiếp giúp tôi với

Máy em chạy bình thường, chỉ có điều dịch hơi chậm.
 
Upvote 0
Chạy trên máy em toàn bung ra IE-"Internet Explorer" với giao diện dịch thuật của Google. Trong phần dịch của form thì không hiện cái gì.

Thông tin máy của em: Vista Home Premium (SP2) 32-bit, IE7.

Code thì đơn giản rồi (không có gì phải bàn)... nhưng không biết mỗi người test thế nào
Theo Tuân thì đây là lỗi gì?
 
Upvote 0
Uả kỳ vậy? Máy nào mà chẳng có Internet Explore?
Dù Default là trình duyệt gì thì liên quan gì đến câu lệnh With CreateObject("InternetExplorer.application") nhỉ?
Máy tôi dùng mặc định Firefox nè, có sao đâu?
Các bạn khác đang dùng Chrome thí nghiệm tiếp giúp tôi với
Máy em vừa s/d Internet Explore và Chrome
mặc định là Internet Explore
Mở file của thầy Ndu , thấy bình thường!
 
Upvote 0
Ở máy của nhóc thì trong form không hiện gì mà lại hiện trên google ạ.
 
Upvote 0
Em dùng ứng dụng này thấy chạy ngon lành. Em kết nối IE. Cảm ơn anh Ndu nhiều lắm!
 
Upvote 0
Uả kỳ vậy? Máy nào mà chẳng có Internet Explore?
Dù Default là trình duyệt gì thì liên quan gì đến câu lệnh With CreateObject("InternetExplorer.application") nhỉ?
Máy tôi dùng mặc định Firefox nè, có sao đâu?
Các bạn khác đang dùng Chrome thí nghiệm tiếp giúp tôi với
em cũng bị y chang anh Lê Duy Thương, máy em win7 64bit (ie9 + chrome )
234.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Code thì đơn giản rồi (không có gì phải bàn)... nhưng không biết mỗi người test thế nào
Theo Tuân thì đây là lỗi gì?

Em vừa kiểm tra trên máy Win7 64-bit, IE8 (32-bit) thì chạy được. Lỗi trước của em hình như là lỗi IE7 làm việc không đúng, đã có lệnh Visible = False rồi mà nó vẫn hiện ra, rồi không dịch được. Nó chạy mãi trong vòng lặp Do Until. Còn về lập trình thì như thế cũng là đúng rồi. Nếu lỗi đúng là do phiên bản IE7 thì anh cho cảnh báo upgrade IE mới...
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi đúng rồi, cẩn thận quá vẫn hơn. Chắc chắn IE7 có vấn đề về READYSTATE_COMPLETE
Nói ngắn gọn thì thực ra document vẫn chưa được load hoàn chỉnh mà code đã "cố" đọc nội dung (.Document.getElementById("result_box").innerText) nên kết quả là chuỗi rỗng.

Vậy thì tôi đề nghị 2 hướng:

1. Sau Do Until .ReadyState = 4: DoEvents: Loop ta thêm chút chờ đợi: Application.Wait (Now + TimeValue("0:00:5"))

2. Chờ đợi 5 giây như ở trên không biết có là cách tốt hay không. Có khi ít quá (kết cục là thất bại) mà có khi nhiều quá (chờ phí công). Tôi đề nghị chờ tối đa 10 giây. Tức nếu sau 1, 2, 3 giây mà đã có kết quả thì không chờ thêm nữa, còn không thì chờ tiếp nhưng tối đa là 10 giây. Sau 10 giây mà vẫn chưa có kết quả thì cũng dọn đồ chơi luôn.

Mã:
    Do Until .ReadyState = 4: DoEvents: Loop
    Do While count < 10 And result_data = ""
        Application.Wait (Now + TimeValue("0:00:1"))
        result_data = .Document.getElementById("result_box").innerText
        count = count + 1
        Debug.Print count
    Loop

Tôi đã sửa lại code hàm Translate theo code trên.

Các bạn Lê Duy Thương, Nguyễn Duy Tuân, Crystal Rose, Good-Luck đã "kêu ca" thì bây giờ đề nghị thử lại, thậm chí với IE7, và cho biết kết quả nhé.
 

File đính kèm

Upvote 0
Em bị giống #8, form không hiện gì, chỉ hiện ra trang google
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi đúng rồi, cẩn thận quá vẫn hơn. Chắc chắn IE7 có vấn đề về READYSTATE_COMPLETE
Nói ngắn gọn thì thực ra document vẫn chưa được load hoàn chỉnh mà code đã "cố" đọc nội dung (.Document.getElementById("result_box").innerText) nên kết quả là chuỗi rỗng.

Vậy thì tôi đề nghị 2 hướng:

1. Sau Do Until .ReadyState = 4: DoEvents: Loop ta thêm chút chờ đợi: Application.Wait (Now + TimeValue("0:00:5"))

2. Chờ đợi 5 giây như ở trên không biết có là cách tốt hay không. Có khi ít quá (kết cục là thất bại) mà có khi nhiều quá (chờ phí công). Tôi đề nghị chờ tối đa 10 giây. Tức nếu sau 1, 2, 3 giây mà đã có kết quả thì không chờ thêm nữa, còn không thì chờ tiếp nhưng tối đa là 10 giây. Sau 10 giây mà vẫn chưa có kết quả thì cũng dọn đồ chơi luôn.


[GPECODE=vb]Do Until .ReadyState = 4: DoEvents: Loop
Do While count < 10 And result_data = ""
Application.Wait (Now + TimeValue("0:00:1"))
result_data = .Document.getElementById("result_box").innerText
count = count + 1
Debug.Print count
Loop[/GPECODE]


Tôi đã sửa lại code hàm Translate theo code trên.

Các bạn Lê Duy Thương, Nguyễn Duy Tuân, Crystal Rose, Good-Luck đã "kêu ca" thì bây giờ đề nghị thử lại, thậm chí với IE7, và cho biết kết quả nhé.
chính nó rồi Thầy ơi
 
Upvote 0
Thôi đúng rồi, cẩn thận quá vẫn hơn. Chắc chắn IE7 có vấn đề về READYSTATE_COMPLETE
Nói ngắn gọn thì thực ra document vẫn chưa được load hoàn chỉnh mà code đã "cố" đọc nội dung (.Document.getElementById("result_box").innerText) nên kết quả là chuỗi rỗng.

Vậy thì tôi đề nghị 2 hướng:

1. Sau Do Until .ReadyState = 4: DoEvents: Loop ta thêm chút chờ đợi: Application.Wait (Now + TimeValue("0:00:5"))

2. Chờ đợi 5 giây như ở trên không biết có là cách tốt hay không. Có khi ít quá (kết cục là thất bại) mà có khi nhiều quá (chờ phí công). Tôi đề nghị chờ tối đa 10 giây. Tức nếu sau 1, 2, 3 giây mà đã có kết quả thì không chờ thêm nữa, còn không thì chờ tiếp nhưng tối đa là 10 giây. Sau 10 giây mà vẫn chưa có kết quả thì cũng dọn đồ chơi luôn.

Mã:
    Do Until .ReadyState = 4: DoEvents: Loop
    Do While count < 10 And result_data = ""
        Application.Wait (Now + TimeValue("0:00:1"))
        result_data = .Document.getElementById("result_box").innerText
        count = count + 1
        Debug.Print count
    Loop

Tôi đã sửa lại code hàm Translate theo code trên.

Các bạn Lê Duy Thương, Nguyễn Duy Tuân, Crystal Rose, Good-Luck đã "kêu ca" thì bây giờ đề nghị thử lại, thậm chí với IE7, và cho biết kết quả nhé.

Máy em vẫn chưa được. Khi code chạy đến dòng .Navigate2 "http://translate.google.com/#" & Lang_In & "/" & Lang_Out & "/" & text_to_translate thì IE7 tự mở ra và có kết quả dịch trên IE. Như vậy thực thế máy chủ Google đã nhận yêu cầu và trả về từ đã dịch nên không phải lỗi gửi và nhận dữ liệu qua mạng. Từ khi IE tự mở ra cửa sổ của nó lập tưc đối tượng tạo bởi CreateObject("InternetExplorer.Application") bị mất điều khiển và lỗi xảy ra "The object invoked has díconnected from its clients.". Như vậy có thể xử lý thằng IE không tự mở thì có thể làm việc được bình thường.
 
Upvote 0
Máy em vẫn chưa được. Khi code chạy đến dòng .Navigate2 "http://translate.google.com/#" & Lang_In & "/" & Lang_Out & "/" & text_to_translate thì IE7 tự mở ra và có kết quả dịch trên IE. Như vậy thực thế máy chủ Google đã nhận yêu cầu và trả về từ đã dịch nên không phải lỗi gửi và nhận dữ liệu qua mạng. Từ khi IE tự mở ra cửa sổ của nó lập tưc đối tượng tạo bởi CreateObject("InternetExplorer.Application") bị mất điều khiển và lỗi xảy ra "The object invoked has díconnected from its clients.". Như vậy có thể xử lý thằng IE không tự mở thì có thể làm việc được bình thường.

Thế thì thằng IE7 này lắm chuyện thật.
Trước đó tôi cài IE8 và đã test nhiều lần đều OK. Để thử với IE7 tôi đã xóa IE8 rồi cài IE7. Sau đó chạy code của ndu thì có 5 lần không có kết quả gì, và có 1 lần thì đúng là IE tự hiển thị, và có 1 loạt thẻ được mở. Sau đó tôi thử cho thêm Sleep 5000 thì nhận được kết quả.
Chính từ thử nghiệm trên mà tôi đã đề xuất 2 hướng đi. Tôi đã test cả 2 hướng thì đều nhận được kết quả - mỗi hướng test 3 lần. Trong 6 lần test này không có lần nào IE tự hiển thị. Chưa đến lúc nó "quậy"?
Tôi test trên XP Home sp2 + IE7, 8
 
Upvote 0
Upvote 0
thôi đúng rồi, cẩn thận quá vẫn hơn. Chắc chắn ie7 có vấn đề về readystate_complete
nói ngắn gọn thì thực ra document vẫn chưa được load hoàn chỉnh mà code đã "cố" đọc nội dung (.document.getelementbyid("result_box").innertext) nên kết quả là chuỗi rỗng.

Vậy thì tôi đề nghị 2 hướng:

1. Sau do until .readystate = 4: Doevents: Loop ta thêm chút chờ đợi: application.wait (now + timevalue("0:00:5"))

2. Chờ đợi 5 giây như ở trên không biết có là cách tốt hay không. Có khi ít quá (kết cục là thất bại) mà có khi nhiều quá (chờ phí công). Tôi đề nghị chờ tối đa 10 giây. Tức nếu sau 1, 2, 3 giây mà đã có kết quả thì không chờ thêm nữa, còn không thì chờ tiếp nhưng tối đa là 10 giây. Sau 10 giây mà vẫn chưa có kết quả thì cũng dọn đồ chơi luôn.

Mã:
    do until .readystate = 4: Doevents: Loop
    do while count < 10 and result_data = ""
        application.wait (now + timevalue("0:00:1"))
        result_data = .document.getelementbyid("result_box").innertext
        count = count + 1
        debug.print count
    loop

tôi đã sửa lại code hàm translate theo code trên.

Các bạn lê duy thương, nguyễn duy tuân, crystal rose, good-luck đã "kêu ca" thì bây giờ đề nghị thử lại, thậm chí với ie7, và cho biết kết quả nhé.
máy em đã chạy ok rồi anh ơi. Cảm ơn sự nhiệt huyết của các anh.có điều cái thằng google translate nó dịch tầm bậy.thậm chí thua translate trong word nữa. Anh có thể chuyển qua anh bill dịch dùm được không.MÁY EM DUNG W8 32 BIT
 

File đính kèm

  • TRANS1.jpg
    TRANS1.jpg
    44 KB · Đọc: 30
  • TRANS2.jpg
    TRANS2.jpg
    118.1 KB · Đọc: 24
Upvote 0
Thôi đúng rồi, cẩn thận quá vẫn hơn. Chắc chắn IE7 có vấn đề về READYSTATE_COMPLETE
Nói ngắn gọn thì thực ra document vẫn chưa được load hoàn chỉnh mà code đã "cố" đọc nội dung (.Document.getElementById("result_box").innerText) nên kết quả là chuỗi rỗng.

Vậy thì tôi đề nghị 2 hướng:

1. Sau Do Until .ReadyState = 4: DoEvents: Loop ta thêm chút chờ đợi: Application.Wait (Now + TimeValue("0:00:5"))

2. Chờ đợi 5 giây như ở trên không biết có là cách tốt hay không. Có khi ít quá (kết cục là thất bại) mà có khi nhiều quá (chờ phí công). Tôi đề nghị chờ tối đa 10 giây. Tức nếu sau 1, 2, 3 giây mà đã có kết quả thì không chờ thêm nữa, còn không thì chờ tiếp nhưng tối đa là 10 giây. Sau 10 giây mà vẫn chưa có kết quả thì cũng dọn đồ chơi luôn.

Mã:
    Do Until .ReadyState = 4: DoEvents: Loop
    Do While count < 10 And result_data = ""
        Application.Wait (Now + TimeValue("0:00:1"))
        result_data = .Document.getElementById("result_box").innerText
        count = count + 1
        Debug.Print count
    Loop

Tôi đã sửa lại code hàm Translate theo code trên.

Các bạn Lê Duy Thương, Nguyễn Duy Tuân, Crystal Rose, Good-Luck đã "kêu ca" thì bây giờ đề nghị thử lại, thậm chí với IE7, và cho biết kết quả nhé.

Mình dùng Google Chrome, test thấy Ok!, tuy nhiên đôi lúc cũng hiện lên trang Web.

Mình xin mạn phép cải tiến thêm tí:
- Gán mặc định in = tiếng Anh, out = tiếng Việt
- Thêm một nút đảo in <--> out và một "dấu X" để xóa nội dung cũ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em tìm trên mạng thấy dân tình cũng kêu thủ tục "getElementById" lỗi trên IE 6,7. Và có cách giải quyết bằng ngôn ngữ Java gì gì đó:

Link đây:
http://msdn.microsoft.com/en-us/library/ie/ms536437(v=vs.85).aspx
http://remysharp.com/2007/02/10/ie-7-breaks-getelementbyid/

Vụ viết java script thì chịu thua rồi. +-+-+-+

Như thế là IE7 có vấn đề. Thiên hạ người ta biết từ lâu, chỉ có mình bây giờ mới "khám phá" ra.
Được cái an ủi là hiếm có người bây giờ dùng IE7. Vì nhiều trang web không chịu mở, không mở hoàn chỉnh nếu là IE7. Thậm chí IE8.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom