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

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

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

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

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

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

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

    public/
        // matches requests that aren't specified by your "i18n content" subfolders
        // example: display your homepage in the "default" language for your site with no country-specific features
        index.html  // your site's default homepage
        404.html  // your site's custom 404 page
    
        localized-files/
    
            // matches requests from Canada with any language preference
            // example: display your homepage in the "default" language for your site with a Canada-specific feature
            ALL_ca/
                index.html
    
            // matches requests from any country with a language preference of `es` or `es-foo`
            // example: display your homepage in Spanish with no country-specific features
            es_ALL/
                index.html
                404.html  // your site's custom 404 page in Spanish
    
            // matches requests from any country with a language preference of `fr` or `fr-foo`
            // example: display your homepage in Standard French with no country-specific features
            fr/
                index.html
                404.html  // your site's custom 404 page in French
    
            // matches requests from Canada with a language preference of `fr` or `fr-foo`
            // example: display your homepage in Canadian French and/or with a Canada-specific feature
            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 альфа-2 .

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

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

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

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

    В этом примере запрос из Испании с языковым предпочтением es , es-es или даже es-419 получит контент из подпапки es_es/ поскольку Hosting обрабатывает все эти языковые коды как es .

    Запрос из США, Мексики или любой другой страны с языковым предпочтением es-419 получит содержимое из подпапки es_ALL/ поскольку Hosting рассматривает es-419 как es .

    public/
        // matches requests that aren't specified by your "i18n content" subfolders
        index.html  // the site's default homepage
    
        localized-files/
    
            // matches requests from Spain with a language preference of `es` or `es-foo`
            es_es/
                index.html
    
            // matches requests from any other country with a language preference of `es` or `es-foo`
            es_ALL/
                index.html

    В этом примере запрос из Мексики с языковым предпочтением es-419 получит содержимое из подпапки es_mx/ поскольку Hosting обрабатывает код языка es-419 как es .

    Однако запрос из США с языковым предпочтением es-419 получит содержимое из подпапки es_ALL/ поскольку Hosting обрабатывает es-419 как es и подпапки es_us/ нет.

    public/
        // matches requests that aren't specified by your "i18n content" subfolders
        index.html  // the site's default homepage
    
        localized-files/
    
            // matches requests from Argentina with a language preference of `es` or `es-foo` (mimics behavior of `es-ar` header tag)
            es_ar/
                index.html
    
            // matches requests from Spain with a language preference of `es` or `es-foo` (mimics behavior of `es-es` header tag)
            es_es/
                index.html
    
            // matches requests from Mexico with a language preference of `es` or `es-foo` (mimics behavior of `es-mx` header tag)
            es_mx/
                index.html
    
            // matches requests from any other country with a language preference of `es` or `es-foo` (mimics behavior of `es-419` header tag)
            es_ALL/
                index.html

Порядок приоритета для «контента i18n»

Если вы настроили перезапись i18n, 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

    index.html из подпапки fr_ca/

    Поскольку Hosting сначала ищет подпапку fr_ca/ , он найдет точное совпадение с index.html в этой подпапке.

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

    404.html из подпапки fr/

    Hosting сначала выполняет поиск по всему каталогу (включая все подпапки «i18n content» и корневой каталог) в порядке приоритета на предмет точного совпадения, но точного совпадения для awesome-page.html не существует.

    Итак, Hosting начнет обработку ошибки 404, которая соответствует тому же порядку приоритетов i18n, что и поиск с точным соответствием. Подпапка fr/ — это первая найденная подпапка, содержащая страницу 404.

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

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

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

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

Вы можете изменить отображаемый контент, используя файлы 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 не отражаются в журналах.