近年来,随着全球化的发展,越来越多的公司开始将业务拓展至全球市场。而网站多语言化是一个必不可少的环节。在前端开发中,利用 Headless CMS(无头 CMS)实现多语言网站是一种更为先进和高效的方案。
什么是 Headless CMS?
Headless CMS 是一种无头内容管理系统。传统的 CMS,如 WordPress、Drupal 等,通常将内容管理和页面渲染绑定在一起,也即是需要用 CMS 提供的模板来渲染页面,而 Headless CMS 则不同,它只提供内容管理的 API,不进行页面渲染。这样,开发者就可以根据自己的需求,选择任何前端框架(如 React、Angular、Vue.js 等)进行页面渲染,实现更为灵活的网站开发。
利用 Headless CMS 实现多语言网站的优势
传统的网站多语言实现方案是基于多页应用(MPA),也就是对于每个语言版本的网站,都会有一个相对应的网站实例。但这样的做法,会导致以下问题:
- 维护成本高。每个语言版本的网站都需要单独维护,增加开发、测试、部署等成本。
- SEO 不友好。对于搜索引擎来说,每个语言版本的网站视作不同的网站,这样就导致每个语言版本间互相影响。
- 数据同步困难。对于多个语言版本的网站,需要共享一部分数据,但传统的 MPA 方案中,数据同步非常困难。
而使用 Headless CMS,以上问题都能很好的解决:
- 维护成本低。因为只需要维护一套内容数据,所以维护成本大大降低。
- SEO 友好。因为所有语言版本的网站都是共享同一份数据,所以搜索引擎会将它们视为同一份网站。
- 数据同步简单。数据只需要在 Headless CMS 上的一个地方进行修改,就可以在多个语言版本间自动同步,非常方便。
Headless CMS 实现多语言网站的具体实现方法
在实现多语言网站时,Headless CMS 需要以下能力:
- 支持多语言功能。Headless CMS 需要支持多语言,并且需要提供接口获取特定语言的数据。
- 支持多租户功能。每个语言版本的网站都需要有自己的域名或子域名。因此,Headless CMS 需要支持多租户,能够根据请求的域名或子域名,返回对应语言的内容数据。
- 支持 i18n。因为不同语言间存在差异,因此需要使用国际化(i18n)技术,将同一份内容数据进行多语言的翻译。
- 支持同步数据。对于部分内容数据,如菜单、网站标题等,需要在不同语言版本的网站上显示相同的内容,需要 Headless CMS 支持同步数据功能。
下面,我们以 Strapi(一款开源的 Headless CMS)为例,具体介绍如何利用 Headless CMS 实现多语言网站。
配置多语言
首先,在 Strapi 上配置多语言功能。进入 Strapi 管理界面后,点击左侧「Settings」,勾选「i18n」选项卡中的「Enable locales」:
接着,在「Locales」下方设定语言:
配置多租户
接下来,配置多租户功能。在 Strapi 前端项目的 config/server.js
文件中,添加以下代码:
-- -------------------- ---- ------- -------------- - -- --- -- -- -- - - - ----- ----------- ----------- ----- --------------- ------ - - - ---------- ------------ - -------------- ------- ------ ----- --------------- -------- ----- --------- -- -- - ----- ---- - ------------------- -- ---- ----- ---- - ------------------- -- --- ----- -------- - ----- ------ ----------------- --------------- ------- --- ---------- ----- - ------ --------- -- -------- - ----- ------- ----------- ------------ ---- - -------- --------- - -- ----- -- - - - ---
该部分代码设置了 Strapi 后端路由,根据传入的语言和标识符(如路由中的 /en/news
),返回对应的后端数据。
配置 i18n 和同步数据
最后,详细介绍两个需要在前端项目中配置的功能:i18n 和同步数据。
在前端项目中,我们使用 react-intl 这个国际化库实现 i18n 功能。在 React 项目中,我们首先需要安装 react-intl:
npm install --save react-intl
接着,在项目根目录下创建格式为 zh-CN.json
、en-US.json
等的语言文件,配置对应的中英文内容:
-- -------------------- ---- ------- -- ---------- - ------- ----- -------- ------ - -- ---------- - ------- ------- -------- ------ --- -
我们还需要在项目的入口文件中引入语言文件、定义语言格式,如下所示:
-- -------------------- ---- ------- ------ ----- ---- -------- ------ -------- ---- ------------ ------ -------------- ---- ------------- ------ ---- ---- ----------------------- ------ ---- ---- ----------------------- ------ --- ---- -------- ------ --------------- ---- -------------------- ----- -------- - - -------- ----- -------- ---- -- ----- -------- - ------------------ -- ----------------------- ---------------- ------------------ ------------- ----------------- ------------------------------ ---- -- --------------- -------------------- ------------------------------- -- ------------------
最后,我们来实现同步数据功能。我们将同步数据写成一个 React 组件,并导出。在使用的地方,我们直接引用该组件,即可使用同步数据功能:
-- -------------------- ---- ------- ------ ----- ---- -------- ------ - ------- - ---- ------------- ----- ---- - - - ----- ------- ----- ---- --- ----- --- ------ -- - ----- -------- ----- --------- --- ------- --- ------ --- -- -- ----- ---- - -- -- - ----- ---- - ---------- ------ - ----- - --------------- ------ -- - -- ---------------- ------------ ------------------------ ------------ ---- -- - ------ -- -- ------ ------- -----
上述代码的 menu
数组中,包含了菜单的名称、链接和中英文翻译。在 Menu
组件的渲染中,我们利用 useIntl
钩子函数获取当前语言环境下的翻译内容,完成同步数据,展示相同的菜单内容。
总结
利用 Headless CMS 实现多语言网站,可以很好地解决维护成本高、SEO 不友好和数据同步困难等问题。具体实现方法是在 Headless CMS 上配置多语言和多租户功能,采用国际化技术完成文本翻译,以及在前端项目中使用同步数据组件等。Headless CMS 还有许多优秀的特性,有兴趣的读者可以去学习一下。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6491168048841e9894f1b272