Как лучше всего разместить систему перевода на сайте php? - PullRequest
6 голосов
/ 26 февраля 2010

Я занимаюсь разработкой веб-сайта на PHP, и я хотел бы дать пользователю возможность легко переключаться с немецкого на английский.

Итак, политика перевода должна быть рассмотрена:

Должен ли я хранить данные и их перевод в таблице базы данных ((1, "Hello", "hallo"), (2, "Good morning", "Guten Tag") и т. Д.

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

Ответы [ 7 ]

10 голосов
/ 27 февраля 2010

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

1) Храните языковые строки и переводы в базе данных - это облегчит взаимодействие с / update / remove элементов и будет частью вашей обычной процедуры резервного копирования.

2) Кэшируйте языки в простые файлы на сервере и извлекайте их по мере необходимости для отображения на странице.

Преимуществ здесь много - в основном это быстро! Я не имею дело с издержками соединения для MySQL или какими-либо замедлениями трафика во время передачи. (особенно важно, если ваш сервер БД не является локальным).

Это также сделает его очень простым в использовании. Сохраните данные из вашей базы данных в файле в виде сериализованного массива php и скопируйте содержимое файла, чтобы уменьшить накладные расходы на хранилище (это также ускоряет мой сравнительный анализ).

Пример:

$lang = array(
    'hello' => 'Hallo',
    'good_morning' => 'Guten Tag',
    'logout_message' = > 'We are sorry to see you go, come again!'    
);

$storage_lang = gzcompress( serialize( $lang ) );

// WRITE THIS INTO A FILE SUCH AS 'my_page.de'

Когда пользователь загружает вашу систему в первый раз, выполните file_exists('/files/languages/my_page.de'). Если файл существует, загрузите содержимое, разархивируйте и удалите сериализацию, и он готов к работе.

Пример * * тысяча двадцать-один

$file_contents = get_contents( 'my_page.de' );
$lang = unserialize( gzuncompress( $file_contents ) );

Как вы можете видеть, вы можете сделать кэширование специфичным для каждой страницы в системе, уменьшая накладные расходы, и использовать расширение файла для обозначения языка ... (my_page.en, my_page.de, my_page.fr)

Если файл НЕ СУЩЕСТВУЕТ, тогда запросите БД, создайте свой массив, сериализовайте его, распакуйте и напишите отсутствующий файл - в то же время вы только что создали массив, который необходим странице, поэтому продолжайте отображать страница и все счастливы.

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

Предупреждения и ловушки

Когда я держал все в базе данных напрямую, мы сталкивались с некоторыми ОСНОВНЫМИ замедлениями, когда наш трафик увеличился.

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

Не GZIP-сжатие содержимого файлов кэша сделало языковую систему примерно на 20% медленнее в моих тестах.

Убедитесь, что для всех полей вашей базы данных, содержащих языки, установлено значение UTF8-general-ci (или хотя бы один из параметров UTF8, я считаю, что general-ci лучше всего подходит для моего использования). Если вы этого не сделаете, вы не сможете хранить наборы не-Unicode символов в вашей базе данных (например, китайский, японский и т. Д.)

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

id      string              page        global
1       hello               NULL          1
2       good_morning        my_page.php   0

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

6 голосов
/ 26 февраля 2010

Я бы также предложил Zend Framework Zend_Translate пакет.

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

Адаптеры для Zend_Translate

  • Массив
    • Использовать массивы PHP Маленькие страницы;
    • простейшее использование; только для программистов
  • Csv
    • Использовать разделенные запятыми ( .csv / .txt) файлы
    • Простой текстовый формат файла; быстро; возможные проблемы с символами Юникода
  • Gettext
    • Использовать двоичные файлы gettext (* .mo) стандарта GNU для Linux;
    • потокобезопасный; нужны инструменты для перевода
  • Ini
    • Использовать простые ini (* .ini) файлы
    • Простой текстовый формат файла; быстро; возможные проблемы с символами юникода
  • TBX
    • Использовать обмен терминологической базой ( .tbx / .xml) файлов
    • Промышленный стандарт для строк терминологии между приложениями; Формат XML
  • Тая
    • Использовать файлы tmx ( .tmx / .xml)
    • Отраслевой стандарт для межприкладного перевода; Формат XML; человек читаемый
  • Qt
    • Использовать файлы qt linguist (* .ts)
    • Кроссплатформенный каркас приложений; Формат XML; человек читаемый
  • XLIFF
    • Использовать файлы xliff ( .xliff / .xml)
    • Более простой формат как TMX, но связанный с ним; Формат XML; человек читаемый
  • XmlTm
    • Использовать файлы xmltm (* .xml)
    • Промышленный стандарт для памяти перевода документов XML; Формат XML; человек читаемый
