Translate
概要
Translate を使うと、各プレイヤーが言語を選び、その言語でサーバーのコンテンツを読めるようになります。言語は 1 つの設定エントリーで宣言し、テキストは JSON ファイルに記述し(形式は Triton プラグインと互換性があるため、既存のファイルを再利用できます)、MiniMessage のプレースホルダーを受け付ける任意の場所に、<translate_key:your.key> で表示します。各プレイヤーは自分の言語でテキストを見ることができ、テキストがない場合は、別の言語にフォールバックします。
その上に、3 つの任意の機能があります。翻訳された看板(看板は、それを見る人の言語でテキストを表示します)、通常の GUI ページとして構築する言語メニューと設定メニュー、そして、チャットメッセージを、AI プロバイダーまたは翻訳エンジンを通じて、異なる言語を話す閲覧者向けに翻訳する AI チャット翻訳です。
プレイヤーの選択は、アーティファクトに保存されます。言語は、プレイヤーごとに保存され、看板とチャット翻訳のオプトインも同様です。
機能
- 言語リスト — 各言語には、コード、バナーのフラグ、表示名、クライアントのロケール、フォールバック、選択時に実行するアクションがあります。
- Triton 形式の JSON ファイル —
%1、%2の引数を持つ、テキストと看板の翻訳。フォルダーから読み込まれ、再起動なしでリロードできます。 - フォールバックの連鎖 — 要求された言語、その
fallbackLanguages、そしてメイン言語の順。 - 自動検出 — 任意で、クライアントのロケールに一致する言語に切り替えます。
- 翻訳された看板 — 看板の座標にテキストを配置します。プレイヤーは設定メニューでオプトアウトできます。
- ページで宣言するメニュー — Translate のボタンタイプを使って、言語メニューと設定メニューを GUI ページとして構築します。
- AI チャット翻訳 — OpenRouter、OpenAI、DeepSeek、Groq、Mistral、Ollama、Anthropic、Gemini、LibreTranslate、DeepL、または OpenAI 互換の任意のサーバー。キャッシュ付き。
- 言語イベントとファクト — プレイヤーが言語を変更したときにエントリーをトリガーし、クライテリアで現在の言語を判定します。
インストール
- 言語メニューと設定メニューを使うには、GUI エクステンションをインストールします(コマンドだけを使う場合は任意です)。
- 任意で、MySQL エクステンションをインストールします。AI 翻訳のキャッシュが、データベースに保存されます。ない場合は、メモリ上にのみ存在します。
- Translate の JAR を
plugins/Typewriter/extensions/に配置し、サーバーを再起動します。 - フォルダー
plugins/Typewriter/Translate/を作成し(最初の読み込み時に自動で作成されます)、.jsonの翻訳ファイルを配置します。 - プレースホルダーで翻訳を表示したい場合は、MiniPlaceholders をインストールします。
はじめに
- TypeWriter の Web パネルでスタティックページを開き、Player Language アーティファクトを追加します。ないと、選択した言語は保存されません。
- Translation Config エントリーを追加します。
languagesにen_GBとfr_FRを追加し、それぞれにname、flag(バナーコード)、displayName(たとえば&3Francais)、minecraftCodes(fr_FR、fr_CA)、任意でfallbackLanguagesを設定します。mainLanguageをen_GBに設定します。 - 次の内容で
plugins/Typewriter/Translate/messages.jsonを作成し、Publish するか、/translate reloadを実行します。
[
{
"type": "text",
"key": "welcome.message",
"languages": {
"en_GB": "&6Welcome to the server, %1!",
"fr_FR": "&6Bienvenue sur le serveur, %1 !"
}
}
]
- プレースホルダーに対応した任意の MiniMessage テキスト(ダイアログ、ホログラム、スコアボード)で、
<translate_key:welcome.message>を使用します。/translate fr_FRを実行したプレイヤーには、フランス語のテキストが表示されるようになります。 - プレイヤーがメニューから選べるようにするには、GUI エクステンションでメニューページを作成し、そこに
translate_button:LANGUAGE#0、LANGUAGE#1... のアイテムを配置して、設定のlanguageMenuで参照し、Open Language Selector をトリガーします。
テキストの引数 %1、%2 が埋められるのは、引数付きで翻訳 API を呼び出すコードによってのみです。<translate_key:...> プレースホルダーはキーだけを受け取るため、そこでは %1 が記述されたままになります。
仕組み
プレイヤーの言語は、次の順で決定されます。保存された選択、クライアントのロケールに一致する言語(minecraftCodes)、そして mainLanguage。
翻訳ファイル
ファイルは、翻訳フォルダー(translationsFolder。デフォルトは plugins/Typewriter/ 内の Translate)の直下にある .json ファイルです。各ファイルはアイテムの配列で、ファイルは、そのような配列を translations、items、languages、data、entries の下に持つオブジェクトであってもかまいません。有効な type と key を持たないアイテムはスキップされ、解析に失敗したファイルは、ログに記録されて無視されます。
テキストアイテムは、key と languages オブジェクトを持ちます。& のカラーコードは変換されます。キーの検索は寛容です。完全一致のキー、次に、プレフィックス lang_、lang.、default. を付けたキー、次に大文字小文字を区別しない一致、最後に、最後の _ または . より後ろの部分での一致です。
看板アイテムは、locations(world、x、y、z)と、言語ごとの lines を持ちます。最大 8 行が読み取られますが、表示されるのは、最初の 4 行(表面)のみです。
{
"type": "sign",
"key": "shop.sign",
"locations": [{"world": "world", "x": 100, "y": 64, "z": 200}],
"lines": {
"en_GB": ["&b[Shop]", "&fClick to open", "", ""],
"fr_FR": ["&b[Boutique]", "&fCliquez pour ouvrir", "", ""]
}
}
看板は、プレイヤーが列挙された場所で、それを設置または編集したとき、または右クリックしたときに翻訳されます。プレイヤーには、クライアント側の更新を通じて、看板が自分の言語で表示されます。設定メニューで看板の翻訳をオフにしたプレイヤーには、元のテキストが表示されます。
メニュー
言語メニューと設定メニューは、GUI エクステンションの通常の open_gui エントリーです。Translate は、そのアイテムに配置するボタンタイプ(GUI アイテムのボタンタイプのフィールド)を提供します。
| ボタンタイプ | 動作 |
|---|---|
translate_button:LANGUAGE#<n> | 設定内の n 番目(0 から)の言語。コードと、有効なものを示すマーカーを表示し、左クリックで選択します。最後の言語より先は空です。 |
translate_button:TOGGLE_CHAT | プレイヤーの AI チャット翻訳を表示して切り替えます(デフォルトはオン)。 |
translate_button:TOGGLE_SIGN | プレイヤーの看板翻訳を表示して切り替えます(デフォルトはオン)。 |
Translation Config でページを参照します。セレクターには languageMenu(特定のビューには languageMenuViewId)、設定には settingsMenu(と settingsMenuViewId)です。Open Language Selector または Open Translation Settings で開きます。/translate menu は言語メニューを開きます。openSelectorCommandOverride が設定されている場合は、代わりにそのコマンドがコンソールから実行されます({player} はプレイヤー名に置き換えられます)。
メニューからの言語選択には Player Language アーティファクトが必要です。ない場合、プレイヤーには、選択が保存されないことが通知されます。トグルにも同様に、Player AI Preference と Player Sign Preference のアーティファクトが必要です。
AI チャット翻訳
Translation Config で aiTranslation を設定します。enabled を設定し、provider を選んで、apiKey を指定します。ベース URL とモデルは、apiBaseUrl や model を設定しない限り、プロバイダーのデフォルトになります。OPENAI_COMPATIBLE には apiBaseUrl が必要です。キーをページに保存する代わりに、環境変数から読み取るため、apiKey には env:VAR_NAME を使うことをお勧めします。
プレイヤーがチャットすると、メッセージは、言語が送信者と異なり、チャット翻訳をオンにしている各閲覧者の言語に翻訳されます。翻訳されたテキストは、閲覧者のチャットでメッセージの代わりに表示され、ホバーすると原文が表示されます。チャットは、翻訳を最大で chatTranslationTimeoutMs(デフォルトは 800 ミリ秒)だけ待ち、その後、まだ待っている閲覧者に、翻訳されていないメッセージを表示します。noTranslateRegex(デフォルトではコマンドと数字のみ)に一致するメッセージは送信されず、censorRegex に一致するテキストは、送信前に *** に置き換えられ、enabledSections には CHAT が含まれている必要があります。
3 回連続でリクエストが失敗すると、AI 翻訳は、次に翻訳をリロードするまで、自動的に無効になります。結果は、メッセージと言語ごとにキャッシュされます。MySQL エクステンションがある場合はデータベースに、ない場合はメモリ上に保存されます。
コマンド
コマンドは /translate で、エイリアスは /lang と /language です。プレイヤーのみが実行できます。
| コマンド | 説明 |
|---|---|
/translate | ヘルプを表示します。 |
/translate <language> | 設定された名前(たとえば fr_FR)で、自分の言語を設定します。 |
/translate list | 設定された言語を一覧表示し、自分の言語をマークします。 |
/translate menu | 言語セレクターを開きます。 |
/translate toggle_ai | 自分の AI チャット翻訳を切り替えます。 |
/translate sign set <key> | 見ている看板(5 ブロック以内)を、このキーで翻訳済みとしてマークします。typewriter.translate.admin が必要です。 |
/translate sign remove | 看板のマークを削除します。typewriter.translate.admin が必要です。 |
/translate sign info | 看板のキー、位置、翻訳を表示します。typewriter.translate.admin が必要です。 |
/translate reload | 翻訳ファイルをリロードします。typewriter.translate.admin が必要です。 |
/translate sign set は、看板にマーカーとキーを書き込むだけです。実際のテキストは、看板の位置を持つ JSON ファイルの sign アイテムから取得されます。
パーミッション
| パーミッション | 許可される内容 |
|---|---|
typewriter.translate.admin | /translate reload と /translate sign ...。 |
プレースホルダー
MiniPlaceholders のエクスパンション translate で、MiniMessage のタグとして使用できます。翻訳されたテキストには、MiniMessage のマークアップと、入れ子のプレースホルダーを含めることができます。
| プレースホルダー | 戻り値 |
|---|---|
<translate_key:some.key> | このキーの、閲覧者の言語のテキスト。ない場合は、赤色の [Translation not found: key]。 |
<translate_lang> | fr_FR などの、閲覧者の言語コード。 |
<translate_lang_display> | 言語の表示名。 |
<translate_lang_flag> | 言語のバナーのフラグコード。 |
<translate_count> | 読み込まれた翻訳の数(テキストと看板の合計)。 |
<translate_languages> | 設定された言語の数。 |
エントリー
10 件のエントリー(拡張機能のソースから生成)。
アクション4
- Open Language Selector ActionOpen the language selection menu
- Open Translation Settings ActionOpen the translation settings menu
- Reload Translations ActionReload translation files from disk
- Set Language ActionSet a player's translation language
イベント1
- Player Language Change EventTriggered when a player changes their language
ファクト1
- Player Language FactReturns the player's current language as a numeric value
アーティファクト3
- Player Ai Preference ArtifactStores player AI translation preferences
- Player Language ArtifactStores player language preferences
- Player Sign Preference ArtifactStores player sign translation preferences
マニフェスト1
- Translation ConfigConfigure the multi-language translation system
トラブルシューティング
[Translation not found: key] が表示される。 キーが、読み込まれたどのファイルにもないか、ファイルの読み込みに失敗しました。サーバーログで Failed to load translation file を確認し、JSON を検証して、/translate reload を実行してください。ファイルが plugins/Typewriter/Translate/ の直下にあり(サブフォルダーは読み込まれません)、.json 拡張子であることを確認してください。
ログインのたびに言語がリセットされる。 Player Language アーティファクトが Publish されていないため、選択が保存されません。1 つ追加してください。
メニューが何も起こさない。 ログに No 'languageMenu' configured または No 'settingsMenu' configured と表示されます。Translation Config でメニューページを設定してください。言語メニューでは、openSelectorCommandOverride が空でない場合、それが優先されます。
言語がクライアントの言語に追従しない。 保存された選択がない場合、クライアントのロケールが、ある言語の minecraftCodes に含まれていれば、自動的に使用されます。forceClientLocaleOnJoin は、クライアントが別の言語に一致するロケールの変更を報告するたびに、さらにプレイヤーを切り替え、保存された選択を上書きします。
AI 翻訳が動かなくなった。 ログで AUTOMATICALLY DISABLED を探してください。3 回連続の API の失敗で、オフになります。キー、URL、モデルを修正してから、/translate reload を実行してください。apiKey references env var ... not set は、環境変数がないことを意味します。
看板が翻訳されない。 看板は、JSON ファイルの sign アイテムに記載された座標に、正しいワールド名で、正確に存在している必要があります。プレイヤーが看板の翻訳をオフにしていないことが必要で、看板は、設置時または右クリック時に翻訳されます。
関連エクステンション
- TinyEssentials — AI 翻訳がチャットレンダラーをラップする際も、そのチャット形式が維持されます。
- MySQL — 永続的な AI 翻訳キャッシュ。