Локализация ASPX-страницы программно от загрузки страницы - PullRequest
1 голос
/ 27 февраля 2012

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

Я занимаюсь разработкой слоя пользовательского интерфейса с начальной загрузкой и jQuery, aspx в основном генерирует статический HTML и выполняет много AJAX.

Одна старая проблема - локализация на нескольких разных языках.Что я делаю, так это оборачиваю локализованные фрагменты страницы в пользовательские теги, как показано ниже:

<localization culture="en" runat="server">
    <h3>Add everything...</h3>
    <p><i>Remember you can add also <a href="">by email</a> and <a href="">by gtalk</a>.</i></p>
</localization>
<localization culture="it" runat="server">
    <h3>Aggiungi tutto...</h3>
    <p><i>Ricorda che puoi farlo anche <a href="">via email</a> e <a href="">via gtalk</a>.</i></p>
</localization>

Затем в моей page_load я вызываю рекурсивную функцию:

  protected void Page_Load(object sender, EventArgs e)
  {
     Localization(Page);
  }

, которая выполняет следующие действия:

  protected void Localization(Control parent)
  {
     foreach (Control c in parent.Controls)
     {
        if (c.GetType() == typeof(HtmlGenericControl))
        {
           HtmlGenericControl hgc = (HtmlGenericControl)c;
           if( hgc.TagName == "localization")
           {
              if (hgc.Attributes["culture"] != null && hgc.Attributes["culture"] != lu.ui_culture)
              {
                 c.Visible = false;
              }
           }
        }

        Localization(c);
     }
  }

Я вижу несколько недостатков в этом подходе: у меня не может быть переводов в отдельном XML-файле, и я обрабатываю HTML с помощью рекурсивной функции.

Но нав то же время мне это нравится, потому что это позволяет легко переводить фрагменты с большой разметкой HTML, и я также могу хранить все в одном месте.

Раньше я использовал другой подход, рендеринг HTML с помощьюxslt + xml, но тоже был кошмаром, даже если вам удалось стать пуристом без встроенного JavaScript и встроенного CSS, визуально сложно управлять XML и HTML в одном файле.


Итак, мой вопросы :

  1. это глупое решение?
  2. с точки зрения производительности это слишком плохо?
  3. как мне управлять самым динамичнымсодержание таким образом, чтобы неопытные люди могли редактировать файл перевода?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Это не глупое решение, оно выглядит намного проще, чем выполнять какое-то ужасное искажение xslt:)

С точки зрения производительности все будет в порядке, но в конечном итоге все зависит от того, сколько запросов попадает на ваш сервер, и еслиэто может не отставать от груза.Если вы ожидаете небольшой нагрузки (несколько пользователей), у вас все будет в порядке.

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

tblControlTranslation (PageName (nvarchar), ControlName (nvarchar), Translation (nvarchar)).

По умолчанию каждый элемент управления будет содержать английский (так что вы знаете, что к чему), а затем код будет проходить по каждому элементу управления и помещать переведенный текст.

0 голосов
/ 09 марта 2012

Я провел несколько простых тестов, используя приведенную выше рекурсивную функцию и выполнил несколько xslt, чтобы заменить текст в html в соответствии с выбранным языком.С рекурсивной функцией над ним инструмент 0,001349 секунд, с использованием xslt это заняло 0,006989.Тем не менее, в конце я решил использовать xslt, а затем кешировать результаты в зависимости от выбранного языка, чтобы повысить производительность и сохранить все переводы в одном XML-файле.

0 голосов
/ 27 февраля 2012

Это, похоже, не вписывается в модель локализации ASP.NET. Почему вам нужно определить все ваши локализации в ASPX? Рассматривали ли вы использование стандартных средств локализации ASP.NET? Рассмотреть рецензию http://www.codeproject.com/Articles/38907/ASP-NET-Localization-Quick-Reference

Вы можете создать пользовательский поставщик ресурсов, который читает данные из XML. Это невероятно просто - мы только что написали пользовательский поставщик ресурсов, который читает данные из БД, - нам нужно, чтобы все конечные пользователи обновили некоторые значения - поэтому выбор БД. Не-разработчикам было бы относительно легко изменить XML-файл - или вы можете легко создать простой пользовательский интерфейс поверх него. Это также позволит вам легче управлять изменениями в именах CSS.

Текущий подход, который вы используете, будет засорять ваши ASPX переводами со всех языков и увеличит ваши трудности с обслуживаемостью в течение определенного периода времени. Этот подход также приведет к нарушению принципа разделения проблем - в некоторой степени - поскольку ваша страница будет перегружена выполнением своей обычной работы и обязанностью локализовать себя.

Вы можете обратиться к превосходной и подробной статье MSDN по адресу Расширение модели поставщика ресурсов ASP.NET 2.0 для получения более подробной информации. По сути, вам нужно реализовать следующие классы / интерфейсы и связать их через Web.config. Тогда вы можете иметь либо специфичные для страницы, либо глобальные XML-файлы, из которых вы можете читать локализованные значения. Это также открыло бы дверь для совместного использования локализованных значений на страницах, если это необходимо.

ResourceProviderFactory:

namespace System.Web.Compilation
{
    public abstract class ResourceProviderFactory
    {
        public abstract IResourceProvider CreateGlobalResourceProvider(string classKey);
        public abstract IResourceProvider CreateLocalResourceProvider(string virtualPath);
    }
}

IResourceProvider:

namespace System.Web.Compilation
{
    public interface IResourceProvider
    {
        IResourceReader ResourceReader { get; }

        object GetObject(string resourceKey, CultureInfo culture);
    }
}

Изменения в Web.config:

<system.web>
    <globalization resourceProviderFactoryType="MyCompany.Localization.CustomResourceProviderFactory" />
</system.web>

Пример структуры XML для файлов XML - либо для каждой страницы, либо для полного приложения:

<LocalizedValues>
    <Value Key="FirstTextBlock">
        <LocalizedFor Culture="en-us">
            ...
        </LocalizedFor>
        <LocalizedFor Culture="it">
            ...
        </LocalizedFor>
    </Value>
</LocalizedValues>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...