Partager via


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));
            }
        }
    };
}

Voir aussi

Concepts

Ressources dans les applications