HEX
Server: Apache
System: Linux 4485441ca2e2 6.8.0-1039-aws #41~22.04.1-Ubuntu SMP Thu Sep 11 11:03:07 UTC 2025 aarch64
User: (1000)
PHP: 8.2.24
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/multi_lng/lib.php
<?php


class multi_lng_util{
	
	static $convert_type = 'file'; // mo or file
	
	static  $langdata = array();

	static function request_path($withquery = false){
		$homeurl = home_url();
		if (preg_match('/^https?:\/\/[^\/]+(.*)$/', $homeurl, $m)){
			$path = $m[1];
			$reqpath = getenv('REQUEST_URI');
			if (!$withquery){
				$qpos = strpos("?", $reqpath);
				$qpos = strpos($reqpath, "?");
				if ($qpos !== false){
					$reqpath = substr($reqpath, 0, $qpos);
				}
			}
			
			if (substr($reqpath, 0, strlen($path)) == $path){
				return substr($reqpath, strlen($path));
			}
		}
		return null;
	}
	static function set_cookie($nm, $v, $expire){
		$home = home_url();
		if (preg_match('/^https?:\/\/([^\/]+)(.*)$/', $home, $m)){
			$domain = $m[1];
			$path = $m[2];
		}
		else{
			return;
		}
		if ($path == ""){
			$path = "/";
		}
		setcookie($nm, $v, $expire, $path, $domain);
		
	}
	
	static function init(){
		$lng = self::lang();
/*		if (self::$convert_type == 'mo'){
			$mofile = get_template_directory().'/language/mo/message-'.$lng.'.mo';
			if (is_readable($mofile)){
				load_textdomain('multi_lng', $mofile);
			}
		}
		if (self::$convert_type == 'file'){
			self::load_langfile($lng);
		}
*/

		$GLOBALS['locale'] = $lng;

		add_shortcode('m', array('multi_lng_util', 'call_m'));
		add_shortcode('m_if', array('multi_lng_util', 'call_m_if'));
		add_shortcode('m_switch', array('multi_lng_util', 'call_m_switch'));
		add_shortcode('m_script', array('multi_lng_util', 'call_m_script'));

		add_action('locale', array('multi_lng_util', 'call_locale'), 100000);
		self::parse_request_path();
		
		add_action('init', array('multi_lng_util', "set_init"));

		add_action('wpmem_email_filter', array('multi_lng_util', "apply_multi_tag"), 100000);

		if (!is_admin()){
			add_action('wpcf7_contact_form', array('multi_lng_util', "apply_contact_form"), 100000);
		}
	}
	
	static function apply_attrs($attrs){
		$nattrs = array();
		while(preg_match('/^\s*(\w+)=\\\\*\"(.*?)\\\\*\"/s', $attrs, $m)){
			$attrs = substr($attrs, strlen($m[0]));
			$nm = $m[1];
			$vl = $m[2];
			$nattrs[$nm] = $vl;
		}
		return $nattrs;
	}
	
	static function apply_contact_form($contactform){
		wpcf7_add_shortcode('m', array('multi_lng_util', 'call_wpcf7_m'));
		wpcf7_add_shortcode('m_if', array('multi_lng_util', 'call_wpcf7_m_if'));
		add_action('wpcf7_form_tag', array('multi_lng_util', 'apply_wpcf7_formtag'));
		$convs = $contactform->prop('messages');
		foreach ($convs as $k=>$v){
			$convs[$k] = __m($v);
		}
		$contactform->set_properties(array('messages'=>$convs));
		$convs = self::apply_multi_tag($contactform->prop('mail'), "{");
		$contactform->set_properties(array('mail'=>$convs));
		$convs = self::apply_multi_tag($contactform->prop('mail_2'), "{");
		$contactform->set_properties(array('mail_2'=>$convs));
	}
	
	static function apply_wpcf7_formtag($tag){
		foreach($tag['values'] as $k=>$v){
			$tag['values'][$k] =  __m($v);
		}
		foreach($tag['labels'] as $k=>$v){
			$tag['labels'][$k] =  __m($v);
		}
		return $tag;
	}
	
