Локализация Windows Forms - PullRequest
       0

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

3 голосов
/ 13 октября 2011

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

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

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

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

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

'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Dock = System.Windows.Forms.DockStyle.Top
Me.Label1.Location = New System.Drawing.Point(3, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(61, 13)
Me.Label1.TabIndex = 1
Me.Label1.Text = <b>My.Resources.ResourceManager.GetString("Form1_Label1_Text")</b>

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

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

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

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

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

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

Public Class Form1
    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        LocalizeComponent()
    End Sub

    Private Sub LocalizeComponent()
        ' Localizes all the ui elements from a common Resource
        Me.SuspendLayout()
        Me.cmdOK.Text = My.Resources.ResourceManager.GetString("cmdOKTextOK")
        Me.cmdCancel.Text = My.Resources.ResourceManager.GetString("cmdCancelTextCancel")
        Me.cmdApply.Text = My.Resources.ResourceManager.GetString("cmdApplyTextApply")
        Me.ResumeLayout(False)
    End Sub
End Class

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

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

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

0 голосов
/ 19 октября 2011

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

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

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

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