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);
}