	static function apply_multi_tag($arr, $tagsep=""){
		foreach ($arr as $k=>$v){
			if (is_array($v)){
				$arr[$k] = self::apply_multi_tag($v, $tagsep);
			}
			elseif (is_string($v)){
				$arr[$k] = self::apply_multi_tag_body($v, $tagsep);
			}
		}
		return $arr;
	}
	static function apply_multi_tag_body($body, $tagsep=""){
		$nbody = "";
		$value = "";
		$lang = "";
		$tag = "";
		if ($tagsep == "<"){
			$tagsep0 = '\\<';
			$tagsep1 = '\\>';
		}
		else if ($tagsep == "{"){
			$tagsep0 = '\\{';
			$tagsep1 = '\\}';
		}
		else{
			$tagsep0 = '\\[';
			$tagsep1 = '\\]';
		}
		
		while(preg_match('/^(.*?)'.$tagsep0.'(\/?)(m_if|m)(.*?)(\/?)'.$tagsep1.'/s', $body, $m)){
			$body = substr($body, strlen($m[0]));
	
			$clstag = $m[2];
			$resulttag = $m[3];
			$attrs = self::apply_attrs($m[4]);
			$sintag = $m[5];
			
	
			if ($clstag && $sintag){
				$nbody .= $m[1];
				continue;
			}
			
			if ($tag){
				if ($tag != $resulttag || !$clstag){
					$nbody .= $value;
					$tag = "";
					$value = "";
					$lang = "";
				}
				else{
					if ($tag == "m"){
						$nbody .= __m($m[1]);
					}
					else if ($tag == "m_if"){
						if (__m_if($lang)){
							$nbody .= $m[1];
						}
					}
					$tag = "";
					$value = "";
					$lang = "";
					continue;
				}
				
			}
			
			$nbody .= $m[1];
			if ($sintag){
				if ($resulttag == "m"){
					$val = isset($attrs['v'])?$attrs['v']:'';
					if ($val != ""){
						$nbody .= __m($val);
					}
				}
				else if($resulttag == "m_if"){
					$val = isset($attrs['v'])?$attrs['v']:'';
					$vlang = isset($attrs['lang'])?$attrs['lang']:'';
					if (__m_if($vlang)){
						$nbody .= $val;
					}
				}
			}
			else{
				$value = isset($attrs['v'])?$attrs['v']:'';
				$lang = "";
				if ($resulttag == "m_if"){
					$lang = isset($attrs['lang'])?$attrs['lang']:'';
				}
				$tag = $resulttag;
			}
		}
		
		$nbody .= $body;
	
		return $nbody;
	
	}

	static function call_locale($v){
		if (is_admin()){
			return $v;
		}
		return self::lang();
	}
	
	static function set_init(){
	}
	
	static function cookie_name(){
		return "_mlng_".preg_replace('/\W/', '_', home_url()).'0';
	}
	

	static function parse_request_path(){

		$path = self::request_path();
		if ($path == '/mlng_set/'){
			$cnm = self::cookie_name();
			if (array_key_exists('_lng', $_GET)){
				$lng = $_GET['_lng'];
				self::set_cookie($cnm, $lng, time()+60*60*24*30);
				
				$url = getenv('HTTP_REFERER');
				if (!$url){
					$url = home_url();
				}	
				else{
					$url = preg_replace('/_lng=[^=]+/', '', $url);
				}
				header('Location:'.$url);
				exit;
			}
		}
	}
	
	static function call_wpcf7_m($tags){
		return self::call_m($tags['attr'], $tags['content']);
	}
	static function call_m($attrs=array(), $contents=null){
		$v = isset($attrs['v'])?$attrs['v']:'';
		$cate = isset($attrs['cate'])?$attrs['cate']:'';
		if (!$v){
			$v = $contents;
		}
		return __m($v, $cate);
	}
	static function call_wpcf7_m_if($tags){
		return self::call_m_if($tags['attr'], $tags['content']);
	}
	static function call_m_if($attrs=array(), $contents=null){
		$lng = isset($attrs['lang'])?$attrs['lang']:'';
		$v = isset($attrs['v'])?$attrs['v']:'';
		if (!$v){
			$v = $contents;
		}
		if (!__m_if($lng)){
			return '';
		}
		return $v;
	}
	
