文档章节

资源与本地化 System.Resources

o
 osc_pn11u1x9
发布于 2018/08/06 09:54
字数 1287
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、创建资源文件

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

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_GlobalResources\MyMessages.resx 得到的资源通过:

1、产生的封装代码 :

string message = Resources.MyMessages.Hello;

2、资源表达式

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

3、GetGlobalResourceObject方法

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

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

能从 ~\App_LocalResources\default.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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

理解Java字符串常量池与intern()方法

String s1 = "Hello";String s2 = "Hello";String s3 = "Hel" + "lo";String s4 = "Hel" + new String("lo");String s5 = new String("Hello");String s6 = s5.intern();String ......

osc_ekw8urc6
24分钟前
14
0
python—sift特征提取

一、SIFT提出的目的和意义 二、SIFT的特征简介 三、SIFT算法实现步骤简述 四、图像集 五、匹配地理标记图像 六、SIFT算法代码实现 代码 结果截图 小结 七、SIFT实验总结 八、实验遇到的问题 ...

osc_z9jr2tjo
25分钟前
15
0
如何在SystemVerilog中手动设置随机化seed

可以产生受约束的随机激励是sv验证语言中最主要的feature,这里有一个常常会被验证工程师忽视的问题,就是随机化种子(seed)。 我们知道,用verilog里面的$random或者sv里面的$urandom产生的...

osc_twlari2q
26分钟前
4
0
带TLS认证的Python GRPC调用

0.生成CA证书及server、client证书,参见https://github.com/grpc/grpc-java/tree/master/examples: openssl genrsa -passout pass:111111 -des3 -out ca.key 4096 openssl req -passin p......

osc_idmmzkjc
27分钟前
17
0
pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)

前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发,可以根据自己的需求进行改造。 先学习下pytest_runtest_makereport这个钩子方法,可以更清晰的了解用例的执行过程...

osc_2g1pfwhe
28分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部