transerとは
transerは、日本語で構築されたWebサイトをサーバーサイドで多言語翻訳するためのサービスです。 ページ全体のHTMLを受け取り、文脈を保ったまま翻訳済みのHTMLを返します。
利用者が自分のサーバーに導入するのは軽量なクライアントだけです。 重い翻訳処理(文脈解析・Google翻訳連携・HTML再構築)はすべてtranserサーバー側で実行されます。
ブラウザ側でJavaScriptを使って翻訳する方式では、Googleなどのクローラーは翻訳前の日本語しか読めないためSEO効果がありません。 transerはサーバーサイドで翻訳済みHTMLを生成するため、クローラーが各言語のコンテンツを正しくインデックスします。
提供形態
- transer(Pythonパッケージ):Nginx/Apache2配下の自前アプリ(Flask、FastAPI、Djangoなど)向け
- transer-translate(WordPressプラグイン):WordPressサイト向け
アーキテクチャ
リクエストの流れは以下のとおりです。
# ① ユーザーが言語ボックスで言語を選択
ブラウザ → あなたのサーバー(Nginx/Apache2)
# ② あなたのサーバーがtranser APIにHTMLを送信
あなたのサーバー → api.transer.io
POST /translate-page
{
"api_key": "tsr_live_xxxxxxxx",
"html": "<html>...日本語のHTML全文...</html>",
"source_lang": "ja",
"target_lang": "en"
}
# ③ transerが翻訳済みHTMLを返す
api.transer.io → あなたのサーバー
{ "html": "<html>...translated HTML...</html>" }
# ④ あなたのサーバーがブラウザに返す
あなたのサーバー → ブラウザ(翻訳済みページを表示)
transerが提供するのはAPIクライアント(transerパッケージ)と翻訳処理(api.transer.io)です。 Nginx/Apacheのルーティング設定と言語ボックスUIはあなたのサーバーに実装してください。詳細はNginx設定例を参照してください。
Pythonパッケージ(transer)
Nginx/Apache2配下のPythonアプリ(Flask・FastAPI・Djangoなど)に導入します。
インストール
pipでGitHubから直接インストールします。PyPIには公開していません。
pip install git+https://github.com/HippoGo530/transer
特定バージョンを指定する場合(推奨):
pip install git+https://github.com/HippoGo530/transer@v0.1.0
基本的な使い方
from transer import Translator
translator = Translator(
api_key="tsr_live_xxxxxxxx", # ダッシュボードで発行したAPIキー
base_url="https://api.transer.io" # transer APIのURL
)
# ページ全体のHTMLを翻訳(非同期)
translated_html = await translator.translate_page(
html=original_html,
source_lang="ja",
target_lang="en"
)
FastAPIでの実装例
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from transer import Translator
import os
app = FastAPI()
translator = Translator(
api_key=os.environ["TRANSER_API_KEY"],
base_url="https://api.transer.io"
)
# 言語ごとのパスで受け取る例: /en/about, /zh/about
@app.get("/{lang}/{path:path}")
async def translate_proxy(lang: str, path: str, request: Request):
# まず日本語の元ページを取得
original_html = await fetch_original_page(path)
# transerで翻訳
translated = await translator.translate_page(
html=original_html,
source_lang="ja",
target_lang=lang
)
return HTMLResponse(translated)
Nginx設定例
言語プレフィックス付きのURLパス(例:/en/、/zh/)へのリクエストを、
翻訳プロキシアプリに転送します。それ以外のリクエストは元のサイトにそのまま渡します。
server {
listen 80;
server_name example.com;
# 言語プレフィックス付きリクエストは翻訳プロキシへ
# 対応言語コードを追加した場合はここに追記する
location ~ ^/(en|zh|ko|fr|de|es|pt|it|ru|ar|th|vi|id|ms|nl|pl)/ {
proxy_pass http://127.0.0.1:8001; # 翻訳プロキシアプリのポート
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 60s; # 翻訳処理に時間がかかる場合があるため長めに設定
}
# それ以外(日本語の元ページ)はそのまま
location / {
proxy_pass http://127.0.0.1:8000;
}
}
言語が選択されたとき、現在のパスに言語プレフィックスを付けてリダイレクトするだけです。
function switchLang(lang) {
const current = window.location.pathname;
// 既に言語プレフィックスがある場合は入れ替える
const withoutPrefix = current.replace(/^\/(en|zh|ko|fr|de|es|pt|it|ru|ar|th|vi|id|ms|nl|pl)\//, '/');
// ja(日本語)の場合はプレフィックスなしで元ページへ
if (lang === 'ja') {
window.location.href = withoutPrefix;
} else {
window.location.href = `/${lang}${withoutPrefix}`;
}
}
WordPressプラグイン(transer-translate)
WordPressのob_start()を使ってページ全体のHTML出力を横取りし、
transer APIで翻訳してからブラウザに返します。PHPで完結するため、
Pythonパッケージは不要です。
インストール
-
zipファイルをダウンロード ダッシュボードのAPIキーページから
transer-translate.zipをダウンロードします。 -
WordPressにアップロード 管理画面 → プラグイン → 新規追加 → 「プラグインのアップロード」から zip ファイルをアップロードし、有効化します。
-
設定画面でAPIキーを入力 管理画面 → 設定 → transer に進み、APIキーと翻訳先言語を設定します。
セキュリティと動作安定性のため、
/wp-admin/、ログインページ、AJAX、REST APIエンドポイント、フィード、プレビュー画面は翻訳処理をスキップします。
設定項目
| 設定項目 | 説明 | 例 |
|---|---|---|
transer_api_key必須 |
ダッシュボードで発行したAPIキー | tsr_live_xxxxxxxx |
transer_api_url必須 |
transer APIのエンドポイントURL | https://api.transer.io |
transer_source_lang任意 |
元の言語コード(デフォルト: ja) |
ja |
transer_target_langs必須 |
翻訳先言語コードのカンマ区切りリスト | en,zh,ko |
ショートコード
投稿・固定ページに言語切り替えUIを追加します。
[transer_lang_switcher]
翻訳APIタグ
翻訳APIタグは、サイトの </head> に1行追加するだけで
フローティング言語セレクターを設置できるJavaScriptウィジェットです。
Pythonパッケージやサーバー設定は不要で、あらゆるCMSやHTMLサイトに対応します。
サーバー側のRewrite設定と組み合わせることで、
/en/ /ko/ のような言語プレフィックス付きURLを生成し、
各言語ページを検索エンジンに正しくインデックスさせるSEO対応が可能です。
scriptタグの設置
</head> の直前に以下の1行を追加してください。
lang=ja はサイトの原文言語コードです。
<script src="https://api.transer.io/js/trsNew.js?lang=ja"
charset="utf-8"></script>
</head>
設置後、ページをリロードするとフローティング言語セレクターが表示されます。
Rewrite設定(SEO対応)
翻訳APIタグは言語を切り替えた際、URLに /en/ /ko/ などの
プレフィックスを付与します(pushState)。
サーバー側でこのURLを実際のページに内部転送することで、
クローラーが各言語URLをインデックスできます。
Apache2 / .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
# 言語プレフィックス付きURLを実パスに内部転送
# 例: /en/products/ → /products/(URLバーはそのまま)
RewriteCond %{REQUEST_URI} ^/(en|ko|es|zh-CN|zh-TW)/
RewriteRule ^(en|ko|es|zh-CN|zh-TW)/(.*)$ /$2 [L,QSA]
</IfModule>
Nginx
server {
listen 80;
server_name example.com;
root /var/www/html;
# 言語プレフィックス付きURLを実パスに内部転送
location ~ ^/(en|ko|es|zh-CN|zh-TW)(/.*)?$ {
try_files $2 $2/ /index.php?$query_string;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
WordPress (.htaccess)
WordPressの .htaccess には標準ルールが自動生成されます。
transer.io のルールはその直前に記述してください。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# ── transer.io 仮想URL(WordPressルールより前に記述)──
RewriteCond %{REQUEST_URI} ^/(en|ko|es|zh-CN|zh-TW)/
RewriteRule ^(en|ko|es|zh-CN|zh-TW)/(.*)$ /$2 [L,QSA]
# ── WordPress 標準ルール ──────────────────────────────
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
.htaccess が再生成され、transer.io のルールが消えます。
保存後は再追記してください。
動作イメージ
# ① ユーザーが英語版URLにアクセス
ブラウザ: https://example.com/en/products/?id=23
# ② Rewriteが内部転送(URLバーは変わらない)
サーバー: /products/?id=23 を処理
# ③ 翻訳APIタグが /en/ を検知して英語翻訳を適用
翻訳APIタグ: sessionStorage に cur_lang='en' をセット → 英語翻訳適用
# ④ URLバーをそのまま維持(pushState)
URLバー: https://example.com/en/products/?id=23 を維持
設定オプション
scriptタグのクエリパラメータで動作をカスタマイズできます。
| パラメータ | 説明 | デフォルト |
|---|---|---|
lang必須 |
サイトの原文言語コード | ja |
position任意 |
ウィジェットの初期表示位置。bottom-right / bottom-left / top-right / top-left |
bottom-right |
color任意 |
ウィジェットのアクセントカラー(16進カラーコード) | #2563EB |
exclude任意 |
翻訳対象外にするCSSセレクタ(カンマ区切り) | — |
カスタマイズ例
<!-- 左下に配置・オレンジ色・.no-translate クラスを除外 -->
<script
src="https://api.transer.io/js/trsNew.js?lang=ja&position=bottom-left&color=%23F97316&exclude=.no-translate"
charset="utf-8"></script>
</head>
APIリファレンス
エンドポイントとベースURL
https://api.transer.io
認証
すべてのリクエストにAPIキーを含める必要があります。リクエストボディのJSONに api_key フィールドとして含めてください。
curl -X POST https://api.transer.io/translate-page \
-H "Content-Type: application/json" \
-d '{"api_key": "tsr_live_xxxxxxxx", ...}'
POST /translate-page
HTML全体を受け取り、翻訳済みHTMLを返します。メインのエンドポイントです。
リクエストボディ
| フィールド | 型 | 説明 |
|---|---|---|
api_key必須 |
string | APIキー |
html必須 |
string | 翻訳するHTMLの全文 |
source_lang必須 |
string | 元の言語コード(例: ja) |
target_lang必須 |
string | 翻訳先言語コード(例: en) |
レスポンス
{
"html": "<html>...翻訳済みHTML...</html>",
"chars_translated": 1240 // 課金対象の翻訳文字数
}
曜日・年月日・元号などの決定的変換(パターンマッチで確実に変換できるもの)はGoogle翻訳APIに送信しないため、
chars_translated の値が入力文字数より少なくなることがあります。課金はこの値を基準に行います。
POST /translate
テキスト配列を翻訳します。/translate-page との違いは、HTMLではなく文字列の配列を受け取る点です。下位互換のために残しています。
| フィールド | 型 | 説明 |
|---|---|---|
api_key必須 |
string | APIキー |
texts必須 |
string[] | 翻訳するテキストの配列 |
source_lang必須 |
string | 元の言語コード |
target_lang必須 |
string | 翻訳先言語コード |
GET /usage
APIキーごとの当月使用量(翻訳文字数・リクエスト数)を返します。
curl "https://api.transer.io/usage?api_key=tsr_live_xxxxxxxx"
{
"summary": [
{
"api_key_id": 1,
"total_chars": 1240382,
"request_count": 8214
}
]
}
GET /health
サービスの稼働状態を確認します。監視ツールのヘルスチェックに使用してください。
curl https://api.transer.io/health
# → {"status": "ok"}
対応言語一覧
120以上の言語に対応しています。以下は推奨16言語(翻訳精度を特に最適化済み)です。それ以外の言語コードはGoogle翻訳の言語コードに準拠します。
言語ボックスUI例
フラグ付きのセレクトボックスを設置する最小構成の例です。スタイルは自由にカスタマイズしてください。
<select id="lang-switcher" onchange="switchLang(this.value)">
<option value="ja">🇯🇵 日本語</option>
<option value="en">🇺🇸 English</option>
<option value="zh">🇨🇳 中文</option>
<option value="ko">🇰🇷 한국어</option>
</select>
よくある質問
キャッシュを使いたい場合は、あなたのサーバー側(Nginx、Redisなど)で翻訳済みHTMLをキャッシュする実装を追加してください。2回目以降のリクエストはtranserへ送信されないため、課金も発生しません。
ただし、
<strong>、<em>などのインライン装飾タグが文の途中にある場合、文境界の認識が変わることがあります。<a>タグのhref属性はそのまま保持されます。
APIキーはサーバーの環境変数に設定し、ソースコードやGitリポジトリに直接記述しないようにしてください。