CA1303: не следует передавать литералы в виде локализованных параметров
TypeName |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
Категория |
Microsoft.Globalization |
Критическое изменение |
Не критическое |
Причина
Метод передает строковый литерал в виде параметра конструктору или методу в библиотеке классов .NET Framework, и эта строка должна быть локализуемой.
Это предупреждение выдается, если строковый литерал передается как значение параметру или свойству и выполняется одно или несколько из следующих условий:
Значение атрибута LocalizableAttribute параметра или свойства равно "true".
Имя параметра или свойства содержит "Text", "Message" или "Caption".
Имя строкового параметра, который передается методу Console.Write или Console.WriteLine, равно "value" или "format".
Описание правила
Сложно локализовать строковые литералы, внедренные в исходный код.
Устранение нарушений
Чтобы исправить нарушение этого правила, необходимо заменить строковый литерал строкой, извлекаемой с помощью экземпляра класса ResourceManager.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила безопасно в том случае, если библиотека кода не предназначена для локализации, либо строка не предоставляется пользователю, либо разработчик использует библиотеку кода.
Пользователи могут избавиться от помех методам, которым не должны передаваться локализованные строки, либо переименовав параметр или свойство с именем, либо пометив эти элементы как условные.
Пример
В следующем примере показан метод, который создает исключение, если любой из его двух аргументов оказывается за пределами допустимого диапазона.Для первого аргумента конструктору исключения передается строковый литерал, что нарушает данное правило.Для второго аргумента конструктору правильно передается строка, извлеченная с помощью 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));
}
}
};
}