Налаштування відображення мови за допомогою Apache MultiViews

Питання

Як я можу використовувати підхід MultiViews на веб сервері Apache для автоматичного обслуговування ресурсів тією мовою, до якої був надісланий HTTP запит?

Клієнтський додаток запитує документ із сервера, інформація про мовні уподобання користувача, як правило, передається на сервер через заголовок HTTP Accept-Language. Якщо сервер зберігає сторінки на більш ніж одній мові, то ця HTTP інформація може бути використана для отримання сторінки на тій мові, якій користувач віддає перевагу, якщо та мова доступна. Якщо на сервері є тільки одна версія сторінки, то вона і буде отримана.

Механізм вибору відповідної сторінки для повернення до користувача, оснований на Accept-Language інформації в HTTP запиті, і він називається узгодження мови.

У багатьох випадках клієнтський додаток має правильне початкове налаштування. Наприклад, якщо у вас є Японська версія браузера, то браузер зазвичай припускає, що ви віддаєте перевагу сторінкам на Японській мові, і відправляє цю інформацію на сервер. Основні браузери дозволяють змінювати ці мовні уподобання. Для отримання додаткової інформації дивіться Установка мовних уподобань в браузері.

В Apache є два різних підходи до узгодження ресурсу. Перший передбачає використання файлу типу map (наприклад, .var файл) який називає файли, які містять очікувані варіанти; другий припускає використання 'MultiViews' пошуку, де сервер робить неявне зіставлення імені файлу шаблона і вибирає з числа результатів. Опція MultiViews також може бути встановлена для кожної папки, якщо це дозволив адміністратор сервера.

У даній статті розглядається питання про те, як налаштувати документи на сервері Apache, використовуючи підхід MultiViews, так щоб працювало узгодження мови.

Відповідь

По-перше, зверніть увагу, що узгодження мови як може бути кращим способом для обслуговування вашого багатомовного контенту для ваших читачів, так може і не бути. В деяких випадках, наприклад, локалізовані сайти можуть найкраще підтримуватися шляхом збереження перекладених версій сторінки у папки із відповідними мовами або шляхом змішування вищезазначених двох підходів. Який підхід є більш доцільним, і в якій ситуації, буде розглядатися в наступній статті.

Налаштування узгодження мови включає в себе:

  1. розробку стратегії для позначення різних мовних версій файлу,
  2. планування резервної стратегії дій при запиті мов, які ви не підтримуєте, і
  3. встановлення відповідних серверних директив, щоб все працювало.

Існує кілька способів налаштувати узгодження мови на серверах Apache, і правильний підхід буде залежати від налаштувань більш високого рівня і від включених або відключених адміністратором сервера привілеїв. Можливо, вам доведеться звернутися до адміністратора сервера, щоб перевірити, який підхід доступний і які ви маєте привілеї.

Враховуючи декілька шляхів, за якими налаштування сервера може змінюватися, важко просто і остаточно описати, як налаштувати узгодження мови. Далі наведений опис типового підходу. Будемо вважати, що опція MultiViews включена (за замовчуванням) і , що користувач може змінити деякі директиви файлів .htaccess (невеликі текстові файли в структурі папки). Для того щоб підхід із .htaccess файлом працював, директива AllowOverride повинна бути правильно налаштована адміністратором сервера. Вам необхідно звернутися до адміністратора сервера, щоб дізнатися чи підходить для вас такий підхід.

Ми використовуватимо наступний приклад: документ під назвою example.html доступний на 3-х мовах: Англійській, Французькій та Німецькій, а за замовчуванням використовується Англійська мова. Незважаючи на те, що приклад обмежує себе .html файлами, узгодження мови може бути застосоване до інших типів файлів.

Найменування файлів

Кожна мовна версія вказується спеціальним розширення, яке може з'являтися до або після .html розширення. На практиці, є деякі міркування щодо розміщенням цього розширення, які потрібно мати на увазі.

Якщо ви поставите розширення мови в кінці, то .html розширення можуть бути включені або виключені при зверненні до файлу. Тим не менш, ця стратегія може зробити файли більш важкими для читання або редагування, якщо вони не знаходяться на сервері Apache (наприклад, читати з іншого сервера, компакт-диска або жорсткого диска). Це тому, що більшість редакторів і браузерів, щоб визначити який це тип файлу і як з ним поводитися просто дивляться на останнє розширення. Для нашого прикладу, Англійський, Французький і Німецький файли будуть названі, відповідно, таким чином:

Якщо в кінці ви поставите .html розширення, то ви полегшите читання і редагування файлів, якщо вони не знаходяться на сервері Apache, але для доступу до ресурсу на сервері Apache ім'я має завжди бути набране в адресному рядку браузера або зазначене у гіперпосиланні і т.д., без розширень (наприклад <a href="example">...</a>). В нашому прикладі, імена файлів будуть такі:

