Поделиться через


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

См. также

Основные понятия

Ресурсы в приложениях для настольных систем