пятница, 28 сентября 2012 г.

Project CodeKeeper - тонкости перевода

Столкнулся с неожиданной проблемой: дело в том, что приведенная ранее процедура и структура текстового файла позволяли менять лишь одно свойства элемента формы - текст. Но как быть, к примеру, с всплывающими подсказками? Придется изменить структуру текстового файла и процедуру локализации, а именно:

Текстовой файл:

<имя контрола><Tab>Параметр><Tab><Значение>, где
<имя контрола> - имя элемента управления формы
<Параметр> - то, что нужно изменить, может быть:

  • Text (Текст)
  • ToolTip (Всплывающая подсказка)
  • NullValuePrompt (Приглашение пустого текстового поля (фишка DevExpress))
<Значение> - Локализованный параметр
<Tab> - символ табуляции

Текст процедуры:
      Public Sub translate(Language As String)
        Dim langFile As String = Application.StartupPath + "\lang\" + Language + ".txt"

        If System.IO.File.Exists(langFile) Then
            'Формирование лингвистического массива
            Dim lines() As String = System.IO.File.ReadAllLines(langFile)
            Dim langArray(lines.Length - 1)() As String
            For f As Integer = 0 To lines.Length - 1
                Dim tempArray() As String = lines(f).Split(vbTab)
                langArray(f) = {tempArray(0), tempArray(1), tempArray(2)}
            Next

            'Поиск контролов формы
            For f As Integer = 0 To langArray.Length - 1
                'форма
                If langArray(f)(0) = "formName" Then
                    Me.Text = langArray(f)(2)
                Else
                    Dim c() As Control = Me.Controls.Find(langArray(f)(0), True)
                    If c.Count > 0 Then
                        Select Case c(0).GetType
                            Case GetType(TextEdit)
                                'Текстовое поле
                                Dim tc As TextEdit = c(0)
                                Select Case langArray(f)(1)
                                    Case "Text" : tc.Text = langArray(f)(2)
                                    Case "NullValuePrompt" : tc.Properties.NullValuePrompt = langArray(f)(2)
                                    Case "ToolTip" : tc.ToolTip = langArray(f)(2)
                                End Select
                                'Кнопка
                            Case GetType(SimpleButton)
                                Dim tc As SimpleButton = c(0)
                                Select Case langArray(f)(1)
                                    Case "Text" : tc.Text = langArray(f)(2)
                                    Case "ToolTip" : tc.ToolTip = langArray(f)(2)
                                End Select
                                'Кнопка со стрелкой
                            Case GetType(DropDownButton)
                                Dim tc As DropDownButton = c(0)
                                Select Case langArray(f)(1)
                                    Case "Text" : tc.Text = langArray(f)(2)
                                    Case "ToolTip" : tc.ToolTip = langArray(f)(2)
                                End Select
                                'Раскрывающийся список
                            Case GetType(ComboBoxEdit)
                                Dim tc As ComboBoxEdit = c(0)
                                Select Case langArray(f)(1)
                                    Case "Text" : tc.Text = langArray(f)(2)
                                    Case "ToolTip" : tc.ToolTip = langArray(f)(2)
                                End Select
                            Case Else
                                'Другое
                                c(0).Text = langArray(f)(2)
                        End Select
                    End If
                End If
            Next
        Else
            MsgBox("Файл языка не найден")
        End If
    End Sub

Причем я слегка изменил стартер:
    Private Sub starter() Handles MyBase.Load
        Dim localizations() As String = System.IO.Directory.GetFiles(Application.StartupPath + "\lang\")
        Me.selLanguage.Properties.Items.Clear()
        For f As Integer = 0 To localizations.Length - 1
            Dim fileInfo As New System.IO.FileInfo(localizations(f))
            Me.selLanguage.Properties.Items.Add(fileInfo.Name.Substring(0, fileInfo.Name.Length - 4))
        Next
        If My.Settings.lang <> "" Then
            translate(My.Settings.lang)
            Me.selLanguage.Text = My.Settings.lang
        Else
            translate("English")
        End If
    End Sub

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

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

Отправить комментарий