Asp.net Core API 本地化

发布于:2025-03-20 ⋅ 阅读:(13) ⋅ 点赞:(0)

本文是一个demo,演示了如何根据用户接口查询字段(正常放header中),设置当前culture,并获取当前culture的key value给用户提示

  1. 创建Resources文件夹,添加以下三个文件
    在这里插入图片描述
    其中ExceptionUnuse 是一个空的类,供IStringLocalizer使用,IStringLocalizer 决定了resource文件需要以Exceptions开头进行命名,且需要注意Exceptions这个类的命名空间,因为这个决定了能否找到资源文件
    在这里插入图片描述
namespace CoreAPILocalization
{
    public class Exceptions
    {

    }
}

  1. 创建中间件,设置当前culture
using Microsoft.Extensions.Options;
using System.Globalization;

namespace CoreAPILocalization.CoreConfig
{
    public class CultureMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IOptions<RequestLocalizationOptions> _options;

        public CultureMiddleware(RequestDelegate next, IOptions<RequestLocalizationOptions> options)
        {
            _next = next;
            _options = options;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            var cultureQuery = context.Request.Query["culture"];
            if (!string.IsNullOrWhiteSpace(cultureQuery))
            {
                var culture = new CultureInfo(cultureQuery);
                if (_options.Value.SupportedCultures.Contains(culture))
                {
                    Thread.CurrentThread.CurrentCulture = culture;
                    Thread.CurrentThread.CurrentUICulture = culture;
                }
            }

            await _next(context);
        }
    }
}

  1. 创建全局异常filter
namespace CoreAPILocalization.CoreConfig
{
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    using Microsoft.Extensions.Localization;
    using System.Net;

    namespace ExceptionFilter
    {
        public class GlobalExceptionFilter : IAsyncExceptionFilter
        {
            private readonly IWebHostEnvironment _webHostEnvironment;

            private readonly IStringLocalizer<Exceptions> _localizer;
            public GlobalExceptionFilter(IWebHostEnvironment webHostEnvironment, IStringLocalizer<Exceptions> localizer)
            {
                _webHostEnvironment = webHostEnvironment;
                _localizer = localizer;
            }
            public Task OnExceptionAsync(ExceptionContext context)
            {

                var errorCode = "errorcode500"; // 假设这是从异常中提取的错误代码
                var errorMessage = _localizer[errorCode];

                context.Result = new ObjectResult(new { Error = errorMessage })
                {
                    StatusCode = (int)HttpStatusCode.InternalServerError
                };
                context.ExceptionHandled = true;
                return Task.CompletedTask;
            }
        }
    }
}

  1. DI
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddControllersWithViews()
    .AddViewLocalization()
    .AddDataAnnotationsLocalization();

builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[] { "en-US", "zh-CN" };
    options.DefaultRequestCulture = new RequestCulture("en-US");
    options.SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
    options.SupportedUICultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
});



builder.Services.Configure<MvcOptions>(opt =>
{
    opt.Filters.Add<GlobalExceptionFilter>();
});


.....

app.UseRequestLocalization();

app.UseMiddleware<CultureMiddleware>();


源码