Slide 1

Slide 1 text

Laravelで作る Webアプリケーションの国際化 Laravel Tokyo LT #1 @fortkle

Slide 2

Slide 2 text

自己紹介 • 高野福晃 – Istyle, inc. – Twitter: @fortkle – Github: fortkle

Slide 3

Slide 3 text

国際化してますか? 英語 韓国語 中国語 http://us.cosme.net/

Slide 4

Slide 4 text

ある日突然、 「国際化しろ」って言われたら?

Slide 5

Slide 5 text

こうならないように少しだけでも 知っておきましょう

Slide 6

Slide 6 text

国際化の必要性 • 日本語だけでなく海外をターゲットにしたWeb サービスが増えてきている – 基本は英語。 – ビジネス的には中国語も。 • 最初の段階から国際化を意識しておくと吉 – 英語に対応するだけでも対象ユーザーがグッと増える – 言語切替ぐらいならそこまで時間はかからない

Slide 7

Slide 7 text

国際化の要素 • 一般的な国際化の対象項目 – 文字コード – 文字の方向性(左から右、右から左など) – 文言 – 書式 • 数値(小数点の文字、桁区切りの文字、区切る桁数など) • 日時(年月日の表記の仕方、イスラム暦/グレゴリオ暦/ユダヤ暦 /和暦など使用する暦の違い、他) – 日時情報の時差 – 通貨情報

Slide 8

Slide 8 text

国際化の要素 • 一般的な国際化の対象項目 – 文字コード – 文字の方向性(左から右、右から左など) – 文言 – 書式 • 数値(小数点の文字、桁区切りの文字、区切る桁数など) • 日時(年月日の表記の仕方、イスラム暦/グレゴリオ暦/ユダヤ暦 /和暦など使用する暦の違い、他) – 日時情報の時差 – 通貨情報 今日はここだけを取り上げます!

Slide 9

Slide 9 text

文言を国際化するには? • 色々あるけど、おすすめの方法は以下の2つ – 1. Laravel標準のLangファサードを使った国際化 – 2. Gettextを使った国際化

Slide 10

Slide 10 text

1.Langファサードを使った国際化 • 言語ファイル(キーと文字列のただの配列が書かれた phpファイル)を用意すれば準備完了! • 使い方は言語ファイルを用意して App::setLocale("言語") で言語を変更して Lang::get("ファイル名.キー") で文字列を取得! • 個人制作、小~中規模のアプリケーションであればこ れで全く問題ない。 マニュアルに載っている情報で十分なぐらいシンプル! http://readouble.com/laravel/5/0/0/ja/localization.html

Slide 11

Slide 11 text

翻訳者「.phpと書かれたファイルを 開いて編集すればいいんです ね?」

Slide 12

Slide 12 text

非エンジニア(翻訳者)に 依頼するのが辛い

Slide 13

Slide 13 text

2.Gettextを使った国際化 • 多言語対応の処理を行うライブラリと、ソースコード からテキストを抽出したりするツール群。 • 良い点 – 多機能 – 関連ツールが豊富 – 枯れている(採用実績も多く、安定している) • Langファサードに比べ… – 開発者が翻訳環境についての補助ツールを作成する必要がほ とんどない – 翻訳者がシステムに強い必要がない(専用のGUIエディタやそ の他関連ツールが豊富)

Slide 14

Slide 14 text

「laravel-gettext」で国際化 • https://github.com/xinax/laravel-gettext • Laravelで作られたアプリケーションに対して国際化対応 のシンプルなサポートを提供してくれるライブラリ • 前述したGettextが簡単に使えるようになる

Slide 15

Slide 15 text

LaravelでGettextを使う 想定で説明

Slide 16

Slide 16 text

今回作りたいもの • 「Hello, World!」を表示するアプリケーション • 日本語と英語の2言語をサポートする • サブドメインでアプリケーションの言語設定を切り替える – ex.) 日本語:https://ja.hoge.com/ 、英語:https://en.hoge.com/ • 言語リソースの管理はgettextを使う

Slide 17

Slide 17 text

サンプルはこちら • Githubにアップしてます。参考にどうぞ。 • fortkle/laravel-gettext-sample

Slide 18

Slide 18 text

国際化の作業手順 • 作業手順 – 1. 環境準備 – 2. laravel-gettext のインストール – 3. 設定の変更 – 4. 翻訳作業の一連の流れ – 5. 確認

Slide 19

Slide 19 text

1.環境準備 • 開発する環境に下記ツールがインストールされている か確認 – Laravel5 … https://github.com/laravel/laravel – GNU Gettext … http://www.gnu.org/software/gettext/ – php-gettext … – Poedit(Poファイルエディタ)… http://poedit.net/ $ php -i | grep GetText GetText Support => enabled http://php.net/manual/ja/gettext.setup.php

Slide 20

Slide 20 text

