CA1303: Nepředávejte literály jako lokalizované parametry
Název_typu |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
Kategorie |
Microsoft.Globalization |
Změnit rozdělení |
Bez rozdělení |
Příčina
Metoda předá řetězec literálu jako parametr do konstruktoru nebo metody v .NET Framework třídy knihovny a že by měl být řetězec Lokalizovatelný.
Toto upozornění je aktivována, když řetězcový literál je předáno jako hodnotu parametru nebo vlastnosti a je splněna jedna nebo více z následujících případů:
LocalizableAttribute Atribut parametr nebo vlastnost nastavena na hodnotu true.
Název parametru nebo vlastnost obsahuje "Text", "Zpráva" nebo "Titulek".
"Hodnota" nebo "formát" je název parametru řetězec, který je předán metodě Console.Write nebo Console.WriteLine.
Popis pravidla
Řetězcové literály, které jsou vloženy do zdrojového kódu je obtížné lokalizovat.
Jak opravit porušení
Opravit porušení tohoto pravidla, nahraďte řetězcový literál řetězce načíst prostřednictvím instance ResourceManager třídy.
Při potlačení upozornění
Je bezpečné bude lokalizován knihovny kódu nebo řetězec není vystavena koncového uživatele nebo vývojáře pomocí knihovny kódu potlačit varování od tohoto pravidla.
Uživatelům můžete vyloučit hluku proti metod, které by neměly být předány lokalizovaných řetězců přejmenováním buď parametr nebo vlastnost s názvem nebo označením položky jako podmíněné.
Příklad
Následující příklad ukazuje způsob, který výjimku buď dva argumenty jsou mimo rozsah.První argument konstruktoru výjimka je předán řetězcový literál, který poruší toto pravidlo.Druhý argument konstruktoru správně předán řetězec načtené pomocí 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));
}
}
};
}