使用资源文件(二)

原创 2004年08月23日 17:00:00

使用资源文件


创建资源

资源管理是 .NET 框架类库的一个功能,可用于从源代码中提取可本地化的元素,并将它们与字符串键一起存储为资源。运行时,可使用 ResourceManager 类的一个实例将键解析为原始资源或本地化版本。资源可存储为独立(“松散”)文件,或程序集的一部分。

ASP.NET 页可使用资源文件;另外,已编译的代码隐藏控件可以使用嵌入或链接到它们的程序集中的资源。

可使用 ResourceWriter 类以编程方式创建资源,或使用工具 Resgen.exe 创建资源。Resgen.exe 可使用简单的“键=值”格式作为输入,或使用 .resx 格式的 XML 文件。

ResourceWriter 和 Resgen.exe 创建一个 .resources 文件,该文件可单独使用,也可用作程序集的一部分。若要在程序集中包括 .resources 文件,请使用相关的编译器开关或 Al.exe 工具。仅包含本地化资源、不包含代码的程序集称为附属程序集。

使用页上的资源

下面的示例仅实现一个 .aspx 页,该页针对每个请求进行本地化。支持的语言是英语、德语和日语。确定语言的方法是检查 Global.asax 文件中 HTTP 标头的 Content-Language 字段。该字段的内容可通过 UserLanguages 集合访问:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages.GetValue(0));
C# VB JScript  

若要更改初始语言设置,可使用不同的本地化客户端,或更改浏览器上的语言设置。例如,对于 Internet Explorer 5.x,从菜单中选择“工具”->“Internet 选项”并单击底部的“语言”按钮。在接下来的对话框中,可以添加其他语言,并定义它们的优先级。为简单起见,示例总是选择第一项。

页第一次加载后,用户可在下拉列表控件 MyUICulture 中选择其他区域性。如果选定的区域性有效,此值将重写从 UserLanguages 获得的设置:

String SelectedCulture = MyUICulture.SelectedItem.Text;
if(! SelectedCulture.StartsWith("Choose")) {
  // If another culture was selected, use that instead.
  Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedCulture);
  Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
Dim SelectedCulture As String = MyUICulture.SelectedItem.Text
If Not(SelectedCulture.StartsWith("Choose")) Then
  '  If another culture was selected, use that instead.
  Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))
  Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
End If
var SelectedCulture:String = MyUICulture.SelectedItem.Text;
if(! SelectedCulture.StartsWith("Choose")) {
  // If another culture was selected, use that instead.
  Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages.GetValue(0));
  Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
C# VB JScript  

以前的代码中需要使用 CreateSpecificCulture 方法,原因是您无法将线程的当前 CultureInfo 设置为非特定区域性。但是从 UserLanguages 设置中得到的字符串可以为非特定区域性。因此,CreateSpecificCulture 方法获取该字符串,并从中生成相应的 CultureInfo。

同样,在 Global.asax 文件中,将用应用程序范围初始化 ResourceManager 实例。这样,资源对每个应用程序仅加载一次。因为资源是只读的,因此不会发生锁争用。

public void Application_Start() {
    Application["RM"] = new ResourceManager("articles",
                Server.MapPath("resources") + Path.DirectorySeparatorChar,
                null);
}
Public Sub Application_Start()
    Application("RM") = New ResourceManager("articles", _
                Server.MapPath("resources") + Path.DirectorySeparatorChar, _
                Nothing)
End Sub
public function Application_Start() : void {
    Application["RM"] = new ResourceManager("articles",
                Server.MapPath("resources") + Path.DirectorySeparatorChar,
                null);
}
C# VB JScript  

于是就可以在页上轻松地使用资源管理器。问候字符串仅本地化为:

<%=rm.GetString("greeting")%>
  genicon.gif
global.asax

[查看源代码]
  resources2.gif
VB news.aspx

[运行示例] | [查看源代码]


使用附属程序集

