多語言與多時區的解決方案

Double-Jin發表於2019-06-06

在海外專案中都會遇到的多語言(多面外一個國家就要多一個語言)和時區(伺服器時間與客戶端時間不一致)的問題,記錄一下解決方案,本文只針對服務端,前端思路與服務端一致

提示類

提示類的文字要用到多語言包的切換,下面寫下在laravel的建立流程

  1. 新建語言中介軟體使用命令: artisan make:middleware lang 生成中介軟體:

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class lang
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
    
            if ($request->input('lang')) {
                \App::setLocale($request->input('lang'));
            }else{
                   \App::setLocale('en');
            }
    
            return $next($request);
    
        }
    }
  2. 在Kernel中註冊新新增的中間區
    protected $routeMiddleware = [
        'lang' => \App\Http\Middleware\lang::class,
    ];
  3. 在路由檔案中要用麼多語言的url繫結上lang中介軟體
    Route::middleware(['lang'])->group(function(){
        Route::post('login', 'User\LoginController@login');
    });

    4.管理對應的語言包

多語言與多時區的解決方案

5.使用trans函式呼叫當前語言的語言包
trans('message.success')

文章類

當一個文字或標題有多個語言的時候,常見的解決方案是每一種語言的標題都給一個輸入框填寫,然後跟據當前裝置的語言返回對應語言的標題或文字

在資料儲存中會記錄當前日期,保當前的日期是按照當前系統設定的時間生成的,比說laravel預設的是UTC,但某國的時區和UTC差了3個小時,你返回UTC的時期給這個國家的使用者明顯就錯了

  1. composer Carbon包,laravel已自帶,跳過這一步

    composer require nesbot/carbon

    2.寫一個日期轉換的函式

    /**
    * 時區轉換
    * @param $date date 轉換時間
    * @param $nowTimezone string 當前時區
    * @param $transitionTimezone string 轉換時區
    */
    function timezoneTransition($date,$nowTimezone,$transitionTimezone){
    
    $date = date('Y-m-d H:i:s',strtotime($date));
    
    $date = Carbon::createFromFormat('Y-m-d H:i:s', $date, $nowTimezone)->setTimezone($transitionTimezone)->toDateTimeString();
    
    return $date
    }

三號流水線低階開發者,苦力小林

相關文章