Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#527 Re: Новый функционал » Кулуары инфо по NG (моменты которые виделись мне важными) » 2012-02-14 16:48:32

по хорошему надо поменять кодировку и все языки будут отображаться нормально

#528 Re: FAQ » Создаем полноценный мультиязычный сайт » 2012-02-13 14:56:25

legenda, это стандартный блок который можно в бб кнопку добавить. Хочешь конечно можешь через xfields решить данный вопрос, чтоб вводить отдельно без блоков.

#529 Re: FAQ » Создаем полноценный мультиязычный сайт » 2012-02-13 02:48:21

Wolverine, не, устанавливать второй раз не нужно, просто скопировать. Хотя если бы я знал как, то может быть и разумнее smile

#530 Re: FAQ » Создаем полноценный мультиязычный сайт » 2012-02-12 22:35:46

Wolverine, не только, но и для карты сайта и rss ленты

#531 FAQ » Создаем полноценный мультиязычный сайт » 2012-02-12 16:35:08

easmik
Ответов: 12

Есть как минимум два способа создать мультиязычные сайты. Но тут я распишу только один, который как мне кажется наиболее подходящий. На его создание меня подтолкнул 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
Это нужно для того, чтоб при добавлении других языков, старые (уже опубликованные) новости отображали хоть какой то заголовок (если переделать все не представляется возможным)

Выглядеть в админке это будет так:
383e45989bf1d6e1f6c600c2be92fee4.jpg

на сайте так:

f6267759d2d61546aa176b0e2df70b9c.jpg af734f9bc26a42360cab0523bcc4d926.jpg
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}

В админке это будет выглядеть так: 2b2dd6b56df51428ff78c7f8dcd359ec.jpg

на сайте так:
388ec7b0c4bdd2ade269c485d8575dd5.jpg 76a9bb371f7848d2a7270b1c6fcf751b.jpg

Шаг третий. Теперь сделаем так чтоб языковые переменные работали в контенте для этого открываем файл 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}

Собственно для чего нужны языковые переменные, когда есть блоки. Иногда внутри новости нам нужно обозначить характеристики (размер) или формат, и пользоваться блоками не очень удобно, т.к. они огромны.
Пример использования в админке:
forum_yp1.jpg
А вот как это будет выглядеть на сайте:
forum_yp2.jpg forum_yp3.jpg

Теперь что касается самих языковых блоков, снова открываем 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);
   }
  }

Теперь нам будет доступна следующая конструкция
21e474e047353f1269dba82a06826441_pv.jpg

На сайте будет выглядеть так:
100ac6cad7abe5169f61f41ba837bb87.jpg 9a586020c81e4f3592a5dcc7bac59de4.jpg

Причем как многие наверняка уже поняли конструкция может быть абсолютно любой
например:
[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']);
   }
  }

теперь лента выглядит так:
040a7cbc331ce5fa161890168b6ca970.jpg 82b80064053a51aba4c502cab6ab42de.jpg

Шаг пятый: Убираем конструкцию 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 - эти ребята гении :)

#532 Re: Страницы плагинов » similar :: Похожие новости » 2012-02-10 19:25:17

Их тогда можно вобще не указывать раз они не имеют особого значения.

#533 Re: Бесплатные шаблоны » Шаблон Vipwebber под версию 0.9.3 Release » 2012-02-07 17:16:06

Ahatomik, а ты про совой, то то я думаю smile нет я не забыл, у меня реально нет времени sad буду стараться доделать на выходных.

#534 Re: Новый функционал » НОВАЯ админка к следующему релизу товарищи!! - пожелания, идеи. » 2012-02-07 15:37:13

t3s, у меня 27" моник и все выглядит нормально, так что не привирай. Вот в маде симпле резиновая админка, и что? мне что на таком что на таком монике все равно.

По поводу wysiwyg штатно нужен! (раз уж мы стремимся к полной универсальности) но с возможностью включить/отключить из админки (ибо я им например не пользуюсь).

#538 Re: Страницы плагинов » bb_media :: Проигрыватель медиа-файлов » 2012-02-06 05:02:23

antipode, это всего лишь bb код, а под Ваш запрос нужно использовать плагин, хотя как по мне хранить весь материал у себя на сайте нет смысла.

#541 Re: Вопросы функционирования системы в целом » 301 редирект » 2012-02-05 18:07:15

Для тех кто поменял домен в файле .htaccess
можно сделать запись:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://domain.kz/$1 [R=301,L]

при этом вся структура сайта сохраниться и при попытки перейти например
http://olddomain.kz/one.html
Вас автоматом перекинет на http://domain.kz/one.html

#542 Re: "А как сделать..." » Как бы запретить ссылки в комментариях » 2012-02-05 18:03:44

Xaron, сбился фильтр, у Вас стоят слова, но не стоит значений на что заменить
http://|ссылка с адресом:
т.е. не хватает |на что меняем

#543 Re: Бесплатные шаблоны » Шаблон Blog-tt под версию 0.9.3 Release » 2012-02-04 21:06:29

vip, там два лого совсем другие и не в тему smile Хотя этот не сложно переделать в фотошопе.

583313942575d1b1a797b16d8fdf0ba6.png

#544 Re: "А как сделать..." » hsgallery для версии 0.9.3 Release [SVN880+FIX01] » 2012-02-01 20:26:05

kolia, в самом плагине написано что надо сделать, просто прочти чуть внимательней smile

#545 Re: Запросы на адаптацию » Шаблон с Wordpress » 2012-02-01 08:10:14

Wolverine пишет:

Интересно, как вообще можно работать с такими шаблонами, как та дизайнеры живут, все изучили функции WP?

изначально на нем хотел делать сайт, но первая ошибка в шаблоне и тупо белый экран без объяснения причин, и я стал искать альтернативу smile

#546 Re: "А как сделать..." » hsgallery для версии 0.9.3 Release [SVN880+FIX01] » 2012-02-01 01:20:04

kolia, у меня работает еще с тех пор как на 0.9.2 поставил

#548 Re: Бесплатные шаблоны » Шаблон Windows Phone 7 » 2012-01-31 04:39:51

Демка http://ngdemo.youdesigner.kz/all/plugin/switcher/?profile=win

Кстати Миш, а почему ты шаблоны плагинов кладешь в админку а не в папку с шаблонами?

Подвал раздела

Работает на FluxBB