惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

博客园 - o0myself0o

利用线程池实现多客户端和单服务器端Socket通讯(二):异步编程模型实现 生产者消费者模式,代码中碰到的疑问(已解决) 利用线程池实现多客户端和单服务器端Socket通讯(一):同步方式 Entity Framework 4.0 ObjectContext下的各种方法实践 题目:若干个不重复数,打乱顺序输出 wtf js(四) - o0myself0o - 博客园 wtf js(三) number的类型不是number wtf js(二) 算法:给定两个已从小到大排好序的整型数组arrA和arrB,将两个数组合并成arrC,使得arrC也要按从小到大的顺序排好序 应用中的单例模式 面试题:给你三个bool类型变量a, b, c,判断至少有两个为true javascript面向对象编程(一) - o0myself0o - 博客园 wtf js(一) - o0myself0o - 博客园 社区网站功能实现系列(三):社区页面无刷新回发的一种实现方式 社区网站功能实现系列(二):社区内容分享到别的SNS 反射获取Class中Property的值 A*寻路初探 闲谈ASP.NET 2.0缓存技术 使用 jQuery 简化 Ajax 开发
社区网站功能实现系列(一):多国语言的实现
o0myself0o · 2010-02-24 · via 博客园 - o0myself0o

                  社区网站功能实现系列(一):多国语言的实现

相信大家也见过很多网站有多国语言版本,点击一个链接就能轻松的切换。下面我就来简单讲一下,在我们所做的项目中,这种功能的实现方式。

首先要明白,这只是在网站加载的时候, 这些以文字方式显示的内容,根据从配置文件中(或者缓存中)获取到的条件(要显示那种语言),来对应显示的。也就是将原本固定死的文字用类似于<%= 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(也就是要显示的内容),这样就实现了在同一个站点下,多国语言的自由切换。