|
|
@ -19,16 +19,16 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD |
|
|
{ |
|
|
{ |
|
|
SettingProvider = settingProvider; |
|
|
SettingProvider = settingProvider; |
|
|
} |
|
|
} |
|
|
public virtual async Task<TTranslation> GetTranslationAsync<TTranslation>( |
|
|
public virtual async Task<TTranslation?> GetTranslationAsync<TTranslation>( |
|
|
ICollection<TTranslation> translations, |
|
|
IEnumerable<TTranslation> translations, |
|
|
string culture, |
|
|
string? culture, |
|
|
bool fallbackToParentCultures) |
|
|
bool fallbackToParentCultures) |
|
|
where TTranslation : class, IObjectTranslation |
|
|
where TTranslation : class, IObjectTranslation |
|
|
|
|
|
|
|
|
{ |
|
|
{ |
|
|
culture ??= CultureInfo.CurrentUICulture.Name; |
|
|
culture ??= CultureInfo.CurrentUICulture.Name; |
|
|
|
|
|
|
|
|
if (translations.IsNullOrEmpty()) |
|
|
if (translations == null || !translations.Any()) |
|
|
{ |
|
|
{ |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
@ -65,9 +65,9 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD |
|
|
return translation; |
|
|
return translation; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public virtual Task<TTranslation> GetTranslationAsync<TMultiLingual, TTranslation>( |
|
|
public virtual Task<TTranslation?> GetTranslationAsync<TMultiLingual, TTranslation>( |
|
|
TMultiLingual multiLingual, |
|
|
TMultiLingual multiLingual, |
|
|
string culture = null, |
|
|
string? culture = null, |
|
|
bool fallbackToParentCultures = true) |
|
|
bool fallbackToParentCultures = true) |
|
|
where TMultiLingual : IMultiLingualObject<TTranslation> |
|
|
where TMultiLingual : IMultiLingualObject<TTranslation> |
|
|
where TTranslation : class, IObjectTranslation |
|
|
where TTranslation : class, IObjectTranslation |
|
|
@ -75,13 +75,13 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD |
|
|
return GetTranslationAsync(multiLingual.Translations, culture: culture, fallbackToParentCultures: fallbackToParentCultures); |
|
|
return GetTranslationAsync(multiLingual.Translations, culture: culture, fallbackToParentCultures: fallbackToParentCultures); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected virtual TTranslation GetTranslationBasedOnCulturalRecursive<TTranslation>( |
|
|
protected virtual TTranslation? GetTranslationBasedOnCulturalRecursive<TTranslation>( |
|
|
CultureInfo culture, ICollection<TTranslation> translations, int currentDepth) |
|
|
CultureInfo culture, IEnumerable<TTranslation> translations, int currentDepth) |
|
|
where TTranslation : class, IObjectTranslation |
|
|
where TTranslation : class, IObjectTranslation |
|
|
{ |
|
|
{ |
|
|
if (culture == null || |
|
|
if (culture == null || |
|
|
culture.Name.IsNullOrWhiteSpace() || |
|
|
culture.Name.IsNullOrWhiteSpace() || |
|
|
translations.IsNullOrEmpty() || |
|
|
translations == null || !translations.Any() || |
|
|
currentDepth > MaxCultureFallbackDepth) |
|
|
currentDepth > MaxCultureFallbackDepth) |
|
|
{ |
|
|
{ |
|
|
return null; |
|
|
return null; |
|
|
@ -89,5 +89,108 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD |
|
|
|
|
|
|
|
|
var translation = translations.FirstOrDefault(pt => pt.Language.Equals(culture.Name, StringComparison.OrdinalIgnoreCase)); |
|
|
var translation = translations.FirstOrDefault(pt => pt.Language.Equals(culture.Name, StringComparison.OrdinalIgnoreCase)); |
|
|
return translation ?? GetTranslationBasedOnCulturalRecursive(culture.Parent, translations, currentDepth + 1); |
|
|
return translation ?? GetTranslationBasedOnCulturalRecursive(culture.Parent, translations, currentDepth + 1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public virtual async Task<List<TTranslation?>> GetBulkTranslationsAsync<TTranslation>(IEnumerable<IEnumerable<TTranslation>> translationsCombined, string? culture, bool fallbackToParentCultures) |
|
|
|
|
|
where TTranslation : class, IObjectTranslation |
|
|
|
|
|
{ |
|
|
|
|
|
culture ??= CultureInfo.CurrentUICulture.Name; |
|
|
|
|
|
|
|
|
|
|
|
if (translationsCombined == null || !translationsCombined.Any()) |
|
|
|
|
|
{ |
|
|
|
|
|
return new(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var someHaveNoTranslations = false; |
|
|
|
|
|
var res = new List<TTranslation?>(); |
|
|
|
|
|
foreach (var translations in translationsCombined) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!translations.Any()) |
|
|
|
|
|
{ |
|
|
|
|
|
//if the src has no translations, don't try to find a translation
|
|
|
|
|
|
res.Add(null); |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
var translation = translations.FirstOrDefault(pt => pt.Language == culture); |
|
|
|
|
|
if (translation != null) |
|
|
|
|
|
{ |
|
|
|
|
|
res.Add(translation); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
if (fallbackToParentCultures) |
|
|
|
|
|
{ |
|
|
|
|
|
translation = GetTranslationBasedOnCulturalRecursive( |
|
|
|
|
|
CultureInfo.CurrentUICulture.Parent, |
|
|
|
|
|
translations, |
|
|
|
|
|
0 |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (translation != null) |
|
|
|
|
|
{ |
|
|
|
|
|
res.Add(translation); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
res.Add(null); |
|
|
|
|
|
someHaveNoTranslations = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
res.Add(null); |
|
|
|
|
|
someHaveNoTranslations = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (someHaveNoTranslations) |
|
|
|
|
|
{ |
|
|
|
|
|
var defaultLanguage = await SettingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); |
|
|
|
|
|
|
|
|
|
|
|
var index = 0; |
|
|
|
|
|
foreach (var translations in translationsCombined) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!translations.Any()) |
|
|
|
|
|
{ |
|
|
|
|
|
//don't try to find a translation
|
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
var translation = res[index]; |
|
|
|
|
|
if (translation != null) |
|
|
|
|
|
{ |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
translation = translations.FirstOrDefault(pt => pt.Language == defaultLanguage); |
|
|
|
|
|
if (translation != null) |
|
|
|
|
|
{ |
|
|
|
|
|
res[index] = translation; |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
res[index] = translations.FirstOrDefault(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
index++; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return res; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public virtual async Task<List<(TMultiLingual entity, TTranslation? translation)>> GetBulkTranslationsAsync<TMultiLingual, TTranslation>(IEnumerable<TMultiLingual> multiLinguals, string? culture, bool fallbackToParentCultures) |
|
|
|
|
|
where TMultiLingual : IMultiLingualObject<TTranslation> |
|
|
|
|
|
where TTranslation : class, IObjectTranslation |
|
|
|
|
|
{ |
|
|
|
|
|
var resInitial = await GetBulkTranslationsAsync(multiLinguals.Select(x => x.Translations), culture, fallbackToParentCultures); |
|
|
|
|
|
var index = 0; |
|
|
|
|
|
var res = new List<(TMultiLingual entity, TTranslation? translation)>(); |
|
|
|
|
|
foreach (var item in multiLinguals) |
|
|
|
|
|
{ |
|
|
|
|
|
var t = resInitial[index++]; |
|
|
|
|
|
res.Add((item, t)); |
|
|
|
|
|
} |
|
|
|
|
|
return res; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|