Skip to content
This repository was archived by the owner on Oct 14, 2025. It is now read-only.

Commit 437df78

Browse files
committed
chore(ReversoClients) recover some features for specific languages
Supported all functional for all Languages: - Context Client - Pronunciation Client - Translation Client Supported most of all functional for all Languages: - Conjugation Client (besides Hebrew, Arabic and Japanese) Covered with tests: - ConjugationResponseParser (English - Arabic) Other: - Error handling - Support Cancelation Token - Context Client does not parge translation - Draft validation - Add Text property for ConjugationData
1 parent b7a74bd commit 437df78

37 files changed

+2416
-329
lines changed

ReversoAPI.Web.Examples/Program.cs

Lines changed: 112 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,127 @@ namespace ReversoAPI.Web.Examples
55
{
66
internal class Program
77
{
8+
private static readonly IReversoClient _reversoClient = new ReversoClient();
9+
810
static async Task Main(string[] args)
911
{
10-
var reverso = new ReversoClient();
11-
var ee = await reverso.Conjugation.GetAsync("run", Language.English);
12+
var text = "run";
13+
var source = Language.English;
14+
var target = Language.Russian;
15+
16+
var path = $"C:\\Users\\Максим\\Desktop\\{source}.mp3";
17+
18+
await DownloadSpeakingAsync(text, source, path);
19+
await PrintConjugationAsync(text, source);
20+
await PrintTranslationAsync(text, source, target);
21+
await PrintContextAsync(text, source, target);
22+
}
23+
24+
private static async Task DownloadSpeakingAsync(string text, Language language, string path)
25+
{
26+
var pronunciation = await _reversoClient.Pronunciation.GetAsync(text, language);
27+
28+
if (pronunciation is null)
29+
{
30+
Console.WriteLine("Failed to get pronunciation");
31+
return;
32+
}
33+
34+
using (var fileStream = File.Create(path))
35+
{
36+
pronunciation!.CopyTo(fileStream);
37+
}
38+
}
39+
40+
private static async Task PrintConjugationAsync(string text, Language language)
41+
{
42+
var conjugation = await _reversoClient.Conjugation.GetAsync(text, language);
43+
44+
if (conjugation is null)
45+
{
46+
Console.WriteLine("Failed to get conjugation");
47+
return;
48+
}
49+
50+
Console.WriteLine($"Input: {conjugation.Text} | Language: {conjugation.Language}");
51+
Console.WriteLine();
52+
53+
foreach(var group in conjugation.Conjugations.Keys)
54+
{
55+
Console.WriteLine($"Group: {group}");
56+
if (!conjugation.Conjugations.TryGetValue(group, out var conjugations))
57+
continue;
58+
59+
foreach (var selection in conjugations.Select((c, i) => new { Index = i, Conjugation = c }))
60+
{
61+
Console.WriteLine($"{selection.Index}. {selection.Conjugation.Verb}");
62+
}
63+
64+
Console.WriteLine();
65+
}
66+
}
67+
68+
private static async Task PrintTranslationAsync(string text, Language source, Language target)
69+
{
70+
var translation = await _reversoClient.Translation.GetAsync(text, source, target);
1271

13-
//using (var fileStream = File.Create("C:\\Users\\Максим\\Desktop\\text.mp3"))
14-
//{
15-
// ee!.Seek(0, SeekOrigin.Begin);
16-
// ee!.CopyTo(fileStream);
17-
//}
72+
if (translation is null)
73+
{
74+
Console.WriteLine("Failed to get translation");
75+
return;
76+
}
77+
78+
Console.WriteLine($"Input: {translation.Text} | Source language: {translation.Source} | Target language: {translation.Target}");
79+
Console.WriteLine();
80+
81+
foreach (var selection in translation.Translations.Select((t, i) => new { Index = i, Translation = t }))
82+
{
83+
Console.WriteLine($"Number {selection.Index}");
1884

85+
Console.WriteLine($"Language: {selection.Translation.Source}");
86+
Console.WriteLine(selection.Translation.Text);
1987

20-
var x = await reverso.Spelling.GetAsync("Helo", Language.English);
88+
Console.WriteLine($"Language: {selection.Translation.Target}");
89+
Console.WriteLine(selection.Translation.Value);
2190

22-
for (var i = 0; i < 100; i++)
23-
Console.WriteLine((await reverso.Synonyms.GetAsync("folk", Language.English)).Text);
91+
if (selection.Translation.Frequency.HasValue)
92+
{
93+
Console.WriteLine("Extra information:");
94+
Console.WriteLine($"Is colloquial: {selection.Translation.IsColloquial}");
95+
Console.WriteLine($"Is rude: {selection.Translation.IsRude}");
96+
Console.WriteLine($"Frequency: {selection.Translation.Frequency}");
97+
Console.WriteLine($"Transliteration: {selection.Translation.Transliteration}");
98+
}
99+
100+
Console.WriteLine();
101+
}
24102
}
25103

26-
private static async Task DisplayContext(IReversoClient reverso)
104+
private static async Task PrintContextAsync(string text, Language source, Language target)
27105
{
28-
var response = await reverso.Context.GetAsync("hello", Language.English, Language.Russian);
29-
30-
Console.WriteLine(response.Text);
31-
Console.WriteLine($"Source Language: {response.Source}");
32-
Console.WriteLine($"Target Language: {response.Target}");
33-
Console.WriteLine("___________");
34-
response.Translations.ToList().ForEach(t => Console.WriteLine($"Word: {t.Value}, Part of speech: {t.PartOfSpeech}, Language: {t.Language}"));
35-
Console.WriteLine("___________");
36-
response.Examples.ToList().ForEach(t =>
37-
{
38-
Console.WriteLine($"Source: {t.Source.Text}");
39-
Console.WriteLine($"Target: {t.Target.Text}");
40-
Console.WriteLine("<");
41-
});
106+
var context = await _reversoClient.Context.GetAsync(text, source, target);
107+
108+
if(context is null)
109+
{
110+
Console.WriteLine("Failed to get context");
111+
return;
112+
}
113+
114+
Console.WriteLine($"Input: {context.Text} | Source language: {context.Source} | Target language: {context.Target}");
115+
Console.WriteLine();
116+
117+
foreach(var selection in context.Examples.Select((e, i) => new { Index = i, Example = e }))
118+
{
119+
Console.WriteLine($"Number {selection.Index}");
120+
121+
Console.WriteLine($"Language: {selection.Example.Source.Language}");
122+
Console.WriteLine(selection.Example.Source.Text);
123+
124+
Console.WriteLine($"Language: {selection.Example.Target.Language}");
125+
Console.WriteLine(selection.Example.Target.Text);
126+
127+
Console.WriteLine();
128+
}
42129
}
43130
}
44131
}

