而我的现存项目已经使用了数据库翻译存储
比来的新型冠状病毒风行让很多人主动在家断绝,但愿疫情能快点消退。武汉加油,中国必胜!
Asp.Net Core 供给了内置的网站国际化(全球化与本地化)撑持,微软还内置了基于 resx 资源字符串的国际化处事组件。可以在入门教程中找到相关内容。
但是内置实现方法有一个明显缺陷,resx 资源是要静态编译到措施集中的,无法在网站运行中姑且编纂,灵活性较差。幸好我找到了一个基于数据库资源存储的组件,这个组件完美解决了 resx 资源不灵活的缺陷,颠末适当的设置,可以在第一次查找资源时趁便创建数据库记录,而我们要做的就是访谒一次相应的网页,让组件创建好记录,然后我们去编纂相应的翻译字段并刷新缓存即可。
但是!又是但是,颠末一段时间的使用,发明基于数据库的方法依然存在缺陷,开发中不免有需要删除并重建数据库,初始化环境。这时,之前辛辛苦苦编纂的翻译就会一起灰飞烟灭 (╯‵□′)╯︵┻━┻ 。而 resx 资源却完美避开了这个问题,这时我就在想,能不能让他们同时事情,兼顾灵活性与不变性,鱼与熊掌兼得。
颠末一番摸索,终于得以告成,在此开贴记录分享。
正文 设置并启用国际化处事组件安置 Nuget 包 Localization.SqlLocalizer,这个包依赖 EF Core 进行数据库操纵。然后在 Startup 的 ConfigureServices 要领中插手以下代码注册 EF Core 上下文:
1 services.AddDbContext<LocalizationModelContext>(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.Configure<RequestLocalizationOptions>( 2 options => 3 { 4 var cultures = Configuration.GetSection("Internationalization").GetSection("Cultures") 5 .Get<List<string>>() 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 }
筹备一个页面挪用这个行动切换语言。然后,大功乐成!
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30375.html