VB
Allen 2011-09-10 09:13:15 4413 0 0 0 0
公司有些日文程序需要汉化,但如果直接手动在程序中汉化,下次程序修改了,还得再次汉化,这样肯定是不行的。
想到用INI文件来设置程序显示语言,但在网上找来找去,也找不到相关的例子,只好自己做了。
经过多次测试,终于实现了,在这里总结一下,应该有人会用到。
(没有细研究,只能实现对Label,CommandButton,Frame控件的汉化处理)
 
1,首先要根据窗体创建INI文件。
Public Sub prCreateIni()  '根据窗体控件生成ini文件,可在文件中设置窗体显示字体
    
    Dim pFileName, pstr As String
    Dim pFileNum, pI
    
    pFileName = App.Path & "ini" & App.EXEName & "_lang_" & Me.Name & ".ini"
    pFileNum = FreeFile
    
    Open pFileName For Output As #pFileNum
 
    pstr = " "
    Print #pFileNum, pstr
 
    '设置节名
    pstr = "[" & Me.Name & "]"
    Print #pFileNum, pstr
 
    '设置窗体标题
    pstr = "  Form." & Me.Name & " = Me.Caption
    Print #pFileNum, pstr
    
    Dim pCtr As Control
    For Each pCtr In Me.Controls
 
        If (TypeOf pCtr Is Label) Or (TypeOf pCtr Is CommandButton) Or (TypeOf pCtr Is Frame) Or (TypeOf pCtr Is CheckBox) Then
            pstr = "  " & pCtr.Name & " = " & pCtr.Caption
            Print #pFileNum, pstr
        End If
 
    Next pCtr
 
    Close #pFileNum
    
    MsgBox "Ini file for [" & Me.Name & "] have created success!"
 
End Sub
然后,在窗体上添加一按钮,执行以下代码,对每个窗体生成ini文件
Private Sub Command1_Click() 
   form1.prCreateIni
   form2.prCreateIni
   form13.prCreateIni   
End Sub
将各窗体生成的ini文件合并,命名为App.EXEName_Lang.ini。保存目录:App.Pathini
生成的ini文件内容示例如下:
 
[COMMON]
  '此部分为公用过程,请直接添加
  LANGUAGE = CHINESE
  'LANGUAGE = JAPANESE
 
  '系统语言
  WINDOWS=CHINESE
  'WINDOWS=JAPANESE
 
  '控件caption字符集
  Proportional Font = Simsun
  'Proportional Font = MS PGothic
 
  '控件文体内容字符集
  Regular Font = Simsun
  'Regular Font = MS Gothic
  
[FORM1]
  cmdBatch = 批处理
  cmdCancel = 取消
  cmdSave = 保存
  lblMax = Max
  lblMin = Min
 
[FORM2]
  cmdBatch = Batch
  cmdCancel = Cancel
  cmdSave = Save
  lblMax = Max
  lblMin = Min
