[AccessD] Rocky's translation tool finished.

Drew Wutka DWUTKA at Marlow.com
Tue Feb 24 12:52:01 CST 2009


No fair, I was sick this weekend! ;)

Looks good.  I just posted mine a few minutes ago....

Drew

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
Sent: Saturday, February 21, 2009 12:41 AM
To: Access Developers discussion and problem solving
Subject: [AccessD] Rocky's translation tool finished.

Roughly 1.5 hours from receipt of email to back out the door to Rocky

Two classes, clsXlateFrm and clsXlateSupervisor and a simple module for
initialization.  Each form 
loads the form class from its open event.  Translation happens then and
there.  Strings cached to a 
collection for that form and will load from the cache each time.

Understand this is just the basics, no fancy error handling or interface
around the translation. 
The important thing for me is to have the code for the system in a known
place to add functionality 
(additional properties such as tool tip etc.) should there ever be a
need.  Neatly organized, easy 
to understand, fast, efficient, easy to program.

'-----------------------------------------------------------------------
----------------
' Module    : clsXlateFrm
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : This class loads all of the phrase strings into a
collection for a single form
'               the first time the form loads, keyed on control name.
It ignores control
'               names not in the language table.
'
'               It then uses those strings in the collection to
translate the form.
'               The second and subsequent times the form loads, the
class already has the
'               strings in the collection so the collection load does
not happen again (cached)
'               and the translation happens from the collection.
'-----------------------------------------------------------------------
----------------
Const cstrModule As String = "clsXlateFrm"
Option Compare Database
Option Explicit

Private mcolPhrase As Collection
Private mstrName As String
Private mstrLanguageFldName As String

Private Sub Class_Initialize()
     Set mcolPhrase = New Collection
End Sub

Private Sub Class_Terminate()
     Set mcolPhrase = Nothing
End Sub

'-----------------------------------------------------------------------
----------------
' Procedure : mInit
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : Called the first time the form loads.  Loads the
translation phrases from the table
'               and translates the form.
'-----------------------------------------------------------------------
----------------
'
Function mInit(lfrm As Form, lstrLanguageFldName As String)
     mstrName = lfrm.Name
     mstrLanguageFldName = lstrLanguageFldName
     '
     'If nothing in the collection then load the collection
     '
     If Not mcolPhrase.Count Then
         mLoadColPhrase
     End If
     '
     'Now translate the form
     '
     mXlateFrm lfrm
End Function

Property Get pName() As String
     pName = mstrName
End Property

Function colPhrase() As Collection
     Set colPhrase = mcolPhrase
End Function
'-----------------------------------------------------------------------
----------------
' Procedure : mXlateFrm
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : This function trnaslates the form.  By the time this
function is called the
'               collection already contains all of the translation
strings keyed by the
'               control name.  All it has to do is attempt to index into
the collection
'               using each control name.  If there is something in the
collection for that
'               control name then the string is returned from the
collection and placed in
'               the control property.
'
'               if nothing there, the error is ignored and the next
control is tried.
'-----------------------------------------------------------------------
----------------
'
Function mXlateFrm(frm As Form)
Dim ctl As Control
On Error GoTo Err_mXlateFrm

     '
     'Check every control on the form
     'Expand this case to add new control types.
     For Each ctl In frm.Controls
         Select Case ctl.ControlType
         Case acLabel
             '
             'Try to get a translation phrase from the collection
             'Any errors will be ignored
             ctl.Caption = mcolPhrase(ctl.Name)
         Case acCommandButton
             ctl.Caption = mcolPhrase(ctl.Name)
         Case Else
         End Select
     Next ctl

Exit_mXlateFrm:
     On Error Resume Next
     Exit Function
Err_mXlateFrm:
     Select Case Err
     Case 0      '.insert Errors you wish to ignore here
         Resume Next
     Case 5      'Control name not in translation table, ignore the
error
         Resume Next
     Case Else   '.All other errors will trap
         Beep
         MsgBox Err.Number & ":" & Err.Description
         Resume Exit_mXlateFrm
     End Select
     Resume 0    '.FOR TROUBLESHOOTING
End Function
'-----------------------------------------------------------------------
----------------
' Procedure : mLoadColPhrase
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : Loads the translation phrase strings out of the table for
one form
'               Builds a query dynamically based on the form name and
the translation
'               language field name
'-----------------------------------------------------------------------
----------------
'
Private Function mLoadColPhrase()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String

On Error GoTo Err_mLoadColPhrase

     '
     'Dynamically build the query to pull the translation strings for a
specific form and language
     '
     strSQL = "SELECT fldLanguageForm, fldLanguageControl, " &
