背景 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 { 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_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
注意:如果翻译键值与公共翻译处冲突,则以单独的翻译文件为准。