Dùng tiếng Việt (Unicode) trong Snitz Forum!
cango@dactrung.com


Setup Snitz Forum   Sau khi download về, bạn phải unzip nó. Xin bạn vui lòng đọc cách install Snitz Forum trong readme.txt đã được kèm theo trong đó. Bạn cần phải chắc chắn rằng Snitz Forum chạy ngon lành trước khi bạn đi vào phần kế: setup tiếng Việt trong Snitz Forum! Bài viết này được viết khi Snitz Forum đang ở version 3.1 Service Release 4. Version khác có thể sẽ có thay đổi chút chút, nhưng nói chung, cách áp dụng tiếng Việt không có gì thay đỗi.

Đổi font.   Mở admin_login.asp và log vào. Trong Admin Section, bấm vào Font/Table Color Code Configuration. Trong phần Font Face Type: đánh vào "Tahoma, Verdana, Arial". Đây là những Unicode fonts thông dụng nhất, hy vọng rằng người xem đã có trong máy họ. Bấm vào Submit New Config để save vào database.

Lẽ ra chỉ cần đỗi font qua Unicode font thì forum phải hiển thị tiếng Việt ngon lành, nếu chúng ta đánh Unicode vào. Đâu có đơn giản như đang giỡn vậy đâu! Bắt đầu từ đây chúng ta sẽ phải handcode để sữa đổi một số files cần thiết. Bạn nên dùng Notepad (cái tui ưa chuộng là UltraEdit 32 vì nó có thể display line number) để edit những files này. Đừng mở nó bằng MS FrontPage! Bạn nên dùng text editor có thể hiện ra line number vì tôi sẽ dùng line number để giúp bạn insert cái code vô chỗ nào.

Column bên trái là tên những files bạn cần mở và sửa đổi. Hàng chữ màu xanh sẽ là những chữ bạn cần thêm vào. Bắt đầu đây!


