PHP國際化(i18n):開發者實用指南

more

Yee

Aug 03, 2024

cover-img

讓您的 PHP 網站走向國際:更高效的國際化解決方案

如果您和我一樣,維護著不依賴大型框架(如 Laravel 或 Symfony)的「原生」PHP 專案,那麼多語言支援(i18n)很可能一直是個小小但持續的痛點。

傳統的解決方案 gettext 雖然功能強大,但設定起來相當繁瑣。尤其是在小型專案中,這種方式就像「殺雞用牛刀」。我們真正需要的是一種可以快速實現、又不會帶來太多複雜度的方法。

經過多個專案的反覆嘗試,我們開發出一套基於 PHP 陣列檔案與線上翻譯工具的輕量級國際化解決方案。這種做法不僅部署簡單,維護成本也極低。今天,我將這套完整的解決方案無私分享給大家。

實戰指南:我如何用 O.Translator 完美實現 PHP 多語言支援

我們的核心想法非常簡單:每一種語言對應一個 PHP 檔案,檔案內包含一個 return 陳述式,回傳關聯式陣列。 這種方式簡單直觀,效能負擔也極小。

步驟 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

步驟 2:建立您的「語言武器庫」

接下來,我們要建立基礎語言檔案。我們以中文為例,建立一個 lang.cn.php 檔案。檔案內容是一個簡單的 PHP 陣列,鍵是唯一的識別碼,值則是對應的文字字串。

lang.cn.php 範例:鍵保持一致,值隨語言變化

步驟 3:進入翻譯魔法師 O.Translator

要手動翻譯數十甚至上百個條目嗎?這正是程式設計師最討厭的重複性工作。這時候,我們的祕密武器 O.Translator 就派上用場了。

這是一個專業的線上文件翻譯平臺,完美支援 PHP 檔案,能直接讀取您的陣列並翻譯成超過 70 種語言。

這個流程非常簡單:

  1. 請造訪 O.Translator 首頁,並上傳您的基礎語言檔案(例如:lang.cn.php)。
  2. 選擇您想要的目標語言,例如 English 和 French。
  3. 點擊翻譯,稍等片刻,您的 lang.en.phplang.fr.php 翻譯檔案就會準備好。

最讓我印象深刻的是,O.Translator 允許您免費預覽部分翻譯內容。如果您對結果滿意,再決定是否付費取得完整翻譯。用他們自己的話來說:「永遠不要為你不滿意的產品付費。」

步驟四:讓程式碼動起來

一切都準備好了;我們只需要最後一個步驟。現在,讓我們來修改主要的 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 請求標頭來自動偵測。
  • 效能考量:對於中小型網站來說,每次請求時使用 require_once 載入 PHP 檔案的效能負擔幾乎可以忽略不計。如果您的網站流量很大,可以考慮使用像 APC 或 OPcache 這類位元組碼快取技術來進一步優化。
  • 可擴展性:隨著語言或文字字串數量增加,手動管理檔案會變得複雜。這時,您可能需要考慮更專業的 i18n 解決方案,例如 PHP 的 gettext 擴充套件 或框架所提供的在地化元件。
  • 翻譯一致性:為了確保品牌名稱與術語在所有語言版本中的一致性,非常建議您使用 O.Translator 的詞彙表功能
  • 高階策略:本文著重於技術實作。如果您想進一步瞭解網站國際化的整體策略,可以參考我們的另一篇深入文章。

主題

場景

場景

已發表文章11

推薦閱讀