更新: 2022-03-22

修订版: ASP.NET Core – Globalization & Localization

更新: 2021-06-15

之前有说过, 我没有使用默认的 folder path 的 naming, 但是这里还是尝试了一下

这篇有说到一些 how it work https://khalidabuhakmeh.com/aspdotnet-core-localization-jump-start

在调用的时候有 3 个 way

IStringLocalizer<HomePageModel> localizer,
IHtmlLocalizer<HomePageModel> htmlLocalizer
@inject IViewLocalizer Localizer

第 3 个专门给 view 用的, 它继承 htmlLocalizer

第 1 和 2 通常是 controller 用的, 或者有需要用到 shared 的时候用的.

假设我们在 AddViewLocalization 时, 没有设置 ResourcePath

那么我们的 resx 就放在 class 的旁边然后取 class name 就可以了. IViewLocalizer 就用 view 的名字做 resx 就可以了.

这个时候 class 是不需要看 namespace 的.

如果说你不希望 .cs .cshtml .resx 放一起的话, 可以配置 ResourcePath

.AddViewLocalization(
LanguageViewLocationExpanderFormat.SubFolder,
options => options.ResourcesPath = "Resources"
)

这时 class 的 namespace 就变成重要了哦, folder 解构必须是 namespace 结构. view 的结构是 follow view file 的 folder 结构

如果你不喜欢很多 sub folder 可以把 .SubForlder 换成 .Suffix, 那么 resx 的 filename 就是用点 dot 来区开 e.g. Resources/Views.Home.About.zh-Hans.resx
 

之前说过不再写 0 到 1 教程了. 但是东西久了又容易忘光光.

之前有个 breaking change, https://www.cnblogs.com/keatkeat/p/13774007.html

所以需要改封装好的东西,这时复习就很重要了,所以就记入一下吧.

1. globalization  vs localization

解释的很清楚了.

startup 部分 service

我只是调用 AddViewLocalization, 因为我没用用微软的 path 然后 AddViewLocalization 里头有调用 services.AddLocalization 了, DataAnnotation 我也没用用到

IStringLocalizer 和 IHtmlLocalizer 的区别是内容是否含有 html. 如果有就用 IHtmlLocalizer 咯.

request culture provider :

微软有给了一些 build in 的 provider, 比如基于 query param 的, 那如果我们要一个基于 path 的可以自己写

services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { "en", "zh-Hans", "ms" };
options.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures)
.AddInitialRequestCultureProvider(
// 从 request context 推到出 language
new CustomRequestCultureProvider(context => Task.FromResult(new ProviderCultureResult("zh-Hans")))
);
});

resource.resx file

asp.net core 有一套 folder path 的 naming 逻辑. 但是我没用, 我喜欢直接用 namespace class 来管理.

所以一般上是这样, 这个 class file 我要放哪里都可以, 因为引入的时候是直接 using namespace 和 path 无关了.

具体调用

    public class IndexModel : PageModel
{ public IndexModel(
IStringLocalizer<Language.Shared> localizer,
IHtmlLocalizer<Language.Shared> htmlLocalizer
)
{
Localizer = localizer;
HtmlLocalizer = htmlLocalizer;
} private readonly IStringLocalizer<Language.Shared> Localizer;
private readonly IHtmlLocalizer<Language.Shared> HtmlLocalizer; public void OnGet()
{
CultureInfo.CurrentCulture = new CultureInfo("zh-Hans");
CultureInfo.CurrentUICulture = new CultureInfo("zh-Hans");
var value = Localizer["value"].Value;
var value1 = Localizer["<div>value</div>"].ToString();
var ttc = HtmlLocalizer["<b>Hello</b><i> {0}</i>", "dada"];
var ttc1 = Localizer["<b>Hello</b><i> {0}</i>", "dada"];
var cultureName = HttpContext.Features.Get<IRequestCultureFeature>().RequestCulture.Culture.Name;
}
}

inject 就是直接放入刚才 resource 的 class

IHtmlLocalizer<Language.Shared>

调用就是 Localizer["value"] 返回的是一个对象. 可以通过 .value .tostring 获取到最终的值.

在 view 调用的换也是同一个方式. 我没有用微软给的 way

@inject IViewLocalizer Localizer <-- 这个是微软教程的方案, 会依据 view path 去找 resx 的 file

view 在渲染的时候会依据 Localizer["value"] 返回的对象,来决定会不会 encode, 如果是 IHtmlLocalizer 的对象就会咯. 所以在 view 的时候不要自己去调用 .Value .ToString 之类的哦.

如果想换掉 culture 的话就直接 set CultureInfo.CurrentCulture

Asp.net core 学习笔记之 globalization & localization 复习篇的更多相关文章

  1. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  2. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  3. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  4. Asp.net Core学习笔记

    之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...

  5. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  6. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  7. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  8. asp.net.core学习笔记1:swagger的使用和webapi接收Jobject对象

    环境:asp.net.core 3.1 (一觉醒来官方已经不推荐3.0了,于是没有任何core经验,也只能开始了3.1的开发学习) 由于现有项目前后端分离.微服务化日趋流行,所以上手不采用web应用( ...

  9. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  10. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

随机推荐

  1. 集群及分布式定时任务中间件MEE_TIMED

    集群及分布式定时任务中间件MEE_TIMED 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521 MEE_TIMED一套开源的定时任务中间件,MEE ...

  2. Bash 技巧

    Bash 使用技巧 Bash 是 GNU 项目的 Bourne Again SHell, 具有交互式命令行编辑.支持它的体系结构上的作业控制.类似 csh 的功能 Bash 是免费软件,根据 GNU ...

  3. 使用 Doxygen 来生成 Box2d 的 API 文档

    对于 Doxygen 以前只听别人说过,而现在使用它也是一个偶然,缘分吧.前两天看 box2d 的官方 sdk 中,发现他有用户手册却没有说明,只是留下了一个 Doxygen 的文件.事情告一段落,然 ...

  4. 手把手教你!STM32单片机入门指南:从初级到中级工程师的学习路线

    ​在当今科技日新月异的时代,嵌入式系统作为智能设备的核心驱动力,正以前所未有的速度渗透到我们生活的方方面面.STM32系列微控制器,以其高性能.低功耗及丰富的外设资源,成了许多开发者踏入嵌入式领域首选 ...

  5. 为什么我@Value中明明显示了值,他却是null

    今天尝试把一些重要东西写入application.yml里,结果在使用的时候发现value取不出来值原因有2个: 1.没有写@compent,没有把这个类交给spring管理 2.在service层n ...

  6. Apachepoi读写Excel实例

    /* * 通过poi创建Excel并写入内容 * */ public static void write() throws IOException { //在内存中创建excel XSSFWorkbo ...

  7. C#/.NET/.NET Core优秀项目和框架2024年7月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...

  8. 【转载】ubuntu用户/linux用户登录后没有自动加载.bashrc

    版权声明:本文为CSDN博主「安安爸Chris」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/mimiduc ...

  9. 为什么阿波罗机器人(Apollo)是外观最帅的机器人 ?

    资料: https://www.youtube.com/watch?v=3CdwPGC9nyk 答案很简单,那就是这个公司单独找了一个外观设计团队,单独设计的外观. 看来啥事情要想搞的好,那就得多花钱 ...

  10. 《Python数据可视化之matplotlib实践》 源码 第三篇 演练 第八章

    图  8.1 import matplotlib.pyplot as plt import numpy as np plt.axes([0.05, 0.7, 0.3, 0.3], frameon=Tr ...