mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 14:16:09 -06:00
329 lines
No EOL
10 KiB
C++
329 lines
No EOL
10 KiB
C++
#include "GoogleTranslator.h"
|
|
|
|
// Public methods
|
|
|
|
GoogleTranslator::GoogleTranslator(){
|
|
isTranslated = false;
|
|
translatedText = "";
|
|
formatedText = "";
|
|
correctionText = "";
|
|
useProxy = false;
|
|
proxyHTTPAddress = "";
|
|
proxyHTTPPort = 0;
|
|
languageFrom = "en";
|
|
languageTo = "fr";
|
|
correctedText = "";
|
|
}
|
|
|
|
bool GoogleTranslator::sendHttpGet(String& url, String& post, String& result_text, Gate2<int, int> _progress){
|
|
// Proxy
|
|
refreshProxy();
|
|
|
|
httpClient.URL(url+"&"+post);
|
|
//httpClient.Agent("Mozilla/5.0");
|
|
httpClient.TimeoutMsecs(5000);
|
|
httpClient.Get();
|
|
|
|
bool status = true;
|
|
|
|
result_text = httpClient.ExecuteRedirect(HttpClient::DEFAULT_MAX_REDIRECT,
|
|
HttpClient::DEFAULT_RETRIES, _progress);
|
|
if (!IsNull(httpClient.GetError())||httpClient.IsAborted()){
|
|
status = false;
|
|
result_text = String("Error:").Cat()<<Nvl(httpClient.GetError(), String(""))
|
|
<<String("\n, status: ")<<httpClient.GetStatusCode()<<String(", ")<<httpClient.GetStatusLine()
|
|
<<String("\n, header: ")<<httpClient.GetHeaders();
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
bool GoogleTranslator::sendHttpPost(String& url, String& post, String& result_text, Gate2<int, int> _progress){
|
|
// Proxy
|
|
refreshProxy();
|
|
|
|
httpClient.URL(url);
|
|
//httpClient.Agent("Mozilla/5.0");
|
|
httpClient.TimeoutMsecs(5000);
|
|
httpClient.Post();
|
|
httpClient.PostData(post);
|
|
|
|
bool status = true;
|
|
|
|
result_text = httpClient.ExecuteRedirect(HttpClient::DEFAULT_MAX_REDIRECT,
|
|
HttpClient::DEFAULT_RETRIES, _progress);
|
|
if (!IsNull(httpClient.GetError())||httpClient.IsAborted()){
|
|
status = false;
|
|
result_text = String("Error:").Cat()<<Nvl(httpClient.GetError(), String(""))
|
|
<<String("\n, status: ")<<httpClient.GetStatusCode()<<String(", ")<<httpClient.GetStatusLine()
|
|
<<String("\n, header: ")<<httpClient.GetHeaders();
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
bool GoogleTranslator::Translate(Gate2<int, int> _progress){
|
|
//String url = "http://translate.google.com/translate_a/t?client=t";
|
|
// till 18.11.2009 was:
|
|
String url = "www.google.com/translate_a/t?client=t";
|
|
//or
|
|
//String url = "http://translate.google.com/translate_t?";
|
|
|
|
url << String("&sl=") << languageFrom << String("&tl=") << languageTo;
|
|
// or
|
|
//url << String("&langpair=") << languageFrom << String("|") << languageTo;
|
|
|
|
url << String("&ie=utf-8&oe=utf-8");
|
|
|
|
String post = String("text=") + UrlEncode(sourceText);
|
|
|
|
isTranslated = sendHttpPost(url, post, translatedText, _progress);
|
|
// or
|
|
//isTranslated = sendHttpPost(url, post, translatedText, _progress);
|
|
|
|
// Empty other properties
|
|
formatedText = "";
|
|
correctionText = "";
|
|
correctedText = "";
|
|
|
|
return isTranslated;
|
|
}
|
|
|
|
//... need to finish this procedure and test it
|
|
// gtrans=<GoogleTranslatedText>&hl=<ReturnLanguage>&langpair=<SourceLanguage>|<DestinationLanguage>&oe=UTF-8&text=<SourceText>&utrans=<UserTranslation>
|
|
// need to test "&hl=ru" if noun, adjective,... is returned in speciffic language
|
|
bool GoogleTranslator::SetCorrectionText(String correction_text, String& result_text, Gate2<int, int> _progress){
|
|
if(!isTranslated)
|
|
return false;
|
|
|
|
String url = "http://translate.google.com/translate_suggestion?";
|
|
//or //? not sure
|
|
//String url = "http://www.google.com/translate_a/t?client=t";
|
|
|
|
url << String("&sl=") << languageFrom << String("&tl=") << languageTo;
|
|
// or
|
|
//url << String("&langpair=") << languageFrom << String("|") << languageTo;
|
|
|
|
url << String("&ie=utf-8&oe=utf-8");
|
|
|
|
url << String("&hl=") << languageTo;
|
|
|
|
url << String("&text=") << UrlEncode(sourceText);
|
|
url << String(">rans=") << UrlEncode(correctionText);
|
|
|
|
String post = String("utrans=") + UrlEncode(correction_text);
|
|
|
|
bool status = sendHttpPost(url, post, result_text, _progress);
|
|
|
|
if(status)
|
|
correctedText = correction_text;
|
|
|
|
return status;
|
|
}
|
|
|
|
String GoogleTranslator::GetFormatedText(){
|
|
if(!isTranslated)
|
|
return formatedText; // if not translated it is null or have error message
|
|
|
|
if(formatedText.GetCount()>0)
|
|
return formatedText;
|
|
|
|
// Common formatting
|
|
translatedText = replace_string ( translatedText, String("\\r\\n").Cat(), String("\n").Cat());
|
|
//translatedText = replace_string ( translatedText, String("\\r\\n ").Cat(), String("\n").Cat());
|
|
translatedText = replace_string ( translatedText, String("\\\"").Cat(), String("\"").Cat());
|
|
translatedText = replace_string ( translatedText, String("\\\\").Cat(), String("\\").Cat());
|
|
translatedText = replace_string ( translatedText, String("\\n").Cat(), String("\n").Cat());
|
|
translatedText = replace_string ( translatedText, String("\\x3c").Cat(), String("<").Cat());
|
|
translatedText = replace_string ( translatedText, String("\\x3e").Cat(), String(">").Cat());
|
|
|
|
if(translatedText.StartsWith("\"")){// is string
|
|
formatedText = translatedText;
|
|
|
|
formatedText.Remove(0, 1);
|
|
formatedText.Remove(formatedText.GetLength()-1, 1);
|
|
|
|
// Set Correction text
|
|
correctionText = formatedText;
|
|
}
|
|
else if (translatedText.StartsWith("[\"")){ // is terms
|
|
String text_temp = translatedText, text_lf = String("\n");
|
|
|
|
// For debugging
|
|
//String original_text = translatedText;
|
|
|
|
int text_temp_pos, text_temp_pos1;
|
|
text_temp_pos = 2;
|
|
|
|
// Get first word
|
|
text_temp_pos1 = text_temp.Find("\"", text_temp_pos);
|
|
|
|
if(text_temp_pos1==-1)
|
|
text_temp_pos1 = text_temp.GetLength();
|
|
|
|
formatedText = text_temp.Mid(text_temp_pos,text_temp_pos1 - text_temp_pos);
|
|
|
|
// Set first term as text for correction
|
|
correctionText = formatedText;
|
|
|
|
text_temp_pos = text_temp_pos1+1;
|
|
formatedText<<text_lf;
|
|
|
|
if(text_temp.Mid(text_temp_pos, 2).StartsWith(",[")){
|
|
text_temp_pos+=2;
|
|
|
|
while(text_temp.Mid(text_temp_pos, 2).StartsWith("[\"")){
|
|
text_temp_pos+=2;
|
|
// get group name
|
|
text_temp_pos1 = text_temp.Find("\"",text_temp_pos);
|
|
|
|
if(text_temp_pos1==-1)
|
|
text_temp_pos1= text_temp.GetLength();
|
|
|
|
if(text_temp_pos,text_temp_pos1 - text_temp_pos >1){
|
|
formatedText<<text_lf;
|
|
formatedText<<t_(text_temp.Mid(text_temp_pos,text_temp_pos1 - text_temp_pos))<<String(":").Cat();
|
|
}
|
|
text_temp_pos = text_temp_pos1+1;
|
|
|
|
// Get group list
|
|
while(text_temp.Mid(text_temp_pos, 2).StartsWith(",\"")){
|
|
text_temp_pos+=2;
|
|
text_temp_pos1 = text_temp.Find("\"",text_temp_pos);
|
|
|
|
if(text_temp_pos1==-1)
|
|
text_temp_pos1= text_temp.GetLength();
|
|
|
|
formatedText<<text_lf;
|
|
formatedText<<String("\t")<<text_temp.Mid(text_temp_pos,text_temp_pos1 - text_temp_pos);
|
|
text_temp_pos = text_temp_pos1+1;
|
|
}
|
|
text_temp_pos+=2;//],
|
|
}
|
|
|
|
}
|
|
// For debug
|
|
//formatedText<<text_lf<<text_temp.Mid(text_temp_pos);
|
|
//formatedText<<text_lf<<original_text;
|
|
}else if (translatedText.StartsWith("{\"sentences\":[{\"trans\":\"")) {
|
|
String text_lf = String("\n"), text_tab = String("\t"), curr_tab;
|
|
int text_temp_pos, text_temp_pos1, text_temp_pos2;
|
|
text_temp_pos = 14;
|
|
|
|
text_temp_pos1 = translatedText.Find("\"}],\"", text_temp_pos);
|
|
if (text_temp_pos1==-1)
|
|
text_temp_pos1 = translatedText.GetLength();
|
|
|
|
String translit_text_temp;
|
|
|
|
while(translatedText.Mid(text_temp_pos, 10).StartsWith("{\"trans\":\"")&&(text_temp_pos<text_temp_pos1)){
|
|
text_temp_pos += 10;
|
|
text_temp_pos2 = translatedText.Find("\",\"orig\":\"", text_temp_pos);
|
|
if ((text_temp_pos2==-1)||(text_temp_pos2>text_temp_pos1))
|
|
text_temp_pos2 = text_temp_pos1;
|
|
|
|
formatedText<<translatedText.Mid(text_temp_pos, text_temp_pos2 - text_temp_pos);
|
|
|
|
if(text_temp_pos2<text_temp_pos1)
|
|
text_temp_pos2+=3;
|
|
text_temp_pos = text_temp_pos2;
|
|
|
|
// translit
|
|
text_temp_pos2 = translatedText.Find("\",\"translit\":\"", text_temp_pos);
|
|
if (text_temp_pos2==-1)
|
|
text_temp_pos2 = text_temp_pos1;
|
|
else
|
|
text_temp_pos2+=14;
|
|
text_temp_pos = text_temp_pos2;
|
|
|
|
text_temp_pos2 = translatedText.Find("\"}", text_temp_pos);
|
|
if (text_temp_pos2==-1)
|
|
text_temp_pos2 = text_temp_pos1;
|
|
|
|
if(text_temp_pos<text_temp_pos2)
|
|
translit_text_temp<<text_tab<<translatedText.Mid(text_temp_pos, text_temp_pos2 - text_temp_pos);
|
|
text_temp_pos = text_temp_pos2+3;
|
|
}
|
|
|
|
// Set Correction text
|
|
correctionText = formatedText;
|
|
|
|
if(translit_text_temp.GetLength()>0)
|
|
formatedText<<text_lf<<String("translit:").Cat()<<text_lf<<text_tab<<translit_text_temp;
|
|
|
|
text_temp_pos = text_temp_pos1+5;
|
|
|
|
if(translatedText.Mid(text_temp_pos, 4).StartsWith("dict")){
|
|
text_temp_pos+=7;//dict":[
|
|
while(translatedText.Mid(text_temp_pos, 8).StartsWith("{\"pos\":\"")){
|
|
text_temp_pos+=8;//{"pos":"
|
|
|
|
text_temp_pos1 = translatedText.Find("\",\"terms\":[\"", text_temp_pos);
|
|
if (text_temp_pos1==-1)
|
|
text_temp_pos1 = translatedText.GetLength();
|
|
|
|
curr_tab = "";
|
|
//Group name
|
|
if(text_temp_pos1>text_temp_pos){
|
|
curr_tab = text_tab;
|
|
formatedText<<text_lf<<translatedText.Mid(text_temp_pos, text_temp_pos1 - text_temp_pos)<<String(":").Cat();
|
|
}
|
|
text_temp_pos = text_temp_pos1+12;
|
|
|
|
text_temp_pos2 = translatedText.Find("\"]}", text_temp_pos);
|
|
if (text_temp_pos2==-1)
|
|
text_temp_pos2 = translatedText.GetLength();
|
|
|
|
while(text_temp_pos<text_temp_pos2){
|
|
text_temp_pos1 = translatedText.Find("\",\"", text_temp_pos);
|
|
if((text_temp_pos1>text_temp_pos2)||(text_temp_pos1==-1))
|
|
text_temp_pos1 = text_temp_pos2;
|
|
formatedText<<text_lf<<curr_tab<<translatedText.Mid(text_temp_pos, text_temp_pos1 - text_temp_pos);
|
|
text_temp_pos = text_temp_pos1+3;
|
|
}
|
|
text_temp_pos = text_temp_pos2+4;
|
|
}
|
|
}
|
|
}else{
|
|
formatedText = translatedText;
|
|
|
|
// Set Correction text
|
|
correctionText = formatedText;
|
|
}
|
|
|
|
return formatedText;
|
|
}
|
|
|
|
String replace_string(String& s1, String& find, String replace){
|
|
String string_result;
|
|
|
|
int start_pos = 0;
|
|
int found_pos = 0;
|
|
int find_len = find.GetCount();
|
|
int s1_count = s1.GetCount();
|
|
|
|
while(((found_pos=s1.Find(find, start_pos))!=-1)){
|
|
string_result.Cat(s1.Mid(start_pos, found_pos - start_pos));
|
|
string_result.Cat(replace);
|
|
start_pos = found_pos + find_len;
|
|
};
|
|
|
|
if(start_pos<s1.GetCount())
|
|
string_result.Cat(s1.Mid(start_pos));
|
|
|
|
return (string_result);
|
|
}
|
|
|
|
// Private Methods
|
|
//----------------------------------------------------------------------------
|
|
void GoogleTranslator::refreshProxy(){
|
|
if(useProxy)
|
|
httpClient.Proxy(proxyHTTPAddress, proxyHTTPPort);
|
|
else
|
|
httpClient.Proxy(NULL, 0);
|
|
|
|
if((useProxy)&&(useProxyAuth))
|
|
httpClient.ProxyAuth(proxyHTTPUsername, proxyHTTPPassword);
|
|
else
|
|
httpClient.ProxyAuth(NULL, NULL);
|
|
} |