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


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

Недостатки:

  • Всегда должны быть русская и английская версия текста во всех местах.
  • В административной панели заголовки выглядят нечитабельно.
  • Нельзя использовать такую разметку для категорий и тегов, если планируется их прямой вывод через функции wp_list_[…] и им подобные.
  • При использовании текста в дополнительном коде PHP всегда необходимо вызывать функцию-транслятор.
  • Поисковики будут всегда получать текст для языка по умолчанию.

Данный подход является очень упрощенным и годится для несложных сайтов.

Использование в постах и страницах:

  • [ru]Русский текст[/ru]
  • [en]English text[/en]

Использование в коде PHP:

<?php 
//-- echo --
stringTranslate('[en]English text[/en][ru]Русский текст[/ru]'); 
//-- value --
$text = stringTranslate('[en]English text[/en][ru]Русский текст[/ru]', false); 
?>

Реализация:

common.js (файл javascript с вашим кодом):

function changeLanguage(ob) {
  if (ob == "ru") {
    if (!confirm("Please, confirm changing language interface to English.")) {
      return;
    }
    document.cookie = "lang=en";
  }
  else {
    if (!confirm("Подтвердите, пожалуйста, смену языка интерфейса на Русский.")) {
      return;
    }
    document.cookie = "lang=ru";
  }
  location.reload();
}


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

index.php:

//.... HTML markup before
<img src="<?php bloginfo('template_url'); ?>/images/en.png" 
  <?php echo (($lang == "en")?("title='English language is setting now.'"):
  ("style='opacity: 0.2; cursor: pointer;' onclick='changeLanguage(\"ru\");' 
  title='Set English as interface language.'")); ?>/>
<img src="<?php bloginfo('template_url'); ?>/images/ru.png" 
  <?php echo (($lang == "ru")?("title='Русский язык интерфейса сейчас установлен.'"):
  ("style='opacity: 0.2; cursor: pointer;' onclick='changeLanguage(\"en\");' 
  title='Установить русский язык интерфейса.'")); ?>/>
// HTML markup after ...


functions.php:

add_filter( 'the_content', 'content_translate' );

function content_translate ($content) {
  return stringTranslate($content, false);
}

function stringTranslate($str, $isEcho = true) {
  $rez = $str;
  if ($_COOKIE['lang']) {
    $lang = $_COOKIE['lang'];
  }
  else {
    $lang = 'en';
  }
  $rStr = 'ru';
  if ($lang == 'ru') {
    $rStr = 'en';
  }
  $am = 0;
  while (true) {
    $pos1 = strpos($rez,"[".$rStr."]");
    if ($pos1 === false) {
      break;
    }
    $pos2 = strpos($rez,"[/".$rStr."]");
    if ($pos2 === false) {
      $pos2 = strpos($rez,"[".$lang."]",$pos1);
      if (!$pos2) {
        $pos2 = strlen($rez);
      }
    }
    else {
      $pos2 += strlen("{/".$rStr."}");
    }
    $rez = str_replace(substr($rez, $pos1, $pos2 - $pos1), "", $rez);
    //-- decline endless cycle --
    $am++;
    if ($am > 100) {
      return "Cycle error!";
    }
  }
  if ($isEcho) {
    echo str_replace('[/'.$lang.']', "", str_replace('['.$lang.']', "", $rez));  
  }
  else {
    return str_replace('[/'.$lang.']', "", str_replace('['.$lang.']', "", $rez));      
  }
}


Вот собственно и все, желаю всем удачи.

Планирование производственного процесса ООО «Промопост»

[+]
Более подробно о моем участии в проекте (для российских работодателей) …

Краткие сведения о проекте:

  • Поддержка расчетов загрузки для нескольких технологий сборки
  • Планирование в рамках месяца загрузки линий сборки
  • Поддержка неограниченного количества бизнес-юнитов (фирм)
  • Оперативное планирование загрузки линий на несколько дней вперед
  • Хранение актуальной информации о производственных процессах в реальном режиме времени
  • Импорт данных из CRM-системы компании
  • Формирование отчетов в MS Reporting Services (SSRS)
  • Система управления производственным процессом лаборатории «EuroTest» (русскоязычный)

    Заказчик: ООО «Евро Тест»
    Тип проекта: Внутренний корпоративный проект
    Моя позиция в проекте:
  • Системный аналитик
  • Программист
  • Базы данных: mySQL
    Языки: PHP, HTML, JavaScript
    Технологии: jQuery, PHPExcel library
    Среды разработки: Netbeans 8, mySQL Workbench

    Назначение проекта: обеспечение процесса лабораторного анализа биофизического материала.

    Лаборатория «Евро Тест» выполняет исследования биофизического материала для нескольких крупных медицинских компаний. Проект обеспечивает регистрацию образцов, подготовку плана исследований, назначение исполнителей для исследований, хранение результатов и отсылку их заказчикам. Отсылка результатов производится через email (формат MS Excel) и вебсервисы (формат XML). Сайт проекта является закрытым, но заказчики имеют доступ к своим результатам через интернет.

    Плаврук (русскоязычный)

    Заказчик: Частный предприниматель
    Тип проекта: Коммерческий интернет-проект
    Моя позиция в проекте: Программист
    Языки: PHP, HTML, JavaScript
    Технологии: WordPress
    Интеграция с платежными системами: Яндекс-деньги
    Среда разработки: Netbeans 8

    Цель проекта: предоставление сервиса для формирования индивидуальных тренировочных заданий для людей, занимающихся плаванием.

    Перенос данных для ЕШКО-Россия

    [+]
    Более подробно о моем участии в проекте для российских работодателей …

    Проект по переносу данных из старой CRM-системы компании (Clipper-DBF) в новую (Oracle, HTML, JavaScript).

  • Объем данных: 30Gb
  • Объем результирующей базы (с индексами): 65Gb
  • Количество результирующих таблиц: 60
  • Максимальное количество записей в таблице: 90 миллионов
  • Таблиц с количеством записей более миллиона: 25
  • Длительность процесса переноса: более суток
  • Возможность перезапуска с середины процесса в случае ошибки: предусмотрено
  • Останов процесса трансформации из интерфейса: предусмотрен
  • Количество шагов процесса: 9
  • Пропуск шагов при трансформации в настройках интерфейса: предусмотрен
  • Сервер Oracle: 11G 64bit
  • Механизм переноса данных: Oracle heterogeneous services (MS Access DBF driver)