【问题标题】:Symfony i18n routes: partial language supportSymfony i18n 路由:部分语言支持
【发布时间】:2020-02-10 13:42:42
【问题描述】:

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

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

这是使用Localized routing,我相信它是在 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,但仍然遇到同样的问题。

【问题讨论】:

  • 你的意思是“如何生成回退到英语语言”?
  • 这是一种可能的解决方案,当然。
  • 我做到了。它不显示从根本没有为路由定义的语言的路由回退。即便如此,我还是尝试将其调整为 routes.yml 语法(因此没有控制器注释)并得到了与在 SO 上发布之前相同的错误。
  • 我相信您应该提供实际产生问题的示例树枝代码。这不是问题,可能是您没有得到有用答案的部分原因。

标签: php symfony routing symfony4 symfony5


【解决方案1】:

这不是你要找的吗?

# 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(){...}

【讨论】:

  • 我们已经有了这样的后备。这适用于常规消息,但据我所知,它对路由没有影响。
  • @JeroenDeDauw 我编辑为您添加另一个想法。但这与您使用的方式不完全相同。
【解决方案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>

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

【讨论】:

  • 问题在于路由本身无法正常工作。它正在让 Symfony 创建到路由的链接。我现在在我的帖子中添加了重点。在访问 /nl/whatever 时,此树枝代码因您的示例而失败:{{ path('routing-test') }}。错误是:无法为命名路由“routing-test”生成 URL,因为这样的路由不存在。
猜你喜欢
  • 2011-08-17
  • 2011-07-29
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2011-08-21
  • 2021-07-31
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多