首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Symfony @Route注解i18n:是否有可能对未显式声明的语言进行后备?

基础概念

Symfony 是一个流行的 PHP 框架,用于构建 Web 应用程序。@Route 注解用于定义路由,而 i18n(国际化)则是指应用程序支持多种语言的能力。

相关优势

  • 国际化支持:允许应用程序支持多种语言,提升用户体验。
  • 灵活性:可以根据用户的语言偏好动态显示内容。

类型

  • 显式声明的语言:在路由中明确指定支持的语言。
  • 后备语言:当请求的语言不在显式声明的语言列表中时,使用默认或后备语言。

应用场景

  • 多语言网站:适用于需要支持多种语言的网站,如国际化的电子商务平台、新闻网站等。

问题:是否有可能对未显式声明的语言进行后备?

原因

Symfony 默认情况下不会对未显式声明的语言进行后备。如果请求的语言不在路由中定义的语言列表中,Symfony 会返回 404 错误。

解决方案

可以通过自定义路由解析器来实现对未显式声明的语言进行后备。以下是一个示例代码:

代码语言:txt
复制
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RouterInterface;

class I18nFallbackRouteMatcher implements RequestMatcherInterface
{
    private $router;
    private $fallbackLocale;

    public function __construct(RouterInterface $router, string $fallbackLocale)
    {
        $this->router = $router;
        $this->fallbackLocale = $fallbackLocale;
    }

    public function match(Request $request): array
    {
        $match = $this->router->match($request);

        if ($match === null && $request->getLocale() !== $this->fallbackLocale) {
            $request->setLocale($this->fallbackLocale);
            $match = $this->router->match($request);
        }

        return $match;
    }
}

然后在 config/routes.yaml 中配置路由:

代码语言:txt
复制
# config/routes.yaml
app:
    resource: ..
    type: annotation
    prefix: /{_locale}
    requirements:
        _locale: en|fr|de
    defaults:
        _locale: en

最后,在 config/services.yaml 中注册自定义路由匹配器:

代码语言:txt
复制
# config/services.yaml
services:
    app.i18n_fallback_route_matcher:
        class: App\I18nFallbackRouteMatcher
        arguments:
            $router: '@router'
            $fallbackLocale: 'en'

并在 config/packages/routing.yaml 中使用自定义路由匹配器:

代码语言:txt
复制
# config/packages/routing.yaml
framework:
    router:
        request_matcher: app.i18n_fallback_route_matcher

参考链接

通过这种方式,当请求的语言不在显式声明的语言列表中时,Symfony 会自动切换到后备语言并尝试匹配路由。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券