ABP Framework defines two basic interfaces for Multi-Lingual entity definitions to provide a standard model for translating entities.
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
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; }
}
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;
}
}
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
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.