Symfony4, как запустить префикс _locale в URL для всех контроллеров?

Я пытаюсь установить «интернационализацию» на своем веб-сайте. Чтобы решить эту проблему, мне нужно установить «локали» в качестве префикса для всех URL-адресов контроллеров (например: mywebsite.com/en/page), затем я нашел эту справку в документации Symfony4: https://symfony.com/doc/current/routing/external_resources.html

Я изменил эти файлы следующим образом

конфиг/routes.yaml

controllers:
    resource: '../src/Controller/'
    type: annotation
    prefix: /{_locale}
    requirements:
        _locale: '%app.locales%'
    defaults:
        _locale: '%locale%'

конфиг/services.yaml

parameters:
    app.locales: en|es|fr|ru|mg
    locale: 'en'

конфигурация/пакеты/translation.yaml

framework:
    default_locale: '%locale%'
    translator:
        paths:
            - '%kernel.project_dir%/translations'
        fallbacks:
            - '%locale%'

Если я напишу свой URL-адрес следующим образом: mywebsite.com/en/page, все будет работать, но если я не укажу _locale в URL-адресе, например: mywebsite.com/page< /strong> возвращает ошибку 404. Я хочу, чтобы он достиг mywebsite.com/en/page, так как в моем файле в качестве default_locale указано "en".

Что я пропустил ? Спасибо.


person gZ Fab    schedule 01.01.2018    source источник


Ответы (2)


Кажется, что этот трюк делает дело:

#config/services.yaml

parameters:
    app.locales: en|es|fr|ru|mg|
    locale: 'en'

Просто нужно было добавить | в конце строки app.locales, теперь я могу получить доступ к контроллерам без префикса _locale

person gZ Fab    schedule 01.01.2018
comment
В Symfony 4.3.1 (не уверен насчет более ранних версий) для этого по-прежнему требуется двойная косая черта, например: mywebsite.com//page - person alx; 17.06.2019

Метод работы для Symfony 4.3.1 (может и раньше 4.x тоже, не проверял) выглядит следующим образом:

# config/routes.yaml
controllers:
    resource: '../../src/Controller/'
    type: annotation
    prefix:
        en: '' # don't prefix URLs for English, the default locale
        '*': '/{_locale}'

А в остальном как в вопросе. Примечание: с этой настройкой '/en/' является необязательным, т.е. он будет работать в обоих направлениях - с ним или без него.

person alx    schedule 17.06.2019