Настройка перезаписи интернационализации (i18n)

Используйте правила интернационализации (i18n rewrites), чтобы предоставлять разный контент в зависимости от страны или предпочтительного языка пользователя. Вот несколько примеров настроек, которые вы можете установить:

  • Предоставлять всем пользователям, предпочитающим французский язык (независимо от страны), одинаковый контент на французском языке.
    Пример: главная страница с текстом на французском языке.

  • Пользователям, предпочитающим французский язык, следует показывать контент на стандартном французском языке, а канадским пользователям, предпочитающим французский язык, — контент на канадском французском языке.
    Пример: главная страница со стандартным французским языком и главная страница с канадским французским языком.

  • Предоставлять всем канадским пользователям один и тот же контент (независимо от предпочтений в языке).
    Пример: главная страница с «языком по умолчанию» вашего сайта, но с особенностями, характерными для Канады (например, с праздничной тематикой).

  • Предоставлять канадским пользователям, предпочитающим французский язык, контент на французском языке.
    Пример: главная страница с фразами на канадском французском языке и функцией, специфичной для Канады (например, тематикой праздника).

Firebase Hosting определяет страну пользователя по его IP-адресу, а языковые предпочтения — по заголовку запроса Accept-Language (обычно устанавливаемому автоматически веб-браузером ).

Настройка переадресации i18n

Для настройки переадресации i18n для вашего сайта Hosting необходимо создать каталог "i18n content" для всего локализованного контента, а затем добавить атрибут i18n в файл firebase.json , указывающий на новый каталог "i18n content".

Вот подробная последовательность действий:

  1. В папке public вашего локального приложения создайте отдельную директорию для «i18n-контента», а затем создайте подпапки для каждой комбинации языка и страны, поддерживаемой вашим сайтом.

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

    Вот пример каталога "i18n content" под названием localized-files :

    public/
        index.html  // your site's default homepage
        404.html  // your site's custom 404 page
    
        localized-files/
            ALL_ca/
                index.html
            es_ALL/
                index.html
                404.html
            fr/
                index.html
                404.html
            fr_ca/
                index.html

    В каталоге localized-files/ находятся отдельные подпапки для каждой комбинации языка и страны, поддерживаемой вашим сайтом. Шаблон именования каждой подпапки должен соответствовать одному из следующих форматов:

    • languageCode_countryCode : Содержит контент, специфичный для пользователей, предпочитающих этот язык и имеющих этот код страны.

    • languageCode : Содержит контент, специфичный для пользователей, предпочитающих этот язык, но не привязанный к конкретной стране; по сути, эквивалентно languageCode_ALL

    Более подробную информацию об этих кодах см. в подразделе «Коды стран и языков» ниже. Вы можете использовать значение ALL (с ​​учетом регистра) для обозначения любой страны (например, es_ALL/ ) или любого языка (например, ALL_ca/ ).

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

  2. Добавьте атрибут i18n в файл firebase.json и укажите каталог, содержащий ваш "контент i18n". Продолжаем наш пример:

    // firebase.json
    
    "hosting": {
    
      "public": "public",
    
      "ignore": [
        "firebase.json",
        "**/.*",
        "**/node_modules/**"
      ],
    
      "i18n": {
        "root": "/localized-files"  // directory that contains your "i18n content"
      }
    
      ...
    }

    В качестве root каталога необходимо указать имя каталога, содержащего все ваши подпапки "i18n content". Если вы разместили все ваши подпапки "i18n content" в корневом каталоге вашего public каталога, используйте / в качестве значения для root . Начальные и конечные косые черты в значении root необязательны.

  3. Разверните свой "i18n-контент" и конфигурацию на своем Hosting .

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

Коды стран и языков

При именовании подпапок "i18n content" необходимо использовать строчные буквы как для кодов стран, так и для кодов языков. Значение ALL (с ​​учетом регистра) можно использовать для обозначения любой страны (например, es_ALL/ ) или любого языка (например, ALL_ca/ ).

Hosting получает код страны из IP-адреса пользователя. Коды стран представляют собой двухбуквенные коды ISO 3166-1 alpha-2 .

