如何在 GraphQL 中使用国际化?

GraphQL 是一种新兴的 API 查询语言,它具有强大的类型系统和可以轻松地组合多个数据源的能力。对于多语言应用程序,国际化是一个必需的功能。在 GraphQL 中实现国际化可以帮助我们更有效地管理多语言数据,并提高应用程序的可重用性。

本文将介绍如何在 GraphQL 中使用国际化,包括在 GraphQL schema 中定义国际化字段和在 GraphQL resolvers 中处理国际化数据。

在 GraphQL schema 中定义国际化字段

GraphQL schema 是我们定义和描述 GraphQL API 的地方。要在 GraphQL 中支持国际化,我们需要在 schema 中定义国际化字段。国际化字段是一种语言特定的字段,它们可以根据请求的语言动态返回不同的结果。我们可以使用 GraphQL 的自定义标量类型来实现国际化字段。

下面是一个使用自定义标量类型的例子:

------ ---------------

---- ---- -
  --- ---
  ------ ----------------
  ----- ----------------
-

---- ----- -
  -------- ----- ----
-

在这个 schema 中,我们定义了一个名为 LocalizedString 的自定义标量类型,在 Post 类型中使用了这个类型来定义 titlebody 字段。这些字段会在请求时动态返回正确的语言版本的字符串。

我们还定义了一个名为 Query 的根类型,并添加了一个名为 post 的字段。这个字段使用 ID 类型作为参数,并返回一个 Post 类型的对象。

在 GraphQL resolvers 中处理国际化数据

要在 GraphQL 中支持国际化,我们还需要在 resolvers 中为国际化字段提供实现。我们可以使用 i18n 库(如 react-i18next)来处理国际化字符串。

下面是一个使用 react-i18next 的例子:

----- --------- - -
  ---------------- --- -------------------
    ----- ------------------
    ------------ -- ------ ---- --- -- -----------
    ---------------- -
      ------ ------
    --
    ----------------- -
      ------ ------
    --
    ----------------- -
      -- --------- --- ------------ -
        ------ ----------
      -
      ------ -----
    -
  ---
  ------ -
    ----- --- - -- -- -- -
      ----- ---- - ----------------
      ------ -
        --- --------
        ------ ---------------------
        ----- -------------------
      --
    -
  -
--

-------- ---------------- -
  ------ ---------------
-

在这个例子中,我们定义了一个 LocalizedString 标量类型的 resolver,它只是一个简单的标量类型,它将值转换为 GraphQL 字符串。我们还定义了一个 Query resolver,该 resolver 获取帖子对象,并使用 localize 函数将帖子的标题和正文本地化。

localize 函数使用 react-i18next 库中的 t 函数来本地化字符串。此函数将字符串映射到应用程序的特定语言版本,并返回正确的语言版本的字符串。具体来说,它使用语言偏好、浏览器语言配置和用户选项来确定要使用的语言。

结论

本文介绍了如何在 GraphQL 中使用国际化,包括在 GraphQL schema 中定义国际化字段和在 GraphQL resolvers 中处理国际化数据。实现国际化可以帮助我们更好地管理多语言数据,并提高应用程序的可重用性。如果您正在构建多语言应用程序,并且想要使用 GraphQL 作为 API 查询语言,那么您应该研究如何在 GraphQL 中使用国际化。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6705f1f1d91dce0dc85603ab