Personal WP Customization Notes (PWCN)

WordPressで実際に行ったカスタマイズの記録、発生した問題への対処時のメモ、ブロックテーマのカスタマイズなど

本体やプラグイン、テーマなどの文字列をコードを使って変更する方法

WordPressは本体もプラグインやテーマも、基本的には英語で作られ、翻訳ファイルを適用させることで文字列を翻訳するようになっています。

従って、それらの翻訳文字列を変える場合には、翻訳ファイルの文字列を編集するのがセオリーなのですが、翻訳ファイルは更新によって上書きされるため、いつの間にか戻ってしまうという不都合が発生します。

この不都合を回避するためには、以下のコードを使って、翻訳よりも優先して指定した文字列を表示させるようにします。

function pwcn_change_translated_text( $translated_text, $untranslated_text, $domain ) {
	// テキストドメインの指定
	//defaultを指定することでWordPressコア翻訳の場合に限定する
	if( $domain == 'default' ){

		switch ( $untranslated_text ) { //第二引数の元の文字列を$untranslated_textとしてケース分け
				// 例:Dashboardという文字列を「メインパネル」へ変更する
				case 'Dashboard':
				$translated_text = __('Main Panel','text-domain');
				break;

				// 例:Site Health Statusという文字列を「サイトの稼働状況」へ変更する
				case 'Site Health Status':
				$translated_text = __('Site Condition','text-domain');
				break;

		}
	}

	return $translated_text;
}
add_filter( 'gettext', 'pwcn_change_translated_text', 10, 3 );

文字列の変更にはgettextというフィルターフックを使います。このフックは引数として「変更後の文字列(上記コードでは$translated_textという変数)」「元の文字列($untranslated_text)」「テキストドメイン($domain)」を受け取るようになっています。

コード内ではまず$domainに「default(WordPress本体の翻訳)」を指定し、switch関数を使って、case関数によって$untranslated_textがそれぞれの場合(コード例では「Dashboard」「Site Health Status」という場合にはそれぞれ「Main Panel」「Site Condition」へ変更するよう指示しています。

ひとまず上記のコードをそのまま有効化しているテーマのfunctions.phpもしくは自作プラグインのphpファイルへ加えて、ダッシュボードを表示してみてください。

日本語であればダッシュボードの「ダッシュボード」という文字が「Main Panel」に代わり、「サイトヘルス」というウィジェットタイトルが「Site Condition」に変わっていることが確認できます。

日本語オンリーのサイトであれば、「Main Panel」ではなく「メインパネル」とするなどそのまま日本語で書いてしまってもいいのですが、そのサイトの管理画面を多国語に対応させるには、「text-domain」の部分を自作プラグインのテキストドメインに変えて、そこに翻訳を加えることで、「Main Panel」という英字を日本語他の言語に変換することもできます。

もしも日本語オンリーであれば、コード中の「__(‘Main Panel’,’text-domain’);」の部分を「’メインパネル’;」などに変更すればいいでしょう。

今回紹介したコードを使っても一部のプラグインやテーマでは文字列が変えられないことがあります。その場合にはそのプラグインやテーマがどのように文字列を指定しているか、その文字列が翻訳対象の文字列として書かれているかを確認します(残念ながら英語でハードコードされた(直接書かれた)文字列はこのコードでは書き換えできませんのでご注意ください)

また、多数の変更が必要な場合にはswitch→case文が増殖してしまうため、以下のように配列にするのも手かも知れません。

function pwcn_array_change_translated_text( $translated_text, $untranslated_text, $domain ) {
if ( $domain === 'default' ) {
		$replacements = array(
			'Dashboard' => 'Main Panel', 
			'Site Health Status' => 'Site Condition',
		);

		if ( isset( $replacements[ $untranslated_text ] ) ) {
			$translated_text = __( $replacements[ $untranslated_text ], 'text-domain' );
		}
	}

	return $translated_text;
}
add_filter( 'gettext', 'pwcn_array_change_translated_text', 10, 3 );

この場合も、多言語対応の必要がなければ、「Main Panel」や「Site Condition」の部分を日本語にしてしまい、$translated_text = __( $replacements[ $untranslated_text ], ‘text-domain’ );のところを以下のように翻訳対象として認識されないようにすればいいでしょう。

$translated_text = $replacements[ $untranslated_text ];

以上が、コードを使って文字列の翻訳を変える方法でしたが、1点だけ注意点があります。

それは、変更する文字列が増えれば増えるほど処理にかかる時間とサーバーへの負荷がかかることです。

例えばコード中の「Dashboard」という文字列がページの中に複数あったとします。するとこのコードによって「Dashboard」という単語がある度に、この文字列を変換する指示がなかったかしら..あったあった、変更しよう..というのが走ることになり、文字列変換の候補が増えるほどこの処理が延々と回ることになるからです。

WordPress本体の翻訳の場合はこの手法を取るのがいいかと思いますが、プラグインの翻訳変更であれば、.mo .l10n.phpファイルを用意して、以下のプラグインなどを使って強制的に変更させた方が効率的かと思います。

コメントを残す

メールアドレスが公開されることはありません。※ が付いている欄は必須項目です

※リンクやURLの挿入されているコメントは無視します