Правильная локализация приложения 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...
Ответы
Ответ 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 перед компиляцией.
РЕСУРСЫ: (не исчерпывающий список, любым способом)