Статьи

Многоязычная поддержка в CodeIgniter

Многоязычная поддержка, также известная как интернационализация, является ключевой особенностью современных веб-приложений. Большинство полнофункциональных PHP-фреймворков поставляются с многоязыковой поддержкой, которая позволяет нам динамически представлять интерфейс нашего приложения на разных языках без дублирования существующего исходного кода для каждого языка. Сегодня мы обсудим, как мы можем включить несколько языков с помощью CodeIgniter, а также несколько трюков для настройки основных функций.

Настройка многоязычной поддержки

Сначала нам нужно настроить необходимые файлы, прежде чем мы сможем начать использовать языковую поддержку. Файл конфигурации CodeIgniter, расположенный в каталоге application/config , содержит опцию language, которая определяет язык приложения по умолчанию.

 <?php $config['language'] = 'english'; 

Нам также необходимо создать фактические файлы, которые содержат наши сообщения на разных языках. Эти файлы должны быть помещены в каталог application/language с отдельным каталогом для каждого языка. Например, файлы на английском языке должны находиться в каталоге application/language/english , а файлы на французском языке должны находиться в application/language/french .

Давайте создадим несколько языковых файлов, которые содержат сообщения об ошибках для примера приложения. Создайте файл english/message_lang.php (важно, чтобы все языковые файлы имели суффикс _lang.php ). Следующий код содержит несколько примеров записей для содержимого нашего языкового файла:

 <?php $lang["msg_first_name"] = "First Name"; $lang["msg_last_name"] = "Last Name"; $lang["msg_dob"] = "Date of Birth"; $lang["msg_address"] = "Address"; 

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

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

Загрузка языковых файлов

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

 <?php class TestLanguage extends CI_Controller { public function __construct() { parent::__construct(); $this->lang->load("message","english"); } function index() { $data["language_msg"] = $this->lang->line("msg_hello_english"); $this->load->view('language_view', $data); } } 

Мы обычно работаем с языковыми файлами внутри контроллеров и представлений (использование языковых файлов внутри моделей не такая уж хорошая вещь). Здесь мы использовали конструктор контроллера для загрузки языкового файла, чтобы его можно было использовать во всем классе, а затем мы ссылаемся на него в методе index() класса.

Первым параметром метода lang-> load () будет имя файла языка без суффикса _lang. Вторым необязательным параметром является языковой каталог. Он будет указывать на язык по умолчанию в вашей конфигурации, если он не указан здесь.

Мы можем напрямую ссылаться на записи языкового файла, используя метод lang->line() и назначить его возврат для данных, передаваемых в шаблоны представления. Внутри представления мы можем использовать вышеуказанное языковое сообщение как $language_msg .

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

 <?php $this->lang->line("msg_hello_english"); 

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

 <?php lang("msg_view_english"); 

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

Назначение ответственности за загрузку языка для хуков

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

Мы enable_hooks хуки в нашем приложении, устанавливая параметр enable_hooks в основном конфигурационном файле.

 <?php $config['enable_hooks'] = TRUE; 

Затем мы можем открыть файл hooks.php внутри директории config и создать собственный хук, как показано в следующем коде:

 <?php $hook['post_controller_constructor'] = array( 'class' => 'LanguageLoader', 'function' => 'initialize', 'filename' => 'LanguageLoader.php', 'filepath' => 'hooks' ); 

Это определяет хук и предоставляет необходимую информацию для его выполнения. Реальная реализация будет создана в пользовательском классе внутри каталога application/hooks .

 <?php class LanguageLoader { function initialize() { $ci =& get_instance(); $ci->load->helper('language'); $ci->lang->load('message','english'); } } 

Здесь у нас нет доступа к языковой библиотеке с помощью $this->lang , поэтому нам нужно получить экземпляр объекта CI с помощью функции get_instance() , а затем мы загружаем язык, как это делали ранее. Теперь языковой файл будет доступен для каждого контроллера нашего приложения без необходимости вручную загружать его внутри контроллеров.

Переключение между разными языками

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

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

 <?php class LangSwitch extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('url'); } function switchLanguage($language = "") { $language = ($language != "") ? $language : "english"; $this->session->set_userdata('site_lang', $language); redirect(base_url()); } } 

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

 <a href='<?php echo $base_url; ?>langswitch/switchLanguage/english'>English</a> <a href='<?php echo $base_url; ?>langswitch/switchLanguage/french'>French</a> 

Всякий раз, когда пользователь выбирает определенный язык, метод switchLanguage() класса LangSwitch назначит выбранные языки сеансу и перенаправит пользователя на домашнюю страницу.

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

 <?php class LanguageLoader { function initialize() { $ci =& get_instance(); $ci->load->helper('language'); $site_lang = $ci->session->userdata('site_lang'); if ($site_lang) { $ci->lang->load('message',$ci->session->userdata('site_lang')); } else { $ci->lang->load('message','english'); } } } 

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

Вывод

Большинство полнофункциональных PHP-фреймворков имеют многоязычную поддержку, что позволяет нам легко представлять интерфейс нашего приложения на разных языках. В этой статье мы увидели, как предоставить несколько языков с помощью CodeIgniter. Конечно, есть и другие способы создания многоязычных решений, поэтому не стесняйтесь обсуждать лучшие практики и опыт, которые вы имели при реализации многоязыковой поддержки в CodeIgniter и даже в других средах. В ожидании ответа от вас!

Изображение через Fotolia