.NET多国语言支持_文献翻译

时间:2022-04-20 12:58:46

第一部分:.net中对多语言的支持
1.全局化:在程序中发现那些根据语言的选择而不同的内容,将它们与程序的核心部分分离开来。

2.本地化:是指为某种语言创建和配置程序的过程。

3.文化(culture):
文化是指你所讲语言与你所在地区的结合。它包括你表示日期,时间的方式。以下就是文化的一个例子:
  en-US
  en-GB
  fr-BE
上面就说明了在美国和英国的语言是英语。

4.相关命名空间
为了使文化信息有效。.net提供了一个位于System.Globalization 命名空间的类(CultureInfo)。文化在线程级设置,因而需要用到System.Threading 命名空间中的Thread类。最后,为了使用资源,你还要用到System.Resources中的类。

5.获取或设置当前用户的文化
当前用户的文化可以通过类的CultureInfo.CurrentCulture性质获取,如:
  Dim ci as CultureInfo
  ci=CultureInfo.CurrentCulture
  Response.Write(ci.Name)
以下的例子说明怎样设置文化信息:
  Dim ci as CultureInfo
  ci=new CultureInfo("en-GB")
  Thread.CurrentThread.CurrentCulture = ci
  Response.Write(DateTime.Now)
在上面的例子中,因为我们将文化设置为en-GB,因而我们将获得英国使用的 dd/MM/yyyy 格式的数据。

6.为一个页面设置文化
为一个简单Asp.net网页设置文化属性的直接方法是:
<%@ Page language="c#" Culture="mr-IN"%>
在页面层自动的设置属性就可以为当前线程设定文化。因此,所有的日期和数字格式会根据文化显示。你也可以通过Response.Write 输出当前日期来验证。

7.在web应用程序层设置文化信息
你也可以在web.config文件里为整个web应用程序设置文化,web.config中的<globalization> 部分允许你进行类似如下的设置:
<globalization culture="en-GB" />


第二部分 在ASP.net中开发多语言程序
介绍
前面一部分介绍了怎样读取存在资源文件(.resources)中的资源。虽然很多情况下有用但是也存在一个缺点:你需要提供访问该资源文件的路径。这就意味着你必须清楚地制导资源的分布。Satellite Assemblies做的就是能让你基于当前文化动态加载资源文件,以下就介绍Satellite Assemblies如何做到这一点:

1.什么是satellite assemblies?
在第一部分中曾提到过,Satellite Assemblies是编译过的动态链接库(dlls),但它仅包含资源数据。Satellite assemblies 能购利用.NET SDK里提供的AL工具或者使用VS.NET来创建。它们也可在主程序开发完毕后再创建。对基于产品的开发来说它们是理想的工具,可在今后加入其它的语言支持。

2.怎样从一个satellite assembly中读取资源
为了编译一个satellite assembly中的数据, 需要下列几步:
  创建一个资源文件 (.txt 或 .resx)
  编译资源文件(.resource)
  使用AL命令行创建satellite assembly (.dll)
  创建存储satellite assembly的文件夹
  将相应satellite assembly放到文件夹中
  访问应用程序中的资源

3.怎样使用 AL 工具创建Satellite Assemblies?
可以使用AL命令行工具将资源嵌入到一个assembly. 这样形成的assembly就是一个Satellite Assembly. 以下代码展示了如何使用:
  AL
  /t:lib
  /culture:en-GB
  /embed:mymessage.en-GB.resources
  /out:ResourcesDemo.resources.dll
这里,/t转换表示该输出是一种库(DLL)。/culture转换表示嵌入该assembly得资源是面向en-GB文化的。 /embed转换说明了将嵌入到Satellite Assembly中的资源文件名。 /out转换说明了输出的assembly文件名称。

4.怎样使用VS.NET工具创建Satellite Assemblies?
如果使用的是VS.NET, 可以简单的将资源文件加入到项目中(library project)并确保在属性窗口中设置该项目对资源文件的行为特性。在编译的时候,VS.NET会自动将资源嵌入到产生的assembly中。

5.创建用于存储satellite assembly的文件夹
Satellite Assemblies可以根据应用程序的当前文化动态加载。为了使它正常工作,必须按照一个特定的文件夹结构来存放Satellite Assemblies. 必须在应用程序的主文件夹(应用程序的exe文件所在的文件夹或者ASP.NET应用程序的BIN文件夹)下创建文化名字相同的子文件夹,子文件名称对应于一种文化。 比方说,如果你的Satellite Assembly是针对en-GB文化的,那么你需要创建一个叫en-GB的文件夹来存储Satellite Assembly。
 
6.在应用程序中访问资源
为了访问Satellite Assembly中的资源, 需要用到ResourceManager类。下列代码说明了访问的方法:
  Dim x As ResourceManager
  Dim ci As New CultureInfo("en-GB")
  Thread.CurrentThread.CurrentCulture = ci
  x = New ResourceManager("mymessage.en-GB",[Assembly].GetExecutingAssembly.GetSatelliteAssembly(ci))
  Label1.Text=x.GetString("label1")
这里,我们通过将文化"en-GB"传给构造器,而创建了CultureInfo类的一个实例。接下来将当前运行线程的文化也设置为en-GB。通过规定资源的基本名称,创建一个ResourceManager类的实例。这里我们感兴趣的是ResourceManager构造器的第二个参数,它传递包含对应文化资源的Satellite Assembly。我们通过执行中的assembly的GetSatelliteAssembly()方法来获得这个Satellite Assembly。最后,我们通过调用ResourceManager的GetString()方法来获得该文化对应的字符串。使用以上方法,我们无需像CreateFileBasedResourceManager()方法一样把物理路径传给文件。