Archive for the ‘ Web ’ Category

Обновление Roundcube 3.1 до версии 4.2

Както в одной из предыдущих заметок я упоминал о том что на работе использую Roundcube в качестве почтового клиента. А что? Удобно! С любой машины в сети можно посмотреть почту 🙂 Короче клиент зачетный — рекомендую. Неоспоримой позитивной особенностью также является то что проэкт очень шустро розвивается. В результате, вроде, недавно ставил стабильный релиз 3.1, а вчера зашел на офсайт проэкта и увидел что уж давно стабильным считается четвертая версия 🙂 Ну чтож …. надо обновиться!

Первое что рекомендую сделать перед обновлением — бекап рабочей проги + дамп базы. Делается очень просто (у меня прога установлена в /opt/roundcube). Сначала бэкапим базу данных:

black:~# mysqldump -p rcmail |gzip -c > rcmail_SQL-`date +%F`.gz

После этого бекапим саму прогу:

black:~# tar -cjvf roundcube_backup-`date +%F`.tar.bz2 /opt/roundcube

Дальше можно браться за обновление. В случае если чтото накосячим, всегда сможем вернуться к тому что было используя сделанные бекапы 😉 Читать полностью

Адресная книга LDAP с дополнительными полями в Roundcube

Поставил на работе себе Roundcube в качестве Mail клента. Удобно — из любой машинки внутрисети по WEB имею доступ к своей почте 🙂 Установка самого Roundcube совсем тривиальная. Опишу очень коротко. Действуем по схеме:

  • Скачать последнюю версию из офсайта: http://www.roundcube.net/download Рекомендую качать версию stable — она гарантированно рабочая! За остальное никто не ручается 🙂
  • Розпаковать туда куда вам нужно.
  • Настроить apache
  • Установить Roundcube. Действовать согласно описанию из файлика INSTALL который есть в архиве с roundcube.

В результате проделанного выше программка у нас уже стоит — осталось только чуть настроить! Я установил себе roundcube в /opt/rouncube/ далее это будет видно 🙂

Прога у меня заработала после всего выше проделанного без каких бы то ни было проблем. Все отлично. Читаем почту … отправляем. Рулим сообщениями, папками, подписями и тд. Все очень удобно и шустро. Есть адресная книга … но локальная! А захотелось всетаки LDAP-ную книгу 🙂 Вот тут и начались танцы с бубном. Менял много чего в файлике main.inc.php для того чтобы настроить саму связь с сервером LDAP и поля которые одтуда надо брать. Итак, что имеем:

Работающий roundcube версии 3.1 а хотим ничего не сломав получить еще и LDAP Address Book 🙂 желательно  с автодополнением.

Пользователь ldapuser@my.domain с паролем 123. Доменный пользователь, которому достаточно дать права только на чтение LDAP и все! Это может быть просто технический пользователь … специально созданный для таких задач 🙂

LDAP Server — controller.my.domain

Приведу изначальный вид конфига main.inc.php чтобы понять откуда надо двигаться в настройке. Вот часть которая нас интуресует:

// In order to enable public ldap search, configure an array like the Verisign
// example further below. if you would like to test, simply uncomment the example.
$rcmail_config['ldap_public'] = array();

//
// If you are going to use LDAP for individual address books, you will need to
// set 'user_specific' to true and use the variables to generate the appropriate DNs to access it.
//
// The recommended directory structure for LDAP is to store all the address book entries
// under the users main entry, e.g.:
//
//  o=root
//   ou=people
//    uid=user@domain
//  mail=contact@contactdomain
//
// So the base_dn would be uid=%fu,ou=people,o=root
// The bind_dn would be the same as based_dn or some super user login.
/*
* example config for Verisign directory
*
$rcmail_config['ldap_public']['Verisign'] = array(
  'name'          => 'Verisign.com',
  'hosts'         => array('directory.verisign.com'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => '',
  'bind_dn'       => '',
  'bind_pass'     => '',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  // LDAP_Object_Classes, required_fields, LDAP_rdn
  'LDAP_Object_Classes' => array("top", "inetOrgPerson"), // To create a new contact these are the object classes to specify (or any other classes you wish to use).
  'required_fields'     => array("cn", "sn", "mail"),     // The required fields needed to build a new contact as required by the object classes (can include additional fields not required by the object classes).
  'LDAP_rdn'      => 'mail', // The RDN field that is used for new entries, this field needs to be one of the search_fields, the base of base_dn is appended to the RDN to insert into the LDAP directory.
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '',      // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search
*/


// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql');

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

