【问题标题】:How can I see what locales a content entry has via Contentful delivery API如何通过 Contentful Delivery API 查看内容条目的语言环境
【发布时间】:2018-06-15 11:42:34
【问题描述】:

我正在 Contentful Delivery API 中运行查询,以根据其 slug 返回特定页面项目。此查询还设置了语言环境,以便它只返回我需要呈现的语言的数据。

不过,我还需要设置页面的 hreflang 标记,以帮助 google 知道该页面也提供其他语言版本。

我从内容内容中得到的表示我的页面的内容项的响应似乎没有任何类型的数组属性,让我可以轻松确定内容可用的其他语言。

我假设这一定是 SEO 的一个非常普遍的要求,所以希望有人能告诉我如何在 Contentful 的响应中得到这个?

这是我的回应示例。我希望看到的是另一个名为 allLocales 的属性,它会列出可以提供此内容的每个语言环境。

更新: 我知道我可以获得空间中所有语言环境的列表,并在我的查询中设置locales=*,但这仍然无济于事。我只需要知道我检索到的给定内容中可用的语言环境子集。例如,一个页面可能只支持 2 个语言环境,但整个空间中可能有 3 个或更多语言环境可用。

Locales=* 没有帮助,因为它包含每个链接项(可能有也可能没有内容)的语言环境,而我需要的是一个数组对象,其中包含父内容项上可能可用的所有语言环境.即使用户没有将内容放在字段中,我也想明确地知道是否已在内容上选择了语言环境。

{
    "sys": {
        "type": "Array"
    },
    "total": 1,
    "skip": 0,
    "limit": 1,
    "items": [
        {
            "sys": {
                "space": {
                    "sys": {
                        "type": "Link",
                        "linkType": "Space",
                        "id": "xuehyxrgb9ri"
                    }
                },
                "id": "1MhAzkNYvOSU8GgUQcQKqa",
                "type": "Entry",
                "createdAt": "2018-01-05T10:48:30.373Z",
                "updatedAt": "2018-01-05T12:57:00.066Z",
                "revision": 6,
                "contentType": {
                    "sys": {
                        "type": "Link",
                        "linkType": "ContentType",
                        "id": "contentPage"
                    }
                },
                "locale": "en-AU"
            },
            "fields": {
                "title": "Test Page",
                "slug": "test-page",
                "content": [
                    {
                        "sys": {
                            "type": "Link",
                            "linkType": "Entry",
                            "id": "Vt4ktGvOE0qoO8mqeCMao"
                        }
                    },
                    {
                        "sys": {
                            "type": "Link",
                            "linkType": "Entry",
                            "id": "2jY5LUgHWUsaIyMuwKwYe2"
                        }
                    }
                ]
            }
        }
    ]
}

【问题讨论】:

  • 我是否正确假设您只想显示条目已完全翻译的区域设置的hreflangs?因为没有未翻译的字段。
  • 我打算让它比这更严格一些。例如,如果内容编辑器将语言环境添加到内容页面,那么他们明确表示他们希望该页面对每个语言环境都有一个 hreflang 标记,无论他们是否留下了一些未翻译的字段。这意味着,即使他们添加了语言环境并且没有翻译任何字段,它仍然会得到一个 hreflang 标记。在内容编辑器端进行管理似乎比逻辑检查每个字段的特定语言值更简单。
  • 这将使内容更容易。它实际上只需要一个属性来列出已添加到条目中的每个区域设置。可以是空间中的每一个语言环境,也可以是一个子集。内容编辑器添加到条目中的任何内容,我都需要知道。
  • 不幸的是,这不是语言环境在内容中的工作方式。条目始终存在于所有语言环境中,它只是具有值或不具有值的单个字段。一种解决方法是将此信息添加为条目的字段,基本上是您的建议。只需确保不对字段进行本地化,并使其成为编辑器可以在特定区域准备发布时填写的值列表。
  • 嗯,好的。我想我可以做到这一点,只是有点令人沮丧,因为这意味着内容编辑器必须有效地执行两次(一次用于显示和隐藏语言环境的编辑器中的语言环境机制,一次用于我添加的自定义字段具有相同的语言环境)。我是否可以添加一个功能请求,对于返回的任何条目,在响应元中返回所有已激活语言环境的列表?

