Проблема в том, что я не могу гарантировать, что клиент всегда будет отправлять «-ch» на принимающем языке.
Установка этих трех поддерживаемых языков в RequestLocalizationOptions приведет к тому, что «fr» станет «de-ch» по умолчанию.
В настоящее время у меня установлен следующий порядок поставщиков культуры по умолчанию:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
Чтобы достичь теперь максимальная гибкость и отображение всего, что я хочу "..-ch". Я написал собственный поставщик запросов. Я зарегистрировал его в конце этих трех, надеясь получить любой результат и сопоставить его с de-ch. Моя проблема в том, что я. понял, что это работает только с языком принятия. Нужно ли мне вручную создавать трех других поставщиков в моем пользовательском поставщике, проверять их результат в предпочтительном порядке, а затем сопоставлять его с «..-ch» или есть более простое решение?
Код: Выделить всё
public class CustomSwissCultureProvider : RequestCultureProvider {
private static string defaultFallback = "de-ch";
public override async Task
DetermineProviderCultureResult(HttpContext httpContext) {
// Let the other providers (QueryString, Cookie, Accept-Language) run first and get result of the last executed one:
var defaultCultureProvider = new AcceptLanguageHeaderRequestCultureProvider();
var result = await defaultCultureProvider.DetermineProviderCultureResult(httpContext);
if (result != null) {
// Apply the same mapping for UI Culture if needed
var culture = GetSwissCulture(result.Cultures.FirstOrDefault());
var uiCulture = GetSwissCulture(result.UICultures.FirstOrDefault());
// Return the updated ProviderCultureResult
return new ProviderCultureResult(culture, uiCulture);
}
return new ProviderCultureResult(defaultFallback, defaultFallback);
}
private static string? GetSwissCulture(StringSegment cultureSegment) {
string? culture = cultureSegment.HasValue ? cultureSegment.Value : null;
if (!string.IsNullOrEmpty(culture)) {
if (culture.Equals("de", StringComparison.OrdinalIgnoreCase)) {
return "de-CH";
}
else if (culture.Equals("fr", StringComparison.OrdinalIgnoreCase)) {
return "fr-CH";
}
else if (culture.Equals("it", StringComparison.OrdinalIgnoreCase)) {
return "it-CH";
}
}
return defaultFallback;
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... eproviders
Мобильная версия