私が取り組んでいるプロジェクトは、多くのロケールをサポートしています。このソリューションは、キャッスル モノレール メカニズムの使用に基づいています。適切なコントローラー クラスは次のようにマークされます。
[Resource("pageResx", "...Controllers.Static")]
ここで、StaticTemplate はコントローラー名のプレフィックスであり、リソース ファイルは '..\Resources\Controllers\StaticTemplate*' に配置されます。
一方、StatiController は、次のようにマークされている BaseController クラスから継承します。
[LocalizationFilter(RequestStore.Session, "ロケール")]
そのため、ユーザーのロケールはセッションに保存されます。で、これです。最後のステップは NVelocity vm-file で、適切なリソースが次のように取得されます。
$pageResx.Buttons_Download
このようにして、locale='de' を持つユーザーの ID = 'Buttons_Download' を持つリソース文字列が、ファイル '..\Resources\Controllers\Static.de.resx' から取得されます。
ただし、ローカリゼーションが行われるプロジェクトには別の場所があります - 電子メールの作成です。そこには次のロジックが実装されています。
public class EmailPersonalizer : IEmailPersonalizer
{
...
printJobResourceManager = new ResourceManager("...Resources.PrintJob",
typeof (EmailPersonalizer).Assembly);
public string ToLocalizedString(string resourceId, VendorUser user,
params object[] args)
{
...
var resourceString = printJobResourceManager.GetString(resourceId,
culture);
...
}
...
}
パラメータの値を指定すると、resourceString が正しく評価されます。しかし...
ここで魔法が来ます。ブラジルロケール用のリソースファイルがあります。接尾辞「pt-BR」が付いています。ポルトガル語のロケールもありますが、適切なリソース ファイルがありません - 'pt' ファイルがありません。ビュー ページに関しては、モノレールは pt-user の pt-BR ファイルからローカライズされたリソースを取得します。しかし、電子メールの構築を実装するロジックは、同じことを行うことができません。代わりに、「en」が使用されていた基本リソースからローカライズされた文字列を取得します。
リソースをマッピングするための .NET メカニズムについて読みました ( http://msdn.microsoft.com/en-us/library/sb6a8618.aspx )。しかし、モノレールの説明は見つかりませんでした。
問題は、モノレール (または誰でも) が「pt」を「pt-BR」にどのようにマッピングするかです。そして、同じロジックを外部に実装するにはどうすればよいでしょうか?
前もって感謝します