Asp.net Core API 本地化

本文是一个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>();


源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值