inc_top.asp   Đây là phần đầu tiên trên mọi trang của Snitz Forum. Trước hết hãy bỏ cái code Session.Page = 65001 vào phần trên cùng hết dưới cái GNU General Public License của Snitz. (line # vào khoảng 37)

'## Harpswell, ME 04079
'#################################################################################
Session.CodePage = 65001
dim mLev, strLoginStatus

set my_Conn = Server.CreateObject("ADODB.Connection")
my_Conn.Open strConnString

Cái code này cho server biết là mình đang dùng Unicode trong những trang web. Chúng ta cần thêm vào cái meta tag để chỉ định webpage dùng utf-8. Vào khoảng line #81 thêm vào <META http-equiv=Content-Type content="text/html; charset=utf-8">:

Response.Write "<html>" & vbcrlf & vbcrlf & _
"<head>" & vbcrlf & _
"<title>" & strForumTitle & "</title>" & vbcrlf & _
"<meta name=""copyright"" content=""This code is Copyright (C) 2000 Michael Anderson and Pierre Gorissen"">" & vbcrlf
%>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<script language="JavaScript">
<!-- hide from JavaScript-challenged browsers

Vào khoảng line 104, thêm vào stylesheet "vietlist"

<style type=text/css>
<!--
a:link {color:<% =strLinkColor %>;text-decoration:<% =strLinkTextDecoration %>}
a:visited {color:<% =strVisitedLinkColor %>;text-decoration:<% =strVisitedTextDecoration %>}
a:hover {color:<% =strHoverFontColor %>;text-decoration:<% =strHoverTextDecoration %>}
input.radio {background: <% = strPopUpTableColor %>; color:#000000}
.vietlist { font-family: Tahoma, Verdana, Arial; font-size: 10pt; text-decoration: none}
-->
</style>

Save và close nó.


inc_top_short.asp   Cũng thêm cái meta tag vào khoảng line #56

<head>
<title><% =strForumTitle %></title>
<meta name="copyright" content="This code is Copyright (C) 2000 Michael Anderson and Pierre Gorissen">
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<Style><!--
a:link {color:<% =strLinkColor %>;text-decoration:<% =strLinkTextDecoration %>}
a:visited {color:<% =strVisitedLinkColor %>;text-decoration:<% =strVisitedTextDecoration %>}
a:hover {color:<% =strHoverFontColor %>;text-decoration:<% =strHoverTextDecoration %>}
--></style>


inc_function.asp   Đây là file chính để làm phần convert từ ViQR qua Unicode. Dưới cái GNU General Public License của Snitz. (line # vào khoảng 37) thêm vào function viết dưới dạng VBscript để làm phần conversion.

'## Snitz Communications
'## C/O: Michael Anderson
'## PO Box 200
'## Harpswell, ME 04079
'#################################################################################
Session.Codepage=65001
Function FormatUnicode(strUnicode)
'check string dde^? ti`m coi co' da.ng VIQR
ATest = Array("o^", "a^", "a(","a`","e^","e`","o*", "o+", "u*", "u+","o`","o~")
For i = 0 To UBound(ATest)

'ne^'u co' da.ng Viqr thi` convert no' qua Unicode
If Instr(1, strUnicode, ATest(i)) > 0 then
FormatUnicode = VIQR2Unicode(strUnicode)
Exit Function
End If
Next

FormatUnicode = strUnicode
End Function

Function VIQR2Unicode(strUnicode)

Aviqr = Array("''","a(`", "A(`", "a(?", "A(?", "a(~", "A(~", "a('", "A('", "a(.", "A(.", _
"a^`", "A^`", "a^?", "A^?", "a^~", "A^~", "a^'", "A^'", "a^.", "A^.", _
"e^`", "E^`", "e^?", "E^?", "e^~", "E^~", "e^'", "E^'", "e^.", "E^.", _
"o^`", "O^`", "o^?", "O^?", "o^~", "O^~", "o^'", "O^'", "o^.", "O^.", _
"o+`", "O+`", "o+?", "O+?", "o+~", "O+~", "o+'", "O+'", "o+.", "O*.", _
"o*`", "O*`", "o*?", "O*?", "o*~", "O*~", "o*'", "O*'", "o*.", "O*.", _
"u+`", "U+`", "u+?", "U+?", "u+~", "U+~", "u+'", "U+'", "u+.", "U+.", _
"u*`", "U*`", "u*?", "U*?", "u*~", "U*~", "u*'", "U*'", "u*.", "U*.", _
"A(", "A^", "E^", "O^", "O+", "U+", "U*", "DD", "-D", "Dd", "a(", "a^", _
"e^", "o^", "o+", "o*", "u+", "u*", "-d", "d-", "dd", "a`", "A`", _
"a?", "A?", "a~", "A~", "a'", "A'", "a.", "A.", "e`", "E`", _
"e?", "E?", "e~", "E~", "e'", "E'", "e.", "E.", "i`", "I`", _
"i?", "I?", "i~", "I~", "i'", "I'", "i.", "I.", "o`", "O`", _
"o?", "O?", "o~", "O~", "o'", "O'", "o.", "O.", "u`", "U`", _
"u?", "U?", "u~", "U~", "u'", "U'", "u.", "U.", "y`", "Y`", _
"y?", "Y?", "y~", "Y~", "y'", "Y'", "y.", "Y.")

Auni = Array("'",ChrW(7857), ChrW(7856), ChrW(7859), ChrW(7858), ChrW(7861), ChrW(7860), ChrW(7855), ChrW(7854), ChrW(7863), ChrW(7862), _
ChrW(7847), ChrW(7846), ChrW(7849), ChrW(7848), ChrW(7851), ChrW(7850), ChrW(7845), ChrW(7844), ChrW(7853), ChrW(7852), _
ChrW(7873), ChrW(7872), ChrW(7875), ChrW(7874), ChrW(7877), ChrW(7876), ChrW(7871), ChrW(7870), ChrW(7879), ChrW(7878), _
ChrW(7891), ChrW(7890), ChrW(7893), ChrW(7892), ChrW(7895), ChrW(7894), ChrW(7889), ChrW(7888), ChrW(7897), ChrW(7896), _
ChrW(7901), ChrW(7900), ChrW(7903), ChrW(7902), ChrW(7905), ChrW(7904), ChrW(7899), ChrW(7898), ChrW(7907), ChrW(7906), _
ChrW(7901), ChrW(7900), ChrW(7903), ChrW(7902), ChrW(7905), ChrW(7904), ChrW(7899), ChrW(7898), ChrW(7907), ChrW(7906), _
ChrW(7915), ChrW(7914), ChrW(7917), ChrW(7916), ChrW(7919), ChrW(7918), ChrW(7913), ChrW(7912), ChrW(7921), ChrW(7920), _
ChrW(7915), ChrW(7914), ChrW(7917), ChrW(7916), ChrW(7919), ChrW(7918), ChrW(7913), ChrW(7912), ChrW(7921), ChrW(7920), _
ChrW(258), ChrW(194), ChrW(202), ChrW(212), ChrW(416), ChrW(431), ChrW(431), ChrW(272), ChrW(272), ChrW(272), ChrW(259), ChrW(226), _
ChrW(234), ChrW(244), ChrW(417), ChrW(417), ChrW(432), ChrW(432), ChrW(273), ChrW(273), ChrW(273), ChrW(224), ChrW(192), _
ChrW(7843), ChrW(7842), ChrW(227), ChrW(195), ChrW(225), ChrW(193), ChrW(7841), ChrW(7840), ChrW(232), ChrW(200), _
ChrW(7867), ChrW(7866), ChrW(7869), ChrW(7868), ChrW(233), ChrW(201), ChrW(7865), ChrW(7864), ChrW(236), ChrW(204), _
ChrW(7881), ChrW(7880), ChrW(297), ChrW(296), ChrW(237), ChrW(205), ChrW(7883), ChrW(7882), ChrW(242), ChrW(210), _
ChrW(7887), ChrW(7886), ChrW(245), ChrW(213), ChrW(243), ChrW(211), ChrW(7885), ChrW(7884), ChrW(249), ChrW(217), _
ChrW(7911), ChrW(7910), ChrW(361), ChrW(360), ChrW(250), ChrW(218), ChrW(7909), ChrW(7908), ChrW(7923), ChrW(7922), _
ChrW(7927), ChrW(7926), ChrW(7929), ChrW(7928), ChrW(253), ChrW(221), ChrW(7925), ChrW(7924))

Aurl = Array("com", "net", "org", "htm", "html", "asp", "swf", "jpg", "gif")
'thay 2 spaces tha`nh 1 space
strUnicode = Replace(strUnicode, " ", " ")
strUnicode = Replace(strUnicode, "‘", "'")
strUnicode = Replace(strUnicode, "’", "'")

'ddo^~i da^'u na(.ng va` xuo^'ng ha`ng va` 3 da^'u cha^'m vo*'i \
For i = 0 To UBound(Aurl)
strUnicode = Replace(strUnicode, "." & Aurl(i), "\." & Aurl(i))
Next
strUnicode = Replace(strUnicode, "... ", "\... ")
'ddo^~i vietnet tha`nh VNI

For i = 0 To UBound(Aviqr)
strUnicode = Replace(strUnicode, Aviqr(i), Auni(i))
Next
'ddo^~i la.i dda^'u xuo^'ng ha`ng
strUnicode = Replace(strUnicode, "\\.", ".")
strUnicode = Replace(strUnicode, "\.", ".")
strUnicode = Replace(strUnicode, "\?", "?")
strUnicode = Replace(strUnicode, "'", "''")

'final Unicode string
VIQR2Unicode = strUnicode
End Function

function ChkUrls(fString, fTestTag, fType)
Dim strArray
Dim Counter
Dim strTempString

Nếu cái code này giống như đám rừng, bạn không cần phải lo. Làm ASP càng lâu, bạn sẽ học hỏi thêm về cách code ASP dùng VBscript. Bây giờ chúng ta save lại và đóng luôn.


post_info.asp   Đây là trang dùng khi user thêm vào, sửa đổi, hoặc trả lời các messages trong forum. Đây cũng là file chúng ta chú trọng tới phần conversion. Nếu để ý một chút bạn sẽ thấy có phần ChkString dùng rất nhiều trong file này. Chúng ta có thể "mượn" cái function đó để convert cho dễ, nhưng làm vậy nó sẽ chậm cái forum lại nhiều lắm, không nên chút nào. Chúng ta chỉ muốn nó thật sự convert khi mỗi khi ADD NEW, EDIT hoặc REPLY.

Phần đổi này nằm rải rác nhiều chỗ. Nói chung nó chỉ đổi txtMessage thành FormatUnicode(txtMessage) và txtSubject thành FormatUnicode(txtSubject). Tôi sẽ dùng line number để giúp bạn chỉ đổi những chỗ cần thiết.

Line #97: phần này dùng khi user edit message của họ.

'## Forum_SQL - Do DB Update
strSql = "UPDATE " & strTablePrefix & "REPLY "
strSql = strSql & " SET R_MESSAGE = '" & FormatUnicode(txtMessage) & "'"
if lcase(strEmail) = "1" then '**
if Request.Form("rmail") <> "1" then
TF = "0"
else
TF = "1"
end if
strSql = strSql & ", R_MAIL = " & TF
end if

Ở line 447 và 448: phần này dùng khi user đánh vào new message:

'## Forum_SQL - Add new post to Topics Table
strSql = "INSERT INTO " & strTablePrefix & "TOPICS (FORUM_ID"
strSql = strSql & ", CAT_ID"
strSql = strSql & ", T_SUBJECT"
strSql = strSql & ", T_MESSAGE"
strSql = strSql & ", T_AUTHOR"
strSql = strSql & ", T_LAST_POST"
strSql = strSql & ", T_LAST_POST_AUTHOR"
strSql = strSql & ", T_DATE"
strSql = strSql & ", T_STATUS"
if strIPLogging <> "0" then
strSql = strSql & ", T_IP"
end if
strSql = strSql & ", T_MAIL"
strSql = strSql & ") VALUES ("
strSql = strSql & Request.Form("FORUM_ID")
strSql = strSql & ", " & Request.Form("CAT_ID")
strSql = strSql & ", '" & FormatUnicode(txtSubject) & "'"
strSql = strSql & ", '" & FormatUnicode(txtMessage) & "'"
strSql = strSql & ", " & rs("MEMBER_ID")
strSql = strSql & ", '" & DateToStr(strForumTimeAdjust) & "'"
strSql = strSql & ", " & rs("MEMBER_ID")
strSql = strSql & ", '" & DateToStr(strForumTimeAdjust) & "'"

Và ở line #521: khi người ta reply tới một message:

if not(chkForumAccess(Request.Form("FORUM_ID"))) then
Go_Result "You are not allowed to post in this forum !", 0
end if

txtMessage = ChkString(Request.Form("Message"),"message")
txtMessage = FormatUnicode(txtMessage)

if txtMessage = " " then
Go_Result "You must post a message!", 0


inc_jump_to.asp   Đây là phần menu giúp bạn nhãy từ phần này qua phần khác trong Forum. Đễ giúp cái jump menu này hiển thị Unicode, chúng ta bỏ cái stylesheet "vietlist" đã thêm vào trong trang inc_top.asp.

Ở line 42, đỗi:

<select name="SelectMenu" size="1" onchange="jumpTo(this)">

thành:

<select name="SelectMenu" class="vietlist" onchange="jumpTo(this)">


Phần Kết.   Vậy là xong!!!! bạn có thử post bằng VIQR xem nó có convert không?

Trong cái file bạn d/l ở trên đã có đủ mọi files cần thiết đễ bạn bắt tay vào làm một forum tiếng Việt dùng Unicode. Nên nhớ những files này chỉ đúng với Snitz Forum version 3.1 Service Release 4. Bạn cần phải manual edit nó nếu như bạn dùng với version khác.

Hy vọng bạn sẽ thành công trong việc thiết lập một diễn đàn tiếng Việt.


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com