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

Разница между CultureInfo.CreateSpecificCulture() и конструктором класса?

Класс CultureInfo предоставляет два способа создания:

Документация MSDN немного отличается для двух, упомянув о некоторой "культуре Windows" для конструктора. Но действительно ли это имеет значение?

Должен ли я выбрать один из двух над другим?

Примечание. Я использую версию .NET 3.5, если это имеет значение, и я хочу использовать его следующим образом:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

as описанный в этом ответе.

4b9b3361

Ответ 1

Метод factory имеет откат, когда ему не удается создать информацию о культуре.

Итак, если вы используете определенную культуру, такую ​​как "en-XX", экземпляр инфокультуры не может быть создан, исключение будет выбрано, и повторение с нейтральной культурой "en" будет успешным.

Ниже source метода factory

public static CultureInfo CreateSpecificCulture(string name)
{
    CultureInfo info;
    try
    {
        info = new CultureInfo(name);
    }
    catch (ArgumentException)
    {
        info = null;
        for (int i = 0; i < name.Length; i++)
        {
            if ('-' == name[i])
            {
                try
                {
                    info = new CultureInfo(name.Substring(0, i));
                    break;
                }
                catch (ArgumentException)
                {
                    throw;
                }
            }
        }
        if (info == null)
        {
            throw;
        }
    }
    if (!info.IsNeutralCulture)
    {
        return info;
    }
    return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}

Итак, я предпочитаю метод factory.

Ответ 2

На этот поток ответили alredy, но я нашел уникальное решение для API CreateSpecificCulture, которое может быть не так очевидно. Поэтому я рассматривал эту тему как подходящее место для моих результатов. Я потратил несколько дней на это, поэтому просто подумал о том, чтобы поделиться своим опытом, если он может сэкономить несколько часов или дней для других.

При использовании API, когда вы передаете ему только название культуры, например pt (для португальского) или de (для немца), этот API возвращает определенную культуру, соответствующую языку, который называется языковой стандарт по умолчанию для этой культуры, Теперь этот язык может быть не столь очевидным, как кажется, где я застрял. Для немецкого языка de-DE выглядит очевидно, что немецкий говорит в Германии. Для итальянского, it-IT выглядит очевидно, что итальянский язык говорит в Италии.

Аналогично pt-PT выглядит очевидным для португальцев, говорящих в Португалии. К сожалению, это не случай. Исходя из того, что неясно, какой именно причиной (может быть население, страна происхождения, национальный язык и т.д.), Существует глобальная стандартизация, основанная на том, что локаль по умолчанию для данной культуры определяется при попытке создать определенную культуру из идентификатора культуры ( pt в этом случае). Microsoft зарегистрировала весь список по следующей ссылке:

http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

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

Для португальского языка название аббревиатуры инвариантной культуры "Португальский" совпадает с "Португальский (Бразилия)", который является PTB. Португальский (Португалия) имеет другой код PTG. Поэтому в этом случае португальский (Бразилия) является языковым стандартом по умолчанию для португальского языка.

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

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

Ответ 3

Существует еще одна заметная разница между factory -методом и конструктором: конструктор предлагает дополнительное необязательное логическое значение, которое по умолчанию установлено равным true.

Для этого вам нужно, чтобы этот Boolean был установлен в false, если вам действительно нужен "простой" < cultureinfo, потому что: Если вы запрашиваете определенную культуру (например, "de-DE" ) без "Boolean set to false", вы всегда получите настройку культуры, которая может иметь неожиданные настройки в зависимости от того, как пользователь изменил эту культуру с помощью Control- Панель.

factory -метод не поддерживает этот Boolean!!!

Только две последние мысли о том, когда вы хотите, чтобы это boolean было

  • true: вы создаете для себя UI - этот вывод должен соответствовать определенным настройкам культуры, которые пользователь выбрал с помощью панели управления
  • false: вы хотите анализировать данные (например, из XML), и вы знаете конкретные настройки XML-культуры (например, десятичный разделитель как запятая). В этом случае вам понадобится "plain de-DE" -Culture, чтобы убедиться, что специальная настройка панели управления не будет мешать.