2017-08-01 70 views
1

我正在使用几个视图(包括部分共享的)和需要本地化的控制器的ASP.NET核心(.NETCoreApp 1.1)Web应用程序。ASP.NET核心本地化从独特的JSON资源

的约束条件是本地化字符串是具有以下结构的单一JSON文件中(可以在一个单一的文件,只要它仍然改变):

{ 
    "HELLO": { 
    "en": "Hello!", 
    "fr": "Bonjour !" 
    } 
} 

所以我想我需要什么是本地化访问这个独特的文件,并提供IStringLocalizerIViewLocalizer对象,我可以在我的控制器和像_localizer["HELLO"]视图使用,显然它不是默认模式。

为了增加难度,我还需要能够默认自动检测浏览器中的首选语言,或者明确地将语言作为路由值,例如/ en/Home/Index或/ fr/Home /索引,还包括/ Home/Index。

我对ASP.NET Core非常陌生,甚至在文档和各种示例实现位或我需要的东西时,我都无法实现任何可用于生产的可靠工具。我遇到的每件事都有一些缺失或过时。

如果有人了解这些事情会告诉我如何做到这一点,我将不胜感激!

编辑:我想我已经想出了如何从路由或浏览器中获取语言(如果没有路由的话)。下面是我做的:

我的路径模板是template: "{lang?}/{controller=Home}/{action=Index}/{id?}"),这里是我使用从控制器获取郎代码:

string lang = this.RouteData.Values["lang"] as string; 
if (lang == null) 
{ 
    string userLangs = HttpContext.Request.Headers["Accept-Language"].ToString(); 
    lang = userLangs.Split(',').FirstOrDefault(); 
} 

回答

1

至于使用JSON文件,我把这个代码here然后修改它以使用单个文件。在LocalizerUtil类中,ExpandPathIterator我只返回“Resources \ Localization”;它非常粗糙,但这意味着我可以为每种语言提供一个json文件。它不会在一个文件中执行嵌套语言,但我相信你可以进一步修改它来做到这一点。

我们走了将语言选择存储在cookie中的路线,并允许用户使用下拉菜单来交换语言。

Startup.cs

// Add localization 
services.AddJsonLocalization(opts => { opts.ResourcesPath = "Resources"; }); 

// Add framework services. 
services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(); 

services.Configure<RequestLocalizationOptions>(options => 
     { 
      var supportedCultures = new List<CultureInfo> 
      { 
       new CultureInfo("en"), 
       new CultureInfo("fr"), 
      }; 

      options.DefaultRequestCulture = new RequestCulture("en"); 
      // Formatting numbers, dates, etc. 
      options.SupportedCultures = supportedCultures; 
      // UI strings that we have localized. 
      options.SupportedUICultures = supportedCultures; 
     }); 

,然后使用的thisthis博客文章的组合来获得语言的切换工作。如果你想使用URL方案,博客文章也会涉及到这一点。

+0

谢谢。这就是我害怕的答案......在过去的两天里,我一直无法实现我所需的努力。我明天再试一次,也许我会有某种顿悟。 – albator1932

+1

@ albator1932 https://stackoverflow.com/a/44782669/909809可能对获取平面文件有用。我打算去平面文件路由,因为它具有更多的意义让所有的单词相邻,所以一切都保持同步,但由于缺乏示例,我现在只是为了多个文件而解决。 –

+0

哦,我不能相信我错过了这一个,我马上试一试。当我有工作的时候,我会做出一个完整的工作示例来分享,我无法相信这是多么的艰难。 – albator1932