Как перевести продукт?
Есть отличная статья по этой теме:
Локализация продуктов для vBulletin, рекомендую
Но бывает... что не хочется устанавливать дополнительных продуктов... что в самом хаке, который хочется перевести, с десяток фраз, и это можно сделать легко и быстро просто в блокноте...
Кроме того, оказывается, тут у нас нет статьи, ориентированной на абсолютных новичков...
Я расскажу, именно для новичков, пошагово и с картинками, как получить "языковой файл", для чего он нужен и что с ним делать
Разберу важные строки языкового файла, по пунктам, что значит каждый пункт
И постараюсь учесть индивидуальные варианты, в стиле "если у вас так, то будет вот так, а если не так, то будет эдак"
Инструкция актуальна для тройки, 4ки и 5ки
Начнём с самых азов.
При установке продукта, если в нём есть фразы, они вписываются в "Основной язык", он же "Мастер"
И как бы мы ни переключали язык на форуме, эти фразы будут одни и те же: если они в продукте английские - то и в русском они будут английские. Если фразы переведены (допустим, на русский) прямо в продукте, то они и будут русские, хоть инглишь выбран, хоть украинский.
Для того, чтобы организовать поддержку мультиязычности, то есть, чтобы при переключении языка на форуме соответственно менялись и фразы продукта, для каждого установленного на форуме языка нужно импрортировать отдельный языковой файлик с переводом фраз продукта именно на этот язык.
Для примера возьму "First Post on all pages" для 4ки, он короткий
Вот весь код продукта:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<product productid="firstonallpages" active="1">
<title>First Post on all pages</title>
<description>first on all pages</description>
<version>1.2</version>
<url>http://WWW.VIETVBB.VN</url>
<versioncheckurl>http://WWW.VIETVBB.VN</versioncheckurl>
<dependencies>
<dependency dependencytype="vbulletin" minversion="4.0.x" maxversion="" />
</dependencies>
<codes>
</codes>
<templates>
</templates>
<stylevardfns>
</stylevardfns>
<stylevars>
</stylevars>
<plugins>
<plugin active="1" executionorder="5">
<title>Cache Templates</title>
<hookname>cache_templates</hookname>
<phpcode><![CDATA[global $vbulletin;
if($vbulletin->options['fpoap_active']){
if(!in_array($vbulletin->options['fpoap_template'], $cache))
$cache[] = $vbulletin->options['fpoap_template'];
}]]></phpcode>
</plugin>
<plugin active="1" executionorder="5">
<title><![CDATA[First Post's Template]]></title>
<hookname>postbit_display_complete</hookname>
<phpcode><![CDATA[global $vbulletin;
if($vbulletin->options['fpoap_active']){
if(!in_array($this->thread['forumid'], explode(',', $vbulletin->options['fpoap_excluded_forums']))){
if($this->thread['firstpostid'] == $this->post['postid']){
$this->templatename = $vbulletin->options['fpoap_template'];
}
}
}]]></phpcode>
</plugin>
<plugin active="1" executionorder="5">
<title>RV065 - Firstpost on all page 2</title>
<hookname>showthread_postbit_create</hookname>
<phpcode><![CDATA[if($vbulletin->options['fpoap_active']){
if(!in_array($foruminfo['forumid'], explode(',', $vbulletin->options['fpoap_excluded_forums']))){
if ($vbulletin->GPC['pagenumber'] > 1){
if ($post['postid'] == $thread['firstpostid']) {
$counter--;
$post['postcount'] = 1;
}
else {
$post['postcount']--;
}
}
}
}]]></phpcode>
</plugin>
<plugin active="1" executionorder="5">
<title>RV060 - Firstpost on all page 1</title>
<hookname>showthread_query_postids</hookname>
<phpcode><![CDATA[if($vbulletin->options['fpoap_active']){
if(!in_array($foruminfo['forumid'], explode(',', $vbulletin->options['fpoap_excluded_forums']))){
$ids[] = $threadinfo[firstpostid];
}
}]]></phpcode>
</plugin>
</plugins>
<phrases>
<phrasetype name="vBulletin Settings" fieldname="vbsettings">
<phrase name="setting_fpoap_active_desc" date="1270788679" username="Admin" version="1.0"><![CDATA[Select <b>No</b> to disable this hack.]]></phrase>
<phrase name="setting_fpoap_active_title" date="1270788679" username="Admin" version="1.0"><![CDATA[Enabled?]]></phrase>
<phrase name="setting_fpoap_excluded_forums_desc" date="1270788762" username="Admin" version="1.0"><![CDATA[Forums are not affected by this hack.<br />
List ForumID, separate by a comma.]]></phrase>
<phrase name="setting_fpoap_excluded_forums_title" date="1270788762" username="Admin" version="1.0"><![CDATA[Excluded Forums]]></phrase>
<phrase name="setting_fpoap_template_desc" date="1271056952" username="Admin" version="1.1"><![CDATA[Template will be used for first post.]]></phrase>
<phrase name="setting_fpoap_template_title" date="1271056952" username="Admin" version="1.1"><![CDATA[Template Name]]></phrase>
<phrase name="settinggroup_first_post_on_allpages" date="1270788498" username="Admin" version="1.0"><![CDATA[First Post On All Pages]]></phrase>
</phrasetype>
</phrases>
<options>
<settinggroup name="first_post_on_allpages" displayorder="65535">
<setting varname="fpoap_active" displayorder="10">
<datatype>boolean</datatype>
<optioncode>yesno</optioncode>
<defaultvalue>1</defaultvalue>
</setting>
<setting varname="fpoap_excluded_forums" displayorder="20">
<datatype>free</datatype>
</setting>
<setting varname="fpoap_template" displayorder="30">
<datatype>free</datatype>
<defaultvalue>postbit</defaultvalue>
</setting>
</settinggroup>
</options>
<helptopics>
</helptopics>
<cronentries>
</cronentries>
<faqentries>
</faqentries>
</product>
Что мы здесь видим?
"Шапка" продукта, с указанием, что это <?xml а не, скажем, <?php
Идентификатор продукта <product productid=... >
Прочие описания - <title>, <description>, всякое такое... в случае перевода отдельным языковым файлом нас это никак не касается
НО! Даже если вы решите не делать отдельный языковой файл, а перевести фразы прямо в продукте,
ни в коем случае нЕ меняйте первую строку
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
пусть вас не смущает это "ISO-8859-1", к кодировке фраз это нЕ имеет никакого отношения
Идём дальше... то есть, смотрим, где там фразы
Фразы в продукте начинаются с открывающего тега <phrases> и заканчиваются соответствующим закрывающим тегом </phrases>
Прекрасно, всё понятно, мы готовы это перевести быстро и легко. Как получить тот самый "языковой файл"?
Устанавливаем продукт
Теперь переведём у него одну фразу, штатно, через админку: Языки и фразы - поиск во фразах, вбиваем в поле поиска
First Post On All Pages (этот текст я скопировала из текста фразы прямо в продукте, последняя фраза)
Найти
результаты поиска:
жмём "Редактировать"
в поле для русского (украинского... любого, на какой язык переводите, надеюсь, он установлен на форуме)) вбиваем текст перевода, Сохранить
Дальше: Языки и фразы - Скачать/загрузить языки
Верхний блок, "Скачать", выбираем:
Язык - русский (или тот, на который переводите)
Продукт - First Post On All Pages
Имя файла - оставьте, как есть
Кодировка - не трогайте (в тройке этого пункта вообще нет)
Включать фразы, добавленные самостоятельно - Нет
Фразы как есть -
Да (это очень важно! настройки языка могут быть индивидуальны, если вынуть языковой файл с этими настройками, то потом при установке на другом форуме он перезапишет эти настройки... об этом подробно говорится и в статье TAIFUN'а, но не лишним будет повторить:
Quote:
Originally Posted by TAIFUN
Внимание!
Акцентирую внимание на следующий нюанс - убирайте в своих русификаторах группу settings, а затем убедитесь что вместо типа фраз custom стоит phrases, иначе админы своих форумов задолбаются менять настройки русского языка, в случае если их настройки отличаются от тех, которые вы указали в своих русификаторах (группа settings)
|
Натыкали? - Скачать
Мы получили файлик с таким содержимым:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<language name="Rus" vbversion="4.2.1" product="firstonallpages" type="phrases">
<phrasetype name="vBulletin Settings" fieldname="vbsettings">
<phrase name="settinggroup_first_post_on_allpages" date="1422529230" username="Luvilla" version="1.2"><![CDATA[Первый пост на всех страницах]]></phrase>
</phrasetype>
</language>
Повторяю: строку
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
НЕ трогать!
Физическая кодировка нашего файла соответствует кодировке форума (клинические случаи - отдельная история)
А теперь посмотрим на полученный файлик, построчно
в языковом файле фразы находятся не в теге <phrases> </phrases>, а внутри тега <language...></language>
Первая строка, по пунктам:
Code:
<language name="Rus" vbversion="4.2.1" product="firstonallpages" type="phrases">
name="Rus" это так называемое "имя" языка, тут может быть и "Russian (RU)", и "Russian", и "RU", и что-то другое... нЕ важно, движок при импорте языка на это не смотрит, потому что не умеет... там есть отдельная выпадалка "Перезаписать язык" - вот это движок понимает
vbversion="4.2.1" - версия vB, с которой был скачан языковой файл. Не меняйте. Это значение движок умеет распознавать, и именно на этот случай при импорте языка предусмотрен выбор "Игнорировать версию языка"
product="firstonallpages" - ни в коем случае нЕ трогайте, это идентификатор продукта, значение внутри кавычек должно в точности совпадать со значением productid="firstonallpages", указанным в самом продукте
type="phrases" - всё верно, это тоже трогать не надо, это указание для движка, что нужно
дописать эти фразы, а не
перезаписать весь языковой пакет
кстати, указание type="phrases" - ещё и указание движку, что при перезаписи всего языкового пакета (при обновлении, например) эти фразы трогать нЕ надо
Дальше... фразотип
Code:
<phrasetype name="vBulletin Settings" fieldname="vbsettings">
я взяла для примера простенький продукт, у него всего один тип фраз, настройки
но в больших продуктах типов фраз (phrasetype) - много
Что с ними делать? - ничего, оставить как есть
Но тут как раз может быть "индивидуальный случай"
если на форуме, с которого экспортирован языковой файл, был "русский инсталл" (при установке/обновлении был подменён англицкий install_language_en.php/upgrade_language_en.php на его переведённый аналог) то в этой строке может быть вот такой текст:
Code:
<phrasetype name="Основные настройки" fieldname="vbsettings">
в принципе, это несущественно, движок ориентируется на идентификатор "vbsettings"
однако чтобы всё было
красиво, я бы рекомендовала заниматься переводами на тестовом форуме, установленном штатно, без "русского инсталла" (то есть, сначала залили все файлы дистрибутива, без подмен на переведённые, провели инсталл, там не так много буржуйского текста и он вполне понятен, а уж потом установили русик)
И, наконец, сама фраза, наша единственная фраза с переводом
Code:
<phrase name="settinggroup_first_post_on_allpages" date="1422529230" username="Luvilla" version="1.2"><![CDATA[Первый пост на всех страницах]]></phrase>
<phrase name="settinggroup_first_post_on_allpages" - это "переменная" фразы, трогать её ни в коем случае не нужно, потому что именно это, settinggroup_first_post_on_allpages, прописано в шаблонах (или модулях, или файлах), именно это обрабатывается движком, а уж юзеру выводится перевод, в зависимости от настроек языка
date="1422529230" - дата последнего изменения фразы, в юникс-формате. Это можно вообще не трогать, а можно, если сильно хочется, скопировать это число и заменить им даты в остальных фразах
username="Luvilla" - автор последнего изменения фразы. Это, конечно, есть смысл сменить во всех переведённых фразах. Если собираетесь заниматься переводами - определитесь с именем, чтобы использовать его в переводах постоянно. Разумеется, оно может быть на любом языке... но китайские иероглифы, всё же, лучше не употреблять
На практике - лучше, если это будет латиница.
version="1.2" - версия продукта, не путать с версией vB. Не надо это менять.
<![CDATA[Первый пост на всех страницах]]> - собственно, это и есть перевод. Всё, что в CDATA[] - сам текст фразы
Теперь у нас есть "болванка", заготовка языкового файла, в которой абсолютно корректно сформирована "шапка".
В эту "болванку" вставляем фразы из продукта
получится вот так:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<language name="Rus" vbversion="4.2.1" product="firstonallpages" type="phrases">
<phrasetype name="vBulletin Settings" fieldname="vbsettings">
<phrase name="setting_fpoap_active_desc" date="1270788679" username="Admin" version="1.0"><![CDATA[Select <b>No</b> to disable this hack.]]></phrase>
<phrase name="setting_fpoap_active_title" date="1270788679" username="Admin" version="1.0"><![CDATA[Enabled?]]></phrase>
<phrase name="setting_fpoap_excluded_forums_desc" date="1270788762" username="Admin" version="1.0"><![CDATA[Forums are not affected by this hack.<br />
List ForumID, separate by a comma.]]></phrase>
<phrase name="setting_fpoap_excluded_forums_title" date="1270788762" username="Admin" version="1.0"><![CDATA[Excluded Forums]]></phrase>
<phrase name="setting_fpoap_template_desc" date="1271056952" username="Admin" version="1.1"><![CDATA[Template will be used for first post.]]></phrase>
<phrase name="setting_fpoap_template_title" date="1271056952" username="Admin" version="1.1"><![CDATA[Template Name]]></phrase>
<phrase name="settinggroup_first_post_on_allpages" date="1270788498" username="Admin" version="1.0"><![CDATA[First Post On All Pages]]></phrase>
</phrasetype>
</language>
ну и уже переведённую нами строку, ставим на её место:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<language name="Rus" vbversion="4.2.1" product="firstonallpages" type="phrases">
<phrasetype name="vBulletin Settings" fieldname="vbsettings">
<phrase name="setting_fpoap_active_desc" date="1270788679" username="Admin" version="1.0"><![CDATA[Select <b>No</b> to disable this hack.]]></phrase>
<phrase name="setting_fpoap_active_title" date="1270788679" username="Admin" version="1.0"><![CDATA[Enabled?]]></phrase>
<phrase name="setting_fpoap_excluded_forums_desc" date="1270788762" username="Admin" version="1.0"><![CDATA[Forums are not affected by this hack.<br />
List ForumID, separate by a comma.]]></phrase>
<phrase name="setting_fpoap_excluded_forums_title" date="1270788762" username="Admin" version="1.0"><![CDATA[Excluded Forums]]></phrase>
<phrase name="setting_fpoap_template_desc" date="1271056952" username="Admin" version="1.1"><![CDATA[Template will be used for first post.]]></phrase>
<phrase name="setting_fpoap_template_title" date="1271056952" username="Admin" version="1.1"><![CDATA[Template Name]]></phrase>
<phrase name="settinggroup_first_post_on_allpages" date="1422529230" username="Luvilla" version="1.2"><![CDATA[Первый пост на всех страницах]]></phrase>
</phrasetype>
</language>
теперь останется совсем мелочь...
"Admin" перебить на "Luvilla"
сменить дату - если очень хочется
и, собственно, сделать перевод... очень аккуратно, не цепляя никаких спец-символов, заменить англицкий текст на свой. Очень хорошо, если вы используете текстовый редактор с включенной подсветкой синтаксиса, "порченный" XML сразу видно
При сохранении файла правильно будет сделать три вещи:
- указать в имени файла, это перевод какого именно продукта
- указать в имени файла, на какой язык перевод (русский, украинский, клингонский)
- указать кодировку файла... и при этом нЕ забыть сохранить файл именно в этой кодироке!!!
то есть, файлик у нас будет называться vbulletin-language_firstonallpages_RU_UTF.xml или vbulletin-language_firstonallpages_RU_1251.xml
всё...
на самом деле за то время, пока я набирала эту статью, я бы спокойно перевела штук пять таких продуктов... так что - пусть вас не пугают многабукафф, процедура простая, как три рубля))
Дамы и господа переводчики, удачи и вдохновения!