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

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

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

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

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

  • Должен ли я катить свой собственный?
  • Или что-то в фреймворке уже есть?

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

Изменить:

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

Теоретически я хочу только:

  • а) переопределить создание ComponentResourceManager, чтобы указать его на мой глобальный resx и
  • б) изменить вызов ApplyResources на перегрузку, которая принимает CultureInfo в качестве третьего параметра.

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

На данный момент я действительно катаю свой собственный WinForms localization Framework...


person Michael Stum    schedule 09.08.2009    source источник
comment
Не уверен, что вы просите «правильный» или «очень нестандартный» способ локализации.   -  person Henk Holterman    schedule 09.08.2009
comment
Что не так с одним .resx на форму, одной вспомогательной сборкой на язык и подходом к сборке? Именно так и работает .NET — если вам это не нравится, боюсь, вам придется накатывать много кода самостоятельно.   -  person marc_s    schedule 09.08.2009
comment
Неправильно означает, что один .resx на форму (+ как минимум один для всего материала, который не является частью формы) растет экспоненциально, а не линейно, а одна сборка на язык — это просто дополнительный беспорядок, если новые/исправленные локализации разрешены только с новые выпуски приложения. См. также redsolo.blogspot.com/2006/11/ ошибка локализации в c.html   -  person Michael Stum    schedule 09.08.2009
comment
Что ж, это стандартный способ работы .NET, и поэтому у вас есть поддержка этих вещей в фреймворке. Если вы хотите что-то совершенно другое, вы сами по себе, и вам придется создать много вспомогательного программного обеспечения только для того, чтобы получить то, что уже предлагала среда .NET. Я думаю, что это довольно сложная задача, и я бы серьезно подумал, хотите ли вы потратить все это время и усилия на то, чтобы сделать это каким-то другим способом....   -  person marc_s    schedule 09.08.2009
comment
@MichaelStum - технически он растет geometrically не экспоненциально. :) количество языков - это множитель, а не показатель степени. :) :) ПРИЧИНА наличия одного resx на язык для каждой формы заключается в том, что для определенного языка может потребоваться изменить размер формы, возможно, придется изменить размещение элементов управления, значки, возможно, придется изменить, в основном НИЧЕГО в форме может измениться для каждого языка. Таким образом, файл RESX должен размножаться в любом случае. Строки находятся в том же файле для этой формы, что и все остальное, относящееся к этой форме.   -  person Jesse Chisholm    schedule 13.05.2015


Ответы (6)


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

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

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

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

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

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

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

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

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

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

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

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

person Charlie A    schedule 24.01.2013
comment
Извините, но я не могу рекомендовать эту технику. Когда поля нужно добавлять, удалять или перемещать по форме, становится кошмаром обслуживания. - person RenniePet; 20.05.2014
comment
К сожалению, по большей части это ЯВЛЯЕТСЯ тем, что MSDN рекомендует для локализации WinForms. :( msdn.microsoft.com/en-us/library /y99d1cd3(VS.80).aspx - person Jesse Chisholm; 13.05.2015
comment
Это рекомендованный Microsoft способ сделать это, и это ужасно. - person Derek Tomes; 18.04.2016
comment
На первом шаге 1 вы можете определить язык по умолчанию (резервный), проверив настройку нейтрального языка. В приложении WinForms значение по умолчанию для параметра «Нейтральный язык» равно (Нет). При локализации приложения следует изменить (Нет) на один из многих языков, предлагаемых в списке (например, английский (США).) - person DavidRR; 19.01.2017
comment
@RenniePet Я не понимаю. Если вы удалите поле в форме, соответствующие ресурсы будут удалены. То же самое происходит с переименованием. Я использую эту технику для приложения, которое должно поддерживать 3 языка (один из которых является нейтральным языком и не будет использоваться). Единственный утомительный момент — это каждый раз выбирать форму и язык, для которого вы хотите изменить локализацию, но это просто работает. - person MarioDS; 09.08.2017
comment
@RenniePet, так какую технику вы рекомендуете. Из информации MarioDS кажется, что это действительно ужасный способ. - person greenoldman; 22.09.2017

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

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

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

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

Марк

person marc_s    schedule 09.08.2009
comment
Что ж, это программное обеспечение создает спутник, и ОП сказал, что ему не нужны файлы спутников. - person Francis B.; 09.08.2009
comment
Да, я знаю - я пытался показать, что, возможно, при наличии надлежащего инструмента сборка спутников не так уж и плоха. - person marc_s; 09.08.2009

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

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

CultureInfo ci = new CultureInfo("fr");
Thread.CurrentThread.CurrentUICulture = ci; 
person Francis B.    schedule 09.08.2009

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

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

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

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

person grenade    schedule 09.08.2009

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

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

Не выполнимо в IDE vanilla Visual Studio.

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

  • Приобретите собственный менеджер ресурсов, который обрабатывает файлы ресурсов TMX.
  • Поместите все ваши локализуемые строки в файл TMX.
    • Make this TMX file an embedded resource in your project.
  • В конструкторе форм создайте диспетчер ресурсов TMX, загрузив файл TMX из встроенных ресурсов.
  • В своем коде используйте свой tmx ResourceManager вместо ResourceManager по умолчанию для получения локализованных строк.
    • Let the Form use the default ResourceManager for getting all the designer things except the strings.
  • Дополните свой TMX-файл новыми языковыми переводами.
    • More can be added in the next release of your project, just by adding them to this TMX file before you compile.

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

person Jesse Chisholm    schedule 13.05.2015

Правильный способ сделать это, предположим, вы хотите добавить Arabic поддержку на RightToLeft языке:

  1. Дважды щелкните форму
  2. Установите локализуемую опору. к истине
  3. Изменить язык. на арабский // Это автоматически откроет новую версию формы, чтобы вы могли ее настроить.
  4. Установите свойство RightToLeft. на Да
  5. Установите свойство RightToLeftLayout. к истине
  6. Начните переименовывать элементы управления и сохраните форму.
  7. Обрабатывать сообщения/ошибки в коде // Извините, на данный момент у меня нет быстрого решения, попробуйте продублировать их и, если/иначе, текущий локальный.
person TiyebM    schedule 15.06.2021