В таблице должна присуствовать форма 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
Удобно так же и то, что данные могут вноситься на одном языке, а просматриваться и редактироваться на любом другом. Но в полях значения нужно держать не в виде текста, а в виде кодов.