首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Razor页面中的多语言文本

Razor页面中的多语言文本
EN

Stack Overflow用户
提问于 2015-01-02 08:20:40
回答 1查看 2.8K关注 0票数 3

我有一个ASP.NET MVC Razor网站,应该是生活在多个国家,有不同的文化,因此语言。我的开发团队只关心英语,UI页面上的全文也是用简单的英语写的。我希望这篇英文文本能被转换成文化特定的语言。我正在使用资源文件来管理我的网站上的字符串。

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

如果有任何方法,我可以自动化这件事,那么这将是最好的方式去一个多语言的网站。就像文化一样,通过用户IP地址可以很容易地检测到文化,并且基于文化,我应该能够将所有基于英语的文本转换成当前特定于文化的语言。

EN

回答 1

Stack Overflow用户

发布于 2015-01-02 08:46:21

1.自动使用用户文化

在当前Thread/HttpContext上自动设置用户区域性。在你的Web.Config

代码语言:javascript
复制
<system.web>
    ...
    <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto" />
    ...
</system.web>

2.辅助功能

引入一种全局方法,该方法将使用适当的资源翻译输入文本:

代码语言:javascript
复制
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方式使用的附加(可选)参数。例如:

代码语言:javascript
复制
// 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中快速翻译文本:

代码语言:javascript
复制
public class BaseController : Controller
{
    public string _(string key, params object[] data)
    {
        return Resources.GetResource(key, null, data);
    }
}

在控制器中,您必须确保继承了BaseController,并按如下方式使用:

代码语言:javascript
复制
public HomeController : BaseController:
{
    public ActionResult GreetMe()
    {
        var msg = _("GREETING_TEXT", this.User, DateTime.Now);
        return Content(msg);
    }
}

4.剃须刀帮手

至于你的Razor页面:

代码语言:javascript
复制
// 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中页面的基类型。

代码语言:javascript
复制
<system.web.webPages.razor>
    ...
    <pages pageBaseType="Full.NameSpace.ToYour.BaseWebPage">
    ...
</system.web.webPages.razor>

(如果使用的是区域,则还必须修改每个~/Areas/AREA_NAME/Views/Web.Config )

您现在可以在Razor页面中使用它:

代码语言:javascript
复制
<h1>@_("HELLO")</h1>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27739322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档