insert... resx ファイルとサテライト アセンブリの文字列リソースを使用しています。ファイルに正しい名前を付けていますか?
Resource1.resx:
<!-- snip-->
<data name="foo" xml:space="preserve">
<value>bar</value>
</data>
Resource1.FR-fr.resx
<--! le snip -->
<data name="foo" xml:space="preserve">
<value>le bar</value>
</data>
Class1.cs :
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Threading;
namespace Frankenstein
{
public class Class1
{
struct LocalizedCallback
{
private WaitCallback localized;
public LocalizedCallback(WaitCallback user)
{
var uiCult = Thread.CurrentThread.CurrentUICulture;
// wrap
localized = (state) =>
{
var tp = Thread.CurrentThread;
var oldUICult = tp.CurrentUICulture;
try
{
// set the caller thread's culture for lookup
Thread.CurrentThread.CurrentUICulture = uiCult;
// call the user-supplied callback
user(state);
}
finally
{
// let's restore the TP thread state
tp.CurrentUICulture = oldUICult;
}
};
}
public static implicit operator WaitCallback(LocalizedCallback me)
{
return me.localized;
}
}
public static void Main(string[] args)
{
AutoResetEvent evt = new AutoResetEvent(false);
WaitCallback worker = state =>
{
Console.Out.WriteLine(Resource1.foo);
evt.Set();
};
// use default resource
Console.Out.WriteLine(">>>>>>>>>>{0}", Thread.CurrentThread.CurrentUICulture);
Console.Out.WriteLine("without wrapper");
ThreadPool.QueueUserWorkItem(worker);
evt.WaitOne();
Console.Out.WriteLine("with wrapper");
ThreadPool.QueueUserWorkItem(new LocalizedCallback(worker));
evt.WaitOne();
// go froggie
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("FR-fr");
Console.Out.WriteLine(">>>>>>>>>>{0}", Thread.CurrentThread.CurrentUICulture);
Console.Out.WriteLine("without wrapper");
ThreadPool.QueueUserWorkItem(worker);
evt.WaitOne();
Console.Out.WriteLine("with wrapper");
ThreadPool.QueueUserWorkItem(new LocalizedCallback(worker));
evt.WaitOne();
}
}
}
出力:
>>>>>>>>>>en-US
without wrapper
bar
with wrapper
bar
>>>>>>>>>>fr-FR
without wrapper
bar
with wrapper
le bar
Press any key to continue . . .
これが機能する理由は、Resource1.Culture プロパティが常に null に設定されているため、デフォルト (IE Thread.CurrentThread.UICulture) にフォールバックするためです。
それを証明するには、Resource1.Designer.cs ファイルを編集し、クラスから次の属性を削除します。
//[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
次に、Resource.Culture プロパティ アクセサーと foo プロパティ アクセサーにブレークポイントを設定し、デバッガーを起動します。
乾杯、フロリアン