gettext 製作 PHP 多國語系網站(I18N)

本篇文章會教您如何使用 php + gettext 實做多國語系的網站!

在製作多國語言網站時,可以將所有頁面設定為同一個翻譯檔,也可以個別設定翻譯檔。

在開始製作多國語言網站時,請先在您專案的跟目錄新增 lang 資料夾,然後裡面再新增語系資料夾,例如 zh_TWen_US,然後在您新增的各語系資料夾內再新增 LC_MESSAGES 資料夾,這個資料夾是在放語言檔的。(完整路徑範例為 /lang/zh_TW/LC_MESSAGES)

我們先來說一下頁面如何編寫,一般來說網頁語法因該是這樣

<html>
<head>
    <title>Gettext Multi-language website demo</title>
</head>
<body>
    <h1>Gettext Multi-language website demo</h1>
    <hr><br>
    <p><font color="#ff0000">Hello world</font></p>
    <h3>language selection</h3>
    <a href="?lang=zh-tw">Traditional Chinese</a> <a href="?lang=zh-cn">Simplified Chinese</a> <a href="?lang=en-us">English</a>
</body>
</html>

但是為了讀取字符串,我們要修改成下面這樣 (請使用英文)

<?php
include("lang/setlang.php"); // Import language profile
?>
<html>
<head>
    <title><?php echo _('Gettext Multi-language website demo'); ?></title>
</head>
<body>
    <h1><?php echo _('Gettext Multi-language website demo'); ?></h1>
    <hr><br>
    <p><font color="#ff0000"><?php echo _('Hello world'); ?></font></p>
    <h3><?php echo _('language selection'); ?></h3>
    <a href="?lang=zh-tw"><?php echo _('Traditional Chinese'); ?></a> <a href="?lang=zh-cn"><?php echo _('Simplified Chinese'); ?></a> <a href="?lang=en-us"><?php echo _('English'); ?></a>
</body>
</html>

在修改後的原始碼上方你是不是發現多了這行 include(“lang/setlang.php”); PHP語法,這是在導入語言設定檔,程式碼如下

<?php
/*
  科技玩客 TechPlayer
  https://www.techplayer.org
*/
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches); // 分析 HTTP_ACCEPT_LANGUAGE 的屬性
$lang = $matches[1]; // 取第一語言設置
$lang = strtolower($lang); // 轉換為小寫
// 默認語言 & 類型
$lang = $lang;
putenv('LANG=en_US');
setlocale(LC_ALL, $lang);

$lang = isset($_GET['lang']) ? $_GET['lang'] : $lang;

if ('en-us' == $lang) {
    putenv('LANG=en_US');
    setlocale(LC_ALL, 'en_US');
} else if ('zh-tw' == $lang) {
    putenv('LANG=zh_TW');
    setlocale(LC_ALL, 'zh_TW'); // bsd use zh_TW.BIG5
    header('Content-type: text/html; charset=big5');
} else if ('zh-cn' == $lang) {
    putenv('LANG=zh_CN');
    setlocale(LC_ALL, 'zh_CN'); // bsd use zh_CN.GBK
    header('Content-type: text/html; charset=gbk');
}

define('PACKAGE', 'demo');

// gettext 設定
bindtextdomain(PACKAGE, 'lang'); // or $your_path/lang, ex: /var/www/test/lang
textdomain(PACKAGE);
?>

這會自行讀取使用者瀏覽器語系,也可以利用URL參數更換語系,例如 https://www.example.com/index.php?lang=zh-tw
您還可以自行新增更多語言!

接下來開始來新增翻譯檔,本教學是以 Windows 教導如何新增語言檔案

首先我們先下載 Poedit 這個軟體,然後開啟

先點擊左上角 檔案 > 新增
1

設定語系
2

然後存檔至 /lang/en_US/LC_MESSAGES 資料夾,檔案名稱命名為 demo.po
3

點擊 “從來源更新”
4

加入檔案
5

選擇您的網頁檔案
6

點擊確定
7

完成後儲存
8

然後會自動生成 .mo 檔案,那是給系統讀的檔案,.po 檔是給翻譯的人看的!
還有一個副檔名為 .pot 的檔案,那是翻譯模板,方便翻譯人員同步或新增語言的。

全部完成後您可以將檔案上傳至您的網站主機,來試試看吧!

以上教學看不懂嗎?沒關係,這邊有範例檔案,我已經上傳至 GitHub 了OwO
https://github.com/TechPlayerTeam/Gettext-Multi-language-website-demo

旋風之音 (GoneTone) - 張文相

Play Tech, Just like to play tech, in hardware software firmware or program development, but often kill myself. 玩科技,就是愛玩科技,無論是硬體、軟體、韌體還是程式開發,但是也常常搞死自己XD