城堡单轨电车魔术

本文关键字:魔术 单轨电 城堡 | 更新日期: 2023-09-27 17:57:48

我正在进行的项目支持多种语言环境。该解决方案基于使用一些Castle单轨机构。适当的控制器类别标记如下:

[资源("pageResx","…控制器.静态")]

其中StaticTemplate是控制器名称前缀,资源文件位于".."中。。''Resources''Controllers''StaticTemplate*'。

另一方面,StatiController继承了BaseController类,该类标记如下:

[LocalizationFilter(RequestStore.Session,"locale")]

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

$pageResx.Buttons_下载

这样,区域设置为"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"文件。在视图页面方面,Monorail从pt BR文件中为pt用户获取本地化资源。但实现电子邮件构建的逻辑却未能做到这一点。相反,它从基本资源中获取本地化字符串,而"en"曾是该资源。

我读过关于映射资源的.NET机制的文章(http://msdn.microsoft.com/en-us/library/sb6a8618.aspx)。但没有找到Monorail的描述。

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

提前感谢

城堡单轨电车魔术

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

var culture = CultureInfo.CreateSpecificCulture( "pt" );
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;

我看到你在通话中传递文化:

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

你是说即使在发送适当的区域性时,这个调用也会返回wong结果吗?