From 5f0bad8cb34c4967a481e6de602abef2da5fb544 Mon Sep 17 00:00:00 2001 From: Andrea Luciano Damico Date: Tue, 28 Apr 2026 14:35:28 +0200 Subject: [PATCH] Add CI/CD workflows, update README, and remove legacy projects Adds GitHub Actions workflows for CI (build + test on net8.0 and net10.0 with LibreTranslate service container) and NuGet publishing via trusted publishing (OIDC). Rewrites README with modern badges, DI usage example, full API reference, and language code documentation. Removes the legacy CodeQL workflow and the LibreTranslate.Net.Cmd console project. --- .github/workflows/ci.yml | 48 +++++ .github/workflows/codeql-analysis.yml | 67 ------ .github/workflows/publish.yml | 39 ++++ .../LibreTranslate.Net.Cmd.csproj | 12 -- LibreTranslate.Net.Cmd/Program.cs | 28 --- .../LibreTranslate.Net.Enhanced.csproj | 4 +- README.md | 198 ++++++++++++------ 7 files changed, 223 insertions(+), 173 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/publish.yml delete mode 100644 LibreTranslate.Net.Cmd/LibreTranslate.Net.Cmd.csproj delete mode 100644 LibreTranslate.Net.Cmd/Program.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2e54406 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,48 @@ +name: CI + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +jobs: + build-and-test: + runs-on: ubuntu-latest + + services: + libretranslate: + image: libretranslate/libretranslate:latest + ports: + - 5000:5000 + options: >- + --health-cmd "curl -f http://localhost:5000/languages || exit 1" + --health-interval 30s + --health-timeout 10s + --health-retries 10 + --health-start-period 120s + + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.x + + - name: Restore + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration Release + + - name: Test (net8.0) + run: dotnet test --no-build --configuration Release --framework net8.0 + + - name: Test (net10.0) + run: dotnet test --no-build --configuration Release --framework net10.0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 336fd26..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,67 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ main ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - schedule: - - cron: '25 11 * * 2' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - language: [ 'csharp' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..d7a622e --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,39 @@ +name: Publish to NuGet + +on: + push: + tags: + - 'v*' + +permissions: + id-token: write + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.x + + - name: Restore + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration Release + + - name: Pack + run: dotnet pack LibreTranslate.Net.Enhanced/LibreTranslate.Net.Enhanced.csproj --no-build --configuration Release --output ./nupkg + + - name: Login to NuGet via OIDC + uses: NuGet/login@v1 + id: nuget-login + with: + user: ALDamico + + - name: Push to NuGet + run: dotnet nuget push ./nupkg/*.nupkg --api-key ${{ steps.nuget-login.outputs.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/LibreTranslate.Net.Cmd/LibreTranslate.Net.Cmd.csproj b/LibreTranslate.Net.Cmd/LibreTranslate.Net.Cmd.csproj deleted file mode 100644 index 4bfa4f0..0000000 --- a/LibreTranslate.Net.Cmd/LibreTranslate.Net.Cmd.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - - - - - diff --git a/LibreTranslate.Net.Cmd/Program.cs b/LibreTranslate.Net.Cmd/Program.cs deleted file mode 100644 index 4214b4f..0000000 --- a/LibreTranslate.Net.Cmd/Program.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace LibreTranslate.Net.Cmd -{ - class Program - { - static void Main(string[] args) - { - var libreTranslate = new LibreTranslate(); - var englishText = "Hello World!"; - var getSupportedLanguagesAsyncTask = libreTranslate.GetSupportedLanguagesAsync(); - System.Threading.Tasks.Task.Run(() => getSupportedLanguagesAsyncTask).Wait(); - var supportedLanguages = getSupportedLanguagesAsyncTask.Result; - Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(supportedLanguages, Newtonsoft.Json.Formatting.Indented)); - var TranslateAsyncTask = libreTranslate.TranslateAsync(new Translate() - { - ApiKey = "MySecretApiKey", - Source = LanguageCode.English, - Target = LanguageCode.Spanish, - Text = englishText - }); - System.Threading.Tasks.Task.Run(() => TranslateAsyncTask).Wait(); - var spanishText = TranslateAsyncTask.Result; - Console.WriteLine(spanishText); - Console.ReadLine(); - } - } -} diff --git a/LibreTranslate.Net.Enhanced/LibreTranslate.Net.Enhanced.csproj b/LibreTranslate.Net.Enhanced/LibreTranslate.Net.Enhanced.csproj index d11c4c4..9be03f6 100644 --- a/LibreTranslate.Net.Enhanced/LibreTranslate.Net.Enhanced.csproj +++ b/LibreTranslate.Net.Enhanced/LibreTranslate.Net.Enhanced.csproj @@ -11,8 +11,8 @@ https://github.com/ALDamico/LibreTranslate.Net.Enhanced c# Added new language support - 1.6.4 - 1.6.0 + 1.9.5 + 1.9.5 netstandard2.0;net10.0;net8.0 diff --git a/README.md b/README.md index 147634b..ae8338d 100644 --- a/README.md +++ b/README.md @@ -1,91 +1,161 @@ # LibreTranslate.Net.Enhanced ## An enhanced fork of LibreTranslate.Net -

- - - -

- -### Installation -`Install-Package LibreTranslate.Net.Enhanced -Version 1.6.4` -### Using -```csharp -using LibreTranslate.Net; + +[![NuGet version](https://img.shields.io/nuget/v/LibreTranslate.Net.Enhanced?style=flat-square&logo=nuget)](https://www.nuget.org/packages/LibreTranslate.Net.Enhanced) +[![NuGet downloads](https://img.shields.io/nuget/dt/LibreTranslate.Net.Enhanced?style=flat-square&logo=nuget)](https://www.nuget.org/packages/LibreTranslate.Net.Enhanced) +[![CI](https://img.shields.io/github/actions/workflow/status/ALDamico/LibreTranslate.Net.Enhanced/ci.yml?style=flat-square&logo=github&label=CI)](https://github.com/ALDamico/LibreTranslate.Net.Enhanced/actions/workflows/ci.yml) +[![License](https://img.shields.io/github/license/ALDamico/LibreTranslate.Net.Enhanced?style=flat-square)](LICENSE) + +## Prerequisites + +You need a running [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) instance. You can use the public instance at `https://libretranslate.com` (API key required) or run your own: + +```bash +docker run -p 5000:5000 libretranslate/libretranslate +``` + +## Installation + +**Package Manager Console** +``` +Install-Package LibreTranslate.Net.Enhanced +``` + +**dotnet CLI** +``` +dotnet add package LibreTranslate.Net.Enhanced ``` -### Usage + +**PackageReference** +```xml + +``` + +## Usage + +### With Dependency Injection (recommended) + ```csharp -var LibreTranslate = new LibreTranslate(); -System.Collections.Generic.IEnumerable SupportedLanguages = await LibreTranslate.GetSupportedLanguagesAsync(); -System.Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(supportedLanguages, Newtonsoft.Json.Formatting.Indented)); -var englishText = "Hello World!"; -string spanishText = await LibreTranslate.TranslateAsync(new Translate() { - ApiKey = "MySecretApiKey", - Source = LanguageCode.English, - Target = LanguageCode.Spanish, - Text = englishText +// Program.cs / Startup.cs +services.AddLibreTranslate(opt => +{ + opt.Url = "https://libretranslate.com"; + opt.ApiKey = "your-api-key"; }); -System.Console.WriteLine(spanishText); -``` -### Output: ``` -Hello World! -¡Hola Mundo! + +```csharp +// Inject LibreTranslate where needed +public class MyService(LibreTranslate libreTranslate) +{ + public async Task TranslateAsync(string text) + { + return await libreTranslate.TranslateAsync(new Translate + { + Source = LanguageCode.English, + Target = LanguageCode.Spanish, + Text = text + }); + } +} ``` -### Custom LibreTranslate URL (style: `http[s]://url` with no trailing `/`): + +### Without Dependency Injection + ```csharp -var LibreTranslate = new LibreTranslate("https://server_url"); +using LibreTranslate.Net.Enhanced; +using LibreTranslate.Net.Enhanced.Constants; +using LibreTranslate.Net.Enhanced.Models; + +var libreTranslate = new LibreTranslate("https://libretranslate.com", "your-api-key"); + +string spanishText = await libreTranslate.TranslateAsync(new Translate +{ + Source = LanguageCode.English, + Target = LanguageCode.Spanish, + Text = "Hello World!" +}); + +Console.WriteLine(spanishText); // ¡Hola Mundo! ``` -### LibreTranslate Methods + +## API Reference + ```csharp +// Get all languages supported by the server Task> GetSupportedLanguagesAsync(); + +// Translate text Task TranslateAsync(Translate translate); + +// Translate a batch of texts +Task TranslateAsync(TranslateBatch batch); + +// Detect the language of a text +Task> DetectAsync(Detect detect); +Task DetectAsStringAsync(Detect detect); + +// Translate a file +Task TranslateFileAsync(TranslateFile translateFile); + +// Submit a translation suggestion +Task SuggestAsync(Suggestion suggestion); + +// Get server frontend settings +Task FrontendSettingsAsync(); ``` -### Language codes + +## Language Codes + +`LanguageCode` supports implicit conversion from string, so you can use any ISO 639-1 code directly, even if it's not listed as a built-in constant: + +```csharp +LanguageCode lang = "zt"; // Chinese Traditional +LanguageCode custom = "nb"; // Norwegian Bokmål +``` + Language|Code -|- -English|`LanguageCode.English` +Auto Detect|`LanguageCode.AutoDetect` +Albanian|`LanguageCode.Albanian` Arabic|`LanguageCode.Arabic` +Azeri|`LanguageCode.Azeri` +Bengali|`LanguageCode.Bengali` +Bulgarian|`LanguageCode.Bulgarian` +Catalan|`LanguageCode.Catalan` Chinese|`LanguageCode.Chinese` +Chinese (Traditional)|`LanguageCode.ChineseTraditional` +Dutch|`LanguageCode.Dutch` +English|`LanguageCode.English` +Esperanto|`LanguageCode.Esperanto` +Estonian|`LanguageCode.Estonian` +Finnish|`LanguageCode.Finnish` French|`LanguageCode.French` German|`LanguageCode.German` +Greek|`LanguageCode.Greek` +Hebrew|`LanguageCode.Hebrew` Hindi|`LanguageCode.Hindi` +Hungarian|`LanguageCode.Hungarian` +Indonesian|`LanguageCode.Indonesian` Irish|`LanguageCode.Irish` Italian|`LanguageCode.Italian` Japanese|`LanguageCode.Japanese` Korean|`LanguageCode.Korean` +Latvian|`LanguageCode.Latvian` +Lithuanian|`LanguageCode.Lithuanian` +Malay|`LanguageCode.Malay` +Norwegian (Bokmål)|`LanguageCode.NorwegianBokmal` +Persian|`LanguageCode.Persian` +Polish|`LanguageCode.Polish` Portuguese|`LanguageCode.Portuguese` +Romanian|`LanguageCode.Romanian` Russian|`LanguageCode.Russian` +Slovak|`LanguageCode.Slovak` +Slovenian|`LanguageCode.Slovenian` Spanish|`LanguageCode.Spanish` -AutoDetect|`LanguageCode.AutoDetect` -Azeri\*|`LanguageCode.Azeri` -Bulgarian\*|`LanguageCode.Bulgarian` -Bengali\*|`LanguageCode.Bengali` -Catalan\*|`LanguageCode.Catalan` -Greek\*|`LanguageCode.Greek` -Esperanto\*|`LanguageCode.Esperanto` -Estonian\*|`LanguageCode.Estonian` -Persian\*|`LanguageCode.Persian` -Finnish\*|`LanguageCode.Finnish` -Irish\*|`LanguageCode.Irish` -Hebrew\*|`LanguageCode.Hebrew` -Hungarian\*|`LanguageCode.Hungarian` -Indonesian\*|`LanguageCode.Indonesian` -Lithuanian\*|`LanguageCode.Lithuanian` -Latvian\*|`LanguageCode.Latvian` -Malay\*|`LanguageCode.Malay` -Norwegian (Bokmål)\*|`LanguageCode.NorwegianBokmal` -Dutch\*|`LanguageCode.Dutch` -Polish\*|`LanguageCode.Polish` -Romanian\*|`LanguageCode.Romanian` -Slovak\*|`LanguageCode.Slovak` -Slovenian\*|`LanguageCode.Slovenian` -Albanian\*|`LanguageCode.Albanian` -Swedish\*|`LanguageCode.Swedish` -Thai\*|`LanguageCode.Thai` -Tagalog\*|`LanguageCode.Tagalog` -Turkish\*|`LanguageCode.Turkish` -Ukrainian\*|`LanguageCode.Ukrainian` -Urdu\*|`LanguageCode.Urdu` -Chinese (traditional)\*|`LanguageCode.ChineseTraditional` - -> \* = Added with version 1.6.0 +Swedish|`LanguageCode.Swedish` +Tagalog|`LanguageCode.Tagalog` +Thai|`LanguageCode.Thai` +Turkish|`LanguageCode.Turkish` +Ukrainian|`LanguageCode.Ukrainian` +Urdu|`LanguageCode.Urdu`