Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Catalyst] многоязычный сайт 
:(
    Опции темы
gcc
Дата 12.11.2009, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



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

тема - баян наверное

но как в Catalysє'у это красиво и удобно можно сделать?
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 12.11.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Многоязычный сайт это:
1) Соответсвующая кодировка страницы. 
Тут все просто: храните в сессии языковые настройки юзера и взависимости от них - выставляете кодировку в каком-нть action.

2) Локализация данных:
Вам придется хранить данные в utf8. Иначе придется использовать разные базы, что кошмарно =)

2.1) Динамические данные (которые генерят юзеры и т.п.)
Эти данные просто хранятся так как их создали пользователи. Т.е. если у вас есть объявление на украинском языке - то оно будет всегда видно на украинском (и как я подозреваю только для украинцев).
Т.е. с точки зрения динамических данных (объявления, новости, комментарии, анкеты) - у вас будут совершенно независимые сайты для каждого языка.

2.2) Статические данные (названия пунктов меню, сообщений об ошибках, элементы дизайна и т.п.)
Я вижу два варианта: 
- делать копии шаблонов на разных языках - это просто ужасно!
- хранить все данные требующие локализации отдельно, например в базе. Или в текстовом файле. И во всех местах где вы хотите  вывести какую-либо фразу на каком-нть языке - вам нужно выбирать эту фразу в зависимости от языка.

Приведу привет на Template-Toolkit:

Без локализации:
Код

Привет, [% username %]! <br/>
Ошибка: [% errdescr %] </br>


С локализацией:
Код

[% localization.common.hello %], [% username %]! <br/>
[% localization.common.error %]: [% localization.errors.error_num %] </br>

здесь:
localization - структуру (дерево) данных которая содержит все локализованные сообщения для конкретного языка. Ваш контроллер при передачи данных в шаблонизатор должен в зависимости от языка загрузить правильное дерево.

P.S. сами локализованные данные на раннем этапе можно хранить в JSON. Потом наверно лучше переложить в базу...

Как видите шаблоны придется жестко перелопатить  smile 

Это сообщение отредактировал(а) sir_nuf_nuf - 13.11.2009, 16:08


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
DEER
Дата 12.11.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Цитата(sir_nuf_nuf @ 12.11.2009,  13:28)
2.1) Динамические данные (которые генерят юзеры и т.п.)
Эти данные просто хранятся так как их создали пользователи. Т.е. если у вас есть объявление на украинском языке - то оно будет всегда видно на украинском (и как я подозреваю только для украинцев).
Т.е. с точки зрения динамических данных (объявления, новости, комментарии, анкеты) - у вас будут совершенно независимые сайты для каждого языка.

можно и эти данные делать многоязычными (хотя бы те, который вводит администрация)
я пользуюсь такой структурой
Код

