TOC

This article is currently in the process of being translated into Russian (~99% done).

Культурные & региональные особенности:

Культурные особенности программы & UICulture

Как мы обсуждали в предыдущей статье, работа с культурой очень важна, особенно при работе с датами и числами. По этой причине ваше приложение всегда будет иметь экземпляр класса CultureInfo, определенный как "CurrentCulture" - резервный экземпляр для всех ситуаций, когда вы не указываете, какой язык и региональные параметры следует использовать, например, для вывода числа. Если не изменить это свойство, которое существует в классе CultureInfo, оно будет таким же, как язык и региональные параметры, используемые операционной системой. Вот простой способ проверить это:

Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);

В этой статье мы будем использовать класс CultureInfo постоянно, поэтому не забудьте включить его в оператор using, как показано в верхней части примера.

В примере будет выведен язык и региональные параметры, используемые приложением, например "en-US" для компьютера с английским языком в США. Если вы живете в Германии и ваш компьютер использует немецкий язык, результатом будет "de-DE". Другими словами, две первые буквы указывают язык, в то время как последние две буквы указывают страну или регион.

Однако вполне может оказаться, что требуется больше контроля над тем, какой язык и региональные параметры используются приложением. Например, если ваше приложение использует английский язык повсюду, имеет ли смысл выводить числа в немецком или шведском формате только потому, что компьютер вашего пользователя указывает его? Возможно, это так, но если нет, вы можете очень легко указать новый язык и региональные параметры по умолчанию/резервный, используя свойство CurrentCulture снова:

CultureInfo.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Current culture: " + CultureInfo.CurrentCulture.Name);

float largeNumber = 12345.67f;
Console.WriteLine("Number format (Current culture): " + largeNumber.ToString());

CultureInfo germanCulture = new CultureInfo("de-DE");
Console.WriteLine("Number format (German): " + largeNumber.ToString(germanCulture));

Мы в основном входим и отменяем свойство CurrentCulture, устанавливая его в культуру en-US. Затем мы выводим его вместе с большим числом с плавающей запятой. Вы увидите, что результат представляет собой число, отформатированное так, как оно на английском языке. В последних двух строках мы проиллюстрируем, как можно, конечно, отменить резервный язык и региональные параметры, передав другой экземпляр CultureInfo методу ToString () - в этом случае число также будет выведено в немецком формате. Результирующий вывод этого примера должен выглядеть примерно так:

Current culture: en-US
Number format (Current culture): 12345.67
Number format (German): 12345,67

CurrentCulture vs. CurrentUICulture

Можно заметить, что CultureInfo также имеет свойство, называющееся CurrentUICulture. Это свойство актуально только при использовании файлов ресурсов для локализации пользовательского интерфейса-в этом случае приложение будет знать, какие версии файлов ресурсов должны быть загружены, на основе свойства CurrentUICulture. Для всех остальных целей, включая форматирование чисел, дат и т.д., следует использовать свойство CurrentCulture.

CurrentCulture и потоки

Мы еще не говорили о потоках, но в основном это концепция, которая позволит вашему приложению работать над несколькими вещами одновременно. При запуске приложения .NET создается один поток, и только этот поток будет использоваться, если вы специально не создадите новый поток, используя одну из многих многопоточных стратегий платформы. Я упоминаю об этом здесь, потому что это также очень актуально, когда дело доходит до резервной культуры вашего приложения. Фактически, CultureInfo.CurrentCulture в основном является ярлыком для потока .CurrentThread.CurrentCulture свойством, которое означает, что всякий раз, когда вы определяете CurrentCulture, это только допустимо для текущего потока.

Перед .NET framework версии 4.5 необходимо вручную указать язык и региональные параметры каждого созданного потока. Тем не менее, в .NET-4.5 было введено свойство CultureInfo.DefaultThreadCurrentCulture . Когда вы установите его, каждый новый поток создается будут использовать эту культуру, и это так же легко использовать как свойство currentculture:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

А насчет существующей теме? Ну на самом деле, если вы еще не определили другой культуры для свойстваCurrentCulture, установив DefaultThreadCurrentCulture свойство также будут применено к свойству CurrentCulture. Другими словами, имеет смысл использовать DefaultThreadCurrentCulture вместо CurrentCulture, если вы планируете использовать несколько потоков в своем приложении - это позаботится обо всех сценариях.

Резюме

С помощью свойств CultureInfo.CurrentCulture и/или CultureInfo.DefaultThreadCurrentCulture, вы можете определить резервный язык и региональные параметры для вашего приложения - он всегда будет использоваться всякий раз, когда вводятся число или дата, если вы специально не отмените их в каждой ситуации.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!