Создание многоязычного интерфейса
Автор Марат   
17.10.2002 г.
В таблице должна присуствовать форма frmStartUp, которая содержит комбобокс cbxLanguage, куда внесен список языков. Которая, как видно из названия должна запускаться автоматически при открытии базы. Форма эта не закрывается, а только становится невидимой.
Таблица tblTranslation, которая содержит поле Control (ключевое), и поля с названиями языков English, Espanol, ... и т.д. содержит название каждого контрола на формах, заголовки которых нужно перевести (так же и для отчетов), и в каждом поле, по соответствующему языку находится перевод этого контрола на соответсвующий язык. Контролы на формах тоже имеют названия, на случай, что если произошла какая-то ошибка при считывание варианта перевода, то выведется значение контрола по умолчанию. Работает со всеми контролами - кнопками, лейблами и т.д., в общем, со всем, у чего есть caption.

Публичная функция:

Public Sub SelectLanguage(frm As Form)
Dim ctrl As Control
Dim rst As ADODB.Recordset
Dim strLanguage As String

strLanguage = Forms!frmStartup!cbxLanguage

Set rst = New ADODB.Recordset
rst.Open "SELECT Control, " & strLanguage & " FROM tblTranslation " _
, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
rst.MoveFirst

On Error Resume Next 'if any shit happens, just forget it Andskip it,
the default value of the control will appear.
For Each ctrl In frm
rst.Find "Control = '" & ctrl.Name & "'"
If rst.BOF Or rst.EOF Then
Else
ctrl.Caption = rst(strLanguage)
End If
rst.MoveFirst
Next ctrl
End Sub
То-есть, по выбранному языку на frmStartUp, выбирается одноименное поле из таблицы переводов. И потом эти значения подставляются для каждого контрола в форме. Размеры контролов надо подогнать с запасом, т.к. в разных языках длина названия может быть разная. Удобство в том, что при возникновении необходимости добавить новый язык, нужно только добавить дополнительное поле в таблицу переводов, вписать соответсвующие переводы, и дополнительное значение в комбобокс cbxLanguage (в принципе, можно дописать маленькую функцию автоматически извлекающую список полей из таблицы переводов, но мне было лень).

На обычного юзверя такой многоязычный интерфейс производит сногосшибающее впечетление.

В случае, если надо заполнять комбобоксы в формах, вопрос решается аналогичным образом (пример):
Public Sub UpdateLstDSSubject()
Dim strSQL As String
Dim strLanguage As String

strLanguage = Forms!frmStartup!cbxLanguage

strSQL = "SELECT " & strLanguage & " FROM TblSubject INNER JOIN " _
& "tblLinkDatasetSubject On tblSubject.ID =
tblLinkDatasetSubject.SubjectID " _
& "WHERE DatasetID = " & Forms!frmMain.Controls("sfrmDataset")!ID _
& " ORDER BY " & strLanguage & ";"

Forms!frmMain.Controls("lstDSSubject").RowSource = strSQL
End Sub

Удобно так же и то, что данные могут вноситься на одном языке, а
просматриваться и редактироваться на любом другом. Но в полях значения нужно
держать не в виде текста, а в виде кодов.

Пример реализации:

Download now
Просмотров: 10779

  Коментарии (1)
 1 Написал(а) Баймер, в 02:57 06.12.2010
Марат, путем поиска нашел 2 статьи по реализации мультиязыкового интерфейса - Вашу и Osmor, которая, видимо, в поддержку вашей примером. Идея неплохая. 
 
Замечания (замечания не все объективны, т.к. сужу уже по аксес 2007, где есть нововведения): 
1. Я так понимаю во время открытия формы будут подгружаться значения подписи (Caption). Это неудобно, т.к. замедляет работу программы. 
Обычно человек не часто меняет язык, потому было бы удобно один раз изменить язык, а затем работать с ним до следующей смены. 
2. Держать в полях значение в виде кодов так же не удобно по понятным причинам. (видимо идет речь о значении Name). Обычно на разных формах названия полей могут быть одинаковыми, а тут необходимо вводить уникальность 
3. Не совсем понял по теме сбоя и подгрузки стандартного значения. Т.е. задается Name в Caption? Если так, то конечно лучше, но говорили же о том, что Name в виде кода. При любом раскладе не идельный вариант. 
 
http://hiprog.com/index.php?option=com_content&task=view&id=251661653&Itemid=35&limit=1&limitstart=1 (Коммент 16). 
В ходе некоторой дискуссии у меня созрел еще один вариант. Возможно я разовью идею более глубоко. Тогда буду рад, если Вы возьметесь реализовать, т.к. я не силен в коде. 
ПС Хотя Ваша запись была уж очень давно, и, вполне возможно, что Вы не читаете эту страницу....

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code