Skip to content

Commit 7114077

Browse files
committed
change translation service to MyMemory
1 parent f82266b commit 7114077

File tree

5 files changed

+46
-27
lines changed

5 files changed

+46
-27
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*.userosscache
1111
*.sln.docstates
1212
*.idea
13+
*.DotSettings
1314

1415
# User-specific files (MonoDevelop/Xamarin Studio)
1516
*.userprefs

.lite_workspace.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
return {["views"]={[1]={["filename"]="CHANGELOG.md",["active"]=true,["text"]=false,["scroll"]={["y"]=350,["x"]=0},["selection"]={[1]=19,[2]=63,[3]=19,[4]=63},["type"]="doc"}},["active_view"]=1,["type"]="leaf"}
1+
return {["active_view"]=1,["type"]="leaf",["views"]={[1]={["type"]="doc",["active"]=true,["text"]=false,["filename"]="CHANGELOG.md",["selection"]={[1]=19,[2]=1,[3]=19,[4]=1},["scroll"]={["y"]=350,["x"]=0}}}}

src/tweetz.core/Commands/TranslateCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ namespace tweetz.core.Commands
99
{
1010
public class TranslateCommand : ICommandBinding
1111
{
12-
private readonly string translateApiKey;
1312
public static readonly RoutedCommand Command = new RoutedUICommand();
13+
private ISettings Settings { get; }
1414

1515
public TranslateCommand(ISettings settings)
1616
{
17-
translateApiKey = settings.TranslateApiKey ?? string.Empty;
17+
Settings = settings;
1818
}
1919

2020
public CommandBinding CommandBinding()
@@ -28,7 +28,7 @@ private async void CommandHandler(object sender, ExecutedRoutedEventArgs ea)
2828
var fromLang = tweet.Language ?? "und";
2929
var toLang = CultureInfo.InstalledUICulture.TwoLetterISOLanguageName;
3030
tweet.TranslatedText = (string)Application.Current.FindResource("translate-text-working")!;
31-
tweet.TranslatedText = await TranslateService.Translate(tweet.FullText, fromLang, toLang, translateApiKey).ConfigureAwait(true);
31+
tweet.TranslatedText = await TranslateService.Translate(tweet.FullText, fromLang, toLang, Settings.TranslateApiKey).ConfigureAwait(true);
3232
}
3333
}
3434
}

src/tweetz.core/Models/Settings.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public Settings(IMessageBoxService messageBoxService)
5151
private string fontFamily = defaultFontFamily;
5252
private string theme = "dark";
5353
private string? myTweetColor;
54-
private string? translateApiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
54+
private string? translateApiKey;
5555
private WindowPosition mainWindowPosition = new() { Left = 10, Top = 10, Width = 350, Height = 900 };
5656

5757
[JsonIgnore]
@@ -218,6 +218,7 @@ public void Load()
218218
ApplyGrayscaleShader = settings.ApplyGrayscaleShader;
219219
MyTweetColor = settings.MyTweetColor;
220220
Donated = settings.Donated;
221+
TranslateApiKey = settings.TranslateApiKey;
221222
MainWindowPosition = settings.MainWindowPosition;
222223
}
223224
catch (Exception ex)
Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
3+
using System.Net;
44
using System.Net.Http;
55
using System.Net.Http.Json;
6-
using System.Text.Json.Serialization;
76
using System.Threading.Tasks;
87

98
namespace tweetz.core.Services
109
{
1110
internal static class TranslateService
1211
{
13-
private const string endpoint = "https://libretranslate.com/translate";
12+
private const string endpoint = "https://api.mymemory.translated.net/get";
1413

15-
public static async ValueTask<string> Translate(string? text, string fromLanguage, string toLanguage, string translateApiKey)
14+
public static async ValueTask<string> Translate(string? text, string fromLanguage, string toLanguage, string? translateApiKey)
1615
{
1716
if (string.IsNullOrEmpty(text))
1817
{
@@ -21,33 +20,51 @@ public static async ValueTask<string> Translate(string? text, string fromLanguag
2120

2221
try
2322
{
24-
var request = new HttpRequestMessage {
25-
Method = HttpMethod.Post,
26-
RequestUri = new Uri(endpoint),
27-
Content = new FormUrlEncodedContent(new[] {
28-
new KeyValuePair<string?, string?>("q", text),
29-
new KeyValuePair<string?, string?>("source", fromLanguage),
30-
new KeyValuePair<string?, string?>("target", toLanguage),
31-
new KeyValuePair<string?, string?>("api_key", translateApiKey)
32-
})
33-
};
34-
35-
using var response = await App.MyHttpClient.SendAsync(request).ConfigureAwait(false);
36-
var result = await response.Content.ReadFromJsonAsync<TranslatorResult>().ConfigureAwait(false);
37-
return result?.TranslatedText ?? result?.ErrorText ?? "no response";
23+
var parameters = await BuildParameters(text, fromLanguage, toLanguage, translateApiKey);
24+
var requestUri = new Uri(endpoint + "?" + parameters);
25+
using var response = await App.MyHttpClient.GetAsync(requestUri).ConfigureAwait(false);
26+
var result = await response.Content.ReadFromJsonAsync<TranslatorResult>().ConfigureAwait(false);
27+
var translatedText = result?.ResponseData?.TranslatedText ?? "no response";
28+
var html = WebUtility.HtmlDecode(WebUtility.HtmlDecode(translatedText)); // Twice to handle sequences like: "&amp;mdash;"
29+
return html;
3830
}
3931
catch (Exception ex)
4032
{
4133
return ex.Message;
4234
}
4335
}
36+
37+
private static async Task<string> BuildParameters(string? text, string fromLanguage, string toLanguage, string? translateApiKey)
38+
{
39+
var pars = new List<KeyValuePair<string?, string?>> {
40+
new("q", text),
41+
new("langpair", $"{fromLanguage}|{toLanguage}")
42+
};
43+
44+
// The translateApiKey is your email.
45+
// Add it to your settings file.
46+
// Use your own real email please.
47+
// Don't abuse the MyMemoryService.
48+
// https://mymemory.translated.net/doc/usagelimits.php
49+
50+
if (!string.IsNullOrWhiteSpace(translateApiKey)) pars.Add(new KeyValuePair<string?, string?>("de", translateApiKey));
51+
52+
var content = new FormUrlEncodedContent(pars);
53+
var parameters = await content.ReadAsStringAsync().ConfigureAwait(false);
54+
return parameters;
55+
}
4456
}
4557

46-
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
58+
// ReSharper disable UnusedAutoPropertyAccessor.Global
59+
// ReSharper disable ClassNeverInstantiated.Global
60+
4761
public class TranslatorResult
4862
{
49-
// ReSharper disable once UnusedAutoPropertyAccessor.Global
50-
[JsonPropertyName("translatedText")] public string? TranslatedText { get; set; }
51-
[JsonPropertyName("error")] public string? ErrorText { get; set; }
63+
public ResponseData? ResponseData { get; set; }
64+
}
65+
66+
public class ResponseData
67+
{
68+
public string? TranslatedText { get; set; }
5269
}
5370
}

0 commit comments

Comments
 (0)