Clean Architecture For RazorPage 實現多語言和本地化

最近終於把多語言功能加上了,這次就再發一篇,講一下在asp.net core環境下如何實現多語言和本地化(Globalization and localization)功能,主要參看:ASP.NET Core 提供的服務和中間件可將網站本地化為不同的語言和文化,下面會除了介紹如何實現多語言切換還會重點講一下如何藉助工具快速的維護多個語言的資源文件。

實現的效果


目前支援,後面會講如何快速添加和維護資源文件

  • 中文
  • 日文
  • 德文
  • 英文
  • 俄文

Github

Demo://razor.i247365.net
源程式碼:neozhu/RazorPageCleanArchitecture

後面我會整理一期完整介紹該框架的文章。

多語言實現的方法

在本項目中是通過 Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer,Microsoft.Extensions.Localization.IStringLocalizer 這兩個重要的組件實現的多語言顯示的。

配置開啟多語言服務

添加AddViewLocalization()

用於動態切換顯示語言用戶可以通過菜單選擇語言默認按系統語言


參考Real World Localization Implementation ASP.NET Core 5

CookieRequestCultureProvider 從cookie讀取設定的語言環境

public static class RequestLocalizationCookiesMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestLocalizationCookies(this IApplicationBuilder app)
        {
            app.UseMiddleware<RequestLocalizationCookiesMiddleware>();
            return app;
        }
    }

    public class RequestLocalizationCookiesMiddleware : IMiddleware
    {
        public CookieRequestCultureProvider Provider { get; }

        public RequestLocalizationCookiesMiddleware(IOptions<RequestLocalizationOptions> requestLocalizationOptions)
        {
            Provider =
                requestLocalizationOptions
                    .Value
                    .RequestCultureProviders
                    .Where(x => x is CookieRequestCultureProvider)
                    .Cast<CookieRequestCultureProvider>()
                    .FirstOrDefault();
        }

        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            if (Provider != null)
            {
                var feature = context.Features.Get<IRequestCultureFeature>();

                if (feature != null)
                {
                    // remember culture across request
                    context.Response
                        .Cookies
                        .Append(
                            Provider.CookieName,
                            CookieRequestCultureProvider.MakeCookieValue(feature.RequestCulture)
                        );
                }
            }

            await next(context);
        }
    }

多語言資源文件位置

多語言資源文件的目錄結構要與項目的目錄結構一致

如何快速高效的維護資源文件

這裡我給大家介紹一個插件ResXResourceManager

維護你的多國語言

也可以導出Excel/用戶工具翻譯後導入

最後

如果你有什麼問題可以留言告訴我,同時歡迎你一起參與開發,這個項目還會持續更新下去
源程式碼:RazorPageCleanArchitecture
Demo://razor.i247365.net