|
|
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Пишу движок для сайта на 3-х языках. Возможно еще парочка потом добавиться, не больше. Википедией сайт навряд ли станет. Смену языков планирую делать на лету, т.е. подгружаются сразу все переводы, но лишние просто скрываются ява-скриптом Вопрос: нужно ли заморачиваться и выносить переводы в отдельную таблицу, потом ее джойнить и т.д.? Пока в таблицах делаю по столбцу на каждый язык (name_ru, name_en, name_fr). Конечно, на добавление нового языка уйдет день, но это будет... раз в два года. Расскажите о своем опыте? Посоветуйте толковые статьи по теме многоязычности (в т.ч. задание валют, символов разрядов). Как бы вы реализовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2013, 18:46 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Shitbox2, Вообще-то, скажем так, нужно - значит нужно. 1. " лишние просто скрываются ява-скриптом" - совершенно плохой подход. Это всё "скрытие" надо на сервере делать. 2. Если надо в таблицах - делайте в таблицах. Вам джойн написать лень? Кстати, в больщинстве случаев джойн не понадобится. Просто берите из реквеста язык и вставляйте его во "ВХЕРЕ" запроса. 3. Насчёт валют и разрядов и тп. - всё должно делаться Вашим движком, в зависимости от настроек пользователя (см. реквест). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2013, 20:24 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Бред какой-то. Если надо то делайте, если не надо, то и париться нечего. Если вы сами не знаете, кто-то другой тем более не сможет ответить. С подгрузкой всего еще больший бред, если у вас будет 10 языков, то страничка будет вместо 100кб - 1Мб весить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2013, 21:33 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Не будет 10 языков точно. Будет 3. Возможно, потом еще 1, 2... Это мне кажется, что если заводить отдельную табличку с переводами, то запары больше будет. Может это не так, не знаю. А что плохого в том, чтобы показывать загружать сразу все переводы? Ну будет лишний трафик, зато пользователь щелк и моментально все перевелось. Это что касается навигации, а большие тексты аяксом. Как сделать без джойна? Можно подробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2013, 23:39 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
авторЭто мне кажется, что если заводить отдельную табличку с переводами, то запары больше будет. Мне так кажется с вашим методом будет больше запар, а толку меньше. Это не гугл транслит, пользователь не будет туда сюда языки щелкать сидеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2013, 07:56 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Ну может быть, поэтому и спрашиваю мнений. И как сделать-то без Джойна? Можно на пальцах структуру БД и запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2013, 19:03 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Вот чтоб вообще не париться есть Gettext http://php.net/manual/ru/book.gettext.php :) не переживайте пишите свой движок, а осознание "правильной" структуры придет с практикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2013, 19:28 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
авторБиблиотека gettext предполагает хранение перевода в файлах с расширениями .mo авторДля формирования и обновления этих файлов при изменении программы предполагается использование ряда утилит. авторПервоначально, строки из исходного текста программы собираются с помощью программы xgettext в .pot-файл (каталог). Обновление этого файла и файлов переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программой msgmerge. авторДля начала перевода программы на конкретный язык, переводчик создаёт .po-файл: копирует .pot-файл в нужное место и меняет в нём заголовок. Для этого можно использовать программу msginit. Готовый файл перевода конвертируется в .mo-файлы утилитой msgfmt. Архив gettext-0.18.2.tar.gz 2012-12-25 08:58 Папка Папка gettext-0.18.2 2012-12-25 08:17 50966 9223372034707292159 gettext-0.18.2\ChangeLog 2012-12-25 08:58 Папка Папка gettext-0.18.2\build-aux 2012-12-25 08:29 6567 9223372034707292159 gettext-0.18.2\build-aux\install-reloc 2012-12-25 08:29 4749 9223372034707292159 gettext-0.18.2\build-aux\relocatable.sh.in 2012-12-04 09:28 1186 9223372034707292159 gettext-0.18.2\build-aux\ac-help.sed 2012-12-25 08:33 2796 9223372034707292159 gettext-0.18.2\build-aux\elisp-comp 2012-12-25 08:29 2821 9223372034707292159 gettext-0.18.2\build-aux\csharpexec.sh.in 2012-12-04 09:28 31272 9223372034707292159 gettext-0.18.2\build-aux\moopp 2012-12-25 08:29 2463 9223372034707292159 gettext-0.18.2\build-aux\javaexec.sh.in 2012-12-04 09:28 1452 9223372034707292159 gettext-0.18.2\build-aux\fixaclocal 2012-12-25 08:40 44935 9223372034707292159 gettext-0.18.2\build-aux\config.guess 2012-12-25 08:29 4134 9223372034707292159 gettext-0.18.2\build-aux\config.libpath 2012-12-25 08:29 3306 9223372034707292159 gettext-0.18.2\build-aux\reloc-ldflags 2012-12-25 08:29 5463 9223372034707292159 gettext-0.18.2\build-aux\csharpcomp.sh.in 2012-12-25 08:40 35758 9223372034707292159 gettext-0.18.2\build-aux\config.sub 2012-12-25 08:30 13997 9223372034707292159 gettext-0.18.2\build-aux\install-sh 2012-12-25 08:29 18717 9223372034707292159 gettext-0.18.2\build-aux\config.rpath 2012-12-25 08:33 6047 9223372034707292159 gettext-0.18.2\build-aux\mdate-sh ... И еще 100500 строк, которые даже опубликовать нельзя, т.к. превышено 100 Кб ... 2012-12-04 09:28 11892 9223372034707292159 gettext-0.18.2\djgpp\config.sed 2012-12-04 09:28 12210 9223372034707292159 gettext-0.18.2\djgpp\config.bat 2012-12-04 09:28 17405 9223372034707292159 gettext-0.18.2\djgpp\fnchange.in 2012-12-04 09:28 6578 9223372034707292159 gettext-0.18.2\PACKAGING 2012-12-25 08:36 30323 9223372034707292159 gettext-0.18.2\Makefile.in 2012-12-25 08:36 23780 9223372034707292159 gettext-0.18.2\aclocal.m4 2012-12-15 06:32 7794 9223372034707292159 gettext-0.18.2\Makefile.am # # Всего: Размер Сжат Файлы # 76330355 /0-('+.+('-(*. 4838 Они пользователей за идиотов держат? Пусть сами ковыряются в своей библиотеке! Можно как-нибудь без этого? Только ПХП и МайСКЮЛ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2013, 23:34 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Shitbox2, Делается 1 обычная таблица (к примеру `users` (`id`, `name`, ... куча других параметров)), вторая таблица `users_i18n` (`id`, `language_id`, `name` и куча других параметров, для которых нужны переводы) и таблица `languages` (`id`, `language`). Потом пишется метод getI18n($languageId) в классе, отвечающем за данную сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 00:25 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
getI18n это функция библиотеки GetText? Какая-то странная структура. Зачем-то создавать кучу табличек-дубликатов с переводами, зачем-то в них идентификатор языка делать... Не понимаю логики Не проще ли и быстрее сделать одну общую табличку с переводами: Strings id ru en de fr ... и везде ссылаться на id строк из нее: Article id iser_id title_id text_id Код: sql 1. Да, еще замечу, что в моем случае точно не будет проектов с кучей языков, падежами и проч. А в переводе будет нуждаться в основном интерфейс и несколько информационных статей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 01:40 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
И еще, все тексты планирую хранить исключительно в БД и отдавать в JSON, а JS сам уже будет страничку строить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 02:01 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Shitbox2, Shitbox2Не проще ли и быстрее сделать одну общую табличку с переводами: Strings id ru en de fr ... Проще и быстрее (поначалу), когда у тебя в таблице 3 поля. А вот уже когда 33, то не проще и не быстрее. И противоречит идее нормализации базы данных. Но, как ты изволил выразиться, "заморачиваться" тебе не стоит. Ибо кажется, что оно тебе на данном этапе твоих знаний и не нужно. Shitbox2getI18n это функция библиотеки GetText? Нет, причем тут GetText? Это самописный метод в классе, реализующем некое подобие DAO . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 02:12 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Shitbox2getI18n это функция библиотеки GetText? Какая-то странная структура. Зачем-то создавать кучу табличек-дубликатов с переводами, зачем-то в них идентификатор языка делать... Не понимаю логики Не проще ли и быстрее сделать одну общую табличку с переводами: Strings id ru en de fr ... и везде ссылаться на id строк из нее: Article id iser_id title_id text_id Код: sql 1. Да, еще замечу, что в моем случае точно не будет проектов с кучей языков, падежами и проч. А в переводе будет нуждаться в основном интерфейс и несколько информационных статей. Но пройдет годик и вы захотите еще 1 добавить, придеться лаьтерить табличку. А на продакшене уже базка 1гб весит, и альтер заблочит ее на пол часа, когда будет пытаться пропихнуть дополнитульную колонку. Ну не принято добавлять данные через алтеры, все делают это через класический инсерт language_id language1ru2en user_id language_id112132 page_id1 translate_idlanguage_idpage_idtitlecontent121hi hello world211прет првиет мир ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 09:12 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Shitbox2Не проще ли и быстрее сделать одну общую табличку с переводами: Strings id ru en de fr ... и везде ссылаться на id строк из нее: жесть. а чем вас отпугнул gettext. Может вы что то не до поняли. для Вас как разработчика уже не важно сколько языков будет выпишите на одном языке. Код: php 1. 2. 3. 4. 5. Все готово. Теперь находите редактор к примеру Poedit, указываете ваш проект он парсит его вытягивает оттуда Этот текст нужно перевести предлагает вам его перевести сохраняем и кидаем в папку к примеру locale/sw/LC_MESSAGES/ ну это конечно же если перевод был на Суахили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:22 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
авторА на продакшене уже базка 1гб весит, и альтер заблочит ее на пол часа, когда будет пытаться пропихнуть дополнитульную колонку. Ну не принято добавлять данные через алтеры, все делают это через класический инсертВот это аргументированно, очень полезная информация, приму к сведению! А стоит ли вводить language_idlanguage1ru2en Может в качестве id языка использовать ISO-код ru, en (можно забить в enum). Коды известны, занимают два символа, языков больше 10 точно не будет, зато не нужно лишних джойнов. авторprint(_("Этот текст нужно перевести")) У меня такого никогда не будет, т.к. все тексты в базе. В ПХП только технические сообщения об ошибках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2013, 01:59 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
На счет хранения переводов в виде id, lang_id, text вместо id, text_ru, text_en, ... Как в первом случае ссылаться на таблицу с переводами? Т.е., если у на с есть таблица articles id, text_id Что писать в text_id? Ведь во втором случае айдишников в таблице переводов будет несколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2013, 14:21 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
*во первом случае айдишников в таблице переводов будет несколько ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2013, 14:22 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
я бы сделал так: к примеру у вас запись: Код: php 1. 2. 3. а в шаблоне: Код: php 1. где делалось что то примерно следующее (вариант без кеша, тут только логика. А по идеи все надо вначале извлечь а потом уже применять, а то на 1 страницу 100 селектов будет) Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2013, 17:58 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Ага, в некоторых движках вместо unicid md5 применяют. Что, ИМХО муторно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2013, 20:55 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Чушь то, что вы сравниваете uniqueid с md5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2013, 21:50 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
я бы сделал так: 1. заюзал бы http://php.net/manual/en/function.serialize.php http://www.php.net/manual/en/function.unserialize.php 2. в бд сделал бы табличку Код: php 1. 3. в PHP использовал бы массив (де\сериализовал бы его в таблицу БД) Код: php 1. 2. 3. 4. 5. 6. 7. 8. 4. в шаблон выводил бы Код: php 1. ПыСы - если бы контента на одной странице было бы очень много и большое кол-во используемых языков, тогда бы заморочился на создание отдельных таблиц под разные языки... Код: php 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2013, 14:18 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
как то так..., статейка под 100кб, всего 10 языков поддерживает сайт, итого массив занимает 1мб. 1. Чтобы десериализовать 1мб строку уйдет время и ресурсы. 2. Чтобы показать юзеру страничку на русском языке, ваш скрипт будет вытаскивать все абсолютно переводы данной строки, и мало того будет тратить ресурсы (см пункт 1) на их отработку. 3. Неудобно работать с переводами как с сущностями. К примеру попросят вас в админке сделать страничку со списком тех статей у которых нет перевода одного из языков. В случае одна запись, один перевод можно реализовать всего 1 запросом, а в вашем слцчае придеться выдернуть !!все!! записи из таблички (1000 статей допустим), каждую десериализовать и потом уже смотреть. (в случае со 100кб, вы пропарсите 100мб текста, вам оно надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2013, 14:30 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
как то так... ПыСы - если бы контента на одной странице было бы очень много и большое кол-во используемых языков, тогда бы заморочился на создание отдельных таблиц под разные языки... То что в табличке будет сотни мегабайт данных не есть проблема. У большинства крупных сайтов существуют таблички в десятки гигабайт (все это без шардинга!!!), и все с паврильно настроеной репликации и ключей работает вполне нормально. Ну и зпросики не криво главное писать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2013, 14:34 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
авторвам оно надо? golden hammer - в данном случае (впрочем, как и всегда) не существует по определению! ;) читаю... авторНе будет 10 языков точно. Будет 3. Возможно, потом еще 1, 2... авторДа, еще замечу, что в моем случае точно не будет проектов с кучей языков, падежами и проч. А в переводе будет нуждаться в основном интерфейс и несколько информационных статей . проверено опытом - мой подход выдержит его желание на все 100%!!! + 13942833 читай (ПыСы) - этот подход, при необходимости, можно крутить и укладывать в разные строки, разные таблицы, и даже разные БД - это не принципиально - важно сохранить структуру выводимого на страницу (в шаблон) массива - вот и всё!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2013, 14:48 |
|
||
|
Многоязычность на сайте. Как реализовать и нужно ли париться?
|
|||
|---|---|---|---|
|
#18+
Меня поражают люди, которые даже свои труселя в базе хранят... Что, простыми js файлами хранить - не? А при генерации просто или lang подставлять в линки или вообще на стороне клиента это делать (можно и сервера через X-Accel-Redirect) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2013, 17:42 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38136954&tid=1464099]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 456ms |

| 0 / 0 |