$rcmail_config['ldap_public']['WORK'] = array(
  'name'          => 'WORK',
  'hosts'         => array('controller.my.domain'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => 'ou="Domain Users", dc=my, dc=domain',
  'bind_dn'       => 'ldapuser@my.domain',
  'bind_pass'     => '123',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'phone_field'   => 'telephoneNumber', // telephone
  'mobile_field'  => 'mobile', //added by black_13 (mobile number)
  'company_field' => 'company', //added by black_13 (company)
  'title_field'   => 'title',
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '(&(mail=*))', // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search

// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql','WORK');

После того как поправили вот таким образом и сохранили, пробуем перезайти в roundcube Теперь если зайти в Контакты (справа вверху) у нас должно появиться еще одна группа с названием WORK. Выбираем ее и видим список контактов взятых с LDAP. Но дополнительные поля пока что отображаться не будут … только cn, mail, sn и gn. Чтобы отобразились допольнительные поля нужно сделать следующее. Правим конфиг /opt/rouncube/program/localization/ru_RU/labels.inc Точнее добавляем туда несколько строк, я добавил в конец, перед ?> вот такое:

$labels['mobile'] = 'Мобильный телефон';
$labels['phone'] = 'Городской телефон';
$labels['company'] = 'Компания';
$labels['title'] = 'Должность';

Дальше, переходим в папку /opt/rouncube/program/steps/addressbook/ и открываем для редактирования файл show.inc В нем находим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

Меняем на

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

В нужной вам последовательности.

Тоже самое повторяем с конфигами save.inc. Находим строчку:

$a_save_cols = array('name', 'firstname', 'surname', 'email');

И меняем на

$a_save_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

Повторяем этот же финт с файликом edit.inc Правим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

до вида:

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

На этом настройка закончена 🙂 Вот скриншот того что получилось:

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

Главное что мы усвоили как это настраивается 🙂 За сим все … удачи!

Установка и настройка Apache + MySQL-Server + PHP5 в OpenBSD

Чегото захотелось мне посмотреть как будет работать Drupal на OpenBSD. Даже незнаю с чего бы это … но всеже! Захотелось так захотелось. Темболее что задача нетакая уж сложная 🙂  Итак, вперед в консоль и с песней в колонках!

Для начала надо настроить apache потом php5, потом mysql-server ну и потом уже поставить Drupal на всю эту связку.

Начнем сначала:

apache — версия 1.3 поставляется с OpenBSD по дефолту, тоесть в системе он уже есть, надо только уговорить его запускаться. Для этого добавляем запись такого вида в /etc/rc.conf.local:

root@openek:~# echo 'httpd_flags=""' >> /etc/rc.conf.local
root@openek:~#

Все! При следующей загрузке у нас стартонет apache автоматом. Имейте также в виду что по умолчанию он будет chroot-иться в /var/www — не забывайте что мы попали в консоль системы где все секюрно от рождения. Главное не нарушить гармонию безопасности этого точно слаженного организма своими шальными рученками 😉 . Едем дальше!

php5 — можно поставить из пакетов или собрать самому. Машинка мне для экспериментов перепала неособо шустрая — поэтому решил ставить из пакетов (чтобы полдня не ждать пока соберется 🙂 ) Сделал вот так:

root@openek:~# pkg_add php5-core

В ответ на это через минуту получил ответ что мол пакет установлен, а для того чтобы php5 заработал в apache2 надо создать такой вот симлинк (я сделал именно так):

root@openek:~# ln -sf /var/www/conf/modules.sample/php5.conf /var/www/conf/modules/php5.conf

Учитывая что apache у нас работает в chroot /var/www и то что для работы с upload фалами PHP нужна директория tmp нужно ее создать. Делается очень просто:

root@openek:~# mkdir /var/www/tmp

И роздаем права 777 на нее:

root@openek:~# chmod 777 /var/www/tmp

В итоге после перезагрузки получил работающие apache и php5 🙂 В чем убедился используя простенький php скриптик который сделал вот так:

root@openek:~# echo '<?php phpinfo(); ?>' > /var/www/htdocs/test.php

После чего перешел браузером lynx по ссылке http://127.0.0.1/test.php вот так:

root@openek:~# lynx http://127.0.0.1/test.php

и увидел кучу инфы про php и apache. Короче работает! Совсем же просто 🙂 Аж поражает 😀

Дальше занялся базой данных.

mysql-server — поставил тоже из пакетов командочкой:

root@openek:~# pkg_add -v -i mysql-server

Рекомендации о том что делать после установки даны в файле /usr/local/share/doc/mysql/README.OpenBSD

Я не особый спец по части баз данных — поэтому сделал как там написано. Сначала утсановил дефолтную базу выполнив:

root@openek:~# /usr/local/bin/mysql_install_db

После этого рекомендуют настроить mysql — и главный конфиг для этого дела /etc/my.cnf Я там особо ничего не трогал — только поправил чтобы mysqld слушал подключения на 127.0.0.1 и путь к сокету 🙂
Важно!!!
Если хотим чтобы apache так и запускался в chroot /var/www то нужно изменить путь к сокету mysql-server (не исключаю возможность отделаться sym/hard линком — но у меня этот трюк не получился).
Для этого исправил вот этот кусочек в файле /etc/my.cnf :

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/run/mysql/mysql.sock

на вот такое …. точнее добавил четкое указание где слушать подключения (bind-address) и поменял путь к сокету для того чтобы apache мог спокойно работать в chroot напару с mysql-server

# The MySQL server
[mysqld]
bind-address  = 127.0.0.1
port          = 3306
socket        = /var/www/var/run/mysql/mysql.sock

Дальше (опять же все по доке) добавил в конец файла /etc/login.conf такие строчки:

mysql:\
    :openfiles-cur=1024:\
    :openfiles-max=2048:\
    :tc=daemon:

После этого выполнил от рута:

root@openek:~# cap_mkdb /etc/login.conf

И, наконец, добавил такие строчки в /etc/rc.local для автозапуска mysql-server при загрузке системы:

if [ -x /usr/local/bin/mysqld_safe ] ; then
 su -c mysql root -c '/usr/local/bin/mysqld_safe > /dev/null 2>&1 &'
 echo -n ' mysql-server'
fi

Ну и для того чтобы связать php5 и MySQL конечно же нужен пакетик php5-mysql. Ставим из пакетов:

root@openek:~# pkg_add -v -i php5-mysql
parsing php5-mysql-5.2.10
Dependencies for php5-mysql-5.2.10 resolve to: mysql-client-5.0.83, php5-core-5.2.10
found libspec lib/mysql/mysqlclient.19.0 in package mysql-client-5.0.83
found libspec m.5.0 in /usr/lib
found libspec stdc++.47.0 in /usr/lib
php5-mysql-5.2.10: complete
--- php5-mysql-5.2.10 -------------------
You can enable this module by creating a symbolic
link from /var/www/conf/php5.sample/mysql.ini to
/var/www/conf/php5/mysql.ini.

ln -fs /var/www/conf/php5.sample/mysql.ini \
/var/www/conf/php5/mysql.ini

root@openek:~#

И для того чтобы заставить работать php5-mysql делаем как нас просят:

root@openek:~# ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini

После этого я перезагрузил машинку командой

root@openek:~# shutdown -r now

Ну вот связка Apache + PHP5 + MySQL готова принимать мой любимый CMS Drupal 🙂

В процессе установки Drupal-овский интсаллер порекомендовал поставить еще и php5-mbstring. Опять же поставил без особых трудностей из пакетов. Вот так:

root@openek:~# pkg_add -v -i php5-mbstring

Потом сделал симлинк для того чтобы включить модуль в PHP5

root@openek:~# ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini

И наконец, перегрузил apache для того чтобы применить изминения 🙂

root@openek:~# apachectl restart

Дальше можно просто устанавливать Drupal. Как это делается — прекрасно описано в INSTALL.txt файле который есть в архиве с Drupal — такчто розписывать установку самомго CMS — нету смысла.

P.S. Данная статья сгодится также любому кто захочет подготовить сервер к установке таких web-движков как WordPress, Joomla, DLE и тд.

Дерзайте! Всем удачи 🙂

Скрываем информацию про Apache2 и версию PHP

Если ктото из вас читал хоть какую-нибудь книгу или статью о взломе, тот знает, что первым делом злоумышленник пытается собрать максимально возможное количество информации о жертве, и только потом, учитывая эти данные, принимает решение про алгоритмы и инструменты для своего «черного дела».

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

Итак, смотрим (на приглашение сервера после успешного конекта надо ввести команду «HEAD / HTTP/1.0» и 2 раза Enter):

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:56:18 GMT
Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny6 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=ffffebc04d32c2e035055dd5259b2d19; expires=Tue, 23 Mar 2010 13:29:38 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:56:18 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Как видите, информации даже через чур много, и это настрораживает. Наш собственный web server радостно готов рассказать кому угодно не только о себе но и о названии/версии системы в которой он работает. Короче, предатель еще тот 😀 Ну чтож ….  вразумить его не делать это довольно легко!

Делаем следующее:

  • переходим под root:
black:~$ su -

Enter password:
  • открываем любимым редактором главный конфигурационный файл apache2:
black:~# vim /etc/apache2/apache2.conf

конфиг довольно большой …. листаем в самый конец

  • добавляем пару вот таких опций:
### Hide Version of Apache ###
ServerTokens ProductOnly
ServerSignature Off

названия опций довольно красноречиво рассказывают о себе 🙂

  • перезагружаем apache2 одной из команд (кому что больше нравится):
black:~# apache2ctl restart

или так:

black:~# /etc/init.d/apache2 restart

И снова пробуем спросить заголовки у apache2 с помощью telnet

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:57:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=81a8530d7e6a33847a5542ac544dfa74; expires=Tue, 23 Mar 2010 13:31:17 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:57:57 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Ну вот …. так то гораздо лучше, web server теперь просто и лаконично говорит что он apache … и все! Лишнее,  правда, еще болтает php. Ну тогда давайте и его уговорим не болтать все подряд про наш супер секюрный сервак 🙂

  • опять же из под root на web сервере открываем конфиг /etc/php5/apache2/php.ini любимым редактором:
black:~# vim /etc/php5/apache2/php.ini
  • ищем опцию:
expose_php = On
  • и присваиваем ей значение Off … тоесть редактируем до такого состояния:
expose_php = Off
  • сохраняем, выходим с редактора
  • перезапускаем apache2
black:~# apache2ctl restart

снова пробуем прочитать заголовки telnet-ом

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 10:36:40 GMT
Server: Apache
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=b37412aa627d01ed985f36207276cef2; expires=Tue, 23 Mar 2010 14:10:00 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 10:36:40 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Красота! Про php теперь вообще молчок 🙂  Вот то чего я и добивался … ээээх кайф!

На последок скажу, что многие считают подобные меры предосторожности излишними, мол что такого если и подсмотрят … всеравно же софтина очень надежная и секюрность ее проверена годами! Но я всегда руководствуюсь иным принципом — «Безопасности много не бывает!» Поэтому, надеюсь помог тому кто действует по схожим принципам, а тем кто не заморачивается — может задумаются, делов то на минуту 🙂 А какерам досадно 🙂

Засим спешу откланяться! Всем удачи и супер-пупер секюрности!

Русский перевод темы Arjuna-X для WordPress

Знакомая попросила сваять для нее небольшой простенький сайтик. Конечно же сделал на WordPress. Хорошо хоть сразу предупредил что я не дизайнер, такчто с оформлением какбы не заморачивался особо. Но решил хоть тему покрасивше дефолтной поставить. Понравилась Arjuna-x … только вот она без русского перевода оказалась. Сначала даже както неповерилось — решил проверить:

black:/_some_path_/wp-content# ll themes/arjuna-x/languages/
итого 332
-rw-r--r-- 1 www-data www-data 11894 Фев  7 13:37 de_DE.mo
-rw-r--r-- 1 www-data www-data 20870 Фев  7 13:37 de_DE.po
-rw-r--r-- 1 www-data www-data   544 Фев  7 13:37 default.mo
-rw-r--r-- 1 www-data www-data 16300 Фев  7 13:37 default.pot
-rw-r--r-- 1 www-data www-data 10479 Фев  7 13:37 es_ES.mo
-rw-r--r-- 1 www-data www-data 18047 Фев  7 13:37 es_ES.po
-rw-r--r-- 1 www-data www-data 12524 Фев  7 13:37 fr_FR.mo
-rw-r--r-- 1 www-data www-data 18843 Фев  7 13:37 fr_FR.po
-rw-r--r-- 1 www-data www-data 11772 Фев  7 13:37 it_IT.mo
-rw-r--r-- 1 www-data www-data 19483 Фев  7 13:37 it_IT.po
-rw-r--r-- 1 www-data www-data 10266 Фев  7 13:37 lt_LT.mo
-rw-r--r-- 1 www-data www-data 17415 Фев  7 13:37 lt_LT.po
-rw-r--r-- 1 www-data www-data 13364 Фев  7 13:37 pt_BR.mo
-rw-r--r-- 1 www-data www-data 21131 Фев  7 13:37 pt_BR.po
-rw-r--r-- 1 www-data www-data   377 Фев  7 13:37 something.mo
-rw-r--r-- 1 www-data www-data 13675 Фев  7 13:37 something.po
-rw-r--r-- 1 www-data www-data 10604 Фев  7 13:37 zh_CN.mo
-rw-r--r-- 1 www-data www-data 32167 Фев  7 13:37 zh_CN.po
black:/_some_path_/wp-content#

Мдя уж, подумалось мне … ну чтож — надо переводить. Перед тем как взяться таки за перевод, немнжко помучил google всякими запросами на эту тему — безрезультатно. Тогда за дело!

Итак, что имеем:

  • На сервере Debian Lenny
  • На машине где я работаю стоит Gentoo 10.0 (точнее это ноут)
  • Версия WordPress — 2.9.1
  • Версия темы Arjuna-X — 1.1.4

Что нужно:

  • Сделать перевод темы с English на русский язык

Идем на официальный сайт разработчиков темы и ищем чегото полезное по этому поводу. Как не странно, но довольно быстро нашел вот тут небольшое FAQ для таких трудяг как я, которое розьясняет как правильно действовать в моей ситуации:

I want to help and make this theme available in my language. How do I translate the theme properly?

Translation is rather easy. Please follow the steps below to translate the project into your own language.

  1. Download and install Poedit (availabe for Windows, Mac OS X, and Linux).
  2. Open Poedit. Click on File > New catalog from POT file… and select the default.POT file in the /languages directory of Arjuna (from the WordPress root: wp-content\themes\Arjuna\languages).
  3. Poedit will ask for some information regarding the new catalog you are about to create. Most important: Select the language that you will create. In addition, you can specify the Arjuna version that your translation applies to. The other fields are optional. There is no need to go to the other two tabs Paths or Keywords.
  4. Click OK. Poedit will then ask you to save the translated file. Save it as a valid language file. This is usually <language abbreviation>_<country code>, whereas the language abbreviation is defined in ISO 639-1 and the country code is defined in ISO 3166 alpha 2. Example: en_GB (English, Great Britain), en_US (English, United States) or de_DE (German, Germany).
  5. Once saved, all you need to do is translate each and every string by clicking on it, and translating it in the box on the very bottom of Poedit.
  6. Save the catalog by pressing CTRL + S or going to File > Save. Poedit will automatically create a .po and a .mo file.
  7. That’s it. We would appreciate if you shared your newly translated catalog with us (the .po file will be sufficient). We will make it publicly available in the next Arjuna release. Thank you.

Ну, вроде, не все так сложно, как кажется на первый взгляд 🙂 Главным инструментом для нас, как написано выше, должен быть некий poedit, который предлагают одкудато качать и ставить руками … фееее. Идем в рутовую консоль и ищем что в гентушных портах есть подобного:

laptop ~ # eix poedit
[I] app-i18n/poedit
Available versions:  1.4.2 ~1.4.3 ~1.4.4 {spell}
Installed versions:  1.4.2(13:44:19 07.02.2010)(spell)
Homepage:            http://poedit.sourceforge.net/
Description:         Cross-platform gettext catalogs (.po files) editor.
laptop ~ #

Ну вот — все оказывается под носом 🙂 Устанавливаем:

laptop ~ # emerge -av app-i18n/poedit

После сборки перегенерил меню своего e16 и прога появилась в разделе Development 🙂 Запускаем — все работает … имеет приятный внешний вид и понятный русский интерфейс. Вот скриншот:

После этого необходимо заполучить заготовки из темы Arjuna-x для перевода. Я не заморачивался особо, и стянул себе на ноут весь каталог с темой 🙂 Сделал это с помощью rsync. Вот так:

black@laptop ~ $ rsync -Par remote_user@server.net:/_some_path_/wp-content/themes/arjuna-x /home/black/mysor/www/

Ну чтож, дальше согласно интсрукции нам предлагают открыть некий файл-заготовку для перевода default.pot Открываем его с помощью свежеустановленной poedit. Как пользоваться прогой — понятно и младенцу. Просто переводим а потом делаем «Сохранить как» и в том же каталоге из которого открыли default.pot сохраняем переведенный файл под именем локали. Я сохранил как ru_RU.po при этом автоматически создастся файлик ru_RU.mo Ну вот и все. Теперь закидываем файлики назад на сервер в директорию languages. И наслаждаемся русскими надписями 🙂

О своем переводе скажу пару слов — перевел 87% если верить poedit-у Плохо знаю English — поэтому перевод чуть неполный получился. Значение некоторых фраз мне осталось непонятным … но судя по всему они неособо важны.

Выкладываю свои файлики ru_RU.po и ru_RU.mo в архивчике. Если кому надо — юзайте на здоровье!

arjune_ru.tar