ReversoAPI.Web.Tests/Clients/SpellingClientTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Collections.Generic;
1212
using System.IO;
1313
using System.Text;
14+
using System.Threading;
1415
using System.Threading.Tasks;
1516
using Xunit;
1617

@@ -34,7 +35,7 @@ public async Task GetAsync_Success(string text, Language language, Locale locale
3435
// Arrange
3536
var response = new HttpResponse() { Content = json };
3637
_apiConnector
37-
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<SpellingRequest>()))
38+
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<SpellingRequest>(), It.IsAny<CancellationToken>()))
3839
.ReturnsAsync(response);
3940

4041
// Act

ReversoAPI.Web.Tests/Clients/TranslationClientTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System;
1010
using System.Collections.Generic;
1111
using System.IO;
12+
using System.Threading;
1213
using System.Threading.Tasks;
1314
using Xunit;
1415

@@ -32,7 +33,7 @@ public async Task GetFromOneWordAsync_Success(string text, Language source, Lang
3233
// Arrange
3334
var response = new HttpResponse() { Content = json };
3435
_apiConnector
35-
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<TranslationRequest>()))
36+
.Setup(c => c.PostAsync(It.IsAny<Uri>(), It.IsAny<TranslationRequest>(), It.IsAny<CancellationToken>()))
3637
.ReturnsAsync(response);
3738

