PHP + gettex による多言語化のやり方 完全マニュアル

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

Poeditのトップページ。多言語化の第一歩はpoeditのインストールから

▲ Get Poedit desktop app

 

Windows はもちろん、Linux や Mac にも対応してるマルチプラットなソフトです。

Poeditは 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  関数 または _  関数に渡してるコード例

とりあえず、翻訳が必要なテキストは片っ端から gettext  で囲っていきましょう。

手順3.多言語用のディレクトリを作る

次にやるべきは、翻訳リソース用のディレクトリを作ること

そもそもGettextでは、次の2つのファイルを使って翻訳を行います。

  • poファイル : 翻訳リソースファイル
  • moファイル : 翻訳用バイナリファイル

翻訳元と翻訳先の辞書が poファイル で、実際に翻訳に使われるのが moファイル みたいなイメージ

各言語ごとに、この2つのペアのファイルが必要です。

 

それで重要なのが、このファイルを作る場所

例えば 英語 ⇒ 日本語 翻訳用の po と mo を作りたい場合、
ドキュメントルート以下(つまりドメイン以下)に次みたいなディレクトリが必要

  • ー DOCUMENT_ROOT
    • ー locale
      • ー ja_JP
        • ー LC_MESSAGES
          • ー (ここに .mo と .po を置く)
    • ー その他のディレクトリ

必ず /locale/{言語コード}/LC_MESSAGES  のようなディレクトリを作る必要あり

例えば日本語だったら /locale/ja_JP/LC_MESSAGES  みたいな感じです。

この規則を守らないと、moファイルがあっても翻訳されません。要注意!

手順4.poファイルとmoファイルをPHPコードから生成する

ここから多言語化で特に肝心な部分

PHPコードから poファイル と moファイル を作成すること

具体的にはpoeditを使って翻訳部分を抜き出し、poファイルとmoファイルを作成します。

その手順は次の通り

まず poedit でカタログを作成する

まずさっきダウンロードした poedit を起動

▼ Poeditへようこそ!

まずPoeditを起動しよう。ここで各言語ごとのカタログというものを作る

 

開いたら Ctrl  + N  を押して新規カタログを作成

次みたいに翻訳したい言語(翻訳元ではない)を聞かれるので、適当なものを選択

Poedit - 新規カタログを作ると、翻訳先の言語を聞かれる。適当なものを選択

▲ ここでは翻訳先に日本語をチョイス

 

そうしたら一旦カタログを 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」タブでプロジェクト名や翻訳チームとかを入力

▼ 例えばこんな感じで、、、

Poedit - 「Translation properties」タブでプロジェクト名や翻訳チームとかを入力

これについては本当に適当で構いません。

ただ「文字符号化法」については UTF-8 を選択してないと、変なエラーが起きるかも

 

そのあとは「ソースの検索パス」タブを開きます

そこで翻訳したいPHPファイルがあるディレクトリ、その相対パスを全て追加

Poedit- 「ソースの検索パス」を開き、翻訳したPHPファイルのあるパスを片っ端から追加する

ただし相対パスは mo ファイルのあるディレクトリ基準で指定してください。

 

そして最後に「ソース中のキーワード」タブをオープン

翻訳用の関数名(例えば gettext  など)を追加していきます。

Poedit - 「ソース中のキーワード」タブを開き、翻訳関数名を入力。ただし gettext や _ は初めから登録されてるので、追加する必要なし

ただし gettext  とそのエイリアス _  は初めから登録されているので、追加する必要ありません。

もし翻訳ライブラリとか使ってるなら、この設定もしておきましょう。

手順5.PHP内で moファイル を読み込んで翻訳する

いよいよ多言語化も最終フェーズ

PHPコード内でmoファイルを読み込み、テキスト翻訳します。

 

例えば次みたいなディレクトリ構成を見てください。

  • ー DOCUMENT_ROOT
    • ー locale
      • ー ja_JP
        • ー LC_MESSAGES
          • ー myapp.mo
          • ー myapp.po

こういうディレクトリ構成の場合、多言語化コードの書き方は次の通りです。

これはコード例なので、使うときは自分の環境に置き換えてるのをお忘れなく

 

そうしたら実際に翻訳されてるか確かめてみます。

まずコード側から言語コードを en にしたときの表示

▼ 普通に英語で表示される

まず元言語で表示。この言語コードを日本語(ja_JP)に変えてみると・・・

そして言語コードを 日本語( ja_JP ) にしてアクセスしてみると・・・

▼ ちゃんと翻訳されてる!

英語から日本語にしっかり翻訳されてる!これにて多言語化は完了

これでアプリ多言語化への第一歩が踏み出せました。

あとは地道にテキスト翻訳していけば、マルチランゲージなアプリが作れます。

もし getext による翻訳が上手く動かないときは・・・

例えば Windows + XAMPP を使って開発してる場合、
ここまでの手順を試しても gettext が動かないことがあります(ロケールとか問題)

なので、そういう場合は gettext 用のライブラリを使った方が確実です。

 

特に使いやすいのは oscarotero/Gettext というライブラリ

▼ このライブラリ。名前が Gettext という本格派

一応使い方を説明しておくと、次の通りです。

1.まず翻訳テキストを __ 関数で囲む

PHPの場合 gettext の代わりにアンダーバー1つの _  関数が用意されてました。

このライブラリでは __  関数を使うことで、翻訳テキストして扱えます。

▼ 多言語化のコード例

このコードのハイライトした部分に注目

まず Translator  をインスタンス化し、 $t->register();  で翻訳関数を登録

そのあと9行目の __('First multilingual app.');  みたいにアンダーバー2つを使ってください。

2.Gettextライブラリから多言語化するコードを書く

例えばこんな感じのコード

翻訳の仕方については、Githubページとか見た方が分かりやすいと思います。

とりあえずPHP標準の gettext  が動かないなら、こういうライブラリを使ってみてください。

PHP + getetxt の多言語化まとめ

ここまで長々と書いてきたので、簡単に手順まとめ

  1. 翻訳外注サービスを見つける
  2. poedit のインストール
  3. PHP内でgettext関数を使う
  4. 多言語用のディレクトリを作る
  5. 翻訳リソースを作成する
  6. 翻訳用のコードを書く

以上、PHP + gettetx での多言語化方法まとめでした。またね($・・)/~~~