https://github.com/mehalick/xaki
Simplified multi-language POCO localization for .NET Core
https://github.com/mehalick/xaki
c-sharp dotnet-core entity-framework-core localization
Last synced: 22 days ago
JSON representation
Simplified multi-language POCO localization for .NET Core
- Host: GitHub
- URL: https://github.com/mehalick/xaki
- Owner: mehalick
- License: mit
- Created: 2018-01-03T08:56:52.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2025-03-19T12:14:59.000Z (about 2 months ago)
- Last Synced: 2025-03-27T00:10:21.820Z (about 1 month ago)
- Topics: c-sharp, dotnet-core, entity-framework-core, localization
- Language: C#
- Size: 256 KB
- Stars: 21
- Watchers: 5
- Forks: 4
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
[](https://ci.appveyor.com/project/mehalick/xaki)
[](https://travis-ci.org/mehalick/Xaki)
[](https://ci.appveyor.com/project/mehalick/xaki/build/tests)
[](https://www.nuget.org/packages/Xaki)
[](https://www.myget.org/feed/xaki/package/nuget/Xaki)Xaki is a .NET library for adding multi-language support to POCO classes. It includes a lightweight service for persisting and retrieving data to and from databases using any ORM.
Xaki works well with all versions of Entity Framework and includes ASP.NET Core support for automatic localization to language codes provided by routes, querystrings, cookies, and HTTP headers.
## Introduction
Setting up classes to be multi-language starts by implementing `ILocalizable` and adding `LocalizedAttribute` to multi-language properties:
```csharp
public class Planet : ILocalizable
{
public int PlanetId { get; set; }[Localized]
public string Name { get; set; }
}
```Internally multi-language content is stored as serialized JSON:
```js
planet.Name = "{'en':'Earth','ru':'Земля́','ja':'地球'}";
```To localize a list, say pulled from a database with Entity Framework, you can use the provided `IObjectLocalizer.Localize()` method:
```csharp
[HttpGet]
public async Task Index()
{
var planets = await _context.Planets.ToListAsync();planets = _localizer.Localize(planets).ToList();
return View(planets);
}
```## Getting Started
### ASP.NET Core
#### 1. Add NuGet Packages
For ASP.NET Core projects you'll add the **Xaki** and **Xaki.AspNetCore** NuGet packages to your project. While these packages are beta you'll install from MyGet:
##### Package Manager
```powershell
Install-Package Xaki.AspNetCore
```##### .NET CLI
```powershell
dotnet add package Xaki.AspNetCore
```You may also want to add the NuGet feed above to your nuget.config file at the root of your solution:
#### 2. Add Xaki to Startup
Xaki follows the usual pattern to add and configure services in an ASP.NET Core host, to add Xaki and request localization update `Startup.cs` to include:
```csharp
public void ConfigureServices(IServiceCollection services)
{
// ...services.AddMvc().AddXaki(new XakiOptions
{
RequiredLanguages = new[] { "en", "zh", "ar", "es", "hi" },
OptionalLanguages = new[] { "pt", "ru", "ja", "de", "el" }
});
}public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ...app.UseXaki(); // must precede UseMvc()
app.UseMvc();
}
```For a sample ASP.NET Core app see [https://github.com/mehalick/Xaki/tree/master/samples/Xaki.Sample]().
#### 3. Create Localized Entity
Any Entity Framework POCO can be localizable by implementing `ILocalizable` with one or more properties decorated with `LocalizedAttribute`:
```csharp
public class Planet : ILocalizable
{
public int PlanetId { get; set; }[Localized]
public string Name { get; set; }
}
```#### 4. Add Localization to Controllers
Similar to ASP.NET Core's `IStringLocalizer` and `IHtmlLocalizer` you can localize objects and collections with `IObjectLocalizer`, simply add it to any controller:
```csharp
[Route("planets")]
public class PlanetsController : Controller
{
private readonly DataContext _context;
private readonly IObjectLocalizer _localizer;public PlanetsController(DataContext context, IObjectLocalizer localizer)
{
_context = context;
_localizer = localizer;
}
}
```You can now fetch entities and send the localized versions to your views:
```csharp
[HttpGet]
public async Task Index()
{
var planets = await _context.Planets.ToListAsync();planets = _localizer.Localize(planets).ToList();
return View(planets);
}
```##### How does IObjectLocalizer resolve the current language?
`IObjectLocalizer` uses ASP.NET Core's `RequestLocalizationMiddleware` to resolve the current language and culture using:
1. Querystrings
2. Cookies
3. Accept-Language HeaderFor more information see [https://andrewlock.net/adding-localisation-to-an-asp-net-core-application/]().
If you'd like to customize how `IObjectLocalizer` resolves languages you can create your own resolver by implementing `Xaki.AspNetCore.LanguageResolvers.ILanguageResolver`.
#### 5. Editing Localized Entities
The **Xaki.AspNetCore** library includes a tag helper and model binder to make edit views and actions extremely simple.
##### Tag Helper
To convert any input into a rich localization editor simply replace `` with ``:
```html
Name
Submit
```
You'll automatically get a rich localization editor:

The editor automatically lists the individual language textboxes in the order they are specified in `Startup.cs` and client-side validation is included:

#### Model Binding
The **Xaki.AspNetCore** library includes `LocalizableModelBinder` which is automatically registered via `services.AddMvc().AddXaki()`.
This allows the localization tag helper to correctly model bind to `ILocalized` entities and view models in your actions:
```csharp
[HttpPost("{planetId:int}")]
public async Task Edit(Planet planet)
{
_context.Entry(planet).State = EntityState.Modified;await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
```Here your localized properties are automatically bound:
