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 值的命名規則,不要被翻譯了。
