2016-04-09 4 views
3

Я настроил приложение, чтобы содержимое считывалось из разных файлов RESX в соответствии с шаблоном, который распознает маршрутизатор. Каждая страница доступна на определенном языке в зависимости от первой части URL-адреса.Как обрабатывать несколько языков в приложении MVC?

routes.MapRoute(
    name: "Localization", 
    url: "{lang}/{controller}/{action}/{id}", ... 
); 

Когда я проверяю, не спецификации, я получаю в английской версии моих Lingo.REXS и когда я ставлю в таковой, я получаю в шведской версии, т.е. Lingo.se.RESX. Все в порядке.

Однако я не уверен, как разрешить пользователю управлять настройкой языка. Я не хочу, чтобы он был автоматическим и не предполагался на основе настроек браузера, геоданных и т. Д. Я в основном хочу, чтобы три флажка (элементы управления img) каким-то магическим способом установили, что пользователь (или, по крайней мере, этот сеанс браузера) должен быть маршрутизируемым с префиксом, соответствующим языку щелкнутого флага.

Итак, у нас есть/se/Home/About and/ge/Home/About. Пользователь нажимает на флаг Германии - как мы направляем их к последнему? И если они нажмут на шведский флаг - как мы будем направлять их на первый?

Я проверил с this blog, но он не затрагивает фактическую проблему с тем, как маршрутизировать на определенный язык в зависимости от щелкнутого изображения флага. Я также нашел this blog, но я просто не понимаю, как они это делают. Я вижу кучу звонков в БД, поэтому я подозреваю, что это не основано на файлах RESX (и я понимаю, что это правильный путь), хотя есть также ссылка на @TestResource.

Прямо сейчас я смущен и неопределен. Любые предложения или разъяснения?

ответ

3

Существует несколько неинтуитивная функция MVC, которая делает это очень простым. MVC automatically reuses any route values с просьбой. Таким образом, все ваши URL-адреса автоматически «наследуют» культуру - нет необходимости указывать ее явно в ActionLink.

Единственное исключение - во время выбора языка. Но вы можете воспользоваться этим же способом маршрутизации, чтобы создать общий верхний или нижний колонтитул в своем _Layout.cshtml. Независимо от того, какие значения маршрута для текущей страницы будут унаследованы, все, что вам нужно сделать, это указать контроллер, действие и культуру.

@{ 
    var routeValues = this.ViewContext.RouteData.Values; 
    var controller = routeValues["controller"] as string; 
    var action = routeValues["action"] as string; 
} 
<ul> 
    <li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li> 
    <li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li> 
</ul> 

Как уже упоминалось ранее, все остальные ссылки на странице будут автоматически передаваться культуру от текущего контекста, поэтому они будут автоматически оставаться в пределах одной и той же культуры. В этих случаях нет никаких оснований передавать культуру.

@ActionLink("About", "About", "Home") 

С приведенной выше ссылке, если текущий URL-адрес является /Home/Contact, связь, которая генерируется будет /Home/About. Если текущий URL-адрес равен /en/Home/Contact, ссылка будет сгенерирована как /en/Home/About.

Ссылка: ASP.NET MVC 5 culture in route and url

+0

Хм ... Я признаю прозорливость ваших ответов, так что (теперь, что сосание вверх поставляется) Интересно, если вы имеете в виду, что я сделал слишком много, реализовав специальный атрибут маршрута и локализации. Вы говорите, что мне нужно только установить связь с культурой для трех языков где-то в * _Layout.cshtml *, и как только пользователь щелкнет там (следовательно, выбрав культуру), он будет жить? Это не может быть так просто ... Не так ли? –

+0

Да, это правильно. Это так просто.Но это зависит от того, существует ли маршрут для соответствия стоимости маршрута (который вы указали в своем вопросе). См. Мой ответ на вопрос, как обращаться с языком по умолчанию. – NightOwl888

+0

Это ужасно. Это похоже на ошибку (в этом случае это очень полезно), но глупая повторная маршрутизация обрабатывает только суффикс ** после ** второй косой черты. Замечательно! Благодарю. –

Смежные вопросы