2008-11-10 110 views
4

我們想枚舉.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 

回答

3

使用System.Resources.ResXResourceReader(這是在System.Windows.Forms.dll中)

+0

是否會根據區域設置自動選擇正確的文件(如ResourceManager)還是必須編寫自己的邏輯來查找正確的文件? – 2008-11-11 11:58:01