Sources.RU Magazine Поиск по журналу
 

TopList

Многоязыковое приложение

Автор: miksayer

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

  1. Программа будет переведена только на те языки, на которые вы ее сами перевели
  2. Программа будет иметь больший размер

В таком случае лучше сделать так, чтобы юзер сам мог добавлять и изменять языки программы. Это легко сделать загружая все надписи из INI-файлов. Для этого нам понадобится модуль для чтения/записи INI-файлов:

Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Public Declare Function GetPrivateProfileString Lib "kernel32" 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

Function WriteINI(sSection As String, sKeyName As String, sNewString As String, sINIFileName As String) As Boolean
On Local Error Resume Next
Call WritePrivateProfileString(sSection, sKeyName, sNewString, sINIFileName)
WriteINI = (Err.Number = 0)
End Function

Function ReadINI(sSection As String, sKeyName As String, sINIFileName As String) As String
On Local Error Resume Next
Dim sRet As String
sRet = String(255, Chr(0))
ReadINI = Left(sRet, GetPrivateProfileString(sSection, ByVal sKeyName, "", sRet, Len(sRet), sINIFileName))
End Function

Теперь давайте напишем специальную функцию, которая читала бы INI-файлы и изменяла надписи на контролах. Киньте на форму пару кнопок. А вот и сама функция:

Public Function LoadLanguage(lang As String)
' читаем надпись для первой кнопки
Dim com1 As String
com1=ReadINI("MAIN", "Com1", lang)
Form1.Command1.Caption = com1
' читаем надпись для второй кнопки
Dim com2 As String
com2=ReadINI("MAIN", "Com2", lang)
Form1.Command2.Caption = com2
End Function

И создайте в папке с нашей программой файл lang.ini с таким текстом:

[MAIN]
Com1=Sources.RU
Com2=Исходники.РУ

Теперь в событии Form_Load пишем:

Private Sub Form_Load()
Call LoadLanguage(App.Path & "\lang.ini")
End Sub

При загрузке формы надписи на кнопках должны поменяться на "Sources.RU" и "Исходники.РУ". Теперь давайте сделаем так, чтобы юзер мог выбрать языки в меню. Для этого добавьте меню mnuLanguage и mnuLang(Index=0). А теперь добавьте FileListBox(Pattern=.ini). Далее пишем код:

Private Sub Form_Load()
On Error Resume Next
File1.Path=App.Path & "\language"
For i=0 To File.ListCount-1
Load mnuLang(i)
mnuLang(i).Caption=File1.List(i)
Next
End Sub

А событие нажатия на меню:

Private Sub mnuLang(Index As Integer)
Call LoadLanguage(App.Path & "\" & mnuLang(Index).Caption)
End Sub

Вот и все! Теперь вы можете без проблем создать многоязыковое приложение.

С уважением, miksayer



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru