建设网站要多少钱,做擦边球视频网站,seo 费用,wordpress文章页面500前言最近的新型冠状病毒流行让很多人主动在家隔离#xff0c;希望疫情能快点消退。武汉加油#xff0c;中国必胜#xff01;Asp.Net Core 提供了内置的网站国际化#xff08;全球化与本地化#xff09;支持#xff0c;微软还内置了基于 resx 资源字符串的国际化服务组件。… 前言 最近的新型冠状病毒流行让很多人主动在家隔离希望疫情能快点消退。武汉加油中国必胜 Asp.Net Core 提供了内置的网站国际化全球化与本地化支持微软还内置了基于 resx 资源字符串的国际化服务组件。可以在入门教程中找到相关内容。 但是内置实现方式有一个明显缺陷resx 资源是要静态编译到程序集中的无法在网站运行中临时编辑灵活性较差。幸好我找到了一个基于数据库资源存储的组件这个组件完美解决了 resx 资源不灵活的缺陷经过适当的设置可以在第一次查找资源时顺便创建数据库记录而我们要做的就是访问一次相应的网页让组件创建好记录然后我们去编辑相应的翻译字段并刷新缓存即可。 但是又是但是经过一段时间的使用发现基于数据库的方式依然存在缺陷开发中难免有需要删除并重建数据库初始化环境。这时之前辛辛苦苦编辑的翻译就会一起灰飞烟灭 (╯‵□′)╯︵┻━┻ 。而 resx 资源却完美避开了这个问题这时我就在想能不能让他们同时工作兼顾灵活性与稳定性鱼与熊掌兼得。 经过一番摸索终于得以成功在此开贴记录分享。正文设置并启用国际化服务组件 安装 Nuget 包 Localization.SqlLocalizer这个包依赖 EF Core 进行数据库操作。然后在 Startup 的 ConfigureServices 方法中加入以下代码注册 EF Core 上下文1 services.AddDbContextLocalizationModelContext(options
2 {
3 options.UseSqlServer(connectionString);
4 },
5 ServiceLifetime.Singleton,
6 ServiceLifetime.Singleton); 注册自制的混合国际化服务services.AddMixedLocalization(opts { opts.ResourcesPath Resources; }, options options.UseSettings(true, false, true, true)); 注册请求本地化配置 1 services.ConfigureRequestLocalizationOptions(2 options 3 {4 var cultures Configuration.GetSection(Internationalization).GetSection(Cultures)5 .GetListstring()6 .Select(x new CultureInfo(x)).ToList();7 var supportedCultures cultures;8 9 var defaultRequestCulture cultures.FirstOrDefault() ?? new CultureInfo(zh-CN);
10 options.DefaultRequestCulture new RequestCulture(culture: defaultRequestCulture, uiCulture: defaultRequestCulture);
11 options.SupportedCultures supportedCultures;
12 options.SupportedUICultures supportedCultures;
13 }); 注册 MVC 本地化服务复制代码1 services.AddMvc()
2 //注册视图本地化服务
3 .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts { opts.ResourcesPath Resources; })
4 //注册数据注解本地化服务
5 .AddDataAnnotationsLocalization(); 在 appsettings.json 的根对象节点添加属性复制代码Internationalization: {Cultures: [zh-CN,en-US]
} 在某个控制器加入以下动作 1 public IActionResult SetLanguage(string lang)2 {3 var returnUrl HttpContext.RequestReferer() ?? /Home;4 5 Response.Cookies.Append(6 CookieRequestCultureProvider.DefaultCookieName,7 CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(lang)),8 new CookieOptions { Expires DateTimeOffset.UtcNow.AddYears(1) }9 );
10
11 return Redirect(returnUrl);
12 } 准备一个页面调用这个动作切换语言。然后大功告成 这个自制服务遵循以下规则优先查找基于 resx 资源的翻译数据如果找到则直接使用如果没有找到再去基于数据库的资源中查找如果找到则正常使用如果没有找到则按照对服务的配置决定是否在数据库中生成记录并使用。自制混合国际化服务组件的实现 本体 注册辅助扩展 原理简介 服务组件利用了 DI 中可以为同一个服务类型注册多个实现类型的特性并在构造方法中注入服务集合便可以将注册的所有实现注入组件同时使用。要注意主控服务和工作服务不能注册为同一个服务类型不然会导致循环依赖。内置的国际化框架已经指明了依赖 IStringLocalizerFatory 必须将主控服务注册为 IStringLocalizerFatory工作服只能注册为其他类型不过依然要实现 IStringLocalizerFatory所以最方便的办法就是定义一个新服务类型作为工作服务类型并继承 IStringLocalizerFatory。 想直接体验效果的可以到文章底部访问我的 Github 下载项目并运行。结语 这个组件是在计划集成 IdentityServer4 管理面板时发现那个组件使用了 resx 的翻译而我的现存项目已经使用了数据库翻译存储两者又不相互兼容的情况下产生的想法。 当时 Localization.SqlLocalizer 旧版本2.0.4还存在无法在视图本地化时正常创建数据库记录的问题也是我调试修复了 bug 并向原作者提交了拉取请求原作者也在合并了我的修复后发布了新版本。 这次在集成 IdentityServer4 管理面板时又发现了 bug正准备联系原作者看怎么处理。