Многоязычные сайты Asp.net - отдельные каталоги и маршрутизация URL - PullRequest
1 голос
/ 28 марта 2012

Люди, я занимаюсь разработкой веб-сайта asp.net с многоязычным контентом, и SEO является очень важным приоритетом.

Мне удалось заставить мой веб-сайт отображать различные URL-адреса с помощью маршрутизации URL-адресов asp.net для отображения site.com/ar и site.com/en в зависимости от выбранного языка, и это прекрасно работает на странице .apsx в корневом каталоге. , Однако это не работает на страницах в подкаталогах, например site.com/en/Account/Login.aspx, и я потратил несколько дней, пытаясь заставить мою маршрутизацию URL работать с моими подкаталогами, но я не смог заставить его работать с подкаталоги.

Итак, с точки зрения простоты, лучше иметь в моем корневом каталоге разные физические каталоги / ar и / en с разными страницами контента для каждого языка. Это также предпочтительно, так как макет страницы / ar полностью перевернут по горизонтали, потому что ar = арабский = язык справа налево.

Пожалуйста, поделитесь своим мнением о преимуществах и недостатках этого подхода.

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Подход, основанный на URL, должен корректно работать даже в подкаталогах.Поскольку вы упоминаете «подкаталоги», а не «контроллеры / действия», я предполагаю, что ваше приложение реализовано с помощью ASP.NET WebForms, а не MVC.

Если это так, вы перезаписываете свои запросы в своем * 1003.*:

   public void Application_BeginRequest( object sender, EventArgs e )
   {
        HttpApplication app = (HttpApplication)sender;
        HttpContext ctx = app.Context;

        string PathAndQuery = ctx.Request.Url.PathAndQuery;

        // parse the PathAndQuery and if it is of the form
        // en/Subdir1/Subdir2/resource.aspx
        // split it into [en] (virtual part) and [Subdir1/Subdir2/resource.aspx] (physical part)

        string VirtualPart  = GetVirtualPart( PathAndQuery );
        string PhysicalPart = GetPhysicalPart( PathAndQuery );

        ctx.RewritePath( PhysicalPart );
   }

При таком подходе ваша физическая структура в файловой системе и запросы в форме en\Subdir1\Subdir2\resource.aspx правильно перенаправляются на Subdir1\Subdir2\resource.aspx.

Хотя в примере показано руководствопереписывая, вы можете использовать любую существующую технологию переписывания, если она соответствует вашим потребностям.

Это только начало.Однако, если у вас есть какие-то конкретные проблемы в реализации переписывания URL, я предполагаю, что вам придется задавать другие конкретные вопросы, чтобы люди могли помочь вам с конкретными проблемами.Если вы просто скажете Я провел несколько дней, а он не работает , то вам не удастся помочь вам с вашим конкретным подходом.

0 голосов
/ 06 апреля 2012

Лично я бы избегал физических каталогов и пошел бы за маршрутизацию.В будущем будет намного проще добавлять языки, плюс если вы обнаружите, что вам нужна поддержка культур (en-US, en-CA, en-GB и т. Д.), Вы можете легко представить культуры по умолчанию ( т.е. если нет ресурса en-GB, по умолчанию используется en-US), а не создается вторая физическая копия ресурсов.Я работал на больших сайтах, которые имели дубликаты файлов в локализованных каталогах.При добавлении языков начинает быстро болеть.

Что касается проблемы с маршрутами и подкаталогами, вы можете попробовать ввести константу в маршрут, так как это упрощает сопоставление URL-адреса с шаблоном.Я использую 'X' здесь:

routes.Add("LocalisedRoute", new Route
    (
         "{lang}/X/{path}"
         , new IRouteHandler()
    ));

Теперь оба эти пути должны совпадать:

  • site.com / ru / X / Account / Login.aspx
  • site.com / ru / X / Default.aspx

Это может быть необязательно, если вы воспользуетесь подходом, описанным в ссылке @TonyStark, но в целом я нашел добавлениеконстанта, которая будет полезна при работе с маршрутами в прошлом.

РЕДАКТИРОВАТЬ: Обратите внимание, что Рекомендация Google заключается в использовании субдомена для каждого языка, например .en-US.site.com.

0 голосов
/ 05 апреля 2012

Я думал, что веб-формы, использующие маршруты, довольно просты, используя следующее:

routes.MapPageRoute("", "Category/{action}/{categoryName}", "~/categoriespage.aspx")

Также нашел эту статью, которая может быть полезна в зависимости от того, как вы используете информацию о культуре, или нет. http://www.codeproject.com/Articles/72478/Web-Site-Globalization-With-ASP-NET-Routing

...