diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java index 7ee87b01c6..0537f7b61e 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java @@ -352,7 +352,8 @@ public void onItemClick(int id) { LocaleController.getString("ProviderMicrosoftTranslator", R.string.ProviderMicrosoftTranslator), LocaleController.getString("ProviderMicrosoftTranslator", R.string.ProviderYouDao), LocaleController.getString("ProviderMicrosoftTranslator", R.string.ProviderDeepLTranslate), - LocaleController.getString("ProviderTelegramAPI", R.string.ProviderTelegramAPI) + LocaleController.getString("ProviderTelegramAPI", R.string.ProviderTelegramAPI), + LocaleController.getString("ProviderTranSmartTranslate", R.string.ProviderTranSmartTranslate), }, (i, __) -> { boolean needReset = NekoConfig.translationProvider.Int() - 1 != i && (NekoConfig.translationProvider.Int() == 1 || i == 0); NekoConfig.translationProvider.setConfigInt(i + 1); @@ -765,6 +766,9 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { case Translator.providerTelegram: value = LocaleController.getString("ProviderTelegramAPI", R.string.ProviderTelegramAPI); break; + case Translator.providerTranSmart: + value = LocaleController.getString("ProviderTranSmartTranslate", R.string.ProviderTranSmartTranslate); + break; default: value = "Unknown"; } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/Translator.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/Translator.kt index ab1c2908d9..aa4479197c 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/Translator.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/Translator.kt @@ -82,6 +82,7 @@ interface Translator { const val providerYouDao = 6 const val providerDeepL = 7 const val providerTelegram = 8 + const val providerTranSmart = 9 @Throws(Exception::class) suspend fun translate(to: Locale, query: String): String { @@ -119,6 +120,7 @@ interface Translator { providerYouDao -> YouDaoTranslator providerDeepL -> DeepLTranslator providerTelegram -> TelegramAPITranslator + providerTranSmart -> TranSmartTranslator else -> throw IllegalArgumentException() } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/source/TranSmartTranslator.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/source/TranSmartTranslator.kt new file mode 100644 index 0000000000..312b85e9e3 --- /dev/null +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/transtale/source/TranSmartTranslator.kt @@ -0,0 +1,83 @@ +package tw.nekomimi.nekogram.transtale.source + +import cn.hutool.http.HttpUtil +import org.json.JSONArray +import org.json.JSONObject +import org.telegram.messenger.LocaleController +import org.telegram.messenger.R +import tw.nekomimi.nekogram.transtale.Translator +import tw.nekomimi.nekogram.utils.applyUserAgent +import java.util.Date +import java.util.UUID + +object TranSmartTranslator : Translator { + + private val targetLanguages = listOf( + "ar", "fr", "fil", "lo", "ja", "it", "hi", "id", "vi", "de", "km", "ms", "th", "tr", "zh", "ru", "ko", "pt", "es" + ) + + private fun getRandomBrowserVersion(): String { + val majorVersion = (Math.random() * 17).toInt() + 100 + val minorVersion = (Math.random() * 20).toInt() + val patchVersion = (Math.random() * 20).toInt() + return "$majorVersion.$minorVersion.$patchVersion" + } + + private fun getRandomOperatingSystem(): String { + val operatingSystems = arrayOf("Mac OS", "Windows") + val randomIndex = (Math.random() * operatingSystems.size).toInt() + return operatingSystems[randomIndex] + } + + override suspend fun doTranslate(from: String, to: String, query: String): String { + + if (to !in targetLanguages) { + error(LocaleController.getString("TranslateApiUnsupported", R.string.TranslateApiUnsupported)) + } + + val source = JSONArray() + for (s in query.split("\n")) { + source.put(s) + } + + val response = HttpUtil.createPost("https://transmart.qq.com/api/imt") + .header("Content-Type", "application/json; charset=UTF-8") + .applyUserAgent() + .body(JSONObject().apply { + put("header", JSONObject().apply{ + put("client_key", "browser-chrome-${getRandomBrowserVersion()}-${getRandomOperatingSystem()}-${UUID.randomUUID()}-${Date().time}") + put("fn", "auto_translation") + put("session", "") + put("user", "") + }) + put("source", JSONObject().apply{ + put("lang", if (targetLanguages.contains(from)) from else "en") + put("text_list", source) + }) + put("target", JSONObject().apply{ + put("lang", to) + }) + put("model_category", "normal") + put("text_domain", "") + put("type", "plain") + }.toString()) + .execute() + + if (response.status != 200) { + error("HTTP ${response.status} : ${response.body()}") + } + + val target: JSONArray = JSONObject(response.body()).getJSONArray("auto_translation") + val result = StringBuilder() + for (i in 0 until target.length()) { + result.append(target.getString(i)) + if (i != target.length() - 1) { + result.append("\n") + } + } + + return result.toString().trimEnd() + + } + +} diff --git a/TMessagesProj/src/main/res/values-zh-rCN/strings_na.xml b/TMessagesProj/src/main/res/values-zh-rCN/strings_na.xml index 17d67687f4..3aeb9d4fa2 100644 --- a/TMessagesProj/src/main/res/values-zh-rCN/strings_na.xml +++ b/TMessagesProj/src/main/res/values-zh-rCN/strings_na.xml @@ -99,4 +99,5 @@ 用于与其他应用共享贴纸包 (点击选择存储位置) 刷新外部缓存 删除外部缓存 + 腾讯交互翻译 diff --git a/TMessagesProj/src/main/res/values-zh-rTW/strings_na.xml b/TMessagesProj/src/main/res/values-zh-rTW/strings_na.xml index 964e1315b2..00b2890c1f 100644 --- a/TMessagesProj/src/main/res/values-zh-rTW/strings_na.xml +++ b/TMessagesProj/src/main/res/values-zh-rTW/strings_na.xml @@ -78,4 +78,5 @@ 使用群組名稱作為輸入框提示 隱藏輸入框中的機器人按鈕 在訊息提示下顯示傳送者 + 騰訊交互翻譯 diff --git a/TMessagesProj/src/main/res/values/strings_na.xml b/TMessagesProj/src/main/res/values/strings_na.xml index 0c15d27d5e..08c189c1a2 100644 --- a/TMessagesProj/src/main/res/values/strings_na.xml +++ b/TMessagesProj/src/main/res/values/strings_na.xml @@ -102,4 +102,5 @@ For sharing sticker packs with other apps. Click to pick storage location. Refresh External Cache Delete External Cache + TranSmart Translator