CA1303: ローカライズされたパラメーターとしてリテラルを渡さないでください
TypeName |
DoNotPassLiteralsAsLocalizedParameters |
CheckId |
CA1303 |
カテゴリ |
Microsoft.Globalization |
互換性に影響する変更点 |
なし |
原因
メソッドが、.NET Framework クラス ライブラリのコンストラクターまたはメソッドへのパラメーターとして、リテラル文字列を渡しています。その文字列はローカライズできません。
この警告は、リテラル文字列が値としてパラメーターまたはプロパティに渡されており、次の条件の 1 つ以上に該当する場合に表示されます。
パラメーターまたはプロパティの LocalizableAttribute 属性が true に設定されている。
パラメーターまたはプロパティの名前に、"Text"、"Message"、または "Caption" という文字列が含まれている。
Console.Write メソッドまたは Console.WriteLine メソッドに渡される文字列パラメーターの名前が、"value" または "format" である。
規則の説明
ソース コードに埋め込まれているリテラル文字列は、ローカライズが困難です。
違反の修正方法
この規則違反を修正するには、リテラル文字列を ResourceManager クラスのインスタンスによって取得した文字列で置換します。
警告を抑制する状況
コード ライブラリをローカライズしない場合、またはコード ライブラリを使用した文字列がエンド ユーザーまたは開発者に表示されない場合は、この規則による警告を抑制しても安全です。
こうすることで、ローカライズされた文字列を渡すことができないメソッドについて、ユーザーがノイズを除去できるようになります。除去するには、パラメーターまたはプロパティに付けられた名前を変更するか、これらの項目を条件付きにします。
使用例
2 つの引数のいずれかが範囲外であるときに、例外をスローするメソッドを次の例に示します。 1 つ目の引数では、リテラル文字列が例外のコンストラクターに渡されるため、規則違反です。 2 つ目の引数では、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));
}
}
};
}