Каков наилучший способ перевода системы перевода на веб-сайт php?

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

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

Должен ли я хранить данные и их перевод в таблице базы данных ((1, «Hello», «hallo»), (2, «Доброе утро», «Тег Guten») и т. Д.?

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

$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') . Если файл существует, загрузите контент, un-gzip и un-serialize, и он готов к работе.

пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

  `Text`

 переменная id
 1 привет
 2 bye 
  `text_translations`

 Перевод текста
 1 1 привет
 2 1 de hallo
 3 2 en bye
 4 2 de tschüss 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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