	static function call_m_switch($attrs){
		$lng = self::lang();
		$html = '';
		foreach (array(array('ja','日本語'),array('en','English')) as $l){
			$setlng = $l[0];
			if ($setlng == 'ja') $setlng = '';
			if ($l[0] == $lng){
				$html .= '<span class="mlng_link">'.$l[1].'</span>';
			}
			else{
				$html .= '<a  class="mlng_link" href="'.home_url().'/mlng_set/?_lng='.$setlng.'">'.$l[1].'</a>';
			}
		}
		return $html;
	
	}
	static function call_m_script(){
		$lang = self::lang();
		$html = '';
		$html .= '<script type="text/javascript" src="'.plugin_dir_url(__FILE__).'multi_lng/js/mlng.js"></script>';
		$themefile = MULTI_LNG_PLUGIN_CONFIG.'/js/language-'.$lang.'.js';
		if (is_readable($themefile)){
			$themeurl = MULTI_LNG_PLUGIN_URL.'/js/language-'.$lang.'.js';
			$html .= '<script type="text/javascript" src="'.$themeurl.'"></script>';
		}
		return $html;
	}

	static function lang(){
		if (is_admin()){
			return "ja";
		}
			
		$cnm = self::cookie_name();
		if (array_key_exists($cnm, $_COOKIE)){
			return $_COOKIE[$cnm];
		}
		return 'ja';
	}
	
	static function wd($v, $cate=""){
		$lng = self::lang();
		if (!$lng){
			return $v;
		}
		if (self::$convert_type == 'mo'){
		//	return __($v, 'multi_lng');
		}
		if (self::$convert_type == 'file'){
			return self::langword($lng, $v, $cate);
		}
		return $v;
	}
	
	
	static function match($v){
		$lng = self::lang();
		if (!$lng){
			return $v;
		}
		self::load_langfile($lng, 'match');
		$matches = self::$langdata[$lng]['match'];
		foreach ($matches as $key=>$val){
			if (preg_match('/^'.$key.'$/', $v, $m)){
				$nv = "";
				$pos = 0;
				for($i = 0; $i < strlen($val); $i++){
					if ($val[$i] == '\\'){
						$i++;
						continue;
					}
					if ($val[$i] == '$' && $i < strlen($val)-1){
						$d = -1;
						$j = 1;
						while(1){
							if ($i+$j >= strlen($val)) break;
							$cpos = strpos("0123456789", $val[$i+$j]);
							if ($cpos === false){
								break;
							}
							if ($d < 0) $d = 0;
							$d = $d*10+$cpos;
							$j++;
						}
						if ($d == -1) continue;
						$rep = "";
						if ($d < count($m)) $rep = $m[$d];
						$nv .= substr($val, $pos, $i - $pos);
						$nv .= $rep;
						$pos = $i+$j;
					}
				}
				return $nv;
			}
		}
		return $v;
	}
	
	static function load_langfile($lng, $cate=""){
		if (!array_key_exists($lng, self::$langdata)){
			self::$langdata[$lng] = array();
		}
		if (array_key_exists($cate, self::$langdata[$lng])){
			return;
		}
		
		
		$ar = array();
		
		$cateex = $cate?'-'.preg_replace('/\W/', '_', $cate):'';
		
		$file = MULTI_LNG_PLUGIN_CONFIG.'/file/language-'.$lng.$cateex.'.txt';
		if (is_readable($file)){
			$fln = file($file);
			$vnm = null;
			$ii = 0;
			foreach ($fln as $ln){
				$v = preg_replace('/[\r\n]/', '', $ln);
				if ($v == "" || ($ii == 0 && $v[0] == '#')) continue;
				if ($ii%2 == 0){
					$vnm = $v;
				}
				else{
					$ar[$vnm] = $v;
				}
				$ii++;
			}
		}
		self::$langdata[$lng][$cate] = $ar;
	}
	
	static function langword($lng, $v, $cate=""){
		self::load_langfile($lng, $cate);
		if (!array_key_exists($lng, self::$langdata)){
			return $v;
		}
		if (!array_key_exists($cate, self::$langdata[$lng])){
			return $v;
		}
		if (!array_key_exists($v, self::$langdata[$lng][$cate])){
			return $v;
		}
		return self::$langdata[$lng][$cate][$v];
	}
}


function __m($v, $cate=""){
	return multi_lng_util::wd($v, $cate);
}

function __m_if($lang){
	$lng = multi_lng_util::lang();
	if (!$lang) return false;
	$not = false;
	if ($lang[0] == '!'){
		$not = true;
		$lang = substr($lang, 1);
	}
	$ar = preg_split('/,/', $lang);
	$res = in_array($lng, $ar);
	if (!$not) return $res;
	else return !$res;
}

function __m_match($v){
	return multi_lng_util::match($v);
}