2008-11-10 7 views
4

Nous aimerions énumérer toutes les chaînes dans un fichier de ressources dans .NET (fichier resx). Nous voulons que ceci génère un objet javascript contenant toutes ces paires clé-valeur. Nous le faisons maintenant pour les ensembles de satellites avec le code comme celui-ci (ce qui est VB.NET, mais tout code exemple est très bien):Énumération de toutes les chaînes dans 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 

Cependant, nous n'avons pas trouvé un moyen de le faire pour les fichiers .resx encore , Malheureusement. Comment pouvons-nous énumérer toutes les chaînes de localisation dans un fichier resx?

MISE À JOUR:

Après le commentaire de Dennis Myren et les idées de here, je construit un ResXResourceManager. Maintenant, je peux faire la même chose avec les fichiers .resx qu'avec les ressources intégrées. Voici le code. Notez que Microsoft a rendu un constructeur nécessaire privé, donc j'utilise la réflexion pour y accéder. Vous avez besoin d'une confiance totale lors de l'utilisation de ceci.

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 

Répondre

3

utilisation System.Resources.ResXResourceReader (il est en System.Windows.Forms.dll)

+0

Est-ce que cela va automatiquement choisir le bon fichier en fonction des paramètres régionaux (comme le ResourceManager) ou dois-je écrire ma propre logique pour trouver le bon fichier? –

+0

ResXResourceReader est plus un analyseur de fichiers XML .resx de bas niveau qu'un gestionnaire de ressources. Peut-être possible d'utiliser System.Web.Compilation.ResourceExpressionBuilder directement, je ne l'ai pas essayé cependant. Vous auriez besoin de quelque chose comme ResourceManager.CreateFileBasedResourceManager, mais pour les fichiers .resx. – baretta

Questions connexes