Если открыть практически любой контроллер opencart, можно увидеть
как после загрузки языка
$this->load->language('catalog/product');
подгружаются языковые константы
$data['text_list'] = $this->language->get('text_list');
$data['text_no_results'] = $this->language->get('text_no_results');
$data['text_confirm'] = $this->language->get('text_confirm');
$data['column_name'] = $this->language->get('column_name');
$data['column_attribute_group'] = $this->language->get('column_attribute_group');
$data['column_sort_order'] = $this->language->get('column_sort_order');
$data['column_action'] = $this->language->get('column_action');
и так для каждой константы.
что бы не прописывать каждый перевод можно было сделать такой трюк
$data = array(); // тут мы инициируем переменную $data если она не задана ранее
$data += $this->load->language('catalog/attribute'); // а тут копируем в неё все языковые константы
но это имело смысл только до версии 3.0
потому как с версии 3.0 добавили такую интересную штуку controller\event\language.php
public function index(&$route, &$args) {
foreach ($this->language->all() as $key => $value) {
if (!isset($args[$key])) {
$args[$key] = $value;
}
}
}
сами event'ы были и раньше, но language event добавили только в 3.0
а как же это работает? довольно просто:
всё начинается с того что в файле framework.php создается и регистрируется event, который в свою очередь регистрирует все ивенты из конфига
// Event
$event = new Event($registry);
$registry->set('event', $event);
// Event Register
if ($config->has('action_event')) {
foreach ($config->get('action_event') as $key => $value) {
foreach ($value as $priority => $action) {
$event->register($key, new Action($action), $priority);
}
}
}
в конфиге среди прочих есть такие строчки
$_['action_event'] = array(
...
'view/*/before' => array(
999 => 'event/language',
...
таким образом перед каждым вызовом $this->load->view загружаются соответствующие языковые константы