1
0
mirror of https://github.com/MGislv/NekoX.git synced 2024-07-04 11:13:36 +00:00

Add yandex translation

This commit is contained in:
NekoInverter 2020-06-09 22:25:48 +08:00
parent 2eac418dc1
commit 3ffd66bf0d
No known key found for this signature in database
GPG Key ID: 280D6CCCF95715F9
4 changed files with 161 additions and 2 deletions

View File

@ -90,6 +90,8 @@ public class NekoGeneralSettingsActivity extends BaseFragment {
types.add(Translator.PROVIDER_GOOGLE_CN);
arrayList.add(LocaleController.getString("ProviderLingocloud", R.string.ProviderLingocloud));
types.add(Translator.PROVIDER_LINGO);
arrayList.add(LocaleController.getString("ProviderYandex", R.string.ProviderYandex));
types.add(Translator.PROVIDER_YANDEX);
arrayList.add(LocaleController.getString("ProviderGoogleTranslateWeb", R.string.ProviderGoogleTranslateWeb));
types.add(Translator.PROVIDER_GOOGLE_WEB);
arrayList.add(LocaleController.getString("ProviderGoogleTranslateCNWeb", R.string.ProviderGoogleTranslateCNWeb));
@ -532,6 +534,9 @@ public class NekoGeneralSettingsActivity extends BaseFragment {
case Translator.PROVIDER_DEEPL_WEB:
value = LocaleController.getString("ProviderDeepLWeb", R.string.ProviderDeepLWeb);
break;
case Translator.PROVIDER_YANDEX:
value = LocaleController.getString("ProviderYandex", R.string.ProviderYandex);
break;
case Translator.PROVIDER_LINGO:
default:
value = LocaleController.getString("ProviderLingocloud", R.string.ProviderLingocloud);

View File

@ -15,6 +15,7 @@ abstract public class Translator {
public static final int PROVIDER_GOOGLE = 1;
public static final int PROVIDER_GOOGLE_CN = 2;
public static final int PROVIDER_LINGO = 3;
public static final int PROVIDER_YANDEX = 4;
public static final int PROVIDER_GOOGLE_WEB = -1;
public static final int PROVIDER_GOOGLE_CN_WEB = -2;
public static final int PROVIDER_BAIDU_WEB = -3;
@ -23,12 +24,25 @@ abstract public class Translator {
public static void translate(String query, TranslateCallBack translateCallBack) {
Locale locale = LocaleController.getInstance().currentLocale;
String toLang;
if (NekoConfig.translationProvider != 3 && locale.getLanguage().equals("zh") && (locale.getCountry().toUpperCase().equals("CN") || locale.getCountry().toUpperCase().equals("TW"))) {
if (NekoConfig.translationProvider != PROVIDER_LINGO && NekoConfig.translationProvider != PROVIDER_YANDEX && locale.getLanguage().equals("zh") && (locale.getCountry().toUpperCase().equals("CN") || locale.getCountry().toUpperCase().equals("TW"))) {
toLang = locale.getLanguage() + "-" + locale.getCountry().toUpperCase();
} else {
toLang = locale.getLanguage();
}
Translator translator = NekoConfig.translationProvider == PROVIDER_LINGO ? LingoTranslator.getInstance() : GoogleWebTranslator.getInstance();
Translator translator;
switch (NekoConfig.translationProvider) {
case PROVIDER_YANDEX:
translator = YandexTranslator.getInstance();
break;
case PROVIDER_GOOGLE:
case PROVIDER_GOOGLE_CN:
translator = GoogleWebTranslator.getInstance();
break;
case PROVIDER_LINGO:
default:
translator = LingoTranslator.getInstance();
break;
}
if (!translator.getTargetLanguages().contains(toLang)) {
translateCallBack.onUnsupported();
} else {

View File

@ -0,0 +1,139 @@
package tw.nekomimi.nekogram.translator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.telegram.messenger.FileLog;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
public class YandexTranslator extends Translator {
private static YandexTranslator instance;
private List<String> targetLanguages = Arrays.asList(
"en", "af", "am", "ar", "az", "be", "bg", "bn", "bs", "ca", "ceb", "cs", "cy",
"da", "de", "el", "eo", "es", "et", "eu", "fa", "fi", "fr", "ga", "gd", "gl", "gu",
"he", "hi", "hr", "ht", "hu", "hy", "id", "is", "it", "ja", "jv", "ka", "kk", "km",
"kn", "ko", "ky", "la", "lb", "lo", "lt", "lv", "mg", "mi", "mk", "ml", "mn", "mr",
"ms", "mt", "my", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "si", "sk", "sl",
"sq", "sr", "su", "sv", "sw", "ta", "te", "tg", "th", "tl", "tr", "tt", "uk", "ur",
"uz", "vi", "xh", "yi", "zh");
static YandexTranslator getInstance() {
if (instance == null) {
synchronized (YandexTranslator.class) {
if (instance == null) {
instance = new YandexTranslator();
}
}
}
return instance;
}
private static String getResult(String string) throws JSONException {
JSONObject json = new JSONObject(string);
int code = json.getInt("code");
if (code != 200) {
return null;
}
JSONArray array = json.getJSONArray("text");
StringBuilder sb = new StringBuilder();
int length = array.length();
for (int i = 0; i < length; i++) {
sb.append(array.getString(i));
}
return sb.toString();
}
@Override
protected String translate(String query, String tl) {
String result = translateImpl(query, tl);
if (result == null) {
return translateImpl(query, tl);
}
return result;
}
@Override
protected List<String> getTargetLanguages() {
return targetLanguages;
}
private String translateImpl(String query, String tl) {
String url = "https://translate.yandex.net/api/v1.5/tr.json/translate"
+ "?key=trnsl.1.1.20160205T121943Z.0208eaff12c2747d.9526187390798b3098ec23e8f02073168e0b52c1"
+ "&lang=" + tl;
try {
return getResult(request(url, "text=" + URLEncoder.encode(query, "UTF-8")));
} catch (JSONException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
private String request(String url, String param) {
try {
ByteArrayOutputStream outbuf;
InputStream httpConnectionStream;
URL downloadUrl = new URL(url);
HttpURLConnection httpConnection = (HttpURLConnection) downloadUrl.openConnection();
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded charset=UTF-8");
httpConnection.addRequestProperty("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A5297c Safari/602.1");
httpConnection.setConnectTimeout(1000);
httpConnection.setReadTimeout(2000);
httpConnection.setRequestMethod("POST");
httpConnection.setDoOutput(true);
DataOutputStream dataOutputStream = new DataOutputStream(httpConnection.getOutputStream());
//noinspection CharsetObjectCanBeUsed
byte[] t = param.getBytes("UTF-8");
dataOutputStream.write(t);
dataOutputStream.flush();
dataOutputStream.close();
httpConnection.connect();
if (httpConnection.getResponseCode() != HttpURLConnection.HTTP_OK) {
httpConnectionStream = httpConnection.getErrorStream();
} else {
httpConnectionStream = httpConnection.getInputStream();
}
outbuf = new ByteArrayOutputStream();
byte[] data = new byte[1024 * 32];
while (true) {
int read = httpConnectionStream.read(data);
if (read > 0) {
outbuf.write(data, 0, read);
} else if (read == -1) {
break;
} else {
break;
}
}
String result = new String(outbuf.toByteArray());
try {
httpConnectionStream.close();
} catch (Throwable e) {
FileLog.e(e);
}
try {
outbuf.close();
} catch (Exception ignore) {
}
return result;
} catch (Throwable e) {
FileLog.e(e);
return null;
}
}
}

View File

@ -119,4 +119,5 @@
<string name="SponsorContent">dummy</string>
<string name="BetaWarning">This is a **beta** feature implemented by **Telegram**.</string>
<string name="MediaPreview">Media preview in dialog list</string>
<string name="ProviderYandex">Yandex Translate</string>
</resources>