多言語サイト用の画像パス変換プラグインを作成する

多言語サイトを運営するに当たって、主の言語(日本語)と他言語(英語等)で異なる箇所はテキストデータ以外では、画像ファイルが異なります。

主の言語の他に他の言語用のページを用意して、画像パスの書き換えを行うという手もありますが、サイトの運営コストが上がってしまう為、プラグインを介しての画像管理を行うと後の運営が楽になります。


今回は上記の内容を満たすプラグインを作成してみます。


多言語サイトの運営の条件は下記の通りにします。

・<img>タグは必ず一行で記述することにする

・一行で複数の<img>タグがあっても構わない。

・<img>タグのsrc属性値は必ずスラッシュから始まる絶対パスにする

・多言語サイトは英語版とし、画像ファイルのパスを下記のように変換する

日本語 : <img src="/site/files/sample.jpg">
英語:<img src="/site/files/en/sample.jpg">

今回作成するプラグインはプラグインIDがplugin_convert_filepathにして話を進めます。


/CMSインストールディレクトリ/common/site_include/plugin/plugin_convert_filepath/plugin_convert_filepath.php

<?php

class PluginConvertFilepathPlugin{

	const PLUGIN_ID = "plugin_convert_filepath";

	function getId(){
		return self::PLUGIN_ID;
	}

	function init(){
		CMSPlugin::addPluginMenu(self::PLUGIN_ID, array(
			"name" => "プラグインのファイルパスの変換",
			"type" => Plugin::TYPE_NONE,
			"description" => "",
			"author" => "",
			"url" => "",
			"mail" => "",
			"version" => "1.0"
		));
		
		// 当プラグインが有効であるかを調べる
		if(CMSPlugin::activeCheck(self::PLUGIN_ID)){
			if(defined("_SITE_ROOT_")){
				// 公開側ページの方で動作する拡張ポイントで使用したいものを追加する

				CMSPlugin::setEvent("onOutput", self::PLUGIN_ID, array($this,"onOutput"), array("filter"=>"all"));
			}else{
				// 管理画面側の方で動作する拡張ポイントで使用したいものを追加する			
			}
		}
	}

	function onOutput($args){
		$html = &$args["html"];

		$lines = explode("\n", $html);
		$n = count($lines);
		if($n === 0) return $html;

		// 多言語プラグインで定義している定数がなかった場合はこの場で定義しておく。
		if(!defined("SOYCMS_PUBLISH_LANGUAGE")) define("SOYCMS_PUBLISH_LANGUAGE", "en");

		for($i = 0; $i < $n; $i++){
			$line = $lines[$i];
			// 画像ファイルがない行は飛ばす
			if(is_bool(stripos($line, "<img"))) continue;
			
			// 一行に複数のimgタグ対応 一行に<img>タグが複数行あるかもしれないので、preg_match_allを利用する
			preg_match_all('/<img.*?>/', $line, $tmps);
			if(!isset($tmps[0]) || !is_array($tmps[0]) || !count($tmps[0])) continue;

			foreach($tmps[0] as $tag){
				// src属性値がなければ飛ばす
				if(is_bool(stripos($tag, "src"))) continue;

				// src属性値を取得 src属性値でスラッシュから始まっていない場合は除く
				preg_match('/src=\"(.*?)\"/i', $tag, $tmp);
				if(!isset($tmp[1]) || $tmp[1][0] != "/") continue;
				
				// ファイル名を取得 最後のスラッシュの後の文字列がファイル名
				$filename = substr($tmp[1], strrpos($tmp[1], "/") + 1);
				
				// 多言語用の画像があるか?を調べる
				$src = str_replace($filename, SOYCMS_PUBLISH_LANGUAGE."/".$filename, $tmp[1]);
				if(!file_exists($_SERVER["DOCUMENT_ROOT"].$src)) continue;

				// 多言語用の画像があれば、<img>タグのsrc属性値を入れ替える
				$line = str_replace($tmp[1], $src, $line);
			}

			// 行の上書き
			$lines[$i] = $line;
		}

		return implode("\n", $lines);
	}

	public static function register(){
		$obj = CMSPlugin::loadPluginConfig(self::PLUGIN_ID);
		if(!$obj) $obj = new PluginConvertFilepathPlugin();
		CMSPlugin::addPlugin(self::PLUGIN_ID, array($obj, "init"));
	}
}

PluginConvertFilepathPlugin::register();

拡張ポイントはプラグインで出力直前でHTMLの記述を変更するで紹介したonOutputを利用します。

上記のコードは一行ずつHTMLのコードをバラした後、一行ずつ<img>タグがあるかを精査し、<img>タグがあれば、多言語用の画像があるかを調べて、画像があれば<img>タグのsrc属性の値を書き換えるということを行っています。


今回のプラグインのサンプルコードは下記のURLのページにあります。

https://github.com/inunosinsi/soycms/blob/master/cms/common/site_include/plugin/plugin_convert_filepath/plugin_convert_filepath.php

同じカテゴリーの記事