PHPモジュールで多言語用の共通パーツを作成する(SOY Shop版)

多言語サイトを運営する時に大変なことの一つにテンプレートの編集があります。

日本語ページでデザインを修正した時に英語ページでもデザインを修正する。

言語数が多くなる程、一度の修正で手を付けなければいけない箇所が増えてきて、いずれは修正するのが億劫になりメンテナンスされなくなっていくという事があります。


この問題を回避する為に共通箇所はモジュールで管理しておくと良いです。

今回は例としてショップ名の表記の箇所をモジュール化してみます。

/ドキュメントルート/ショップID/.module/parts/shop_name.php

上記のファイルを作成しましたら、先に公開側ページのテンプレートに

<!-- shop:module="parts.shop_name" --><h1>SOY Shopを使ってみよう!</h1><!-- /shop:module="parts.shop_name" -->

のタグを挿入しておきます。




続いて、モジュールファイルの方のコードを作成します。

書き方は規模に応じていくつかあります。


1つ目は単純に日本語ページと英語ページの出し分けを行う方法です。


/ドキュメントルート/ショップID/.module/parts/shop_name.php

<?php

function soyshop_shop_name(string $html, HTMLPage $htmlObj){
	// 多言語プラグインで定義している定数がなかった場合はこの場で定義しておく。
	if(!defined("SOYSHOP_PUBLISH_LANGUAGE")) define("SOYSHOP_PUBLISH_LANGUAGE", "jp");

	switch(SOYSHOP_PUBLISH_LANGUAGE){
		case "en":
			echo "<h1>Let's use SOY Shop!</h1>";
			break;
		default:	// 日本語ページの場合はそのまま出力
			echo $html;
	}
}
?>

この方法は共通箇所のHTMLの文量が少ない時に有効ですが、文量が多くなると管理が大変です。




モジュールのもう一つの書き方は置換文字列を利用する方法です。

公開側のテンプレートに挿入するモジュールを下記のように変更します。

<!-- shop:module="parts.shop_name" --><h1>##SHOP_NAME##</h1><!-- /shop:module="parts.shop_name" -->

モジュールファイルの方を下記のように書き換えます。

/ドキュメントルート/ショップID/.module/parts/shop_name.php

<?php

function soyshop_shop_name(string $html, HTMLPage $htmlObj){
	// 多言語プラグインで定義している定数がなかった場合はこの場で定義しておく。
	if(!defined("SOYSHOP_PUBLISH_LANGUAGE")) define("SOYSHOP_PUBLISH_LANGUAGE", "jp");

	$list = array();
	switch(SOYSHOP_PUBLISH_LANGUAGE){
		case "en":
			$list["##SHOP_NAME##"] = "Let's use SOY Shop!";
			break;
		default:
			$list["##SHOP_NAME##"] = "SOY Shopを使ってみよう!";
	}

	// 置換文字列を変換する
	foreach($list as $replaceKey => $replaceText){
		$html = str_replace($replaceKey, $replaceText, $html);
	}

	echo $html;
}
?>

※定数のSOYSHOP_PUBLISH_LANGUAGEに代入される値は下記のページを参考にしてください。

https://github.com/inunosinsi/soycms/blob/master/cms/soyshop/webapp/src/module/plugins/util_multi_language/util/UtilMultiLanguageUtil.class.php


こちらの書き方はPHPの連想配列の知識が必要になりますが、メンテナンス性は上がります。

PHP: 配列 - Manual

同じカテゴリーの記事