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

阿新發表於2021-09-02

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

實現的效果


目前支援,後面會講如何快速新增和維護資原始檔

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

Github

Demo:http://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:http://razor.i247365.net

相關文章