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

Правильная локализация приложения WinForms

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

В принципе, я хочу:

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Марк

Ответ 3

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

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

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

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

Ответ 4

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

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

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 

Ответ 5

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

  • нет файлов спутниковых ресурсов
  • только один размер и расположение управления для каждой формы.
  • множество языков, встроенных в исполняемый файл.

Не работает в vanilla Visual Studio IDE.

Для чего потребуется какая-то пользовательская работа, в основном выполняющая все эти шаги:

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

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