CA1303 : Ne pas transmettre des littéraux en tant que paramètres localisés
TypeName |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
Catégorie |
Microsoft.Globalization |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode passe un littéral de chaîne en tant que paramètre à un constructeur ou une méthode présent dans la bibliothèque de classes du .NET Framework et cette chaîne doit être localisable.
Cet avertissement est déclenché lorsqu'une chaîne littérale est passée comme une valeur à un paramètre ou une propriété et qu'un ou plusieurs des cas suivants se vérifient :
L'attribut LocalizableAttribute du paramètre ou de la propriété a la valeur true.
Le paramètre ou le nom de propriété contient "Text", "Message" ou "Caption".
Le nom du paramètre de chaîne passé à une méthode Console.Write ou Console.WriteLine est "value" ou "format".
Description de la règle
Les littéraux de chaîne incorporés au code source sont difficiles à localiser.
Comment corriger les violations
Pour corriger une violation de cette règle, remplacez le littéral de chaîne par une chaîne récupérée par le biais d'une instance de la classe ResourceManager.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si la bibliothèque de code n'est pas localisée, ou si la chaîne n'est pas exposée à l'utilisateur final ou à un développeur à l'aide de la bibliothèque de code.
Les utilisateurs peuvent éliminer le bruit qui interfère avec les méthodes qui ne doivent pas constituer des chaînes localisées passées, soit en renommant le paramètre ou la propriété nommée, soit en marquant ces éléments comme conditionnels.
Exemple
L'exemple suivant présente une méthode qui lève une exception lorsque l'un de ses deux arguments est hors limites. Pour le premier argument, le constructeur d'exception reçoit une chaîne littérale qui enfreint cette règle. Pour le second argument, le constructeur reçoit correctement une chaîne récupérée par le biais d'un ResourceManager.
Imports System
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Imports System.Windows.Forms
<assembly: System.Resources.NeutralResourcesLanguageAttribute("en-US")>
Namespace GlobalizationLibrary
Public Class DoNotPassLiterals
Dim stringManager As System.Resources.ResourceManager
Sub New()
stringManager = New System.Resources.ResourceManager( _
"en-US", System.Reflection.Assembly.GetExecutingAssembly())
End Sub
Sub TimeMethod(hour As Integer, minute As Integer)
If(hour < 0 Or hour > 23) Then
MessageBox.Show( _
"The valid range is 0 - 23.") 'CA1303 fires because the parameter for method Show is Text
End If
If(minute < 0 Or minute > 59) Then
MessageBox.Show( _
stringManager.GetString("minuteOutOfRangeMessage", _
System.Globalization.CultureInfo.CurrentUICulture))
End If
End Sub
End Class
End Namespace
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Windows.Forms;
[assembly: NeutralResourcesLanguageAttribute("en-US")]
namespace GlobalizationLibrary
{
public class DoNotPassLiterals
{
ResourceManager stringManager;
public DoNotPassLiterals()
{
stringManager =
new ResourceManager("en-US", Assembly.GetExecutingAssembly());
}
public void TimeMethod(int hour, int minute)
{
if (hour < 0 || hour > 23)
{
MessageBox.Show(
"The valid range is 0 - 23."); //CA1303 fires because the parameter for method Show is Text
}
if (minute < 0 || minute > 59)
{
MessageBox.Show(
stringManager.GetString(
"minuteOutOfRangeMessage", CultureInfo.CurrentUICulture));
}
}
}
}
using namespace System;
using namespace System::Globalization;
using namespace System::Reflection;
using namespace System::Resources;
using namespace System::Windows::Forms;
[assembly: NeutralResourcesLanguageAttribute("en-US")];
namespace GlobalizationLibrary
{
public ref class DoNotPassLiterals
{
ResourceManager^ stringManager;
public:
DoNotPassLiterals()
{
stringManager =
gcnew ResourceManager("en-US", Assembly::GetExecutingAssembly());
}
void TimeMethod(int hour, int minute)
{
if(hour < 0 || hour > 23)
{
MessageBox::Show(
"The valid range is 0 - 23."); //CA1303 fires because the parameter for method Show is Text
}
if(minute < 0 || minute > 59)
{
MessageBox::Show(
stringManager->GetString("minuteOutOfRangeMessage", CultureInfo::CurrentUICulture));
}
}
};
}