diff --git a/README.md b/README.md
index 6fd02303..224daa95 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,13 @@
EN | RU
Advanced screen translator. Translumo is able to detect and translate appearing in the selected area text in real-time (e.g. subtitles).
+
+My Edition
+Add a ollama enum type and a text box UI to input local ollama model name
+Modify Translator.cs, TranslatorFactory.cs, TranslationConfiguration.cs, LanguagesSettingsView.xaml, lang.en-US.xaml and lang.ru-RU.xaml
+Add LlamaTranslator.cs, LlamaContainer.cs
+
+
Main features
- High text recognition precision
diff --git a/docs/AddtextboxUI.png b/docs/AddtextboxUI.png
new file mode 100644
index 00000000..b0450296
Binary files /dev/null and b/docs/AddtextboxUI.png differ
diff --git a/src/Translumo.Translation/Configuration/TranslationConfiguration.cs b/src/Translumo.Translation/Configuration/TranslationConfiguration.cs
index d818cb5f..1c1024da 100644
--- a/src/Translumo.Translation/Configuration/TranslationConfiguration.cs
+++ b/src/Translumo.Translation/Configuration/TranslationConfiguration.cs
@@ -10,6 +10,7 @@ public class TranslationConfiguration : BindableBase
{
TranslateFromLang = Languages.English,
TranslateToLang = Languages.Russian,
+ OllamaModel = "llama3",
ProxySettings = new List()
};
@@ -40,6 +41,15 @@ public Translators Translator
}
}
+ public string OllamaModel
+ {
+ get => _ollamaModel;
+ set
+ {
+ SetProperty(ref _ollamaModel, value);
+ }
+ }
+
public List ProxySettings
{
get => _proxySettings;
@@ -52,6 +62,7 @@ public List ProxySettings
private Languages _translateFromLang;
private Languages _translateToLang;
private Translators _translator;
+ private string _ollamaModel;
private List _proxySettings = new List();
}
}
diff --git a/src/Translumo.Translation/Llama/LlamaContainer.cs b/src/Translumo.Translation/Llama/LlamaContainer.cs
new file mode 100644
index 00000000..4f049680
--- /dev/null
+++ b/src/Translumo.Translation/Llama/LlamaContainer.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Net;
+using System.Net.Http;
+using System.Text.Json;
+using System.Text;
+using System.Threading.Tasks;
+using Translumo.Translation.Configuration;
+using Translumo.Utils.Http;
+
+namespace Translumo.Translation.Llama
+{
+ public sealed class LlamaContainer : TranslationContainer
+ {
+ public LlamaContainer(Proxy proxy = null, bool isPrimary = false) : base(proxy, isPrimary)
+ {
+ }
+ }
+}
diff --git a/src/Translumo.Translation/Llama/LlamaTranslator.cs b/src/Translumo.Translation/Llama/LlamaTranslator.cs
new file mode 100644
index 00000000..2aa05aaa
--- /dev/null
+++ b/src/Translumo.Translation/Llama/LlamaTranslator.cs
@@ -0,0 +1,82 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using System.Transactions;
+using System.Web;
+using Microsoft.Extensions.Logging;
+using Translumo.Infrastructure.Constants;
+using Translumo.Infrastructure.Language;
+using Translumo.Translation.Configuration;
+using Translumo.Translation.Exceptions;
+using Translumo.Utils.Http;
+
+namespace Translumo.Translation.Llama
+{
+ public class LlamaTranslator : BaseTranslator
+ {
+ private const string LLAMA_API_URL = "http://localhost:11434/api/generate";
+ private readonly HttpClient _httpClient;
+ private string _modelName;
+
+ public LlamaTranslator(TranslationConfiguration translationConfiguration, LanguageService languageService, ILogger logger)
+ : base(translationConfiguration, languageService, logger)
+ {
+ _httpClient = new HttpClient();
+ _modelName = translationConfiguration.OllamaModel;
+ }
+
+ public override Task TranslateTextAsync(string sourceText)
+ {
+ //TODO: Temp implementation for specific lang
+ if (TargetLangDescriptor.Language == Languages.PortugueseBrazil)
+ {
+ throw new TransactionException("Llama translate is unavailable for this language");
+ }
+
+ return base.TranslateTextAsync(sourceText);
+ }
+
+
+
+ protected override async Task TranslateTextInternal(LlamaContainer container, string sourceText)
+ {
+ var requestBody = new
+ {
+ model = _modelName, // 你可以改成本地安装的模型,如 "llama2"、"mistral"
+ prompt = $"Translate this text to {TargetLangDescriptor.Language.ToString()}: {sourceText}",
+ stream = false // 设置 stream=false 以同步返回完整翻译结果
+ };
+
+ // 序列化 JSON
+ var content = new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json");
+
+ // 发送 HTTP 请求到本地 Llama 服务器
+ HttpResponseMessage response = await _httpClient.PostAsync(LLAMA_API_URL, content);
+
+ if (response.IsSuccessStatusCode)
+ {
+ string responseBody = await response.Content.ReadAsStringAsync();
+
+ // 解析 JSON 响应
+ using JsonDocument jsonDoc = JsonDocument.Parse(responseBody);
+ string translatedText = jsonDoc.RootElement.GetProperty("response").GetString();
+
+ return translatedText;
+ }
+
+ throw new TranslationException($"Llama translation failed. Status Code: {response.StatusCode}");
+ }
+
+ protected override IList CreateContainers(TranslationConfiguration configuration)
+ {
+ var result = configuration.ProxySettings.Select(proxy => new LlamaContainer(proxy)).ToList();
+ result.Add(new LlamaContainer(isPrimary: true));
+
+ return result;
+ }
+ }
+}
diff --git a/src/Translumo.Translation/TranslatorFactory.cs b/src/Translumo.Translation/TranslatorFactory.cs
index c32aab6b..8a28e811 100644
--- a/src/Translumo.Translation/TranslatorFactory.cs
+++ b/src/Translumo.Translation/TranslatorFactory.cs
@@ -5,6 +5,7 @@
using Translumo.Translation.Configuration;
using Translumo.Translation.Deepl;
using Translumo.Translation.Google;
+using Translumo.Translation.Llama;
using Translumo.Translation.Papago;
using Translumo.Translation.Yandex;
@@ -35,6 +36,8 @@ public ITranslator CreateTranslator(TranslationConfiguration translatorConfigura
return new PapagoTranslator(translatorConfiguration, _languageService, _logger);
case Translators.Google:
return new GoogleTranslator(translatorConfiguration, _languageService, _logger);
+ case Translators.LocalOllama:
+ return new LlamaTranslator(translatorConfiguration, _languageService, _logger);
default:
throw new NotSupportedException();
}
diff --git a/src/Translumo.Translation/Translators.cs b/src/Translumo.Translation/Translators.cs
index 39b07657..7b94f901 100644
--- a/src/Translumo.Translation/Translators.cs
+++ b/src/Translumo.Translation/Translators.cs
@@ -9,6 +9,8 @@ public enum Translators : byte
Google = 2,
- Papago = 3
+ Papago = 3,
+
+ LocalOllama = 4
}
}
diff --git a/src/Translumo/MVVM/Views/LanguagesSettingsView.xaml b/src/Translumo/MVVM/Views/LanguagesSettingsView.xaml
index 82bfc8c0..76c5b813 100644
--- a/src/Translumo/MVVM/Views/LanguagesSettingsView.xaml
+++ b/src/Translumo/MVVM/Views/LanguagesSettingsView.xaml
@@ -50,6 +50,10 @@
+
+
+
+
diff --git a/src/Translumo/Resources/Localization/lang.en-US.xaml b/src/Translumo/Resources/Localization/lang.en-US.xaml
index 6df524d6..7aa00762 100644
--- a/src/Translumo/Resources/Localization/lang.en-US.xaml
+++ b/src/Translumo/Resources/Localization/lang.en-US.xaml
@@ -30,6 +30,7 @@
Source language
Translation language
Translator
+ OllamaModel
Text to speech system (experimental feature)
diff --git a/src/Translumo/Resources/Localization/lang.ru-RU.xaml b/src/Translumo/Resources/Localization/lang.ru-RU.xaml
index cb1e8ca2..7b1d9f0b 100644
--- a/src/Translumo/Resources/Localization/lang.ru-RU.xaml
+++ b/src/Translumo/Resources/Localization/lang.ru-RU.xaml
@@ -30,6 +30,7 @@
Исходный язык
Язык перевода
Переводчик
+ OllamaModel
Синтез речи TTS (предварительная версия)