В дійсності наведені мовні помітки, можуть бути будь-якими, такої довжини, яку ви для них визначите на сервері (дивіться нижче). Сервер швидше за все, вже визначає 2-ох літерні розширення мови із глобальних налаштувань у його файлі httpd.conf. Ми рекомендуємо вам використовувати ISO коди мов та країн, так як зазначено в BCP 47, оскільки це забезпечує більшу послідовність і легке розпізнавання позначок мови.

Ви повинні бути обережні з деякими розширеннями. Наприклад, використання коду ISO .pl для Польської мови, буде плутати його з розширенням, яке зазвичай використовується для позначення Perl документів. Таким чином, якщо ви хочите, то для Польської мови ви можете використати наступне позначення pl-PL.

Зверніть увагу, що користувачі можуть звертатися до конкретного файлу, ввівши повне ім'я файлу, наприклад example.fr.html завантажуватиметься на Французькій мові, незалежно від мовних налаштувань користувача.

Директиви сервера

Ви зазвичай використовуєте директиву AddLanguage, щоб вказати, які розширення зазначені для певної мови контенту в вхідному HTTP.

Наприклад, наступна директива спрямовує HTTP запит контенту, що написаний Французькою мовою на розширення .fr:

AddLanguage fr .fr

Є декілька місць, де ви можете це вказати. Це, можливо, вже зазначено в глобальному масштабі за рахунок запису у файл сервера httpd.conf, або адміністратор сервера може його туди додати. Крім того, при завантаженні контенту користувачем він може вказуватися у файлі в ієрархії папок. Такий файл, як правило, називається .htaccess.

Файли за замовчуванням

Важливо вказати файл за замовчуванням, тому що користувач, який не має Англійської, Французької або Німецької мови у своєму списку бажаних мов (скажімо, наприклад, Іспанський користувач), або чий клієнтський додаток не підтримує узгодження контенту, бо в іншому випадку ви отримаєте не файл, а HTTP 406 результат (НЕ ПРИЙНЯТНИЙ).

Найкращий спосіб вказати файл за замовчуванням буде змінюватися, в залежності від вашого розширення мови - чи то воно передує, чи то воно слідує за .html розширенням, і від того яку версію Apache ви використовуєте. У наведених нижче прикладах будемо вважати, що за замовчуванням встановлена Англійська мова (ймовірно, найчастіше вона може бути найкращим вибором за замовчуванням, з урахуванням широкого розповсюдження Англійської мови).

Вказівка ​​файлів за замовчуванням на Apache 2.0.30 і вище

У версіях 2.0.30 і вище на сервері Apache використовуючи директиви ForceLanguagePriority та LanguagePriority ви досить чітко можете вказати файл за замовчуванням (для отримання детального описання роботи цих директив пройдіть по посиланням).

Для нашого прикладу, ми могли б встановити Англійську мову за замовчуванням, використовуючи наступні два рядки:

LanguagePriority en fr de
ForceLanguagePriority Fallback

Тепер, якщо Іспанські користувачі будуть просити Іспанський документ в контексті нашого прикладу, то замість Іспанського вони отримають Англійський документ. Тобто перший пункт із списку LanguagePriority.

Зазначення ​​файлів за замовчуванням на Apache від 1.3.4 до 2.0.29

Якщо версія вашого сервера попередня до 2.0.30, то вам доведеться зробити дуже багато роботи, щоб вказати файл за умовчанням, оскільки тут не доступна директива ForceLanguagePriority. Крім того, підхід буде залежати від того де стоїть розширення мови: до чи після .html розширення.

Спочатку давайте розглянемо випадок, коли розширення мови стоїть до .html розширення (тобто ресурси завжди повинні бути набрані в адресному рядку браузера або зазначені в гіперпосиланні і т.д., без .html розширення). Для установки Англійської мови за замовчуванням можна створити копію Англійського файлу в папці з наступним ім'ям:

example.html

Якщо ваше розширення мови знаходиться після .html (тобто .html розширення можуть бути включені або виключені при зверненні до файлу), тоді необхідно назвати свою копію Англійського файлу наступним чином:

example.html.html

Файл за замовчуванням має таке розширення .html.html тому що, якщо файл за замовчуванням був названий example.html і користувач запросив файл, як example.html, то узгодження контенту ніколи не відбудеться (бо не зможе знайти точної відповідності).

Доречі

Якщо у папці є тільки один файл із заданим ім'ям і не має розширення мови, то він буде обслуговуватися незалежно від мовних уподобань клієнта.

Ця техніка може бути застосована до інших типів файлів, крім HTML. Ми просто використовували HTML приклад тут, оскільки це загальна вимога.