PHP 網站的翻譯 / 多語系,批次翻譯 php array 的方法

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

— 舊文 —-

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

這邊使用 Codeigniter 的語系系統,是用 PHP array 來處理的,這樣的形式要批次處理前置翻譯有點困難,如果要是用翻譯的 API 也要額外付費,於是用了一些比較迂迴的作法。

首先擁有的翻譯資源:

  • Poedit 軟體。因為之前有需要大量使用 wordpress 功能,需要翻譯外掛和布景主題,所以有買斷一個個人使用版本。這套工具可用來翻譯 PO/MO 格式的檔案。
  • LEMP 本地開發環境。

實作的 SOP 是這樣的:

  1. 將翻譯的 PHP 檔案全部轉換/產生新的 PO 檔案。
  2. 透過 Poedit 軟體做前置翻譯。
  3. 透過軟體內建搜尋翻譯功能初步作一次調整。
  4. 確認 PO 檔案放在和 PHP 檔案是同一個資料夾。
  5. 取出將 PO 檔案翻譯內容,替換原 PHP檔案內容。
  6. 做檢查微調。檢查 ‵/‵ 字符等兩個檔案,或是其他可能會有不同的地方。

附上其中 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) . ';');
}

需要注意幾件事情:

  1. 買斷版的 Poedit 也是有翻譯數量上限的,不過暫時夠用就是。
  2. Poedit 在前置翻譯之前記得設定好語系,除了語系之外可以儘量讓檔案小一點,不用特別標記其他的 meta ,會產生多餘的註解檔案。
  3. 在本機操作 PHP 轉換時要注意一下 RAM 是否夠用,
  4. 檔案轉換的路徑需要自行調整,PO 檔案的命名是以原始 PHP 檔案直接加上 .po 副檔名。
  5. 如果轉換出來的 po 檔案有問題無法開啟,建議放上 po editor online 上檢查看看,或是轉換一下下載繼續處理。
  6. 如果真的無法翻譯,檔案量不大的話可以把變數拆行丟 google 翻譯 是可行的,要注意 key 值的命名規則,不要被翻譯了。

已發佈

分類:

作者:

標籤: