Правильная локализация приложения WinForms - PullRequest
34 голосов
/ 09 августа 2009

У меня есть приложение WinForms, которое я хочу перевести на несколько языков. Однако у меня нет опыта локализации приложения WinForms, и я нахожу очень противоречивую информацию по этому вопросу.

По сути, я хочу:

  • В исходном коде я хочу только один файл на язык
  • этот файл компилируется в основное приложение при компиляции - после сборки приложения нет спутниковых сборок или внешних файлов данных
  • Пользователь может выбрать язык, мне не нужно / нужно автоопределение на основе операционной системы
  • Это должно содержать в основном строки и целые, а также CultureInfo

Большинство решений, которые я видел, имеют один файл .resx на форму и / или внешние сателлитные сборки.

Должен ли я кататься самостоятельно? Или что-то уже есть в рамках?

.net Framework 3.5 SP1, если это имеет значение.

Редактировать: По большей части Visual Studio уже предлагает поддержку того, что я хочу, но есть две проблемы. Когда я устанавливаю для Form.Localizable значение true, у меня появляется эта замечательная дизайнерская поддержка, но она генерирует один resx на форму. Идея ручного переопределения в InitializeComponent не работает, потому что это код, написанный дизайнером, который будет регулярно перезаписываться. Теоретически, я только хочу а) переопределить создание ComponentResourceManager, чтобы он указывал на мой глобальный resx, и б) изменить вызов ApplyResources на перегрузку, которая принимает CultureInfo в качестве третьего параметра.

Кажется, мне нужно добавить вызов функции в мой конструктор, который вызывает вызывается после InitializeComponent () и переопределяет его поведение. Это кажется ужасно неэффективным, но Visual Studio прав, когда предупреждает о касании InitializeComponent. В настоящий момент я действительно работаю над своей собственной средой локализации WinForms ...

Ответы [ 5 ]

17 голосов
/ 24 января 2013

Я только что завершил проект C # .Net 3.5 с похожей проблемой. Мы писали плагин WinForms для существующего многоязычного приложения на 8 языках (включая английский).

Вот как мы это сделали:

  1. Создайте все наши формы и пользовательский интерфейс на английском языке по умолчанию.

  2. Поместите все наши внутренние строки в файл ресурсов (вещи, не связанные напрямую с формой, такие как пользовательские сообщения об ошибках и заголовки диалоговых окон и т. Д.)

Как только мы завершили большую часть работы и тестирования, мы локализовали ее.

  1. У каждой формы уже был файл .resx, но он был пустым. Мы установили для свойства Localizable значение true, файл .resx был заполнен такими вещами, как размеры кнопок и строки.

  2. Для каждого из остальных языков мы изменили свойство «Язык» в форме. Мы выбрали базовую версию каждого языка, например: «Испанский» вместо «Испанский (Чили)» и т. Д., Чтобы он работал для каждого «испанского» диалекта, я думаю.

  3. Затем мы просмотрели каждый элемент управления, перевели его текст и при необходимости изменили его размер. Это создало .resx для каждого языка и комбинации форм.

Затем для 8 языков у нас осталось 8 .resx для каждой формы и 8 .resx для общих строк. При компиляции выходная папка содержала создаваемый нами файл .dll, а затем подпапку для каждого языка с файлом .resources.dll.

Мы смогли протестировать версии пользовательского интерфейса в конструкторе, просто изменив свойство языка, чтобы убедиться в правильности строк и макета.

В общем, как только мы об этом позаботились, это было довольно легко и безболезненно.

Нам не нужно было писать какие-либо настройки для загрузки формы

4 голосов
/ 09 августа 2009

Я задавал похожий вопрос о ASP.NET и получил первый ответ - этот инструмент и его рабочий процесс также могут быть чем-то для вас - посмотрите: Lingobit Localizer

Кажется, что он может загрузить ваше приложение Winforms и позволяет вам начать переводить ваши ярлыки и т. Д. И просматривать формы, пока вы это делаете. Множество других функций, таких как добавочный перевод и память переводов (если вы используете одни и те же термины снова и снова).

Выглядит довольно многообещающе (для Winforms) - хотя сам не использовал его.

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

Марк

3 голосов
/ 09 августа 2009

Это огромный предмет, и есть много способов выполнить то, что вы хотите. Фреймворк обеспечивает основу, но для полного решения требуется, чтобы вы внедрили определенные элементы самостоятельно.

Например, реализация платформы по умолчанию заключается в создании файла .resx для каждого ресурса. В ASP.Net это означает каждый элемент управления пользователя / сервера или страницу. Это не поддается простому обслуживанию, и если вы хотите переместить ресурсы в базу данных, вам нужно внедрить собственного провайдера.

Мое знакомство с Winforms ограничено, но если вы используете Silverlight или WPF, прочитайте работу Гая Смита-Ферье по этому вопросу по адресу: http://www.guysmithferrier.com/category/Internationalization.aspx. У него также есть некоторые наборы инструментов, которые могут упростить вашу жизнь в : http://www.dotneti18n.com/Downloads.aspx.

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

2 голосов
/ 09 августа 2009

У меня нет решения для вашего первого и второго требования, но имейте в виду, что локализация формы не так проста, как перевод каждого слова. Вы должны убедиться, что каждый переведенный текст соответствует своему контролю. Кроме того, возможно, у вас есть значок или изображение, которое нужно изменить в другой культуре.

Для вашего третьего пункта вы можете изменить язык вручную с помощью следующих строк:

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 
1 голос
/ 13 мая 2015

Что вы просите:

  1. нет файлов спутниковых ресурсов
  2. только один размер и контрольное размещение для формы.
  3. много языков, встроенных в исполняемый файл.

Невозможно выполнить в IDE vanilla Visual Studio.

То, что для этого потребовалось бы, это специальная работа, в основном выполняющая все эти шаги:

  • Приобретите специальный менеджер ресурсов, который обрабатывает файлы ресурсов TMX.
  • Поместите все ваши локализуемые строки в файл TMX.
    • Сделайте этот файл TMX встроенным ресурсом в вашем проекте.
  • В конструкторе форм создайте TMX ResourceManager, загружая файл TMX из встроенных ресурсов.
  • В вашем коде используйте ваш tmx ResourceManager вместо ResourceManager по умолчанию для получения локализованных строк.
    • Пусть форма использует ResourceManager по умолчанию для получения всех дизайнерских вещей, кроме строк.
  • Получите ваш файл TMX с новыми языковыми переводами.
    • Еще можно добавить в следующую версию вашего проекта, просто добавив их в этот файл TMX перед компиляцией.

РЕСУРСЫ: (ни в коем случае не исчерпывающий список)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...