1- using System ;
1+ using System ;
2+ using System . Collections . Generic ;
23using System . Globalization ;
34using Abp . Configuration ;
45using Abp . Dependency ;
56using Abp . Domain . Entities ;
67using Abp . Localization ;
78using AutoMapper ;
89using System . Linq ;
10+ using Abp . Collections . Extensions ;
11+ using Abp . Extensions ;
912
1013namespace Abp . AutoMapper
1114{
@@ -39,7 +42,7 @@ public static TDestination MapTo<TSource, TDestination>(this TSource source, TDe
3942 }
4043
4144 public static CreateMultiLingualMapResult < TMultiLingualEntity , TTranslation , TDestination > CreateMultiLingualMap < TMultiLingualEntity , TMultiLingualEntityPrimaryKey , TTranslation , TDestination > (
42- this IMapperConfigurationExpression configuration , MultiLingualMapContext multiLingualMapContext )
45+ this IMapperConfigurationExpression configuration , MultiLingualMapContext multiLingualMapContext , bool fallbackToParentCultures = false )
4346 where TTranslation : class , IEntityTranslation < TMultiLingualEntity , TMultiLingualEntityPrimaryKey >
4447 where TMultiLingualEntity : IMultiLingualEntity < TTranslation >
4548 {
@@ -48,15 +51,29 @@ public static CreateMultiLingualMapResult<TMultiLingualEntity, TTranslation, TDe
4851 result . TranslationMap = configuration . CreateMap < TTranslation , TDestination > ( ) ;
4952 result . EntityMap = configuration . CreateMap < TMultiLingualEntity , TDestination > ( ) . BeforeMap ( ( source , destination , context ) =>
5053 {
54+ if ( source . Translations . IsNullOrEmpty ( ) )
55+ {
56+ return ;
57+ }
58+
5159 var translation = source . Translations . FirstOrDefault ( pt => pt . Language == CultureInfo . CurrentUICulture . Name ) ;
5260 if ( translation != null )
5361 {
5462 context . Mapper . Map ( translation , destination ) ;
5563 return ;
5664 }
5765
58- var defaultLanguage = multiLingualMapContext . SettingManager
59- . GetSettingValue ( LocalizationSettingNames . DefaultLanguage ) ;
66+ if ( fallbackToParentCultures )
67+ {
68+ translation = GeTranslationBasedOnCulturalRecursive < TMultiLingualEntity , TMultiLingualEntityPrimaryKey , TTranslation > ( CultureInfo . CurrentUICulture . Parent , source . Translations , 0 ) ;
69+ if ( translation != null )
70+ {
71+ context . Mapper . Map ( translation , destination ) ;
72+ return ;
73+ }
74+ }
75+
76+ var defaultLanguage = multiLingualMapContext . SettingManager . GetSettingValue ( LocalizationSettingNames . DefaultLanguage ) ;
6077
6178 translation = source . Translations . FirstOrDefault ( pt => pt . Language == defaultLanguage ) ;
6279 if ( translation != null )
@@ -75,11 +92,27 @@ public static CreateMultiLingualMapResult<TMultiLingualEntity, TTranslation, TDe
7592 return result ;
7693 }
7794
78- public static CreateMultiLingualMapResult < TMultiLingualEntity , TTranslation , TDestination > CreateMultiLingualMap < TMultiLingualEntity , TTranslation , TDestination > ( this IMapperConfigurationExpression configuration , MultiLingualMapContext multiLingualMapContext )
95+ private const int MaxCultureFallbackDepth = 5 ;
96+
97+ private static TTranslation GeTranslationBasedOnCulturalRecursive < TMultiLingualEntity , TMultiLingualEntityPrimaryKey , TTranslation > ( CultureInfo culture , ICollection < TTranslation > translations , int currentDepth )
98+ where TTranslation : class , IEntityTranslation < TMultiLingualEntity , TMultiLingualEntityPrimaryKey >
99+ {
100+ if ( culture == null || culture . Name . IsNullOrWhiteSpace ( ) || translations . IsNullOrEmpty ( ) || currentDepth > MaxCultureFallbackDepth )
101+ {
102+ return null ;
103+ }
104+
105+ var translation = translations . FirstOrDefault ( pt => pt . Language . Equals ( culture . Name , StringComparison . OrdinalIgnoreCase ) ) ;
106+ return translation ?? GeTranslationBasedOnCulturalRecursive < TMultiLingualEntity , TMultiLingualEntityPrimaryKey , TTranslation > ( culture . Parent , translations , currentDepth + 1 ) ;
107+ }
108+
109+ public static CreateMultiLingualMapResult < TMultiLingualEntity , TTranslation , TDestination > CreateMultiLingualMap < TMultiLingualEntity , TTranslation , TDestination > ( this IMapperConfigurationExpression configuration ,
110+ MultiLingualMapContext multiLingualMapContext ,
111+ bool fallbackToParentCultures = false )
79112 where TTranslation : class , IEntity , IEntityTranslation < TMultiLingualEntity , int >
80113 where TMultiLingualEntity : IMultiLingualEntity < TTranslation >
81114 {
82- return configuration . CreateMultiLingualMap < TMultiLingualEntity , int , TTranslation , TDestination > ( multiLingualMapContext ) ;
115+ return configuration . CreateMultiLingualMap < TMultiLingualEntity , int , TTranslation , TDestination > ( multiLingualMapContext , fallbackToParentCultures ) ;
83116 }
84117 }
85118}
0 commit comments