【问题标题】:How to set display attribute based on culture如何根据文化设置显示属性
【发布时间】:2017-09-14 10:24:03
【问题描述】:

我正在构建一个网站,其中包含更改显示语言的选项,这在 URL 中确定。

例如,如果我们导航到http://website.com/en-US/,页面将是英文,而http://website.com/ru-RU 网站将是俄文。

您可以在下面查看我如何实现此功能的详细信息。

我的问题是,我是否可以在我的ViewModel 中检索这些数据(保存在PageData)来设置Display 属性?或者我应该将此值设置为不同的变量(可能是会话?)如果是这样,我将如何检索它?

例如,我的 ViewModel 当前包含:

[Display(Name = "Email")]
public string Email { get; set; }

我需要类似的东西

[Display(Name = Resources.GetString("EmailDisplay", culture)]
public string Email { get; set; }

非常感谢您的帮助,谢谢!

RouteConfig.cs

routes.MapRoute(
    "Default",
    "{lang}/{controller}/{action}/{id}",
    new
    {
        lang = "ru-RU",
        controller = "Home",
        action = "Index",
        id = UrlParameter.Optional
    }
);

_ViewStart.cs

@{
    Layout = "~/Views/Shared/_Layout.cshtml";

    var cultureRoute = ViewContext.RouteData.Values["lang"].ToString();
    PageData["culture"] = new System.Globalization.CultureInfo(cultureRoute);
}

_Layout.cs

@{ 
    var culture = @PageData["culture"];
}

然后我有 2 个资源文件(Resources.en-US.resxResources.ru-RU.resx),我在页面上设置了元素的文本:

<h1>@Resources.ResourceManager.GetString("HomeTitle", culture)</h1>

【问题讨论】:

  • 参考this article获取使用资源文件进行本地化的示例
  • @StephenMuecke 谢谢!我设法找到了一种方法(不确定它是否是最好的方法,但它似乎有效!)我在下面添加了一个答案

标签: c# asp.net-mvc culture


【解决方案1】:

感谢斯蒂芬发布的链接,我能够通过首先在每个资源文件中添加所需的字符串来做到这一点。

这意味着将其添加到:

Resources.resx
Resources.en-US.resx
Resources.ru-RU.resx

然后将我的ViewModel 属性定义为:

[Display(Name = "LabelEmail", ResourceType = typeof(Resources))]
public string Email { get; set; }

最后,我更新了_ViewStart.cs 以设置当前的UICulture(这是应用程序确定使用哪个资源文件的方式):

UICulture = cultureRoute;

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2022-09-23
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多