91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 實(shí)現(xiàn)多語言支持的本地化(資源)

admin
2025年3月22日 7:43 本文熱度 361

?

本章內(nèi)容:
● 使用表示區(qū)域性和區(qū)域的類
● 應(yīng)用程序的全球化
● 應(yīng)用程序的本地化
本章將介紹.NET 應(yīng)用程序的全球化和本地化。全球化(Globalization)用于國際化的應(yīng)用程序:使 應(yīng)用程序可以在國際市場上銷售。采用全球化策略,應(yīng)用程序應(yīng)根據(jù)區(qū)域性、不同的日歷等支持不 同的數(shù)字和日期格式。本地化(Localization)用于為特定的區(qū)域性翻譯應(yīng)用程序。而字符串的翻譯可 以使用資源,如.NET 資源或WPF 資源字典。

資源

像圖片或字符串表這樣的資源可以放在資源文件或附屬程序集中。在本地化應(yīng)用程序時(shí),這種 資源非常有用,.NET 對本地化資源的搜索提供了內(nèi)置支持。

在說明如何使用資源本地化應(yīng)用程序之前,先討論如何創(chuàng)建和讀取資源,而無須考慮語言因素。

創(chuàng)建資源文件

資源文件包含圖片、字符串表等條目。要?jiǎng)?chuàng)建資源文件,或者使用一般的文本文件,或者使用 那些利用XML 的.resX 文件。下面從一個(gè)簡單的文本文件開始。

內(nèi)嵌字符串表的資源可以使用一般的文本文件來創(chuàng)建。該文本文件只是把字符串賦予鍵。鍵是 可以用來從程序中獲取數(shù)值的名稱。鍵和數(shù)值中都可以包含空格。

這個(gè)例子顯示了Wrox.ProCSharp.Localization.MyResources.txt 文件中的一個(gè)簡單字符串表:

Title = Professional C#
Chapter = Localization
Author = Christian Nagel
Publisher = Wrox Press

在保存帶Unicode 字符的文本文件時(shí),必須將文本文件和相應(yīng)的編碼一起保存。 為此,可以在Save 對話框中選擇Unicode 編碼。

資源文件生成器

可以使用資源文件生成器Resgen.exe(實(shí)用程序)在Wrox.ProCSharp.Localization.MyResources.txt 的外部創(chuàng)建一個(gè)資源文件,輸入如下代碼: resgen Wrox.ProCSharp.Localization.MyResources.txt

會創(chuàng)建Wrox.ProCSharp.Localization.MyResources.resources 文件。最終的資源文件可以作為一個(gè) 外部文件添加到程序集中,或者內(nèi)嵌到DLL 或EXE 中。Resgen 還可以創(chuàng)建基于XML 的.resX 資源 文件。構(gòu)建XML 文件的一種簡單方法是使用Resgen 本身:

resgen Wrox.ProCSharp.Localization.MyResources.txt
Wrox.ProCSharp.Localization.MyResources.resX

這條命令創(chuàng)建了XML 資源文件Wrox.ProCSharp.LocalizationMyResources.resX。

Resgen 支持強(qiáng)類型化的資源。強(qiáng)類型化的資源用一個(gè)訪問資源的類表示。這個(gè)類可以用resgen 實(shí)用程序的/str 選項(xiàng)創(chuàng)建:

resgen /str:C#,Wrox.ProCSharp.Localization,MyResources,MyResources.cs
Wrox.ProCSharp.Localization.MyResources.resX

在/str 選項(xiàng)中,按照語言、名稱空間、類名和源代碼文件名的順序定義資源。

Resgen 實(shí)用程序不支持添加圖片。在.NET Framework SDK 示例中,有一個(gè)ResXGen 示例。使 用ResXGen 可以在.resX 文件中引用圖片。還可以使用ResourceWriter 類或ResXResourceWriter 類 以編程方式把圖片添加到資源中。

ResourceWriter

除了使用Resgen 實(shí)用程序構(gòu)建資源文件外,編寫程序來創(chuàng)建資源也很簡單。ResourceWriter 是 來自System.Resources 名稱空間的一個(gè)類,它可以用于編寫二進(jìn)制資源文件;ResXResourceWriter 類編寫基于XML 的資源文件。這兩個(gè)類也支持圖片和任何其他可串行化的對象。在使用 ResXResourceWriter 類時(shí),必須引用System.Windows.Forms 程序集。

