Использование паттерна «Стратегия» (Strategy) для реализации многоязычного интерфейса пользователя

Паттерн «Стратегия» может существенно облегчить задачу создания многоязычного интерфейса пользователя.

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

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

Паттерн «Стратегия» состоит из трёх компонентов:

  • Strategy (Стратегия). Базовый класс для Concrete Strategy. Объявляет интерфейс общий для всех поддерживаемых алгоритмов. Класс Context использует этот интерфейс для вызова конкретного алгоритма, реализованного в классе Concrete Strategy;
  • Concrete Strategy (Конкретная стратегия). Реализует алгоритм использующий интерфейс, объявленный в классе Strategy;
  • Context (Контекст). Класс, который использует алгоритмы «Стратегии». Хранит ссылку на объект класса Strategy и конфигурируется объектом класса Concrete Strategy. Также может определять интерфейс позволяющий объекту Strategy получить доступ к данным контекста.

В данной задаче конкретной стратегией будет являться каждый класс реализующий тот или иной конкретный перевод. Стратегия – базовый класс для классов, реализующих переводы. Контекст – им может быть окно программы, страница web приложения либо отдельный не визуальный класс, который отвечает за локализацию.

Рассмотрим применение паттерна «Стратегия» при создании многоязычного интерфейса на примере PHP. Для наглядности в данном примере будет выполнен только перевод текстового контента.

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

Также создадим два класса для переводов, на русский и английский языки.

В контексте создаём переменную (поле) для перевода ифункцию (или метод, если контекст – объект какого-либо класса) которая будет определять, какой из переводов следует использовать в зависимости от текущих настроек веб-приложения.

 Остаётся только вызвать соответствующие методы класса перевода на странице.

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

Главные преимущества такого подхода – расширяемость и компактность. Можно создать ровно столько классов с переводами, сколько будет не обходимо. В тоже время каждый класс реализующий перевод достаточно компактен. В нём нет ничего кроме самого перевода. Весь функционал реализован в базовом классе.

Вместе с этим имеются и недостатки. Так как перевод хранится в программе, способ реализации перевода, основанный на классическом паттерне «Стратегия», идеально подходит только для небольших программ или страниц, которые не содержат большого количества текстовых надписей или больших объёмов текста.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *