メインコンテンツまでスキップ

Translate

プレイヤーごとの言語、翻訳ファイル、翻訳された看板、オプションの AI チャット翻訳。

プライベートv0.2.0ユーティリティ
必要TypeWriter0.9.0-beta-177 (BTC build)GUI任意MySQL任意MiniPlaceholders任意

BornToCraft ネットワーク向けに作られた拡張機能です。参照用にドキュメント化されており、配布されていません。

概要​

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 互換の任意のサーバー。キャッシュ付き。
  • 言語イベントとファクト — プレイヤーが言語を変更したときにエントリーをトリガーし、クライテリアで現在の言語を判定します。

インストール​

  1. 言語メニューと設定メニューを使うには、GUI エクステンションをインストールします(コマンドだけを使う場合は任意です)。
  2. 任意で、MySQL エクステンションをインストールします。AI 翻訳のキャッシュが、データベースに保存されます。ない場合は、メモリ上にのみ存在します。
  3. Translate の JAR を plugins/Typewriter/extensions/ に配置し、サーバーを再起動します。
  4. フォルダー plugins/Typewriter/Translate/ を作成し(最初の読み込み時に自動で作成されます)、.json の翻訳ファイルを配置します。
  5. プレースホルダーで翻訳を表示したい場合は、MiniPlaceholders をインストールします。

はじめに​

  1. TypeWriter の Web パネルでスタティックページを開き、Player Language アーティファクトを追加します。ないと、選択した言語は保存されません。
  2. Translation Config エントリーを追加します。languages に en_GB と fr_FR を追加し、それぞれに name、flag(バナーコード)、displayName(たとえば &3Francais)、minecraftCodes(fr_FR、fr_CA)、任意で fallbackLanguages を設定します。mainLanguage を en_GB に設定します。
  3. 次の内容で 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 !"
}
}
]
  1. プレースホルダーに対応した任意の MiniMessage テキスト(ダイアログ、ホログラム、スコアボード)で、<translate_key:welcome.message> を使用します。/translate fr_FR を実行したプレイヤーには、フランス語のテキストが表示されるようになります。
  2. プレイヤーがメニューから選べるようにするには、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
イベント1
ファクト1
アーティファクト3
マニフェスト1

トラブルシューティング​

[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 翻訳キャッシュ。