前回に作成したLaravelの日本語のリポジトリ(Laravel 5.4)。今回はその作成の仕方を説明します。ほとんどは、Laravel 5.3のときと同じですが、いくつか違いがあります。
コマンドの実行
まずは、以下のcomposerのコマンドを実行します。
composer create-project --prefer-dist laravel/laravel larajapan "5.4.*"
上で使用されているコマンドの引数は、
--prefer-dist laravel/laravel
https://packagist.org/packages/laravel/laravelからパッケージをダウンロードすることを指示します。
larajapan
パッケージのダウンロード先。その名前でディレクトリを作成します。このディレクトリ名は、先のコマンドラインで違う名前を指定可能であるし、実行完了してから改名も可能です。
5.4.*
パッケージのバージョンを指定。ここでは、laravelの5.4を使用します。マイナーバージョンを指定したいなら、5.4.36のように指定します。
実行すると、パッケージに含まれるファイル、さらにパッケージが依存するパッケージのファイルが多数ダウンロードされ少々時間がかかります。
最終的には、実行したディレクトリのもとにlarajapanのディレクトリが作成され、ダウンロードされたファイルが収納されます。
larajapan ├── app/ ├── bootstrap/ ├── config/ ├── database/ ├── public/ ├── resources/ ├── routes/ ├── storage/ ├── tests/ ├── vendor/ ├── artisan ├── composer.json ├── composer.lock ├── package.json ├── phpunit.xml ├── readme.md ├── server.php └── webpack.mix.js
*5.3と違いgulpfile.jsの代わりにwebpack.mix.jsがあります。asset(sassやjs)のコンパイルは、gulpでなくwebpackを使用したlaravel-mixに変わったからです。
次に、ユーザー認証のためのファイル作成を以下の実行で行います。
php artisan make:auth
この実行により、resources/viewsのディレクトリにおいて、すでにインストールされている以下のコントローラで使用されるbladeファイルが作成されます。
app/Http/Controllers ├── Auth/ │ ├── ForgotPasswordController.php(パスワードのリセットのリンク送信画面) │ ├── LoginController.php(ログイン画面) │ ├── RegisterController.php(会員登録画面) │ └── ResetPasswordController.php(パスワードリセット画面) ├── Controller.php └── HomeController.php(ログイン後のホーム画面)
最後に以下のコマンドを実行して、先のパスワードのリセットのリンク送信画面から発行されるEメールので使用されるHTMLのテンプレートを作成作成します。
php artisan vendor:publish
日本語化
さて、ここからが日本語化の作業です。
まず、config/app.phpの編集から。
...
'timezone' => 'UTC',
'locale' => 'en',
...
を
...
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
...
と変えて保存します。
timezone
これは、通常、プログラム内の日時設定のタイムゾーンとして使用されるもので、PHPの以下の関数で使用されます。
ここで設定すれば、後はLaravelが面倒みてくれます。
日本時間の場合は、Aisa/Tokyoの設定だけで十分。
locale
resources/langで言語のファイルが以下のように存在します。これらは、Laravelのプロジェクトでバリデーションのエラーメッセージなどを定義しています。
resources/lang
└── en/
├── auth.php
├── pagination.php
├── passwords.php
└── validation.php
デフォルトの設定では、英語のenのディレクトリしかありません。日本語の翻訳を作成するには、上で設定したjaと同じ名前のディレクトリをそこに作成します。以下の実行でディレクトリごとコピーしてください。
$ cp -pr en ja
バリデーションに関しては、見米氏のバリデーション(1)Validatorファサードのextend を参照してください。
今回は、新しく追加されたバリデーションの以下のエントリーもあります。
after_or_equal
before_or_equal
次は、ユーザー認証画面などで使用されるブレードファイルの翻訳です。
私のLaravelの日本語レポジトリでは、以下は、すべて翻訳してあります。
resources/views ├── auth │ ├── login.blade.php │ ├── passwords │ │ ├── email.blade.php │ │ └── reset.blade.php │ └── register.blade.php ├── errors │ └── 404.blade.php ├── home.blade.php ├── layouts │ └── app.blade.php ├── vendor │ ├── mail │ │ ├── html │ │ │ ├── button.blade.php │ │ │ ├── footer.blade.php │ │ │ ├── header.blade.php │ │ │ ├── layout.blade.php │ │ │ ├── message.blade.php │ │ │ ├── panel.blade.php │ │ │ ├── promotion │ │ │ │ └── button.blade.php │ │ │ ├── promotion.blade.php │ │ │ ├── subcopy.blade.php │ │ │ ├── table.blade.php │ │ │ └── themes │ │ │ └── default.css │ │ └── markdown │ │ ├── button.blade.php │ │ ├── footer.blade.php │ │ ├── header.blade.php │ │ ├── layout.blade.php │ │ ├── message.blade.php │ │ ├── panel.blade.php │ │ ├── promotion │ │ │ └── button.blade.php │ │ ├── promotion.blade.php │ │ ├── subcopy.blade.php │ │ └── table.blade.php │ ├── notifications │ │ └── email.blade.php │ └── pagination │ ├── bootstrap-4.blade.php │ ├── default.blade.php │ ├── simple-bootstrap-4.blade.php │ └── simple-default.blade.php └── welcome.blade.php
5.3と違い、errorsのフォルダーは作成されていませんでしたので追加しました。また、vendor/mailのフォルダーは新規のもので、HTMLだけでなくマークダウンも対応しています。
パスワードリセットで送信されるEメールの翻訳
ここまで来ても、残念ながら、パスワードを忘れたときに送信される、パスワードリセットを含むEメールの内容がまだ翻訳されていません。なぜなら、本文がハードコードされているからです。
これはちょっと頭をひねりましたが、多分以下が最小の変更で対応できると思います。
まず、
vendor/laravel/framework/src/Illuminate/AuthのディレクトリからResetPassword.phpとCanResetPassword.phpのファイルを以下の場所にコピーします。
app/Auth
├── Notifications/
│ └── ResetPassword.php
└── Passwords/
└── CanResetPassword.php
次に、以下のようにファイルを編集します。app/User.phpのファイルも変更必要です。
namespace App\Auth\Notifications;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
class ResetPassword extends Notification
{
...
/**
* Build the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->subject('パスワードリセット')
->greeting('パスワードリセット')
->line('パスワードリセットリンクの送信のリクエストがありました。')
->action('リセットパスワード', url(config('app.url').route('password.reset', $this->token, false)))
->line('リクエストされていなかったら、無視してください。');
}
}
namespace App\Auth\Passwords;
use App\Auth\Notifications\ResetPassword as ResetPasswordNotification;
trait CanResetPassword
{
/**
* Get the e-mail address where password reset links are sent.
*
* @return string
*/
public function getEmailForPasswordReset()
{
return $this->email;
}
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}
}
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Auth\Passwords\CanResetPassword;
class User extends Authenticatable
{
use Notifiable;
use CanResetPassword;
...
認証のroutesの設定
日本語化とは関係ないですが、私がこうした方がわかりやすいと思ったことです。
オリジナルのroutes.phpは、
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index');
とシンプルですが、Auth::routes()で認証のrouteが隠されてしまって不透明。
ということで、私のLaravelの日本語レポジトリでは、以下のように編集しました。
// 以下は、Auth::routes()の中身を移したもの。将来において変更が可能なように
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
Route::get('/home', 'HomeController@index');
その他
インストールにおいて経験した問題として、
php artisan migrate
を実行したときに、以下のエラーとなりました。
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
これは、使用しているデータベースがMariaDBで10.2.2のバージョンより古いか、あるいはMySQLで5.7.7より古いときに起こるエラーです。Laravelは5.4より、絵文字対応のutf8mb4のエンコーディングがデフォルトとなりました。
古いバージョンを使用する場合(大半がそうでは?)は、以下の変更が必要となります。日本語のレポにはこの変更が含まれています。
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
メルマガ購読の申し込みはこちらから。
