一直以来多语言问题都是个让人头疼的问题,不是这个问题有多难,而是很繁琐,而我们目前的这个项目有点特殊,我希望最大限度的化繁为简,以下是我解决这个问题的方案。
我们的项目有这样两个前提:
1、要支持多语言但最多三种语言,一般情况下就两种语言,所以并没有随时切换语言的要求。
2、我们希望有一种可以初期不用管语言问题,之后统一翻译的方案
基于这么两点,我们提出了这样的方案:
1、初期写程序时不用关心多语言的翻译工作,只要将所有使用到中文的地方都用{}扩上
2、在数据库中Chinese会设置为唯一约束
3、所有的翻译工作会在BasePage中的Render方法中作
4、所有的页面会继承BasePage
5、翻译时会根据当前的语言设置构建以language表中Chinese做key,相应的语言为value的字典,然后查找需要翻译的字符串是不是在字典中,如果不在就生成这一行。

数据库设计四个字段

ID,Chinese,English,Other

BasePage源码

BasePage
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;

/// <summary>
///BasePage 的摘要说明
/// </summary>
public class BasePage : System.Web.UI.Page
{
    //利用Dictionary来筛选所有的多语言标签,然后做替换,可以缓存
    Dictionary<string, string> dic;
    public BasePage()
    {

}
    //需要替换的标签,标签头为数字字母下划线汉字

static readonly Regex re = new Regex
        (@"((\{)|(\%7B))[\w\-\+\|u4e00-\u9fa5]+?((\})|(\%7D))",
        RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);

//不需要替换的标签
    static readonly Regex re_nr = new
        Regex(@"<NOREPLACE>[\w\W]*?</NOREPLACE>", RegexOptions.Multiline | RegexOptions.IgnoreCase);

private string RenderTag(ref string content)
    {
        if (re_nr.IsMatch(content))//不需要替换标签
        {
            StringBuilder sb = new StringBuilder();

MatchCollection grouplist = re_nr.Matches(content);
            string[] reList = re_nr.Split(content);

for (int i = 0; i < grouplist.Count; i++)
            {
                sb.Append(ReplaceTag(ref reList[i]));
                sb.Append(grouplist[i].Value);
                sb.Append(ReplaceTag(ref reList[i + 1]));
            }

content = sb.ToString();
        }
        else
        {
            content = ReplaceTag(ref content);
        }
        return content;
    }

private string ReplaceTag(ref string content)
    {
        //模板标签{yes},{no},{search}
        MatchCollection mc = re.Matches(content);

if (dic == null)
        {
            dic = LanguageManager.GetResource();
        }

for (int i = 0; i < mc.Count; i++)
        {
            //如果数据库中还没有此字符串
            if (!dic.ContainsKey(mc[i].Value.TrimStart('{').TrimEnd('}')))
            {
                 content = content.Replace(mc[i].Value, mc[i].Value.TrimStart('{').TrimEnd('}'));

if (!dic.ContainsKey(mc[i].Value.TrimStart('{').TrimEnd('}')))
                {
                    LanguageManager.AddLanguageString(mc[i].Value.TrimStart('{').TrimEnd('}'));
                }
            }
            else if (dic[mc[i].Value.TrimStart('{').TrimEnd('}')] == null)
            {
                content = content.Replace(mc[i].Value, "$$$$");
            }
            else
            {

content = content.Replace(mc[i].Value, dic[mc[i].Value.TrimStart('{').TrimEnd('}')].ToString());

}
        }
        
        return content;
    }
    protected override void Render(HtmlTextWriter writer)
    {

Stopwatch stopwatch = new Stopwatch();
        stopwatch.Reset();
        stopwatch.Start();
        try
        {
            //会把页面的输出结果存储在这个StringBuilder中
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            base.Render(htw);
            string content = sb.ToString();

content = RenderTag(ref content);

//重新写入页面
            writer.Write(content);

}
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
            Response.End();
        }
        finally
        {
            stopwatch.Stop();
            Response.Write("runtime:" + stopwatch.ElapsedMilliseconds.ToString() + "ms");
        }

}
}

这样设计的
优点
1、初期写程序时不用关心多语言的翻译工作,只要将所有使用到中文的地方都用{}扩上
2、省去了大量命名相应文字的工作
3、直接用中文标示要显示到页面的文字,容易理解

