Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Laravel多语言路由头疼?codezero/laravel-localized-routes助你优雅实现国际化_创想鸟

Laravel多语言路由头疼?codezero/laravel-localized-routes助你优雅实现国际化

laravel多语言路由头疼?codezero/laravel-localized-routes助你优雅实现国际化

Composer在线学习地址:学习地址

国际化应用中的路由之痛

想象一下,你正在构建一个面向全球用户的 Laravel 网站。你的网站需要支持英语、法语、德语等多种语言。这意味着,对于同一个页面,比如“关于我们”,你可能需要这样的 URL:

/en/about-us/fr/a-propos/de/ueber-uns

如果你的应用中有几十个甚至上百个页面,每个页面都需要为每种语言定义一套路由,那么你的 routes/web.php 文件很快就会变得像一团乱麻。手动管理这些路由不仅效率低下,还容易出现以下问题:

代码重复与臃肿: 为每种语言复制粘贴相似的路由定义。URL 生成复杂: 在视图或控制器中生成特定语言的 URL 时,需要手动拼接语言前缀,或者使用复杂的条件判断。路由参数翻译: 如果路由中包含像 posts/{post:slug} 这样的参数,而 slug 本身也需要根据语言进行翻译,那处理起来更是麻烦。404 页面本地化: 当用户访问不存在的页面时,如何确保 404 页面也是当前语言的?维护成本高: 增加或删除一种语言,或者修改某个路由,都需要改动大量文件。

这些问题让我在国际化开发的道路上举步维艰,直到我遇到了 codezero/laravel-localized-routes

遇见救星:codezero/laravel-localized-routes

codezero/laravel-localized-routes 是一个专为 Laravel 设计的 Composer 包,它提供了一种优雅且便捷的方式来设置、管理和使用本地化路由。它将多语言路由的复杂性封装起来,让你能够以更简洁、更直观的方式定义和使用路由。

它的核心理念是:你只需定义一次路由,这个包就会自动为所有支持的语言生成对应的本地化路由,并处理好语言前缀、域名甚至路由参数的翻译。

如何使用 Composer 解决问题?

首先,我们通过 Composer 将这个强大的工具引入到我们的项目中:

composer require codezero/laravel-localized-routes

安装完成后,Laravel 会自动注册其 ServiceProvider。接下来,我们需要进行一些简单的配置。

1. 发布配置文件

运行以下命令发布其配置文件,你会在 config/localized-routes.php 找到它:

php artisan vendor:publish --provider="CodeZeroLocalizedRoutesLocalizedRoutesServiceProvider" --tag="config"

2. 配置支持的语言环境

config/localized-routes.php 中,你可以定义你的应用支持哪些语言。这非常灵活:

简单语言前缀:

// config/localized-routes.php'supported_locales' => ['en', 'nl', 'fr'],

这会将 /en/about/nl/about 等作为路由前缀。

自定义语言 Slug:

如果你想让语言前缀更具描述性,或者与语言代码不同:

'supported_locales' => [    'en' => 'english-slug',    'nl' => 'dutch-slug',],

自定义域名:

对于更复杂的国际化策略,你甚至可以为每种语言指定独立的域名:

'supported_locales' => [    'en' => 'english-domain.test',    'nl' => 'dutch-domain.test',],

主语言省略 Slug:

为了让主语言的 URL 更简洁,你可以配置省略其语言前缀:

'omitted_locale' => 'en', // 英语路由将没有 /en 前缀

这样,en.example.com/about 就会变成 example.com/about

3. 添加中间件自动更新应用语言环境

为了让 Laravel 应用的语言环境(App::getLocale())根据 URL 自动切换,你需要注册 SetLocale 中间件。请确保它在 StartSession 之后,SubstituteBindings 之前运行,这对于路由模型绑定中的本地化参数解析至关重要。

Laravel 11 及更高版本:

// bootstrap/app.php->withMiddleware(function (Middleware $middleware) {    $middleware->web(remove: [        IlluminateRoutingMiddlewareSubstituteBindings::class,    ]);    $middleware->web(append: [        CodeZeroLocalizedRoutesMiddlewareSetLocale::class,        IlluminateRoutingMiddlewareSubstituteBindings::class,    ]);})

Laravel 10:

// app/Http/Kernel.phpprotected $middlewareGroups = [    'web' => [        //...        IlluminateSessionMiddlewareStartSession::class, // <= 在此之后        //...        CodeZeroLocalizedRoutesMiddlewareSetLocale::class,        IlluminateRoutingMiddlewareSubstituteBindings::class, // <= 在此之前    ],];

4. 注册本地化路由

现在,最核心的部分来了。你只需将路由定义放在 Route::localized() 闭包中,该包就会自动为每种支持的语言注册相应的路由:

