Skip to content

Commit 354e2f0

Browse files
committed
* New: added MicrosoftTranslateServiceLibrary
* New: added service preparation requests: ServiceTranslateBootstrapRequest, ServiceTranslateBootstrapResponse * Updated Readme.
1 parent 8a7c13c commit 354e2f0

13 files changed

Lines changed: 641 additions & 27 deletions

QTranslateNet.Core/ITranslateService.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using System.Net.Http;
34

45
using QTranslateNet.Core.Models;
@@ -41,6 +42,43 @@ public interface ITranslateService
4142
// maybe return URI?
4243
String GetServiceLink(String langFrom, String langTo, String text);
4344

45+
#region Проверка сервиса перед переводом
46+
47+
/// <summary>
48+
/// Сформировать запрос для проверки сервиса перед переводом
49+
/// </summary>
50+
/// <remarks>
51+
/// Для использования, сервис должен иметь флаг <see cref="Infrastructure.Сapability.Translate"/>
52+
/// </remarks>
53+
/// <param name="text">Переводимый текст</param>
54+
/// <param name="from">Исходный язык текста</param>
55+
/// <param name="to">Язык перевода текста</param>
56+
/// <param name="requestData">Модель данных ответа</param>
57+
/// <returns>
58+
/// True - если требуется выполнить специальный запрос проверки сервиса.
59+
/// Подготовлена модель данных для запроса в <paramref name="requestData"/>
60+
/// </returns>
61+
bool ServiceTranslateBootstrapRequest(
62+
String text,
63+
String langFrom,
64+
String langTo,
65+
[NotNullWhen(true)] out RequestData? requestData);
66+
67+
/// <summary>
68+
/// Разбор ответа при запросе проверке сервиса перед переводом
69+
/// методом <see cref="ServiceTranslateBootstrapRequest"/>
70+
/// </summary>
71+
/// <param name="response">Данные ответа от сервиса</param>
72+
/// <param name="from">Исходный язык текста</param>
73+
/// <param name="to">Язык перевода текста</param>
74+
/// <returns>True - если данные обработаны успешно и можно продолжать запросы</returns>
75+
bool ServiceTranslateBootstrapResponse(
76+
HttpResponseMessage response,
77+
String langFrom,
78+
String langTo);
79+
80+
#endregion
81+
4482
#region Перевод текста
4583

4684
/// <summary>

QTranslateNet.Core/TranslateServiceBase.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using System.Net.Http;
34
using System.Text;
45

@@ -85,6 +86,30 @@ public virtual ServiceHeader GetServiceHeader()
8586
/// <inheritdoc />
8687
public abstract String GetServiceLink(String langFrom, String langTo, String text);
8788

89+
#region Запросы для подготовки сервиса
90+
91+
/// <inheritdoc />
92+
public virtual bool ServiceTranslateBootstrapRequest(
93+
String text,
94+
String langFrom,
95+
String langTo,
96+
[NotNullWhen(true)] out RequestData? requestData)
97+
{
98+
requestData = null;
99+
return false;
100+
}
101+
102+
/// <inheritdoc />
103+
public virtual bool ServiceTranslateBootstrapResponse(
104+
HttpResponseMessage response,
105+
String langFrom,
106+
String langTo)
107+
{
108+
return false;
109+
}
110+
111+
#endregion
112+
88113
#region Перевод текста
89114

90115
/// <inheritdoc />

QTranslateNet.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<Project Path="Services/GoogleTranslateService/GoogleTranslateServiceLibrary.csproj" />
44
<Project Path="Services/GrokAITranslateServiceLibrary/GrokAITranslateServiceLibrary.csproj" Id="2f93e29a-0ee3-4602-9270-eee3492fa9b0" />
55
<Project Path="Services/LaraTranslateServiceLibrary/LaraTranslateServiceLibrary.csproj" Id="6d1b32ae-1b0b-4f6f-b400-2a68b8842b1f" />
6+
<Project Path="Services/MicrosoftTranslateServiceLibrary/MicrosoftTranslateServiceLibrary.csproj" />
67
<Project Path="Services/ReversoTranslateServiceLibrary/ReversoTranslateServiceLibrary.csproj" />
78
<Project Path="Services/YandexTranslateServiceLibrary/YandexTranslateServiceLibrary.csproj" Id="85a2921d-fa60-426e-bcf7-dfd68ccec58d" />
89
</Folder>

