社区网站功能实现系列(一):多国语言的实现
相信大家也见过很多网站有多国语言版本,点击一个链接就能轻松的切换。下面我就来简单讲一下,在我们所做的项目中,这种功能的实现方式。
首先要明白,这只是在网站加载的时候, 这些以文字方式显示的内容,根据从配置文件中(或者缓存中)获取到的条件(要显示那种语言),来对应显示的。也就是将原本固定死的文字用类似于<%= GetTextString(SNET.Network.Entities.LanguageKey.Edit_Video) %>来替代。
下面我来讲下GetTextString方法的实现方式。
1. 因为GetTextString几乎在每个页面上都要使用到,所以,将它放入Page的base方法中。
public string GetTextString(int key)
{
return SNET.Network.Controllers.NetworkBaseController.GetTextString(key, NetworkLanguageID);
}
NetworkLanguageID是base中的一个属性,就是当前站点的语言种类,在Cache中获得。
2. GetTextString(int, int)方法的实现:
/// <summary>
/// 根据语言类别和该类语言下的KEY来获取字符串信息
/// </summary>
/// <param name="intLanguageID">当前语言的ID</param>
/// <param name="key">语言KEY</param>
/// <returns></returns>
public static string GetTextString(int intLanguageID, int key)
{
switch (intLanguageID)
{
case LanguageIDsIndentifier.CHINESE_SIMPLIFIED:
if (LanguageCache_zh_CN == null)
{
lock (objLanguageKey)
{
if (LanguageCache_zh_CN == null)
{
LanguageCache_zh_CN = new Dictionary<int, string>();
AddCacheZhCN();
}
}
}
return LanguageCache_zh_CN[key];
case LanguageIDsIndentifier.ENGLISH_US:
if (LanguageCache_en_US == null)
{
lock (objLanguageKey)
{
if (LanguageCache_en_US == null)
{
LanguageCache_en_US = new Dictionary<int, string>();
AddCacheEnUS();
}
}
}
return LanguageCache_en_US[key];
case LanguageIDsIndentifier.VIETNAMESE:
if (LanguageCache_vi_VN == null)
{
lock (objLanguageKey)
{
if (LanguageCache_vi_VN == null)
{
LanguageCache_vi_VN = new Dictionary<int, string>();
AddCacheViVN();
}
}
}
return LanguageCache_vi_VN[key];
case LanguageIDsIndentifier.CHINESE_TRADITIONAL:
if (LanguageCache_zh_CN_HK == null)
{
lock (objLanguageKey)
{
if (LanguageCache_zh_CN_HK == null)
{
LanguageCache_zh_CN_HK = new Dictionary<int, string>();
AddCacheZhCNHK();
}
}
}
return LanguageCache_zh_CN_HK[key];
case LanguageIDsIndentifier.JAPANESE:
if (LanguageCache_jp_JP == null)
{
lock (objLanguageKey)
{
if (LanguageCache_jp_JP == null)
{
LanguageCache_jp_JP = new Dictionary<int, string>();
AddCacheJP();
}
}
}
return LanguageCache_jp_JP[key];
default:
if (LanguageCache_zh_CN == null)
{
lock (objLanguageKey)
{
if (LanguageCache_zh_CN == null)
{
LanguageCache_zh_CN = new Dictionary<int, string>();
AddCacheZhCN();
}
}
}
return LanguageCache_zh_CN[key];
}
}
如果Cache中没有这个语言包下的文字内容,则通过方法AddCacheZhCN (AddCacheEnUS,AddCacheViVN,AddCacheZhCNHK,AddCacheJP)将所有该语言包下的文字内容添加到Cache中,再获取当前给定key对应的值并返回。
3. AddCacheZhCN方法的实现
public static void AddCacheZhCN()
{
string strZhCN = File.ReadAllText(System.Web.HttpContext.Current.Server.MapPath(LanguageResourceIdentifier.PATH_ZH_CN));
if (LanguageCache_zh_CN == null)
{
LanguageCache_zh_CN = new Dictionary<int,string> ();
}
LanguageCache_zh_CN = GetLanguageCache(strZhCN);
}
strZhCN是存放该语言(简体中文)的内容文件的路径,该文件(Resources/zh-CN.json)的格式为:
[
{Key:1,Value:"帐号无法使用,请联系管理员。"},
{Key:2,Value:"关于"},
{Key:3,Value:"关于活动"},
{Key:4,Value:"关于圈子"},
……,
……,
{Key:1729,Value:"详情请点击以下的链接:"}
]
4. GetLanguageCache(string)方法的实现
public static Dictionary<int, string> GetLanguageCache(string strJson)
{
Dictionary<int, string> languageCache = new Dictionary<int, string>();
SNET.MultilLanguage.Entity.MultilLanguage objlanguage = new SNET.MultilLanguage.Entity.MultilLanguage();
List<object> listLanguage = SNET.Common.DataAccessHelper.JSONHelper.GetJSONList(objlanguage.GetType(), strJson);
for (int i = 0; i < listLanguage.Count; i++)
{
objlanguage = (SNET.MultilLanguage.Entity.MultilLanguage)listLanguage[i];
languageCache.Add(objlanguage.Key, objlanguage.Value);
}
objlanguage = null;
return languageCache;
}
SNET.Common.DataAccessHelper.JSONHelper.GetJSONList(Type, string)是一个将json字符串反序列化的方法。具体实现略。
5. 这样就将文件形式的语言包以键值对的形式(dictionary)缓存了起来,传入key,再配合以当前环境的LanguageID,确定是哪一个语言包文件,从相应的缓存中获取该key对应的value(也就是要显示的内容),这样就实现了在同一个站点下,多国语言的自由切换。