0

локальной среды:
Win10 x64
VS 2015 Pro Обновления 3
IIS 10.0 ЭкспрессаГлобализация неправильно использует культуру по умолчанию во всех сценариях после развертывания

производственной среды:
Win сервер 2012 R2
IIS 8.5

Im разрабатывает приложение ASP.NET 4.6.1 MVC, которое должно поддерживаться на английском, датском и голландском языках. Я реализую нейтральные культуры, поскольку они интересуются только языком, а не спецификой. Я использую спутниковые сборки (как их называли некоторые) или, скорее, файлы Resource.resx для моих переводов. Первый подход я следовал this often referenced post, и он отлично работает локально. Как только я развожу его в производственную среду, переводы перестают работать. Я установил потоки в соответствии с значениями базы данных: Initialize method in HomeController И я подтвердил, что этот метод всегда корректно выполняется в рабочей среде. Я пробовал устанавливать потоки, как на ссылочном посту, а также хорошо работает локально, но не в производстве. И я даже попробовал установить его прямо, как верхняя часть моих просмотров с помощью бритвы безрезультатно.
Что меня поразило, так как это было странно, так это то, что он работал один раз в рабочей среде после того, как я немного поиграл, но я уверен, что я действительно ничего не делал, и вдруг это сработало. К сожалению, она перестала работать после того, как я развернул обновление для приложения, и с тех пор я не смог заставить его работать. С тех пор я пытался возиться со всеми настройками в среде .NET на IIS для этого веб-сайта и для корневого каталога: .NET globalization settings
Но даже с указанием да-DK или -да как культура здесь или непосредственно в Интернете .config моего приложения или hardcoding поток для использования da, поскольку культура не помогает вообще. Смешно, что число и формат даты корректно меняются. Таким образом, похоже, что проблема связана с тем, что поток не изменил свою культуру, а IIS отказался использовать другие файлы ресурсов. При развертывании структура папок содержит папку da в bin и содержит файл с именем Resources.resources.resx, который, я считаю, верен. Я пытался иметь файлы ресурсов, находящиеся в библиотеке классов, как предлагает статья, но также и в папке в том же проекте из-за разочарования. Файлы ресурсов имеют общедоступную доступность и скомпилированы как встроенные ресурсы без копирования файлов.

Итак, мой вопрос: почему IIS отказывается использовать любой другой файл ресурсов, чем по умолчанию? И как это возможно, что он работал один раз? На данный момент я рассматриваю только перевод переводов в базу данных, потому что, по крайней мере, это работает. Какие у вас есть предложения? Я полагаю, что среда .NET в IIS имеет все необходимые языки, поскольку они видны в настройках глобальной платформы .NET, но я могу ошибаться?

Обновление: я попробовал, как было предложено NightOwl, снова он работает локально (отладка VS) и даже если я размещаю развернутые файлы в iisexpress на своей машине. Но он все еще терпит неудачу в производственной среде. Предлагаемый метод аналогичен this, но все же безуспешно. Я начинаю думать, что решение состоит в том, чтобы перейти на iis 10 в производственной среде.

+0

Пожалуйста, разместите код вместо скриншота – abatishchev

ответ

0

Проблема была вызвана пакетом Nuget SimpleImpersonation, который, как представляется, изменил культуру текущего потока за кулисами. Кажется, он изменил его обратно до значения по умолчанию после его удаления, но поскольку я устанавливал культуру, пока ссылка была действительной, она всегда возвращалась обратно в en-US. По-прежнему странно, что он работал локально в IIS Express 10.0. Но по крайней мере сейчас это работает для обеих сред ...

0

Эта статья, кажется, есть некоторые заранее MVC идеи в виду:

  • Файлы ресурсов не поддерживаются полностью в MVC (по крайней мере, без хаков) - см Resource Files and ASP.NET MVC Projects. Однако вы можете использовать embedded resources или использовать ResourceManager, чтобы загрузить внешние ресурсы.
  • Настройка языка пользователя в соответствии с настройками браузера обычно является неправильным выбором. Вместо этого вы должны использовать URL-адрес для передачи информации о культуре, чтобы поисковые системы могли сканировать и индексировать их. Локализация содержание не персонализация. Опираясь на заголовки, чтобы отобразить правильный язык, вы можете разочаровать пользователей, которые сидят за брандмауэрами, которые меняют эти заголовки. Использование URL для выбора языка дает прямой контроль над языком для пользователя.

См. Мой ответ на вопрос ASP.NET MVC 5 culture in route and url за простой способ MVC для локализации.

В принципе, ответ на ваш вопрос находится в this link - по умолчанию ресурсы в App_GlobalResources являются внутренними и не могут использоваться без изменения настроек. Они требуют особого внимания во время развертывания или не будут развернуты с вашим приложением. App_LocalResources вообще не поддерживаются в MVC (они предназначены для устаревших страниц ASP.NET). Короче: избегайте App_GlobalResources и App_LocalResources (у которого есть свой набор проблем) в MVC.

Не по теме: Похоже, вы также с использованием базового контроллера (из-за метода Initialize). Это тесно связывает ваше приложение вместе. Лучше всего использовать глобальные фильтры, каждый из которых может содержать единую функциональность. См. this answer.

+0

Спасибо за быстрый ответ, я думаю, вы пропустили несколько очков. Статья посвящена MVC и упоминается во многих других сообщениях SO. Сначала я использовал отдельную библиотеку классов для файлов .resx, но попробовал из desparation разместить их в одном проекте. App_LocalResources был просто источником вдохновения где-то, на самом деле он не связан с материалами, отличными от MVC. Я уточню свой вопрос, чтобы лучше отразить это. Cookies vs urls не имеют отношения к этому случаю, это ничего не изменит. Я получаю названия своей культуры из базы данных. Я не думаю, что фильтры что-то изменят? – LuqJensen

+0

'Статья посвящена MVC и упоминается во многих других сообщениях SO.' - Я понимаю, что, к сожалению, автор использует много пред-MVC-идей в статье и сбил вас с пути. Фильтры что-то изменят - это заставляет вас сделать это MVC, вместо того, чтобы копировать старые (плохие) привычки из ASP.NET и тесно сочетать ваш код вместе. – NightOwl888

+0

Я попробовал метод, предложенный в вашей ссылке, который совпадает с этим https://ruijarimba.wordpress.com/2011/05/16/asp-net-mvc-localization-generate-resource-files-and-localized-views -using-custom-templates/я верю. Снова он отлично работает при отладке, и я даже попытался разместить развернутые файлы в iisexpress 10 (на моей машине), и это работает безупречно. Однако сервер все еще игнорирует его. Я начинаю думать, что мои проблемы будут решены путем перехода на iis 10. – LuqJensen