1

我正在从事的项目支持多种语言环境。该解决方案基于使用一些 Castle Monorail 机制。相应的控制器类标记如下:

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

其中 StaticTemplate 是 Controller 名称前缀,资源文件放置在 '..\Resources\Controllers\StaticTemplate*' 中。

另一方面,StatiController 继承自 BaseController 类,其标记如下:

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

因此,用户的语言环境存储在会话中。就是这样。最后一步是 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”文件。在查看页面方面,Monorail 从 pt-BR 文件为 pt-user 获取本地化资源。但是实现电子邮件构造的逻辑却没有做同样的事情。取而代之的是从“en”过去的基本资源中获取本地化字符串。

我阅读了有关映射资源的 .NET 机制(http://msdn.microsoft.com/en-us/library/sb6a8618.aspx)。但未能找到单轨铁路的描述。

问题是单轨列车(或任何人)如何将“pt”映射到“pt-BR”?我应该怎么做才能在外面实现相同的逻辑?

提前致谢

4

1 回答 1

0

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

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

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

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

您是说即使您发送了适当的文化,此调用也会返回磨损的结果?

于 2013-02-06T09:43:08.263 回答