Используйте переписывание интернационализации («i18n-переписывание») для показа разного контента в зависимости от страны или предпочитаемого языка пользователя. Вот несколько примеров конфигураций, которые вы можете настроить:
Предоставлять одинаковый контент на французском языке всем пользователям, которые предпочитают французский язык (независимо от страны).
Пример: домашняя страница с текстом на французском языкеПредоставлять стандартный французский контент пользователям, которые предпочитают французский язык, а для канадских пользователей, которые предпочитают французский язык, предоставлять контент на канадском французском языке.
Пример: домашняя страница с использованием стандартного французского языка и домашняя страница с использованием канадского французского языкаПредоставлять одинаковый контент всем канадским пользователям (независимо от их языковых предпочтений).
Пример: домашняя страница с языком «по умолчанию» вашего сайта, но со специфичной для Канады функцией (например, тематикой праздников)Предоставляйте контент на канадском французском языке канадским пользователям, которые предпочитают французский язык.
Пример: домашняя страница с канадским вариантом французского языка и функциями, характерными для Канады (например, тема праздников)
Firebase Hosting определяет страну пользователя по его IP-адресу, а языковые настройки пользователя — по заголовку запроса Accept-Language
(обычно устанавливаются автоматически веб-браузером ).
Настройка i18n-переписывания
Чтобы настроить i18n-переписывание для вашего Hosting сайта, вам необходимо создать каталог «i18n content» для всего локализованного контента, а затем добавить атрибут i18n
в файл firebase.json
, чтобы указать на новый каталог «i18n content».
Вот подробные шаги:
В
public
папке локального каталога приложения создайте отдельный каталог для вашего «i18n-контента», а затем создайте подпапки для каждой комбинации языка и страны, поддерживаемой вашим сайтом.В каждую подпапку добавьте контент, относящийся к данной комбинации, например, домашние страницы на праздничную тематику или страницы 404 для определенного языка.
Вот пример каталога «i18n-контента» с названием
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
каталоге или других подпапках. Вы можете создавать контент, полностью соответствующий определённому языку и/или стране.Добавьте атрибут
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-контент». Если все подпапки «i18n-контент» находятся в корне каталогаpublic
, используйте/
в качестве значенияroot
. Начальные и конечные слеши в значенииroot
необязательны.Разместите свой «i18n-контент» и конфигурацию на сайте Hosting .
Вы можете протестировать свою настройку, используя переопределение файлов cookie .
Коды стран и языков
При наименовании подпапок «i18n-контент» необходимо использовать строчные буквы как для кодов страны, так и для кодов языка. Для обозначения любой страны (например, es_ALL/
) или любого языка (например, ALL_ca/
) можно использовать значение ALL
(с учётом регистра).
Hosting получает код страны из IP-адреса пользователя. Коды стран представляют собой двухбуквенные коды ISO 3166-1 alpha-2 .
Языковые коды берутся из заголовка запроса Accept-Language
пользователя (обычно автоматически устанавливаются веб-браузером ). Это коды ISO 639-1 . При использовании языковых кодов учитывайте следующее:
Когда Hosting ищет, какой «i18n-контент» обслуживать, он упорядочивает языки на основе значений качества в заголовке
Accept-Language
.Hosting удаляет все региональные и страновые подтеги в заголовке
Accept-Language
, поэтому языковой код в названии подпапки «i18n-контент» не может содержать эти подтеги. Например, нельзя использовать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 будет обслуживать контент в следующем порядке приоритета:
Зарезервированные пространства имен, начинающиеся с сегмента пути
/__/*
Настроенные перенаправления
Статический контент с точным соответствием
Код языка + Код страны (например, контент из
fr_ca/
)
Порядок соответствует значениям качества для каждого языка в заголовкеAccept-Language
запроса.Только код страны (например, контент из
ALL_ca/
)Только код языка (например, содержимое из
fr/
илиes_ALL/
)
Порядок соответствует значениям качества для каждого языка в заголовкеAccept-Language
запроса.Статический контент с точным соответствием «по умолчанию»
Это контент, который находится за пределами каталога «i18n-контент», например в корнеpublic
каталога.
Настроенные перезаписи
обработка 404
страницы i18n 404
При этом соблюдается тот же порядок приоритетов, который указан выше для точного соответствия статического контента.Страница 404 по умолчанию (предоставлена Firebase)
Пример приоритетного порядка
Продолжим наш пример. Мы используем тот же каталог и тот же запрос.
Пример локального каталога проекта с каталогом «i18n-контента» (называется
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 будет искать в каталогах запрашиваемую страницу в следующем порядке.
public/localized-files/fr_ca/
public/localized-files/en_ca/
public/localized-files/ALL_ca/
public/localized-files/fr_ALL/
public/localized-files/fr/
public/localized-files/en_ALL/
public/localized-files/en/
public/
обработка 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-контента»:
Каталог
localized-files/
на самом деле не содержит подпапокen_ca/
,en_ALL/
илиen/
, поэтому Hosting просто пропустит список приоритетов, пока не найдет соответствующую подпапку для комбинации языка и страны запроса.Несмотря на то, что каталог
localized-files/
содержит подпапкуes_ALL/
, приведенный выше пример запроса не включает код языкаes
илиes-foo
, поэтому Hosting не будет искать «i18n-контент», соответствующийes
.Подпапки
fr/
иfr_ALL/
эквивалентны с точки зрения страны и языка пользователя. Однако, если существуют обе подпапки, Hosting будет обслуживать контентfr_ALL/
раньше контента изfr/
.
Переопределить коды языка и страны с помощью файлов cookie
Вы можете изменить отображаемый контент, используя файлы 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-файлов не отражаются в журналах.