From a779d473cb7f5d39bc49a70d05f0991546f6c561 Mon Sep 17 00:00:00 2001 From: ROCKET Date: Tue, 24 Feb 2026 09:05:05 -0600 Subject: [PATCH] Fix translate bar tap and unify no-key translation providers --- .../translator/SimplyTranslateTranslator.java | 75 +++++++++++++++++++ .../translator/SpaceGramTranslator.java | 48 ++++++------ .../java/org/telegram/ui/ChatActivity.java | 2 +- .../ui/Components/TranslateButton.java | 28 ++++--- 4 files changed, 114 insertions(+), 39 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/spacegram/translator/SimplyTranslateTranslator.java diff --git a/TMessagesProj/src/main/java/org/spacegram/translator/SimplyTranslateTranslator.java b/TMessagesProj/src/main/java/org/spacegram/translator/SimplyTranslateTranslator.java new file mode 100644 index 00000000000..1d289c66520 --- /dev/null +++ b/TMessagesProj/src/main/java/org/spacegram/translator/SimplyTranslateTranslator.java @@ -0,0 +1,75 @@ +package org.spacegram.translator; + +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import org.json.JSONObject; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Utilities; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.charset.StandardCharsets; + +public class SimplyTranslateTranslator implements BaseTranslator { + + private static final String API_URL = "https://simplytranslate.org/api/translate"; + private final String engine; + + public SimplyTranslateTranslator(String engine) { + this.engine = engine; + } + + @Override + public void translate(String text, String fromLang, String toLang, Utilities.Callback2 done) { + if (TextUtils.isEmpty(text) || done == null) { + return; + } + + new Thread(() -> { + HttpURLConnection connection = null; + try { + String sourceLang = TextUtils.isEmpty(fromLang) ? "auto" : fromLang; + String url = API_URL + "?engine=" + Uri.encode(engine) + + "&from=" + Uri.encode(sourceLang) + + "&to=" + Uri.encode(toLang) + + "&text=" + Uri.encode(text); + + connection = (HttpURLConnection) new URI(url).toURL().openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + int responseCode = connection.getResponseCode(); + if (responseCode != 200) { + boolean rateLimit = responseCode == 429; + AndroidUtilities.runOnUIThread(() -> done.run(null, rateLimit)); + return; + } + + StringBuilder resultBuilder = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + resultBuilder.append(line); + } + } + + JSONObject response = new JSONObject(resultBuilder.toString()); + String translatedText = response.optString("translated_text", null); + AndroidUtilities.runOnUIThread(() -> done.run(translatedText, false)); + + } catch (Exception e) { + Log.e("SimplyTranslate", "Translation failed", e); + AndroidUtilities.runOnUIThread(() -> done.run(null, false)); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + }).start(); + } +} diff --git a/TMessagesProj/src/main/java/org/spacegram/translator/SpaceGramTranslator.java b/TMessagesProj/src/main/java/org/spacegram/translator/SpaceGramTranslator.java index 79ca671ae5d..2d8527e1d6a 100644 --- a/TMessagesProj/src/main/java/org/spacegram/translator/SpaceGramTranslator.java +++ b/TMessagesProj/src/main/java/org/spacegram/translator/SpaceGramTranslator.java @@ -10,11 +10,10 @@ public class SpaceGramTranslator { // Provider constants public static final int PROVIDER_GOOGLE = 1; - public static final int PROVIDER_DEEPL = 2; - public static final int PROVIDER_YANDEX = 3; - public static final int PROVIDER_MICROSOFT = 4; - public static final int PROVIDER_LIBRETRANSLATE = 5; - public static final int PROVIDER_MYMEMORY = 6; + public static final int PROVIDER_MYMEMORY = 2; + public static final int PROVIDER_BING = 3; + public static final int PROVIDER_BAIDU = 4; + public static final int PROVIDER_YANDEX = 5; private static final SpaceGramTranslator INSTANCE = new SpaceGramTranslator(); private final LruCache cache = new LruCache<>(200); @@ -22,11 +21,10 @@ public class SpaceGramTranslator { private SpaceGramTranslator() { providers.put(PROVIDER_GOOGLE, new GoogleTranslator()); - providers.put(PROVIDER_DEEPL, new DeepLTranslator()); - providers.put(PROVIDER_YANDEX, new YandexTranslator()); - providers.put(PROVIDER_MICROSOFT, new MicrosoftTranslator()); - providers.put(PROVIDER_LIBRETRANSLATE, new LibreTranslateTranslator()); providers.put(PROVIDER_MYMEMORY, new MyMemoryTranslator()); + providers.put(PROVIDER_BING, new SimplyTranslateTranslator("bing")); + providers.put(PROVIDER_BAIDU, new SimplyTranslateTranslator("baidu")); + providers.put(PROVIDER_YANDEX, new SimplyTranslateTranslator("yandex")); } public static SpaceGramTranslator getInstance() { @@ -37,16 +35,14 @@ public static String getProviderName(int provider) { switch (provider) { case PROVIDER_GOOGLE: return "Google Translate"; - case PROVIDER_DEEPL: - return "DeepL"; - case PROVIDER_YANDEX: - return "Yandex"; - case PROVIDER_MICROSOFT: - return "Microsoft Translator"; - case PROVIDER_LIBRETRANSLATE: - return "LibreTranslate"; case PROVIDER_MYMEMORY: return "MyMemory"; + case PROVIDER_BING: + return "Bing"; + case PROVIDER_BAIDU: + return "Baidu (CN)"; + case PROVIDER_YANDEX: + return "Yandex (RU)"; default: return "Google Translate"; } @@ -55,22 +51,20 @@ public static String getProviderName(int provider) { public static String[] getAllProviderNames() { return new String[]{ "Google Translate", - "DeepL", - "Yandex", - "Microsoft Translator", - "LibreTranslate", - "MyMemory" + "MyMemory", + "Bing", + "Baidu (CN)", + "Yandex (RU)" }; } public static int[] getAllProviderIds() { return new int[]{ PROVIDER_GOOGLE, - PROVIDER_DEEPL, - PROVIDER_YANDEX, - PROVIDER_MICROSOFT, - PROVIDER_LIBRETRANSLATE, - PROVIDER_MYMEMORY + PROVIDER_MYMEMORY, + PROVIDER_BING, + PROVIDER_BAIDU, + PROVIDER_YANDEX }; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index ad8f9c0bd8b..b51103572a2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -9594,7 +9594,7 @@ private void createTranslateButton() { translateButton = new TranslateButton(getContext(), this, themeDelegate) { @Override protected void onButtonClick() { - if (getUserConfig().isPremium() || currentChat != null && currentChat.autotranslation) { + if (getUserConfig().isPremium() || currentChat != null && currentChat.autotranslation || SpaceGramConfig.translateProvider != 0) { getMessagesController().getTranslateController().toggleTranslatingDialog(getDialogId()); } else { MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dialog_show_translate_count" + getDialogId(), 140).commit(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateButton.java index 4a477eaeedf..d922bb18276 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateButton.java @@ -54,6 +54,7 @@ import org.telegram.ui.Stories.recorder.HintView2; import org.spacegram.SpaceGramConfig; +import org.spacegram.translator.SpaceGramTranslator; import java.util.ArrayList; import java.util.List; @@ -352,7 +353,7 @@ protected void dispatchDraw(Canvas canvas) { ActionBarMenuSubItem providerButton = new ActionBarMenuSubItem(getContext(), true, false, resourcesProvider); providerButton.setTextAndIcon(getString(R.string.SettingsSpaceGramTranslatorProvider), R.drawable.msg_customize); - providerButton.setSubtext(SpaceGramConfig.translateProvider == 0 ? "Telegram" : "Google"); + providerButton.setSubtext(SpaceGramConfig.translateProvider == 0 ? "Telegram" : SpaceGramTranslator.getProviderName(SpaceGramConfig.translateProvider)); providerButton.setItemHeight(56); popupLayout.addView(providerButton); @@ -376,16 +377,21 @@ protected void dispatchDraw(Canvas canvas) { }); providerSwipeBack.addView(telegramProvider); - ActionBarMenuSubItem googleProvider = new ActionBarMenuSubItem(getContext(), 2, false, false, resourcesProvider); - googleProvider.setText("Google"); - googleProvider.setChecked(SpaceGramConfig.translateProvider != 0); - googleProvider.setOnClickListener(e -> { - SpaceGramConfig.translateProvider = 1; - SpaceGramConfig.saveConfig(); - popupWindow.dismiss(); - updateText(); - }); - providerSwipeBack.addView(googleProvider); + int[] providerIds = SpaceGramTranslator.getAllProviderIds(); + String[] providerNames = SpaceGramTranslator.getAllProviderNames(); + for (int i = 0; i < providerIds.length; i++) { + final int providerId = providerIds[i]; + ActionBarMenuSubItem providerItem = new ActionBarMenuSubItem(getContext(), 2, false, false, resourcesProvider); + providerItem.setText(providerNames[i]); + providerItem.setChecked(SpaceGramConfig.translateProvider == providerId); + providerItem.setOnClickListener(e -> { + SpaceGramConfig.translateProvider = providerId; + SpaceGramConfig.saveConfig(); + popupWindow.dismiss(); + updateText(); + }); + providerSwipeBack.addView(providerItem); + } providerButton.setOnClickListener(e -> { popupLayout.getSwipeBack().openForeground(providerSwipeBackIndex);