Языки для портала

Тема в разделе "PHP", создана пользователем solarb, 23 фев 2012.

Модераторы: latteo
  1. solarb

    solarb Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    64
    Симпатии:
    15
    Здраствуйте!
    Я хотел спросить как самое оптимальное решение перевести сайта. Мне нравится метод с array-ом в езиковом файле. Но в моем портале есть формы с селектом которые тоже надо перевести.

    Примеры: Страны, Титла(mr,mrs,doctor) и далее.

    Я думал над mysql решением но языки тоже будут добавляться и добавление column языка во все таблицы звучит неоптимизировано.

    Помогите пожалуйста форумчане :)
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    115
    Симпатии:
    487
    Это не то, что не оптимизировано. Это вообще тихий ужас. В большинстве движков сайтов для хранения фраз разных языков обычно используются таблици следующей структуры:
    phrase_id (varchar) - идентификатор фразы;
    language_id (unsigned integer) - идентификатор языка;
    phrase (varchar/mediumtext/etc) - текст фразы.

    Теперь, по принципу работы.
    Допустим, у Вас есть некая фраза "Hello, World!". Соответственно, первая запись для этой фразы в БД будет иметь вид, например:
    phrase_id: hello_world - (идентификатор фразы);
    language_id: 0 - (ноль - обычно номер дефолтного языка, например английского);
    phrase: Hello, World! (собственно, текст фразы).

    И вот, Вы созрели наконец добавить в свой сайт русский язык. Для этого необходимо в туже самую таблицу добавить еще одну запись для всех фраз аналогично этой:
    phrase_id: hello_world - (идентификатор фразы не меняется);
    language_id: 1 - (в нашем примере 1 соответствует русской языковой локализации);
    phrase: Привет, мир! (текст фразы уже на русском языке).

    Большинство CMS работают так, что если они не находят, например, фразу в русском варианте, то в таком случае будет применена из этой же таблицы фраза, которой соответствует номер языка "0"(ноль, дефолт). Это удобно, когда количество фраз переваливает за 3-4 тысячи и становится трудно все контролировать.

    Еще есть один способ, который использовался в вордспрессе. А именно, замена фраз специальной функцией PHP:
    PHP:
    string function _(string $phrase) {}
    Этот способ хранит все фразы в специальных файлах с расширением *.mo или *.po. Он дает довольно высокую производительность, но крайне неудобен для редактирования и сохранения фраз.
     
    solarb нравится это.
  3. solarb

    solarb Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    64
    Симпатии:
    15
    Спасибо за быстрый ответ!
    Етот метод вправде хорош. А есть ли метод похожий на етого , но менее зависимый mysql?(мой mysql постоянно зависает)
    Чтобы бы я мог редактировать этот language файл (array-ский) из админки(который я сам пишу но нет идеи как сделать ето)?

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

    Извините за плохой руский.
     
  4. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    115
    Симпатии:
    487
    Как вариант - использовать опять же таки хранение фраз в файле, в виде сериализированных массивов. Для сериализации массивов(представления массива в виде текстовой строки) можно использовать функции PHP serialize/unserialize или кодировать их в json формате функциями json_encode/json_decode. Написать класс, который бы подгружал фразы из файла и выдавал, по указанным идентификатору фразы и языка нужный текст - не составляет проблемы. Но, должен заметить, что такой способ не является самым оптимальным в плане производительности. Особенно, когда фраз много(больше тысячи). Каждый раз компилятор PHP будет выгружать эти фразы в память(а она не резиновая), что создает дополнительные нагрузки. С другой стороны, этот вопрос можно легко решить, если есть возможность выделить под процессы PHP больше оперативной памяти. Скажем, 2-4Мб только под работу с фразами - хватит с головой. В любом случае, как не крути, лучше использовать MySQL. Все таки, работа с БД дает более широкие возможности в плане сортировки и обработки данных.
     
    solarb нравится это.
  5. uNknownMark

    uNknownMark

    Регистр.:
    22 сен 2007
    Сообщения:
    393
    Симпатии:
    169
    С одной стороны вроде да, как вы писали:

    но с другой стороны не разу пока не видел что бы не хватило мощности обычных языковых файлов.
    Участвовал в разработке нескольких сайтов самописных достаточно нагруженных.
    У нас была такая схема:
    есть папка i18n в которой лежат папки по языкам, например ru, en.
    В каждой папке лежат файлы, разбитые по группам, например users.php, news.php и т.п.
    В файле массив типа
    $config = array (
    'category' => array (
    'title' => 'Название',
    'title_empty' => 'Пустое название',
    'order' => 'Сортировка'
    ),

    Притом поддерживается не ограниченная вложенность. Для получения используется самописный класс, выглядит типа <?=Lang::get('pages::title')?>
    Работает быстро и шустро. При этом если не найдена нужная фраза, можно настроить что будет, то ли ошибка, то ли вернется ключ.
    Никаких сериализаций что бы дополнительно не тратить время.
    И файлы как всегда работают быстрее чем БД.
     
  6. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    115
    Симпатии:
    487
    Все бы хорошо, но Вы упускаете из вида один существенный момент. Автор ведет речь не только о чтении фраз из файлов, но и о возможности править эти файлы из админки. Соответственно, сохранять фразы в структурированных классах - возможности нет(в принципе, есть, но это сложно и не уместно).


    Начиная с 4-ой версии MySQL, в большинстве случаев, работа с БД дает большую производительность, чем работа с файлами. Проверено самолично.
     
  7. uNknownMark

    uNknownMark

    Регистр.:
    22 сен 2007
    Сообщения:
    393
    Симпатии:
    169
    Редактирование это да, придется костыль делать, но опять же ИМХО не столько сложный
    Насчет скорости может ошибаюсь но файлы при небольшом количестве строк быстрее.
    Например, вот http://www.24ok.ru/index.php?page=benchmark_mysql_vs_files_speed_comparision___sravnenie_skorosti
    ИМХО, итог такой:
    1) Удобство редактирования: Mysql
    2) Простота: файлы
    Скорость спорный момент, но скорее всего за файлами. Тем более в сравнении, идет выборка 20 строк (а не всех, которые допустим, нужны для данной локализации) из БД поэтому файл получается медленнее.
     
  8. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    115
    Симпатии:
    487
    Нет, и тут преимущество за БД. Особенно, при больших объемах информации. Все дело в том, что MySQL не нуждается в компилировании большинства запросов. А данные читаются напрямую из файлов. В то время, как PHP сначала компилирует текст кода, включая вышеупомянутые фразы из файлов, и только после этого приступает к обработке. Кроме того, стоит учесть и тот факт, что в PHP нет жесткой привязки к типам данных. Очень много(относительно) времени теряется при переносе текстовых данных, формировании текстовых буферов и т.д..