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

Symfony UX Autocomplete选择标签无法翻译问题求助

解决Symfony UX Autocomplete与KnpLabs Translatable翻译不匹配问题

1. 确保Autocomplete请求携带当前Locale

UX Autocomplete的AJAX请求默认不会自动传递当前locale参数,需手动在模板中配置:

{{ form_row(form.functionProfile, {
    'data-symfony--ux-autocomplete--autocomplete-url-value': path('your_autocomplete_route', { _locale: app.request.locale })
}) }}

同时在路由配置中支持_locale参数:

# config/routes.yaml
app_function_profile_autocomplete:
    path: /autocomplete/function-profiles/{_locale}
    controller: App\Controller\FunctionProfileAutocompleteController::__invoke
    defaults:
        _locale: '%kernel.default_locale%'
    requirements:
        _locale: '%app.locales%'

2. 在Autocomplete控制器中强制设置Locale

处理请求时显式切换到当前请求的locale,确保实体翻译使用正确语言:

// src/Controller/FunctionProfileAutocompleteController.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\FunctionProfile;

class FunctionProfileAutocompleteController
{
    public function __invoke(Request $request, EntityManagerInterface $em): JsonResponse
    {
        $locale = $request->getLocale();
        $request->setLocale($locale);

        $query = $request->query->get('query', '');
        $profiles = $em->getRepository(FunctionProfile::class)
            ->createQueryBuilder('fp')
            ->leftJoin('fp.translations', 'fpt')
            ->where('fpt.name LIKE :query')
            ->setParameter('query', "%$query%")
            ->andWhere('fpt.locale = :locale')
            ->setParameter('locale', $locale)
            ->getQuery()
            ->getResult();

        $data = array_map(function (FunctionProfile $profile) use ($locale) {
            $profile->setCurrentLocale($locale);
            return [
                'value' => $profile->getId(),
                'label' => $profile->getName(),
            ];
        }, $profiles);

        return new JsonResponse($data);
    }
}

3. 修正自定义Autocomplete字段的Choice Label配置

如果使用自定义FunctionProfileAutocompleteField,需在字段配置中注入RequestStack获取当前locale:

// src/Form/Type/FunctionProfileAutocompleteField.php
use Symfony\UX\Autocomplete\Form\AsEntityAutocompleteField;
use Symfony\UX\Autocomplete\Form\BaseEntityAutocompleteType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Entity\FunctionProfile;

#[AsEntityAutocompleteField]
class FunctionProfileAutocompleteField extends BaseEntityAutocompleteType
{
    public function __construct(private RequestStack $requestStack) {}

    public function configureOptions(OptionsResolver $resolver): void
    {
        parent::configureOptions($resolver);

        $resolver->setDefaults([
            'class' => FunctionProfile::class,
            'choice_label' => function (FunctionProfile $profile) {
                $locale = $this->requestStack->getCurrentRequest()->getLocale();
                $profile->setCurrentLocale($locale);
                return $profile->getName();
            },
        ]);
    }
}

4. 清除缓存

修改配置后执行缓存清理,确保新配置生效:

php bin/console cache:clear

内容的提问来源于stack exchange,提问作者Julian Koster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:42:34