Архив рубрики: язык

Многоязычное

За прошедшие сутки, как и почти в любой другой день, читал тексты и слушал речь на двух естественных языках — русском и английском — и держал в голове ещё кучу других: языков программирования да языков разметки. Как минимум, пришлось читать код на Perl, PHP, Bash и Ruby. Ну и, вроде, чё-то в браузерном отладчике смотрел — значит, ещё и HTML с CSS. И, наверное, JavaScript там же.

Два плюс семь — получается девять языков параллельно. Добавим LilyPond — будет десять. Это не вредно? 🙂

Собственные переводы интерфейса OJS

Open Journal Systems — многоязычная система: многие её части могут быть переведены на разные языки. Не все, конечно: например, в материалах статей некоторые поля по странной прихоти разработчиков (или просто по невнимательности) остались одноязычными и добавить в них возможность правильно хранить данные на нескольких языках — не самая простая задача: я, например, так её и не завершил. В версиях 2.4.* нормальной многоязычности статей не будет — возможно, такое положение и объясняет тот факт, что в России OJS не особо популярна — она без применения напильника непригодна даже для тех журналов, где надо всего лишь продублировать имя русского автора статьи латинскими буквами.

С переводом интерфейса дела обстоят чуть получше: переведено может быть почти всё. Но и тут не всё гладко: вместо gettext применяется другой механизм локализации, где ключами служат не фразы на естественном языке (например, английском), а строки вида where.what.someItem. Переводы хранятся в XML-файлах, раскиданных по дереву каталогов. Впрочем, бо́льшая их часть сосредоточена в locale/ и lib/pkp/locale.

Есть два пути внедрения своих собственных переводов: первый, очевидный — отредактировать системные XML-файлы с переводами, плох тем, что при первом же обновлении OJS собственные переводы могут пропасть или вызвать конфликт слияния, если обновление проводится через git. Другой, более правильный — использовать плагин Custom Locale: он позволяет заменить системные переводы своими, не трогая системные файлы. Для того, чтоб заменить какой-либо фрагмент, надо знать ключ, а также файл, где перевод определён. Процесс замены переводов получается таким: сначала ищем, где и как определён нужный текст, затем идём на http://some-ojs-site/journal_name/manager/plugin/generic/customlocaleplugin/edit/ru_RU (если меняем русский текст), ищем в увиденном списке нужный файл, затем пытаемся найти в нём нужный ключ. Поиск там, вроде, есть, но, во-первых, ищет только в пределах текущего файла и умеет искать только точное соответствие с ключом — ничего более. Понятно, что такой интерфейс не нужен: лучше обходиться без него. Плагин хранит изменённые переводы в виде XML-файлов, которые складывает в public/journals/journal_id/customLocale/locale/path, где journal_id — номер журнала, locale — язык в виде язык_СТРАНА, например en_US — американский английский, а path — путь к заменяемым XML-файлам относительно каталога, где установлена OJS.

Пример: некий файл public/journals/1/customLocale/ru_RU/lib/pkp/locale/ru_RU/common.xml заменяет строки из файла lib/pkp/locale/ru_RU/common.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE locale SYSTEM "../../../../../../../../../lib/pkp/dtd/locale.dtd">
<locale name="ru_RU">
	<message key="navigation.about">О журнале</message>
	<message key="navigation.setup">Настройка журнала</message>
	<message key="common.notApplicableShort"> </message>
</locale>

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

Указание языка в URL страниц в Open Journal Systems

Open Journal Systems — система управления электронными научными журналами — имеет одинаковые адреса страниц, написанных на разных языках. Посетитель, зашедший на сайт научного журнала, работающего на OJS, либо увидит страницу на языке по умолчанию либо, если раньше уже заходил и менял язык, на том, что выбрал. Кому-то такой подход нравится, кому-то — нет. На самом деле — вполне нормальная ситуация.

Тем не менее, возникла задача всё-таки получить возможность явно указать язык в адресе страниц. Переключение выбранного языка делается средствами самой OJS — достаточно зайти (то есть, выполнить GET-запрос) по адресу вида адрес-журнала/user/setLocale/локаль?source=путь/куда/идти/дальше, например, http://vestnik.susu.ru/cmi/user/setLocale/ru_RU?source=/cmi/issue/current — переход по этой ссылке приведёт к выведенному на русском языке оглавлению текущего выпуска серии «Вычислительная математика и информатика» Вестника Южно-Уральского государственного университета.

С одной стороны, всё украдено до нас ничего делать не надо — URL с указанием языка уже доступен. Но какой-то он длинный, неаккуратный. Хочется сделать покороче. Чтоб не лезть во внутренности OJS, можно исправить настройки сервера. Для случая, когда используется Apache, а адрес журнала имеет вид http://hostname/journal, достаточно добавить пару правил для mod_rewrite:

RewriteRule ^en(glish)?/(\w+)(/?.*)$ /$2/user/setLocale/en_US?source=/$2$3 [L]
RewriteRule ^ru(ssian)?/(\w+)(/?.*)$ /$2/user/setLocale/ru_RU?source=/$2$3 [L]

Это даст возможность использовать URL вида http://hostname/язык/journal/путь, где язык может быть как названием нужного языка, так и его двухбуквенным кодом. Для уже рассмотренной серии «Вестника ЮУрГУ» теперь можно применять такие ссылки:

Perl Debugger Cheatsheet

Чтоб не вспоминать кажыдй раз команды перлового отладчика, сделал шпаргалку — скопировал на лист размера A4 текст, выводимый отладчиком по команде h, и добавил верблюда:

Perl Debugger Cheatsheet

Большой файл доступен в форматах PDF и PNG (300 dpi).

Как назвать дверь?

У универсалов всё, что открывается (кроме, разве что, капота) — это дверь. Как их при этом назвать так, чтоб было понятно — неясно. Ну с передней-то понятно — передняя дверь. А с задней? Какая задняя? Задняя пассажирская или задняя багажная? Так в универсале, особенно в высоком, любая дверь может быть пассажирской — мне во всех своих универсалах (а особенно в Пежо) доводилось  ходить через все имеющиеся двери.

Вот в американском руководстве по ремонту и эксплуатации поступили просто и понятно: сдвижная дверь, предназначенная для пассажиров — slide door, а пара самых задних дверей — tailgate, то есть, хвостовые ворота. Всё понятно! 🙂