3

我有几十条路线定义如下:

services:
    path:
        en: /en/services
        de: /de/dienstleistungen
    controller: App\Controller\SimplePageController::page

这是使用我相信在 Symfony 4.1 中引入的本地化路由。

这些路线都有英语和德语的路径。现在我想用其他语言翻译一些特定的页面。比如我的主页。问题是,如果我在主页的路径中添加另一种语言,它将无法加载,因为它无法创建指向没有以这种新语言定义的路径的其他页面的链接

如果我访问 /nl/homepage,Twig 中的以下链接生成失败

<link href="{{ path('services') }}">

有错误

无法为命名路由“服务”生成 URL,因为这样的路由不存在。

如果当前语言没有路由,我如何告诉 Symfony 创建指向英语路由的链接?或者更好的是,指定一些动态路径:

services:
    path:
        en: /en/services
        de: /de/dienstleistungen
        default: /$1/services
    controller: App\Controller\SimplePageController::page

编辑:我现在使用 Symfony 5.0.4 并且仍然有同样的问题。

4

2 回答 2

2

这不是你要找的吗?

# config/packages/translation.yaml
framework:
    translator:
        fallbacks: ['en']

它会告诉您该语言是否未定义为使用“en”作为默认后备。

编辑:那么您可能会尝试使用某种解决方法,但不确定这是否是您正在寻找的

# config/services.yaml
parameters:
    app.localesForSpecificRouting: en|de
    app.localesForAnotherSpecificRouting: en|de|fr

然后在您的控制器中,您可以为特定路线加载特定语言

/**
 * @Route("/{_locale}/routing1", name="routing1", requirements={
 *     "_locale"="%app.localesForSpecificRouting%"
 * })
 */
 public function routing1(){...}

 /**
 * @Route("/{_locale}/routing2", name="routing2", requirements={
 *     "_locale"="%app.localesForAnotherSpecificRouting%"
 * })
 */
 public function routing2(){...}
于 2020-02-24T16:19:08.017 回答
2

我不确定我是否正确理解了这个问题,但我在本地测试了这段代码:

# config/routes.yaml
routing-test:
  path:
    en: /{_locale}/services
    de: /{_locale}/dienstleistungen
  controller: App\Controller\SimplePageController::page
  defaults:
    _locale: '%kernel.default_locale%'
  requirements:
    _locale: ^[a-z]{2}?$

此代码结果匹配的 URL,例如:

URL typed: /nl/services 

Matched: routing-test.en /{_locale}/services 
_locale: "nl"

另一个测试:

URL typed: /fr/dienstleistungen

Matched: routing-test.de /{_locale}/dienstleistungen 
_locale: "fr"

你能告诉我它是否对你有帮助吗?

编辑:

好的,我想我理解得更好了,我尝试了什么:

路由:

# config/routes.yaml
homepage:
    path:
       en: /{_locale}/homepage
       fr: /{_locale}/accueil
    controller: App\Controller\SimplePageController::index
    defaults:
      _locale: '%kernel.default_locale%'
    requirements:
      _locale: ^[a-z]{2}?$

services:
    path:
       en: /{_locale}/services
       de: /{_locale}/dienstleistungen
    controller: App\Controller\SimplePageController::services
    defaults:
      _locale: '%kernel.default_locale%'
    requirements:
      _locale: ^[a-z]{2}?$

模板:

{# templates/test-routing/index.html.twig #}
{% set locale = app.request.get('_locale') in ['en', 'de'] ? app.request.get('_locale') : 'en' %}
<a href="{{ path('services', { '_locale' : locale }) }}">Routing test</a>

我认为没有更好的方法来实现这个目标,据我所知......

于 2020-02-26T13:29:28.170 回答