Click to Rate and Give Feedback
MSDN
MSDN Library
.NET Development
Previous Versions
.NET Framework 3.0
Tools
Development Tools
FxCop
FxCop Warnings
 Do not pass literals as localized p...

  Switch on low bandwidth view
This page is specific to
Microsoft Visual Studio 2005/.NET Framework 2.0

Other versions are also available for the following:
Visual Studio Team System
Do not pass literals as localized parameters

TypeName

DoNotPassLiteralsAsLocalizedParameters

CheckId

CA1303

Category

Microsoft.Globalization

Breaking Change

NonBreaking

An externally visible method passes a string literal as a parameter to a constructor or method in the .NET Framework class library and that string should be localizable.

String literals that are embedded in source code are difficult to localize.

To fix a violation of this rule, replace the string literal with a string retrieved through an instance of the System.Resources.ResourceManager class.

It is safe to exclude a warning from this rule if the code library will not be localized, or if the string is not exposed to the end user or a developer using the code library.

All string parameters or properties named 'text' or 'message' are flagged. Users can eliminate noise against methods which shouldn't be passed localized strings by either renaming the parameter or property named, or by marking these items as conditional.

The following example shows a method that throws an exception when either of its two arguments are out of range. For the first argument, the exception constructor is passed a literal string, which violates this rule. For the second argument, the constructor is correctly passed a string retrieved through a ResourceManager.

Visual Basic
Imports System

<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
                Throw New ArgumentOutOfRangeException( _
                    "hour", hour, _
                    "The valid range is 0 - 23.")
            End If

            If(minute < 0 Or minute > 59) Then
                Throw New ArgumentOutOfRangeException( _
                    "minute", minute, _
                    stringManager.GetString("minuteOutOfRangeMessage", _
                        System.Globalization.CultureInfo.CurrentUICulture))
            End If

        End Sub

    End Class

End Namespace
C#
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;

[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)
            {
                throw new ArgumentOutOfRangeException(
                    "hour", hour, 
                    "The valid range is 0 - 23.");
            }

            if(minute < 0 || minute > 59)
            {
                throw new ArgumentOutOfRangeException(
                    "minute", minute,
                    stringManager.GetString(
                        "minuteOutOfRangeMessage", CultureInfo.CurrentUICulture));
            }
        }
    }
}
C++
using namespace System;
using namespace System::Globalization;
using namespace System::Reflection;
using namespace System::Resources;

[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)
            {
                throw gcnew ArgumentOutOfRangeException(
                    "hour", hour, 
                    "The valid range is 0 - 23.");
            }

            if(minute < 0 || minute > 59)
            {
                throw gcnew ArgumentOutOfRangeException(
                    "minute", minute,
                    stringManager->GetString(
                        "minuteOutOfRangeMessage", CultureInfo::CurrentUICulture));
            }
        }
    };
}
Tags What's this?: Add a tag
Community Content   What is Community Content?
Add new content RSS  Annotations
Firing on code within InitializeComponent?      David M. Kean   |   Edit   |   Show History

To prevent this rule from firing on the autogenerated InitializeComponent method, simply set Localizable to true in the properties of the Component, Control or Form. This will force the Windows Forms designer to store string and other localizable resources in the associated resource file (resx).

If you are not targeting multiple languages or locales, you can turn this rule off by doing the following:

  1. In Solution Explorer, right-click your project and choose Properties
  2. In the Project Properties window, select the Code Analysis tab
  3. Expand the Globalization Rules node and uncheck Do not pass literals as localized parameters
  4. Choose File -> Save Selected Items to save changes
Tags What's this?: Add a tag
Flag as ContentBug
Beware of performance when turning on Localizable=true for Component, Control or Form      kzu   |   Edit   |   Show History
The generated code will lookup *every* [Localizable] property from the resource manager, and set the retrieved value using reflection. So beware of the potential performance impact if you're not really going to localize your application. It may be better to evaluate and consciously ignore the places (like InitializeComponent) where it makes sense.
Tags What's this?: Add a tag
Flag as ContentBug
Retrieve Resource String and format as a wrapped string.      John D Mills ... Wernerr   |   Edit   |   Show History
Tags What's this?: Add a tag
Flag as ContentBug
Processing
© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Page view tracker