侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

laravel-admin根据路由自动切换语言包流程步骤

Laravel  /  管理员 发布于 5年前   576

laravel 的本地化功能提供了一种方便的方法来检索各种语言的字符串,从而可以轻松的在应用内支持多种语言,我们一般将语言文件存放在 lang 目录下,随后使用 __ 辅助函数从语言文件检索翻译字符串。同样,laravel-admin 也使用这种方式来实现本地化,但这个目录是公共翻译路径,如果同一个键在不同控制器翻译的结果不一致 [^1] 情况,将翻译内容直接放置在 lang 就会造成一定的歧义 [^2]

为了解决此问题,本文介绍根据控制器来区分不同的翻译文件


代码部分

app\Admin\Middleware\SwitchLanguage.php
<?php
namespace App\Admin\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Str;
class SwitchLanguage
{
    /**
     * 根据路由自动切换语言包
     *
     * @param \Illuminate\Http\Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $multi_language = config('admin.multi_language');
        $languages = $multi_language['languages'];
        $current = $multi_language['default'];
        $cookie_name = $multi_language['cookie_name'];
        $cookie_language = Cookie::get($cookie_name);
        if (!$cookie_language || !array_key_exists($cookie_language, $languages)) {
            $cookie_language = $current;
        }
        App::setLocale($cookie_language);
        $controller_name = get_class($request->route()->controller);
        if (strtolower(substr($controller_name, -10)) === 'controller' and Str::startsWith($controller_name, 'App\\Admin\\Controllers\\')) {
            $controller_name = str_replace('App\\Admin\\Controllers\\', '', $controller_name);
            $controller_name = substr($controller_name, 0, strlen($controller_name) - 10);
            $translator_path = config('admin.multi_language.lang_directory') . str_replace('\\', DIRECTORY_SEPARATOR, $controller_name . DIRECTORY_SEPARATOR);
            app('translator')->addJsonPath($translator_path);
        }
        return $next($request);
    }
}

config/admin.php 新增如下配置:

'multi_language' => [
    // 指定语言文件目录
    'lang_directory' => resource_path('langext') . DIRECTORY_SEPARATOR,
    // 支持的语言
    'languages' => [
        'en' => 'English',
        'zh_CN' => '简体中文',
    ],
    // 默认语言
    'default' => 'zh_CN',
    // cookie键,用于记住用户语言
    'cookie_name' => 'backend_locale',
],

然后在 config/admin.php 中添加该中间件:

'route' => [
    'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'),
    'namespace' => 'App\\Admin\\Controllers',
-   'middleware' => ['web', 'admin'],
+   'middleware' => ['web', 'admin', \App\Admin\Middleware\SwitchLanguage::class],
],

随后在 resources/langext/控制器名/区域名/xxx.json 中新增翻译内容即可,例如给 ProductsController 创建单独翻译文件,则翻译文件路径为

resources/langext/Products/zh_CN/zh_CN.json

注意:如果翻译键值与公共翻译处冲突,则以单独的翻译文件为准。


[^1]: 例如 __('Name') 在 UsersController 中需要翻译为 用户姓名,而在 TagsController 中需要翻译为 标签名,或者同一翻译键在前台用户端与后台翻译结果不同

[^2]: 一般使用 laravel-admin 时,一般使用 

php artisan admin:make UsersController --model=App\\Models\\User 

来生成控制器,该命令默认会将数据库字段名作为翻译键


  • 上一条:
    Perl集群配置管理系统Rex简明手册
    下一条:
    Lua之wrap函数用法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客