2. laravel-gettext のインストール • パッケージを追加して保存 (composer.json) • アップデート (composer update) { "require": { "laravel/framework": "5.0.*", "xinax/laravel-gettext": "2.x" } } $ composer update Loading composer repositories with package …(略)

Slide 21

Slide 21 text

2. laravel-gettext のインストール • サービスプロバイダーに追加 (config/app.php) • ミドルウェアに追加 (app/Http/Kernel.php) 'providers' => array( 'Xinax¥LaravelGettext¥LaravelGettextServiceProvider', ) protected $middleware = [ 'Xinax¥LaravelGettext¥Middleware¥GettextMiddleware', ]

Slide 22

Slide 22 text

2. laravel-gettext のインストール • 設定ファイルを生成 (php artisan vendor:publish) $ php artisan vendor:publish Copied File [/vendor/xinax/laravel- gettext/src/config/config.php] To [/config/laravel- gettext.php] Publishing Complete!

Slide 23

Slide 23 text

3. 設定の変更 • 先ほど生成した設定ファイルをアプリケーションに 合わせて修正 (config/laravel-gettext.php) 'supported-locales' => array( 'en_US', 'ja_JP', // supported-localesに日本語を追加 ), ※Localesに指定できるロケール名はコマンドラインから $locale -a で確認できます。 // 今回はroutesに文字リソースがあるのでroutes.phpも // 文字リソースを検索するように修正 'source-paths' => array( 'Http', '../resources/views', 'Commands' ),

Slide 24

Slide 24 text

3. 設定の変更 • 最後に .po ファイルを生成 上記コマンドによって、resources/lang/i18n 配下に 言語ファイル(poファイル)が生成されます。 $ php artisan gettext:create Locale directory created (../resources/lang/i18n/en_US) Locale directory created (../resources/lang/i18n/ja_JP) Done! 2 directories were created.

Slide 25

Slide 25 text

3. 設定の変更 • Poファイルは、原文と翻訳文を対応が書かれています。 日本語のpoファイル (resources/lang/i18n/ja_JP/LC_MESSAGES/message.po) 英語のpoファイル (resources/lang/i18n/en_US/LC_MESSAGES/message.po) (※実際はまだ翻訳文は書かれていません。これから登録します。) #: Http/routes.php:25 #: ../storage/views/messages//171658b6baec069a518.php:25 msgid "routes.hello_world" msgstr "こんにちは、世界!" #: Http/routes.php:25 #: ../storage/views/messages//171658b6baec069a518.php:25 msgid "routes.hello_world" msgstr "Hello, World!"

Slide 26

Slide 26 text

4.翻訳作業の一連の流れ • まず、「Hello,World!」をgettext関数に置き換えま す。Gettext関数は _('メッセージID') です。 この時点で画面にアクセス すると右のようになります。 Route::get('/', function() { return _('routes.hello_world'); });

Slide 27

Slide 27 text

4.翻訳作業の一連の流れ • 次に文字リソースの変更をpoファイルに反映させます。 (resources/lang/i18n/en_US/LC_MESSAGES/messages. po)をPoeditで開き、「更新する」を押します。 すると、このように文字リソースを検索してくれます。

Slide 28

Slide 28 text

4.翻訳作業の一連の流れ • 翻訳を行い、保存ボタンを押します(Poeditで保存す ると自動でpoファイルをコンパイルしたmoファイルを 同じ階層に生成してくれます)。 ※同様に日本語も! ファイルの場所だけ教えれば非エンジニアも翻訳できる!

Slide 29

Slide 29 text

5.表示したい言語を選択して確認 • Http/Middleware等でロケールを設定します。 サブドメインでロケールを変更したい場合は、Web サーバーの環境変数などを見て切り替えます。 // $local_gettext = 'en_US'; // $local_gettext = 'ja_JP'; LaravelGettext::setLocale($local_gettext);

Slide 30

Slide 30 text

5.表示したい言語を選択して確認 • サイトにアクセスして確認できたら成功です!

Slide 31

Slide 31 text

Gettextあるある • Q. 言語切替がうまくいかないんだけど? • A. キャッシュが効いている可能性が高いです – 1. LaravelのViewのキャッシュ • storage/views/ 配下に生成されるGettextのキャッシュを消す – 2. メモリのキャッシュ • ビルドインサーバーであれば再実行 • Webサーバー(Apache等)であれば再起動

Slide 32

Slide 32 text

Gettextあるある • Q. PoeditというかWeb上から翻訳したい! • A. Pythonで書かれたフリーのオンライン翻訳 ツール「Pootle」などがあります!

Slide 33

Slide 33 text

まとめ • 大規模な多言語アプリケーションを作る場合は 枯れているけどgettextを使うのがおすすめ • Laravelでgettextを使うなら、 「xinax/laravel-gettext」 • Pootle等を使えばオンラインで翻訳もできる

Slide 34

Slide 34 text

ご静聴ありがとうございました