空地

生活,工作,记录(内容基本都是转载,自己工作用到的时候看看而已)

导航

.net 资源文件

我个人觉得这个是比较重要的,所以想写清楚点,自己也一直在研究用xml实现!
但是还没投入实践,技术有限,我也才刚进入社会的学生而已!!
等做出来再写篇blog和大家分享
不过本人也是菜鸟,所以有什么地方写错了,希望大家能多多指教!
首先我在最后面贴了一篇很好的文章,希望大家先去看看那个再来实际操作我的例子!这样肯定ok,不然我估计大家看我例子到后面会傻掉,呵呵!~
首先我会讲自己如何实现的一步步讲给大家听


首先我做的项目里前台和后台都需要实现多语言!后台因为是用的母版,所以有点不一样!我先跟大家讲一下我前台是怎么实现的:

1.首先在配置文件里中添加一个名为LanguagePreference的基于字符串的配置文件属性来支持匿名识别用户区域性的功能。
  请注意anonymousIdentification元素的enabled属性必须为“true”,否则匿名识别功能就不可用。
  <!--此节是为了让系统自动为匿名用户生成唯一标识,另外的allowanonymous属性表示languagepreference属性可以被匿名用户访问-->
  <anonymousIdentification enabled="true"></anonymousIdentification>
  <profile>
  <properties>
    <add name="languagePreference" type="string" defaultValue="Auto" allowAn></add>
  </properties>
  </profile>



2.在主页面加上一个dropdownlist,记得打开他的autopostback属性
  <asp:DropDownList ID="drdlstLanguageList" runat="server" AutoPostBack="True" OnSelectedIndexChanged="drdlstLanguageList_SelectedIndexChanged" Width="65px">
                                    <asp:ListItem Value="Auto" Text="请选择语言"></asp:ListItem>
                                    <asp:ListItem Value="en-us" Text="英语"></asp:ListItem>
                                    <asp:ListItem Value="zh-cn" Text="简体中文"></asp:ListItem>
                                </asp:DropDownList>


3.//通过下拉菜单选择页面显示语言
    protected void drdlstLanguageList_SelectedIndexChanged(object sender, EventArgs e)
    {
        Profile.languagePreference = drdlstLanguageList.SelectedValue;
//这里会强制发生一次从浏览器到 Web 服务器的新往返程,从而在使用所需的语言首选项设置了配置文件属性后,重新启动页面的生命周期。
        Response.Redirect(Request.Url.AbsolutePath);
    }

4.编写一个PageBase类,也就一个cs文件,只不过它继承自System.Web.UI.Page,并作为站点中所有页面类的基类。
这么做的目的其实很简单,就是为了将各个页面中一些共同的处理过程提炼出来放到基类中,以减少代码重复,提高可维护性。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Threading;
using System.Globalization;

/// <summary>
/// PageBases 的摘要说明
/// </summary>
public class PageBases:System.Web.UI.Page
{
public PageBases()
{
  //
  // TODO: 在此处添加构造函数逻辑
  //
}

    protected override void InitializeCulture()
    {
        base.InitializeCulture();

        string language = (String)Context.Profile.GetPropertyValue("languagePreference");

    if (!String.IsNullOrEmpty(language) && (language != "Auto"))
            {
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language);
            }
 
    }
}



5.这样我们的多语言其实就差不多实现了,还差的就是利用资源文件开始大量的翻译!
我们随意选择一个页面,转到他的设计页面,然后工具/生成本地资源
这样就会多出一个文件夹App_LocalResources,里面还会多出一个和选择页面的名字项目的resx文件
例如刚选择的哪个页面是aa.aspx  那么生成的资源文件就是aa.aspx.resx
那么我们现在复制他,复制一个先,等大家明白了自己再加!
然后将他该成aa.aspx.en-us.resx,如果你需要其他语言就再复制文件,记得象aa.aspx.en-us.resx一样要做更改!
这里需要注意更改的部分必须象en-us一样是区域性标识!
最后就是进行翻译工作!

但是最后你会发现html里的字无法实现多语言,而且母版里的sitemap文件无法实现多语言!
(1)解决html文字显示
    首先将打开相应的资源文件,添加键值;然后在需要页面显示的地方拖出一个Localize控件,将资源文件添加的内容绑定上去!
    如果内容是放在本地资源文件里就这样绑定<a href=Default.aspx><asp:Localize ID="LocalizeText" runat=server Text="<%$ resources:键的名称 %>"></asp:Localize>
    如果内容是放在全局资源文件里就这样绑定<a href=Default.aspx><asp:Localize ID="LocalizeText" runat=server Text="<%$ resources:DisplayResource,键的名称 %>"></asp:Localize>
  这里大家一定不清楚,例如什么是全局文件夹等等,所以我在开始就让大家先看下我贴的一篇文章!表达能力太差,忘大家见谅,呵呵~!

好/。。我们再来解决第二个问题!
(2)vsitemap文件如何实现多语言!
    有两种方法,一是本地化web.sitemap,二是在不同的文化/语言中使用不同的sitemapprovider!不过第二种我也没做过,因为看到一文章上写那种很麻烦而且没成功!我也就没去试
    什么时候有时间试试再修改这篇文章!
    直接本地化web.sitemap有可分为隐式表达式(implicit expression)和显式(explicit)表达式。
    在web.sitemap中首先要增加enablelocalization,并把它设成true。
    其次,要为需要翻译的sitemapnode增加resourcekey,作为资源文件中的标识。
  比如
    <sitemap enablelocalization="true"
      xmlns="http://schemas.microsoft.com/aspnet/sitemap-file-1.0" >
    <sitemapnode url="~/default.aspx" title="title"
        description="desc" resourcekey="yes">

    然后要增加相应的资源文件 web.sitemap.resx 和本地化的的资源文件(比如 web.sitemap.zh-cn.resx ),
    而且必须放在 app_globalresources 文件夹中(beta 1 中是 resources 文件夹)。
    资源文件中要增加的内容的名称/标识(name)要和 web.sitemap 对应,按照上面的例子就是 yes.title 和 yes.desc

    如果要使用显式表达式,先要在 app_globalresources 文件夹中增加公用的资源文件,比如appresource.resx。然后相应的 weib.sitemap 要作如下修改。

    <sitemap enablelocalization="true"
        xmlns="http://schemas.microsoft.com/aspnet/sitemap-file-1.0" >
    <sitemapnode url="~/default.aspx" title="$resources: appresource, yestitle"
        description="$resources: appresource, yesdesc">

在资源文件中对应的名称/标识就应该是 yestitle 和 yesdesc。
.............................................................................................................................................
好了,这样就实现了!哎。发现自己文笔实在不怎么的。。。希望不会误导大家!下面是我说的很好的一篇文章,希望大家多多研究,肯定不会误导你们,呵呵!
.............................................................................................................................................
这是一篇很好的blog,我觉得有必要粘过来让大家深入了解以下资源化

posted on 2007-12-20 14:18  小梅  阅读(1147)  评论(0)    收藏  举报