Клиент хочет английскую версию, чтобы на заглавной была кнопка перехода туда.
Как реализовать скачок на англ. версию? Причем версия подразумевает под собой кастрированный вариант основного сайта, т.е. порядка 30% от его инфы.
Отдельная база? Или можно проще?
Установка по порядку:
- Качаем модуль i18n;
- Патчим как написано в Install.txt;
- Правим settings.php как написано в Install.txt (комментарий подробнее);
- Патчим вручную битые ссылки на переводы в нодах(todo:патч на перевод ссылки в админ-секции);
- Патчим i18.inc для переводных заглавных страниц (именно одна нода, к-рую вы сами определили как заглавную в admin/settings "Default front page");
- Стандартная заглавная страница (node, т.е. лента по-умолчанию) настраивается на перевод в настройках самого модуля и без предыдущего хака.
p.s.
Следите за новыми версиями, там по-тихонечку вносятся изменения.
Все что описано выше относится к версии i18n v1.18 2005/04/11.
Комментарии
Мультисайтинг, отдельный набор таблиц со своим префиксом. Чего тут изобретать?
--
Axel,
www.axel.drupal.ru
сказал как отрезал:)
а с интерфейсом как? мультисайтинг = флексинода?
А i18n.module - это not the right thing ?
--
USU-Lug http://usu-lug.org.ru
этот модуль добавляет перевод к ноде, т.е. ты все равно изначально ходишь по русскому сайту, а потом видишь эти флажки. А надо что бы щелкнул по ссылке и весь сайт ушел в английский. Был такой модуль под 4.4., но он делал сплэш-страницу перед всем сайтом с приветствием и выбором языка.
Мда? А ты не путаешь i18n.module и translation.module?
http://drupal.org/project/i18n :
Fully configurable module for internationalization (i18n) of Drupal sites. [b]Provides content translation -nodes-, interface translation for anonymous users -with the locale module- and browser language detection[/b]. Includes a block for language selection.
Также, смотри демонстрацию по ссылке выше...
--
USU-Lug http://usu-lug.org.ru
Ник:) Ну и дурак я:) Спасибо.
Кстати, еще вопрос: а стоит разрабатывать сайт изначально со включенным модулем i18 или его можно потом установить и перевести определенные ноды?
К сожалению, на знаю
--
USU-Lug http://usu-lug.org.ru
Нихрена не понятно как работает i18n.
Поставил, пропатчил, включил локаль (en,ru).
Установил по дефолту настройки i18n: в итоге
получил следующее:
Создал ноду сразу в русском переводе, опубликовал, перевел.
Снизу ссылка на en-перевод, но такая ru/node/2 вместо en/node/2...
Нажимаю - ничего нет. Выхожу на корень сайта и через урл site.ru/en попадаю в англ. версию - нода лежит переведенная, но у нее урл обратного перевода опять битое - теперь en/node/1
Глупость какая-то.
А с alias`ами конечно работает...
Опять же не понятно как переводить свое меню, название сайта и слоган...в readme.txt какая-то вода налита по этому поводу.
Кто юзал этот модуль? Помогите!
Я не не юзал.
Но, опять же, если внимательно почитать описание ...
Что imho логично...
Кстати, могу предположить, что кэш для анононимов надо отключить...
--
USU-Lug http://usu-lug.org.ru
Дык в readme написано:
Some site-wide variables, like 'site_name', 'site_slogan', user e-mail contents... have language dependent content.
Since I don't like the solution of runing them through the localization system, because this means when you change the 'master' text, you have to re-translate it for every language, I've added this new feature which makes possible to have a list of variables -defined in the config file- which will be kept separated for each language.
This part is an add-on, and you can use it or not.
Но как юзать-то?
В install.txt прочитай
"Language dependent variables"
Только все равно не понятно. Может быть после того, как добавишь это в конфиг в web интерфейсе появится возможность переводить? ..
--
USU-Lug http://usu-lug.org.ru
Сыплю голову пеплом, нашел что добавить в settings.php:))
Вроде работает тьфу-тьфу-тьфу
Ну так поделись please с народом своей находкой, я тоже над этим ломаю голову.
Я же говорю, прочти в install.txt абзац про “Language dependent variables”.
--
USU-Lug http://usu-lug.org.ru
Добавил из install.txt - $i18n_variables в settings.php плюс туда же добавил $i18n_languages.
Все предыдущие настройки названий и слоганов обнулились и появилась возможность из-под каждой языковой версии вносить информацию на 2 языках.
Включил фирменный блок заодно с флажками - русский флажок.
НО остался один баг надо понимать. Короче когда я создал ноду в русском и перевел ее на английский, ссылки на переводы внизу этих нод неправильные. Т.е. не туда ведут:(( В блоке (когда стоим в ноде) правильные, а в самих нодах нет. Оч. странный баг.
И вообще я эти ссылки в каждой ноде на перевод постараюсь вырезать с корнем, ибо какой резон от них? Юзабилити нулевое. Надо просто кнопарь на сайт - English version и хватит.
Хех... Все программеры оптимисты....
Если это действительно единственный баг, то надо порадоваться, найти строчку кода, котора его выводит (не думаю, что это составит проблему) и поправить/закомментировать ее...
--
USU-Lug http://usu-lug.org.ru
Нашел, но проблема решилась на 50% только, т.к. как кривые перевод-ссылки распостраняются и дальше в админ-части.
http://drupal.org/node/24190
--
USU-Lug http://usu-lug.org.ru
Хрен-то там, я уже это видел, и сейчас написал туда. Там баг распространяется на админ-часть, что не есть гуд.
Ты же сам в bugreport`е указал, в каких строках ошибка...
Я точно не уверен - проверить негде.
Но, по аналогии, как они исправили 1й баг, то надо во всех строках, что ты указал $node->nid заменить на $trnode->nid
Проверь плз.
--
USU-Lug http://usu-lug.org.ru
Те строки, к-рые указал, я там исправил, да. Но то, что происходит в "содержании" сайта не лечится в этом модуле, ковырять core не особо хочется.
Я не совсем понял какие строки править вместо $node->nid на $trnode->nid ???
Если 142 строку, т.е. вот эту:
$links[]= theme('i18n_link_name_flag', $lang, 'node/'. $trnode->nid);
то там и так стоит $trnode->nid.
Потом iang, в своем патче указывает 876 строку, но такой вообще нет :-(, в 875 стоит последний тег. Поясните please подробней что на что вручную павить?
Файл - i18n.inc.
Помимо патча приложенного на друпалорге, исправить следующее:
Исправить (~331 строка) $rows=[] на
$rows[] = array($name, l($node->title, $lang.'/node/'.$node->nid), l(t('edit'), $lang.'/node/'.$node->nid.'/edit'));
Опять же (~401 строка) $rows=[]
$rows[] = array($langname, l($trans->title, $lang.'/node/'.$trans->nid.'/edit'));
Т.е. вместо
'node/'.$node->nid
$lang.'/node/'.$node->nid
На счет замены на $lang.'/node/'.$trnode->nid
Не пробовал, может тоже работает...
НО опять же в "администрировании содержания" (admin/node) остаются эти баг-ссылки.
С этим понятно. Спасибо!
А вот с патчем от iang не совсем. В таком виде как он его дал:
http://drupal.org/files/issues/i18n.inc.patch
если его сохранить, и применить используя в консоли patch, то файл i18n.inc не патчится. В родных патчах, которые идут с модулем, синтаксис совсем другой. Что изменить руками?
Вы i18n.module давно скачивали?
Я скачивал пару дней назад, файл i18n.inc уже был пропатчен.
Другое дело, что он исправляет не все баги. В этой теме об этом уже писали.
--
USU-Lug http://usu-lug.org.ru
само собой там кривой патч - забыл сказать.
Я патчу руками всегда, так хоть отслеживаешь логику изменений.
Пропатч сам, там добавить то одну строчку всего и изменить следующую.
Еще раз вопрошаю: в админке у вас тоже ссылки кривые остались? да??
admin/node
типа если стою в ru/admin/node все ссылки на редактирование и на сами ноды начинаются с ru/ - без разбору:((
Хотя это уже не так страшно, т.к. не в юзер-интерфейсе находится.
Да, правильно, кривые. Вот только то, что они кривые, вот это не правильно. А как исправить посоветовать некому :-(.
UPDATE 2:
Не работает хак.
Он влияет на сайдбар в целом, а не на блок в частности, да и сайдбар ведет себя странно после хака.
НЕ ИСПОЛЬЗОВАТЬ ХАК.
(по ссылке что ниже, тема определена как "отложеная".)
---------------------
Хак для block.module, для того чтобы назначать блокам пути (path) для их показа на страницах с урл начинающимся с ru/ или с en/ :
Это:
$lang = i18n_get_lang($name);
if (strlen($lang) > 0) {
$path = $lang . '/' . $path;
}
}
Вставить в block.module после вот этого "ифа" (~470 строка)
$path = drupal_get_path_alias($_GET['q']);
...
...
ОСТОРОЖНО!
Все блоки после этого исчезнут, т.к. path для них пустой по-умолчанию.
Лучше перед хаком добавьте для блока "Навигация" path: ru/* и en/*
Либо самостоятельно потом доберитесь до ru/admin/block и проставьте всем блокам новые пути с учетом языка. Код языка идет перед путем.
---------------
Вопрос показа блока только на заглавной русской, и того же переведенного блока на заглавной английской ОСТАЛСЯ ОТКРЫТЫМ:(
Да и заглавных русских то блин две получается - такая site.ru/ и такая site.ru/ru ... фигня блин.
---------------
UPDATE:
Что-то нихрена этот хак толком работать не хочет, ставлю блоку показывать на ru/* en/*, исчезает. Ставлю НЕ показывать на ru/* en/* появляется, это с одним блоком, а остальные ведут себя как хотят - то исчезают, то показываеются.
Вообще, на странице проекта, есть ссылка на его demo.
Дак вот я обратил внимание, что когда заходишь в корень сайта, тебя тут же перекидывает на /en/ (там это дефолтный язык).
Это, конечно, не красиво, но работает.
Могу предложить расширить эту идею. Переадрисовывать пользователя на дефолтный язык, только внутри сервера Вообщем mod_rewrite "спасет отца русской демократии"
В .htaccess:
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] - эту строчку комментируем.
И пишем:
RewriteRule ^(ru|en)(.*)$ index.php?q=$1$2 [L,QSA]
RewriteRule ^(.*)$ index.php?q=ru/$1 [L,QSA]
Работоспособность не проверял (модуля i18n нет, а ставит некогда т.к. сессия).
--
USU-Lug http://usu-lug.org.ru
неа, не прокатило:(( Стили отлетели нафик.
к base_url добавил ru/ тоже стили отлетели.
А.. ну правильно. Забыл про это ...
Сделай симлинк ru, который ведет на уровень выше.
Т.е.
Перейди в корень Друпала и
ln -s ../ ru
ln -s ../ en
$base_url верни на место!
В .htaccess проверь, что разрешено ходить по симлинкам. Т.е. есть строка.
Options FollowSymLinks
--
USU-Lug http://usu-lug.org.ru
не понимаю:((( что такое симлинк?
Это символическая ссылка. Т.е. например
у тебя есть каталог
/a/b/d/g/d/h/f/h
А тебе по каким-то причинам надо, чтобы его содержимое было видно по пути
/ab/
Создаешь симлинк /ab -> /a/b/d/g/d/h/f/h т.е.
ln -s /a/b/d/g/d/h/f/h /ab
Точно также, можно поступать с файлами.
.
Если у тебя win на ntfs, то симлинки можно создавать farом. НО! Аккуратно! Удалять их надо тоже фаром, т.к. стандартный проводник почитает симлинк обычным каталогом и удалит все рекурсивно.
fat симлинки не поддерживает.
.
Если уж создать симлинк никак, то в корне Друпала создай каталог ru и скопируй в него весь корень Друпала. Правда, в таком случае будет 2й расход места и проблема слежения за тем, чтобы ru всегда был актуален.
Вообщем, гораздо лучше использовать симлинки. Копирование может быть временным решением на win, а на хостинге (он же Юниксовый?) сделать симлинки, коммандами, которые я привел выше
--
USU-Lug http://usu-lug.org.ru
Блин:(( Ни хрена не понимаю, извини уж меня:)))
Да и хак с block.module окончательно меня запутал, там что-то все блоки то исчезают, то показываются...херня в общем какая-то.
Вообщем простой вариант.
Пусть у тебя сайт лежит в каталоге
drupal
создай
drupal/ru/
и _скопируй_ все из каталога drupal в каталог /drupal/ru/ (за исключением самого drupal/ru).
--
USU-Lug http://usu-lug.org.ru
Чтобы было более понятно, обрисую зачем это:
Дело в том, что mod_rewrite уж так устроен, что он переписывает _все_ urlы, которые попадают под regexp.
Поэтому вместо файла site.ru/themes/aaa/style.css апач пытается отдать site.ru/ru/themes/aaa/style.css
Естественно, такого нет.
Выхода 2:
1. Сделать, чтобы такой путь был
2. Измеить regex.
imho 1й проще и более правильный. Потому, что:
- можно, конечно, добавить самое первое правило
RewriteRule ^(.*\\.css)$ index.php?q=$1 [L,QSA]
Но, кроме cssок надо еще прописывать пути для картинок т.е. на самом деле
RewriteRule ^(.*\\.(?:css|jpg|png))$ index.php?q=$1 [L,QSA] и так далее.
А может быть какой-то модуль захочет какой-нибудь свой файл... Его тоже придется сюда прописывать.
Вообщем, слишком много факторов, которые надо учитывать.
С симлинком же, мы просто будем видеть по адресу
site.ru/ru/ теже самые файлы что и site.ru/
т.е.
site.ru/dir1/file и site.ru/ru/dir1/file будет одно и тоже.
--
USU-Lug http://usu-lug.org.ru
Ник, родной, остановись.
Хак с блоками не пашет
Пример.
Пусть есть 2 каталога:
1 и 2
$ ll
итого 8
drwxr-xr-x 2 nick nick 4096 2005-06-10 03:41 1
drwxr-xr-x 2 nick nick 4096 2005-06-10 03:41 2
_
Теперь мы хотим видеть каталог 2 по адресу 1/a
$ cd 1
$ ln ../2 a
$ ll
итого 0
lrwxrwxrwx 1 nick nick 4 2005-06-10 03:44 a -> ../2
_
Положим в каталог 2 какой-нибудь файл
$ cd ../2
Каталог пустой
$ ls
$ echo "blah-blah-blah" > file_in_dir_2
Появился файл:
$ ls
file_in_dir_2
_
Смотрим в 1/a
$ cd ../1/a
$ ls
file_in_dir_2
Теперь удалим файл
$ rm file_in_dir_2
Вернемся в каталог 2
$cd ../../2
Файла не стало:
$ ls
$
_
_
Символическая ссылка — зто файл особого вида, который содержит в качестве данных путевое имя. Когда зтот файл открывается, операционная система рассматривает его содержимое как заменяющие символы для дан-ного путевого имени и заставляет ядро еще немного порыскать по дереву каталогов, используя новое имя.
"Например, если символическая ссылка fred содержит имя barney, то указание открыть файл fred — зто, на самом деле, указание открыть файл barney. Если barney — каталог, то fred/wilma обозначает Ьатеу/wilma."
http://perl.trawkin.ru/g13.html
_
_
Нечно похожее на симлинки - это ярлыки в win. Только симлинки гораздо более продвинуты.
--
USU-Lug http://usu-lug.org.ru
Новый и проверенный хак для настройки frontpage(заглавных страниц) на разных языках.
Если вы выводите в качестве заглавной страницы определенную ноду
(если у вас идет просто стандартная лента, не хакайте!!),
то хочется конечно и на переведенной версии сайта имет заглавную с той же, НО переведенной нодой! ("Приветствие" и "Welcome" для корпоративных сайтов например.)
Этот хак для файла i18n.module, как раз к такому случаю. Замена нескольких строк в функции function i18n_init().
$front_page = variable_get('i18n_frontpage',0);
}
elseif ($i18n_langpath) {
//search alias with and without lang and remove lang
$_GET['q'] = i18n_get_normal_path($path);
}
// Multi table, for backwards compatibility and experimentation
if (variable_get('i18n_multi' , 0)) {
_i18n_set_db_prefix(_i18n_get_lang());
}
// If not in bootstrap, include hooks
if(!_i18n_is_bootstrap()){
include 'modules/i18n/i18n.inc';
}
if (isset($front_page)) {
$_GET['q'] = $front_page ? i18n_frontpage() : variable_get('site_frontpage','node');
}
Да! И не забудьте в settings.php добавить в уже определенный раннее функционал $i18n_variables новую опцию для поддержки перевода заглавных - site_frontpage, после хака он обнулит значения заглавных страниц в admin/settings и вы напишите свое для каждой из языковых версий.
К примеру у меня заглавная нода node/1 и ее перевод node/2. Соответственно в ru/admin/settings ставлю в качестве заглавной node/1, а в en/admin/settings - node/2
p.s. Если после хака полезут предупреждения, значит один из блоков настроен для показа на гипотетической теперь заглавной, т.е. в качестве path стоит <front> - не забудьте убрать это!
После предыдущего хака, у вас получились две заглавные страницы для разных версий. Но работают они как обычно по вызову ссылок site.ru/ru и site.ru/en. А что делать с корневым site.ru/ - там по-прежнему остается стандартная лента нодов?
Заходим в нашу БД, выбираем таблицу variable и в ряду site_frontpage (не трогаем ru_site_frontpage и en_site_frontpage) редактируем дефолтный путь (node) на новую заглавную которая должна выводится для русской версии (к примеру node/1 у меня). Чистим кэш, и загружаемся. Теперь все работает аккуратно.
Или я слепой, или ... Не могу найти в файле i18n.inc строку где есть функция с названием function i18n_init()???
Ми пардон! Исправил. Файл i18n.module.
Arsart, раз ты зарубил на корню мой вопрос http://www.drupal.ru/node/1088 и отправил сюда, значит буду приставать с вопросами тут :-). Как добиться следующего:
1. При переключении языков должны переключаться в соответствующий язык пункты меню (имеются ввиду добавленные дополнительно).
2. Любой контент на русском и английском должен в пути отображаться так (допустим для одной статьи): ru/node/10 и en/node/10, а не так: ru/node/10 и en/node/11. Думаю imho по логической структуре должно быть именно так.
Прошу просветить незнающего :-).
1. Менюхи настраиваются на русском в ru/admin/themes/settings
На английском в en/admin/themes/settings если ты правильно добавил в settings.php все переменные для
// Site configuration
'site_name',
'site_slogan',
'site_mission',
'site_footer',
'anonymous',
'site_frontpage',
// Node help
'blog_help',
'story_help',
// User configuration
'user_registration_help',
'user_mail_welcome_subject',
'user_mail_welcome_body',
'user_mail_approval_subject',
'user_mail_approval_body',
'user_mail_pass_subject',
'user_mail_pass_body',
// Theme settings: primary and secondary links, logo, etc..
'theme_settings',
// These are for PHPtemplate
'phptemplate_primary_links',
'phptemplate_primary_links_more',
'phptemplate_secondary_links',
'phptemplate_secondary_links_more',
);
p.s. site_frontpage - в том случае если заглавной служит определенная нода. Иначе - убрать.
1а. Если движок темы - phptemplate то ссылки настраиваются тем же макаром только в настройках своих тем.
2. Это по логике вещей, а по-существу - как ты будешь делить стандартный node на две части??? И чтобы одна выводилась этак, а другая так... Это новый движок не иначе:) А здесь все культурненько - каждому переводу своя нода. И не забывай про path, им можно разрулить визуальное оформление ссылок и для себя и для людей. Я еще не тестировал "поиск" в мультиязычном сайте, вот здесь то наши разные ноды и пригодятся.
Ребят, я пользуюсь модулем menu для создания собственной менюшки слева. А как разрулить ситуацию, чтобы для ссылок ./en/* показывалась английская менюшка, а для ссылок ./ru/* - русская. Я сделал две менюшки на разных языках и попытался при помощи настроек блоков задать такие правила.
Английская менюшка: показывать только на страницах en*
Русская менюшка: показывать только на страницах ru*
Не работает. Судя по всему друпал не хавает эти префиксы в путях, которые генерирует i18n. Кто как выходил из ситуации?
Покопался на Друпал.орг и нашёл решение своей проблемы.
Вот ссылка на инглиш-версию решения: http://drupal.org/node/17829
Ну и на русском опишу.
Моё решение работает только для php-template. Для начала нужно создать при помощи модуля menu два меню. Одно на русском, другое на английском. Временно включить оба меню и просмотрев страницу в виде HTML запомнить id этих менюшек. Предположим, у русской менюшки id=100, а у английской - 200. Теперь нужно отключить обе менюшки (в настройках блоков).
В то место файла page.tpl.php, где должна располагаться менюшка нужно вставить следующий код:
$MenuLanguage1 = theme_menu_tree(100);
$MenuLanguage2 = theme_menu_tree(200);
if (i18n_get_lang() == 'ru') { print $MenuLanguage1; } else {
print $MenuLanguage2;
}
?>
100 и 200 - это id соответствующих менюшек. Всё. Думаю, это можно включить в FAQ.
Опять по переводу меню!!!
Есть i18n + меню на Ru необходимо перевести это меню на En. Вариант перевода описанный в предыдущем коментарии вряд ли подходит (как в этом случае привязать страницы к пунктам меню?!!!).
У меня такой вот [url=http://drupal.org/node/121483]баг[/url] на http://houseofgodthelivingstone.org (Drupal 5.1, i18n 5.1-1.0):
Я изменил settings.php добавив i18n_variables как описано в README.txt
Когда я переключился на русский, зашёл на страницу "Информация о сайте" и стал добавлять имя, слоган и так далее я заметил, что то, что я пишу кириллицей не сохраняется и не добавляется. Если я в те же поля впишу что-то латинскими буквами - оно сохраняется и работает.
Я поэкспериментировал с другими языками: польским и вьетнамским. С польским всё работало, с вьетнамским - нет. Я подозреваю, что система не понимает знаков в расширенном диапазоне (далее, чем ANSI), то есть она грохается на нелатинских знаках.
Сама тема работает, без i18n переменных (если отключить их в settings.php), я могу добавлять имена и слоганы по русски. Но они не меняются при переключении языка.
Если у кого была такая проблема, дайте знать.
Проблема решена.
По какой-то причине i18n создал свои таблицы в латинской кодировке.
i18n_node
i18n_profile_fields
i18n_variable
Я поменял кодировку всех полей и этих таблиц через phpMyAdmin на utf8_general_ci
Всё заработало.
удалено
Где этот settings.php лежит?????????????????????????????
/sites/default/settings.php
а говорят что translation.module уже стал лучше чем i18n, надо-бы проверить
translation.module это просто часть i18n или вы какой-то другой имеете ввиду?!
да, наверно вот этот http://drupal.org/project/localizer
самое главное что у него "Additionally, there is built-in support for the following contrib modules: * Views"
Не могу разобратся с линками в translate. i18.inc вообще я так понял нет в последних версиях модуля для 5го друпала. Подскажите плиз как реализвать нормальный перевод нодов.