查看前一节示例中的目录结构,可以发现示例的资源不是从 DLL 加载的,而是从 .resource 文件加载。尽管这确实是一种解决方案,但还可以将代码编译为附属程序集。根据定义,附属程序集是仅包含资源、不包含可执行代码的程序集。有关附属程序集的更多信息,请参阅。

.resources 文件由于不是 DLL 而不是影像复制的,因此 Web 站点在使用它们时可能会遇到锁定问题。认识到这一点,使用附属程序集的优点就变得十分明显了。另一种方法是使用应用程序资源的并行主程序集。主程序集包含备用的资源;附属程序集(每个区域设置都有一个)包含本地化资源。主程序集安装在 /bin 目录中,而附属程序集存储在普通的 xx-XX 子目录下(请参阅)。作为程序集,它们是影像复制的,而且不会被锁定。若要创建程序集识别的 .asp 应用程序:

创建资源 DLL 并将其复制到 /bin 目录中。例如:

resgen qq.txt qq.resources
al /embed:qq.resources,qq.resources /out:qq.dll

“y”指示 Blob 是否应对其他程序集可见。由于 ResourceManager 位于 Mscorlib 中而且是一个不同于“qq”的程序集,因此 .resources 文件必须是公共可见的。“y”指示这是否应是公共的。

在页上包括以下语句。注意,此处的程序集名称位于在 Mscorlib 中定义的 System.Reflection 命名空间中(编译时总要引用它):

        <%
        Assembly a = Assembly.Load("qq");
        ResourceManager rm = new ResourceManager("qq", a);
        Response.Write(rm.GetString("key"));
        %>
        <%
        Dim a As Assembly = Assembly.Load("qq")
        Dim rm As ResourceManager = New ResourceManager("qq", a)
        Response.Write(rm.GetString("key"))
        %>
        <%
        var a:Assembly = Assembly.Load("qq");
        var rm:ResourceManager = new ResourceManager("qq", a);
        Response.Write(rm.GetString("key"));
        %>
C# VB JScript  

将每个附属资源编译到各自的程序集中,并将其放入 /bin 目录中所需的正确目录结构中:

al /embed:qq.en-US.resources,qq.en-US.resources /out:qq.resources.dll /c:en-US

将代码替换为正在将 en-US 本地化到的区域性。记住,/c: 标记是区域性说明符。

将 DLL 放置到正确的位置(上例中的 /bin 和 /bin/en-US)后,即可适当地检索资源。注意,一切都通过程序集缓存得到影像复制,因此是可替换的,从而避免了潜在的锁定情况。


_rm = new ResourceManager("LocalizedStrings",
                          Assembly.GetExecutingAssembly(),
                          null,
                          true );
...
override protected void Render(HtmlTextWriter writer) {
    Text = ResourceFactory.RManager.GetString(Text);
    base.Render(writer);
}
_rm = New ResourceManager("LocalizedStrings", _
                          Assembly.GetExecutingAssembly(), _
                          Nothing, _
                          True )
...
Overrides Protected Sub Render (writer As HtmlTextWriter)
    Text = ResourceFactory.RManager.GetString(Text)
    base.Render(writer)
End Sub
_rm = new ResourceManager("LocalizedStrings",
                          Assembly.GetExecutingAssembly(),
                          null,
                          true );
...
override protected function Render(writer:HtmlTextWriter) : void {
    Text = ResourceFactory.RManager.GetString(Text);
    base.Render(writer);
}
C# VB JScript  

ResourceManager 实例负责将键解析为本地化资源。如果具有正确区域性的附属程序集不可用,并且找不到相关的区域性,则使用主程序集的非特定语言资源("en-us"->"en"->"非特定语言")。只需将新附属程序集的模块文件复制到适当的位置,即可提供另一种语言支持。

  genicon.gif
本地化控件

[查看源代码]
  resources1.gif
VB 使用本地化控件

[运行示例] | [查看源代码]

