Интернационализация MVC3 - какой подход лучше?сеанс, печенье? - PullRequest
3 голосов
/ 29 апреля 2011

Дорогие все, я работаю над приложением MVC, которое должно поддерживать два или более языков и охватывает пользовательский интерфейс для разных стран. Я хотел бы получить некоторые рекомендации о наилучшем подходе для сохранения выбора пользователя для языка и портала. Я читал, и кажется, что:

  • Он может быть сохранен в файле cookie, считывая эти значения как постоянные данные, и воссоздавать этот файл cookie при изменении какого-либо значения
  • В другом случае они предпочитают устанавливать информацию в httpcontext в сеансе.
  • Другой подход заключается в использовании базового контроллера для изменения данных с учетом выбора локали.

Любая идея, плюсы и минусы будут оценены. Спасибо заранее. brgds.

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011

Я использовал эту схему , и я доволен этим.

У него есть язык в маршруте. Это оказывается удобным:

  • в какой-то момент вам придётся отправить ссылку на страницу с выбранным языком
  • SEO
  • легко переключаться между языками в процессе разработки и в процессе перевода
  • нет проблем с вашим балансировщиком нагрузки
  • внешние тесты более стабильны, если вы можете определить язык в URL
2 голосов
/ 27 сентября 2011

Подход, который я нашел для интернационализации Enums или получения текста Enums из соответствующих файлов ресурсов, заключается в создании класса атрибута путем наследования класса DescriptionAttribute

public class EnumResourceAttribute : DescriptionAttribute
{

    public Type ResourceType { get; private set; }
    public string ResourceName { get; private set; }
    public int SortOrder { get; private set; }
    public EnumResourceAttribute(Type ResourceType,
                         string ResourceName,
                         int SortOrder)
    {

        this.ResourceType = ResourceType;
        this.ResourceName = ResourceName;
        this.SortOrder = SortOrder;
    }
}

Создание другого статического класса, который будет предоставлять методы расширения для GetString.и GetStrings.

public static class EnumHelper
{
    public static string GetString(this Enum value)
    {
        EnumResourceAttribute ea =
       (EnumResourceAttribute)value.GetType().GetField(value.ToString())
        .GetCustomAttributes(typeof(EnumResourceAttribute), false)
         .FirstOrDefault();
        if (ea != null)
        {
            PropertyInfo pi = ea.ResourceType
             .GetProperty(CommonConstants.ResourceManager);
            if (pi != null)
            {
                ResourceManager rm = (ResourceManager)pi
                .GetValue(null, null);
                return rm.GetString(ea.ResourceName);
            }

        }
        return string.Empty;
    }


    public static IList GetStrings(this Type enumType)
    {
        List<string> stringList = new List<string>();
        FieldInfo[] fiArray = enumType.GetFields();
        foreach (FieldInfo fi in fiArray)
        {
            EnumResourceAttribute ea =
                (EnumResourceAttribute)fi
                     .GetCustomAttributes(typeof(EnumResourceAttribute), false)
                     .FirstOrDefault();
            if (ea != null)
            {
                PropertyInfo pi = ea.ResourceType
                                    .GetProperty(CommonConstants.ResourceManager);
                if (pi != null)
                {
                    ResourceManager rm = (ResourceManager)pi
                                          .GetValue(null, null);
                    stringList.Add(rm.GetString(ea.ResourceName));
                }
            }
        }
        return stringList.ToList();
    }
}

А на элементах вашего Enum вы можете написать:

public enum Priority
{
         [EnumResourceAttribute(typeof(Resources.AdviceModule), Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberHigh, 1)]
        High,
         [EnumResourceAttribute(typeof(Resources.AdviceModule), Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberRoutine, 2)]
        Routine
 }

Где Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberHigh & Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberRoutine - это константы в файле ресурсов или вы можете сказатьстроки, значения которых могут быть доступны в разных культурах.

Если вы реализуете свое веб-приложение в архитектуре MVC, то создайте свойство

private IList result;
public IList Result
        {
            get
            {
                result = typeof(Priority).GetStrings();
                return result;
            }
        }

и в своем файле .cshtml вы можете простопривязать перечисление к вашему выпадающему списку, например:

 @Html.DropDownListFor(model => Model.vwClinicalInfo.Priority, new SelectList(Model.Result))
1 голос
/ 29 апреля 2011

Сеансы / куки хороши для этой цели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...