首页
学习
活动
专区
工具
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 会自动切换到后备语言并尝试匹配路由。

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

相关·内容

Java创建Annotation

注解目标(target)指定注解可以应用于哪个Java结构。例如,某些注解可能仅对方法有效,而其他注解能对类和字段都有效。从Java 9开始,11个标准注解目标,如下表所示: ?...包含默认值空字符串允许省略该值,value如果没有指定值,则导致值为空字符串。例如,如果用户使用表单声明上述注解@JsonField,则该value参数设置为空字符串。...对于具有多个参数注解,需要指定每个参数名称来区分参数(除非仅提供一个参数,在这种情况下,如果提供名称,则参数将映射到value参数)。...此外,我们可以检查这些字段以发现每个字段是否都使用特定注解进行注解。 这样,我们可以遍历传递给方法参数对象关联类每个字段,并发现哪些字段使用@JsonField注解。...如果value参数值是空字符串,我们知道没有提供字段名称(因为这是value参数默认值),否则,提供了一个空字符串。

1.5K20

Envoy架构概览(3):服务发现

DNS结果中每个返回IP地址将被视为上游群集中主机。这意味着如果查询返回三个IP地址,Envoy将假定集群三个主机,并且三个主机都应该负载平衡。...到上游主机连接会被合并,使用主机在空闲时间超过* cleanup_interval_ms *时会被刷新,默认值为5000ms。如果原始目标地址不可用,则不会打开上游连接。...该实现使用AWS DynamoDB作为后备存储,但是该API非常简单,可以轻松地在各种不同后备存储之上实施。对于每个SDS群集,Envoy将定期从发现服务中获取群集成员。...我们推荐部署服务以服务Envoy网格配置方式使用最终一致服务发现以及主动运行状况检查(Envoy健康检查上游集群成员)来确定集群运行状况。这种范例许多好处: 所有的健康决定是完全分配。...当为上游群集配置运行状况检查时,Envoy使用2x2矩阵来确定是否路由到主机: Discovery Status HC OK HC Failed Discovered Route Don’t Route

