Social icon element need JNews Essential plugin to be activated.
星期日, 2 4 月, 2023
No Result
View All Result
育心文具行

育心文具行

  • 首頁
  • 創作x紀錄
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 當紅俱樂部
  • 留言給我
育心文具行
  • 首頁
  • 創作x紀錄
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 當紅俱樂部
  • 留言給我
No Result
View All Result
育心文具行
Home 心得x體驗

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

2022-04-23
in 心得x體驗
Reading Time: 2 mins read
Share on FacebookShare on Twitter

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

[快速筆記] 信件RWD

Next Post

檢查與轉換檔案編碼,使用 Chrome 瀏覽器和 Sublime 3 文字編輯器

Next Post

檢查與轉換檔案編碼,使用 Chrome 瀏覽器和 Sublime 3 文字編輯器

壓力測試 - ab(ApacheBench)指令的操作與結果說明

Hestiacp 安裝筆記

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Google reCAPTCHA 保護機制,這項服務遵循 Google 隱私權政策及服務條款。

全站搜尋

No Result
View All Result

近期文章

  • PHP Codeigniter 4 框架速度優化
  • 《自慢10:18項修練》第四部讀書心得
  • 網頁製作,外包要注意的事情
  • 《自慢10:18項修練》第三部讀書心得
  • 在 Mac 上,大型 CSV 檔案切割方法

分類

  • 創作x紀錄 (12)
  • 心得x體驗 (32)
  • 筆記x備忘 (26)
  • 閒談x雜記 (4)

贊助買咖啡

Social icon element need JNews Essential plugin to be activated.

標籤

22.04 android centos Channel Access Token composer dart dev dist f facebook flutter gist git git hook gitignore highlight hook ios line linode linux MAC php php7.3 php8 QBQ!問題背後的問題 sdk sublime sublime3 ubuntu vps vue vue.js vue3 wordpress 團隊,從傳球開始 團隊,從傳球開始:五百年都難以超越的 UCLA 傳奇教練伍登培養優越人才和團隊的領導心法 意志力 權限 自慢10 自慢10:18項修練 規格 調整硬碟空間 調整規格 讀書心得

文章分類

  • 創作x紀錄 (12)
  • 心得x體驗 (32)
  • 筆記x備忘 (26)
  • 閒談x雜記 (4)

近期文章

  • PHP Codeigniter 4 框架速度優化
  • 《自慢10:18項修練》第四部讀書心得
  • 網頁製作,外包要注意的事情
  • 《自慢10:18項修練》第三部讀書心得
  • 在 Mac 上,大型 CSV 檔案切割方法

© 2020 hipster.crazyjerry.studio - a blog about experience, notes and nonsense, by Jerry Lin.

No Result
View All Result
  • 首頁
  • 創作x紀錄
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 當紅俱樂部
  • 留言給我

© 2020 hipster.crazyjerry.studio - a blog about experience, notes and nonsense, by Jerry Lin.