Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions GTranslatorAPI.CLI/GTranslatorAPI.CLI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@
</Content>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\GTranslatorAPI\GTranslatorAPI.csproj" />
</ItemGroup>
Expand All @@ -22,14 +18,14 @@
<Nullable>enable</Nullable>

<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<PackageId>GTranslatorAPI.CLI</PackageId>
<Version>2.0.0</Version>
<Authors>Franck Gaspoz</Authors>
<Company>franck.gaspoz@gmail.com</Company>
<PackageDescription>Google Translate API CLI - .NET Core 5</PackageDescription>
<Description>Google Translate API Client CLI Console Application C#</Description>
<PackageReleaseNotes>.NET Core 5 migration</PackageReleaseNotes>
<PackageReleaseNotes>.NET Core 9 migration</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<RepositoryUrl>https://github.com/franck-gaspoz/GTranslatorAPI.git</RepositoryUrl>
<RepositoryType>GIT</RepositoryType>
Expand Down
5 changes: 0 additions & 5 deletions GTranslatorAPI/GTranslatorAPI.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

<PropertyGroup>
<Nullable>enable</Nullable>

Expand Down
14 changes: 9 additions & 5 deletions GTranslatorAPI/ITranslator.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;

namespace GTranslatorAPI
{
Expand All @@ -14,7 +15,8 @@ public interface ITranslator
Task<Translation?> TranslateAsync(
Languages sourceLanguage,
Languages targetLanguage,
string text
string text,
CancellationToken token = default
);

/// <summary>
Expand All @@ -27,7 +29,8 @@ string text
Task<Translation?> TranslateFromNamesAsync(
string sourceLanguageName,
string targetLanguageName,
string text
string text,
CancellationToken token = default
);

/// <summary>
Expand All @@ -40,7 +43,8 @@ string text
Task<Translation?> TranslateAsync(
string sourceLanguageId,
string targetLanguageId,
string text
string text,
CancellationToken token = default
);
}
}
}
54 changes: 22 additions & 32 deletions GTranslatorAPI/NetUtil.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace GTranslatorAPI
{
/// <summary>
/// internal net utils
/// </summary>
internal class NetUtil
internal class NetUtil : IDisposable
{
/// <summary>
/// user agent
Expand All @@ -23,7 +24,13 @@ internal class NetUtil
/// <summary>
/// build a new instance
/// </summary>
internal NetUtil() { }
internal NetUtil()
{
_client = new() { Timeout = TimeSpan.FromMilliseconds(NetworkQueryTimeout) };
_client.DefaultRequestHeaders.Add("User-Agent", UserAgent);
}

private HttpClient _client;

/// <summary>
/// build a new instance from settings
Expand All @@ -33,6 +40,8 @@ internal NetUtil(Settings settings)
{
NetworkQueryTimeout = settings.NetworkQueryTimeout;
UserAgent = settings.UserAgent;
_client = new() { Timeout = TimeSpan.FromMilliseconds(NetworkQueryTimeout) };
_client.DefaultRequestHeaders.Add("User-Agent", UserAgent);
}

/// <summary>
Expand All @@ -48,46 +57,27 @@ public static string Escape(string text)
/// </summary>
/// <param name="url">url</param>
/// <returns>resut|null,status description|error message,null|exception</returns>
public async Task<Tuple<string?, string, Exception?>> GetQueryResponseAsync(string url)
public async Task<(string?, string, Exception?)> GetQueryResponseAsync(string url, CancellationToken token = default)
{
try
{
var q = CreateQuery(url);
var rep = await GetResponseAsync(q);
return Tuple.Create<string?, string, Exception?>(rep, HttpStatusCode.OK.ToString(), null);
var resp = await _client.GetAsync(url, token);
if (!resp.IsSuccessStatusCode)
{
return (null, resp.StatusCode.ToString(), null);
}
var body = await resp.Content.ReadAsStringAsync(token);
return (body, "OK", null);
}
catch (Exception Ex)
{
return Tuple.Create<string?, string, Exception?>(null, Ex.Message, Ex);
return (null, Ex.Message, Ex);
}
}

/// <summary>
/// async obtain response from query
/// </summary>
/// <param name="query">query to be performed</param>
/// <returns>query stream result</returns>
public static async Task<string> GetResponseAsync(HttpWebRequest query)
public void Dispose()
{
using var client = new HttpClient();
var content = await client.GetStringAsync(query.RequestUri.AbsoluteUri);
return content;
((IDisposable)_client).Dispose();
}

/// <summary>
/// get http get query object
/// </summary>
/// <param name="uri">target uri</param>
/// <returns>web request</returns>
public HttpWebRequest CreateQuery(string uri)
{
var u = new Uri(uri);
var query = (HttpWebRequest)WebRequest.Create(u);
query.UserAgent = UserAgent;
query.KeepAlive = false;
query.Timeout = NetworkQueryTimeout;
return query;
}

}
}
7 changes: 2 additions & 5 deletions GTranslatorAPI/Settings.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.IO;
using System.Text.Json;

