Nov 30

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

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

Нижепредставленные листинги демонстрируют пример работы такого принципа.

Локализованный файл для английского: en.php

<?php
// Декларируем все нужные строки
// на Английском языке
$GLOBALS['text'] = array (
  'welcome' => 'Welcome to our website!',
  'thanks' => 'Thank you for your patronage.',
  'sky' => 'The sky is falling!',
  'game' => 'Would you like to play a game?',
  'switch' => 'Switch the language to:',
  );

// Также определяем пути до локализованных изображений с текстом, надписями
$GLOBALS['imgsrc'] = array (
  'title' => 'graphics/title.en.png',
  'footer' => 'graphics/foot.en.jpg'
  );
?>

Локализованный файл для французского: fr.php

<?php

$GLOBALS['text'] = array (
  'welcome' => 'Bienvenue a
     notre site Web!'
,
  'thanks' => 'Merci de soutenir nos affaires.',
  'sky' => 'Le ciel tombe!',
  'game' => 'Aimez-vous jouer un jeu?',
  'switch' => 'Commutez la langue a:',
  );

$GLOBALS['imgsrc'] = array (
  'title' => 'graphics/title.fr.png',
  'footer' => 'graphics/foot.fr.jpg'
  );
?>

Локализованный файл для русского языка: ru.php

<?php

$GLOBALS['text'] = array (
  'welcome' => 'Добро пожаловать на наш web-сайт!',
  'thanks' => 'Благодарим за внимание.',
  'sky' => 'Небо рушится!',
  'game' => 'Не хотите ли вы сыграть?',
  'switch' => 'Выбрать другой язык:',
  );

$GLOBALS['imgsrc'] = array (
  'title' => 'graphics/title.ru.png',
  'footer' => 'graphics/foot.ru.jpg'
  );
?>

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

Библиотека поддержки локализации: lib_language.php

<?php
// Данная библиотека автоматически определяет
// необходимый язык для использования и
// подключает нужный языковой файл.

// Сперва определяем все возможные языки:
$languages = array(
  'en' => 'English',
  'fr' => 'French',
  'ru' => 'Russian');

// Проверяем на наличие параметра lang
// в переменной GET запроса
  if (isset($_GET['lang'])) {
  // Определена, устанавливаем нужный язык
  $lang = $_GET['lang'];
  // В cookies записываем выбор пользователя
  // на один год
  setcookie('lang', $lang, time()+(3600*24*365));
}
// иначе проверяем наличие в cookies
elseif (isset($_COOKIE['lang'])) {
  // используем значение
  $lang = $_COOKIE['lang'];
} else {
  // иначе переключаем на язык
  // по-умолчанию
  $lang = 'ru';
}

// Убеждаемся что название языка присутствует
// в массиве разрешенных языков:
if (!(in_array($lang, array_keys($languages)))) {
  // если язык отсутствует в массиве разрешенных
  // устанавливаем язык по-умолчанию
  $lang = 'ru';
  // а можно вывести сообщение об ошибке, кому как удобнее
}

// Теперь подключаем нужный языковой файл:
require_once $lang.'php';

// Одним из последних шагов является
// создание функции, предоставляющей
// пользователю выбирать язык интерфейса:
function switch_language_options() {
  // Подключаем глобальные переменные:
  global $text, $languages, $lang;

  // Перевод строки выбора языка в переменной $text['switch']:
  $retval = $text['switch'];

  // Проходим циклом по все возможным языкам
  // для создания выбора.
  $get = $_GET;
  foreach ($languages as $abbrv => $name) {
    // Формируем ссылку, если текущий язык из массива
    // не равен текущему языку интерфейса.
    if ($abbrv !== $lang) {
      // Преобразуем GET строку с этим языком
      $get['lang'] = $abbrv;
      $url = $_SERVER['PHP_SELF'] . '?' .
        http_build_query($get);
      $retval .= '  <a href="'.$url.'">'.$name.'</a>';
    }
  }

// Возвращаем сформированную гиперссылку.
  return $retval;
}
?>

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

<?php
// Подключаем языковую библиотеку
require_once 'lib_language.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD
 XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $text['welcome']; ?></title>
<meta http-equiv="Content-Type"
  content="text/html; charset=utf8" />
</head>
<body>
<p><img alt="<?php echo $text['welcome']; ?>"
  src="<?php echo $imgsrc['title']; ?>"
height="50" width="500" /></p>
<h2><?php echo $text['thanks']; ?></h2>
<p><?php echo $text['game']; ?></p>
<p><img alt="<?php echo $text['sky']; ?>"
  src="<?php echo $imgsrc['footer']; ?>"
height="10" width="220" /></p>
<p><?php echo switch_language_options(); ?></p>
</body>
</html>

Примечание: PHP также предоставляет интерфейс для GNU gettext библиотеки. Функции gettext реализуют NLS (Native Language Support) API, который может использоваться для интернационализации ваших PHP-приложений. Для включения поддержки GNU gettext в PHP, необходимо добавить в конфигурацию ключ –with-gettext[=DIR], где DIR - папка установки gettext и скомпилировать.

Пользователям Win32 следует скопировать библиотеку gnu_gettext.dll из папки DLL пакета PHP/Win32 в папку SYSTEM32. Начиная с PHP 4.2.3 имя изменилось на libintl-1.dll, также нужно скопировать iconv.dll. libintl-1.dll не требуется начиная с PHP 4.3.8, iconv.dll не требуется начиная с PHP 5.

Оригинал статьи

Написал [YS.PRO] :: тэги: , , , , ,