54 lines
1.7 KiB
C#
54 lines
1.7 KiB
C#
using System.Globalization;
|
|
|
|
namespace OliverBooth.Middleware;
|
|
|
|
/// <summary>
|
|
/// Redirects requests to the default culture if the culture is not specified in the URL.
|
|
/// </summary>
|
|
internal sealed class CultureRedirectMiddleware
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="CultureRedirectMiddleware" /> class.
|
|
/// </summary>
|
|
/// <param name="next">The next request delegate.</param>
|
|
public CultureRedirectMiddleware(RequestDelegate next)
|
|
{
|
|
_next = next;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invokes the middleware.
|
|
/// </summary>
|
|
/// <param name="context">The HTTP context.</param>
|
|
public async Task Invoke(HttpContext context)
|
|
{
|
|
const StringComparison comparison = StringComparison.OrdinalIgnoreCase;
|
|
|
|
HttpRequest request = context.Request;
|
|
PathString requestPath = request.Path;
|
|
|
|
if (requestPath.HasValue)
|
|
{
|
|
string[] pathSegments = requestPath.Value.Split('/');
|
|
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
|
|
|
|
if (pathSegments.Length >= 2 && cultures.Any(CultureMatch))
|
|
{
|
|
await _next(context);
|
|
return;
|
|
}
|
|
|
|
bool CultureMatch(CultureInfo culture)
|
|
{
|
|
string segment = pathSegments[1].Split('-')[0];
|
|
return string.Equals(culture.TwoLetterISOLanguageName, segment, comparison);
|
|
}
|
|
}
|
|
|
|
const string defaultCulture = "en";
|
|
var redirectUrl = $"/{defaultCulture}{requestPath}{request.QueryString}";
|
|
context.Response.Redirect(redirectUrl);
|
|
}
|
|
} |