日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net core 实现支持多语言

發(fā)布時(shí)間:2023/12/4 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net core 实现支持多语言 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

asp.net core 實(shí)現(xiàn)支持多語言

Intro

最近有一個(gè)外國友人通過郵件聯(lián)系我,想用我的活動室預(yù)約,但是還沒支持多語言,基本上都是寫死的中文,所以最近想支持一下更多語言,于是有了多語言方面的一些實(shí)踐

國際化/本地化介紹

國際化(Globalization)和本地化(Localization)是要實(shí)現(xiàn)的多語言支持的基礎(chǔ)

Globalization is the process of designing and developing applications that function for multiple cultures.

Localization is the process of customizing your application for a given culture and locale.

國際化是要支持處理多種文化,而本地化是要根據(jù)某一個(gè)文化和區(qū)域的來展示相應(yīng)的處理。

更多關(guān)于國際化與本地化的不同可以參考 Stack Overflow 上的討論 https://stackoverflow.com/questions/2074869/globalization-vs-localization

Localization In Asp.NET Core

微軟官方的 Localization 的實(shí)現(xiàn)是基于資源文件實(shí)現(xiàn)的 ( *.resx),我們也可以擴(kuò)展支持更多方式,如 JSON/數(shù)據(jù)庫 都是可以的,社區(qū)已經(jīng)有實(shí)現(xiàn)的示例,只要是可以提供一個(gè)文本源的都是可以的,我們先使用默認(rèn)的基于資源文件的,下一篇再講一個(gè)自定義實(shí)現(xiàn)一個(gè) Localization Provider。

.NET Core Localization 的 核心是 IStringLocalizer,asp.net core 里擴(kuò)展定義了 IViewLocalizer 和 IHtmlLocalizer, IViewLocalizer 和 IHtmlLocalizer 主要是為了處理包含 html 的資源,他們不會對資源進(jìn)行 html encode,相當(dāng)于 @Html.Raw 的效果,而 IStringLocalizer 則會被 html encode,除此之外 IViewLocalizer 還會根據(jù)當(dāng)前視圖的路徑尋找資源文件

來看一個(gè)示例:

Razor 頁面

瀏覽器效果:

查看網(wǎng)頁源代碼:

實(shí)際案例

服務(wù)注冊

注冊 Localization 相關(guān)服務(wù):

var supportedCultures = new[] {new CultureInfo("zh"),new CultureInfo("en"), }; services.Configure<RequestLocalizationOptions>(options => {options.DefaultRequestCulture = new RequestCulture("zh");// Formatting numbers, dates, etc.options.SupportedCultures = supportedCultures;// UI strings that we have localized.options.SupportedUICultures = supportedCultures; }); services.AddLocalization(options => options.ResourcesPath = Configuration.GetAppSetting("ResourcesPath"));

配置視圖 Localization(根據(jù)需要如果是 WebAPI 就不需要了)

services.AddControllersWithViews().AddNewtonsoftJson(options =>{options.SerializerSettings.ContractResolver = new DefaultContractResolver();options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; // 設(shè)置時(shí)區(qū)為 UTCoptions.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;}).AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix,opts => { opts.ResourcesPath = Configuration.GetAppSetting("ResourcesPath"); }).AddDataAnnotationsLocalization().SetCompatibilityVersion(CompatibilityVersion.Latest);

中間件配置:

app.UseRequestLocalization();

邏輯代碼中使用示例:

IStringLocalizer 和 IHtmlLocalizer / IViewLocalizer 都可以直接從依賴注入服務(wù)中獲取, IStringLocalizer 和 IHtmlLocalizer 推薦使用強(qiáng)類型的方式,也就是下面示例的使用方式,使用方式和 ILogger 類似

public async Task<ActionResult> MakeReservation([FromBody]ReservationViewModel model,[FromHeader]string captcha,[FromHeader]string captchaType,[FromServices]IStringLocalizer<HomeController> localizer) {var result = new ResultModel<bool>();var isCodeValid = await HttpContext.RequestServices.GetService<CaptchaVerifyHelper>().ValidateVerifyCodeAsync(captchaType, captcha);if (!isCodeValid){result.Status = ResultStatus.RequestError;result.ErrorMsg = localizer["InvalidCaptchaInfo"];return Json(result);}

在視圖中使用示例:

localizer["data"] 返回的是一個(gè) LocalizedString,實(shí)現(xiàn)了隱式轉(zhuǎn)換為 string, 有的時(shí)候可能需要強(qiáng)制轉(zhuǎn)一下string, 或者使用 Value 屬性

@inject IViewLocalizer viewLocalizer viewLocalizer["About"] @Html.ActionLink((string)viewLocalizer["About"], "About", "Home") @Html.ActionLink(viewLocalizer["About"].Value, "About", "Home")

資源文件配置:

資源文件的配置和文件的結(jié)構(gòu)類似,下面是一個(gè)示例

準(zhǔn)備的來說是和類型的 FullName 有關(guān)系,一般的項(xiàng)目名稱就是程序集名稱,就是根命名空間,文件名稱就是類型名稱,所以一般情況下資源文件的位置和類型的位置是一致的,但是如果文件和類型名稱不符合,那就要按照類型的 FullName 來找,視圖也是類似的,如果根命名空間不是程序集名稱,也是可以配置的具體的參考文檔

Controllers.HomeController => Controllers/HomeController.zh.resx/ Controllers/HomeController.en.resx

Resource nameDot or path naming
Resources/Controllers.HomeController.fr.resxDot
Resources/Controllers/HomeController.fr.resxPath


  • Resources/Views/Home/About.fr.resx


  • Resources/Views.Home.About.fr.resx




實(shí)際項(xiàng)目中的資源文件示例:

實(shí)際訪問效果:https://reservation.weihanli.xyz/

默認(rèn)的中文界面:

英文界面:

只是做了幾個(gè)前臺的示例,還有很多地方?jīng)]改

Docker 部署

現(xiàn)在的項(xiàng)目是基于 docker + k8s 部署的,所以支持 docker 部署很重要

要支持多語言,需要安裝 ICU 相關(guān)的包,(這個(gè)可不是 996.icu 的 icu 哈,如果不裝真的有可能導(dǎo)致 996.icu)

RUN apk add --no-cache icu-libs # 安裝 icu-libs ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT false # 配置 Globalization

完整的 dockerfile 可以參考:https://github.com/dotnet/dotnet-docker/blob/cb7a9c35dacf6d34fcf7bab7995e60faef55f61f/samples/dotnetapp/Dockerfile.alpine-x64-globalization

More

.net core 的設(shè)計(jì)真的是很靈活,很優(yōu)美,基于資源文件的本地化,感覺不太方便,使用資源文件的化可能就只能使用 VS 編輯了,雖然也是純文本的,基于 xml 但是編輯起來不如界面看著編輯舒服,如果使用 json 之類的,就比較簡單明了,編輯起來也比較方便,所以想把資源文件替換成 JSON 文件

下次分享一篇基于 JSON 的 Localization Provider 的實(shí)現(xiàn)

Reference

  • https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1

  • https://github.com/dotnet/extensions/tree/master/src/Localization

  • https://github.com/dotnet/aspnetcore/tree/master/src/Middleware/Localization

  • https://stackoverflow.com/questions/2074869/globalization-vs-localization

  • https://github.com/WeihanLi/ActivityReservation

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的asp.net core 实现支持多语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。