🔤

【無料】poファイルを一括翻訳する方法

に公開

はじめに

様々な用途で,potテンプレートから,英語->日本語対応させたい場面が多いと思います.多くはWordPressの英語のテーマを日本語に対応させたい!とか,多言語対応のゲーム制作がしたい!とか.そこでよく使われているのはPoeditです.一行ずつ言語を対応させることができて素晴らしいアプリだと思います.

しかし,基本的には手入力が求められます.数行程度だったらいいですが,数百行となると大変です.自動で翻訳してくれる機械翻訳機能はありますが,無料だと1日10行までです.(お試し程度)
有料は50,000words/1monthのサブスクで1年契約6000円程度です.(面倒な人はこれでいいかもしれませんができる限り捻出を抑えれたらハッピー)

そこでPythonを使って,Poeditの有料版を無料で再現します.
poファイルをGoogle翻訳やDeepL翻訳を使って無料で自動で一括翻訳する方法を紹介します.

事前準備

poファイルの用意

(※poファイルが既に準備済みの方は飛ばしてください.POTファイルはあるものとします.)
POTファイルから,ja.poを作成します.

  1. Poedit をダウンロード(https://poedit.net/ から)
  2. Poeditアプリを起動して,「新規作成」をクリックして任意のPOTファイルを選択します.
  3. 翻訳言語を選択し(今回は日本語),PCに保存します.

Python環境

はあるものとします.なければ,他の方のpython環境構築の記事を参照ください.

必要なライブラリを用意

Google翻訳用

pip install polib googletrans==4.0.0-rc1

DeepL翻訳用

pip install polib requests

DeepL APIの取得

DeepL翻訳を試したい人は無料のDeepL APIを取得しましょう.一旦Google翻訳だけ試したい方は飛ばしてOKですが,結構DeepL翻訳の方が優秀そうです.DeepL APIは一応,有料版Poedit同様,翻訳可能文字数に制限(50,000文字/1か月)がありますが,もし万が一超えてしまったら,Google翻訳の方を使えばよいです.Freeプランは引き落としはないですが,カードの登録が必要です.
https://www.deepl.com/ja/pro#developer

翻訳プログラム

Google翻訳のプログラム

以下のプログラムを実行してください..poファイルを読み込むためのパスはご自身で設定してください.

import polib
from googletrans import Translator

# .poファイルを読み込み
po = polib.pofile('ja.poがあるパス')

translator = Translator()

for entry in po:
    # 空のmsgstrだけを翻訳
    if entry.msgstr.strip() == "":
        try:
            # 翻訳してmsgstrにセット(src='en', dest='ja')
            translated = translator.translate(entry.msgid, src='en', dest='ja')
            entry.msgstr = translated.text
            print(f"✔ Translated: {entry.msgid} -> {entry.msgstr}")
        except Exception as e:
            print(f"⚠ Error translating: {entry.msgid}\n{e}")

# 翻訳済みファイルとして保存
po.save('messages_ja.po')  # 上書きしないように別名で保存
print("✅ 翻訳完了: messages_ja.po を保存しました")

DeepL翻訳のプログラム

以下のプログラムを実行してください.DeepL APIや.poファイルを読み込むためのパスはご自身で設定してください.

import polib
import requests
import time

DEEPL_API_KEY = "DeepL APIを入力してください."
DEEPL_API_URL = "https://api-free.deepl.com/v2/translate"  # Pro契約なら api.deepl.com に変更

INPUT_FILE = 'ja.poがあるパス'          # 元の.poファイル(英語ベース)
OUTPUT_FILE = '保存するパス,ファイル'  # 翻訳後に保存するファイル名

# .poファイルを読み込み
po = polib.pofile(INPUT_FILE)

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

def translate_text(text):
    params = {
        "auth_key": DEEPL_API_KEY,
        "text": text,
        "source_lang": "EN",
        "target_lang": "JA"
    }
    try:
        response = requests.post(DEEPL_API_URL, data=params, headers=headers)
        response.raise_for_status()
        return response.json()["translations"][0]["text"]
    except Exception as e:
        print(f"⚠️ 翻訳エラー: {text}\n{e}")
        return ""

# msgid を翻訳して msgstr に書き込み
for entry in po:
    if entry.msgstr.strip() == "" and entry.msgid.strip() != "":
        translated = translate_text(entry.msgid)
        if translated:
            entry.msgstr = translated
            print(f"✅ {entry.msgid}{translated}")
        time.sleep(0.1)

# 翻訳済みファイルとして保存
po.save(OUTPUT_FILE)
print(f"\n✅ 翻訳完了: {OUTPUT_FILE} を保存しました")

最後に

どちらのプログラムも一行一行翻訳していくので,元の文字数によっては結構時間がかかります.ですが,Poeditの有料版と同等の翻訳機能を簡単に無料で一括翻訳できるのは魅力的ではないでしょうか.ぜひ保存していってください.

Discussion