我正在将本地化的WebForms应用程序转换为MVC5。我在MVC中看到的大多数示例都有一个资源 - resx - 文件(每种语言)用于整个应用程序。
是否可以为每个视图分别创建一个文件?如果是,是否有一个如何引用所述文件的例子?
更新:如果可能,我想保留资源文件未编译。这样我们就可以动态编辑RESX文件,而无需每次都重新编译网站。
以下是我在WebForms中的过程。我基本上试图在MVC5中重现这一点。
public string LocalizeText(Page CurrentPage, string resourceKey)
{
string localizedText = string.Empty;
// LOOK FOR LOCALIZED TEXT
String filePath = string.Empty;
if (!String.IsNullOrEmpty(CurrentPage.Request.GetFriendlyUrlFileVirtualPath()))
{
filePath = CurrentPage.Request.GetFriendlyUrlFileVirtualPath(); // FOR FRIENDLY URLS
}
else
{
filePath = CurrentPage.Request.CurrentExecutionFilePath; // FOR "UNFRIENDLY" URLS (THOSE WITH A FILE EXTENSION VISIBLE)
}
try
{
localizedText = Convert.ToString(HttpContext.GetLocalResourceObject(filePath, resourceKey, System.Globalization.CultureInfo.CurrentCulture)).Trim();
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.ToString() + "<br />" + filePath);
}
return localizedText;
}
资源文件位于App_LocalResources文件夹中。
答案 0 :(得分:3)
是的,可以为视图提供单独的资源文件。作为一个非常简单,相当沉闷的例子(抱歉:-)),请考虑以下视图模型:
using _31662592.Resources;
using System.ComponentModel.DataAnnotations;
public class HomeViewModel
{
[Display(Name = "WelcomeHeader", ResourceType = typeof(HomeResources))]
public string WelcomeHeader { get; set; }
[Display(Name = "WelcomeMessage", ResourceType = typeof(HomeResources))]
public string WelcomeMessage { get; set; }
}
在这里,我使用了Display
属性,该属性支持本地化。所以在我的例子中,我创建的资源文件如下所示:
如您所见,ResourceType
属性对应于资源文件的类型(在我的情况下为HomeResources
),Name
属性对应于字符串的名称在您希望将属性绑定到的资源文件中。
行动中没有任何幻想:
public ActionResult Index()
{
return View(new HomeViewModel());
}
视图也非常简单:
@model _31662592.Models.HomeViewModel
<h1>@Html.DisplayNameFor(m => m.WelcomeHeader)</h1>
<p>@Html.DisplayNameFor(m => m.WelcomeMessage)</p>
您甚至可以在视图中使用内联资源,例如:
@using _31662592.Resources
<h1>@HomeResources.WelcomeHeader</h1>
<p>@HomeResources.WelcomeMessage</p>
如果您遇到任何问题,请确保:
可以通过右键单击资源文件并选择Properties
来设置这两个选项。然后,这些选项将显示在可停靠窗口属性中。最后,如果您希望引用其他项目中的资源文件,请确保将其设置为Public
而不是内部,您可以通过双击资源文件将其设置为正常打开,然后将其访问修饰符从internal
更改为public
。