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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:45:31