使用国际化重写(“i18n 重写”)可根据用户所在的国家/地区或偏好语言提供不同的内容。下面是您可以设置的一些配置示例:
向所有习惯使用法语的用户(无论其位于哪个国家/地区)提供相同的法语内容。
示例:采用法语文字的首页向习惯使用法语的用户提供标准法语内容,但对于习惯使用法语的加拿大用户,改为提供加拿大法语内容。
示例:采用标准法语表述方式的首页与采用加拿大法语表述方式的首页向所有加拿大用户(无论其语言偏好如何)提供相同的内容。
示例:采用您网站的“默认”语言但具有特定于加拿大的功能(例如节假日主题)的网页向习惯使用法语的加拿大用户提供加拿大法语内容。
示例:采用加拿大法语表述方式并具有特定于加拿大的功能(如节假日主题)的首页
Firebase Hosting 会根据用户的 IP 地址确定其所在的国家/地区,并根据 Accept-Language
请求标头(通常由网络浏览器自动设置)确定其语言偏好。
设置 i18n 重写
如需为您的 Hosting 网站设置 i18n 重写,您需要为所有本地化内容创建“i18n content”目录,然后将 i18n
特性添加到 firebase.json
文件以指向新的“i18n content”目录。
下面是详细步骤:
在本地应用目录的
public
文件夹中,为您的“i18n content”创建单独的目录,然后为您的网站支持的每种语言和国家/地区组合创建子文件夹。在每个子文件夹中,添加特定于该组合的内容,例如节假日主题的首页或特定语言的 404 页面。
下面是一个名为
localized-files
的“i18n content”目录示例: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
目录或其他子文件夹中具有类似文件。您可以创建完全特定于某种语言和/或某个国家/地区的内容。将
i18n
特性添加到firebase.json
文件中,并指定包含“i18n content”的目录。继续我们的示例:// 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
值中的前导斜杠和尾斜杠不是必需的。将“i18n content”和配置部署到您的 Hosting 网站。
您可以使用 Cookie 替换值来测试设置。
国家/地区代码和语言代码
为“i18n content”子文件夹命名时,国家/地区代码和语言代码必须采用小写字母。您可以使用 ALL
的值(区分大小写)来表示任何国家/地区(如 es_ALL/
)或任何语言(如 ALL_ca/
)。
Hosting 会从用户的 IP 地址获取国家/地区代码。国家/地区代码是由两个字母组成的 ISO 3166-1 alpha-2 代码。
语言代码是从用户的 Accept-Language
请求标头(通常由网络浏览器自动设置)获取的。
这些代码是 ISO 639-1 代码。
使用语言代码时,请注意以下几点:
当 Hosting 搜索要提供的“i18n content”时,会根据
Accept-Language
标头中的质量值对语言进行排序。Hosting 会删除
Accept-Language
标头中的任何地区子标记和国家/地区子标记,因此“i18n content”子文件夹名称中的语言代码不能包含这些子标记。例如,不能在子文件夹名称中使用es-419
或es-US
作为语言代码,但您可以使用es
。如需提供具体的地区或国家/地区内容,可以创建包含要支持的特定语言-国家/地区内容的子文件夹。
“i18n content”的优先级顺序
如果您设置 i18n 重写,则 Hosting 将根据以下优先级顺序提供内容:
以
/__/*
路径段开头的预留命名空间配置的重定向
完全匹配的静态内容
语言代码 + 国家/地区代码(例如来自
fr_ca/
的内容)
系统会按照请求Accept-Language
标头中每种语言的质量值对这些内容进行排序。仅国家/地区代码(例如来自
ALL_ca/
的内容)仅语言代码(例如,来自
fr/
或es_ALL/
的内容)
系统会按照请求的Accept-Language
标头中每种语言的质量值对这些内容进行排序。“默认”的完全匹配静态内容
这是“i18n content”目录外(例如public
目录的根目录)的内容。
配置的重写
404 处理
i18n 404 页面
系统会按照上面列出的相同优先级顺序对完全匹配的静态内容进行排序。自定义 404 页面
默认 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 将按以下顺序在目录中搜索请求的页面。
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
请求的页面:
awesome-page.html
如需在“i18n content”目录中搜索并提供其中的内容,请注意以下事项:
localized-files/
目录实际上不包含en_ca/
、en_ALL/
或en/
子文件夹,因此 Hosting 只会跳过优先级列表,直到其找到请求的语言-国家/地区组合的匹配子文件夹为止。即使
localized-files/
目录包含es_ALL/
子文件夹,上面的示例请求也不包含es
或es-foo
语言代码,因此 Hosting 不会搜索与es
匹配的“i18n content”。从用户的国家/地区和语言偏好的角度来看,名为
fr/
和fr_ALL/
的子文件夹是等效的。但是,如果两个子文件夹都存在,Hosting 将先提供fr_ALL/
内容,然后再提供fr/
内容。
使用 Cookie 替换语言代码和国家/地区代码
您可以通过使用 Cookie 替换国家/地区和语言标头来更改提供的内容。
您可以通过以下方式使用 Cookie 替换值:
使用不同的语言/国家/地区组合测试功能,以检查所提供的内容。
让用户能够更改他们看到的内容。例如,您可以实现语言选择器,然后相应地设置用户的
firebase-language-override
Cookie。
如需配置 Cookie 替换值,请使用 firebase-country-override
和/或 firebase-language-override
这两个名称设置 Cookie。例如,以下 JavaScript 代码段会将国家/地区代码替换为 ca
,并将 Accept-Language
标头替换为 fr,en
:
document.cookie = "firebase-country-override=ca";
document.cookie = "firebase-language-override=fr,en";
语言 Cookie 替换值必须是以英文逗号分隔的语言代码列表(按偏好顺序排列),不得包含子标记或质量值。
Cookie 替换值不会反映在日志中。