2016-05-06 6 views
0

У меня есть многоязычный веб-сайт, а просмотр контента (включая разметку) может отличаться от языка к языку. Вот почему я не могу просто локализовать строки и поместить их в ресурсы.Как локализовать структуры HTML-представлений в ASP.NET?

Например, мой взгляд на русском:

<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 метод вообще и предпочитают не использовать его в любом месте

Как вы локализуете большие виды разных структур?

+0

только способ, я могу думать о том, чтобы иметь грязный код в контроллере, чтобы иметь корпус коммутатора и вернуть требуемый вид. –

ответ

0

Удивительный вопрос!

Между этими двумя вариантами первый выглядит немного лучше.

Но одно, что я обычно делаю. Он создал помощник 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  
} 
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* файлы локализуются как обычный текст без ресурсов.