Localization

ABP's localization system is seamlessly integrated to the Microsoft.Extensions.Localization package and compatible with the Microsoft's localization documentation. It adds some useful features and enhancements to make it easier to use in real life application scenarios.

Volo.Abp.Localization Package

This package is already installed by default with the startup template. So, most of the time, you don't need to install it manually.

Volo.Abp.Localization is the core package of the localization system. Install it to your project using the package manager console (PMC):

Install-Package Volo.Abp.Localization

Then you can add AbpLocalizationModule dependency to your module:

using Volo.Abp.Modularity;
using Volo.Abp.Localization;

namespace MyCompany.MyProject
{
    [DependsOn(typeof(AbpLocalizationModule))]
    public class MyModule : AbpModule
    {
        //...
    }
}

Creating A Localization Resource

A localization resource is used to group related localization strings together and separate them from other localization strings of the application. A module generally defines its own localization resource. Localization resource is just a plain class. Example:

public class TestResource
{
}

Then it should be added using AbpLocalizationOptions as shown below:

[DependsOn(typeof(AbpLocalizationModule))]
public class MyModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<VirtualFileSystemOptions>(options =>
        {
            options.FileSets.AddEmbedded<MyModule>();
        });

        Configure<AbpLocalizationOptions>(options =>
        {        
            options.Resources
                .Add<TestResource>("en")
                .AddVirtualJson("/Localization/Resources/Test");
        });
    }
}

In this example;

  • Added a new localization resource with "en" (English) as the default culture.
  • Used JSON files to store the localization strings.
  • JSON files are embedded into the assembly using the virtual file system.

JSON files are located under "/Localization/Resources/Test" project folder as shown below:

localization-resource-json-files

A JSON localization file content is shown below:

{
  "culture": "en",
  "texts": {
    "HelloWorld": "Hello World!"
  }
}
  • Every localization file should define the culture code for the file (like "en" or "en-US").
  • texts section just contains key-value collection of the localization strings (keys may have spaces too).
Short Localization Resource Name

Localization resources are also available in the client (JavaScript) side. So, setting a short name for the localization resource makes it easy to use localization texts. Example:

[LocalizationResourceName("Test")]
public class TestResource
{
}

See the Getting Localized Test / Client Side section below.

Inherit From Other Resources

A resource can inherit from other resources which makes possible to re-use existing localization strings without referring the existing resource. Example:

[InheritResource(typeof(AbpValidationResource))]
public class TestResource
{
}

Alternative inheritance by configuring the AbpLocalizationOptions:

services.Configure<AbpLocalizationOptions>(options =>
{
    options.Resources
        .Add<TestResource>("en") //Define the resource by "en" default culture
        .AddVirtualJson("/Localization/Resources/Test") //Add strings from virtual json files
        .AddBaseTypes(typeof(AbpValidationResource)); //Inherit from an existing resource
});
  • A resource may inherit from multiple resources.
  • If the new resource defines the same localized string, it overrides the string.
Extending Existing Resource

Inheriting from a resource creates a new resource without modifying the existing one. In some cases, you may want to not create a new resource but directly extend an existing resource. Example:

services.Configure<AbpLocalizationOptions>(options =>
{
    options.Resources
        .Get<TestResource>()
        .AddVirtualJson("/Localization/Resources/Test/Extensions");
});
  • If an extension file defines the same localized string, it overrides the string.

Getting Localized Texts

Server Side

Getting the localized text on the server side is pretty standard.

Simplest Usage In A Class
public class MyService
{
    private readonly IStringLocalizer<TestResource> _localizer;

    public MyService(IStringLocalizer<TestResource> localizer)
    {
        _localizer = localizer;
    }

    public void Foo()
    {
        var str = _localizer["HelloWorld"];
    }
}
Simplest Usage In A Razor View/Page
@inject IHtmlLocalizer<TestResource> Localizer

<h1>@Localizer["HelloWorld"]</h1>

Refer to the Microsoft's localization documentation for details about using localization on the server side.

Client Side

ABP provides JavaScript services to use the same localized texts in the client side.

Get a localization resource:

var testResource = abp.localization.getResource('Test');

Localize a string:

var str = testResource('HelloWorld');
In this document