31
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-30

目的

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

31
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?