using Newtonsoft.Json;

namespace GTranslatorAPI
{
Expand Down Expand Up @@ -43,10 +43,7 @@ public Settings() { }
/// <param name="settingsFilePath">path of the file settings</param>
public static Settings CreateFromFile(string settingsFilePath)
{
var settings = JsonConvert.DeserializeObject<Settings>(
File.ReadAllText(settingsFilePath));
if (settings == null)
throw new InvalidOperationException("failed to create settings");
var settings = JsonSerializer.Deserialize<Settings>(File.ReadAllText(settingsFilePath));
return settings;
}
}
Expand Down
37 changes: 19 additions & 18 deletions GTranslatorAPI/Translator.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace GTranslatorAPI
{
/// <summary>
Expand Down Expand Up @@ -43,7 +42,8 @@ public Translator(Settings? settings = null)
public async Task<Translation?> TranslateAsync(
Languages sourceLanguage,
Languages targetLanguage,
string text
string text,
CancellationToken token = default
)
{
IEnumerable<string> splits;
Expand All @@ -57,7 +57,7 @@ string text
// parallelized segments translation
IEnumerable<Task<Translation>> trTasksQuery =
splits.Select(textSplit => RunTranslateQueryAsync(
sourceLanguage, targetLanguage, textSplit));
sourceLanguage, targetLanguage, textSplit, token));

var trTasks = trTasksQuery.ToArray();
await Task.WhenAll(trTasks);
Expand Down Expand Up @@ -123,23 +123,21 @@ static string NormalizeLineBreaks(string text)
async Task<Translation> RunTranslateQueryAsync(
Languages sourceLanguage,
Languages targetLanguage,
string text
string text,
CancellationToken token
)
{
var q = BuildServiceUriPathAndQuery(text, sourceLanguage, targetLanguage);
var r = await _net.GetQueryResponseAsync(q);
var r = await _net.GetQueryResponseAsync(q, token);
if (!string.IsNullOrWhiteSpace(r.Item1))
{
if (JsonConvert.DeserializeObject(r.Item1) is JArray o)
var doc = JsonDocument.Parse(r.Item1);
if (doc.RootElement.ValueKind is JsonValueKind.Array)
{
try
{
#pragma warning disable CS8602
#pragma warning disable CS8604
var translatedText = o[0][0][0].Value<string>();
var originalText = o[0][0][1].Value<string>();
#pragma warning restore CS8602
#pragma warning restore CS8604
var translatedText = doc.RootElement.EnumerateArray().ElementAt(0).EnumerateArray().ElementAt(0).EnumerateArray().ElementAt(0).GetString();
var originalText = doc.RootElement.EnumerateArray().ElementAt(0).EnumerateArray().ElementAt(0).EnumerateArray().ElementAt(1).GetString();
return new Translation()
{
TranslatedText = translatedText,
Expand All @@ -148,7 +146,7 @@ string text
}
catch (Exception Ex)
{
throw new TranslateException($"translate error: '{Ex.Message}': invalid result: {o}", Ex);
throw new TranslateException($"translate error: '{Ex.Message}'", Ex);
}
}
}
Expand Down Expand Up @@ -186,7 +184,8 @@ string BuildServiceUriPathAndQuery(
public async Task<Translation?> TranslateFromNamesAsync(
string sourceLanguageName,
string targetLanguageName,
string text
string text,
CancellationToken token
)
{
var srcLng = LanguagesUtil.GetLanguageCode(sourceLanguageName);
Expand All @@ -209,7 +208,8 @@ string text
public async Task<Translation?> TranslateAsync(
string sourceLanguageId,
string targetLanguageId,
string text
string text,
CancellationToken token = default
)
{
var srcLng = LanguagesUtil.GetLanguageCodeFromLanguageId(sourceLanguageId);
Expand All @@ -219,7 +219,8 @@ string text
return await TranslateAsync(
(Languages)srcLng!,
(Languages)tgtLng!,
text);
text,
token);
}

/// <summary>
Expand Down