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
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? –
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