Локализация в WPF - PullRequest
       1

Локализация в WPF

2 голосов
/ 29 декабря 2010

Я читаю одну книгу в WPF, которая предоставляет метод для создания приложения для целей локализации. Что он предложил, и то же самое я сделал:

1) отредактируйте файл проекта .csproj и добавьте элемент en-US для создания локализованной сборки, содержащей локализованный встроенный baml en-US. Когда я компилировал проект, он создал подпапку en-US, содержащую en - США локализовали встроенный baml. Я взял его резервную копию.

2) Я сделал то же самое для fr-FR и создал для него резервную копию.

3) Затем я поместил обе созданные подпапки в папку приложения с именами en-US и fr-FR.

Книга предполагает, что если я изменю настройку культуры на fr-FR (через региональные настройки панели управления), будет использоваться локализованная сборка fr-FR.
Но я обнаружил, что независимо от культуры, она использует ан-американскую. Я знаю это, потому что я изменил культуру на fr-FR и удалил папку fr-FR, но все же приложение. работает, и когда один из США удаляется, он генерирует исключение.

Может кто-нибудь уточнить, где я делаю / неправильно понимаю?

Вот слова книги:
Подготовка заявки на локализацию
Следующим шагом является включение поддержки локализации для вашего проекта. Это займет всего один изменить - вам нужно добавить следующий элемент в файл .csproj для вашего проекта в любом месте в первом элементе:
EN-US
Это говорит компилятору, что культура по умолчанию для вашего приложения - английский (США). Вы можете выбрать что-нибудь еще, если это уместно). Как только вы сделаете это изменение, процесс сборки изменится. В следующий раз, когда вы скомпилируете свое приложение, вы получите подпапку с именем en-US. Внутри этой папки находится спутниковая сборка с тем же именем, что и ваше приложение, и расширением .resources.dll (например, LocalizableApplication.resources.dll).
Эта сборка содержит все скомпилированные ресурсы BAML для вашего приложения, которые ранее были сохранены в вашей основной сборке приложения.
Теперь при запуске этого приложения общеязыковая среда выполнения (CLR) автоматически ищет спутниковые сборки в нужном каталоге на основе региональных настроек компьютера и загружает правильный локализованный ресурс. Например, если вы работаете в культуре fr-FR, CLR будет искать подкаталог fr-FR и использовать находящиеся там сателлитные сборки.
Это означает, что если вы хотите добавить поддержку большего количества культур в локализованное приложение, вам просто нужно добавить дополнительные подпапки и вспомогательные сборки, не нарушая исходный исполняемый файл приложения.
Когда CLR начинает поиск спутниковой сборки, она следует нескольким простым правилам: старшинство:
1. Во-первых, он проверяет наиболее конкретный каталог, который доступен. Это означает, что он ищет спутниковую сборку, ориентированную на текущий язык и регион (например, fr-FR).
2. Если он не может найти этот каталог, он ищет спутниковую сборку, ориентированную на текущий язык (например, fr).
3. Если он не может найти этот каталог, возникает исключение IOException.

1 Ответ

3 голосов
/ 29 декабря 2010

Диспетчер ресурсов в .NET использует флаг CurrentUICulture, чтобы решить, какую локализованную сборку загрузить, а не флаг CurrentCulture.CurrentUICulture представляет родной язык версии Windows, которую вы используете, тогда как CurrentCulture представляет ваш текущий региональный параметр, установленный через панель управления.

Еще один способ подумать об этом - это то, что ваше приложение имеет две независимые вещи.можете спросить о вашем пользователе:

1) На каком языке он говорит?(CurrentUICulture)

2) Где он находится?(CurrentCulture)

Ответ на # 1 должен определять язык, который вы используете для отображения элементов пользовательского интерфейса, то есть какой локализованный файл ресурсов загружать.

Ответ на # 2 должен определять способ отображения таких вещей, как числовые строки и значения валют.Это автоматически обрабатывается путем преобразования чисел / валют в строковые значения в их методах ToString.

Чтобы дважды проверить значение этих двух свойств, вы можете сделать что-то вроде этого:

        Console.WriteLine("CurrentCulture={0}, CurrentUICulture={1}", CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture);

Чтобы изменить CurrentCulture, вы просто меняете свое местоположение в Панели управления |Регион и язык |Форматы.

Для изменения CurrentUICulture вы можете выполнить одно из следующих действий:

  • Проверка на неанглийской версии Windows.(Например, в виртуальной машине)
  • Использование пакета многоязыкового интерфейса пользователя в Windows 7
  • Добавление переопределения в коде для целей тестирования, как правило, на основе параметра файла .config,где вы явно устанавливаете значение CultureInfo.CurrentUICulture.

Пример переопределения UICulture, основанного на настройке UICulture в app.config, показан ниже.Вы устанавливаете UICultureOverride на типичные строки культуры, например, fr-FR, de-DE и т. Д.

        // using System.Threading;
        // using System.Globalization;
        // using System.Configuration;
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(ConfigurationManager.AppSettings.Get("UICultureOverride"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...