Подтвердить что ты не робот

Культура внезапно не поддерживается больше в веб-приложении Azure

Из нашего веб-приложения Azure выходят ошибки в отношении культуры, которая не поддерживается. Мы загружаем список стран для показа на первой странице, но это внезапно дает ошибки. Тот же код используется и для других различных веб-приложений, и у них нет проблемы.

Следующий код дает проблему.

 private List<SelectListItem> Countries()
        {
            RegionInfo country = new RegionInfo(new CultureInfo("nl-BE", false).LCID);
            List<SelectListItem> countryNames = new List<SelectListItem>();
        foreach (CultureInfo cul in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
        {
            country = new RegionInfo(new CultureInfo(cul.Name, false).LCID);
            countryNames.Add(new SelectListItem() { Text = country.DisplayName, Value = country.DisplayName });
        }

        return countryNames.GroupBy(x => x.Text).Select(x => x.FirstOrDefault()).ToList<SelectListItem>().OrderBy(x => x.Text).ToList();
    }

Я поставил try-catch в for-each, чтобы я мог определить культуры, которые дают ошибки. Следующие культуры внезапно возвращают ошибки:

<errors>
<LCID>4096</LCID>
<Name>ar-001</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>el-CY</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-BB</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-BS</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-HK</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-NL</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-SE</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>es-419</Name>
</errors>

Может кто-нибудь помочь мне с этой проблемой? Я не могу понять, почему это веб-приложение внезапно дает эти ошибки.

4b9b3361

Ответ 1

Почти всем новым локалям в Windows не назначаются явные идентификаторы LCID - потому что для тысяч языков в сотнях стран недостаточно "комнаты". Все они назначаются 0x1000.

В этом случае я думаю, что для меня может измениться идентификатор LCID:

country = new RegionInfo(new CultureInfo(cul.Name, false).LCID);

просто используйте название культуры:

country = new RegionInfo(cul.Name);

Конечно, любое другое использование LCID также должно было бы распознать название культуры.

Мы действительно рекомендуем, чтобы RegionInfo был создан с полным именем культуры, поскольку он более явный, чем просто имя региона. RegionInfo имеет некоторые свойства, которые "зависят" от языков, таких как DisplayName. es-US и en-US предоставляют, например, испанские или английские строки для "Соединенных Штатов".

Надеюсь, что это поможет,

-Shawn

Ответ 2

Я подтверждаю, что это новые культуры, которые только что добавлены в Azure App Service, и, очевидно, это было сделано так, что создание RegionInfo завершается с ошибкой. Самый простой способ:

var culture = new CultureInfo("en-HK", false).LCID;
var region = new RegionInfo(culture);

И это не удается:

Unhandled Exception: System.Globalization.CultureNotFoundException: Culture is not supported. Parameter name: culture 4096 (0x1000) is an invalid culture identifier. at System.Globalization.CultureData.GetCultureData(Int32 culture, Boolean bUseUserOverride) at System.Globalization.RegionInfo..ctor(Int32 culture)

Далее мы исследуем. Тем временем, исключение исключений и игнорирование культур, где это не удается, - это рекомендуемое решение.