Ответ 1
Короткий ответ: нет короткого ответа, так как есть много переменных для рассмотрения и много работы. Так что...
Длинный ответ: Я собираюсь сломать его так же хорошо, как я могу, но нет ответа "хорошо для всех" на такой широкий вопрос, как ваш.
Во-первых, переменные задачи под рукой:
-
Список языков: будет ли ваш сайт находиться в предопределенном наборе языков или он будет разнообразным/неоднородным? Например, сайт может быть полностью двуязычным на двух хорошо определенных языках (или, например, я запускаю английский/каталонский/испанский сайт); или различные разделы могут быть доступны на разных языках (например, посмотрите на сайты MS: они в основном однородны, но такие вещи, как блоги, статьи KB и некоторые документы, доступны только в подмножестве предположительно поддерживаемых языков).
-
Источник перевода: контент, предоставляемый вами на любом соответствующем языке вами или каким-либо сотрудником? Или некоторые версии запускаются через программное обеспечение для перевода с одного базового языка? Первый подход требует много дополнительной работы для создания содержимого, но дает более качественные результаты, чем второй.
-
Языки сами: как только у вас есть 1) и 2), вы должны знать, с какими языками вы работаете. Обратите внимание, что в случае, когда вы включаете диалекты (например, английский английский + английский английский или испанский испанский испанский или испанский испанский), вы можете столкнуться с некоторыми проблемами с "дублирующимся контентом" в поисковых системах, но подробности об этом слишком не по теме (просто упомянув, чтобы вы знали о потенциальных проблемах).
-
Вы ориентируетесь на языки в абстрактном (например, мой сайт предлагает три языка, не заботясь о том, где находится посетитель: что у меня есть, поэтому выбирайте то, что вы предпочитаете); или, скорее, для разных регионов/стран? В более позднем случае все может стать более сложным, так как вам может понадобиться заботиться о других вещах, кроме языков (например, часовых поясах, валютах или соглашениях формата даты и времени, чтобы назвать их), но вы получаете возможность использовать специфические для конкретной страны TLD.
После того, как вы правильно определили, пусть начнет работать. Это наиболее важные задачи, которые вам нужно выполнить:
-
Определение языка: наиболее разумным является использование параметра GET (что-то вроде? lang = en-us по URL-адресу). Кроме того, вы можете использовать некоторую геолокацию файлов cookie и/или IP для возврата, когда запрашивается URL-адрес без аргумента языка. Кроме того, если у вас есть средства, рассмотрите тему благоустройства URL (что выглядит лучше:
example.com/index.php?lang=en-us
илиexample.com/en-us/home
?). Лично мне нравится модная версия ModRewrite для моего файла .htaccess, но это будет работать только на серверах на базе Apache. -
Управление контентом: независимо от того, извлекаете ли вы контент из БД (например, содержимое статьи), включайте файлы (типичные для панировочных сухарей, меню, заголовки сайта и т.д.) или любые другие средства, вам понадобятся каким-либо образом отделить каждую версию (язык) контента. Вот несколько примеров того, как это можно сделать:
- Для содержимого базы данных, я рекомендую вам придумать шаблон для именования твердых полей и придерживаться его. Например, я добавляю
_en
,_es
или_ca
ко всем языковым полям моей БД. Таким образом, я могу получить доступ к правильному контенту с помощью выражений типа$row["title_$lang"]
. - Для включенных файлов снова используется соглашение об именах файлов. В моем случае у меня есть имена файлов, заканчивающиеся на
.en.php
,.ca.htm
и т.д. Мои включенные вызовы выглядят какinclude("some-filename.$lang.php)
. - Время от времени вы будете выплевывать небольшие фрагменты текста непосредственно из вашего PHP-кода (например, при маркировке заголовков таблицы). Вы можете использовать файл include для каждого языка, определяющий массив "кусков" с теми же ключами, или таблицу DB, например, предложенную Гертом. Первый подход требует меньше усилий для разработки, последний должен меньше работать для поддержания (особенно если вы не работаете в одиночку).
- Для содержимого базы данных, я рекомендую вам придумать шаблон для именования твердых полей и придерживаться его. Например, я добавляю
-
Выбор языка: очень важно, вы должны предоставить своим пользователям возможность выбрать свой собственный язык, кроме того, чтобы настраивать аргументы GET на самом URL-адресе. Для нескольких языков "флаги" часто отлично работают, поскольку их можно понять, даже если страница первоначально отступила на язык, который пользователь вообще не знает. Для большего количества языков выпадающее меню кажется более эффективным (с точки зрения пространства просмотра), но вы должны обязательно добавить некоторые визуальные (то есть: нетекстовые) подсказки. Некоторые сайты заставляют вас выбирать язык при входе и иметь только ссылки на домашнюю страницу на каждом языке. Лично у меня есть три моих флага, стоящих поверх меню моего сайта, каждый из которых указывает на текущий адрес с измененным только аргументом языка. Такой код может работать довольно хорошо:
function translatedURI($new_lang) {
return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
}
- Настройка CMS: если ваш сайт (или его часть) использует какой-то CMS, дискуссионный форум и т.д., все может стать довольно запутанным. Говоря по собственному опыту, у меня есть форум phpBB на моем сайте, разделенный на три основные категории (по одному на язык), таким образом, что они выглядят как три независимых форума (но пользователям просто нужно войти/зарегистрироваться на одном из них получить доступ ко всем языкам, так как они действительно являются категориями одной и той же платы). Тонкости, которые я должен был сделать для этого, плавно угрожали последним остаткам здравомыслия, которые я все еще сохраняю: S. В этих случаях я советую искать документы и функции поддержки конкретного программного обеспечения, которое вы используете.
Хорошо, что все, что я могу сейчас вынести. Я думаю, вам должно быть достаточно, чтобы поднять рукава и приступить к работе. Затем, если вы нажмете какую-нибудь стену на своем пути, вернитесь с конкретными вопросами, и я уверен, что вы получите более конкретные ответы.
Надеюсь, что это поможет.