1.7K50
  • awesome-php

    收集整理一些常用PHP类库, 资源以及技巧. 以便在工作中迅速查找所需… 这个列表中内容来自 awesome-php 翻译, 来自开发者周刊以及个人积累等....及 Yaf 开发框架 yaf - 另一个基于 Swoole 及 Yaf 开发框架 SwooleDistributed - swoole 分布全栈框架 Zan PHP Framework - 赞开源...- 一个为构建 “long running” 服务而生 Web 微型高性能框架 路由( Routers ) Fast Route - 一个高效路由库 Route - 基于Fast Route路由库...PHP实现Mustache模板语言 Phly Mustache - 另一个PHP实现Mustache模板语言 MtHaml - PHP实现HAML模板语言 PHPTAL - PHP实现TAL模板语言...Cake I18n - 翻译和本地化消息 symfony/translation illuminate/translation Gettext - PHP library to collect and

    8.6K90

    Android项目解耦--路由框架ARouter使用

    2.9.png 目前Android原生页面跳转现状 (startActivity)多个module之前页面跳转必须使module之间进行依赖; (隐intent-filter)书写麻烦,不好管理成功与否难以控制...; Native页&M页跳转统一Native页面有不同协议,管理复杂; 页面跳转过程无法干预(增加拦截过滤,日志打点); 页面跳转结果无法修改(跳转失败进行重定向); 模块解耦&高效开发 "声明/使用...统一外部调用入口 能对"不支持"跳转统一处理 支持跳转前预处理 支持重定向 ARouter现在有的模块解耦最好轮子 ARouter git上star四千多。...ARouter.setLogger(); 添加注解 // 在支持路由页面上添加注解(必选) // 这里路径需要注意是至少需要有两级,/xx/xx @Route(path = "/test/activity...// 我们经常需要在目标页面中配置一些属性,比方说"是否需要登陆"之类 // 可以通过 Route 注解 extras 属性进行扩展,这个属性是一个 int值,换句话说,单个int4字节,也就是

    2.2K10

    代码手术刀—自定义你代码重构工具

    对于懒人而言,挨个手动点击几百次按钮和坐牢无异,遂自己写了一个工具对大部分已明确优化点进行一键修改(具体是使用lombok@Data注解替换getter/setter以及toString方法)...4.删除getter/setter方法,这里需要判断在get和set方法里是否特殊逻辑。 5.给类打上@Data注解,并且把lombok包引入进来。 6.把修改后内容写入java文件。...3.判断是否getter/setter(这里需要注意,boolean类型字段需要特殊处理) 4.判断getter/setter是否为简单返回和赋值操作。...这是解析过程第一步。 通常不需要咱们调用,JavaParser将具体细节实现隐藏在内部,调用方只需要使用开放api即可完成源码到AST转换。...包声明(Package Declaration) 导入声明(Imports) 类型声明(Type Declarations),这可能是类、接口、枚举或注解 注释(Comments) 任何顶级注解 通过操作

    12210

    PHP语言表达式库ExpressionLanguage

    表达语言如何帮助我? 该组件目的是允许用户在配置中使用表达式来实现更复杂逻辑。例如:Symfony Framework 在安全性、验证规则和路由匹配中使用表达式。...沙箱,并且不太容易受到外部注入影响,因为您必须声明表达式中哪些变量可用(但您仍然应该清理最终用户提供并传递给表达式任何数据)。...Lint(语法检查) 在 symfony/expression-language 中,并没有直接提供名为 lint 方法来进行语法检查。...但是,你可以通过尝试解析表达式并捕获可能抛出异常来检查表达式语法是否正确。 <?php require '.....对象及其属性 Symfony表达式非常强大,它可以在表达式语言中拦截PHP对象及其属性。 <?

    28010

    【译】关于Rust模块清晰解释

    由于Rust模块系统比较独特,我希望读者以开放性思维来进行阅读,并且尽量不要将其与其他语言模块工作方式进行比较。...这是因为我们需要地在Rust中构建模块树——在文件系统树和模块树之间不存在隐转换。 我们需要地在Rust中构建模块树——在文件系统树和模块树之间不存在隐转换。...我们不需要地导入或声明任何东西来使用依赖项。 外部依赖对于项目内所有模块都是可以访问 例如,比如说我们在项目中添加了rand[1]这个crate。...("health_route"); } 总结 模块系统是(译者注:需要明确声明)——不存在和文件系统1:1映射 我们在一个文件父级目录把它声明为模块,而不是在文件自身...mod关键字用于声明子模块 我们需要地将函数、结构体等声明为公开,这样它们才可以被其他模块访问 pub关键字把事物声明为公开 use关键字用于简化(缩短

    31150

    基于Vue2.x前端架构,我们是这么做

    $route.path // 检查是否完全匹配 let fullMatch = navList.find((item) => { return item.router...=== path }) // 没有则检查是否部分匹配 if (!...接口请求 接口请求使用是axios,但是会做一些基础配置、拦截请求和响应,因为还是一些场景需要直接使用配置axios,所以我们默认创建一个新实例,先安装: npm install axios 然后新建一个...我们总体思路是,多语言源数据在/src/i18n/下,然后编译成json文件放到项目的/public/i18n/目录下,页面的初始默认语言也是和用户信息接口一起返回,页面根据默认语言类型使用ajax...,所以打包时候也需要对它们进行编译,要通过Babel转译一个依赖,可以在这个transpileDependencies选项配置,修改vue.config.js: module.exports =

    1.6K20

    这 5 个 VSCode 扩展提高你开发效率

    3. i18n Ally 几个月前,我开始使用i18n,不得不说它使我网络应用本地化为多种语言变得异常容易。唯一困难是,无法在实际处理文件中编辑翻译。...i18n Ally为我们提供了基本语言文本内联预览,允许咱们创建新键,查看现有键,并直接从模板中编辑它们。 地址:https://marketplace.visualstu... ? ?...Code Spell Checker Code Spell Checker 强烈推荐,对大部分非英语母语又不想写出四不像变量名程序员来说,正确识记拼写各种单词还是不小挑战,比模棱两时需要去查在线词典不同是...,这款插件能实时识别单词拼写是否有误,并给出提示,不少 bug 都是因为拼写错误导致。...如果你没有,现在就安装它,让你在长长文件和文件夹列表中找到你要找东西速度快十倍。它为每种文件类型添加独特图标使文件搜索变得直观而简单。 ? 写在最后,希望这5个扩展能对你有所帮助。

    1.5K40

    这 5 个 VSCode 扩展提高你开发兴趣

    image.png 3. i18n Ally 几个月前,我开始使用i18n,不得不说它使我网络应用本地化为多种语言变得异常容易。唯一困难是,无法在实际处理文件中编辑翻译。...i18n Ally为我们提供了基本语言文本内联预览,允许咱们创建新键,查看现有键,并直接从模板中编辑它们。 地址:https://marketplace.visualstu......Code Spell Checker Code Spell Checker 强烈推荐,对大部分非英语母语又不想写出四不像变量名程序员来说,正确识记拼写各种单词还是不小挑战,比模棱两时需要去查在线词典不同是...,这款插件能实时识别单词拼写是否有误,并给出提示,不少 bug 都是因为拼写错误导致。...image.png 写在最后,希望这5个扩展能对你有所帮助。

    1K40

    spring中Bean (@Bean、@Configuration和@TestConfiguration)

    理解这个对象需要换一种角度,即可将spring看做一门编程语言,@Bean是spring语言声明对象标识。...一般为需要类都添加注解。 能产生Bean注解: (这些注解产生Bean各有不同,参考文末资料。)...创建应用对象之间协作关系行为称为装配。也就是说当一个类A属性中声明了另一个类B对象,A实例化时,需要为A属性B进行实例化。这就是装配。 自动转配会自动将对象属性实例化。...两种自动装配注解 自动装配注解: (这些注解装配功能各有不同,参考文末资料。)...另一种直接使用@Autowired注解声明,不能对声明对象自定义操作,即B中属性testValue初始化,方式如下: // Class A public class A { @Autowired

    1.9K20

    PHP中常用七大框架优点与缺点

    采用面向对象开发结构和MVC模式,对struts标签库实现进行了仿真。...从 MVC,DAO/ActiveRecord,widgets,caching,等级RBAC,Web服务,到主题化,I18N和L10N,Yii提供了 今日Web 2.0应用开发所需要几乎一切功能。...,Zend Framework野心是可以预见,想把其他框架挤走,同时封装很多强大类库,能够提供一站框架服务,并且他们开发团队很强大,完全足够能力开发很强大产品出来,所以基本可以确定是Zend...同样,Zend Framework架构本身也是比较优雅,说明Zend官方是很多高手,设计理念上比较先进,虽然一些功能实现不够完善,比如View层,自动化脚本等等,这些都有赖于未来升级 六、...、Thinkphp 3.大型重量级项目:Yii、Symfony、Laravel 以上划分也不绝对,在项目选型时候,要充分考虑框架可以定制性、扩展性,因为每个项目都无法确定你是否会随着需求变化进行改变

    3.6K40

    前端国际化:语言包篇

    小程序语言声明: registerBundles({ zh: require('@wakeapp/login-sdk/i18n/zh.tr'), 'zh-Hant': require('@wakeapp...根据资源类型选择不同Loader(加载器)进行处理。比如 HTTP Loader、Promise Loader 当所有语言包加载就绪后,将所有结果合并成一棵树,返回给 i18n。...] 语言包加载失败`, err); } finally { this.executing = false; queue.flushResolve(); // 判断是否...比如: 能够在编辑器回 key 对应中文 能够点击跳转到 key 定义语言包 能够分析语言是否被引用、有没有重复、缺译情况 支持 key 重命名(重构) 能自动发现文本硬编码,并支持提取 支持机器翻译...如果无法你发现 i18n ally 插件没有启用,那大概率就是它检测失败了, 可以在 OUTPUT Panel 下看日志: 解决办法就是告诉它: // .vscode/setting.json

    1.4K30

    Spring Boot 2.0-WebFlux framework

    例如,当HTTP连接太慢时,从数据库延伸到HTTP响应反应组件流水线、数据存储库也可以减慢或停止,直到网络容量释放。 响应编程也导致从命令声明异步组合逻辑重大转变。...让我们在我们路由中添加一个简单安全过滤器,假设我们一个 SecurityManager 可以确定是否允许特定路径: SecurityManager securityManager = ......例如,返回 Flux REST端点将默认序列化如下: application/json : Flux 作为异步集合处理,并在完成事件发布时将其序列化为具有刷新JSON数组。...application/stream+json : 一个 Flux 将作为一系列 Account 元素处理,作为以新行分隔单个JSON对象,并在每个元素之后刷新。...text/event-stream : 一个 Flux 或 Flux> 将作为一个 Stream 或 ServerSentEvent 元素流处理,作为单独 SSE 元素,使用默认JSON进行数据编码和每个元素之间刷新

    3.1K50

    为什么需要在 JavaScript 中使用顶层 await?

    作为一门非常灵活和强大语言,JavaScript 对现代 web 产生了深远影响。它之所以能够在 web 开发中占据主导地位,其中一个主要原因就是频繁更新所带来持续改进。...根据提案说法,“这种模式不良影响在于,它要求对相关数据进行大规模重构以使用动态模式;同时,它将模块大部分内容放在 .then() 回调函数中,以使用动态导入。...从静态分析、测试性、工程学以及其它角度来讲,这种做法相比 ES2015 模块化来说是一种显而易见倒退”。 顶层 Await 是如何解决上述问题?...与之前提及解决方案相比,这个方法要简洁得多。 注意 必须注意是,顶层 await 只在 ES 模块中生效。此外,你必须要声明模块之间依赖关系,才能让顶层 await 像预期那样生效。...依赖后备方案 下面的例子展示了如何用顶层 await 去加载带有后备方案依赖。如果 CDN A 无法导入 jQuery,那么会尝试从 CDN B 中导入。

    2.1K21

    深入理解Spring框架中声明事务管理

    什么是声明事务管理 声明事务管理是一种将事务管理从业务代码中分离出来方法,它允许你通过注解或XML配置方式来管理事务,而不是在代码中地开始和结束事务。...声明事务管理与编程式事务管理比较 编程式事务管理: 通过在代码中地调用事务API来控制事务 优点:提供了更高灵活性,可以在运行时根据需要动态地管理事务。...以下是一些常用事务属性: propagation:定义事务传播行为,例如是否需要新事务、是否加入到现有事务中等。 isolation:设置事务隔离级别,如读提交、读已提交、重复读或串行化。...当注解在类上时,该类所有公共方法都会被视为需要进行事务管理方法。当注解在方法上时,只有该方法需要进行事务管理。此外,@Transactional注解还可以设置事务属性,如传播行为、隔离级别等。...对于检查型异常(Checked Exception),需要地指定回滚规则。这可能导致在某些情况下无法正确回滚事务。 事务传播行为:声明事务管理事务传播行为有时可能不符合预期。

    22610

    对于云原生时代后端业务开发和项目系统学习,选Go Or Java?

    在 Go 中,我们可以进行指针传递或值传递。Go 结构体可以将函数作为字段。所有这些都让 Go 反射变得更加复杂。 访问性。...此外,你可以在结构体中嵌入结构体,但内部结构体无法访问外部结构体数据和方法。Go 使用组合而不是继承将一些行为和数据组合在一起。 Go 是一种命令语言,Java 是一种声明语言。...这非常有用,作为代码库调用端,你可以定义外部库结构体所需任意接口。而在 Java 中,对象必须声明实现了哪些接口。...这是有道理,因为 Go 不是声明,并且代码里不应该包含任何“魔法”。我喜欢在 Java 中使用注解,因为它们让代码更优雅、简单和简约。...Java Maven 和 Gradle 之类声明工具,用来进行依赖关系管理,也用于构建、部署和处理其他 CD/CI 任务。

    24210

    理解Go中零值

    在 Go 语言中,零值(Zero Value)是指在声明变量但没有赋值情况下,变量会被自动赋予一个默认值。这个默认值取决于变量类型,不同类型变量会有不同零值。...零值是 Go 语言一个重要概念,因为它确保了变量在声明后具有一个预测初始状态,减少了初始化变量引发问题。以下是一些常见类型零值和关于零值详细信息:1....零值在 Go 语言中是一种有用特性,因为它确保了变量在声明后处于预测初始状态,而不会包含随机或未知值。这有助于避免潜在错误和增加代码可读性。...要注意是,零值只在声明变量但未初始化时才会生效。如果你初始化一个变量,那么它将采用你提供值而不是零值。...零值:零值是指在声明变量但未赋值时,变量会自动被赋予一个默认值。不同类型变量具有不同零值,例如整数零值是 0,字符串零值是空字符串 ""。

    49740
    领券