如何同时更新customField及其所有语言版本的对应翻译内容
Shopware 6 自定义字段全语言同步更新方案
你遇到的现象是正常的,Context::createDefaultContext() 默认仅携带系统默认语言ID,当你的自定义字段设置了可翻译属性时,默认更新操作只会写入对应默认语言的翻译值,其他语言的customFields值不会被覆盖。
根据你的业务需求,可选择以下两种解决方案:
场景1:该自定义字段无需多语言差异化设置(推荐方案)
如果product_is_new这类全局属性不需要针对不同语言设置不同值,直接关闭自定义字段的可翻译属性即可:
- 后台进入「设置」→「系统」→「自定义字段」,找到对应字段编辑
- 取消勾选「可翻译」选项后保存,重新更新索引
- 此时你原有代码直接运行即可全局生效,不需要额外处理多语言逻辑
场景2:该自定义字段需要保留可翻译能力,本次需同步更新所有语言值
如果需要保留字段的多语言能力,仅本次需要全语言同步赋值,可以直接在更新数据中传入所有语言的翻译配置,不需要循环创建Context,一次更新即可完成:
前置依赖
提前注入language.repository服务用于获取所有语言ID。
示例代码
$context = Context::createDefaultContext(); // 获取所有已激活的语言ID,不需要过滤激活状态可移除Filter规则 $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('active', true)); $languageIds = $this->languageRepository->searchIds($criteria, $context)->getIds(); // 构造全语言翻译数据 $translations = []; foreach ($languageIds as $languageId) { $translations[$languageId] = [ 'customFields' => [ 'product_is_new' => true ] ]; } // 执行更新 $updateData = [[ 'id' => $productId, 'translations' => $translations ]]; $this->productRepository->update($updateData, $context);
内容的提问来源于stack exchange,提问作者newgennerd
相关产品推荐
相关产品推荐

