возможность автоматической подстройки интерфейса

Александра-Александра
Дата: 19.02.2008 23:21:27
Здравствуйте...

Такой вопрос...

Хотела бы сделать в базе возможность автоматической подстройки интерфейса (надписи), в зависимости от выбора языка клавиатуры... Например, если запускаешь базу где по умолчанию стоит русский язык, то и интерфейс стоновится русским. Открываешь в компютере, где по умолчанию выставлен украинский язык, то и интерфейс становится украинским....

Спасибо...

Александра
%?*?%
Дата: 20.02.2008 03:04:58
Простейшее решение:

1. Сделайте табличку tblLangWords:

ID Russia UnatedStates Ukraina
1 НомерNumber ...
2 Выход Exit ...
3 Введите пароль Enter password ...
............
2001 Количество Quantity...


2. Каждому лейблу, который должен переводиться, пропишите в Tag нужный номер - 1, 2, 3, ...

3. На событие Load каждой формы поставьте:

Dim ctl As Control
For Each ctl In Me.Controls
   If TypeOf ctl Is Label Then
      If ctl.Tag <> "" And Not IsNull(ctl.Tag) Then
         ctl.Caption = LoadString(ctl.Tag) 
      End If
   End If
Next ctl

4. Создайте стандартный модуль и скопируйте туда нижеследующий код:

Option Compare Database
Option Explicit

Private Const LOCALE_SCOUNTRY As Long = &H6
Private Declare Function GetKeyboardLayout Lib "user32" _
  (ByVal dwLayout As Long) As Long
Private Declare Function GetLocaleInfo Lib "kernel32" _
   Alias "GetLocaleInfoA" _
  (ByVal Locale As Long, _
   ByVal LCType As Long, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) As Long

Private Function GetUserLocaleInfo(ByVal dwLocaleID As Long, _
                                  ByVal dwLCType As Long) As String
   Dim sReturn As String
   Dim nSize As Long
nSize = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
   If nSize > 0 Then
      sReturn = Space$(nSize)
      nSize = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
      If nSize > 0 Then
         GetUserLocaleInfo = Left$(sReturn, nSize - 1)
      End If
   End If
End Function


Private Function LoWord(wParam As Long) As Integer
   If wParam And &H8000& Then
      LoWord = &H8000& Or (wParam And &H7FFF&)
   Else
      LoWord = wParam And &HFFFF&
   End If
End Function

   
Public Function sCountry() As String
   Dim hKeyboardID As Long
   Dim LCID As Long

hKeyboardID = GetKeyboardLayout(0&)
      If hKeyboardID > 0 Then LCID = LoWord(hKeyboardID)
      If LCID Then sCountry = Replace(GetUserLocaleInfo(LCID, LOCALE_SCOUNTRY)," ","")
End Function


Public Function LoadString(wdNumber As Long) As String
On Error GoTo HandleErrors
 Dim strLoadString As String
 Dim db As DAO.Database
 Dim rst As DAO.Recordset
 Dim strSQL As String

Set db = CurrentDb
strSQL = "SELECT tblLangWords." & sCountry _
          & " FROM tblLangWords" _
          & " WHERE tblLangWords.ID = " & wdNumber & ";"

Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)

   If Not rst.EOF Then
      rst.MoveFirst
      strLoadString = rst("wdText")
   End If

exithere:
 On Error Resume Next
 rst.Close
 db.Close
 Set rst = Nothing
 Set db = Nothing
 LoadString = strLoadString
 Exit Function

HandleErrors:
 MsgBox "MyModuleName - LoadString:" & vbNewLine & Err.Number & vbTab & Err.Description
 Resume exithere
 End Function

Все, можно играться...
%?*?%
Дата: 20.02.2008 03:45:49
Хотя, если подумать, в функцию sCountry надо добавить проверку:

Public Function sCountry() As String
   Dim hKeyboardID As Long
   Dim LCID As Long
   Dim db As DAO.Database
   Dim tdf as DAO.TableDef
   Dim fld As DAO.Field
   Dim strCountry
   dim f as Boolean

hKeyboardID = GetKeyboardLayout(0&)
      If hKeyboardID > 0 Then LCID = LoWord(hKeyboardID)
      If LCID Then strCountry = Replace(GetUserLocaleInfo(LCID, LOCALE_SCOUNTRY)," ","")

f = False
Set db = CurrentDb
Set tdf = CurrentDb.TableDefs("tblLangWords")

For Each fld In tdf.Fields
   If tdf.Name = strCountry Then f = True
Next

If f Then 
   sCountry = strCountry
Else
   sCountry = "UnitedStates"
End If

End Function
aleks2
Дата: 20.02.2008 06:49:20
%?*?%
Простейшее решение:
2. Каждому лейблу, который должен переводиться, пропишите в Tag нужный номер - 1, 2, 3, ...


Лишнее, однако, проще в таблице поле "Russia" сделать ключевым и вести замену поиском прямо по нему, используя русский интерфейс как основной.

Dim ctl As Control
For Each ctl In Me.Controls
   If TypeOf ctl Is Label Then
      ctl.Caption = LoadString(ctl.Caption) 
   End If
Next ctl

Public Function LoadString(aCaption As string) As String
  dim NewStr as string
  NewStr=DLookup(...,"Russia="""+aCaption+"""")
  if NewStr<>"" then LoadString = NewStr else LoadString =aCaption
Exit Function


Бонусы:
1. одинаковая фраза переводится только ОДИН раз и не надо помнить ID.
2. Можно сделать автодобавление текста в поле "Russia" и потом только перевести строчки...
Karfaqen
Дата: 20.02.2008 08:58:02
Аналогично не забыть обработать свойства StatusBarText, ValidationText, ControlTipText контролов форм, свойства Caption кнопок, ярлыков вкладок Tab-контролов, списковые источники строк лист- и комбобоксов и т.п.. Плюс, само-собой, пункты меню - подписи и подсказки для кнопок кустомных тулбаров (ну если все это есть).

Вообще ИМХО, если после установки приложение будет использоваться на одном языке, то можно даже делать процедуру такой замены НЕ каждый раз на ходу, а однократно после установки - перебрав все объекты трансляции (открывая макет в дизайне) и заменив статические тексты на языковые аналоги по таблице строковых ресурсов. Потому что есть еще отчеты, могут быть запросы, содержащие статический текст - много может быть, зачем закладывать лишние перманентные затраты на такую обработку.

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

Для этого любые строковые константы из VB-кода придется убрать и вынести их в общую таблицу строковых ресурсов, присвоить им коды и по этим кодам получать текст на нужном языке (можно просто заменить стандартный MsgBox на свою функцию, где все это сделать).
Karfaqen
Дата: 20.02.2008 09:06:53
Уточнение
Karfaqen
любые строковые константы из VB-кода придется убрать
Ну имеются ввиду, конечно, строки текста, участующие в интерактивных процессах в качестве текста, предназначенного для чтения пользователем - т.е. как минимум строки сообщений, заголовки для MsgBox, InputBox, а также любые программно-формируемые строки текста для форм, отчетов, и т.д.
osmor
Дата: 20.02.2008 10:36:42
Небольшой пример ко всему вышеизложенному
Пример реализации мульниязычного интерфейса в ACCESS
Александра-Александра
Дата: 20.02.2008 12:26:28
Всем большое спасибо...
Теперь будет чем заняться..