PHP国際化(i18n):開発者のための実用ガイド

more

Yee

Aug 03, 2024

cover-img

PHPサイトをグローバル対応に!もっと効率的な多言語化ソリューション

僕と同じように、LaravelやSymfonyみたいな大きなフレームワークを使わずに「素の」PHPプロジェクトを運用しているなら、多言語対応(i18n)は地味にずっと悩みのタネだったんじゃないでしょうか。

従来の解決策であるgettextは強力ですが、設定がかなり面倒です。特に小規模なプロジェクトだと、「クルミを割るのに大ハンマーを使う」みたいな感じ。もっと手軽に、複雑になりすぎない方法が欲しいですよね。

いろんなプロジェクトで試行錯誤した結果、PHPの配列ファイルとオンライン翻訳ツールを使った軽量な多言語化ソリューションを作りました。この方法は導入がとても簡単なだけでなく、メンテナンスコストもめちゃくちゃ低いです。今日はこのソリューションを、出し惜しみなしで全部シェアします!

実践ガイド:O.TranslatorでPHP多言語対応をバッチリ決めた方法

コアとなる考え方は超シンプルです:各言語ごとにPHPファイルを用意し、その中で連想配列をreturnするだけ。 直感的で分かりやすく、パフォーマンスへの影響も最小限です。

Step 1: ディレクトリ構成を計画しよう

ディレクトリ構成がしっかりしていれば、もう半分は勝ったも同然。整理しやすくするために、すべての言語ファイルを同じディレクトリにまとめて、言語コードでファイル名を付けましょう。例えばこんな感じ:

project_root/
├── index.php         // Your main logic file
├── i18n/             // Folder for all language files
│   ├── lang.cn.php   // Chinese language pack
│   ├── lang.en.php   // English language pack
│   └── lang.fr.php   // French language pack

Step 2: あなたの「言語アーセナル」を作ろう

次に、ベースとなる言語ファイルを作成します。例として中国語を使って、lang.cn.php ファイルを作ってみましょう。ファイルの中身はシンプルなPHP配列で、キーがユニークな識別子、値が対応するテキスト文字列です。

lang.cn.php の例:キーは共通、値は言語ごとに変わる

Step 3: 翻訳ウィザード O.Translator の登場

何十件、何百件も手作業で翻訳しますか?それって、プログラマーが一番嫌う単純作業ですよね。そこで登場するのが、我らが秘密兵器 O.Translator です。

これはPHPファイルに完全対応したプロ向けのオンラインドキュメント翻訳プラットフォームで、配列をそのまま読み込んで70以上の言語に翻訳してくれます。

やり方はめちゃくちゃシンプルです:

  1. **O.Translatorの公式サイト**にアクセスして、ベース言語ファイル(例:lang.cn.php)をアップロードします。
  2. 英語やフランス語など、翻訳したい言語を選びます。
  3. 「翻訳」ボタンをクリックして少し待てば、翻訳済みのlang.en.phplang.fr.phpファイルがすぐ手に入ります。

特に感心したのは、O.Translatorなら一部の翻訳を無料でプレビューできるところです。結果に満足したら、全翻訳を購入するかどうか決めればOKです。公式の言葉を借りると:「満足できない製品には絶対にお金を払わないでください。」

ステップ4:コードを動かしてみよう

これで準備はバッチリです。あとは仕上げのひと手間だけ。それでは、ユーザーの選択に応じて適切な言語パックを動的に読み込めるよう、メインのindex.phpファイルを編集しましょう。

<?php

// 1. Determine the current language (using a GET parameter for demonstration)
$supported_langs = ['en', 'cn', 'fr'];
$default_lang = 'en';
$lang = isset($_GET['lang']) && in_array($_GET['lang'], $supported_langs) ? $_GET['lang'] : $default_lang;

// 2. Load the corresponding language file
// Use a global variable like $_ or a specific variable like $TEXTS to store the strings
$_ = require_once __DIR__ . "/i18n/lang.{$lang}.php";

?>

HTMLテンプレート内では、こんな感じでテキストを簡単に呼び出せます:

<!DOCTYPE html>
<html lang="<?php echo htmlspecialchars($lang); ?>">
<head>
    <meta charset="UTF-8">
    <title><?php echo htmlspecialchars($_['heading_home']); ?></title>
</head>
<body>
    <header>
      <h1><?php echo htmlspecialchars($_['heading_home']); ?></h1>
      <nav>
        <ul>
          <li><?php echo htmlspecialchars($_['heading_about']); ?></li>
          <li><?php echo htmlspecialchars($_['button_read_more']); ?></li>
        </ul>
      </nav>
    </header>
</body>
</html>

これでシンプルな多言語サイトの完成です!

考慮すべきポイントと発展的な話

この方法は軽量ですが、本番環境に導入する前にいくつか注意点があります:

  • ユーザーの言語をどう判定する? この例では ?lang=en のようなGETパラメータを使っています。実際のアプリケーションでは、$_SESSION$_COOKIE を使ったり、ブラウザの Accept-Language リクエストヘッダーを解析して自動判定することもできます。
  • パフォーマンス面の注意:小〜中規模のサイトなら、毎リクエストごとにPHPファイルを require_once するコストはほとんど気になりません。もしアクセス数が多いサイトなら、APCやOPcacheなどのバイトコードキャッシュ技術を使ってさらに最適化するのもアリです。
  • スケーラビリティ:言語やテキストが増えてくると、ファイルの手動管理がだんだん大変になってきます。その場合は、PHPのgettext拡張 や、フレームワークが提供するローカライズ機能など、より本格的なi18nソリューションの導入も検討しましょう。
  • 翻訳の一貫性:ブランド名や専門用語の統一を全言語で保つために、O.Translatorの用語集機能の活用を強くおすすめします。
  • ハイレベル戦略:この記事は技術的な実装にフォーカスしています。Webサイトの多言語対応全体戦略についてもっと知りたい方は、他の詳しい記事もぜひチェックしてみてください。

テーマ

シーン

シーン

公開された記事11

おすすめの読み物