キモブロ

Please spy check please, Fucking retard

SourceModでクライアントの言語環境によって表示するメッセージを変える方法

いわゆるi18n化する方法。サーバーに接続してきたユーザーの国の言葉でサーバーの使い方を表示してあげたい! みたいなときにやるべきことをまとめる。ちなみにまぁ公式の下記ページに乗ってます。しかしながらこれだけだといまいちわからなかったのと、実際に試してちゃんと理解できたこともあるので補足していくみたいな感じにしたい。そして多分誰もが知ってるんだろうけどあえて偉そうに書いていくことにしたい。
Translations (SourceMod Scripting) - AlliedModders Wiki


まず、最初にやらなければならないのが、addons/sourcemod/configs/languages.cfg の設定。
ここで、あなたのサーバーが想定してる接続される予定の国を定義する必要があるらしい。たとえば日本を対応させたい場合は以下のようにする

"Languages"
{
	"en"			"English"
	"ja"			"Japanese"
}

※たぶん、これによって cl_language が "japanese" の人が来たときは "ja" というカントリーコードを使う、みたいなマッピングをしてるんだと思う。右側から左側へのマッピング


次は、SourceModのコアの設定ファイルを編集する。addons/sourcemod/configs/core.cfg
まずServerLangの説明。

	/**
	 * Language that multilingual enabled plugins and extensions will use to print messages.
	 * Only languages listed in languages.cfg are valid.
	 *
	 * The default value is "en"
	 */
	"ServerLang"	"en"

この設定項目により、サーバーのデフォルトの言語を指定できる。デフォルトだとen(英語)になっている。ただ、今回はこれはいじらない。なんでかっていうとこれはサーバー側のデフォルトの言語が変更出来るだけなので、接続してきてくれたユーザーそれぞれの言語でメッセージ表示したいときにはまるで使えない。たとえばアフリカの人が接続してきてくれたのに日本語で表示しても意味が無いのである! ということで俺のニーズだとこの設定は使えないのでこのまま放置。


次は、AllowClLanguageVarの設定。さっきのServerLangと同じファイルにある。

	/**
	 * Enables or disables whether SourceMod reads a client's cl_language cvar to set
	 * their language for server-side phrase translation.
	 *
	 * "on"		- Translate using the client's language (default)
	 * "off"	- Translate using default server's language
	 */
	"AllowClLanguageVar"		"On"

これは、サーバーに接続してきたクライアントのcl_languageというcvarをSourceModが利用するかどうかという設定。これはデフォルトで"On"だけど、これがないと接続してきたユーザーに合わせて表示する言語を変更するというのが実現できないので"On"にするの必須です!!


以上のすべての設定によって、SourceModは接続してきたユーザーのcl_languageをもとに、カントリーコードを識別できるようになった。cl_language japanese の人が接続してきたときは、SourceModさんは、"ja" であることが理解できるようになった。


次に、このカントリーコードごとの翻訳情報を作成する必要がある
addons/sourcemod/translations にファイルが翻訳系のファイルがいっぱいあって、まぁこれを適当にいじればいいんだけど、たとえば ./translations/core.phrases.txt はこんなかんじで編集したらいい↓

"Phrases"
{
	"No Access"
	{
		"en"			"You do not have access to this command"
		"ja"			"アクセス権限がありません"
	}

"ja"というカントリーコードのユーザーには日本語で表示しろやというのが定義で来てるのがわかる。


おまけ1
ところで、cl_language cvarだけど、これはsteamの言語設定によって変わる。たとえば日本語に設定してると cl_language は japanese だし、英語に設定してると english になる。

ただしtranslationsのテストするときに、steamの言語設定を変えちゃうと、steamが自分の国の言葉で使えなくなってだるかったりする。そこで特定のゲームだけ言語設定を変えたいときは、そのゲームの起動オプションに、-language english みたいな感じで付け足してあげればいい。

さらにもっというと、SourceModのtranslationsのテストだけしたいときは、もっと簡単な方法があって、cl_language cvarを直接書き換えちゃう。ただしサーバーに接続する前に変更しておく必要があるので、

cl_language english 
connect host:port

みたいな感じでやる必要がある。


おまけ2
PrintToChatするときに、LANG_SERVERを引数として渡すと、configs/core.cfg で定義したサーバーデフォルトの言語設定が使用されるようだ。customvotes sourcemod pluginはなぜかほとんどLANG_SERVER定数を固定で渡すようになってて、ユーザーに合わせてメッセージ変えるきがまるでないプラグインだった! その辺全部 client を渡すように書きなおしたら自分の望むとおりの処理になった :)