当前位置:首页 > Web开发 > 正文

而我的现存项目已经使用了数据库翻译存储

2024-03-31 Web开发

比来的新型冠状病毒风行让很多人主动在家断绝,但愿疫情能快点消退。武汉加油,中国必胜!

       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