Языковые коды получаются из заголовка запроса Accept-Language пользователя (обычно устанавливается автоматически веб-браузером ). Это коды ISO 639-1 . При использовании языковых кодов следует учитывать следующее:

  • Когда Hosting ищет, какой «i18n-контент» следует предоставлять, он упорядочивает языки на основе значений качества в заголовке Accept-Language .

  • Hosting удаляет все региональные и национальные субтеги из заголовка Accept-Language , поэтому код языка в имени подпапки "i18n content" не может содержать эти субтеги. Например, вы не можете использовать es-419 или es-US в качестве кода языка в имени подпапки, но можете использовать es .

    Если вы хотите предоставлять контент определенного региона или страны, вы можете создать подпапки, содержащие контент на конкретном языке и для конкретной страны, который вы хотите поддерживать.

Приоритетный порядок для "контента i18n"

Если вы настроите правила интернационализации (i18n rewrites), Hosting будет предоставлять контент в следующем порядке приоритета:

  1. Зарезервированные пространства имен, начинающиеся с сегмента пути /__/*

  2. Настроенные перенаправления

  3. Точное совпадение статического контента

    1. Код языка + код страны (например, контент из fr_ca/ )
      Порядок определяется значениями качества для каждого языка, указанными в заголовке Accept-Language запроса.

    2. Только код страны (например, контент из ALL_ca/ )

    3. Только коды языков (например, контент из fr/ или es_ALL/ )
      Порядок определяется значениями качества для каждого языка, указанными в заголовке Accept-Language запроса.

    4. «По умолчанию» — точное совпадение статического контента
      Это контент, находящийся за пределами каталога "i18n content", например, в корневом каталоге public .

  4. Настроенные правила перезаписи

  5. Обработка 404

    1. i18n 404 страницы
      Это соответствует тому же порядку приоритетов, что и для статического контента, точно соответствующего запросу.

    2. Пользовательская страница 404

    3. Страница ошибки 404 по умолчанию (предоставляется Firebase)

Пример порядка приоритета

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

  • Пример локального каталога проекта с каталогом "i18n content" (называемым localized-files ).

    public/
        index.html  // your site's default homepage
        404.html  // your site's custom 404 page
    
        localized-files/
            ALL_ca/
                index.html
            es_ALL/
                index.html
                404.html
            fr/
                index.html
                404.html
            fr_ca/
                index.html
  • Пример информации для запроса

    • Языковые коды: fr , en (французский, затем английский)
      Коды языков упорядочены в соответствии со значениями качества, указанными в заголовке Accept-Language .

    • Код страны: ca (Канада)

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

  1. public/localized-files/fr_ca/

  2. public/localized-files/en_ca/

  3. public/localized-files/ALL_ca/

  4. public/localized-files/fr_ALL/

  5. public/localized-files/fr/

  6. public/localized-files/en_ALL/

  7. public/localized-files/en/

  8. public/

  9. Обработка 404

Какая страница будет показана пользователю?

  • Запрошенная страница: index.html

  • Запрошенная страница: awesome-page.html

Обратите внимание на следующее относительно поиска и обслуживания каталога "i18n content":

  • В каталоге localized-files/ на самом деле нет подпапок en_ca/ , en_ALL/ или en/ , поэтому Hosting просто будет пропускать подпапки в списке приоритетов, пока не найдет соответствующую подпапку для комбинации языка и страны запроса.

  • Несмотря на то, что в каталоге localized-files/ есть подпапка es_ALL/ , в приведенном выше примере запроса отсутствует код языка es или es-foo , поэтому Hosting не будет искать "контент интернационализации", соответствующий es .

  • Подпапки с именами fr/ и fr_ALL/ эквивалентны с точки зрения страны и языковых предпочтений пользователя. Однако, если обе подпапки существуют, Hosting будет предоставлять контент fr_ALL/ раньше, чем контент fr/ .

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

Вот несколько способов использования переопределения cookie:

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

  • Предоставьте пользователям возможность изменять отображаемый контент. Например, вы можете реализовать выбор языка, а затем соответствующим образом установить cookie-файл firebase-language-override для пользователя.

Чтобы настроить переопределение cookie-файлов, установите cookie-файлы с обоими или одним из следующих имен: firebase-country-override и firebase-language-override . Например, следующий фрагмент кода JavaScript переопределяет код страны на ca и заголовок Accept-Language на fr,en :

document.cookie = "firebase-country-override=ca";
document.cookie = "firebase-language-override=fr,en";

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

Изменения, внесенные с помощью cookie-файлов, не отражаются в логах.