Мультиязычность

RLink

Новичок
Мультиязычность

Здравствуйте!
Очень интересует, как лучше сделать несколько версий сайт. (английская, французская, русская...)
Возник вопрос по производительности, что лучше делать создавать страницу, а потом весь код сайта облачить в ob_start, затем в переменную и в конце использовать str_raplace($lang[%], $lang['ru'], $site); по базе типа:

$lang['%'][] = '%slovo1%';
$lang['ru'] = 'слово1';
$lang['en'] = 'word1';

$lang['%'][] = '%slovo1%';
$lang['ru'] = 'слово1';
$lang['en'] = 'word1';

а в самом документе просто например писать так %privetstvie%, %opisanie%

ИЛИ лучше сделать функцию, типа
function lang($s) {
globals $multi;

$r['slovo1']['ru'] = 'slovo1';
$r['slovo1']['en'] = 'slovo1';
$r['slovo2']['ru'] = 'slovo2';
$r['slovo2']['en'] = 'slovo2';

return $r[$s][$multi];
}
и вызывать функцию в самом php документе, echo $lang('slovo1');

насчёт выигрышности, str_replace возможно выигрывает, ну можно в конце ещё потом пробелы лишние удалить, табы и другой мусор, который только для удобства программиста, так же мне удобнее это так как использую memcache. А вот насчёт производительности, это ведь получает функция будет оббегать весь документ при каждом запросе пользователя.

Очень волнует вопрос производительности, прошу помочь.
Сайт посещают около 40-50тыс хостов/день.
 

AmdY

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

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

RLink

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

Как? Сайт состоит из многих блоков, где часто меняет информация, целая страница не будет долго храниться в кеше.
 

Активист

Активист
Команда форума
RLink
У тебя есть некий шаблонизатор (Smarty, Native и т.п.), вот и делай

/tеmplates/ru/ - сюда ложи шаблоны на русском
/templates/en/ - сюда ложи шаблоны на пендоском

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

Если ты используешь языковые переменные для вывода информации в PHP коде, аля

PHP:
error($lang['ru']['empty_email'], ...);
То лучше использовать некую функцию (обработчик), который проверить наличие сабжа в некой переменной или еще что-нибудь сделает.
Кстати. каждый блок каждого языка - должен иметь шаблон, а через ленги выводить различную информацию, результат которой, обычно - обработка информации от юзера и ее обработка,
в случае вывода - зачем юзать какие-то переменные, ибо на все должен быть шаблон.

AmdY
Обычно так (как предложил автор) шаблоны делают в опенсурсном УГ, где производительность - не самое важное.
 

RLink

Новичок
Зачем шаблоны???
Я не использую их, все программируется прям на странице, где есть index.php, а туда в середину загружаются только страницы из папки pages/
Был бы шаблонизатор, то понятно, включил бы туда все языки и кончено на этом. Но я считаю шаблонизаторы лишней нагрузкой, но вот что-то и придется делать типа него, для мультиязычности.
Вот я и спрашиваю, что лучше, просто вызывать переменные где будут нужные фразы на нужном языке или парсить полностью весь документ, т.е. как и делают все шаблонизаторы.
 

Активист

Активист
Команда форума
> Но я считаю шаблонизаторы лишней нагрузкой
Ну ты же разобрался с мемкешем, а с бенчмарком почему нет?
Я не знаю какая там "система", но имхо, шаблоны, особенно Native не самое узкое место.

Бери бенчмарк, смотри код, и анализируй, что тебе выгоднее.

Тут все есть
 

RLink

Новичок
Спасибо, что ткнули носом! )
Остальные выводы можно будет делать уже самостоятельно.

-~{}~ 22.07.10 06:33:

А есть уже готовые бенчмарки для PHP?
Или лучше самому по микротайму в while проверять код?
 

AmdY

Пью пиво
Команда форума
RLink
что в твоём понимании есть шаблоны?
/tеmplates/ru/ - сюда ложи шаблоны на русском
/templates/en/ - сюда ложи шаблоны на пендоском
ну как бы я предпологал, что их генерируют, зачем копипастить вёрстку для простой замены текста
 

RLink

Новичок
никто ничего не копипастит!

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

AmdY

Пью пиво
Команда форума
зачем какие-то шаблоны, если нужно заменить всего немного текста.
заготовка в которой нужно что-то заменить - это как бы и есть ШАБЛОН, и без разницы что там %slovo%, или {$slovo}, или {$slovo|translate:"ru"}
 

RLink

Новичок
Именно поэтому и был такой вопрос, делать что-то вроде шаблона или же вставлять переменные, там где нужен текст.
 

igortik

Новичок
банально:

ru.php

$lang_var['name'] = 'some name';
...

А потом еще потребуется написать мега-шаблонизатор, который в состоянии распарсить нечто {(*name*)} и за несколько проходов создать кеши шаблонов для разных языков, или по надобности создавать, когда язык активен.
 

AmdY

Пью пиво
Команда форума
RLink
нужно вставлять значения.

делаешь шаблон с плейсхолдерами а-ля %slovo%, затем генерируешь шаблоны для разных языков
index.tpl
-------------
text %slovo% text

ru/index.tpl
-------------
text слово text

en/index.tpl
-------------
text word text

работы на часик, но затем не нужно держать в памяти огромные массивы с переводами.
 

igortik

Новичок
AmdY

а ты натолкнул на мысль...
если кеш есть (т.е. уже распарсеный шаблон), то незачем тянуть "lang vars"... хотя, попахивает нанооптимизацией в случае с массивом из 50-100 значений
 

RLink

Новичок
Зачем шаблон? если сайт составлен из блоков и каждый блок обновляется очень часто, если кешировать всю полностью страницу, то придется ее обновлять чуть ли не каждую секунду...
 

igortik

Новичок
RLink
Ajax в таком случае поможет обновлять такого рода контейнеры :)
это, как вариант..

ведь есть еще меню и немало иных элементов "относительно статического характера", если уже речь пошла о проектах, где много блоков (предположение)
 

Crys

Двинутый новичок
Зачем шаблон? если сайт составлен из блоков и каждый блок обновляется очень часто, если кешировать всю полностью страницу, то придется ее обновлять чуть ли не каждую секунду...
Данные для русской/английской версии откуда берутся? Имею ввиду slovo1, slovo2?

Каждую секунду обновляешь php-код?

Тебе предложили кэшировать шаблоны. То есть типа
en.tpl
Hello, <?php echo $username?>

ru.tpl
Здравствуй, <?php echo $username?>

Либо

global.tpl
<?php echo $lng[...]['hello']?>, <?php echo $username?>

А сам $lng храни хоть в том же мемкеше, хоть у бабушки на ноутбуке...
 

igortik

Новичок
вообще, задача тривиальная.

У меня все ленг варсы тянутся для каждого модуля отдельно + глобальные, собирают они себя в один массив и шаблонизатор их подставляет в глобальные шаблоны, шаблоны актов модулей и шаблоны форм...

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