缺点
1、如果中文是一样的翻译,而其他语言翻译却不一样时不好解决,但这种情况似乎不常见

源码下载

一种特殊的多语言解决方案相关推荐

  1. c语言xyz最小值,有关问题XYZ的10种语言解决方案(一)之C语言篇

    问题XYZ的10种语言解决方案(一)之C语言篇 写这篇,或者这个系列的无聊博客文章完全是由于昨晚没事瞎想想到的,本来是在思考<Learn you a Hashkell for Great Goo ...

  2. C语言中几种报错类型的解决方案

    C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...

  3. 快来,这里有23种设计模式的Go语言实现

    摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...

  4. 九种 OOM 常见原因及解决方案(IT枫斗者)

    九种 OOM 常见原因及解决方案(IT枫斗者) 什么是OOM? OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",来源于java.lan ...

  5. iOS多语言解决方案全面指南

    本文以及相关工具和代码旨在为已上线的iOS项目提供一种快速支持多语言的解决方案.由于文案显示是通过hook实现的,因此对App的性能有一定影响:除了特殊场景的文案显示需要手动支持外,其他任务均已实现自 ...

  6. c语言中手机系统,一种手机课堂C语言编程系统的制作方法

    技术特征: 1.一种手机课堂C语言编程系统,其特征在于:该系统由手机端C语言编译运行单元.嵌入式主机端传输单元.台式机端显示单元和投影仪端显示单元组成:所述手机端C语言编译运行单元.嵌入式主机端传输单 ...

  7. .netcore多语言解决方案

    .netcore多语言解决方案 参考文章: (1).netcore多语言解决方案 (2)https://www.cnblogs.com/ives/p/language.html 备忘一下.

  8. 常见几种浏览器兼容性问题与解决方案

    常见几种浏览器兼容性问题与解决方案 参考文章: (1)常见几种浏览器兼容性问题与解决方案 (2)https://www.cnblogs.com/lmaster/p/6385035.html 备忘一下.

  9. python 是什么类型的语言-python是一种什么类型的语言

    小时不识月,呼作白玉盘.很多人习惯地说Python不过是一种脚本语言而已,实际上这种说法是非常不准确的,完全不能体现出Python的强大. 严格来说,Python是一门跨平台.开源.免费的解释型高级动 ...

  10. ANTLR入门:构建一种简单的表达语言

    这是该系列的第一篇文章. 本系列的目的是描述如何创建有用的语言和所有支持工具. 在本文中,我们将开始研究一种非常简单的表达语言. 我们将在语言沙箱中构建它,因此我们将其称为语言Sandy . 我认为工 ...

最新文章

  1. python笔记day4
  2. DNS解析过程详解【转】
  3. 【bzoj3866】The Romantic Hero dp
  4. 计算机视觉和模式识别领域SCI期刊介绍
  5. 海思Hi3519A 进行4k60 h264编码帧率不足的问题
  6. n皇后问题java版
  7. [STL]List的实现
  8. java中算两个时间内的秒数_java – Joda Time – 计算两个日期之间的秒数会引发异常....
  9. 【拉普拉斯机制代码实现demo】差分隐私代码实现系列(四)
  10. html按照字数分页,纯javascript实现分页(两种方法)
  11. 2018-10-11
  12. 反直觉的一个游戏 - 三门问题 (Monty Hall problem)
  13. Oracle vm visualbox虚拟机双网卡设置-解决主机无法连接靶机的问题
  14. 爱因斯坦说过的名言,我的一些理解(一)
  15. 自然语言词向量模型:Glove和Bert
  16. 量化评价和质化评价举例_什么是量化评价?什么是质性评价?两者各有哪些优缺点...
  17. nginx安装配置 linux
  18. 辩证唯物论和唯物辩证法区别
  19. Matlab App Designer 中表格的操作
  20. 【MATLAB】基本数学操作

热门文章

  1. 【已解决】Ubuntu 12.04 LTS Source安装nodejs时出现bash ./configure permission denied
  2. python之绘制图形库turtle
  3. 多人操作sqlite3数据库冲突问题解决方法
  4. Seek and Destroy
  5. E - What Is Your Grade?
  6. 当前网络存在的安全问题
  7. CA SDK 使用简介
  8. gan网络损失函数_生成对抗网络的最新研究进展
  9. Listen 0.0.0.0:80 Listen [::0]:80
  10. 携手英特尔,百度开放云将提供更强悍云服务