5.5 (see also: http://www.pmwiki.org/wiki/PmWiki/CustomMarkup) */ define('MULTILANGUAGE', '1.1'); $RecipeInfo['MultiLanguage']['Version'] = '2015-10-14'; SDV($DefaultLanguages,array('en')); SDV($LanguageSelectionFmt,'[[{$FullName}?userlang=$1|$1]] '); //------------------------------------------------------------------------------------ if (isset($_GET['userlang'])) { $userlang = $_GET['userlang']; setcookie('userlang',$userlang,0,'/'); } else if (isset($_COOKIE['userlang'])) { $userlang = $_COOKIE['userlang']; } else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $userlang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); setcookie('userlang',$userlang,0,'/'); } else { $userlang = $DefaultLanguages[0]; setcookie('userlang',$userlang,0,'/'); } $_COOKIE['userlang']=$userlang; if ($pagename=='') { if (function_exists('ResolvePageName')) { $pagename = ResolvePageName($pagename); } else { $pagename="$DefaultGroup.$DefaultName"; } } if (!isset($PCache[$pagename])) { PCache($pagename, ReadPage($pagename, READPAGE_CURRENT)); } //------------------------------------------------------------------------------------ $PageLanguages = explode(',',$PCache[$pagename]['languages']); if (!in_array($userlang,$PageLanguages)) { foreach ($DefaultLanguages as $lang) { if (in_array($lang,$PageLanguages)) { $userlang = $lang; break; } } if (!$PageLanguages[0]=='') { $userlang = $PageLanguages[0]; } else { $userlang = $DefaultLanguages[0]; } } $Conditions['userlang'] = '$GLOBALS[\'userlang\']==$condparm'; //------------------------------------------------------------------------------------ function LangInPage($args) { global $PCache, $DefaultLanguages; $args = ParseArgs($args); $args = $args['']; if (count($args)<2) return false; if (in_array($args[0],$DefaultLanguages)) { $lang = $args[0]; $pn = $args[1]; } else { $lang = $args[1]; $pn = $args[0]; } if (!isset($PCache[$pn])) { PCache($pn, ReadPage($pn, READPAGE_CURRENT)); } $PageLanguages = explode(',',$PCache[$pn]['languages']); return in_array($lang,$PageLanguages); } $Conditions['langinpage'] = 'LangInPage($condparm)'; //------------------------------------------------------------------------------------ $FmtPV['$Title'] = 'MultiLanguageTitle($pagename,$name)'; $FmtPV['$Titlespaced'] = '$AsSpacedFunction(MultiLanguageTitle($pagename,$name))'; $FmtPV['$userlang'] = "'$userlang'"; function MultiLanguageTitle($pn,$name) { global $PCache, $userlang, $DefaultLanguages, $pagename, $AsSpacedFunction; $pn = MakePageName($pagename,$pn); if (!PageExists($pn)) return ''; if (!isset($PCache[$pn])) { PCache($pn, ReadPage($pn, READPAGE_CURRENT)); } if (isset($PCache[$pn]["mltitle-$userlang"])) return $PCache[$pn]["mltitle-$userlang"]; foreach ($DefaultLanguages as $lang) { if (isset($PCache[$pn]["mltitle-$lang"])) return $PCache[$pn]["mltitle-$lang"]; } if (isset($PCache[$pn]['title'])) return $PCache[$pn]['title']; if ($GLOBALS['SpaceWikiWords']) { return $AsSpacedFunction($name); } else { return $name; } } //------------------------------------------------------------------------------------ Markup('selectlang', 'directives', "/\\(:selectlang\s*(.*?):\\)/i", "LanguageSelection"); function LanguageSelection($m) { $args = ParseArgs($m[1]); global $LanguageSelectionFmt, $pagename, $PCache, $DefaultLanguages; $pn = $args['page']; if ($pn=='') $pn = $pagename; $pn = MakePageName($pagename,$pn); if (!PageExists($pn)) return ''; if (!isset($PCache[$pn])) { PCache($pn, ReadPage($pn, READPAGE_CURRENT)); } if (!$PCache[$pn]['languages']) { $PageLanguages = array(); } else { $PageLanguages = explode(',',@$PCache[$pn]['languages']); } $mid = ''; foreach ($DefaultLanguages as $lang) { if (in_array($lang,$PageLanguages)) { $mid .= str_replace('$1',$lang,$LanguageSelectionFmt); } else if (isset($args['default'])) { $mid .= FmtPageName(str_replace('$1',$lang,$LanguageSelectionFmt),$args['default']); } } foreach ($PageLanguages as $lang) { if (!in_array($lang,$DefaultLanguages)) { $mid .= str_replace('$1',$lang,$LanguageSelectionFmt); } } return FmtPageName($mid,$pn); } //------------------------------------------------------------------------------------ array_unshift($EditFunctions,'SaveLanguages'); function SaveLanguages($pagename, &$page, &$new) { $text = $new['text']; $text = preg_replace('/(\[=.+=\])/msiU', '', $text); $text = preg_replace('/(\[@.+@\])/msiU', '', $text); preg_match_all('/\(:if\s*userlang\s*(.+?)\s*:\)/msi', $text, $matches); $PageLanguages = array(); foreach ($matches[1] as $lang) { if (!in_array($lang,$PageLanguages)) $PageLanguages[] = $lang; } if (count($PageLanguages)>0) { $new['languages'] = implode(',', $PageLanguages); } else { unset($new['languages']); } preg_match_all('/\(:if\s*userlang\s*(.+?)\s*:\).*?\(:title\s*(.+?)\s*:\)/msi', $text, $matches); if (count($matches[1])==count($matches[2])) { for ($i=0; $i