• C#(99):资源与本地化 System.Resources


    一、创建资源文件

    可以将字符串、图像或对象数据等资源包含在资源文件中,方便应用程序使用。创建资源文件的方法:

    1、手动或使用IDE工具自动生成XML 资源 (.resx) 文件。

          创建一个包含字符串资源的文本文件。或创建一个包含字符串、图像或对象数据的 XML 资源 (.resx) 文件。

    使用 Visual Studio 创建一个资源文件并将其包含在项目中。 Visual Studio 提供一个资源编辑器,借助该编辑器,可添加、删除和修改资源。 编译时,资源文件会自动转换成二进制 .resources 文件,并嵌入应用程序程序集或附属程序集中。

      注意:内部使用资源文件生成器 (Resgen.exe) 将文本文件转换成二进制资源 (.resources) 文件。 然后使用语言编译器将这个二进制资源文件嵌入可执行应用程序或应用程序库,或者使用程序集链接器 (Al.exe) 将这个二进制资源文件嵌入附属程序集。

    2、以编程方式创建一个 XML 资源 (.resx) 文件。 使用ResXResourceWriter类

          可以创建一个 .resx 文件、枚举其资源并按名称检索特定资源。

    ResXResourceWriter rw = new ResXResourceWriter("Demo.rex");
    rw.AddResource("Logo", Image.FromFile("logo.jpg");
    rw.AddResource("Title", "Proce c#");
    rw.Generate();
    rw.Close();

    3、以编程方式创建一个二进制资源 (.resources) 文件,使用ResourceWriter类。 不推荐

          然后使用语言编译器将该文件嵌入可执行应用程序或应用程序库,或者使用程序集链接器 (Al.exe) 将这个二进制资源文件嵌入附属程序集。方法同上。

    二、Winform可以使用ResourceManager读取资源文件,不推荐

    Winform使用资源文件(Demo.resx;Demo.en-us.rex)

    //多语言
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-us");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us");
    
    Assembly asm = Assembly.GetExecutingAssembly();
    ResourceManager rm = new ResourceManager("Demo.Properties.Resources", asm);
    //Demo是你程序的命名空间,Demo.Properties 是资源类Resources的命名空间, 资源文件名称不带扩展名
    this.logo.Image = (Image)rm.GetObject("Logo");//Get**方法具有重载方法,第二个参数为CultureInfo对象
    this.Title.Text = rm.GetString("Title");    //资源文件名称不带扩展名

    使用强类型可直接使用类,不需要ResourceManager

    logo.Image = Demo.Logo;
     Tilte.Text = Demo.Title

    三、Winform程序界面多语言切换,ComponentResourceManager类

    ComponentResourceManager类继承自ResourceManager类。

    Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");
    
    ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
    resources.ApplyResources(this, "$this");
    AppLang(form, resources);
    
    #region AppLang for control
    /// <summary>
    /// 遍历窗体所有控件,针对其设置当前界面语言
    /// </summary>
    /// <param name="control"></param>
    /// <param name="resources"></param>
    private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
    {
        if (control is MenuStrip)
        {
            resources.ApplyResources(control, control.Name);
            MenuStrip ms = (MenuStrip)control;
            if (ms.Items.Count > 0)
            {
                foreach (ToolStripMenuItem c in ms.Items)
                {
                    AppLang(c, resources);
                }
            }
        }
    
        foreach (Control c in control.Controls)
        {
            resources.ApplyResources(c, c.Name);
            AppLang(c, resources);
        }
    }
    #endregion
    
    #region AppLang for menuitem
    /// <summary>
    /// 遍历菜单
    /// </summary>
    /// <param name="item"></param>
    /// <param name="resources"></param>
    private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
    {
        if (item is ToolStripMenuItem)
        {
            resources.ApplyResources(item, item.Name);
            ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
            if (tsmi.DropDownItems.Count > 0)
            {
                foreach (ToolStripMenuItem c in tsmi.DropDownItems)
                {
                    AppLang(c, resources);
                }
            }
        }
    }
       #endregion

    四、使用GetManifestResourceStream读取资源文件

    1、将本地要加入的资源文本(视频,图片,文本或其它)加入项目。比如我们现在加入一个up.bmp的图片到项目中,且放在文件夹Resources下面,
    2、将up.bmp右键选择“属性”的“生成操作”设置为"嵌入的资源"。

    注意:访问资源的名称规则为:项目命名空间.资源文件所在文件夹名.资源文件名

    Assembly assm = Assembly.getGetExecutingAssembly();
    Stream stream = assm.GetManifestResourceStream("CreateDatabase.Resources.aa.txt");
    //文本
    System.IO.StreamReader sr = new System.IO.StreamReader(stream);
    string str = sr.ReadToEnd();
    //XML文件
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(stream);
    //图片
    Image img = Image.FromStream(stream);

    五、ASP.NET Web网站本地化

    1、重写InitializeCulture方法。

          在Global.asax中的Application_BeginRequest获取或设置语言,每次页面的请求都首先运行这个方法,然后再运行具体页面的InitializeCulture重载方法。

    附上一张图,看看页面方法和事件的执行顺序

    protected override void InitializeCulture()
    {
        String curCulture = Request.QueryString["currentculture"];
        if (!String.IsNullOrEmpty(curCulture))
        {
            HttpCookie cookie = new HttpCookie("preferCulture", curCulture);
            cookie.Expires = DateTime.Today.AddDays(7);
            Response.SetCookie(cookie);//设置Cookie
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(s);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(s);
        }
        else
        {
            HttpCookie cookie = new Request.Cookies["preferCulture"];//取得Cookie
            if (cookie != null)
            {
                curCulture = cookie.Value.ToString();
    
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(curCulture);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(curCulture);
            }
        }
    }

    除了通过IE浏览器和线程获取语言设置,其实我们可以自己设置使用哪种语言。
    1)通过在每个页面里的Page节指定

    <%@ Page Culture="en-us" UICulture="en-us" %>

    如上所设,该页将使用en-us的语言设置。
    注意:这只是个概要式写法,实际的页面中的Page一般都包含更多的属性。
    2)通过在Web.Config里的globalization节指定

    <system.web>
    <globalization Culture="en-us" UICulture="en-us" />
    </system.web>

    2、添加资源语言文件

          在项目App_GlobalResource文件夹添加Demo.resx和Demo.en-us.rex两个文件

    在首页中添加:

    <a href="?currentculture=zh-cn">中文(中国)</a>
    &nbsp;
    <a href="?currentculture=en-us">English(USA)</a>

    3、获取全局资源(GlobalResources)的方式:

          你能从 ~App_GlobalResourcesMyMessages.resx 得到的资源通过:

    1、产生的封装代码 :

    string message = Resources.MyMessages.Hello;

    2、资源表达式

    <asp:Label Text="<%$ Resources: MyMessages, Hello %>" />

    3、GetGlobalResourceObject方法

    string message = GetGlobalResourceObject("MyMessages", "Hello");

    注意:本地资源的获取方法:

    能从 ~App_LocalResourcesdefault.aspx.resx 得到的资源通过:

    1、资源表达式:

    <asp:Label Text="<%$ Resources: Hello %>" />

    2、meta:resourceKey :

    <asp:Label meta:resourceKey="labelResourceKey" />

    3、GetLocalResourceObject方法:

    string message = GetLocalResourceObject("Hello"); "

    页面级别的本地化:https://www.cnblogs.com/zhaohwi/archive/2008/08/25/1276134.html

  • 相关阅读:
    linux驱动移植信号驱动IO模型
    linux驱动移植软中断
    linux驱动移植中断注册
    linux驱动移植进程同步之自旋锁
    aspose java word 插入特殊字符
    Web server failed to start. Port 9702 was already in use.
    mongo根据数组长度查询
    minio清空某个bucket下的所有文件
    将 XSSFWorkbook 转为 inputstream
    aspsoe 合并多个文档(保证每个文档的第一页在最新的一页)
  • 原文地址:https://www.cnblogs.com/springsnow/p/9428661.html
Copyright © 2020-2023  润新知