PHP
サンプル
多言語
Gettext

gettextをPHPで使用するサンプル

More than 3 years have passed since last update.


目的

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スクリプト


greeting.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 が生成される


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"


翻訳


  1. まずはディレクトリ作成と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


  1. ./locale/【ロケール】/LC_MESSAGES/message.po の以下の部分に翻訳を記述する


locale/ja_JP/LC_MESSAGES/message.po

msgid "greeting"

msgstr "こんにちは世界"


locale/en_US/LC_MESSAGES/message.po

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