Комплексные расширения / справочная реализация набора тестов

Майкрософт поощряет использование инструмента "LocBaml" для локализации приложений WPF (см. MSDN). К сожалению, этот инструмент еще не готов для рабочего использования и имеет некоторые серьезные недостатки, когда требуется подписывать свои сборки.

Я предпочитаю использовать для локализации моих приложений WPF "старые" файлы ResX. Они очень хорошо поддерживаются Visual Studio, и мне нравится резервная стратегия системы ресурсов, когда не обнаруживается ресурсный элемент.
  
Порядок использования файла ResX в приложении WPF

  1. Создайте файл ресурсов (ResX) в своем проекте или повторно воспользуйтесь файлом Properties/Resources.resx.
  2. В конструкторе ресурсов Visual Studio измените Access Modifier (модификатор доступа) с Internal (внутреннего) на Public (общий). Этот модификатор доступа можно найти в верхней панели элементов конструктора.
  3. Добавьте пространство имен в представление XAML:

    xmlns:p="clr-namespace:Jbe.TestSuite.Infrastructure.Shell.Properties"
       
  4. Доступ к ресурсам можно получить с помощью расширения разметки x:Static в XAML:

    <MenuItem Header="{x:Static p:Resources.FileMenu}">

Изображения

Если необходимо локализовать изображения, то это по определению более сложная задача. Файлы ResX поддерживают только собственное растровое представление изображений, в то время как WPF использует управляемую версию с именем BitmapSource. Следовательно, необходимо преобразовать объект "Bitmap" интерфейса графических устройств в объект "BitmapSource". В классе ResourceService библиотеки CompositeExtensions имеется метод CreateBitmapSource, который выполняет этот прием.

public static BitmapSource CreateBitmapSource(System.Drawing.Bitmap bitmap)
{
    return Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero,
        new Int32Rect(0, 0, bitmap.Width, bitmap.Height), BitmapSizeOptions.FromEmptyOptions());
}

Настройка языка приложения

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

Я использую конструктор параметров Settings, предлагаемый Visual Studio для реализации языковых конфигураций. В конструкторе Settings я просто задаю строковые свойства Culture и UICulture. Одна из первых строк при запуске приложения вызывает этот метод:

private void InitializeCultures()
{
    if (!string.IsNullOrEmpty(Settings.Default.Culture))
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo(Settings.Default.Culture);
    }
    if (!string.IsNullOrEmpty(Settings.Default.UICulture))
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(Settings.Default.UICulture);
    }
}

Приведенный выше фрагмент кода читает параметры языка в файле конфигурации и устанавливает их для всего приложения. Теперь при необходимости запуска приложения с другим языком можно изменить файл App.config.

Не путайте CurrentCulture и CurrentUICulture. Эти два свойства представляют значения, заданные для языка и региональных параметров, которые можно найти в панели управления Windows.

  • CurrentCulture представляет вкладку "Формат" окна "Язык и региональные параметры". Этот параметр отвечает за форматирование и синтаксический анализ значений.
  • CurrentCulture представляет вторую часть вкладки "Языки и клавиатуры", "Язык интерфейса". Это свойство определяет, ресурсы какого языка загружаются и отображаются пользователю.

Примечание. Это обсуждение касается только CurrentUICulture.