Вы не зашли.
этот сайт и CMS не как не связаны
по хорошему надо поменять кодировку и все языки будут отображаться нормально
legenda, это стандартный блок который можно в бб кнопку добавить. Хочешь конечно можешь через xfields решить данный вопрос, чтоб вводить отдельно без блоков.
Wolverine, не, устанавливать второй раз не нужно, просто скопировать. Хотя если бы я знал как, то может быть и разумнее
Wolverine, не только, но и для карты сайта и rss ленты
Есть как минимум два способа создать мультиязычные сайты. Но тут я распишу только один, который как мне кажется наиболее подходящий. На его создание меня подтолкнул ROZARD, за что ему большое спасибо.
Суть сводиться к клонированию двига. Это дает нам не только контент на другом языке, но также и карту сайта, RSS ленту и т.п. Хочу сразу сказать что данный вариант подходит под любой вид новостных сайтов. Итак начнем:
Сначала нам надо внести изменения из SVN http://trac.assembla.com/ngcms/changeset/891 и http://trac.assembla.com/ngcms/changeset/900, первое это изменения позволяющие в названия категорий использовать символы {}, второе делает доступным языковые блоки iflang
Шаг первый. Первое что нам нужно, разобраться как будут работать заголовки, для этого открываем functions.inc.php и находим там
$tvars = array ( 'vars' => array( 'pagination' => '', 'title' => $row['title']));
перед ней вставляем
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $row['title'], $parr)) {
foreach ($parr[0] as $k => $v) {
$row['title'] = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $row['title']);
}
}
теперь конструкция
[iflang:russian] Описание [/iflang]
[iflang:english] Description [/iflang] будет работать и для заголовков.
P.S.Если Вы планируете со временем расширение языков, то можно сделать так.
[iflang:russian] Заголовок / [/iflang] Header
Это нужно для того, чтоб при добавлении других языков, старые (уже опубликованные) новости отображали хоть какой то заголовок (если переделать все не представляется возможным)
Выглядеть в админке это будет так:
на сайте так:
Xочу заметить что не что не мешает заключить и заголовок на английском в языковой блок.
Сразу же "вычистим" конструкцию iflang из заголовков (для нормального отображения в браузере).
index.php, находим:
$template['vars']['titles'] = join(" : ", array_values($SYSTEM_FLAGS['info']['title']));
Заменяем на:
$titles = join(" : ", array_values($SYSTEM_FLAGS['info']['title']));
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $titles, $parr)) {
foreach ($parr[0] as $k => $v) {
$titles = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $titles);
}
}
$template['vars']['titles'] = $titles;
Шаг второй. В движке используются языковые переменные (вида {l_variable}), которые пригодятся и нам. Как в самом контенте, так и в заголовках категорий.
Начнем с категорий, открываем файл engine/core.php в самом низу дописываем следующий код:
$timer->registerEvent('* CORE.PHP is complete');
foreach ($catz as $catid => $catdata) {
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $catz[$catid]['name'], $larr)) {
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
$catz[$catid]['name'] = str_replace('{'.$v.'}', isset($lang[$name_larr])?$lang[$name_larr]:'[LANG_LOST:'.$name_larr.']', $catz[$catid]['name']);
}
}
}
затем открываем /engine/actions/categories.rpc.php :
Находим:
$tvars['vars'] = array(
'token' => genUToken('admin.categories'),
'php_self' => $PHP_SELF,
'rid' => $row['id'],
'name' => $row['name'],
После вставляем:
// Transcode category name
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $row['name'], $larr)) {
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
$row['name'] = str_replace('{'.$v.'}', isset($lang[$name_larr])?($lang[$name_larr].' <span style="color: red;">(UNIV)</span>'):'[LANG_LOST:'.$name_larr.']', $row['name']);
}
}
// Кстати <span style="color: red;">(UNIV)</span> - это дает возможность подсвечивать категории в которых используется переменная а не название (очень удобно)
ВАЖНО: переменные прописываются в папке lang/язык/common.ini имеют вид
nw_unknow = "Категория неизвестна", nw_unknow = "Category unknown" и т.д. по аналогии, а в название категории Вы прописываете {l_nw_unknow}
В админке это будет выглядеть так:
на сайте так:
Шаг третий. Теперь сделаем так чтоб языковые переменные работали в контенте для этого открываем файл engine\includes\inc\functions.inc.php
Находим там строчку:
function newsFillVariables($row, $fullMode, $page = 0, $disablePagination = 0, $regenShortNews = array()) {
ниже вставляем
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $data, $larr)) {
// Show language variables
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
$data = str_replace('{'.$v.'}', isset($lang[$name_larr])?$lang[$name_larr]:'[LANG_LOST:'.$name_larr.']', $data);
}
}
Все, двиг начал обрабатывать языковые переменные и в контенте. Теперь пропишем сами переменные
открываем \engine\lang\ЯЗЫК\site\news.ini и вписываем свои переменные.
Например: Если сделать такую запись
archive = "Архив"
то станет доступна переменная {l_archive}
Собственно для чего нужны языковые переменные, когда есть блоки. Иногда внутри новости нам нужно обозначить характеристики (размер) или формат, и пользоваться блоками не очень удобно, т.к. они огромны.
Пример использования в админке:
А вот как это будет выглядеть на сайте:
Теперь что касается самих языковых блоков, снова открываем functions.inc.php
Находим:
if ($config['blocks_for_reg']) { $short = $parse -> userblocks($short); $full = $parse -> userblocks($full); }
ниже добавляем:
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $short, $larr)) {
// Show language variables
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $data, $larr)) {
// Show language variables
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
$data = str_replace('{'.$v.'}', isset($lang[$name_larr])?$lang[$name_larr]:'[LANG_LOST:'.$name_larr.']', $data);
}
} $short = str_replace('{'.$v.'}', isset($lang[$name_larr])?$lang[$name_larr]:'[LANG_LOST:'.$name_larr.']', $short);
}
}
if (preg_match_all('/(?<=\{)l_(.*?)(?=\})/i', $full, $larr)) {
// Show language variables
foreach ($larr[0] as $k => $v) {
$name_larr = substr($v, 2);
$full = str_replace('{'.$v.'}', isset($lang[$name_larr])?$lang[$name_larr]:'[LANG_LOST:'.$name_larr.']', $full);
}
}
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $short, $parr)) {
foreach ($parr[0] as $k => $v) {
$short = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $short);
}
}
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $full, $parr)) {
foreach ($parr[0] as $k => $v) {
$full = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $full);
}
}
Теперь нам будет доступна следующая конструкция
На сайте будет выглядеть так:
Причем как многие наверняка уже поняли конструкция может быть абсолютно любой
например:
[iflang:russian]На русском[/iflang]
[iflang:english]На английском[/iflang]
КАРТИНКА
[iflang:russian]На русском[/iflang]
[iflang:english]На английском[/iflang]
КАРТИНКА
еще КАРТИНКА
[iflang:russian]На русском[/iflang]
КАРТИНКА
[iflang:english]На английском[/iflang]
Шаг четвертый: Убираем конструкцию iflang из RSS
Открываем плагин, находим:
$output .= " <title><![CDATA[".((extra_get_param('rss_export','news_title') == 1)&&GetCategories($row['catid'],true)?GetCategories($row['catid'], true).' :: ':'').secure_html($row['title'])."]]></title>\n";
перед ней вставляем:
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $row['title'], $parr)) {
print "<pre>".var_export($parr, true)."</pre>";
foreach ($parr[0] as $k => $v) {
$row['title'] = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $row['title']);
}
}
теперь лента выглядит так:
Шаг пятый: Убираем конструкцию iflang из плагина breadcrumbs (спасибо ROZARD)
Открываем breadcrumbs.php, находим
$catids = $SYSTEM_FLAGS['news']['db.categories'];
$location_last = $SYSTEM_FLAGS['info']['title']['item'];
после добавить:
if (preg_match_all('/\[iflang\:(.+?)\](.+?)\[\/iflang\]/is', $location_last, $parr)) {
foreach ($parr[0] as $k => $v) {
$location_last = str_replace($v,($config['default_lang'] == $parr[1][$k])? $parr[2][$k]:'', $location_last);
}
}
и последнее что нам нужно сделать, клонировать двиг. Для этого нам нужно взять "чистый двиг", и из старого взять все файлы кроме папки uloads и скопировать в папку с чистым двигом. Причем тут есть два варианта. Наример eng версия может находиться по адресу http://youdesigner.kz/en/, а старая соответственно http://youdesigner.kz или же как у меня сейчас для eng отдельный домен http://youdesigner.net
Теперь осталось зайти в файл engine/conf/config.php
и заменить следующие строки (допустим вы выбрали вариант, при котром у Вас eng версия храниться в папке en того же домена)
'home_url' => 'http://domain.kz/en/',
'admin_url' => 'http://domain.kz/en/engine',
теперь войдя в админку не забудьте переименовать сайт и указать дефолтный язык.
в плагине rss который уже будет в папке en/engine/plugins/rss_export также переименуйте сайт
Английская карта сайта и rss будут находиться соответственно тут
http://domain.kz/en/plugin/gsmg/
http://domain.kz/en/rss.xml
Ну вот и все, одно оформление на любом из сайтов и инфа доступна сразу на двух.
и еще раз для тех у кого будет строго два языка Вы можете заголовки заключить в два языковых блока и тогда в Русской версии не будет английского названия и наоборот.
P.S. ОГРОМНОЕ СПАСИБО vitaly, ROZARD, Wolverine - эти ребята гении :)
Их тогда можно вобще не указывать раз они не имеют особого значения.
Ahatomik, а ты про совой, то то я думаю нет я не забыл, у меня реально нет времени буду стараться доделать на выходных.
t3s, у меня 27" моник и все выглядит нормально, так что не привирай. Вот в маде симпле резиновая админка, и что? мне что на таком что на таком монике все равно.
По поводу wysiwyg штатно нужен! (раз уж мы стремимся к полной универсальности) но с возможностью включить/отключить из админки (ибо я им например не пользуюсь).
Ahatomik, в смысле?
Демо http://ngdemo.youdesigner.kz/all/plugin/switcher/?profile=vipweb
Dimas, да да, мы в курсе, читали.
antipode, это всего лишь bb код, а под Ваш запрос нужно использовать плагин, хотя как по мне хранить весь материал у себя на сайте нет смысла.
ерар, а Вы им пользовались?
http://domashny.kz сайт о домоводстве и кулинарии
Для тех кто поменял домен в файле .htaccess
можно сделать запись:
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://domain.kz/$1 [R=301,L]
при этом вся структура сайта сохраниться и при попытки перейти например
http://olddomain.kz/one.html
Вас автоматом перекинет на http://domain.kz/one.html
Xaron, сбился фильтр, у Вас стоят слова, но не стоит значений на что заменить
http://|ссылка с адресом:
т.е. не хватает |на что меняем
vip, там два лого совсем другие и не в тему Хотя этот не сложно переделать в фотошопе.
kolia, в самом плагине написано что надо сделать, просто прочти чуть внимательней
Интересно, как вообще можно работать с такими шаблонами, как та дизайнеры живут, все изучили функции WP?
изначально на нем хотел делать сайт, но первая ошибка в шаблоне и тупо белый экран без объяснения причин, и я стал искать альтернативу
kolia, у меня работает еще с тех пор как на 0.9.2 поставил
vip, упс я не знал и перекидывал
Демка http://ngdemo.youdesigner.kz/all/plugin/switcher/?profile=win
Кстати Миш, а почему ты шаблоны плагинов кладешь в админку а не в папку с шаблонами?
Ссылку на сайте дайте
Ahatomik, ruseller.com/lessons.php?rub=1&id=1261