2008-11-10 4 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, как и со встроенными ресурсами. Вот код. Обратите внимание, что Microsoft сделал необходимый конструктор частным, поэтому я использую отражение для доступа к нему. При этом вам нужно полное доверие.

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