Локализация Windows Forms

#vb.net #winforms #localization

#vb.net #winforms #локализация

Вопрос:

Я работаю над проектом, который включает в себя локализацию большого количества Windows Forms.

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

Одна из проблем, с которой мы сталкиваемся, заключается в том, что когда мы устанавливаем для свойства Form.Localizable значение True, нам в конечном итоге приходится управлять одним файлом .resx для каждой формы на каждом языке. Это было бы хорошо, если бы файлы .resx содержали только локализованный текст, но он также содержит огромное количество данных макета для формы.

Есть ли способ отделить локализуемые текстовые элементы от информации о макете элемента управления, которая продолжает работать в среде IDE Visual Studio?

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

'
'Label1
'
Я.Label1.Автоматический размер = True
Me.Label1.Док = Система.Windows.Формы.DockStyle.Наверх
Я.Label1.Местоположение = новая система.Рисование.Точка (3, 0)
Me.Label1.Name = "Label1"
Я.Label1.Размер = новая система.Рисование.Размер (61, 13)
Я.Label1.TabIndex = 1
Я.Label1.Текст = My.Resources.ResourceManager.getString("Form1_Label1_Text")

Комментарии:

1. Хорошо, я так и не нашел полностью удовлетворительного ответа на этот вопрос. Но я придумал решение, которое оскорбило меня меньше всего, о котором я подробно расскажу ниже.

Ответ №1:

Я так и не нашел ответа на этот вопрос, которым был полностью доволен. Но это решение, которое я в конечном итоге реализовал:

  1. Я закончил настройку Form.Localizable = false , потому что не хотел поддерживать все эти идентичные файлы .resx

  2. Все элементы пользовательского интерфейса получают фактическое значение (например, «O_K_»), которое явно не локализовано.

  3. Я обработал форму / элементы управления точно так же, как и весь мой другой локализуемый контент (сообщения об ошибках, сообщения журнала и т. Д.), И Просто дал им уникальные ключи, такие как «cmdOkTextOK», чтобы их можно было использовать в нескольких формах

  4. Я создал LocalizeComponent() функции для каждой формы и вызвал ее из конструктора сразу после InitializeComponent() функции следующим образом:

Открытый класс Form1
 Public Sub New()
 ' Этот вызов требуется разработчику форм Windows.
 InitializeComponent()
 ' Добавьте любую инициализацию после вызова InitializeComponent() .
 LocalizeComponent()
 Завершение подзаголовка

 Частный компонент LocalizeComponent()
 ' Локализует все элементы пользовательского интерфейса из общего ресурса
Me.SuspendLayout()
 Me.cmdOK.Текст = My.Resources.ResourceManager.getString("cmdOKTextOK")
 Я.cmdCancel.Текст = My.Resources.ResourceManager.getString("cmdCancelTextCancel")
 Я.cmdApply.Текст = My.Resources.ResourceManager.getString("cmdApplyTextApply")
 Me.ResumeLayout(False)
 Завершение подзаголовка
Конечный класс

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

Я все еще не доволен на 100%, потому что элементы управления создаются с нелокализованными строками во время выполнения, которые обновляются позже. Но это избавит меня от кошмара обслуживания, которого я действительно не хочу!

СПАСИБО всем, кто взял на себя труд ответить. Я ценю это! Я не уверен, что вы должны делать, отвечая на свой собственный вопрос, чтобы отметить его как «отвеченный», поэтому, если бы кто-нибудь мог указать мне на это, не сжигая меня слишком плохо, это было бы оценено.

Ответ №2:

Вы можете использовать файлы в качестве ресурсов, так что это то, что вы должны быть в состоянии выполнить, поскольку оно не изменяется во время выполнения, а доступно только из того, что вы сказали. Может быть, XML-файл с языковыми записями и переведенным текстом, например. <entry key = "btnOK">Ok</entry> . Во время выполнения вы можете принять решение, на каком языковом узле загружать

 <Languages>
    <Language name="Spanish">
         <Entry key="Yes">Si</Entry>
  

В последнем месте, где я работал, мы использовали XML-файлы, по одному для каждого языка, которые мы включали в установку. Когда решение было загружено, мы загрузили нужный файл в глобальную хеш-таблицу и установили каждый бит текста таким образом. Возможно, существует более оптимальное решение, но, возможно, вам поможет что-то в этом роде. hashTable("successfulSaveMsg") вернет, например, «Вы успешно сохранили свой виджет».