как префикс строки культуры, такой как en-gb, перед позицией {controller} в URL-адресе в asp.net mvc?

поэтому в основном я хочу создать многоязычный веб-сайт со следующими сценариями:

  • Использование ASP.NET MVC 3
  • большинство языков используют файлы ресурсов, поэтому они используют одни и те же представления, однако есть также много представлений, которые зависят от страны (т.е. зависит от языковой культуры) и доступны не для всех.
  • пример URL: http: // localhost / en-us / {area} / {controller} / {action} / {id}

Структура папок MVC, как здесь:

- Areas
    - Channel1
        - Controllers
        - Content
        - Views
            - en-us
                - View1.cshtml
                - View2.cshtml
            - zh-cn
                - View1.cshtml
                - View2.cshtml
                <b>- Special.cshtml</b>

    - Channel2
       ....(similar folder structure)
- ....

Я думаю, что должен быть способ определить "en-us" в параметре вроде {lang} и принять решение в контроллере по умолчанию за пределами областей - однако я новичок в asp.net MVC, как я могу это сделать?


person Lida Weng    schedule 02.05.2012    source источник


Ответы (3)


Вы всегда можете написать свой собственный движок просмотра, чтобы просматривать папки в зависимости от того, что входит. Есть код для ThemedViewengine, который делает именно это.

person George Stocker    schedule 02.05.2012
comment
спасибо, я внес некоторые изменения на основе этого кода, и теперь он отлично работает! - person Lida Weng; 03.05.2012

Вот фантастическая статья с практическими предложениями о том, как реализовать глобализацию в ASP.NET MVC 3.

http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

person coffeeyesplease    schedule 02.05.2012
comment
Мне нужно выяснить бит URL-адреса - определение культуры через URL-адрес и соответствующее отображение представления - person Lida Weng; 02.05.2012

Нет отличного способа сделать это, но это возможно. Во-первых, вам нужно немного изменить ваши представления - у них все равно должен быть контроллер. Допустим, файлы, которые у вас есть (View1.cshtml и View2.cshtml), находятся в вашем домашнем контроллере. Поместите их сюда:

- Views
  - Home
    - en-us
      - View1.cshtml
      - View2.cshtml
    - zh-cn
      - View1.cshtml
      - View2.cshtml

Затем создайте собственный маршрут для представлений в Global.asax.cs:

routes.MapRoute(
    "MultiLingual",
    "{lang}/{controller}/{action}/{id}",
    new {  controller = "Home", action = "Index", lang="en-us", id = UrlParameter.Optional }
);

Наконец, в вашем домашнем контроллере (или любом другом контроллере, в который вы хотите поместить представления) используйте параметр lang, чтобы определить, какое представление использовать:

public ActionResult View1( string lang, int? id ) {
    return View( lang + "/View1" );
}

public ActionResult View2( string lang, int? id ) {
    return View( lang + "/View2" );
}

Я пробовал это, и он работает, но кажется ужасно неуклюжим и не очень СУХИМ (по крайней мере, в действиях). У кого-нибудь есть лучший подход?

person Ethan Brown    schedule 02.05.2012
comment
вы правы - это означает, что вам нужно обрабатывать переменную lang для каждого отдельного представления и контроллера - что, очевидно, не является идеальным решением ... Я пытаюсь найти способ сделать это ... - person Lida Weng; 02.05.2012