目的
gettextを使って、ロケールごとに文字列を翻訳するPHPサンプル
ロケールの設定を変えるとコード中の「greeting」という文字が
「こんにちは世界」、「HELLO WORLD」に翻訳されて出力される
gettextとは
https://ja.wikipedia.org/wiki/Gettext
gettextのインストール
ここからよさ気な最新版を選びます
http://ftp.gnu.org/pub/gnu/gettext/
$ cd /usr/local/src
$ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.gz
$ tar zxvf gettext-0.19.6.tar.gz
$ cd gettext-0.19.6
$ ./configure
$ make
$ make install
$ gettext --help
$ gettext --version
gettext (GNU gettext-runtime) 0.19.6
完了。
アプリケーションの作成
最終的にこんな感じになります
.
├── greeting.php
├── locale
│ ├── en_US
│ │ └── LC_MESSAGES
│ │ ├── messages.mo
│ │ └── messages.po
│ └── ja_JP
│ └── LC_MESSAGES
│ ├── messages.mo
│ └── messages.po
└── messages.po
PHPスクリプト
<?php
/* 後ほど切り替えてテストする */
$lang = "ja_JP.UTF-8";
//$lang = "en_US.UTF-8";
/* 翻訳ファイル名 */
$domain = "messages";
setlocale(LC_ALL, $lang);
/* 翻訳ファイルの置き場を指定 */
bindtextdomain($domain, "./locale/");
/* 翻訳ファイル名の指定 */
textdomain($domain);
/* _()はgettext()のエイリアス。これで囲む */
echo _("greeting");
翻訳用ベースファイルの生成(.po)
$ xgettext greeting.php
$ ls
greeting.php message.po
_()で囲まれた文字列を、翻訳箇所として抽出した message.po が生成される
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-12-29 13:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: greeting.php:19
msgid "greeting"
msgstr ""
以下の部分のcharsetをCHARSETからutf-8に変えます
"Content-Type: text/plain; charset=utf-8\n"
翻訳
- まずはディレクトリ作成とmessage.poのコピー
$ mkdir -p locale/ja_JP/LC_MESSAGES/
$ mkdir -p locale/en_US/LC_MESSAGES/
$ cp message.po locale/ja_JP/LC_MESSAGES/message.po
$ cp message.po locale/en_US/LC_MESSAGES/message.po
- ./locale/【ロケール】/LC_MESSAGES/message.po の以下の部分に翻訳を記述する
msgid "greeting"
msgstr "こんにちは世界"
msgid "greeting"
msgstr "HELLO WORLD"
翻訳ファイルのコンパイル(.mo)
$ cd ./locale/【ロケール】/LC_MESSAGES/
$ msgfmt message.po
$ ls
message.po message.mo
実行
greeting.phpの $lang
を変えて実行すると、ロケールの設定ごとに
異なる翻訳結果が出力されていることがわかる
$ php greeting.php
こんにちは世界
あるいは、
HELLO WORLD
参考とサンプル
ありがとうございました
http://el.jibun.atmarkit.co.jp/kaigaiengineer/2010/08/i18ngettextph-1.html
http://d.hatena.ne.jp/ao3/20080328/1206673266
http://qiita.com/tooooooooomy/items/9d20c81923f1d8cae75f
若干ファイル名が違いますが、ソースコードです
https://github.com/yotasasaki/gettext-sample