Skip to content

Latest commit

 

History

History
102 lines (71 loc) · 3.71 KB

README.md

File metadata and controls

102 lines (71 loc) · 3.71 KB

Multi Lingual Entities

ABP Framework defines two basic interfaces for Multi-Lingual entity definitions to provide a standard model for translating entities.

IHasMultiLingual

IHasMultiLingual<TTranslation> interface is used to mark multi lingual entities. The entities marked with IHasMultiLingual<TTranslation> interface must define language-neutral information. The entities marked with IHasMultiLingual<TTranslation> contains a collection of Translations which contains language-dependent information and a Default culture which contains default language for entity's translation.

Example:

public class Product : Entity, IMultiLingualEntity<ProductTranslation>
{
    public decimal Price { get; set; }

    public string DefaultCulture { get; set; }

    public ICollection<ProductTranslation> Translations { get; set; }
}

IMultiLingualTranslation

IMultiLingualTranslation interface is used to mark translation of a Multi-Lingual entity. The entities marked with IMultiLingualTranslation interface must define language dependent information. The entities marked with IMultiLingualTranslation contains Language field which contains a language code for the translation.

Example:

public class ProductTranslation : Entity, IMultiLingualTranslation
{
    public string Name { get; set; }

    public string Culture { get; set; }
}

Map to DTO object

ABP provdies the Object To Object Mapping system, you can implement the IObjectMapper<TSource, TDestination> interface to map multi lingual entities to DTOs.

Example:

public class MultiLingualProductObjectMapper : IObjectMapper<Product, ProductDto>, ITransientDependency
{
    private readonly IMultiLingualObjectManager _multiLingualObjectManager;

    public MultiLingualProductObjectMapper(IMultiLingualObjectManager multiLingualObjectManager)
    {
        _multiLingualObjectManager = multiLingualObjectManager;
    }

    public ProductDto Map(Product source)
    {
        var translation = _multiLingualObjectManager.GetTranslation<Product, ProductDto>(source);

        return new ProductDto
        {
            Price = source.Price,
            Id = source.Id,
            Name = translation?.Name
        };
    }

    public ProductDto Map(Product source, ProductDto destination)
    {
        return default;
    }
}

AutoMapper integration

ABP provides the CreateMultiLingualMap extension method for mapping multilingual entities to DTOs.

Example:

public class ProductProfile : Profile
{
    public ProductProfile()
    {
        var mapResult = this.CreateMultiLingualMap<Product, ProductTranslation, ProductDto>();
    }
}

CreateMultiLingualMap extension method returns an object of type CreateMultiLingualMapResult which contains EntityMap and TranslationMap fields. These fields can be used to customize multi lingual mapping.

Example:

this.CreateMultiLingualMap<Order, OrderTranslation, OrderListDto>(context)
    .EntityMap.ForMember(dest => dest.ProductCount, opt => opt.MapFrom(src => src.Products.Count));

IMultiLingualObjectManager

IMultiLingualObjectManager interface defines GetTranslation method to get the translation object of the entity.

The default implementation of the IMultiLingualObjectManager interface finds the translation with selected UI culture first. If there is no translation with selected UI culture, then extension method searches for the default culture value of parent entity (which you can set it at create time with DefaultLanguage setting value (see Setting)) and uses the translation in default language. If extension method couldn't find any translation in current UI language or default language, it uses one of the existing translations.