【问题标题】:Multi-Lingual text in Razor pagesRazor 页面中的多语言文本
【发布时间】:2015-01-02 08:20:40
【问题描述】:

我有一个 ASP.NET MVC Razor 网站,它应该存在于具有不同文化和语言的多个国家。我的开发团队只关心英语,UI 页面上的整个文本也是用简单的英语编写的。我希望将此英文文本转换为特定于文化的语言。我正在使用资源文件来管理我网站上的字符串。

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

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

【问题讨论】:

    标签: asp.net-mvc razor multilingual culture


    【解决方案1】:

    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。控制器助手:

    引入_ 方法,让您在控制器中快速翻译文本:

    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>
    

    【讨论】:

    • 我想做同样的好例子,你能解释一下你只有 Texts.es.resx 还有什么是 Texts.GetRespurces 电话谢谢
    猜你喜欢
    • 2019-09-03
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多