// routes/web.phpuse AppHttpControllersAboutController;Route::localized(function () {    Route::get('about', [AboutController::class, 'index'])->name('about');});

有了这个简单的定义,如果你的 supported_locales['en', 'nl'],并且 omitted_localeen,那么它会自动生成:

/about (en.about)/nl/about (nl.about)

这大大减少了路由文件的重复代码!

5. 翻译路由参数(Route Model Binding)

如果你的路由参数也需要本地化,比如 posts/{post:slug},其中 slug 是多语言的,你需要在模型中重写 resolveRouteBinding 方法:

// AppModelsPost.phpuse IlluminateSupportFacadesApp;class Post extends Model{    public function resolveRouteBinding($value, $field = null)    {        $field = $field ?: $this->getRouteKeyName();        if ($field === 'slug') {            // 假设你的 slug 存储在 JSON 字段中,例如 ['en' => 'my-post', 'nl' => 'mijn-bericht']            $field .= '->' . App::getLocale();        }        return $this->where($field, $value)->firstOrFail();    }}

这样,当访问 /en/posts/my-post/nl/posts/mijn-bericht 时,Laravel 就能正确解析到对应的 Post 模型。

6. 翻译硬编码的 URI Slugs

对于像 about/us 这样硬编码的 URI 段,你可能希望它们也能被翻译(例如 over/ons)。这个包集成了 codezero/laravel-uri-translator,提供了 Lang::uri() 宏:

首先,创建语言文件来存储路由翻译:

// lang/nl/routes.phpreturn [    'about' => 'over',    'us' => 'ons',];

然后,在路由定义中使用它:

use AppHttpControllersAboutController;use IlluminateSupportFacadesLang;Route::localized(function () {    Route::get(Lang::uri('about/us'), [AboutController::class, 'index'])->name('about');});

现在,en.about 可能是 /about/us,而 nl.about 就会是 /nl/over/ons

7. 生成本地化 URL

生成 URL 也变得非常简单和智能:

生成当前语言的 URL:

$url = route('about'); // 如果当前语言是 'en' 且省略了前缀,则返回 '/about'

生成特定语言的 URL:

Laravel 的 route() 助手函数被扩展,支持额外的语言参数:

$url = route('about', [], true, 'nl'); // 返回 '/nl/about'

生成当前路由的本地化版本(非常适合语言切换器):

Route::localizedUrl() 宏能自动识别当前路由和参数,并生成指定语言的 URL:

// 假设当前路由是 /en/posts/my-post$enUrl = Route::localizedUrl('en'); // /posts/my-post$nlUrl = Route::localizedUrl('nl'); // /nl/posts/mijn-bericht// 如果路由有多个参数,模型可以实现 ProvidesRouteParameters 接口// 从 getRouteParameters() 方法返回参数值。

这使得构建语言切换器变得异常简单:

@if (Route::isLocalized() || Route::isFallback())    @endif

8. 本地化 404 页面和自动重定向

为了确保 404 页面也是本地化的,并且可以将非本地化 URL 自动重定向到其本地化版本,你可以在 routes/web.php 的末尾注册一个回退路由:

// routes/web.phpRoute::fallback(CodeZeroLocalizedRoutesControllersFallbackController::class);

并在配置文件中开启自动重定向:

// config/localized-routes.php'redirect_to_localized_urls' => true,

这样,如果用户访问 /about-us (非本地化 URL),它会根据当前语言环境自动重定向到 /en/about-us/nl/about-us

优势与实际应用效果

使用 codezero/laravel-localized-routes 之后,我的开发体验得到了显著提升:

极简的路由定义: 告别了为每种语言重复定义路由的噩梦,routes/web.php 变得干净整洁。自动化的语言切换: 中间件自动处理语言环境的检测和设置,无需手动干预。智能的 URL 生成: route() 助手函数和 Route::localizedUrl() 宏让生成特定语言的 URL 变得轻而易举,尤其在构建语言切换器时,效率倍增。无缝的路由参数本地化: 通过模型绑定和 URI 翻译,轻松处理多语言的路由参数和 URI 段。更好的用户体验和 SEO: 统一且友好的多语言 URL 结构,有助于提升用户体验和搜索引擎优化。降低维护成本: 增删语言或修改路由,只需改动少数地方,大大减少了出错的可能性。

这个包让 Laravel 的国际化路由管理从一个令人头疼的难题,变成了一个优雅且高效的解决方案。如果你正在开发一个多语言的 Laravel 应用,我强烈推荐你尝试一下 codezero/laravel-localized-routes,它绝对能让你的开发工作事半功倍!