本节小结

  1. ASP.NET 页可使用资源类将资源中可本地化的内容分离出来,这部分内容在运行时被选定。
  2. 另一个好办法是使用附属程序集而不是中间的 .resources 文件加载资源,因为这样可避免锁定问题。
  3. 已编译控件可包含它们自己的资源,并将根据宿主页的 UICulture 来选择正确的本地化内容。

解析Qt资源文件使用

本文介绍的是Qt资源文件使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系统。用于方便地将一些二进制文件(主要是图片文件)编译进可执行程序中,免去再发布应用的时候附带其他文件的麻烦。 Qt...
  • u012485637
  • u012485637
  • 2014年10月14日 09:16
  • 1634

Android中资源文件的使用(一):如何使用资源

1. 什么是资源文件? a) 所有的应用程序都由两部分构成:功能(代码指令)和数据(资源), b) 功能决定应用程序的的行为, 它包括让应用程序得以运行的所有算法. c) 资源包括文本字符串 \...
  • watermusicyes
  • watermusicyes
  • 2014年05月30日 09:41
  • 3166

在vs&qt中使用资源文件

在vs环境下用qt进行开发时,常常需要用到各种资源,如图表、样式表等。在这种情况下,使用资源文件是最恰当的选择,使用资源文件可以将资源编译到.exe文件中,即使脱离编译器独立运行也可以达到应有的效果;...
  • u011747846
  • u011747846
  • 2014年12月20日 15:31
  • 1882

WIN32编程之.rc资源文件的使用

学习WIN32是否需要用VC?我的答案是:不是非要VC不可,其它IDE也可以用来学WIN32; 甚至我一度以为的学到时资源不得不用VC,目前看来只要稍微费点力气,了解一些.rc文件的东西,也是可以用其...
  • baidu_24190413
  • baidu_24190413
  • 2015年08月11日 23:51
  • 3552

C# Winform资源文件的创建、加载和使用

C#winform中通过资源文件(.resx)实现国际化,加载不同语言的资源文件可实现对应语言版本的程序和界面显示,下面简单介绍资源文件的创建与加载步骤: 创建中英文资源文件        win...
  • yanfk
  • yanfk
  • 2017年02月23日 19:59
  • 2577

Delphi资源文件的应用

(一)初级应用篇: 资源文件一般为扩展名为res的文件.在VC中资源文件用得非常普遍,但Delphi在其联机帮助中对资源文件没作什么介绍,其实利用其自带的资源编译工具BRCC32.EXE(一般位于\D...
  • lailai186
  • lailai186
  • 2013年08月31日 13:00
  • 3362

在.NET中读取嵌入和使用资源文件的方法

Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Str...
  • orichisonic
  • orichisonic
  • 2016年11月22日 09:12
  • 1809

BCB如何加载字符串资源文件(语言资源文件)?

如何在软件.exe中嵌入语言资源呢。常规的想法是, 将语言字符串放到一个文件中, 然后在程序中去读取。 然而这样做存在一个问题: 最后发布的.exe必须依赖于语言字符串文件, 比如lang.txt. ...
  • stpeace
  • stpeace
  • 2015年07月26日 12:45
  • 1577

QT5 学习之路13---资源文件

上一章节中我们介绍了如何使用QAction添加动作。其中,我们使用QIcon加载了一张 png 图片。那时候我们使用的是 Qt 资源文件。现在我们来仔细了解下 Qt 的资源系统。Qt 资源系统是一个跨...
  • gusgao
  • gusgao
  • 2015年10月03日 10:52
  • 540

在android-studio中,使用android 中 lint 来清除无用的资源文件

使用lint清除无用资源的步骤: 1、 2、 3、 4、 5、 6、 7、 需注意的是,如果用到第三方jar,如果里面运用反射引用到本地资源(如图片,文件)之类的,使用...
  • zjws23786
  • zjws23786
  • 2016年06月27日 10:13
  • 3933
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用资源文件(二)
举报原因:
原因补充:

(最多只允许输入30个字)