PHP でWebアプリとかサービスを作ってる人なら、
- もっと多くの人に使ってほしい、
- 海外の人にも使ってほしい、
- そうだ、日本語以外に多言語化しよう!
みたいにPHPで作ったアプリを多言語化したいことあると思います。
自分もつい最近Webサービスをリリースしたんですが、
グローバルでもいけそうな内容だったので多言語化してみました。
ここではそういう人たちに向けて、
PHPで作ったアプリを gettext & poedit を使って多言語化する手順を紹介!
手順通りに進めれば、今すぐにでも多言語化できます。
このページの目次
手順0.翻訳を外注できるサービスを見つける
まず具体的な gettext の導入手順を解説する前に・・・
まず翻訳を自力でやるか、それとも外注するか決めておきましょう。
結論から言うと、自力でやるのはあり得ないくらいデメリットが多いです。
例えばGoogle翻訳を使うんだったら、次の点は覚悟しないといけません。
- 翻訳の精度はあまりよくないこと
- 文章によっては支離滅裂になること
- 翻訳自体にすごく労力がかかること
自分もやったことあるけど、あれほど非効率で苦痛な作業ってないです。(大袈裟ではなく、、、)
なので多言語アプリを作るなら、外注サービス を使うのが一番ですね。
特に外注サービスとして候補に挙がるのが次の2つ
- ココナラ
"得意を売るならココナラ♪♪" のCMでもおなじみのサイト。
翻訳の依頼 ⇒ 【翻訳・語学カテゴリ】 から、英語をはじめ依頼可能 - 翻訳代行 一括.jp
数ある翻訳サービスを一括で比較したり、一括問い合わせができるサービス
このサービス自体は無料で利用できるので、気軽に使える
もし個人とか趣味レベルのアプリなら ココナラ、
逆に本格的な企業運営のアプリだったら 翻訳代行一括JP が最適
まあGoogle翻訳とかもあるけど、手間とか精度の点から全くオススメできないです。
手順1.まずは poedti をインストールしよう
ではこっから具体的なPHPでの多言語化手順を説明していきます。
まずPHPの多言語化に欠かせないのが、 poedit というソフト
これはPHPソース内のテキストをリソースとして管理し、翻訳ができるアプリです。
そのダウンロードは次のURLからどうぞ
DL先 : https://poedit.net/download
▲ Get Poedit desktop app
Windows はもちろん、Linux や Mac にも対応してるマルチプラットなソフトです。
poedti自体はどのOSでも使い方が同じ(多分)なので、環境に合ったものをDLしてください。
手順2.PHP内で翻訳関数 ( gettext ) を使う
お次にやることはPHP側での準備作業です。
それが翻訳テキストを gettetx 関数に渡すこと
絶対に必須な作業なので、これ忘れたら絶対ダメです。( "絶対" を2回言うくらい大事)
それでこの gettext関数、どういう関数かというと次の説明の通り
gettext ( string $message ) : string
現在のドメインのメッセージを参照します。翻訳テーブルに翻訳文字列が見つかった場合にその文字列、 あるいは見つからなかった場合に元の文字列を返します。
引用元 : https://www.php.net/manual/ja/function.gettext.php
これを使い、翻訳したい文字列・単語を渡してやればOK
でもいちいち gettext と書くのは面倒なので、代わりに _ 関数 を使う方が楽ですね。
▼ 翻訳テキストを gettext 関数 または _ 関数に渡してるコード例
1 2 3 4 5 6 7 |
/// 普通に gettext に渡してもいいが、、、 $trans_msg = gettext('First multilingual app.'); print_r( $trans_msg ); /// 代わりに _ 関数を使う方が簡潔 $trans_msg = _('First multilingual app.'); print_r( $trans_msg ); |
とりあえず、翻訳が必要なテキストは片っ端から gettext で囲っていきましょう。
手順3.多言語用のディレクトリを作る
次にやるべきは、翻訳リソース用のディレクトリを作ること
そもそもGettextでは、次の2つのファイルを使って翻訳を行います。
- poファイル : 翻訳リソースファイル
- moファイル : 翻訳用バイナリファイル
翻訳元と翻訳先の辞書が poファイル で、実際に翻訳に使われるのが moファイル みたいなイメージ
各言語ごとに、この2つのペアのファイルが必要です。
それで重要なのが、このファイルを作る場所
例えば 英語 ⇒ 日本語 翻訳用の po と mo を作りたい場合、
ドキュメントルート以下(つまりドメイン以下)に次みたいなディレクトリが必要
- ー DOCUMENT_ROOT
- ー locale
- ー ja_JP
- ー LC_MESSAGES
- ー (ここに .mo と .po を置く)
- ー LC_MESSAGES
- ー ja_JP
- ー その他のディレクトリ
- ー locale
必ず /locale/{言語コード}/LC_MESSAGES のようなディレクトリを作る必要あり
例えば日本語だったら /locale/ja_JP/LC_MESSAGES みたいな感じです。
この規則を守らないと、moファイルがあっても翻訳されません。要注意!
手順4.poファイルとmoファイルをPHPコードから生成する
ここから多言語化で特に肝心な部分
PHPコードから poファイル と moファイル を作成すること
具体的にはpoeditを使って翻訳部分を抜き出し、poファイルとmoファイルを作成します。
その手順は次の通り
まず poedit でカタログを作成する
まずさっきダウンロードした poedit を起動
▼ Poeditへようこそ!
開いたら Ctrl + N を押して新規カタログを作成
次みたいに翻訳したい言語(翻訳元ではない)を聞かれるので、適当なものを選択
▲ ここでは翻訳先に日本語をチョイス
そうしたら一旦カタログを Ctrl + S を押して保存してください。
ただし、この時の保存先は /locale/{言語コード}/LC_MESSAGES にしないとダメ
例えば日本語用に翻訳したいなら、 /locale/ja_JP/LC_MESSAGE に保存先を選択。
その下に ja_JP.mo と ja_JP.po の2つが作成されます。
この2つのファイルの名前は、
たとえば
myapp.mo 、
myapp.po みたいに任意の名前に変えてください(言語に関わらず統一)
デフォルトのままだと、翻訳用のコードを書くときに困ります。
翻訳先言語のカタログを設定
次に poedti から「カタログ」=>「設定」をオープン
そして「Translation properties」タブでプロジェクト名や翻訳チームとかを入力
▼ 例えばこんな感じで、、、
これについては本当に適当で構いません。
ただ「文字符号化法」については UTF-8 を選択してないと、変なエラーが起きるかも
そのあとは「ソースの検索パス」タブを開きます。
そこで翻訳したいPHPファイルがあるディレクトリ、その相対パスを全て追加
ただし相対パスは mo ファイルのあるディレクトリ基準で指定してください。
そして最後に「ソース中のキーワード」タブをオープン
翻訳用の関数名(例えば gettext など)を追加していきます。
ただし gettext とそのエイリアス _ は初めから登録されているので、追加する必要ありません。
もし翻訳ライブラリとか使ってるなら、この設定もしておきましょう。
手順5.PHP内で moファイル を読み込んで翻訳する
いよいよ多言語化も最終フェーズ
PHPコード内でmoファイルを読み込み、テキスト翻訳します。
例えば次みたいなディレクトリ構成を見てください。
- ー DOCUMENT_ROOT
- ー locale
- ー ja_JP
- ー LC_MESSAGES
- ー myapp.mo
- ー myapp.po
- ー LC_MESSAGES
- ー ja_JP
- ー locale
こういうディレクトリ構成の場合、多言語化コードの書き方は次の通りです。
1 2 3 4 5 6 7 8 9 10 |
$domain = 'myapp'; bindtextdomain( $domain, $_SERVER['DOCUMENT_ROOT'].'/locale' ); setlocale( LC_ALL, "ja_JP.UTF-8" ); textdomain( 'myapp' ); putenv( "LANGUAGE=ja_JP.UTF-8" ); $trans_msg = gettext('First multilingual app.'); print_r( $trans_msg ); |
これはコード例なので、使うときは自分の環境に置き換えてるのをお忘れなく
そうしたら実際に翻訳されてるか確かめてみます。
まずコード側から言語コードを en にしたときの表示
▼ 普通に英語で表示される
そして言語コードを 日本語( ja_JP ) にしてアクセスしてみると・・・
▼ ちゃんと翻訳されてる!
これでアプリ多言語化への第一歩が踏み出せました。
あとは地道にテキスト翻訳していけば、マルチランゲージなアプリが作れます。
もし getext による翻訳が上手く動かないときは・・・
例えば Windows + XAMPP を使って開発してる場合、
ここまでの手順を試しても gettext が動かないことがあります(ロケールとか問題)
なので、そういう場合は gettext 用のライブラリを使った方が確実です。
特に使いやすいのは oscarotero/Gettext というライブラリ
▼ このライブラリ。名前が Gettext という本格派
一応使い方を説明しておくと、次の通りです。
1.まず翻訳テキストを __ 関数で囲む
PHPの場合 gettext の代わりにアンダーバー1つの _ 関数が用意されてました。
このライブラリでは __ 関数を使うことで、翻訳テキストして扱えます。
▼ 多言語化のコード例
1 2 3 4 5 6 7 8 9 10 |
require_once 'gettext/autoloader.php'; use Gettext\Translator; use Gettext\GettextTranslator; $t = new Translator(); $t->register(); $trans_msg = __('First multilingual app.'); print_r( $trans_msg ); |
このコードのハイライトした部分に注目
まず Translator をインスタンス化し、 $t->register(); で翻訳関数を登録
そのあと9行目の __('First multilingual app.'); みたいにアンダーバー2つを使ってください。
2.Gettextライブラリから多言語化するコードを書く
例えばこんな感じのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
require_once 'gettext/autoloader.php'; use Gettext\Translator; use Gettext\GettextTranslator; /// アクセス元の言語コード取得 $lang = mb_substr( $_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2 ); $locale = ($lang == 'ja') ? 'ja_JP' : 'en'; $path_to_po = $_SERVER['DOCUMENT_ROOT'] ."/locale/{$locale}/LC_MESSAGES/myapp.po"; if( file_exists($path_to_po) ) { $translations = Gettext\Translations::fromPoFile( $path_to_po ); $t->loadTranslations($translations); } |
翻訳の仕方については、Githubページとか見た方が分かりやすいと思います。
とりあえずPHP標準の gettext が動かないなら、こういうライブラリを使ってみてください。
PHP + getetxt の多言語化まとめ
ここまで長々と書いてきたので、簡単に手順まとめ
以上、PHP + gettetx での多言語化方法まとめでした。またね($・・)/~~~