我有一个ASP.NET MVC Razor网站,应该是生活在多个国家,有不同的文化,因此语言。我的开发团队只关心英语,UI页面上的全文也是用简单的英语写的。我希望这篇英文文本能被转换成文化特定的语言。我正在使用资源文件来管理我的网站上的字符串。
一种方法是根据每种语言创建多个资源文件,然后根据特定的区域性使用每个文件。这件事需要手动管理。如果有人做了这件事,请为这个实现提供任何参考或任何示例代码。
如果有任何方法,我可以自动化这件事,那么这将是最好的方式去一个多语言的网站。就像文化一样,通过用户IP地址可以很容易地检测到文化,并且基于文化,我应该能够将所有基于英语的文本转换成当前特定于文化的语言。
发布于 2015-01-02 08:46:21
1.自动使用用户文化
在当前Thread/HttpContext上自动设置用户区域性。在你的Web.Config里
<system.web>
...
<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto" />
...
</system.web>2.辅助功能
引入一种全局方法,该方法将使用适当的资源翻译输入文本:
public static class Resources
{
public static string GetResource(string key, params object[] data)
{
if (String.IsNullOrEmpty(key))
return key;
// the actual call to your Resources
var res = Texts.ResourceManager.GetString(key.ToUpper(), Thread.CurrentThread.CurrentUICulture);
if (String.IsNullOrEmpty(res))
return data != null && data.Length > 0 ? String.Format(key.ToUpper(), data) : key;
if (data != null && data.Length > 0)
return String.Format(res, data);
return res;
}
}该方法还允许您传递以String.Format方式使用的附加(可选)参数。例如:
// in your Resource file (Texts.es.resx)
GREETING_TEXT: "Hola amigo {0}, el tiempo es {1}"
// invocation
Resources.GetResource("GREETING_TEXT", "Chaim", DateTime.Now);3.主计长帮手:
引入一种_方法,使您可以在Controller中快速翻译文本:
public class BaseController : Controller
{
public string _(string key, params object[] data)
{
return Resources.GetResource(key, null, data);
}
}在控制器中,您必须确保继承了BaseController,并按如下方式使用:
public HomeController : BaseController:
{
public ActionResult GreetMe()
{
var msg = _("GREETING_TEXT", this.User, DateTime.Now);
return Content(msg);
}
}4.剃须刀帮手
至于你的Razor页面:
// non-generic version (for model-less pages)
public abstract class BaseWebPage : WebViewPage
{
public string _(string key, params object[] data)
{
return Resources.GetResource(key, null, data);
}
}
// generic version (for model defined pages)
public abstract class BaseWebPage<T> : WebViewPage<T>
{
public string _(string key, params object[] data)
{
return Resources.GetResource(key, null, data);
}
}现在,我们必须将这个新的基本WebPage设置为~/Views/Web.Config中页面的基类型。
<system.web.webPages.razor>
...
<pages pageBaseType="Full.NameSpace.ToYour.BaseWebPage">
...
</system.web.webPages.razor>(如果使用的是区域,则还必须修改每个~/Areas/AREA_NAME/Views/Web.Config )
您现在可以在Razor页面中使用它:
<h1>@_("HELLO")</h1>https://stackoverflow.com/questions/27739322
复制相似问题