C# 城堡单轨魔法

C# 城堡单轨魔法,c#,localization,castle-monorail,nvelocity,resourcemanager,C#,Localization,Castle Monorail,Nvelocity,Resourcemanager,我正在从事的项目支持许多地区。该解决方案基于使用一些Castle单轨机制。适当的控制器等级标记如下: [资源(“pageResx”,“Controllers.Static”)] 其中StaticTemplate是控制器名称前缀,资源文件位于“..\Resources\Controllers\StaticTemplate*”中 另一方面,StaticController继承自BaseController类,该类标记如下: [本地化筛选器(RequestStore.Session,“locale”)

我正在从事的项目支持许多地区。该解决方案基于使用一些Castle单轨机制。适当的控制器等级标记如下:

[资源(“pageResx”,“Controllers.Static”)]

其中StaticTemplate是控制器名称前缀,资源文件位于“..\Resources\Controllers\StaticTemplate*”中

另一方面,StaticController继承自BaseController类,该类标记如下:

[本地化筛选器(RequestStore.Session,“locale”)]

因此,用户的区域设置存储在会话中。就是这样。最后一步是NVelocity vm文件,在该文件中使用适当的资源,如下所示:

$pageResx.Buttons\u下载

这样,对于locale='de'的用户,ID='Buttons\u 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'文件。 在查看页面方面,Monorail为pt用户从pt BR文件获取本地化资源。 但是实现电子邮件构造的逻辑没有做到这一点。而是从使用“en”的基本资源中获取本地化字符串

我阅读了有关映射资源的.NET机制()。但是找不到Monorail的描述

问题是Monorail(或其他人)如何将“pt”映射到“pt BR”?我应该怎么做才能在外面实现同样的逻辑


提前感谢

我假设这是在访问者web上下文之外运行的?为了让.NET从您的资源中获取适当的字符串,您需要更改当前线程的区域性:

var culture = CultureInfo.CreateSpecificCulture( "pt" );
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
我看到您在通话中传递了文化:

 var resourceString = printJobResourceManager.GetString(resourceId, 
                                culture);

你是说即使在适当的区域性中发送,此调用也会返回worng结果吗?

我猜你没有使用Monorail的电子邮件呈现机制,对吗?如果您这样做了,它应该使用与常规web视图相同的资源解析机制。那么-您能否指定您在该项目中使用的Monorail版本?>肯:您是对的-我没有使用Monorail的电子邮件呈现机制。我们在项目中使用Monorail v2.0.5*。>肯:我在构建电子邮件正文时使用Monorail方法。但问题是它是在服务器端实现的。完全是另一个项目。这就是逻辑:printJobResourceManager=newResourceManager(“…Resources.PrintJob”,typeof(EmailPersonalizer.Assembly);您如何设置该
文化
值?什么是CurrentCulture和CurrentUICulture?