Encoding-Converters-Core 0.9.9

dotnet add package Encoding-Converters-Core --version 0.9.9
                    
NuGet\Install-Package Encoding-Converters-Core -Version 0.9.9
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Encoding-Converters-Core" Version="0.9.9" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Encoding-Converters-Core" Version="0.9.9" />
                    
Directory.Packages.props
<PackageReference Include="Encoding-Converters-Core" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Encoding-Converters-Core --version 0.9.9
                    
#r "nuget: Encoding-Converters-Core, 0.9.9"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Encoding-Converters-Core@0.9.9
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Encoding-Converters-Core&version=0.9.9
                    
Install as a Cake Addin
#tool nuget:?package=Encoding-Converters-Core&version=0.9.9
                    
Install as a Cake Tool

Encoding Converters Core (EncConverters / SIL.Transduction)

A 20+ year old transduction platform, developed by SIL, that converts text between character encodings and — more recently — between languages. It exposes a single stable API, IEncConverter, behind which many different conversion engines ("transducers") can be plugged in interchangeably.

It was originally built to solve one very specific problem for Bible translation and literacy work: converting text out of legacy 8-bit "Ansi-hack" fonts (custom fonts that mapped, say, Devanagari glyphs onto code page 1252) into Unicode. That problem is largely solved today — everyone has either migrated to Unicode or already has a copy of the sibling GUI project SILConverters to do it for them. What keeps this repo alive and under active development is that the same plug-in architecture turned out to be a convenient place to also host AI-driven machine translation engines (Azure OpenAI, Google Vertex AI/Gemini, Google Translate, Bing/Microsoft Translator, DeepL, and a self-hosted Meta NLLB model), so client apps that already know how to call IEncConverter get translation "for free."

Client applications include Paratext, FieldWorks, LibreOffice/MS Office plugins, and various in-house SIL tools, on both x86 and x64 hosts, via .NET, native C/C++, and COM.

Architecture

                        [Client Applications]
        Paratext · FieldWorks · MS Office · LibreOffice · in-house tools
                                  │
                                  ▼
                  IEncConverter / IEncConverterConfig
                (src/ECInterfaces — the stable public contract)
                                  │
                                  ▼
              EncConverters dispatcher ("SilEncConverters40.dll")
                          (src/EncCnvtrs)
        - discovers implementations via HKLM\SOFTWARE\SIL\SilEncConverters40
        - resolves named mappings via the mappingRegistry.xml repository
        - instantiates the right transducer by ProgID / assembly version
                                  │
        ┌─────────────────────────┴─────────────────────────────┐
        │                                                        │
   Legacy encoding / font transducers                  AI machine-translation transducers
   (native C/C++ engines, P/Invoked)                    (src/EcTranslators, online + self-hosted)
   ├─ Consistent Changes  — src/CcEC                    ├─ Azure OpenAI     — AzureOpenAi
   ├─ TECkit              — built into EncCnvtrs         ├─ Google Vertex AI — VertexAi (Gemini)
   ├─ ICU convert/regex/  — src/IcuEC                    ├─ Google Translate — GoogleTranslator
   │  transliterate                                      ├─ Bing/MS Translator — BingTranslator
   ├─ Python script       — src/PyScriptEC (Py2 native    ├─ DeepL            — DeepLTranslator
   │  or Py.NET for Py3)                                  └─ Meta NLLB        — NllbTranslator
   ├─ Perl expression     — src/PerlExpressionEC             (self-hosted Docker service;
   ├─ Windows code page   — src/CodePageEC                    supports private fine-tuned models)
   ├─ Font↔ISCII (Indic)  — src/SilIndicEncConverters
   └─ AdaptIt KB / guesser— src/AIGuesserEC, DriveAiEncConverter
                                                          (Note: "AI" in these two names means
                                                           "AdaptIt", a legacy tool — not AI/LLM)

Every transducer, native or managed, ultimately implements IEncConverter (or the native COM equivalent in src/EncCnvtrs/lib/ECEncConverter.h), so the dispatcher and all client apps only ever code against one interface.

Repository layout

