ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现
四、多語言的實現(xiàn)
??? 上一章講的是如何實現(xiàn)與數(shù)據(jù)的連接,本章來講一下多語言是如何實現(xiàn)的。
??? 現(xiàn)在很多公司都已經(jīng)開展了國際化的運作,所以多語言的支持已經(jīng)成為必須要考慮的一個因素,現(xiàn)在能真正實現(xiàn)多語言的系統(tǒng)大多都比較昂貴。
??? 本系統(tǒng)的多語言支持直接得益于asp.net本身,它們本身都是使用UTF-8格式來存儲,不是傳統(tǒng)的本地編碼。在asp.net頁面中,每個控件都可以為多個國家字符集指定不同的字符串,但是這種方式不太靈活,特別是很多內(nèi)容都是從數(shù)據(jù)庫中拼湊出來的時候。為此我采用了另外一種方式,類似于資源文件,只是直接把內(nèi)容寫入了web.config中,這樣以明文的形式來存儲,并且web.config文件更改后,網(wǎng)站可以實現(xiàn)自動更新,不需要重新起動IIS。
??? 在web.config中,存儲多語言的部分如下例:
??????? <add key="STRING_EN_內(nèi)容管理" value="Content" />
??????? <add key="STRING_EN_系統(tǒng)管理" value="System" />
??????? <add key="STRING_EN_權(quán)限管理" value="Privilege" />
??????? <add key="STRING_RU_內(nèi)容管理" value="содержание" />
??????? <add key="STRING_RU_系統(tǒng)管理" value="Система" />
??????? <add key="STRING_RU_權(quán)限管理" value="привилегированность" />
??? 可以看出,是直接對<appSettings>進行的擴展使用,沒有建立新的段,key分成三部分:
??????? u STRING
??????? u EN / RU
??????? u 需要翻譯的中文
??? STRING用來標識,在后面的程序中會用到,而EN表示需要翻譯成何種語言,如果您需要其它語種,只要在這里指定即可,如上例就是指定了英文和俄文兩個語言,加上默認的中文,共有三種語言支持。最后只要把翻譯的結(jié)果寫在value這個屬性里即可。
??? 在配置了這個文件后,看起來以后每寫一個asp.net頁面都需要寫很多的程序去翻譯里面的字符,其實不是這樣的,我還定義了一個基類,繼承自Page,命名為local,在這個頁面的Page_Load函數(shù)中,自動搜索頁面中所包括的各種控件,比如文本框,標簽,按鈕,甚至圖片框等,然后根據(jù)當前指定的語言(可由Session中尋找,也可以由Post中查看),選擇相對應(yīng)的翻譯,就實現(xiàn)了多語言。
??? 上面也提到了圖片框,在多語言環(huán)境中,很多圖片里都固化了本地的文字,所以對圖片也需要替換。我在網(wǎng)站的images目錄中,根據(jù)不同的語言增加了相應(yīng)的子目錄,如images/EN images/RU 等等,在翻譯的時候,會把圖片的路徑由 images/a.gif 拼接成 images/EN/a.gif這種樣式,就實現(xiàn)了圖片的自動替換,當然前提是您已經(jīng)準備了充足的圖片用于替換。
??? 取得頁面中的所有控件可以用下面的函數(shù):
foreach(Control control in parent.Controls)
{
}
??? 在數(shù)據(jù)庫中,有一個專門的表ZR_LANG來存儲當前系統(tǒng)所支持的語言,在登錄界面(包括前端和后端)都會從這里判斷,多語言選擇需要支持哪些語言。
??? 如果頁面的標題寫在asp.net的頁面里,那么是不能利用上面的方式來翻譯的,所以我專門做了一個Label,來存放標題的內(nèi)容,然后在頁面中按如下方式來引用標題:
<HTML> <HEAD> <title><%=lblTitle.Text%></title> ….
??? 這樣在運行后,就可以實現(xiàn)正確的標題的翻譯了。
??? 關(guān)于Grid表格,對于Caption的翻譯,并不難做,但是需要根據(jù)不同的語言,對Grid中的實際內(nèi)容進行翻譯,這是比較難做的,我在這里用了一個小技巧來實現(xiàn):把Grid中需要翻譯內(nèi)容的列的前面加一個空格,在實際工作中,遇到有空格的列,就表明其中的內(nèi)容需要翻譯,然后就一條條的翻譯過來即可。為什么加一個空格呢,首先,它不會對顯示有什么影響,另外,這樣也可以區(qū)別對待,不需要翻譯的列,就不需要使用此方式來占用過多的時間了。以下兩個函數(shù)處理此事,請參考:
public static void LocalGrid(ref System.Web.UI.WebControls.DataGrid grid)
{
System.Web.UI.Page page = new System.Web.UI.Page();
if (page.Session["__LANGUAGE__"] != null)
{
if (page.Session["__LANGUAGE__"].ToString() == "TW" || page.Session["__LANGUAGE__"].ToString() == "EN")
{
string lang = page.Session["__LANGUAGE__"].ToString();
foreach( System.Web.UI.WebControls.DataGridColumn column in grid.Columns )
{
string text = column.HeaderText;
if (System.Configuration.ConfigurationSettings.AppSettings["STRING_" + lang + "_" + text] != null)
{
text = System.Configuration.ConfigurationSettings.AppSettings["STRING_" + lang + "_" + text];
}
else
{
if (lang == "TW")
{
text = Big5.GetBig5Code(text);
}
}
column.HeaderText = text;
}
}
}
}
/// <summary>
/// 本地化一個GRID里的內(nèi)容
/// </summary>
/// <param name="grid">表格</param>
public static void LocalGridContent(ref System.Web.UI.WebControls.DataGrid grid)
{
System.Web.UI.Page page = new System.Web.UI.Page();
if (page.Session["__LANGUAGE__"] != null)
{
ArrayList cols = new ArrayList();
int i = 0;
foreach( System.Web.UI.WebControls.DataGridColumn column in grid.Columns )
{
string text = column.HeaderText;
if (text.Substring(0,1) == " ")
{
column.HeaderText = Tran(column.HeaderText);
cols.Add(i);
}
i++;
}
if (cols.Count > 0)
{
int cnt = grid.Items.Count;
for (int j = 0; j < cnt; j++)
{
foreach(object col in cols)
{
int colNumber = (int)col;
string content = grid.Items[j].Cells[colNumber].Text ;
content = Tran(content);
grid.Items[j].Cells[colNumber].Text = content;
}
}
}
}
}
??? 到此,已經(jīng)基本講了多語言的一些實現(xiàn)方式,在后面一節(jié)會來重點講一下本系統(tǒng)的控件結(jié)構(gòu)。
本文轉(zhuǎn)自Aicken(李鳴)博客園博客,原文鏈接:http://www.cnblogs.com/isline/archive/2010/04/17/1714211.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE逻辑DATAGUARD创建表
- 下一篇: 【零基础】Python的入门学习