以上就是Laravel多语言路由头疼?codezero/laravel-localized-routes助你优雅实现国际化的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/136352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
linux whereis命令怎么用
上一篇 2025年11月29日 22:43:19
win10远程未成功提示由于以下原因无法连接怎么办
下一篇 2025年11月29日 22:46:22

相关推荐

  • google浏览器CPU占用率过高怎么解决_google浏览器CPU占用过高解决方法

    Chrome CPU占用过高可通过清除缓存、禁用高耗能扩展、结束高占用进程、更新浏览器、关闭硬件加速及禁用Software Reporter Tool解决。 如果您在使用Google Chrome浏览器时发现电脑运行缓慢或风扇狂转,很可能是由于Chrome的CPU占用率过高导致系统资源被大量消耗。以…

    2026年9月21日
    000
  • win11任务管理器打不开怎么办_win11任务管理器无法打开修复方法

    1、使用SFC和DISM命令修复系统文件后重启;2、通过gpedit.msc检查并禁用“删除任务管理器”策略;3、在注册表中将DisableTaskMgr值设为0;4、创建新用户账户测试是否解决任务管理器无法打开问题。 如果您尝试打开任务管理器时没有响应或无法启动,可能是由于系统文件损坏、组策略设置…

    2026年9月21日
    000
  • VSCode报错怎么显示中文_VSCode错误信息本地化与中文显示教程

    安装中文语言包可将VSCode界面和错误提示转为中文,提升使用便捷性;但外部工具如编译器、解释器生成的报错仍为英文,因VSCode仅显示其原始输出,无法翻译。 在VSCode中让报错信息显示中文,核心在于安装并启用官方的中文(简体)语言包。这不仅仅是针对错误信息,而是将整个VSCode的用户界面本地…

    2026年9月21日
    000
  • 如何在MindSpore中训练AI大模型?华为AI框架的训练教程

    如何在MindSpore中训练AI大模型?华为AI框架的训练教程如何在MindSpore中训练AI大模型?华为AI框架的训练教程如何在MindSpore中训练AI大模型?华为AI框架的训练教程如何在MindSpore中训练AI大模型?华为AI框架的训练教程

    答案:MindSpore通过自动并行、混合精度、优化器状态分片等技术,结合Profiler工具调试性能瓶颈,实现大模型高效分布式训练。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在MindSpore中训练AI大模型,核心在于巧妙地利用其…

    2026年9月21日 用户投稿
    300
  • 使用Laravel进行微服务开发:构建可扩展的分布式系统

    使用Laravel进行微服务开发:构建可扩展的分布式系统 引言:在当今互联网时代,微服务架构已经成为了一种广泛应用的解决方案。而Laravel作为一种流行的PHP框架,提供了许多功能强大且易于使用的工具,使得开发人员能够轻松构建可扩展的分布式系统。本文将指导您如何使用Laravel进行微服务开发,并…

    2026年9月21日
    000
  • MySQL数据库如何支持多租户业务_设计策略与实现?

    MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?

    mysql 支持多租户架构的关键在于选择合适的数据隔离策略,并兼顾性能与运维管理。1. 常见方式包括共享数据库共享表(资源利用率高但隔离性差)、共享数据库独立表(平衡隔离性与维护成本)和独立数据库(隔离性强但管理复杂)。2. 租户识别需在请求前确定租户id,并自动附加到sql查询中,可通过视图或中间…

    2026年9月21日 用户投稿
    000
  • VSCode怎么启动Layui项目_VSCode运行Layui前端框架项目教程

    必须使用本地服务器运行Layui项目,因为直接打开HTML文件通过file://协议会受浏览器安全限制,导致AJAX、跨域等功能异常,Layui组件无法正常加载;推荐安装Node.js后使用npm全局安装http-server,通过命令行启动服务,或在VSCode中安装Live Server插件,右…

    2026年9月21日
    000
  • 俄罗斯Яндекс账号登录入口 Yandex电脑版官方网站登录

    答案是https://www.yandex.com/。该网站提供搜索、地图、新闻、翻译等服务,界面简洁,支持个性化设置与账户同步,并拥有邮箱、云存储及丰富的应用生态。 1、立即进入“☞☞☞☞点击俄罗斯yandex搜索引擎入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击快速获取Yandex免登录官网链接☜…

    2026年9月21日
    000
  • Steam游戏平台下载缓存怎么清理_Steam清理下载缓存的方法

    清理Steam下载缓存可解决下载慢、中断或安装失败问题。首先可通过客户端设置中的“清除下载缓存”功能操作,随后重新登录账户;若无效,可手动删除Steam安装目录下的appcache和depotcache文件夹;此外,重置网络配置并执行netsh winsock reset与ipconfig /flu…

    2026年9月21日
    000
  • 蝴蝶号直播掉帧、断流怎么办?技术实用建议

    蝴蝶号直播掉帧、断流怎么办?技术实用建议蝴蝶号直播掉帧、断流怎么办?技术实用建议蝴蝶号直播掉帧、断流怎么办?技术实用建议蝴蝶号直播掉帧、断流怎么办?技术实用建议

    解决蝴蝶号直播掉帧、断流问题需从硬件、软件、网络三方面入手。1. 硬件方面:检查cpu和gpu压力,必要时升级硬件或降低分辨率、帧率;确保摄像头、采集卡、内存正常工作。2. 软件方面:调整分辨率、帧率、码率至合适水平;使用h.265或硬件编码减轻cpu负担;设置关键帧间隔为2秒;关闭后台程序并检查平…

    2026年9月21日 用户投稿
    300
  • 如何使用Ribbet的AI功能裁剪图片?快速实现精准图像裁剪

    答案:Ribbet的AI裁剪功能可快速智能识别主体并推荐裁剪方案,支持手动微调与多种比例选择,结合亮度、色彩等编辑工具优化效果,适用于制作符合社交媒体尺寸要求的封面图,操作简便且大部分功能免费,适合追求效率的普通用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    400
  • SystemTap

    SystemTap 简介 systemtap 是一款用于诊断 linux 系统性能或功能问题的开源工具。它使得对运行中的 linux 系统进行诊断和调试变得更加便捷和高效。有了 systemtap,开发者和调试人员无需重新编译内核、安装新内核或重启系统等繁琐步骤。为了解决系统问题或提升性能,开发者只…

    2026年9月21日
    100
  • Xdebug性能优化:解决PHP调试器导致页面加载缓慢或超时的问题

    当Xdebug配置不当,即使未主动调试,也可能导致PHP应用页面加载缓慢或超时。本文将深入探讨Xdebug的工作原理,指导如何通过正确配置xdebug.mode、排查多配置文件冲突,并利用Xdebug日志进行诊断,从而有效解决调试器造成的性能瓶颈,确保开发环境的流畅运行。 理解Xdebug的连接机制…

    2026年9月21日
    000
  • Microsoft Teams如何使用快捷键 Microsoft Teams操作效率的提升秘籍

    答案:掌握Microsoft Teams快捷键可提升操作效率。依次介绍聊天窗口、视图切换、通话控制、静音、摄像头、屏幕共享、快速参会、结束会议、消息状态、搜索、换行、命令面板、自定义设置、Tab导航、表情符号及字体调整等快捷操作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年9月21日
    000
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    000
  • win11怎么退回win10系统_win11降级回win10系统操作教程

    可在10天内通过系统恢复功能退回Windows 10,保留文件但卸载新增应用;超期则需用媒体工具或第三方软件重装,后者操作更简便但会清除数据。 如果您最近将系统升级到 Windows 11,但发现使用不习惯或存在兼容性问题,则可以考虑退回至 Windows 10。在特定时间窗口内,Windows 提…

    2026年9月21日
    000
  • MySQL 大型历史数据表结构设计与优化指南

    本文旨在为处理大量客户历史交易数据的MySQL数据库设计提供专业指导。我们将探讨如何构建高效、可扩展的表结构,重点关注主键设计、数据分区、实时数据摄入以及性能优化策略,以确保系统能够稳定支持百万级乃至亿级数据量的查询需求。 MySQL大型历史数据表结构设计与优化 在处理大量历史数据,特别是涉及到多用…

    2026年9月21日
    000
  • 百度极速版如何开启数据同步_百度极速版数据同步的设置方法

    用同一百度账号登录百度极速版是开启数据同步的关键,进入【我的】→【设置】→开启【书签同步】,完成账号绑定后,书签和搜索记录即可在多设备间自动同步。 想在不同设备上无缝使用百度极速版,开启数据同步是关键。只要用同一个百度账号登录,你的书签、搜索记录等信息就能自动保持一致。操作本身不难,主要是找到正确的…

    2026年9月21日
    000
  • MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    处理mysql重复数据的核心步骤是识别并清理,可使用group by或窗口函数定位重复项,再通过分批删除或倒腾法安全清理;sublime text可用于高效生成和编辑sql语句。1. 识别重复数据常用group by+having或row_number()窗口函数;2. 清理策略包括分批删除、使用临…

    2026年9月21日 用户投稿
    100
  • 如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    PyTorch大模型训练需综合运用分布式训练、内存优化与高效计算策略。首先采用DistributedDataParallel实现多GPU并行,配合DistributedSampler确保数据均衡;通过混合精度训练、梯度累积和激活检查点缓解显存压力;使用torch.compile优化模型计算效率;选择…

    2026年9月21日 用户投稿
    100

发表回复

登录后才能评论
关注微信