我們想枚舉.NET中的資源文件(resx文件)中的所有字符串。我們希望這生成一個包含所有這些鍵值對的JavaScript對象。我們現在做到這一點的,像這樣的代碼附屬程序集(這是VB.NET,但任何示例代碼是好的):枚舉resx中的所有字符串
Dim rm As ResourceManager
rm = New ResourceManager([resource name], [your assembly])
Dim Rs As ResourceSet
Rs = rm.GetResourceSet(Thread.CurrentThread.CurrentCulture, True, True)
For Each Kvp As DictionaryEntry In Rs
[Write out Kvp.Key and Kvp.Value]
Next
但是,我們還沒有找到一種方法來爲.resx文件做到這一點還沒有,可悲的是。我們如何枚舉resx文件中的所有本地化字符串?
UPDATE:
繼丹尼斯Myren的評論和here的想法,我建了一個ResXResourceManager。現在,我可以像使用嵌入式資源一樣對.resx文件執行相同的操作。這是代碼。請注意,微軟將所需的構造函數設爲私有,所以我使用反射來訪問它。使用此功能時需要完全信任。
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Windows.Forms
Public Class ResXResourceManager
Inherits ResourceManager
Public Sub New(ByVal BaseName As String, ByVal ResourceDir As String)
Me.New(BaseName, ResourceDir, GetType(ResXResourceSet))
End Sub
Protected Sub New(ByVal BaseName As String, ByVal ResourceDir As String, ByVal UsingResourceSet As Type)
Dim BaseType As Type = Me.GetType().BaseType
Dim Flags As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Instance
Dim Constructor As ConstructorInfo = BaseType.GetConstructor(Flags, Nothing, New Type() { GetType(String), GetType(String), GetType(Type) }, Nothing)
Constructor.Invoke(Me, Flags, Nothing, New Object() { BaseName, ResourceDir, UsingResourceSet }, Nothing)
End Sub
Protected Overrides Function GetResourceFileName(ByVal culture As CultureInfo) As String
Dim FileName As String
FileName = MyBase.GetResourceFileName(culture)
If FileName IsNot Nothing AndAlso FileName.Length > 10 Then
Return FileName.Substring(0, FileName.Length - 10) & ".resx"
End If
Return Nothing
End Function
End Class
是否會根據區域設置自動選擇正確的文件(如ResourceManager)還是必須編寫自己的邏輯來查找正確的文件? – 2008-11-11 11:58:01