星期五, 20 6 月, 2025
No Result
View All Result
育心文具行

育心文具行

  • 首頁
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 我的工具箱
  • 關於我
育心文具行
  • 首頁
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 我的工具箱
  • 關於我
No Result
View All Result
育心文具行
Home 筆記x備忘

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

2024-06-17
in 筆記x備忘
Reading Time:3 mins read
A A
0

Update 2024-06-17

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

ChatGPT

chatgpt.com

A conversational AI system that listens, learns, and challenges

— 舊文 —-

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

[快速筆記] 信件RWD

Next Post

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

Related Posts

筆記x備忘

於 MacOS 中,整合自然語言,自動化添加行事曆事件

這是一個嘗試更快添加行事曆安排的功能,主...

2025-06-10
100
心得x體驗

使用 deepwiki-open 針對程式碼產生 WIKI

DeepWiki-Open 是一套開源的...

2025-06-11
100
筆記x備忘

使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟

當 AI 建立可使用的文字越來越可靠的時...

2025-05-09
100
筆記x備忘

Visual Studio Code 的 PHP CS Fixer 設定

最近有幸換一台好一點電腦,開始投入 VS...

2025-03-25
100
筆記x備忘

MacOS 添加本地伺服器的 DNS

目前本地開發使用 VM 的應用程式(VM...

2025-03-26
100
筆記x備忘

Mac 上使用 pyenv 管理 python 環境

先說可能用 docker 會很方便,這邊...

2025-02-23
100
Load More
Next Post

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

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

Hestiacp 安裝筆記

全站搜尋

No Result
View All Result

關於我

育心文具行

Jerry Lin

程式設計師

育心文具行是一家文具店,老闆的小兒子是一個設計師,職業是設計程式,興趣是設計人,倒是還沒有實作的機會。
--
所有的相遇都不是巧合。
在廣告公司待了三年有兩年多在做內容產品,離職後繼續在內容產業走了四年多,最後選則離開台灣的公司體制在家 SOHO ,碰上了 2020 年疫情才知道原來自己這是走在時代的潮流尖端。 感謝許多老闆和貴人相助,至今目前尚能存活,在台北街頭努力著。

近期文章

  • 於 MacOS 中,整合自然語言,自動化添加行事曆事件
  • 使用 deepwiki-open 針對程式碼產生 WIKI
  • 使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟
  • Visual Studio Code 的 PHP CS Fixer 設定
  • MacOS 添加本地伺服器的 DNS

分類

  • 心得x體驗 (45)
  • 筆記x備忘 (77)
  • 閒談x雜記 (13)

贊助買咖啡

Facebook Instagram RSS

標籤

ai android cloudflare flutter git ios javascript linode linux MAC macos mis nginx php plugin QBQ!問題背後的問題 server work sublime sublime text vps vue.js vue3 What if What If? 如果這樣,會怎樣? wordpress 前端 原則 原子習慣 團隊,從傳球開始 團隊,從傳球開始:五百年都難以超越的 UCLA 傳奇教練伍登培養優越人才和團隊的領導心法 壓力測試 外掛 如果這樣,會怎樣?:胡思亂想的搞怪趣問 正經認真的科學妙答 心得 情緒 活動心得 灰階思考 約翰‧漢尼斯 股癌 自慢10 自慢10:18項修練 記錄 謝孟恭 讀書心得 這一生,你想留下什麼?

文章分類

  • 心得x體驗 (45)
  • 筆記x備忘 (77)
  • 閒談x雜記 (13)

近期文章

  • 於 MacOS 中,整合自然語言,自動化添加行事曆事件
  • 使用 deepwiki-open 針對程式碼產生 WIKI
  • 使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟
  • Visual Studio Code 的 PHP CS Fixer 設定
  • MacOS 添加本地伺服器的 DNS

近期留言

  • 「Bolin Lai」於〈WordPress 之中藍新金流開啟後, Elementor 外掛有時會打不開的問題處理〉發佈留言
  • 「Jerry Lin」於〈WordPress 之中藍新金流開啟後, Elementor 外掛有時會打不開的問題處理〉發佈留言
  • 「JCL」於〈WordPress 之中藍新金流開啟後, Elementor 外掛有時會打不開的問題處理〉發佈留言

文章月曆

2025 年 6 月
日 一 二 三 四 五 六
1234567
891011121314
15161718192021
22232425262728
2930  
« 5 月    

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

No Result
View All Result
  • 首頁
  • 心得x體驗
  • 筆記x備忘
  • 閒談x雜記
  • 我的工具箱
  • 關於我

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