OpenCart 2: Упрощаем использование локализации в коде

OpenCart 2: Упрощаем использование локализации в коде

OpenCart 2: Упрощаем использование локализации в кодеСистема поддержки локализации в OpenCart 2 имеет ряд своих проблем. Так, например, отсутствует возможность наложения переведенных частей на локализацию по умолчанию, что есть в стандартном механизме Joomla и делает последнюю более гибкой в этом смысле. Проблема в OpenCart легко воспроизводится, достаточно добавить язык и вы увидите вместо перевода коды языковых констант. Но, если эта проблема лечится достаточно просто - копированием файлов, то еще есть одна более насущная проблема - это бесконечные портянки кода языковых переменных. И в данной статье я покажу вам как можно если не решить, то как минимум упростить и уменьшить код.

Суть проблемы. Если следовать изначально предлагаемому принципу, то вам необходимо разместить каждую языковую константу как в файле локализации, так и в массиве $data у контроллера для последующей передачи и генерации переменных в шаблоне. Выглядит это примерно так.

Файл локализации:

$_['text_1'] = 'Текст 1';
$_['text_2'] = 'Текст 2';
$_['text_3'] = 'Текст 3';
....
$_['text_11'] = 'Текст 11';
$_['text_12'] = 'Текст 12';
$_['text_13'] = 'Текст 13';

А вот такой код будет в файле контроллера

$data['text_1'] = $this->language->get('text_1');
$data['text_2'] = $this->language->get('text_2');
$data['text_3'] = $this->language->get('text_3');
...
$data['text_11'] = $this->language->get('text_11');
$data['text_12'] = $this->language->get('text_12');
$data['text_13'] = $this->language->get('text_13');

И только после этого, вы сможете использовать в шаблоне соответствующие переменные ($text_1, $text_2 ...). Если использовать всего несколько языковых констант, то написать пару строчек не сложно. Но, если у вас интерфейс не вида "Нажать кнопку", то потенциально таких переменных становится десятки или даже сотни. Отчасти, такая система подталкивает создателей модулей и прочего полезного писать тексты прямо в шаблоне, чтобы не бегать по трем файлам из-за каждой фразы (при наличии других языков и того больше). Это все в общем-то приводит к последующим проблемам с переводами и поддержкой.

Однако, механизм локализации сделан таким образом, что есть достаточно простой способ обойти эту проблему и упростить себе задачу. Дело заключается в том, что при вызове функции get для получения языковой константы не проверяется ее принадлежность к текстовым или числовым переменным. Грубо говоря, вы можете прописать в массив $_ даже stdObject. По сути, вся проверка сводится к "в соответствующем поле хоть что-нибудь есть". Правильно это или нет - отдельный вопрос. Но, одно можно сказать точно - такой возможностью грех не воспользоваться.

И теперь, я покажу как можно использовать эту особенность для упрощения поддержки языков и вывода при помощи использования массива (array).

В файле локализации составим конструкцию такого вида:

$_['module_label'] = array(
    'text_1' => 'text_1',
    'text_2' => 'text_2',
    'text_3' => 'text_3',
    ///
    'text_11' => 'text_11',
    'text_12' => 'text_12',
    'text_13' => 'text_13'
);

Теперь, занесем одну единственную строчку в контроллер

$data['module_label'] = $this->language->get('module_label');

И добавим в шаблон функцию:

<?php
function label($module_label, $name)
{
    if (is_array($module_label)) {
        if (isset($module_label[$name]))
            return $module_label[$name];
    }
    return $name;
}
?> 

Теперь при добавлении константы, достаточно будет просто написать следующее:

<?php echo label($module_label, 'text_2'); ?>

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

Основные плюсы такого подхода:

  • Отсутствие портянок кода
  • Возможность вначале составить шаблон, а уже потом подгонять под него файл локализации, как в принципе и должно быть
  • В контроллере нужна всего 1 строчка кода
  • Легкость модификации языковых констант (добавление, редактирование, удаление)
  • Простота механизма и его применения

Теперь, вы узнали как упростить использование локализации в OpenCart 2, а так же некоторые особенности стандартного механизма.

Социальные сети

☕ Понравился обзор? Поделитесь с друзьями!

Комментарии / отзывы  

0 # Кодер 02.11.2016 19:19
В версии 1.5 эта фишка так же прокатывает.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 02.11.2016 19:22
Так и есть, этот подход можно использовать и в OpenCart 1.5, просто на момент написания статьи смотрел только 2-ю версию.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
Добавить комментарий / отзыв
Комментарий - это вежливое и наполненное смыслом сообщение (правила).



* Нажимая на кнопку "Отправить", Вы соглашаетесь с политикой конфиденциальности.
Социальные сети
Программы (Freeware, OpenSource...)