Razor页面中的多语言文本

时间:2015-01-02 08:20:40

标签: asp.net-mvc razor multilingual culture

我有一个ASP.NET MVC Razor网站,该网站应该存在于具有不同文化和语言的多个国家。我的开发团队只关注英文,UI页面上的全文也用简单的英文写成。我想把这个英文文本转换成文化特定的语言。我正在使用资源文件来管理我网站上的字符串。

一种方法是根据每种语言创建多个资源文件,然后根据特定文化使用每个文件。这个东西需要手动管理。如果有人做了这件事,请为此实现提出任何参考或任何示例代码。

如果有任何方法我可以自动化这个东西,那么这将是一个多语言网站的最佳方式。就像文化可以通过用户IP地址轻松检测一样,根据文化,我应该能够将所有基于英语的文本转换为当前的文化特定语言。

1 个答案:

答案 0 :(得分:0)

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>