Intereting Posts

Как сделать многоязычный веб-сайт

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

Может ли кто-нибудь предоставить мне пошаговое руководство? Если возможно, сделайте демонстрацию для многоязычного веб-сайта. Или, пожалуйста, напишите мне по любой ссылке, где объясняются подробности об этом.

Короткий ответ: короткого ответа нет, так как есть много переменных, которые нужно учитывать, и много работы. Так…

Длинный ответ: я собираюсь сломать его так же хорошо, как я могу, но нет ответа «хорошо для всех» на такой широкий вопрос, как ваш.

Во-первых, переменные задачи:

  1. Список языков: будет ли ваш сайт находиться в предопределенном наборе языков или он будет разнообразным / неоднородным? Например, сайт может быть полностью двуязычным на двух хорошо определенных языках (или, например, я запускаю английский / каталонский / испанский сайт); или различные разделы могут быть доступны на разных языках (например, посмотрите на сайты MS: они в основном однородны, но такие вещи, как блоги, статьи в КБ и некоторые документы, доступны только в подмножестве предположительно поддерживаемых языков).

  2. Источник перевода: есть ли контент, предоставленный вами на любом соответствующем языке вами или каким-либо сотрудником? Или некоторые версии запускаются через программное обеспечение для перевода с одного базового языка? Первый подход требует много дополнительной работы для создания содержимого, но дает более качественные результаты, чем второй.

  3. Сами языки: как только у вас есть 1) и 2), вы должны знать, с какими языками вы работаете. Обратите внимание, что в случае, когда вы включаете диалекты (например, английский английский + английский английский или испанский испанский испанский или испанский испанский), вы можете столкнуться с некоторыми проблемами с «дублирующимся контентом» в поисковых системах, но подробности об этом слишком не по теме (просто упомянув, чтобы вы знали о потенциальных проблемах).

  4. Вы ориентируетесь на языки в абстрактном (например, мой сайт предлагает три языка, не заботясь о том, где находится посетитель: это то, что у меня есть, поэтому выбирайте то, что вы предпочитаете); или, скорее, для разных регионов / стран? В более позднем случае все может стать более сложным, так как вам может понадобиться заботиться о других вещах, кроме языков (например, часовых поясах, валютах или соглашениях формата даты и времени, чтобы назвать их), но вы получаете возможность использовать специфические для конкретной страны ДВУ.

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

  1. Определение языка: наиболее разумным является использование параметра GET (что-то вроде? Lang = en-us по URL-адресу). Кроме того, вы можете использовать некоторую геолокацию файлов cookie и / или IP для возврата, когда запрашивается URL-адрес без аргумента языка. Кроме того, если у вас есть средства, рассмотрите тему улучшения URL-адресов (что выглядит лучше: example.com/index.php?lang=en-us или example.com/en-us/home ?). Лично мне нравится модная версия ModRewrite для моего файла .htaccess, но это будет работать только на серверах на базе Apache.

  2. Управление контентом: независимо от того, извлекаете ли вы контент из БД (например, содержимое статьи), включаете файлы (типичные для панировочных сухарей, меню, заголовки сайта и т. Д.) Или любые другие средства, вам потребуется какой-то способ разделить каждую версию (языка) контента. Вот несколько примеров того, как это можно сделать:

    • Для содержимого БД, мой лучший совет – придумать какой-нибудь шаблон для определения именования полей и придерживаться его. Например, я добавляю _en , _es или _ca ко всем языковым полям моей БД. Таким образом, я могу получить доступ к правильному контенту с помощью выражений типа $row["title_$lang"] .
    • Для включенных файлов опять же соглашение об именах файлов является самым надежным подходом. В моем случае у меня есть имена файлов, заканчивающиеся на .en.php , .ca.htm и т. Д. Мои .ca.htm вызовы тогда выглядят как include("some-filename.$lang.php) .
    • Время от времени вы будете выплевывать небольшие фрагменты текста непосредственно из вашего PHP-кода (например, при маркировке заголовков таблицы). Вы можете использовать файл include для каждого языка, определяющий массив «кусков» с теми же ключами, или таблицу DB, например, предложенную Гертом. Первый подход требует меньше усилий для разработки, последний должен меньше работать для поддержания (особенно если вы не работаете в одиночку).
  3. Выбор языка: достаточно важно, вы должны предоставить своим пользователям возможность выбрать свой собственный язык, кроме того, чтобы настраивать аргументы GET для самого URL. Для нескольких языков «флаги» часто отлично работают, поскольку их можно понять, даже если страница первоначально отступила на язык, который пользователь вообще не знает. Для большего количества языков выпадающее меню кажется более эффективным (с точки зрения пространства просмотра), но вы должны обязательно добавить некоторые визуальные (то есть: нетекстовые) подсказки. Некоторые сайты заставляют вас выбирать язык при входе и иметь только ссылки на домашнюю страницу на каждом языке. Лично у меня есть три моих флага, стоящих поверх меню моего сайта, каждый из которых указывает на текущий адрес с изменением только аргумента языка. Такой код может работать довольно хорошо:


 function translatedURI($new_lang) { return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; } 

  1. Настройка CMS: если ваш сайт (или его часть) использует какой-то CMS, дискуссионный совет и т. Д., Все может стать довольно грязным. Говоря по собственному опыту, у меня есть форум phpBB на моем сайте, разделенный на три основные категории (по одному на язык), таким образом, что они выглядят как три независимых форума (но пользователям просто нужно войти / зарегистрироваться на одном из них получить доступ ко всем языкам, так как они действительно являются категориями одной и той же платы). Тонкости, которые я должен был сделать для этого, плавно угрожали последним остаткам здравомыслия, которые я все еще сохраняю: S. В этих случаях я советую искать документы и функции поддержки конкретного программного обеспечения, которое вы используете.

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

Надеюсь это поможет.

Взгляните на эти вопросы:

  • Как бы вы преобразовали существующий веб-приложение в многоязычный
  • Вопросы проектирования для интернационализации

И взгляните на класс Zend_Translate из Zend Framework.

Решение, которое я всегда использую, заключается в создании таблицы базы данных со всеми возможными сообщениями. Для каждого сообщения я использую код (аббревиатуру), чтобы найти его. Так, например:

 lang id message en login Login en lostpass Lost your password? de login Anmelden de lostpass Paswort vergessen? nl login Aanmelden nl lostpass Wachtwoord vergeten? 

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

Вы можете использовать простой язык PHP Multi Language Class – LangQuery

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

 include("LangQuery.php"); $L=new LangQuery(); // Write Hello World echo($L('hello_world')); // Write Hello World Easier - In-line Echo Feature // You don't have to write echo. Just add '>' $L('>hello_world'); // Use in Strings echo("Hello Universe. {$L('hello_world')} Hello Europe"); // Write my age with parameter $L(">my_age",25); // Write my name and age with parameters $L(">my_name_age","Recep",25); в include("LangQuery.php"); $L=new LangQuery(); // Write Hello World echo($L('hello_world')); // Write Hello World Easier - In-line Echo Feature // You don't have to write echo. Just add '>' $L('>hello_world'); // Use in Strings echo("Hello Universe. {$L('hello_world')} Hello Europe"); // Write my age with parameter $L(">my_age",25); // Write my name and age with parameters $L(">my_name_age","Recep",25); 

Я сейчас разрабатываю очень крошечную CMS, которая должна быть многоязычной.

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

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

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

И, наконец, я думаю, что в двух типах перевода:

  1. Веб-текст.
  2. Текст содержания.

Поэтому мой проект направлен на:

  • languajes Таблица с определенными языками.
  • переводы Единая таблица, которая будет иметь все сообщения, следующим образом:
    • [pk] table_name имя таблицы, содержимое которой будет переведено.
    • [pk] имя_поля имя поля, содержимое которого будет переведено.
    • [pk] row_id идентификатор строки для элемента, который будет переведен.
    • [pk] язык, на котором переведен текст.
    • текст переведенный текст.

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

Это увеличит сложность запросов sql, но это позволит мне разработать инструменты для легкого перевода переводов. Кроме того, сложность sql будет существовать только один раз, только при реализации решения. Если эта реализация должным образом разработана, обслуживание / расширяемость сайта не должно быть серьезной проблемой.

Изменить :

После некоторого разговора с друзьями-разработчиками, я думаю, что решение, которое я предлагаю, слишком много на одной таблице.

Другой подход, который я буду изучать с этого момента, заключается в создании дополнительной таблицы для каждой «переводимой таблицы» следующим образом:

  • any_translatable_table: таблица, которая должна переводить любые ее поля
  • any_translatable_table_translations: таблица, в которой будут сохранены переводы.
    • [pk] имя_поля имя поля, содержимое которого будет переведено.
    • [pk] row_id идентификатор строки для элемента, который будет переведен.
    • [pk] язык, на котором переведен текст.
    • текст переведенный текст.

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

Добавочная таблица переводов на «переводимую таблицу» будет создана в то же время, что и исходная.

И о запросах sql сложность остается прежней: для первого подхода требуется имя таблицы для поиска в таблице переводов, а вторая просто добавляет суффикс «_translations» в имени таблицы.