はじめに
日本語で書いた情報は、日本人にしか届かない。当たり前のことですが、改めて考えると少しもったいない気がします。
世界のインターネット人口は55億人。そのうち英語コンテンツが占める割合は25%以上、ウェブサイトの55%以上が英語で書かれているそうです。日本語話者は1億2000万人程度。英語でも発信するだけで、潜在的な読者は数十倍になることが予測されます。
この記事では、日本語記事から英語記事への翻訳を自動化した方法について書き、海外のブログプラットフォームを比較、実際に投稿するまでしてみようと思います。
記事翻訳の自動化
- Markdown構造を維持(見出し、リスト、リンク)
- コードブロックは触らない
- 技術用語はそのまま
- 自然で簡潔な技術英語を出力
CLIツール ((((by Claude Code
#!/usr/bin/env bash
#
# 使い方:
# chmod +x translate-md-to-en.sh
# ./translate-md-to-en.sh article.md # article-en.md を生成
#
# 環境変数:
# OPENAI_API_KEY (必須) OpenAI の API キー
# OPENAI_MODEL (任意) 使用するモデル (デフォルト: gpt-4.1-mini)
#
set -euo pipefail
# --- 設定 ---
MODEL="${OPENAI_MODEL:-gpt-4.1-mini}"
TEMPERATURE="0.2"
API_URL="https://api.openai.com/v1/chat/completions"
# --- 依存コマンドのチェック ---
if ! command -v curl &>/dev/null; then
echo "エラー: curl がインストールされていません。" >&2
exit 1
fi
# --- APIキーのチェック ---
if [[ -z "${OPENAI_API_KEY:-}" ]]; then
echo "エラー: OPENAI_API_KEY 環境変数が設定されていません。" >&2
echo " export OPENAI_API_KEY='sk-...'" >&2
exit 1
fi
# --- 引数の解析 ---
if [[ $# -lt 1 ]]; then
echo "使い方: $0 <input.md | ->" >&2
echo " '-' を指定すると標準入力から読み込みます" >&2
exit 1
fi
INPUT_FILE="$1"
OUTPUT_FILE=""
# --- 入力の読み込み ---
if [[ "$INPUT_FILE" == "-" ]]; then
INPUT_CONTENT=$(cat)
elif [[ -f "$INPUT_FILE" ]]; then
INPUT_CONTENT=$(cat "$INPUT_FILE")
# 出力ファイル名を生成: article.md -> article-en.md
DIR=$(dirname "$INPUT_FILE")
BASENAME=$(basename "$INPUT_FILE" .md)
OUTPUT_FILE="${DIR}/${BASENAME}-en.md"
else
echo "エラー: ファイルが見つかりません: $INPUT_FILE" >&2
exit 1
fi
if [[ -z "$INPUT_CONTENT" ]]; then
echo "エラー: 入力が空です。" >&2
exit 1
fi
# --- system プロンプト ---
SYSTEM_PROMPT="You are a professional technical translator specializing in software engineering content."
# --- user プロンプト ---
USER_PROMPT="Translate the following Japanese Markdown document into natural, concise technical English suitable for Medium articles.
Rules:
- Preserve all Markdown structure (headings, lists, links, etc.)
- Do NOT modify content inside code blocks (\`\`\`)
- Keep technical terms, library names, and proper nouns as-is
- Prefer short, direct sentences
- Remove unnecessary Japanese-style prefaces or greetings
- Output ONLY the translated Markdown, no explanations
---
$INPUT_CONTENT"
# --- Python を使って JSON 用にエスケープ ---
escape_json() {
python3 -c "import json,sys; print(json.dumps(sys.stdin.read()))"
}
ESCAPED_SYSTEM=$(echo -n "$SYSTEM_PROMPT" | escape_json)
ESCAPED_USER=$(echo -n "$USER_PROMPT" | escape_json)
# --- リクエストボディを生成 ---
REQUEST_BODY=$(cat <<EOF
{
"model": "$MODEL",
"temperature": $TEMPERATURE,
"messages": [
{"role": "system", "content": $ESCAPED_SYSTEM},
{"role": "user", "content": $ESCAPED_USER}
]
}
EOF
)
# --- API リクエスト ---
TMPFILE=$(mktemp)
trap 'rm -f "$TMPFILE"' EXIT
HTTP_STATUS=$(curl -s -w "%{http_code}" -o "$TMPFILE" \
-X POST "$API_URL" \
-H "Content-Type: application/json; charset=utf-8" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d "$REQUEST_BODY")
RESPONSE_BODY=$(cat "$TMPFILE")
# --- HTTP ステータスのチェック ---
if [[ "$HTTP_STATUS" -ne 200 ]]; then
echo "エラー: API リクエストが失敗しました (HTTP $HTTP_STATUS)" >&2
echo "レスポンス:" >&2
echo "$RESPONSE_BODY" >&2
exit 1
fi
# --- 翻訳結果の抽出 ---
extract_content() {
if command -v jq &>/dev/null; then
jq -r '.choices[0].message.content // empty'
else
python3 -c "
import json, sys
data = json.load(sys.stdin)
content = data.get('choices', [{}])[0].get('message', {}).get('content', '')
print(content)
"
fi
}
TRANSLATED=$(echo "$RESPONSE_BODY" | extract_content)
if [[ -z "$TRANSLATED" ]]; then
echo "エラー: 翻訳結果を取得できませんでした。" >&2
echo "レスポンス:" >&2
echo "$RESPONSE_BODY" >&2
exit 1
fi
# --- 出力 ---
if [[ -n "$OUTPUT_FILE" ]]; then
echo "$TRANSLATED" > "$OUTPUT_FILE"
echo "生成しました: $OUTPUT_FILE" >&2
else
echo "$TRANSLATED"
fi
Medium vs Dev.to
英語圏で主流のブログプラットフォームが2つあります。
Medium
- 月間アクティブ読者は1億人以上(2025年)
- 月間訪問数は1億〜3億
- 技術に限らず、エッセイ、ビジネス、ライフスタイル、なんでもある
- 有料サブスクリプションモデル(月$5で読み放題)
- 書き手への収益分配あり
Dev.to
- 登録ユーザー100万人以上(2023年)
- 月間訪問数は1,200万〜1,500万程度
- エンジニア向けに特化
- 完全無料、コミュニティ運営
- Markdownネイティブ対応
自分はMediumを選びました。理由は単純で、技術記事以外のことも書いてみたかったから。
技術記事だけを書くならDev.toのほうがいいかもしれませんね。ターゲットが明確だし、エンジニアコミュニティへの露出も高そうです。
...
というわけで、Mediumのほうにも、「How to Easily Share Your Writing with Japan(いかに楽をしてあなたの文章を日本にへシェアするか)」を同時投稿してみました。
読んでいただき、ありがとうございます。