标签: contentful


【解决方案1】:

如果您请求当前空间,您可以实现这一目标

https://cdn.contentful.com/spaces/<you-space-id>

你会得到类似这样的回应:

{
  "sys": {
    "type": "Space",
    "id": "developer_bookshelf"
  },
  "name": "Developer Bookshelf",
  "locales": [
    {
      "code": "en-US",
      "default": true,
      "name": "U.S. English",
      "fallbackCode": null
    },
     {
      "code": "de-DE",
      "default": false,
      "name": "German (Germany)",
      "fallbackCode": null
    }

  ]
}

其中包含语言环境数组。

此外,如果您想获取包含所有语言环境的条目,您只需将 locale 查询更改为 locale:*

此外,您还可以使用js SDK 实现这一目标

var contentful = require('contentful')
var client = contentful.createClient({
  // This is the space ID. A space is like a project folder in Contentful terms
  space: '<space-id>',
  // This is the access token for this space. Normally you get both ID and the token in the Contentful web app
  accessToken: '<access-token>'
})
// This API call will request an entry with the specified ID from the space defined at the top, using a space-specific access token.
const space = await client.getSpace()
console.log('space--------------------')
console.log(space)

const localizedEntries = await client.getEntries({locale: '*'})
console.log('localizedEntries--------------------')
console.log(localizedEntries)

【讨论】:

  • 谢谢哈立德我更新了我的答案。这无济于事,因为我无法可靠地知道哪些语言环境可用,因为它们分布在不同的属性中,并且可能不会显示在响应中,因为用户没有将内容放入其中。
【解决方案2】:

要以编程方式确定给定页面可用的语言列表,您可以对 /entries?content_type=contentPage&amp;fields.slug=test-page&amp;locale=en-AU 进行初始查询以获取页面的全部内容(包括引用的条目),然后获取顶部条目的 ID 并生成/entries/&lt;ENTRY_ID&gt;?locale=* 的另一个 API 请求并获取响应的 fields.&lt;LOCALIZED_FIELD&gt; 的密钥。

如果给定页面可用的语言列表是编辑决定,我建议添加一个新字段,一个简短的文本列表,使用可能语言的完整列表设置预定义值验证,并使用复选框外观。然后作者/编辑可以选择页面可用的语言,您可以简单地访问该字段以获取语言数组。

【讨论】:

  • 它会,但前提是至少有一个字段具有给定语言环境的内容。我需要比这更具体的东西,最好是更容易编程。对于给定条目,返回我认为的语言环境数组应该非常简单。
  • 您如何确定该页面是否提供其他语言版本?如果这是一个编辑决定,我建议添加一个简短的文本列表,设置一个预定义的值验证,并使用复选框外观。然后作者/编辑可以选择页面可用的语言/区域设置。如果是程序化决策,请完整描述您想使用的逻辑,社区可以提供更好的帮助。
  • 这是一个编辑决定。添加复选框列表将是多余的,因为在 Contentful 的内容编辑器中已经存在向条目添加语言环境(并因此显示特定于语言环境的字段)的能力,我想避免用户必须这样做两次。
  • 您所指的内容编辑器中已经存在的内容只是定义了 webapp 中当前用户可以看到的区域设置。它与当前条目存在的语言环境无关。语言环境是在空间级别上定义的,因此每个条目都有可能在每个语言环境中都有值。如果您希望作者/编辑定义条目使用的语言环境,您必须添加一组复选框,就像我描述的那样。
【解决方案3】:

您可以通过查询空间来检索包含所有空间语言环境及其配置的数组(例如defaultfallbackCode)的语言环境对象:

https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/spaces/space/get-a-space/console/js

【讨论】:

  • 感谢 Christine,但我只需要知道我检索到的给定内容中可用的语言环境子集。例如,一个页面可能只支持 2 个语言环境,但整个空间中可能有 3 个或更多语言环境可用。
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多