Замок Магия монорельса

Проект, над которым я работаю, поддерживает несколько языков. Решение основано на использовании некоего механизма Castle Monorail. Соответствующий класс контроллера отмечен следующим образом:

[Resource ("pageResx", "... Controllers.Static")]

Где StaticTemplate - это префикс имени контроллера, а файл ресурсов помещается в '.. \ Resources \ Controllers \ StaticTemplate *'.

С другой стороны, StatiController наследуется от класса BaseController, который помечен следующим образом:

[LocalizationFilter (RequestStore.Session, "языковой стандарт")]

Итак, языковой стандарт для пользователя сохраняется в сеансе. Вот и все. Последний шаг - это vm-файл NVelocity, в котором соответствующий ресурс берется следующим образом:

$ pageResx.Buttons_Download

Таким образом, строка ресурса с ID = 'Buttons_Download' для пользователя с locale = 'de' берется из файла '.. \ 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). Но описания монорельса найти не удалось.

Вопрос в том, как монорельс (или кто-то еще) отображает «pt» на «pt-BR»? И что я должен сделать, чтобы реализовать ту же логику снаружи?

заранее спасибо


person godspeed    schedule 04.02.2013    source источник
comment
Я предполагаю, что вы не используете механизм рендеринга электронной почты Monorail, я прав? если вы это сделали, он должен был использовать тот же механизм разрешения ресурсов, что и для обычных веб-представлений.   -  person Ken Egozi    schedule 04.02.2013
comment
также - не могли бы вы указать, какую версию монорельса вы используете в этом проекте?   -  person Ken Egozi    schedule 04.02.2013
comment
›Кен: Вы правы - я не использую механизм рендеринга электронной почты Monorail. В проекте мы используем Monorail v2.0.5 *.   -  person godspeed    schedule 05.02.2013
comment
›Кен: Я использую монорельсовый подход при создании тела письма. Но дело в том, что это реализовано на стороне сервера. Другой проект вообще. Такова логика: printJobResourceManager = new ResourceManager (... Resources.PrintJob, typeof (EmailPersonalizer) .Assembly);   -  person godspeed    schedule 05.02.2013
comment
как вы устанавливаете это значение culture? а что такое CurrentCulture и CurrentUICulture?   -  person Ken Egozi    schedule 02.05.2013


Ответы (1)


Я предполагаю, что это работает вне веб-контекста посетителей? Чтобы .NET мог получить соответствующие строки из ваших ресурсов, вам нужно будет изменить культуру текущего потока:

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

Я вижу, что в своем призыве вы передаете культуру:

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

Вы хотите сказать, что этот вызов возвращает устаревший результат, даже если вы отправляете соответствующую культуру?

person jishi    schedule 06.02.2013