CREATE TABLE `dictionary` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` USING BTREE (`name`)
);
CREATE TABLE `dictionary_data` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `dic_id` int(10) unsigned NOT NULL default '0' COMMENT 'Divtionary ID',
  `foreign_id` int(10) unsigned NOT NULL default '0',
  `language` char(2) NOT NULL default '',
  `value` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `dic_id` (`dic_id`),
  KEY `dictionary_key` (`dic_id`,`language`)
);

dictionary - набор словарей (заголовок новости, тело новости и т.п.)
dictionary_data - данные словарей
   dic_id - номер словаря
   foreign_id - номер объекта (новости, объявления и т.п.)
Какой то язык должен быть "по умолчанию", то есть обязательным.
При внесении данных,  валидируем, то внесены данные для языка по умолчанию.

Далее, все как написал sir_nuf_nuf.

в шаблоне пишем
Код

[% article.title() %]

фyнкция title у объекта "Новость"
смотрит выбранный язык пользователя. Берет заголовки(словарь "заголовки новостей") из таблицы dictionary_data для данной новости. Если есть значение для выбранного языка - возвращает его. Если нету, возвращает значения для языка "по умолчанию"



--------------------
 
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 12.11.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



извините, забыл написать что HTML::Template


Цитата

1) Соответсвующая кодировка страницы. 
Тут все просто: храните в сессии языковые настройки юзера и взависимости от них - выставляете кодировку в каком-нть action.

2) Локализация данных:
Вам придется хранить данные в utf8. Иначе придется использовать разные базы, что кошмарно =)


ut8 использую

Цитата

2.2) Статические данные (названия пунктов меню, сообщений об ошибках, элементы дизайна и т.п.)
Я вижу два варианта: 
- делать копии шаблонов на разных языках - это просто ужасно!


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

хотя я люблю писть  CSS в HTML (ну и в отдельном файле, смешивать)

Цитата

P.S. сами локализованные данные на раннем этапе можно хранить в JSON. Потом наверно лучше переложить в базу...


точно


Цитата

можно и эти данные делать многоязычными (хотя бы те, который вводит администрация)


в HTML::Template мне кажется что что будет очень и очень не красиво и если оно еще будет в базе, тот кто будет смотреть - он же ничего не поймет

и очень много дополнительных тэгов будет, очень много, вот в HTML::Templateс циклам можно решить, весь шаблон взять в цикл с одной интеграцией

есть может быть вариант для HTML::Template написать дополнительный шаблон и в нем русские словосочения заменить на дргой язык...!?

====
тут тогда наверное лучше отделить в разные файлы...



Это сообщение отредактировал(а) gcc - 12.11.2009, 17:19
PM WWW ICQ Skype GTalk Jabber   Вверх
DEER
Дата 12.11.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Цитата(gcc @ 12.11.2009,  17:15)
Цитата

можно и эти данные делать многоязычными (хотя бы те, который вводит администрация)


в HTML::Template мне кажется что 'то юуде очень и очень не красиво и если оно еще будет в базt, тот кто будет смотерть - от же ничего не поймет

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

есть вариант для HTML::Template написать дополнительній шаблон и в нем русские словосочения заменить на дргой язык...

тут тогда наверное лучше отделить в разные файлы...

я не очень понял то, что ты написал
редактирование выглядит примерно так 
user posted image
для плашек написана спец либа на js


можно загружать данные в кеш изначально и не мучить базу.

и про циклы не понял. загружается такая конструкция с хеш и очень удобно ей пользоваться

Добавлено через 1 минуту и 53 секунды
могу присалть код на мыло. посмотришь

Это сообщение отредактировал(а) DEER - 12.11.2009, 17:27


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 12.11.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



DEER, если есть массив хэшей

Код

   <table width="100%">
    <TMPL_LOOP NAME=EMPLOYEE_INFO>
        <tr>
          <td>Имя: <TMPL_VAR NAME=NAME></td>
          <td>Должность: <TMPL_VAR NAME=JOB></td>
        </tr>
    </TMPL_LOOP>
    </table>


и если нужно добавить внутрь, например,  <TMPL_VAR NAME=BLA2>,  то нужно всю структуру перебрать и в каждный хэш вствить BLA2

Цитата

редактирование выглядит примерно так 


т.е. если слова будут разной длинной, то проблем не будет, я так понял

тогда попробую так...


Это сообщение отредактировал(а) gcc - 12.11.2009, 17:39
PM WWW ICQ Skype GTalk Jabber   Вверх
DEER
Дата 12.11.2009, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 2
Всего: 13



Код

   <table width="100%">
    <TMPL_LOOP NAME=EMPLOYEE_INFO>
        <tr>
          <td>Имя: <TMPL_VAR NAME=NAME></td>
          <td>Должность: <TMPL_VAR NAME=JOB></td>
        </tr>
    </TMPL_LOOP>
    </table>


gcc, перечитай первое сообщение мое в той теме.
выглядеть будет так
Код

   <table width="100%">
    <TMPL_LOOP NAME=EMPLOYEE_INFO>
        <tr>
          <td>Имя: [% employee.title() %]</td>
          <td>Должность:[% employee.job_name() %]</td>
        </tr>
    </TMPL_LOOP>
    </table>

а уже внутри этих функций пиши что хочешь.
ты на каталист пользуешься динамической генерацией классов - моделей? надо будет перейти на статическую.
тогда метод title будет выглядеть примерно так
Код

sub title{
    my $obj = shift; # объект
    my $lang = shift; # язык, можно передать, а можно и нет
    $lang ||= 'en'; # yt передали, тогда en - английский
    my @name = $::session->dic->load('employee',$obj->id,$lang); # dic - это наша внутренняя разработка, и её код я тут не опубликую. хочешь, на мыло пришлю.
    my $ret = shift @name;
    return '' unless $ret;
    return $ret->value;
}



Это сообщение отредактировал(а) DEER - 12.11.2009, 18:00


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 13.11.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



ok, сделаю

просто картину портит HTML::Template, я всегда его использую

прейдется на Template-Toolkit перейти smile 

или посмотрю варианты - подковырять внутри в HTML::Template или дополнения к нету на cpan.org ....

Это сообщение отредактировал(а) gcc - 13.11.2009, 00:59
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 13.11.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Цитата(gcc @  13.11.2009,  00:58 Найти цитируемый пост)
прейдется на Template-Toolkit перейти

а чем вас ваш шаблонизатор не устраивает ? по моему вы намереваетесь сделать какую-то ошибку сейчас...  smile 

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


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
sir_nuf_nuf
Дата 13.11.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



gcc, кстати, я немного поправил свой пост - теперь код шаблона стал еще проще, без вызова функции - такой можно реализовать даже на HTML::Template.

Вам нужно только при передачи данных шаблону передать нужную структуру с сообщениями локализации. Это можно делать в том же месте где и выставляете кодировку страницы.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 13.11.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



Цитата

Все это можно решить нормально в рамках HTML::Template


можно всё, а как быть с вот этим вот ?

Код

    push @{$loop_data}, $_ while $_ = $sth->fetchrow_hashref();


Код

    <TMPL_LOOP NAME=EMPLOYEE_INFO>
        <tr>
          <td>Имя: <TMPL_VAR NAME=NAME></td>
          <td>Должность: <TMPL_VAR NAME=JOB></td>
        </tr>
    </TMPL_LOOP>



если нужно внутрь EMPLOYEE_INFO вставить <TMPL_VAR NAME=NAME222>, то нужно будет перебирать всю структуру!! и если там двухмерный или трехмерный с разветлением массив хэшей? это будет черезвычайно криво... нужно будет перебирать всё 

ЗЫ: или нормально?



Это сообщение отредактировал(а) gcc - 13.11.2009, 20:08
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 13.11.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Цитата

nside a <TMPL_LOOP>, the only variables that are usable are the ones from the <TMPL_LOOP>. The variables in the outer blocks are not visible within a template loop. For the computer-science geeks among you, a <TMPL_LOOP> introduces a new scope much like a perl subroutine call. If you want your variables to be global you can use 'global_vars' option to new() described below.


П.С. Мда HTML::Template поражает воображение...

Возможно опция 'global_vars'  спасет мир ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 13.11.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



sir_nuf_nuf, спасибо не увидел smile  наверное поможет



Цитата

global_vars - normally variables declared outside a loop are not available inside a loop. This option makes <TMPL_VAR>s like global variables in Perl - they have unlimited scope. This option also affects <TMPL_IF> and <TMPL_UNLESS>.

Example:

  This is a normal variable: <TMPL_VAR NORMAL>.<P>

  <TMPL_LOOP NAME=FROOT_LOOP>
     Here it is inside the loop: <TMPL_VAR NORMAL><P>
  </TMPL_LOOP>

Normally this wouldn't work as expected, since <TMPL_VAR NORMAL>'s value outside the loop is not available inside the loop.

The global_vars option also allows you to access the values of an enclosing loop within an inner loop. For example, in this loop the inner loop will have access to the value of OUTER_VAR in the correct iteration:

   <TMPL_LOOP OUTER_LOOP>
      OUTER: <TMPL_VAR OUTER_VAR>
        <TMPL_LOOP INNER_LOOP>
           INNER: <TMPL_VAR INNER_VAR>
           INSIDE OUT: <TMPL_VAR OUTER_VAR>
        </TMPL_LOOP>
   </TMPL_LOOP>

One side-effect of global-vars is that variables you set with param() that might otherwise be ignored when die_on_bad_params is off will stick around. This is necessary to allow inner loops to access values set for outer loops that don't directly use the value.

NOTE: global_vars is not global_loops (which does not exist). That means that loops you declare at one scope are not available inside other loops even when global_vars is on.


Добавлено через 1 минуту и 3 секунды
там вон еще разные дополнения есть http://search.cpan.org/search?m=all&q=...mplate&s=11
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.