2009-07-09 18 views
2

Comment obtenez-vous le fichier .resx que la page utilise actuellement? Par exemple, si je mets culture à fr-FR sur Default.aspx, cela devrait me donner Default.aspx.fr.resx ou Default.aspx.fr-FR.resx ou Default.aspx.resx qui dépend de ce qui existe.fichier .resx la page utilise actuellement

Est-ce qu'ils ont quelque chose comme ça dans ASP.NET ou je dois l'écrire moi-même?

Répondre

0

Je ne suis pas au courant d'une propriété intégrée qui retournerait le fichier de ressources actuel de cette façon.

CultureInfo.CurrentUICulture.Name renvoie l'UICulture en cours d'utilisation et la propriété Name est la forme abrégée. Vous pouvez l'utiliser pour construire l'information vous-même, par exemple:

string pageResx = VirtualPathUtility.GetFileName(Request.Path) + "." + 
CultureInfo.CurrentUICulture.Name + ".resx"; 

Selon ce que vous envisagez de faire avec cette information, je serais un peu prudent et vous devez tester cette approche pour votre scénario.

+0

C'est ce que j'ai commencé avec. Il vous dira toujours .aspx.en-US.resx, même lorsque la page utilise .aspx.resx. J'ai ajouté des codes pour vérifier l'existence de en.resx et en-US.resx pour prendre en compte les cas de repli. Ce serait bien s'il y avait une façon standard de le trouver ... –

+0

@Ben: à droite, c'est la mise en garde avec la ressource par défaut. –

3

Vous pouvez utiliser la méthode GetResourceFileName() de la classe ResourceManager pour créer un nom de culture de ressource valide. Un rapide coup d'œil sur l'implémentation des méthodes via le réflecteur nous montre que la méthode utilise la propriété name de l'objet CultureInfo transmis par l'appelant pour construire le nom du fichier de ressources.

protected virtual string GetResourceFileName(CultureInfo culture) 
{ 
    StringBuilder builder = new StringBuilder(0xff); 
    builder.Append(this.BaseNameField); 
    if (!culture.Equals(CultureInfo.InvariantCulture)) 
    { 
     CultureInfo.VerifyCultureName(culture, true); 
     builder.Append('.'); 
     builder.Append(culture.Name); 
    } 
    builder.Append(".resources"); 
    return builder.ToString(); 
} 

La méthode GetResourceFileName() appelle la méthode statique interne VerifyCultureName() pour nous assurer que nous avons un nom de culture de ressource valide. Jetant un coup d'oeil dans la méthode VerifyCultureName() nous montre qu'une validation simple a lieu.

internal static bool VerifyCultureName(CultureInfo culture, bool throwException) 
{ 
    if (culture.m_isInherited) 
    { 
     string name = culture.Name; 
     for (int i = 0; i < name.Length; i++) 
     { 
      char c = name[i]; 
      if ((!char.IsLetterOrDigit(c) && (c != '-')) && (c != '_')) 
      { 
       if (throwException) 
       { 
        throw new ArgumentException(Environment.GetResourceString("Argument_InvalidResourceCultureName", new object[] { name })); 
       } 
       return false; 
      } 
     } 
    } 
    return true; 
} 

Pour utiliser la méthode GetResourceFileName() vous devrez dériver une classe de type ResourceManager et remplacer la méthode virtuelle dans la classe de base. La méthode GetResourceFileName() est protégée, donc nous devrons l'intégrer dans une méthode publique pour l'exposer au monde extérieur.

public class ResxResourceManager : ResourceManager 
{ 
    protected override string GetResourceFileName(System.Globalization.CultureInfo culture) 
    { 
     return base.GetResourceFileName(culture);  
    } 

    public string GetResxFileName(System.Globalization.CultureInfo culture) 
    { 
     return GetResourceFileName(culture).Replace(".resources", ".resx"); 
    } 
} 
+0

Ceci est proche de ce que j'obtiens de ma méthode personnalisée, qui retournerait Default.aspx.en-US.resx. Mais la page utilise actuellement Default.aspx.resx car en-us.resx n'existe pas. Je vérifie actuellement si en-us.resx ou en.resx existent, puis revenons à la valeur par défaut .resx, ce qui fonctionne bien. Je me demande simplement s'il existe une meilleure façon de le trouver. –