下面的代碼使用構(gòu)造函數(shù)和文件名Demo.resx 創(chuàng)建一個(gè)ResXResourceWriter 對象rw。在創(chuàng)建了 一個(gè)實(shí)例后,使用ResXResourceWriter 類的AddResource()方法可以添加至多2GB 的資源。 AddResource()方法的第一個(gè)參數(shù)指定資源名,第二個(gè)參數(shù)指定數(shù)值。可以使用Image 類的一個(gè)實(shí)例 來添加圖片資源。要使用Image 類,必須引用System.Drawing 程序集,還要添加using 指令,以打 開System.Drawing 名稱空間。

下面打開logo.gif 文件,創(chuàng)建一個(gè)Image 對象。必須把圖片復(fù)制到可執(zhí)行文件的目錄下,或者 在Image.ToFile()方法的參數(shù)中指定圖片的完整路徑。using 語句指定應(yīng)在using 塊的尾部自動釋放圖 像資源。把其他簡單的字符串資源添加到ResXResourceWriter 對象中。ResXResourceWriter 類的 Close()方法會自動調(diào)用ResXResourceWriter.Generate()方法,最后把資源寫入Demo.resx 文件中:

using System;
using System.Resources;
using System.Drawing;
class Program
{
static void Main()
{
    var rw = new ResXResourceWriter("Demo.resx");
    using (Image image = Image.FromFile("logo.gif"))
    {
        rw.AddResource("WroxLogo", image);
        rw.AddResource("Title", "Professional C#");
        rw.AddResource("Chapter", "Localization");
        rw.AddResource("Author", "Christian Nagel");
        rw.AddResource("Publisher", "Wrox Press");
        rw.Close();
    }
  }
}

啟動這個(gè)小程序,創(chuàng)建嵌入了圖像logo.gif 的資源文件Demo.resx,這個(gè)文件將用于下面的一個(gè) Windows 應(yīng)用程序。

使用資源文件

使用 C#命令行編譯器csc.exe 和/resource 選項(xiàng),或直接使用Visual Studio,可以把資源文件添加 到程序集中。為了說明如何在Visual Studio 中使用資源文件,下面創(chuàng)建一個(gè)控制臺應(yīng)用程序 ResourceDemo。

在 Solution Explorer 窗口的上下文菜單(Add ? Existing Item 命令)中,把前面創(chuàng)建的資源文件 Demo.resx 添加到這個(gè)項(xiàng)目中。默認(rèn)情況下,把這個(gè)資源的Build Action 設(shè)置為Embedded Resource, 這樣,這個(gè)資源就嵌入到輸出的程序集中。

在項(xiàng)目設(shè)置(Application ? Assembly information 命令)中,把應(yīng)用程序的Neutral Language 設(shè)置 為主要語言,如EEnglish(United States),下圖 所示。改變這個(gè)設(shè)置,會在assemblyinfo.cs 文件 中添加[NeutralResourceLanguageAttribute]屬性:

[assembly: NeutralResourcesLanguageAttribute("en-US")]

設(shè)置這個(gè)選項(xiàng)會提高ResourceManager 的 性能,因?yàn)樗鼤斓卣业絜n-US 的資源,該 資源還會用作默認(rèn)的回退。使用這個(gè)特性也可 以通過構(gòu)造函數(shù)的第二個(gè)參數(shù)指定默認(rèn)資源的 位置。使用UltimateResourceFallbackLocation 枚舉可以指定默認(rèn)資源要在主程序集或附屬程 序集(MainAssembly 和Satellite 值)中存儲。
構(gòu)建項(xiàng)目后,使用ildasm 查看生成的程序 集時(shí),會在程序集清單中看到.mresource 特性, 下圖 所示。它聲明了程序集中資源的名 稱。如果把.mresource 聲明為public(與本例一 樣),該資源就會從程序集中導(dǎo)出,且可以用于 其他程序集的類中。如果把.mresource 聲明為 private,則表示該資源不能導(dǎo)出,只能用于該 程序集內(nèi)部。

要訪問嵌入的資源,可以使用System.Resources 名稱空間中的ResourceManager 類。把以嵌入 的資源為參數(shù)的程序集傳遞給ResourceManager 類的構(gòu)造函數(shù)。在本例中,因?yàn)榘奄Y源嵌入到正在 執(zhí)行的程序集中, 所以應(yīng)把 Assembly.GetExecutingAssembly() 方法 的結(jié)果作為構(gòu)造函數(shù)的第二個(gè)參數(shù)。第 一個(gè)參數(shù)是資源的根名。根名由名稱空 間和資源文件名(不帶資源擴(kuò)展名)組 成。如前所述,使用ildasm 來顯示該名 稱。為此,只需刪除資源的擴(kuò)展名 resources 即可。還可以使用 System.Reflection.Assembly 類的GetManifestResourceNames()方法通過編程方式獲取該名稱。