QTranslateNet/Form1.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
using LaraTranslateServiceLibrary;
1313

14+
using MicrosoftTranslateServiceLibrary;
15+
1416
using QTranslateNet.Core;
1517
using QTranslateNet.Core.Infrastructure;
1618
using QTranslateNet.Core.Models;
@@ -153,6 +155,9 @@ private void InitializeTranslateServices()
153155

154156
ITranslateService reversoTranslateService = new ReversoTranslateService();
155157
InitTranslateServiceControl(reversoTranslateService);
158+
159+
ITranslateService microsoftTranslateService = new MicrosoftTranslateService();
160+
InitTranslateServiceControl(microsoftTranslateService);
156161
}
157162

158163
private void InitTranslateServiceControl(ITranslateService translateService)

QTranslateNet/QTranslateNet.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<ProjectReference Include="..\Services\GoogleTranslateService\GoogleTranslateServiceLibrary.csproj" />
1616
<ProjectReference Include="..\Services\GrokAITranslateServiceLibrary\GrokAITranslateServiceLibrary.csproj" />
1717
<ProjectReference Include="..\Services\LaraTranslateServiceLibrary\LaraTranslateServiceLibrary.csproj" />
18+
<ProjectReference Include="..\Services\MicrosoftTranslateServiceLibrary\MicrosoftTranslateServiceLibrary.csproj" />
1819
<ProjectReference Include="..\Services\ReversoTranslateServiceLibrary\ReversoTranslateServiceLibrary.csproj" />
1920
<ProjectReference Include="..\Services\YandexTranslateServiceLibrary\YandexTranslateServiceLibrary.csproj" />
2021
</ItemGroup>

QTranslateNet/TranslateService.cs

