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");
}
}
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 ... –
@Ben: à droite, c'est la mise en garde avec la ressource par défaut. –