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
相关产品推荐
相关产品推荐

