Как реализовать многоязычный интерфейс для своего «малого» и «среднего» проекта.

20 марта 2004, суббота 15:44
для раздела Блоги
Наверное многие кто хоть раз писал программы которые нудны не только себе но и «народу».
Народ как всем известно бывает разный: население России говорят и читают по Русски, Германии по Немецки и т.д. и всем надо угодить конечно можно делать программу с расчётом только на Русского пользователя или на любого другого но это непрактично …. Можно делать разные версии программы но в таком случае надо замарачиватся с несколькими экземплярами программы. Всё это либо неудобно, либо непрактично, но есть выход!
Можно сделать многоязычный интерфейс программы! Многие начинающие программисты скажут, что это очень сложно и того не стоит, но это не так и в этой статье я развею все ваши «думы».
Многоязычный интерфейс можно делать разными способами … но самый простой это использование в качестве файлов языковых модулей INI файлы. Ведь зачем изобретать велосипед, если он уже существует.
И в нашем случае уже существует: структура файла. Функции чтобы записывать в файл и читать из него, а что ещё нам надо … больше нечего => ПОЕХАЛИ!
Такой способ в принципе можно применять к проектам любой сложности , но все же для больших проектов лучше использовать языковые модули построенные на xhtml (это табличная структура файлов используемая в «сайтостроительстве») структуре, но это более сложно. Эта статья ориентирована на начинающего программиста и поэтому этот способ здесь не рассматривается. Ну всё теперь перейдём к самому процессу создания мультиязычного интерфейса!
1.Создаём новый проект и располагаем на форме 3 кнопки 1 один комбобокс
2.Создаём модуль – в этом модули будут декларироваться все API функции
3.Открываем код модуля и добавляем туда такие строки:


'Функция для записи в INI файл
Declare Function WritePrivateProfileString Lib "Kernel32" Alias _
"WritePrivateProfileStringA" (ByVal Section As String, _
ByVal Key As String, ByVal putStr As String, _
ByVal INIfile As String) As Long
'Функция для чтения INI файл
Public Declare Function GetPrivateProfileString Lib "kernel32.dll" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long
'Использование:
' WriteINI "TestSection", "TestKey", "TestKeyValue", "D:\test.ini"
' где:
' TestSection - имя секции
' TestKey - имя ключа
' TestKeyValue - значение ключа
' D:\test.ini - путь к ini файлу
Function WriteINI(Section As String, Key As String, KeyValue As Variant, FilePath As String)
WritePrivateProfileString Section, Key, KeyValue, FilePath
End Function
'Функция для чтения из INI файла
'Использование:
' Text1.Text = ReadINI("TestSection", "TestKey", "D:\test.ini")
' где:
' Text1.Text - значение ключа
' TestSection - имя секции
' TestKey - имя ключа
' D:\test.ini - путь к ini файлу
'
Function ReadINI(Section As String, Key As String, FilePath As String) As String
Dim RetStr As String
RetStr = String(255, Chr(0))
ReadINI = Left(RetStr, GetPrivateProfileString(Section, Key, "", RetStr, Len(RetStr), FilePath))
End Function

4.Даём ссылку на Microsoft Scripting Runtime
5.Создаём вторую форму (Form2)
6.Открываем Form1 и вписываем туда такой код:


Dim fso As FileSystemObject ' объявляем Файл Систем Обджект
Public Path As String ' объявляем переменную которая дудет хранить путь к ини
Private Sub Command1_Click()
Path = App.Path & "\Languages\" & Combo1.Text & ".ini" ' задаём путь в переменную
If Dir(Path, vbNormal) = Combo1.Text & ".ini" Then ' проверяем если файл существует то продолжаем
' дальше просто читаются надписи из INI файла и присваиваются свойствам Caption ' 'объектам расположенным на формах проекта
Command2.Caption = ReadINI("Form1", "Command2.Caption", Path)
Command3.Caption = ReadINI("Form1", "Command3.Caption", Path)
Form2.Command1.Caption = ReadINI("Form2", "Command1.Caption", Path)
Form2.Label1.Caption = ReadINI("Form2", "Label1.Caption", Path)
Form2.Command2.Caption = ReadINI("Form2", "Command2.Caption", Path)
End If
End Sub

Private Sub Command2_Click()
Form2.Show
End Sub

Private Sub Command3_Click()
Unload Form2
Unload Form1
End Sub

Private Sub Form_Load()
Me.BorderStyle = 0
Command1.Caption = "Load"
' этот код ищит файлы в папке с языковыми модулями и их названия чует в комбобокс
Dim fso, fld, f1, fc, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(App.Path & "\Languages\")
Set fc = fld.Files
For Each f1 In fc
Lang = Replace(f1.Name, ".ini", "")
Combo1.AddItem Lang
Next
If Combo1.ListCount >= 0 Then Combo1.ListIndex = 0
End Sub

7.Открываем код 2-ой формы и вписываем туда:

Private Sub Command1_Click()
' сохраняем значения свойства Text textbox`a 1 как значения свойства Caption Лабла 1!
' и вырубаем программу!
WriteINI "Form2", "Label1.Caption", Text1.Text, Form1.Path
Unload Form2
Unload Form1
End Sub

Private Sub Command2_Click()
Me.Hide
End Sub

8. Теперь сохраняем проект и создаём в папке с проектом папку Languages
9. Теперь создаём столько языковых модулей сколько языком вы планируете использовать в программе … в моём примере их 2 Russian.ini и English.ini
Содержание Russian.ini

[Form1]
Command2.Caption=Дальше
Command3.Caption=Выход
[Form2]
Command1.Caption=Сохранить
Command2.Caption=Закрыть
Label1.Caption=Внизу надо ввести новый текст который при следующем запуске будет виден здесь

Содержание English.ini

[Form1]
Command2.Caption=Next
Command3.Caption=Exit
[Form2]
Command1.Caption=Save
Command2.Caption=Close
Label1.Caption=Below it is necessary to enter the new text which at the following start it will be seen here

Вот и всё языковый интерфейс готов! Необязательно загружать все значения свойств сразу для всех форм можно их грузить непосредственно перед загрузкой формы … в больших проектах выиграете памяти. Таким же способом можно грузить и другие свойства, допустим размер элемента. Потому что разные фразы могут помещаться и не помещаться в отведенное место! И ещё один совет:
Лучше все же помимо загружаемых свойств создавать и стандартные … это очень поможет, если вдруг будут удалены все языковые модули и программа сможет функционировать на «языке разработчика».
Удачного создания многоязычного интерфейса и продвижения вашей программы на зарубежный рынок
Вот ссылка на пример: http://cp.people.overclockers.ru/cgi-bin/dl.pl?id=1006&filename=exemple.zip

Тимофеев Владимир aka V!RU$
E-mail: virus@pechkin.ru
Web: http://cxodnya.narod.ru
ICQ: 132309822
Оценитe материал

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают