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`