3839
// Act

ReversoAPI.Web.Tests/Parsers/ConjugationResponseParserTest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public static IEnumerable<object[]> HtmlResponsesForTest()
3232
{
3333
new ConjugationData
3434
{
35+
Text = "run",
3536
Language = Language.English,
3637
Conjugations = new Dictionary<string, IEnumerable<Conjugation>>
3738
{
@@ -71,6 +72,7 @@ public static IEnumerable<object[]> HtmlResponsesForTest()
7172
{
7273
new ConjugationData
7374
{
75+
Text = "бежать",
7476
Language = Language.Russian,
7577
Conjugations = new Dictionary<string, IEnumerable<Conjugation>>
7678
{
Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
using ReversoAPI.Web.Tools.Parsers;
2-
using System.Collections.Generic;
1+
using System.IO;
2+
using System.Text;
3+
using ReversoAPI.Web.Values;
4+
using ReversoAPI.Web.Entities;
5+
using ReversoAPI.Web.Tools.Parsers;
36
using Xunit;
47
using FluentAssertions;
5-
using ReversoAPI.Web.Entities;
6-
using ReversoAPI.Web.Values;
7-
using System.IO;
8-
using System.Text;
8+
using System.Collections.Generic;
99

1010
namespace ReversoAPI.Web.Tests.Parsers
1111
{
@@ -27,7 +27,6 @@ public void Invoke_Test(ContextData expectedResult, Stream html)
2727
expectedResult.Source.Should().Be(result.Source);
2828
expectedResult.Target.Should().Be(result.Target);
2929
expectedResult.Examples.Should().BeEquivalentTo(result.Examples);
30-
expectedResult.Translations.Should().BeEquivalentTo(result.Translations);
3130
}
3231

3332
public static IEnumerable<object[]> HtmlResponsesForTest()
@@ -39,31 +38,6 @@ public static IEnumerable<object[]> HtmlResponsesForTest()
3938
Text = "hello",
4039
Source = Language.English,
4140
Target = Language.Russian,
42-
Translations = new[]
43-
{
44-
new Word("привет", Language.Russian, PartOfSpeech.Noun),
45-
new Word("эй", Language.Russian, PartOfSpeech.Noun),
46-
new Word("приветствие", Language.Russian, PartOfSpeech.Noun),
47-
new Word("приветик", Language.Russian, PartOfSpeech.Noun),
48-
new Word("салют", Language.Russian, PartOfSpeech.Noun),
49-
50-
new Word("алло", Language.Russian, PartOfSpeech.Adverb),
51-
new Word("приветствую", Language.Russian, PartOfSpeech.Adverb),
52-
new Word("здорово", Language.Russian, PartOfSpeech.Adverb),
53-
54-
new Word("здравствуйте", Language.Russian, PartOfSpeech.Unknown),
55-
new Word("здравствуй", Language.Russian, PartOfSpeech.Unknown),
56-
new Word("добрый день", Language.Russian, PartOfSpeech.Unknown),
57-
new Word("здрасьте", Language.Russian, PartOfSpeech.Unknown),
58-
new Word("здрасте", Language.Russian, PartOfSpeech.Unknown),
59-
new Word("але", Language.Russian, PartOfSpeech.Unknown),
60-
new Word("слушать", Language.Russian, PartOfSpeech.Unknown),
61-
62-
new Word("Добрый вечер", Language.Russian, PartOfSpeech.Adverb),
63-
new Word("Хелло", Language.Russian, PartOfSpeech.Adverb),
64-
65-
new Word("Hello", Language.Russian, PartOfSpeech.Unknown),
66-
},
6741
Examples = new[]
6842
{
6943
new Example(new Sentence(Language.English, "Hence 07734 became \"hello\"."), new Sentence(Language.Russian, "Следовательно 07734 стал hello - \"привет\".")),
@@ -79,6 +53,30 @@ public static IEnumerable<object[]> HtmlResponsesForTest()
7953
},
8054
new MemoryStream(Encoding.UTF8.GetBytes(Resource.helloParseTest ?? string.Empty))
8155
};
56+
57+
// There is problem with dots (they are on the right, not left)
58+
yield return new object[]
59+
{
60+
new ContextData
61+
{
62+
Text = "human",
63+
Source = Language.English,
64+
Target = Language.Arabic,
65+
Examples = new[]
66+
{
67+
new Example(new Sentence(Language.English, "It's human nature to want to know more about ourselves."), new Sentence(Language.Arabic, "من الطبيعي أن يريد أي إنسان معرفة المزيد عن نفسه.")),
68+
new Example(new Sentence(Language.English, "They can't do the ritual without a pure human soul."), new Sentence(Language.Arabic, "هم لا يُمكنُ أَنْ يَعملونَ الطّقوسَ بدون روح أنسان صافية.")),
69+
new Example(new Sentence(Language.English, "The three astronauts had begun the longest human journey ever attempted."), new Sentence(Language.Arabic, "روّاد الفضاء الثلاثة بَدأوا أطول رحلة بشريّة تجرى على الإطلاق.")),
70+
new Example(new Sentence(Language.English, "It is not any language at all, human or angelic."), new Sentence(Language.Arabic, "إنها ليست لغة على الإطلاق، سواء بشرية أو ملائكية.")),
71+
new Example(new Sentence(Language.English, "For example, it sticks to cells in the human lung."), new Sentence(Language.Arabic, "على سبيل المثال، أنه يتمسك بالخلايا في الرئة البشرية.")),
72+
new Example(new Sentence(Language.English, "The global economic crisis touches almost all fields in human activity."), new Sentence(Language.Arabic, "وتطرقت الأزمة الاقتصادية سنغافورةة تقريبا إلى جميع مجالات الأنشطة البشرية.")),
73+
new Example(new Sentence(Language.English, "Only in the larger cities had human waste been centrally disposed."), new Sentence(Language.Arabic, "فقط في المدن الكبرى تم التخلص من النفايات البشرية مركزيا.")),
74+
new Example(new Sentence(Language.English, "We have reusable rockets for the first time in human history."), new Sentence(Language.Arabic, "نملك صواريخ يمكن إعادة استخدامها لأوّل مرة في تاريخ البشرية.")),
75+
new Example(new Sentence(Language.English, "I've only emulated human reactions, but to actually feel..."), new Sentence(Language.Arabic, "أنا فقط قمت بمحاكاة ردود الأفعال البشرية لكن لأشعر حقا...")),
76+
}
77+
},
78+
new MemoryStream(Encoding.UTF8.GetBytes(Resource.Context_Parse_Test_Human_Eng_Arab ?? string.Empty))
79+
};
8280
}
8381
}
8482
}

ReversoAPI.Web.Tests/Resource.Designer.cs

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

ReversoAPI.Web.Tests/Resource.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@
124124
<data name="ConjugationParseTestRunRus" type="System.Resources.ResXFileRef, System.Windows.Forms">
125125
<value>Resources\ConjugationParseTestRunRus.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
126126
</data>
127+
<data name="Context_Parse_Test_Human_Eng_Arab" type="System.Resources.ResXFileRef, System.Windows.Forms">
128+
<value>Resources\Context_Parse_Test_Human_Eng_Arab.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
129+
</data>
127130
<data name="folkSymonimsParseTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
128131
<value>Resources\folkSymonimsParseTest.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
129132
</data>

0 commit comments

Comments
 (0)