Shopware 6如何获取商品名称与描述的多语言翻译?
Shopware多语言商品及订单项翻译获取问题解决
核心问题根源
Shopware实体的翻译返回由Context中的语言配置决定,默认会 fallback 到系统默认语言(如英文)。如果你的RepositoryIterator使用的Context未明确指定目标语言,即使销售渠道支持多语言,也只会返回默认语言的翻译。
商品(ProductEntity)的正确实现方式
1. 构造包含目标语言的Context
无需手动关联translations并过滤,只需确保RepositoryIterator使用的Context设置了目标语言ID:
// 1. 获取目标语言ID(示例:德语) $germanLanguageId = '...'; // 替换为你的德语语言ID // 2. 基于销售渠道上下文克隆并修改语言设置 $baseContext = $this->getSalesChannelContext($salesChannelId)->getContext(); $targetContext = $baseContext->clone(); $targetContext->setLanguageId($germanLanguageId); // 3. 用目标上下文初始化RepositoryIterator return new RepositoryIterator( $this->productRepository, $targetContext, $criteria );
之后遍历商品时,以下方法都会直接返回目标语言的翻译:
$product->getName(); $product->getTranslation('name'); $product->getTranslated(); // 返回包含目标语言所有字段的数组
2. 注意事项
- 无需在Criteria中添加
addAssociation("translations"),默认会根据Context自动加载对应语言的翻译;若添加该关联,会加载所有语言的翻译,反而增加不必要的查询开销。 - 确保目标语言已添加到对应销售渠道的语言列表,且商品在该语言下已维护完整的翻译内容。
订单项(OrderLineItemEntity)的解决方法
订单项的翻译问题逻辑与商品一致,但由于订单创建时会缓存商品当时的名称,需重新加载对应语言的商品或直接获取订单项的翻译:
方法1:重新加载对应语言的关联商品
这是最可靠的方式,能获取商品最新的多语言翻译:
// 假设已有OrderLineItemEntity $lineItem $targetLanguageId = '...'; // 目标语言ID $baseContext = $this->getSalesChannelContext($salesChannelId)->getContext(); $targetContext = $baseContext->clone(); $targetContext->setLanguageId($targetLanguageId); // 重新加载商品 $product = $this->productRepository->search( new Criteria([$lineItem->getProductId()]), $targetContext )->first(); // 获取目标语言名称 $productName = $product->getName();
方法2:直接获取订单项的翻译
若需使用订单创建时的订单项翻译,可关联translations后过滤:
// 查询订单时添加订单项翻译关联 $orderCriteria = new Criteria([$orderId]); $orderCriteria->addAssociation('lineItems.translations'); $order = $this->orderRepository->search($orderCriteria, $context)->first(); // 遍历订单项获取目标语言翻译 foreach ($order->getLineItems() as $item) { $translations = $item->getTranslations()->filterByLanguageId($targetLanguageId); /** @var OrderLineItemTranslationEntity $translation */ $translation = current($translations->getElements()); $itemName = $translation ? $translation->getName() : $item->getName(); }
关键验证点
- 确认目标语言已添加到销售渠道的可用语言列表中
- 确认商品/订单项在目标语言下的翻译内容已正确保存到后台
- 确认Context中的
languageId确实指向目标语言的ID,而非系统默认语言
内容的提问来源于stack exchange,提问作者Torben
相关产品推荐
相关产品推荐