Path What it is
src/ECInterfaces The IEncConverter / IEncConverterConfig / IEncConverters contracts, the mappingRegistry XML schema, shared utilities. Changes here must be mirrored in EncCnvtrs/lib/ECEncConverter.h.
src/EncCnvtrs The dispatcher (SilEncConverters40.dll): converter discovery/instantiation, the mapping-registry repository logic, the built-in TECkit and compound/fallback converters, and the WebBrowserAdaptor UI layer (IE / WebView2 Edge; GeckoFX was removed).
src/CcEC Consistent Changes (CC) transducer — P/Invokes prebuilt CC32.dll/CC64.dll.
src/IcuEC ICU-based conversion, regex, and transliteration (native .vcxproj DLLs + C# wrappers).
src/PyScriptEC Python-script transducer — legacy embedded CPython 2.7 (native) and a newer Python.NET-based Python 3 path.
src/PerlExpressionEC Shells out to perl.exe to evaluate a Perl expression.
src/CodePageEC Thin wrapper over Win32 code-page conversion APIs.
src/SilIndicEncConverters Font↔ISCII conversion for Indic scripts, plus a couple of unrelated web-transliteration converters bundled in the same assembly.
src/AIGuesserEC, src/DriveAiEncConverter Legacy AdaptIt knowledge-base tools (heuristic word-correspondence guessing). Despite the name, unrelated to AI/LLM translation.
src/EcTranslators The AI/LLM translation engines (see above) and their shared base classes (TranslatorConverter, PromptExeTranslator). This is the most actively developed area of the repo.
src/ECDriver A flat C API (ecdriver.h) for native C/C++ clients that don't want COM interop directly; Windows and Linux variants.
src/SpellingFixer30 Vernacular spelling-correction plug-in (bad↔good word mapping, valid-vowel-sequence rules for Indic scripts).
src/BackTranslationHelper WinForms tool that drives the AI translators to help reviewers check back-translations, with an embedded HTML/JS UI.
src/PtxConverters Paratext-specific converter reading PTX project settings.
src/ECFileConverter CLI batch file-conversion utility.
src/AppDataMover One-time migration tool for moving EncConverters data out of old install locations.
src/ConvertersActivator Partially-implemented post-install "activate these bundled converters" UI — see Design.txt; not functional.
src/RunTests, src/TestEncCnvtrs NUnit-style tests, run via a console harness so they also work under Mono on Linux.
installer/ WiX merge modules, one per native-DLL bundle (CC, TECkit, ICU, Perl, Python, SpellFixer, GeckoFX/Firefox, AdaptIt Guesser).
debian/, debian-ec/, configure.ac, Makefile.in Linux/autotools build and Debian packaging.

Building

Windows

msbuild "EncConverters 2019.sln" /p:Configuration=Debug /p:Platform=x86
msbuild "EncConverters 2019.sln" /p:Configuration=Debug /p:Platform=x64

NuGet restore is required first (nuget restore "EncConverters 2019.sln"). The solution cannot be built AnyCPU — several native DLLs (CC, TECkit, ICU, Python, GuesserEC, SilFont2Iscii) are pinned to a specific bit width, so x86 and x64 must be built as fully separate configurations.

Linux

sudo apt-get install automake g++ python-dev libicu-dev mono5-sil icu-dev-fw libteckit-dev
(. environ && ./autogen.sh && make)      # first build
(. environ && make)                      # subsequent builds

Tests run under Mono:

export EC_COMMON_APPLICATION_DATA_PATH="$(pwd)/ec-common"
export MONO_REGISTRY_PATH="${EC_COMMON_APPLICATION_DATA_PATH}/registry"
cp -a src/RunTests/bin/x64/Debug/RunTests.exe output/x64/Debug/ &&
  (. environ && mono output/x64/Debug/RunTests.exe)

See also ReadMe_linux.txt and ReadMe_windows.txt.

NuGet package

The published package Encoding-Converters-Core is built from Package.Debug.nuspec / Package.Release.nuspec. To cut a new version: run Release builds for both x86 and x64, bump the version in the nuspec, then nuget.exe pack.

Configuration & discovery

Converters are looked up two ways at runtime:

  1. HKLM\SOFTWARE\SIL\SilEncConverters40\ConvertersSupported — every installed transducer implementation self-registers here (COM ProgID, priority, per-assembly-version overrides).
  2. The mapping registry — an XML file (mappingRegistry.xml, schema in src/ECInterfaces/SILMappingRegistry.xsd) holding named, user-configured conversion mappings, normally under %ProgramData%\SIL\Repository (Windows) or /var/lib/encConverters (Linux), overridable via EC_COMMON_APPLICATION_DATA_PATH.

Several transducer config dialogs embed an HTML help/setup page via WebBrowserAdaptor (src/EncCnvtrs), which can use Internet Explorer (WinForms WebBrowser), GeckoFX/XULRunner (bundled, Linux's only option), or WebView2/Edge (the modern default on Windows). See Handover.md for the plan to consolidate this.

A host app's compile-time references don't cover its runtime dependencies

Because converters are resolved dynamically by ProgID/assembly name at runtime (see above), a host application typically only compiles against SilEncConverters40.dll (the IEncConverter contract and dispatcher) and never references the individual transducer assemblies at all. That's enough to get the app running, but it is not enough to make any given converter actually work — each transducer implementation still has to be loadable from the host's own output/bin folder at the moment EncConverters.InstantiateIEncConverter tries to instantiate it, compile-time reference or not.

This matters most for src/EcTranslators (the AI/LLM translation engines), which pull in a large, fast-moving set of third-party packages (Newtonsoft.Json, the Google.Api.*/Google.Cloud.* family, the Grpc.* family, Azure.AI.OpenAI, Azure.Core, OpenAI, various Microsoft.Extensions.* and System.* compatibility shims — see SharedItems.props at the repo root for the authoritative list). If a host app wants any EcTranslators-provided converter (Azure OpenAI, Vertex AI, Google Translate, Bing, DeepL, or NLLB) available at runtime, it needs that same package set sitting alongside its own binaries — regardless of whether it references EcTranslators.csproj/EcTranslators.dll directly.

The projects in this repo that can end up hosting a dynamically-loaded converter (EcTranslators itself, ECFileConverter, TestEncCnvtrs, RunTests) all import $(SolutionDir)SharedItems.props directly rather than duplicating its PackageReference list — this is deliberate: it's the single source of truth for "what a host needs to use EcTranslators converters," shared not just by these few in-repo consumers but by dozens of host EXEs in the separate SILConverters solution. If you're building a new host application against this NuGet package and want to use any EcTranslators converter, import or replicate that same package list rather than guessing at a subset from compile-time references alone.

Further reading

  • Handover.md — current-state assessment and modernization roadmap for anyone picking up maintenance of this repo.
  • SILConverters developer notes — hints on consuming EncConverters from your own application.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows is compatible.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 is compatible.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETFramework 4.6.2

    • No dependencies.
  • .NETFramework 4.8

    • No dependencies.
  • .NETStandard 2.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Encoding-Converters-Core:

Repository Stars
sillsdev/FieldWorks
FieldWorks is a suite of software tools for language and cultural data, with support for complex scripts.
Version Downloads Last Updated
0.9.9 83 8/25/2026
0.9.8 1,117 5/7/2026
0.9.7 2,705 8/17/2025
0.9.6 750 5/5/2025
0.9.5 800 4/19/2025
0.9.4 741 3/19/2025
0.9.3 4,315 12/1/2024
0.9.2 1,594 10/7/2024
0.9.1 2,224 9/19/2024
0.9.0 2,486 9/18/2024
0.8.5 1,365 7/18/2024
0.8.4 2,807 7/1/2024
0.8.3 2,010 5/1/2024
0.8.2 14,339 3/9/2024
0.8.1 1,885 12/3/2023
0.8.0 1,197 11/22/2023
0.7.0 1,288 9/1/2023
0.6.1 1,232 7/22/2023
0.6.0 2,107 4/6/2023
0.5.8 1,599 3/25/2023
Loading failed

Includes managed DLLs (for including in projects as nuget artifacts) in the .\lib\<tfm>\... folders (net462, net48, net9.0, net9.0-windows, netstandard2.0), and other managed and non-managed (read: non-nuget) resources that optionally may be manually added to projects or at least in installers in the .\runtimes\... folder -- including plugin definitions, tlb, and exe files for both Win32/x86 and x64. Some of the resources are also included in various merge modules in the .\installer\MergeModules... folder