mstrLanguageFldName & " " & _
                 "FROM [tblLanguage-Controls] " & _
                 "WHERE ((([tblLanguage-Controls].fldLanguageForm)='" &
mstrName & "'));"
     Set db = CurrentDb
     Set rst = db.OpenRecordset(strSQL)
     With rst
         While Not .EOF
             '
             'Drop all phrases found into the phrase collection
             'Keyed on the control name fldLanguageControl
             '
             mcolPhrase.Add .Fields(mstrLanguageFldName).Value,
.Fields("fldLanguageControl").Value
             .MoveNext
         Wend
     End With

Exit_mLoadColPhrase:
     On Error Resume Next
     Exit Function
Err_mLoadColPhrase:
     Select Case Err
     Case 0      '.insert Errors you wish to ignore here
         Resume Next
     Case Else   '.All other errors will trap
         Beep
         MsgBox Err.Number & ":" & Err.Description
         Resume Exit_mLoadColPhrase
     End Select
     Resume 0    '.FOR TROUBLESHOOTING
End Function

Option Compare Database
Option Explicit

Private mcolClsXlateFrm As Collection

Private Sub Class_Initialize()
     Set mcolClsXlateFrm = New Collection
End Sub

Private Sub Class_Terminate()
     Set mcolClsXlateFrm = Nothing
End Sub

'-----------------------------------------------------------------------
----------------
' Procedure : mTranslateFrm
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : Performs the translation for one form passed in.
'-----------------------------------------------------------------------
----------------
'
Function mTranslateFrm(lfrm As Form, lstrLanguageFldName As String)
Dim lclsXlateFrm As clsXlateFrm
On Error GoTo Err_mTranslateFrm

     On Error Resume Next
     '
     'Try to get an instance of the clsXlateFrm from the collection for
this form
     '
     Set lclsXlateFrm = mcolClsXlateFrm(lfrm.Name)
     If Err Then
         '
         'If that fials then this is the first time so perform the
initialize
         '
         Set lclsXlateFrm = New clsXlateFrm
         '
         'Now that we have an instance for this form perform the load
and translation
         '
         lclsXlateFrm.mInit lfrm, lstrLanguageFldName
         '
         'And save the instance to the collection for the next time
         '
         mcolClsXlateFrm.Add lclsXlateFrm, lfrm.Name
     Else
         '
         'We have already loaded this form once so perform the
translation
         '
         lclsXlateFrm.mXlateFrm lfrm
     End If

Exit_mTranslateFrm:
     On Error Resume Next
     Exit Function
Err_mTranslateFrm:
     Select Case Err
     Case 0      '.insert Errors you wish to ignore here
         Resume Next
     Case Else   '.All other errors will trap
         Beep
         MsgBox Err.Number & ":" & Err.Description
         Resume Exit_mTranslateFrm
     End Select
     Resume 0    '.FOR TROUBLESHOOTING
End Function
'
'Return a pointer to colClsXlateFrm
'
Property Get colClsXlateFrm() As Collection
     Set colClsXlateFrm = mcolClsXlateFrm
End Property


'-----------------------------------------------------------------------
----------------
' Module    : basXlate
' Author    : jwcolby
' Date      : 2/21/2009
' Purpose   : Functions to initialize, terminate and return a pointer to
clsXlateSupervisor
'               as well as a global variable for the translation string
field name.
'-----------------------------------------------------------------------
----------------
Const cstrModule As String = "basXlate"
Option Compare Database
Option Explicit

Private mclsXlateSupervisor As clsXlateSupervisor
'
'Set this variable to the name of the field holding the translation
language strings
'
'fldLanguageEnglish
'fldLanguageChineseComplex
'etc
'
Public mstrLanguageFldName As String

Function mXlateSupervisorInit()
     If mclsXlateSupervisor Is Nothing Then
         Set mclsXlateSupervisor = New clsXlateSupervisor
         mstrLanguageFldName = "fldLanguageSpanish"  'Default language
to English
     End If
     Set mXlateSupervisorInit = mclsXlateSupervisor
End Function
Function mXlateSupervisorTerm()
     Set mclsXlateSupervisor = Nothing
End Function
Function cXS() As clsXlateSupervisor
     Set cXS = mXlateSupervisorInit()
End Function


-- 
John W. Colby
www.ColbyConsulting.com
-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
The information contained in this transmission is intended only for the person or entity to which it is addressed and may contain II-VI Proprietary and/or II-VI Business Sensitive material. If you are not the intended recipient, please contact the sender immediately and destroy the material in its entirety, whether electronic or hard copy. You are notified that any review, retransmission, copying, disclosure, dissemination, or other use of, or taking of any action in reliance upon this information by persons or entities other than the intended recipient is prohibited.





More information about the AccessD mailing list