可在配置文件中做,如language.xml,可保持页面统一

解决方案 »

  1.   

    參考http://www.hackhome.com/InfoView/Article_189360_2.html
      

  2.   

    使用可以本地化的2个资源文件是一种比较简单的方式. 用VS2005可以一键实现本地化转换(当然你还要手工调一些东西),它会自动生成一个资源文件,你按照命名规范自己再做一个就可以了,然后在你的资源文件里面翻译每个项.参考.Net Framework SDK的ASP.NET 2.0快速入门,其中的本地化一节有介绍.
      

  3.   

    我也是这么做的,这样很方便。当你添加新的页面时,只改一下xml文件就行了。
      

  4.   

    我做过。http://topic.csdn.net/u/20080226/15/0e00372f-8bdc-450c-ba51-32b7ec0a9636.html  
    楼主一定要看这帖子。里面有我回答的。不看后悔。多国语言版的。 把分都给我吧。这个保证你满意
    我给你找找那个转换语言类吧。希望对你有帮助,我要分。多给点language类using System;
    using System.Data;
    using System.Web;
    using System.Collections;
    using System.IO;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using FSSoft.Common;
    using FSSoft.Common.IO;
    using FSSoft.Common.TextUtil;
    namespace FSSoft.Web.UI
    {
        /// <summary>
        /// 多語言操作類。
        /// </summary>
        public sealed class Language
        {
            private static readonly string SessionKey=typeof(Language).FullName;
            /// <summary>
            /// 存储或取得預載入語言信息的相關配置文件的絕對路徑集合。
            /// </summary>
            public static ArrayList config_Load_Paths=new ArrayList();        private static short sysOnlySingleLanguageKBN_Value=-1;
            /// <summary>
            /// 配置系統只採用單一語言(默認採用多語言)。
            /// </summary>
            /// <res>若系統採用多語言則值為-1。</res>
            public static short SysOnlySingleLanguageKBN_Value
            {
                set
                {    
                    if(value!=-1)
                    {
                        short[] LanguageKBNValues=(short[])Enum.GetValues(typeof(LanguageKBN));
                        bool legality=false;
                        foreach(short LanguageKBNValue in LanguageKBNValues)
                        {
                            if(LanguageKBNValue==value)
                            {
                                legality=true;
                                break;
                            }
                        }
                        if(!legality)
                        {
                            throw new Exception(consts_Web.UI_LANGUAGE_EX_INFO4);
                        }
                    }
                    sysOnlySingleLanguageKBN_Value=value;
                }
                get
                {
                    return sysOnlySingleLanguageKBN_Value;
                }
            }
                    private static DataSet[] ds=null;
            private static DataSet DS(string configName)
            {
                if(ds==null&&config_Load_Paths.Count>0)
                {
                    ds=new DataSet[config_Load_Paths.Count];
                    try
                    {
                        for(int i=0;i<config_Load_Paths.Count;i++)
                        {
                            ds[i]=XMLUtil.InitXml((string)config_Load_Paths[i]);
                        }
                    }
                    catch(Exception e)
                    {
                        ds=null;
                        throw e;
                    }
                }
                foreach(DataSet getds in ds)
                {
                    if(getds.DataSetName==configName)
                    {
                        return getds;
                    }
                }
                throw new Exception(string.Format(consts_Web.UI_LANGUAGE_EX_INFO3,configName));
            }
            /// <summary>
            /// 设置或取得用户当前语言设置。
            /// </summary>
            public static LanguageKBN Current
            {
                set
                {
                    HttpContext.Current.Session.Add(SessionKey,value);
                }
                get
                {
                    if(sysOnlySingleLanguageKBN_Value!=-1)
                        return (LanguageKBN)Enum.Parse(typeof(LanguageKBN),sysOnlySingleLanguageKBN_Value.ToString());
                    if(HttpContext.Current.Session[SessionKey]==null)
                    {
                        string CurrentLanguage=HttpContext.Current.Request.UserLanguages[0];
                        switch(CurrentLanguage.Substring(0,2))
                        {
                            case "zh":
                                if(CurrentLanguage=="zh-cn")
                                    return LanguageKBN.CHS;
                                else
                                    return LanguageKBN.CHT;
                            case "ja":
                                return LanguageKBN.JP;
                            case "ko":
                                return LanguageKBN.KR;
                            default:
                                return LanguageKBN.EN;
                        }
                    }
                    else
                    {
                        return (LanguageKBN)HttpContext.Current.Session[SessionKey];
                    }
                }
            }
            /// <summary>
            /// 根據Msg.config内已有的key進行文本的取得。
            /// </summary>
            /// <param name="key">文本對應的key。</param>
            /// <returns>返回文本值。</returns>
            public static string Msg(string key)
            {
                return TAG_Value(key,consts_Web.UI_LANGUAGE_CONFIG_MSG_NAME);
            }
            /// <summary>
            /// 根據Msg.config内已有的key以及指定的語言區分進行文本的取得。
            /// </summary>
            /// <param name="key">Msg.config内已有的key。</param>
            /// <param name="languagekbn">指定的語言區分對象。</param>
            /// <returns>返回文本值。</returns>
            public static string Msg(string key,LanguageKBN languagekbn)
            {
                return TAG_Value(key,consts_Web.UI_LANGUAGE_CONFIG_MSG_NAME,true,languagekbn);
            }
            /// <summary>
            /// 根據*.config内已有的key進行文本的取得。
            /// </summary>
            /// <param name="key">文本對應的key。</param>
            /// <param name="configName">*对应名称</param>
            /// <returns>返回文本值。</returns>
            public static string TAG_Value(string key,string configName)
            {
                return TAG_Value(key,configName,false,LanguageKBN.EN);
            }
      

  5.   

    /// <summary>
            /// 根據*.config内已有的key進行文本的取得。
            /// </summary>
            /// <param name="key">文本對應的key。</param>
            /// <param name="configName">*对应名称</param>
            /// <param name="IsSetLanguageKBN">是否通過最後一個參數(languagekbn)來進行文本的取得。</param>
            /// <param name="languagekbn">指定文本取得依據的語言區分對象。</param>
            /// <returns>返回文本值。</returns>
            private static string TAG_Value(string key,string configName,bool IsSetLanguageKBN,LanguageKBN languagekbn)
            {
                DataRow[] DDR=DS(configName).Tables[0].Select(string.Format(consts_Web.UI_LANGUAGE_KEY_EXPRESSION,key));
                switch(DDR.Length)
                {
                    case 0:
                        Console.WriteLine(consts_Web.UI_LANGUAGE_EX_INFO1,configName+consts_Web.UI_LANGUAGE_CONFIG_SUFFIXNAME,key);
                        return consts_Web.UI_LANGUAGE_CONFIG_NOKEY_TEXT;
                    case 1:
                        break;
                    default:
                        throw new Exception(
                            string.Format(consts_Web.UI_LANGUAGE_EX_INFO2,
                            configName+consts_Web.UI_LANGUAGE_CONFIG_SUFFIXNAME,DDR.Length,key));
                }
                string CurrentLanguageKBN=null;
                if(sysOnlySingleLanguageKBN_Value==-1)
                {
                    if(IsSetLanguageKBN)
                    {
                        if(SysOnlySingleLanguageKBN_Value!=-1&&SysOnlySingleLanguageKBN_Value!=(short)languagekbn)
                            throw new Exception(consts_Web.UI_LANGUAGE_EX_INFO6);
                        CurrentLanguageKBN=languagekbn.ToString();
                    }
                    else
                    {
                        CurrentLanguageKBN=Current.ToString();
                    }
                }
                else
                {
                    CurrentLanguageKBN=Enum.GetName(typeof(LanguageKBN),sysOnlySingleLanguageKBN_Value);
                }
                if(CurrentLanguageKBN==LanguageKBN.CHT.ToString())
                {
                    return StringConvert.SChineseToTChinese(DDR[0][LanguageKBN.CHS.ToString()].ToString());
                }
                else
                {
                    return DDR[0][CurrentLanguageKBN].ToString();
                }
            }
            /// <summary>
            /// 對Web界面控件文本進行多語言切換。
            /// </summary>
            /// <param name="ContainerCtl">包含所有服務器控件的容器控件。</param>
            /// <res>只對遵照命名規則的服務器控件的文本進行語言切換。</res>
            public static void ChangeControlsText(Control ContainerCtl)
            {
                if(SysOnlySingleLanguageKBN_Value!=-1)
                    throw new Exception(consts_Web.UI_LANGUAGE_EX_INFO5);
                foreach(Control ctr in ContainerCtl.Controls)
                {
                    if(ctr.ID!=null&&ctr.ID.StartsWith(consts_Web.UI_LANGUAGE_TAGPREFIX))
                    {
                        string[] ctrID=ctr.ID.Split('_');
                        if(ctrID.Length>1)
                        {
                            string Value=TAG_Value(ctrID[1],consts_Web.UI_LANGUAGE_CONFIG_TEXT_NAME);
                            switch(ctr.GetType().Name)
                            {
                                case "Label":
                                    ((Label)ctr).Text=Value;
                                    break;
                                case "LinkButton":
                                    ((LinkButton)ctr).Text=Value;
                                    break;
                                case "CButton":
                                    ((Button)ctr).Text=Value;
                                    break;
                                //...
                            }
                        }
                    }
                    if(ctr.HasControls())
                    {
                        ChangeControlsText(ctr);
                    }
                }
            }
        }
    }
    <?xml version="1.0" encoding="utf-8"?>  
    <Text>  
        <TAG key="0001" CHS="国际贸易-供应链系统" JP="" KR="치과병원예약시스템" EN="" />  
        <TAG key="0002" CHS="中文" JP="" KR="중문등록" EN="" />  
        <TAG key="0003" CHS="韩文" JP="" KR="한문등록" EN="" />  
        <TAG key="0004" CHS="国际贸易" JP="" KR="" EN="" />  
        <TAG key="0005" CHS="供应链系统" JP="" KR="" EN="" />  
        <TAG key="00001" CHS="添加药品类别-" JP="" KR="약품분류추가" EN="" />  
    </Text>  
    这个写在在Text.config里面,假设一个Label吧你起名字就的LG_lblName 其余的控件都的起这样的前面加上LG_XX  
    然后在aspx里面的  <form>     <asp:Panel ID="LG_Panel" runat="server"  Width="100%">  
    <table>  <tr>  <td>ddd  </td>  </tr>  </table>  </asp:Panel >  </form>这些都是必须的。然后调用的时候也就是我  
    给你的那个类在上面  
    CS里面这样调用 Language.ChangeControlsText(LG_Panel);  
    支持多国语言。 忘了起名字的时候假设国际贸易-供应链系统叫这个名字吧 ,那这个Label吧你起名字就的叫LG_0001必须和  
    Text.Config里面的 对起来   <TAG   key="0001"   CHS="国际贸易-供应链系统"   JP=""   
      KR="치과병원예약시스템"   EN=""   />   
    这些都是我们做的韩国项目代码
      

  6.   

    To kongwei521 & syeerzy :
    看了那篇文章,有如下问题.
    case "CButton":
          ((Button)ctr).Text=Value;
           break;
           //...
    请问这里如果是下拉列表控件如果设置呢?如何用资源文件或者语言文件实现?如:
    <asp:DropDownList ID="ddlPlace" runat="server" Width="150px">
                              <asp:ListItem Value="">=請選擇地點=</asp:ListItem>
    <asp:ListItem Value="0">中国</asp:ListItem>
                              <asp:ListItem Value="1">香港</asp:ListItem>
                              <asp:ListItem Value="2">澳門</asp:ListItem>
                              <asp:ListItem Value="3">台湾</asp:ListItem>
                              <asp:ListItem Value="4">國外地區</asp:ListItem>
                          </asp:DropDownList>
    英文的时候要依次显示Please select the place,china,macau,hongkong,taiwan,oversea其二.数据读取的时候,如某个字段只有0,1,显示的时候,中文0显示为"男",1显示为"女",那么英文的时候0 显示为"male",1显示为"femal", 
      比较笨的方式是写个function,传入SexCode and LanguageCode然后判断显示,如何实现智能的绑定(象资源文件那样直接绑定到一个值,然后全局加载语言环境就行了)? 
    这里有没有办法实现自动匹配来显示?
      

  7.   

    请问这里如果是下拉列表控件如果设置呢?如何用资源文件或者语言文件实现?如: 
    <asp:DropDownList ID="ddlPlace" runat="server" Width="150px"> 
                               <asp:ListItem Value="">=請選擇地點= </asp:ListItem> 
    <asp:ListItem Value="0">中国 </asp:ListItem> 
         ruguo bushi cong shujuku limian duqu chulai de hua keyi dingyi 
            <%#FSSoft.Web.UI.Language.Msg("c00013")%>
    zhi yao zai config limian peizhi hao xiangying mingzi jiu keyi 
      

  8.   

    请问这里如果是下拉列表控件如果设置呢?如何用资源文件或者语言文件实现?如:  
    <asp:DropDownList ID="ddlPlace" runat="server" Width="150px">  
                                <asp:ListItem Value="">=請選擇地點=  </asp:ListItem>  
    <asp:ListItem Value="0">中国  </asp:ListItem>  
          ruguo bushi cong shujuku limian duqu chulai de hua keyi dingyi  
             <%#FSSoft.Web.UI.Language.Msg("c00013")%> 
    zhi yao zai config limian peizhi hao xiangying mingzi jiu keyi
    ===============
    也就是说每个项单独绑定一次?
    <asp:ListItem Value="0"><%#FSSoft.Web.UI.Language.Msg("0")%></asp:ListItem>  
    <asp:ListItem Value="1"><%#FSSoft.Web.UI.Language.Msg("1")%></asp:ListItem> 

    是否是这个意思?如果是,那可能是不我想要的那样的了是想绑定到一个对应的列表,而且不是每个项又单独绑定一次的了我想知道是就是有没有列表方式整体绑定的方法,还是就是第二个问题,如果是数据库读出,要怎么智能绑定呢?and would u pls using wording in english instead of pinying if u can't type in character...it's waste so much time to convert your explanation. ^_^
      

  9.   

    我们做的保存到数据库的数据没有进行这样多语言操作。你添加的时候是什么语言绑定显示出来的也似那种语言。上面的代码。
    只是死的多语言。例如 你好 可以 可以在config里面定义多语言。 
     <TAG   key="0001"   CHS="你好"   JP=""   
      KR="치과병원예약시스템"   EN="Hello"   />  这种。数据库没进行多语言
      

  10.   

    To kongwei521 :
    可以发送你的完整的源代码来看下呢?
    我的email: [email protected]
      

  11.   

    呵呵,我也做过~
     我们是把那些需要国际化的字段都放进资源文件里,然后写一个公有的类去读就OK了~
    默认的语言:UIResource.resx 
       name                      value
    例:button_text_close         閉じる需要的语言:UIResource.zh-CHS.resx
       name                      value
       button_text_close         关闭
      

  12.   

    to huaer1011:请问下,绑定到button那些的时候可以一一对应,那绑定到下拉列表的时候怎么做的呢?
    是否是这样的实现方式?
    <asp:ListItem Value="0"> <%$ Resources:Resource,TestString %> </asp:ListItem>   
    <asp:ListItem Value="1"> <%$ Resources:Resource,TestString %></asp:ListItem>  
    有没有好的方法可以绑定到类似于列表控件那些的呢?
    还是数据库输出时呢?如:数据读取的时候,如某个字段只有0,1,显示的时候,中文0显示为"男",1显示为"女",那么英文的时候0 显示为"male",1显示为"femal",  
      比较笨的方式是写个function,传入SexCode and LanguageCode然后判断显示,如何实现智能的绑定(象资源文件那样直接绑定到一个值,然后全局加载语言环境就行了)?  
    这里有没有办法实现自动匹配来显示? 请问下,这里你是怎么做的呢?
      

  13.   

    去参考Community Server的做法吧。1.语言存放在资源文件里,然后可以在界面上绑定。有点类似数据绑定,详细做法请看MSDN。2.还是用资源文件,但一定要有专门的函数负责读取资源出来,再绑定到界面上。3.在设计上,避免固定宽度或高度,让它自动适应。