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