5 голосов
/ 27 февраля 2010

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

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

Пример:

`text`

id  variable
1   hello
2   bye
`text_translations`

id  textId  language  translation
1   1       en        hello
2   1       de        hallo
3   2       en        bye
4   2       de        tschüss

Итак, что вы делаете:

  • создать переменную в первой таблице

  • добавить переводы для него во второй таблице (на любом языке, который вы хотите)

После того, как вы обновили переводы, создайте / обновите языковой файл для каждого языка, который вы используете:

  • выберите необходимые переменные и их перевод (совет: используйте английский, если перевода нет)

  • создать большой массив со всем этим, например ::

$texts = array('hello' => 'hallo', 'bye' => 'tschüss');
  • записать массив в файл, например ::101037
file_put_contents('de.php', serialize($texts));
  • в вашем PHP / HTML создайте массив из файла (в зависимости от выбранного языка пользователем), например ::
$texts = unserialize(file_get_contents('de.php'));
  • в вашем PHP / HTML используйте переменные, например ::1010 *
<h1><?php echo $texts['hello']; ?></h1>

or if you like/enabled PHP short tags:

<p><?=$texts['bye'];?></p>

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

4 голосов
/ 27 февраля 2010

Есть несколько факторов, которые вы должны учитывать.

Будет ли сайт обновляться часто? если да, то кем? ты или владелец? с какими данными / информацией вы имеете дело? а также ... вы делаете это часто (для многих клиентов)?

Я с трудом могу предположить, что использование реляционной базы данных может привести к серьезным последствиям для скорости, если у вас ОЧЕНЬ высокий трафик (несколько сотен тысяч просмотров страниц в день).

Если вы делаете это часто (для большого количества клиентов), не думайте больше: создайте CMS (или используйте существующую). Если вам действительно нужно учитывать влияние на скорость, вы можете настроить его так, чтобы, когда вы закончили работу с сайтом, вы могли экспортировать статические HTML-страницы, где это возможно.

При частом обновлении действует то же, что и выше. Если клиент должен обновить (а не вы), опять же, вам нужна CMS. Если вы имеете дело с большим количеством информации (большим и большим количеством статей), вам нужна CMS.

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

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

1 голос
/ 26 февраля 2010

Если вам нужен веб-интерфейс для добавления / редактирования переводов, тогда база данных - хорошая идея.

Если, однако, ваши переводы статические, я бы использовал gettext или даже обычный массив PHP.

В любом случае вы можете воспользоваться Zend_Translate.

Небольшое сравнение, первые два из учебника Zend:

  1. Простые массивы PHP : Маленькие страницы; простейшее использование; только для программистов.
  2. Gettext : стандарт GNU для Linux; потокобезопасный; нужны инструменты для перевода.
  3. База данных : Динамическая; Худшая производительность.
0 голосов
/ 13 октября 2015

Помните, что все люди в мире, имеющие дело с компьютером, обычно знают некоторый общий английский, используемый в компьютерах или в Интернете, такой как «О нас», «Домашняя страница», «Отправить», «Удалить», «Подробнее» и т. Д. Вопрос. Нужно ли переводить?

Хорошо, если честно, некоторые переводы этих слов на самом деле не о «обязательном», а о «стиле».

Теперь, если это действительно необходимо, для общих слов, которые не нужно менять вечно, лучше использовать php-файл, который выводит массив lang только для локального и английского языков. А для некоторого содержимого, такого как блог, новости и некоторые описания, используйте базу данных и сохраняйте столько, сколько требуется для языкового перевода. Вы должны сделать это вручную.

Пользуетесь и полагаетесь на Google Translate? Я думаю, что вы должны думать 1000 раз. По крайней мере, на это десятилетие.

0 голосов
/ 26 февраля 2010

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

...