Update 2024-06-17
拜 AI 科技之賜,現在生成型的文字 AI 已經足以處理 php array 翻譯了,我使用 ChatGPT 付費版來處理翻譯,操作上就貼文件給他,直接下指令請他翻譯,參考:

— 舊文 —-
PHP 的多語系或是翻譯實作的形式各式各樣,像是 PO/MO 翻譯檔案、寫在 SQL 資料庫、靜態檔案或是寫在 PHP 檔案之中的作法,作法之多,從 PO/MO 檔案轉換的線上工具可以一窺一二。

這邊使用 Codeigniter 的語系系統,是用 PHP array 來處理的,這樣的形式要批次處理前置翻譯有點困難,如果要是用翻譯的 API 也要額外付費,於是用了一些比較迂迴的作法。
首先擁有的翻譯資源:
- Poedit 軟體。因為之前有需要大量使用 wordpress 功能,需要翻譯外掛和布景主題,所以有買斷一個個人使用版本。這套工具可用來翻譯 PO/MO 格式的檔案。
- LEMP 本地開發環境。
實作的 SOP 是這樣的:
- 將翻譯的 PHP 檔案全部轉換/產生新的 PO 檔案。
- 透過 Poedit 軟體做前置翻譯。
- 透過軟體內建搜尋翻譯功能初步作一次調整。
- 確認 PO 檔案放在和 PHP 檔案是同一個資料夾。
- 取出將 PO 檔案翻譯內容,替換原 PHP檔案內容。
- 做檢查微調。檢查 ‵/‵ 字符等兩個檔案,或是其他可能會有不同的地方。
附上其中 SOP 的 1. 和 5. 的檔案原始碼:
# php2po.php <?php $PATH = dirname(__FILE__) . "/路徑"; $files = glob($PATH . '*.php'); foreach ($files as $file) { $lang = []; include $file; $fh = fopen($file . ".po", 'w'); fwrite($fh, "#\n"); fwrite($fh, "msgid \"\"\n"); fwrite($fh, "msgstr \"\"\n"); foreach ($lang as $key => $value) { $key = addslashes($key); $value = addslashes($value); fwrite($fh, "\n"); fwrite($fh, "#. $key\n"); fwrite($fh, "msgid \"$value\"\n"); fwrite($fh, "msgstr \"$value\"\n"); } fclose($fh); }
# po2php.php <?php function get_replace_array($file) { $input_lines = file_get_contents($file); preg_match_all('/msgid \"(.*)\"/', $input_lines, $msgids); preg_match_all('/msgstr \"(.*)\"/', $input_lines, $msgstrs); $arr = []; for ($i = 1; $i < count($msgids[1]); $i++) { // 第一個是空值 $arr[$msgids[1][$i]] = $msgstrs[1][$i]; } // var_dump($arr);die(); return $arr; } $PATH = dirname(__FILE__) . "/路徑"; $files = glob($PATH . '*.php'); foreach ($files as $file) { $lang = []; include $file; $replace_array = get_replace_array($file . ".po"); $php_file = file_get_contents($file); $_lang = []; foreach ($lang as $key => $value) { $_lang[$key] = $value; $value_tmp = addslashes($value); if (isset($replace_array[$value_tmp])) { $_lang[$key] = $replace_array[$value_tmp]; } if ($value != $replace_array[$value]) { echo $key . ", " . $_lang[$key] . " \n"; } } file_put_contents($file, '<?php $lang = ' . var_export($_lang, true) . ';'); }
需要注意幾件事情:
- 買斷版的 Poedit 也是有翻譯數量上限的,不過暫時夠用就是。
- Poedit 在前置翻譯之前記得設定好語系,除了語系之外可以儘量讓檔案小一點,不用特別標記其他的 meta ,會產生多餘的註解檔案。
- 在本機操作 PHP 轉換時要注意一下 RAM 是否夠用,
- 檔案轉換的路徑需要自行調整,PO 檔案的命名是以原始 PHP 檔案直接加上 .po 副檔名。
- 如果轉換出來的 po 檔案有問題無法開啟,建議放上 po editor online 上檢查看看,或是轉換一下下載繼續處理。
- 如果真的無法翻譯,檔案量不大的話可以把變數拆行丟 google 翻譯 是可行的,要注意 key 值的命名規則,不要被翻譯了。