using System;
using System.Drawing;
using System.Reflection;
using System.Resources;
namespace Wrox.ProCSharp.Localization
{
class Program
{
    static void Main()
    {
        var rm = new ResourceManager("Wrox.ProCSharp.Localization.Demo",
        Assembly.GetExecutingAssembly());

使用ResourceManager 實(shí)例rm,通過指定GetObject()和GetString()方法的鍵,就可以獲得所有 的資源:

    Console.WriteLine(rm.GetString("Title"));
    Console.WriteLine(rm.GetString("Chapter"));
    Console.WriteLine(rm.GetString("Author"));
    using (Image logo = (Image)rm.GetObject("WroxLogo"))
    {
      logo.Save("logo.bmp");
    }
  }
  }
}

通過強(qiáng)類型化的資源,可以簡化前面編寫的代碼:不需要實(shí)例化ResourceManager,也不需要 使用索引符訪問資源,而只需使用屬性訪問資源名:

private static void StronglyTypedResources()
{
    Console.WriteLine(Demo.Title);
    Console.WriteLine(Demo.Chapter);
    Console.WriteLine(Demo.Author);
    using (Bitmap logo = Demo.WroxLogo)
    {
      logo.Save("logo.bmp");
    }
}

要使用托管資源編輯器創(chuàng)建強(qiáng)類型化的資源,可以把Access Modifier 從No Code Generation 重 置為Public 或Internal。使用Public 選項(xiàng),生成的類就使用公共訪問修飾符,并且它可以在其他程序 集中使用。而使用Internal 選項(xiàng),生成的類就使用內(nèi)部訪問修飾符,并且它只能在程序集內(nèi)部訪問。

設(shè)置這個(gè)選項(xiàng)后,就會創(chuàng)建Demo 類(它與資源同名)。這個(gè)類的靜態(tài)屬性為所有的資源提供了 強(qiáng)類型化的資源名。通過實(shí)現(xiàn)靜態(tài)屬性,就可以使用ResourceManager 對象,該對象在第一次訪問 時(shí)實(shí)例化,并緩存:

System.Resources名稱空間

ResourceManager 類可以用于從程序集或資源文件中獲取當(dāng)前區(qū)域性的資源。使用 ResourceManager 類還可以獲取特定區(qū)域性的ResourceSet 類。
ResourceSet 類表示特定區(qū)域性的資源。在創(chuàng)建ResourceSet 類的實(shí)例時(shí),它會枚舉一個(gè)實(shí) 現(xiàn)IResourceReader 接口的類,并在散列表中存儲所有的資源。
IResourceReader 接口用于從ResourceSet 中枚舉資源。ResourceReader 類實(shí)現(xiàn)這個(gè)接口。
ResourceWriter 類用于創(chuàng)建資源文件。ResourceWriter 類實(shí)現(xiàn)IResourceWriter 接口。  ResXResourceSet、ResXResourceReader 和ResXResourceWriter 類分別類似于R esourceSet、 ResourceReader 和ResourceWriter 類,但創(chuàng)建的是基于XML 的資源文件.resX,而不是二 進(jìn)制文件。ResXFileRef 可以用于鏈接資源,而不是把資源嵌入到XML 文件中。
System.Resources.Tools 名稱空間包含的StronglyTypedResourceBuilder 類可以從資源中創(chuàng)建 類。


閱讀原文:原文鏈接


該文章在 2025/3/24 13:20:34 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 精品熟女中文字幕 | 国产视频 | 午夜影视污| 精品国产91乱码一 | 成人影院在线入口 | 国产精品第79页 | 欧美日韩色另类综合 | 91精品福利国产 | 日本69sex护士 | 日本成年人视频网站 | 国产精品视频女人 | 国产在香蕉播放 | 国产精品第八页 | 日本理伦年轻的妻子 | 日韩欧美色激情 | 国产欧美一区二区 | 日本三级精 | 91神马高 | 日韩伦理电影大全 | 国产在线每日更新 | 岛国精品页面 | 国产系列亚洲精品 | 国产日本视频 | 动漫在线观看 | 国产香蕉人人干干 | 国产美女精品 | 七十路熟女交尾hd | 国产肥熟 | 国产在线观看一区 | 91免费网址福利 | 午夜一区二区视频 | 欧美另类 | 国产粉色白| 区二区在线2025 | 日韩在线欧美国产 | 欧美日韩在99线 | 精品国产午夜肉伦 | 日本伦理 | 国产99视频精品 | 中文字幕日韩精品一 | 国产自产第5区 |