Lines changed: 85 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,88 @@ public static void Translate(
3535
ToolStripStatusLabel statusLabelControl,
3636
TextBox resultTextBoxControl)
3737
{
38-
// Step: prepare request: models and http client
39-
RequestData request = currentTranslateService.ServiceTranslateRequest(
40-
originalText, langFrom, langTo);
38+
String baseAddress = currentTranslateService.GetServiceHost(originalText, langFrom, langTo);
39+
40+
#region Prepare request
41+
42+
// Prepare request
43+
if (currentTranslateService.ServiceTranslateBootstrapRequest(originalText, langFrom, langTo, out RequestData? prepareTranslateRequest))
44+
{
45+
HttpResponseMessage prepareTranslateResponse = ServiceRequest(prepareTranslateRequest, baseAddress, statusLabelControl);
46+
47+
if (prepareTranslateResponse.StatusCode != HttpStatusCode.OK)
48+
{
49+
statusLabelControl.Text = "[ERR] Запрос вернулся с ошибкой: " + prepareTranslateResponse.StatusCode + $"[{(int)prepareTranslateResponse.StatusCode}]";
50+
// resultTextBoxControl.Text = prepareTranslateResponse.Content.ReadAsStringAsync().Result;
51+
52+
prepareTranslateResponse.Dispose();
53+
return;
54+
}
55+
56+
// Step: response parsing
57+
statusLabelControl.Text = "Prepare...";
58+
resultTextBoxControl.Text = String.Empty;
59+
60+
if (!currentTranslateService.ServiceTranslateBootstrapResponse(prepareTranslateResponse, langFrom, langTo))
61+
{
62+
statusLabelControl.Text = "[ERR] Запрос вернулся с ошибкой: " + prepareTranslateResponse.StatusCode + $"[{(int)prepareTranslateResponse.StatusCode}]";
63+
// resultTextBoxControl.Text = prepareTranslateResponse.Content.ReadAsStringAsync().Result;
64+
65+
prepareTranslateResponse.Dispose();
66+
return;
67+
}
68+
69+
prepareTranslateResponse.Dispose();
70+
71+
// Step: output result
72+
statusLabelControl.Text = String.Empty;
73+
//resultTextBoxControl.Text = prepareResponseData.Text;
74+
}
75+
76+
#endregion
77+
78+
#region Translate request
79+
80+
// Get request model
81+
RequestData translateRequest = currentTranslateService.ServiceTranslateRequest(originalText, langFrom, langTo);
82+
HttpResponseMessage translateResponse = ServiceRequest(translateRequest, baseAddress, statusLabelControl);
83+
if (translateResponse.StatusCode != HttpStatusCode.OK)
84+
{
85+
statusLabelControl.Text = "[ERR] Запрос вернулся с ошибкой: " + translateResponse.StatusCode + $"[{(int)translateResponse.StatusCode}]";
86+
resultTextBoxControl.Text = translateResponse.Content.ReadAsStringAsync().Result;
87+
88+
translateResponse.Dispose();
89+
return;
90+
}
91+
92+
// Step: response parsing
93+
statusLabelControl.Text = "Parsing...";
94+
resultTextBoxControl.Text = String.Empty;
4195

96+
ResponseData translateResponseData = currentTranslateService.ServiceTranslateResponse(translateResponse, langFrom, langTo);
97+
translateResponse.Dispose();
98+
99+
// Step: output result
100+
resultTextBoxControl.Text = translateResponseData.Text;
101+
statusLabelControl.Text = String.Empty;
102+
103+
#endregion
104+
}
105+
106+
/// <summary>
107+
/// Выполнить перевод с указанными настройками
108+
/// </summary>
109+
/// <param name="request">Модель запроса</param>
110+
/// <param name="baseAddress">Базовый адрес сервиса</param>
111+
/// <param name="statusLabelControl">Контрол вывода служебных сообщений</param>
112+
/// <exception cref="UnreachableException">Неизвестный тип запроса</exception>
113+
/// <exception cref="ArgumentException">Не заполнено тело HttpPost запроса</exception>
114+
private static HttpResponseMessage ServiceRequest(
115+
RequestData request,
116+
String baseAddress,
117+
ToolStripStatusLabel statusLabelControl)
118+
{
119+
// Step: prepare request: models and http client
42120
SocketsHttpHandler handler = new SocketsHttpHandler()
43121
{
44122
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
@@ -52,7 +130,7 @@ public static void Translate(
52130
HttpClient httpClient = new HttpClient(handler)
53131
{
54132
Timeout = TimeSpan.FromSeconds(MyConstants.TimeoutSeconds),
55-
BaseAddress = new Uri(currentTranslateService.GetServiceHost(originalText, langFrom, langTo)),
133+
BaseAddress = new Uri(baseAddress),
56134
};
57135

58136
foreach (KeyValuePair<string, string> item in request.Headers)
@@ -66,8 +144,8 @@ public static void Translate(
66144
httpClient.DefaultRequestHeaders.Add(item.Key, item.Value);
67145
}
68146

69-
// Step: translate request by API
70-
statusLabelControl.Text = "Translating...";
147+
// Step: request by API
148+
statusLabelControl.Text = "Request...";
71149

72150
HttpResponseMessage? response;
73151

@@ -93,26 +171,7 @@ public static void Translate(
93171
handler.Dispose();
94172
httpClient.Dispose();
95173

96-
// Error request validation
97-
if (response.StatusCode != HttpStatusCode.OK)
98-
{
99-
statusLabelControl.Text = "[ERR] Запрос вернулся с ошибкой: " + response.StatusCode + $"[{(int)response.StatusCode}]";
100-
resultTextBoxControl.Text = response.Content.ReadAsStringAsync().Result;
101-
102-
response.Dispose();
103-
return;
104-
}
105-
106-
// Step: response parsing
107-
statusLabelControl.Text = "Parsing...";
108-
resultTextBoxControl.Text = String.Empty;
109-
110-
ResponseData responseData = currentTranslateService.ServiceTranslateResponse(response, langFrom, langTo);
111-
response.Dispose();
112-
113-
// Step: output result
114-
resultTextBoxControl.Text = responseData.Text;
115-
statusLabelControl.Text = String.Empty;
174+
return response;
116175
}
117176
}
118177
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
**Сайт**: https://web.archive.org/web/20230227130154/https://quest-app.appspot.com/home
1212

1313
# Возможности
14-
- языковые сервисы: Google Translate, Yandex Translate, GrokAI, Lara, Reverso
14+
- языковые сервисы: Google Translate, Yandex Translate, GrokAI, Lara, Reverso, Microsoft Translate (Bing)
1515
- простой перевод текста
1616

1717
# Цели

Services/MicrosoftTranslateServiceLibrary/MicrosoftTranslateResource.Designer.cs

Lines changed: 73 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)