/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2012 Alex Buloichik, Didier Briel
2014 Ilia Vinogradov
2015 Kos Ivantsov
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.core.machinetranslators;
import java.awt.Window;
import java.io.StringReader;
import java.util.Map;
import java.util.TreeMap;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.omegat.gui.exttrans.MTConfigDialog;
import org.omegat.util.Language;
import org.omegat.util.OStrings;
import org.omegat.util.Preferences;
import org.omegat.util.WikiGet;
import org.xml.sax.InputSource;
/**
* Yandex Translate plugin for OmegaT (Caching translations).
* @author oisee
*/
class YTPPostResponse {
public int code;
public String response;
}
@SuppressWarnings({"unchecked", "rawtypes"})
public class YandexTranslate extends BaseTranslate {
public static final int ERR_OK = 200;
public static final int ERR_KEY_INVALID = 401;
public static final int ERR_KEY_BLOCKED = 402;
public static final int ERR_DAILY_REQ_LIMIT_EXCEEDED = 403;
public static final int ERR_DAILY_CHAR_LIMIT_EXCEEDED = 404;
public static final int ERR_TEXT_TOO_LONG = 413;
public static final int ERR_UNPROCESSABLE_TEXT = 422;
public static final int ERR_LANG_NOT_SUPPORTED = 501;
private static final String PROPERTY_API_KEY = "yandex.api.key";
protected static final String USER_AGENT = "Mozilla/5.0";
protected static final String GT_URL = "https://translate.yandex.net/api/v1.5/tr/translate";
@Override
protected String getPreferenceName() {
return Preferences.ALLOW_YANDEX_TRANSLATE;
}
public String getName() {
return OStrings.getString("MT_ENGINE_YANDEX");
}
@Override
protected String translate(Language sLang, Language tLang, String text) throws Exception {
String mvYandexKey = getCredential(PROPERTY_API_KEY);
if (mvYandexKey.isEmpty()) {
return "";
}
String lvSourceLang = sLang.getLanguageCode().substring(0, 2).toLowerCase();
String lvTargetLang = tLang.getLanguageCode().substring(0, 2).toLowerCase();
// U+2026 HORIZONTAL ELLIPSIS
String lvShorText = text.length() > 10000 ? text.substring(0, 9999) + "\u2026" : text;
String prev = getFromCache(sLang, tLang, lvShorText);
if (prev != null) {
return prev;
}
//----------------------------------------------------------------------
Map<String, String> p = new TreeMap<String, String>();
p.put("key", mvYandexKey);
p.put("lang", lvSourceLang + '-' + lvTargetLang);
p.put("text", lvShorText);
YTPPostResponse response = requestTranslate(p);//WikiGet.post(GT_URL, p);
XPathFactory xPathFactory = XPathFactory.newInstance();
//XPath xPathCode = xPathFactory.newXPath();
//String pathCode = "/Translation/@code";
//String code = (String) xPathCode.evaluate(pathCode, new InputSource(new StringReader(lvResponse)));
switch (response.code) {
case ERR_OK:
break;
case ERR_KEY_INVALID:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_INVALID_KEY");
case ERR_KEY_BLOCKED:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_API_BLOCKED");
case ERR_DAILY_REQ_LIMIT_EXCEEDED:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_DAILY_LIMIT_DETECT");
case ERR_DAILY_CHAR_LIMIT_EXCEEDED:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_DAILY_LIMIT_VOLUME");
case ERR_TEXT_TOO_LONG:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_MAZ_SIZE");
case ERR_UNPROCESSABLE_TEXT:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_TRANSLATION_NOT_POSSIBLE");
case ERR_LANG_NOT_SUPPORTED:
return response.code +": " + OStrings.getString("MT_ENGINE_YANDEX_DIRECTION_NOT_SUPPORTED");
default:
break;
}
XPath xPathText = xPathFactory.newXPath();
String pathText = "/Translation[@code='200']/text";
String result = xPathText.evaluate(pathText, new InputSource(new StringReader(response.response)));
putToCache(sLang, tLang, lvShorText, result);
return result;
}
protected YTPPostResponse requestTranslate(Map params) throws Exception {
YTPPostResponse response = new YTPPostResponse();
try {
response.response = WikiGet.post(GT_URL, params);
response.code = ERR_OK;
} catch (WikiGet.ResponseError ex) {
response.response = null;
response.code = ex.code;
}
return response;
}
@Override
public boolean isConfigurable() {
return true;
}
@Override
public void showConfigurationUI(Window parent) {
MTConfigDialog dialog = new MTConfigDialog(parent, getName()) {
@Override
protected void onConfirm() {
String key = panel.valueField1.getText().trim();
boolean temporary = panel.temporaryCheckBox.isSelected();
setCredential(PROPERTY_API_KEY, key, temporary);
}
};
dialog.panel.valueLabel1.setText(OStrings.getString("MT_ENGINE_YANDEX_API_KEY_LABEL"));
dialog.panel.valueField1.setText(getCredential(PROPERTY_API_KEY));
dialog.panel.valueLabel2.setVisible(false);
dialog.panel.valueField2.setVisible(false);
dialog.panel.temporaryCheckBox.setSelected(isCredentialStoredTemporarily(PROPERTY_API_KEY));
dialog.show();
}
}