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

