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:
parent
2eac418dc1
commit
3ffd66bf0d
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
Loading…
Reference in New Issue
Block a user