You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Contentful PHP SDK:如何为CustomEmbeddedBlock获取指定本地化嵌入内容

Contentful CustomEmbeddedBlock 本地化语言问题解决方案

问题核心

EmbeddedAssetBlock仅能获取嵌入项的默认本地化版本,手动调用setLocale()切换活跃locale时触发异常:

An exception has been thrown during the rendering of a template ("Entry with ID was built using locale "en-GB", but now access using locale "en-US" is being attempted.")

原因是Contentful的LocalizedResource(Entry/Asset)实例是基于特定locale构建的,无法直接修改其locale属性。

解决方案

1. 通过CDA客户端重新获取目标locale的条目

不要修改已获取条目的locale,而是用目标locale重新请求条目:

// 获取CDA客户端实例(根据你的框架/环境调整获取方式)
$client = $this->get('contentful.delivery.client');
// 提取原条目的ID
$entryId = $node->getEntry()->getId();
// 获取当前活跃的本地化语言(比如从请求、路由或配置中获取)
$activeLocale = 'en-US'; // 替换为实际的活跃locale变量
// 用目标locale重新获取条目
$entry = $client->getEntry($entryId, ['locale' => $activeLocale]);

2. 确保活跃locale正确传递

避免硬编码locale,从应用的上下文动态获取当前活跃locale:

  • 例如在Symfony框架中:
    $activeLocale = $this->container->get('request_stack')->getCurrentRequest()->getLocale();
    

3. 处理无翻译版本的降级逻辑

如果嵌入条目不存在目标locale的翻译,CDA会返回默认locale内容,可添加判断做降级处理:

// 检查条目是否包含目标locale的字段值
if (!$entry->getField('yourFieldName', $activeLocale)) {
    // 降级到默认locale
    $entry = $client->getEntry($entryId, ['locale' => 'en-GB']);
}

内容的提问来源于stack exchange,提问作者Developer Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:42:33