2,使用INI文件设置窗体显示:在每个窗体中添加以下过程,并在form_load中调用此过程。
Private Sub prSetDisplay()  '从INI文件中读取数据,设置窗体显示内容,需要在form_load中调用此过程
    'Read ini file to Set form display. ( Need add in FormLoad)
    '从INI文件中读取数据,设置窗体显示内容。(需要在FormLoad中调用此过程)
    
    Dim pIniFile$
 
    pIniFile = App.Path & "ini" & App.EXEName & "_Lang.ini"
    
    If Dir(pIniFile) = "" Then
        MsgBox "Ini file of [" & pIniFile & "] not found!"
        Exit Sub
    End If
 
    Dim pLang$, pPrp_Font, pReg_Font, pWin$
    Dim pCharset_data
 
    pLang$ = cfReadIniFile(pIniFile, "COMMON", "LANGUAGE") ' "JAPANESE" or "CHINESE"
    pPrp_Font = cfReadIniFile(pIniFile, "COMMON", "Proportional Font")
    pReg_Font = cfReadIniFile(pIniFile, "COMMON", "Regular Font")
 
    pWin$ = cfReadIniFile(pIniFile, "COMMON", "WINDOWS") ' "JAPANESE" or "CHINISE"
 
        If (pLang$ = "JAPANESE") And (pWin$ = "JAPANESE") Then
            pCharset_data = 1
        ElseIf (pLang$ = "JAPANESE") And (pWin$ = "CHINESE") Then
            pCharset_data = 1 '128
        ElseIf (pLang$ = "CHINESE") And (pWin$ = "CHINESE") Then
            pCharset_data = 1
        ElseIf (pLang$ = "CHINESE") And (pWin$ = "JAPANESE") Then
            pCharset_data = 128
        End If
 
    
    '使用示例
    'Label1(0).FontName = pPrp_Font
    'Label1(0).Font.Charset = pCharset_data
    'Label1(0).Caption = capt_data(1, 1)
    'txtPrt.FontName = reg_font
    
    Dim pCtr As Control
    Dim pSection As String
 
    pSection = Me.Name
    '设置窗体标题
    Me.Caption = cfReadIniFile(pIniFile, pSection, "Form." & Me.Name)
    '设置各控件标题
    For Each pCtr In Me.Controls
        If (TypeOf pCtr Is Label) Or (TypeOf pCtr Is CommandButton) Or (TypeOf pCtr Is Frame) Or (TypeOf pCtr Is CheckBox) Then
            ’pCtr.FontName = pPrp_Font
            ’pCtr.Font.Charset = pCharset_data
            pCtr.Caption = cfReadIniFile(pIniFile, pSection, pCtr.Name)
        End If
        'If (TypeOf pCtr Is SSTab) Then
            'pCtr.FontName = pPrp_Font
            'pCtr.Font.Charset = pCharset_data
            'pCtr.Caption = cfReadIniFile(pIniFile, pSection, pCtr.Name)
        'End If
    Next pCtr   
 
 
End Sub
3,需要以下过程支持,请将以下代码添加到公用模块中。
Public Function cfReadIniFile(iniFile$, header$, item$) As String    '从INI中读取数据
 
    Dim n As Integer
    Dim dat$, a$
    Dim flag As Boolean
 
    If Dir(iniFile$) = "" Then
        n = MsgBox("File:" + iniFile$ + " not found !!", vbCritical + vbOKOnly)
        End
    Else
        n = FreeFile
        flag = False
        dat$ = ""
        Open iniFile$ For Input As n
        Do While Not EOF(n)
            Line Input #n, a$
            a$ = Trim(CutQuote(a$))
            If a$ <> "" Then
                If Not flag Then
                    If UCase(a$) = "[" + UCase(header$) + "]" Then flag = True
                Else
                    If Left$(a$, 1) = "[" Then
                        Exit Do
                    Else
                        If UCase(GetItem(a$, 1)) = UCase(item$) Then
                            dat$ = GetItem(a$, 2)
                            Exit Do
                        End If
                    End If
                End If
            End If
        Loop
        Close #n
        cfReadIniFile = dat$
    End If
 
End Function
 
Public Function CutQuote(dat$) As String
 
    If Left$(dat$, 1) = "'" Then
        dat$ = ""
    End If
    CutQuote = dat$
 
End Function
 
Public Function GetItem(record$, orderNo) As String   'Get string from string which devides by commas
 
    Dim a$, item$
    Dim j, pnt
    Dim dqflag As Boolean
 
    item$ = "": pnt = 1: dqflag = False
    For j = 1 To Len(record$)
        a$ = Mid$(record$, j, 1)
        If a$ = Chr$(34) Then                 ' chr$(34) is bouble quotaion
            dqflag = Not dqflag
        End If
        If dqflag Then
            item$ = item$ + a$
        Else
            If (a$ = ",") Or (a$ = "=") Then
                If pnt = orderNo Then
                    Exit For
                Else
                    item$ = "": pnt = pnt + 1
                End If
            Else
                item$ = item$ + a$
            End If
        End If
    Next
    If pnt <> orderNo Then
        item$ = ""
    Else
        item$ = LTrim(RTrim(item$))
        If Left$(item$, 1) = Chr$(34) Then
            If Right$(item$, 1) = Chr$(34) Then item$ = Mid$(item$, 2, Len(item$) - 2)
        End If
    End If
    GetItem = item$
 
End Function
这样就可以了, 这样你可以修改ini文件中的各控件的caption,来设置窗体显示的字体内容了。
 
只要程序控件没有变化,即使程序修改了,我们不用再修改汉化了! 还是很方便的。 

 


Tag: VB技巧 编程 TTTBLOG
我也要发一个   ·   返回首页   ·   返回[VB]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[VB]   ·   返回顶部