【问题标题】:How to localize structures HTML views in ASP.NET?如何在 ASP.NET 中本地化结构 HTML 视图?
【发布时间】:2016-09-01 00:23:46
【问题描述】:

我有一个多语言网站,并且视图内容(包括标记)可能因语言而异。这就是为什么我不能只本地化字符串并将它们放入资源中。

例如,我在俄语中的看法:

<div class="card">
    <div class="card-image">
        <img src="~/Images/CardHeaders/Business_CreditsSME.jpg" />
    </div>
    <div class="card-content">
        Text
    </div>            
</div>

用英文查看:

<p>Text</p>

我看到了两种本地化方法:

  1. 创建 Page.cshtml 和 Page.en.cshtml,并在控制器中创建一个自定义的LocaleView() 方法,该方法将使用本地化的视图文件。

    • 问题是视图并不总是不同的。这意味着有时我会复制标记。
  2. 照原样复制我的资源中的所有 HTML 标记,并使用 Html.Raw(Resources.PageView)

    • 创建、修改或读取位于资源中的 HTML 并不方便
    • 此外,我根本不喜欢Html.Raw 方法,也不喜欢在任何地方使用它

您如何定位不同结构的大视图?

【问题讨论】:

  • 我能想到的唯一方法是在控制器方法中使用脏代码来拥有一个开关盒并返回所需的视图。

标签: c# html razor asp.net-mvc-5 asp.net-mvc-views


【解决方案1】:

我结合了两种解决方案。

  1. 我已经在我的基本控制器中覆盖了View 方法,以便它查找现有的本地化视图。现在,如果我的观点差异太大,我只需创建View.en.cshtml 文件,它就会被控制器自动处理:

    public abstract class BaseController : Controller
    {
        protected override ViewResult View(string viewName, string masterName, object model)
        {
            if (string.IsNullOrEmpty(viewName)) 
                viewName = (string)RouteData.Values["action"];
    
            string localizedViewName = $"{viewName}.{CultureInfo.CurrentCulture.Name}";
            bool hasLocalizedView = ViewEngines.Engines
                .FindPartialView(ControllerContext, localizedViewName)
                .View != null;
    
            return base.View(hasLocalizedView ? localizedViewName : viewName, masterName, model);
        }
    }
    
  2. 如果我的视图具有相同的结构,那么我不会创建单独的文件,而只是使用包含本地化字符串的相同视图,如下所示:

    <div class="card">
        <div class="card-image">
            <img src="~/Images/CardHeaders/Business_CreditsSME.jpg" />
        </div>
        <div class="card-content">
            @GlobalResources.LocalizedText
        </div>            
    </div>
    

结构现在看起来像:

- Views
-- About
--- History.cshtml
--- History.kk.cshtml
--- History.en.cshtml
--- Vacancies.cshtml

其中Vacancies.cshtml 文件使用资源来本地化页面,而History* 文件则像没有资源的纯文本一样本地化。

【讨论】:

    【解决方案2】:

    很棒的问题!

    在这两个选项之间,第一个看起来更好一点。

    但我通常会做一件事。它创建了一个 HTML 助手来定位本地化视图。

    因此,您将能够像这样在视图上使用它:

    @Html.RenderLocale("YourView", ...);
    

    然后,在您的 RenderLocale 中,将文件路径更改为用户想要的视图。

    public static string RenderLocale(this HtmlHelper helper, string target, ...)
    {
         var filePath = this.getLocaleFilePath(target); //it returns yourView.cshtml or yourView.ru.cshtml
         return this.Action(filePath); // it renders or performs the action you want     
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2019-01-28
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多