| Цитата | Как сделать,что бы все набранное через вэб интерфейс, пользователями, перекодировать в латинские символы, а при обращении к странички или файлам, вернуть русские названия?
|
А зачем тебе это нужно? Воспользуйся возможностями XML, работать будет на порядок быстрее (даже если заюзать базу), да и всегда можно будет добавить поддержку других языков, если это будет нужно. Например:
| Код | <?xml version="1.0" encoding="utf-8"?> <photobook-document version="1.0" timestamp="2006-01-01 3:17:00"> <book id="23355236626165465223"> <ru> <title>Новый год 2006</title> <description>Это тестовый фотоальбом. Создан только для теста.</description> </ru> <en> <title>New year 2006</title> <description>This is a test photo album. Created only for test</description> </en> </book> <book id="23355236626165465224"> <ru> <title>Старый год 2005</title> <description>Это второй тестовый фотоальбом. Создан только для теста.</description> </ru> <en> <title>The old year 2005</title> <description>This is a second test photo album. Created only for test</description> </en> </book> <book id="23355236626165465225"> <ru> <title>Италия 2003 год</title> <description>Это третий тестовый фотоальбом. Создан только для теста.</description> </ru> <en> <title>Italy 2003</title> <description>This is a third test photo album. Created only for test</description> </en> </book> </photobook-document>
|
Сохраним это дело в файл с именем PhotoBook.xml, в кодировке UTF-8 Теперь пишем такую CGI программу:
| Код | #!/usr/bin/perl -w use strict; use XML::Simple; use Text::Iconv; use CGI;
# Путь к XML файлу my $file = "/home/localhost/www/xmls/PhotoBook.xml";
# Создаём объекты CGI и Text::Iconv my $conv = Text::Iconv->new("UTF-8", "WINDOWS-1251"); my $cgi = CGI->new();
# Получаем данные из XML файла my $xml = XMLin($file);
# Получаем параметры my $lang = $cgi->param('lang') || "ru"; $lang = "ru" if ($lang ne "en"); my $id = $cgi->param('id') || ""; $id = "" unless ( exists( %$xml->{book}{$id} ) );
# Здесь разумнее воспользоваться XML, но для того, что бы его не перегружать, # что-бы проще было объяснить, я воспользовался обычными скалярными переменными. my($t1, $t2, $t3, $t4, $t5); if ( $lang eq "ru" ) { $t1 = "Название альбома"; $t2 = "Описание альбома"; $t3 = "Все альбомы"; $t4 = "Английская версия"; $t5 = "Всего альбомов"; } else { $t1 = "Title of album"; $t2 = "Description of album"; $t3 = "All albums"; $t4 = "Russian version"; $t5 = "Total albums"; }
# Выводим заголовок с нужно кодировкой, в зависимости от языка print $lang eq "ru" ? $cgi->header( -charset => "windows-1251" ) : $cgi->header();
# Показываем информацию об альбоме, если указан реальный id if ( $id ) { print $cgi->start_html( -title => "Album '" . $conv->convert($xml->{book}{$id}{$lang}{title}) . "'"); print $cgi->b( $t1 . ": "); print $cgi->font( $conv->convert($xml->{book}{$id}{$lang}{title}) ); print $cgi->br(); print $cgi->b( $t2 . ": "); print $cgi->font( $conv->convert($xml->{book}{$id}{$lang}{description}) ); print $cgi->hr(); print $cgi->b( $t3 . ": "); }
print $cgi->br();
# Переменная счётчик my $count = 0;
# Выводим ссылки на все имеющиеся альбомы foreach my $book ( keys %{$xml->{book}} ) { print $cgi->a( { -href => $cgi->url( -relative => 1 ) . "?id=$book&lang=$lang", -style => "color: #0000aa" }, $conv->convert($xml->{book}{$book}{$lang}{title})); print $cgi->br(); ++$count; }
print $cgi->hr();
# Выводим общее число альбомов print $cgi->b( $t5 . ": "); print $cgi->font( $count ); print $cgi->hr();
# Делаем инверсию языка if ( $lang eq "ru" ) { $lang = "en"; } else { $lang = "ru"; }
# Выводим ссылку на версию страницы на другом языке print $cgi->a( { -href => $cgi->url( -relative => 1 ) . "?id=$id&lang=$lang", -style => "color: #aa0000" }, $t4 );
# Завершаем генерацию HTML файла print $cgi->end_html();
|
Теперь запускай CGI программу и наблюдай, сколько возможностей нам даёт простенький XML. Также обрати внимание, что если понадобится поддержка ещё одного или нескольких языков, то достаточно просто добавить ещё один или несколько блоков <сокращение-языка></сокращение-языка>, в блок <book></book>, нашего xml и немного подправить программу, так как я жёстко запрограммировал её на 2 языка. С другой стороны можно было бы создать список из всех возможных языков и при добавлении нового языка, заносить в него новый язык, всё остальное программа будет делать за тебя (вобщем гибко запрограммировать). Но это уже тонкости, если тебе будет нужно, то думаю ты разберёшься с этим. К тому же никогда не поздно задать конкретный вопрос в этом же разделе.
Так же прошу обратить внимание на то, что я, для простоты изложения в блоках <ru></ru><en></en> я храню только данные Заголовка и Описания. В них можно добавить так же и другие данные, если они нужны.
Удачи тебе и С новым годом. |