不管開始寫網頁或已完成的ASPX繁體網站,
要轉簡體版都是一件"繁"人的工作.
早期並不是沒想到國際化, 只因為案子在趕
只好用複製ASPX的方式, 所幸ASPX.VB程式邏輯
都一樣, 就這樣一個專案不知不覺寫到了快80MB,
一千多支程式維護起來己經不容易還要考慮簡體版同步更新......
這下子只好重新思考簡繁同體, 畢竟程式像個活體,
隨著商業流程一直在擴充及修改.
要同時支援繁簡體並不困難,
只是戲法人人會變,各有巧妙不同.
剛開始用正統的國際化寫法,
可是一下子就打退堂鼓了, 原因無他, 程式太大了,
如果都用資源檔Resource Files, 光讀取這個XML檔
並找到對應文字就不知Performance會降到什麼程度,
更別說要如何建立三組龐大的對應文字.
(如果你的專案不大, 而且有第三種以上的語言需求,
建立資源檔Resource Files倒不失為一個好方法).
如果在資料庫建對照表, 尋找對應的速度應該會比較快,
但維護對照表倒不是個很好的經驗. 而且會影响資料庫及網路效能.
言歸正傳, 我目前簡繁同體進行之方法如下:
適用環境:
VS.NET 2003 - VB.NET
1. ASPX Title 部份寫一支共用vb function :
Public Shared Function GetTile(ByVal v_til As String) As String
Dim Tile As String = v_til
Dim v_cult As String = System.Configuration.ConfigurationSettings.AppSettings("Location").ToString()
If v_cult = "zh-CN" Then
Tile = StrConv(Tile, VbStrConv.SimplifiedChinese, 2052)
End If
Return Tile
End Function
註: Web.config 中的appsettings增加:
繁體或簡體手動設定
<appSettings>
<add key="Location" value="zh-CN"/>
......
</appSettings>
在ASPX之HTML中TITLE改成:
<TITLE>
<% =myfuntion.GetTile("購物車明細資料")%>
</TITLE>
2. 把ASPX中不是runat="server"之繁體文字改為
label物件 並加 runat="server"
3. 在所有*.ASPX.VB程式中的Page_Load加入呼叫
Label, CheckBox 及DataGrid轉換Function:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Decode_lab(Me.Controls.Item(0))
End If
End Sub
加一個共用轉換Function:
Public Shared Function Decode_lab(ByVal v_control As Object) As Boolean
Dim v_cult As String = System.Configuration.ConfigurationSettings.AppSettings("Location").ToString()
If v_cult = "zh-CN" Then
Dim iii As Integer
Dim v_labt As String
Dim v_labn As String
For iii = 0 To v_control.Controls.Count - 1
v_labt = v_control.Controls.Item(iii).GetType.Name
If v_labt = "Label" Then
v_labn = v_control.Controls.Item(iii).id
Dim v_lab As Label = CType(v_control.FindControl(v_labn), Label)
v_lab.Text = StrConv(v_lab.Text, VbStrConv.SimplifiedChinese, 2052)
End If
If v_labt = "DataGrid" Then v_labn = v_control.Controls.Item(iii).id
Dim v_grd As DataGrid = CType(v_control.FindControl(v_labn), DataGrid)
Dim iv As Integer
Dim v_grdtc As TemplateColumn
Dim v_grdbc As BoundColumn
For iv = 0 To v_grd.Columns.Count - 1
If v_grd.Columns(iv).GetType.Name = "TemplateColumn" Then
v_grdtc = CType(v_grd.Columns(iv), TemplateColumn)
v_grdtc.HeaderText = StrConv(v_grdtc.HeaderText, VbStrConv.SimplifiedChinese, 2052)
End If
If v_grd.Columns(iv).GetType.Name = "BoundColumn" Then
v_grdbc = CType(v_grd.Columns(iv), BoundColumn)
v_grdbc.HeaderText = StrConv(v_grdbc.HeaderText, VbStrConv.SimplifiedChinese, 2052)
End If
Next
End If
If v_labt = "CheckBox" Then
v_labn = v_control.Controls.Item(iii).id
Dim v_chk As CheckBox = CType(v_control.FindControl(v_labn), CheckBox)
v_chk.Text = StrConv(v_chk.Text, VbStrConv.SimplifiedChinese, 2052)
End If
Next
End If
Return True
End Function
至此轉換工作即可告一段落, 剩下的Crystal報表可以參考我用VFP寫的轉換
(
http://roxsu.blogspot.com/2007/06/crystal-reportrpt.html)
至於圖檔方面就自己慢慢來吧...
沒有留言:
張貼留言