1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

いかに楽をして世界に情報発信するかっ🦧

1
Last updated at Posted at 2025-12-22

はじめに

日本語で書いた情報は、日本人にしか届かない。当たり前のことですが、改めて考えると少しもったいない気がします。

世界のインターネット人口は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(いかに楽をしてあなたの文章を日本にへシェアするか)」を同時投稿してみました。

読んでいただき、ありがとうございます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?