All pastes #159765 Raw Edit

MirandaLanguagepack.

public text v1 · immutable
·published 2006-09-03 14:03 UTC
rendered paste body
<?php
if (!defined('MEDIAWIKI'))
	die("Skriptausfuehrung beendet, Mediawiki nicht definiert!");

$wgExtensionFunctions[] = "wfExtensionCreateMirandaLanguagepack";

//====================================================
//Sämtliche Hinweise /Funktionen zur Versionsinfo wurden entfernt!!!
//specialpage to select the language files
//used NEW Table in DB:
//Name: user_miranda_lang
//Field 1: user_id, Typ: INT,Länge: 5, Attribute: Usigned, Null:not Null, standard 0; Primärschlüssel, Typ Primär
//Field 2: user_not_selected_langfiles, Typ:MEDIUMBLOB,Null:Null,Standard:Null
//CREATE TABLE `user_miranda_lang` ( `user_id` int(5) unsigned NOT NULL default '0', `user_not_selected_langfiles` mediumblob, PRIMARY KEY  (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='stored the not selected languagefiles per User';
//

function wfExtensionCreateMirandaLanguagepack()
{
	global $IP, $wgMessageCache;
	require_once( "$IP/includes/SpecialPage.php" );
	class MirandaLanguagepack extends SpecialPage
	{
		var $mAction, $mPosted;
		var $ArrayLanguageArticles = Array();
		function MirandaLanguagepack()
		{
			SpecialPage::SpecialPage( "MirandaLanguagepack" );
		}
		function execute( $par )
		{
			global $wgRequest, $wgUser;
			$fname = "MirandaLanguagepack::execute";
			$this->setHeaders();
			$this->mPosted = $wgRequest->wasPosted();
			$this->mAction = $wgRequest->getText( "action" );
			$UserID = $wgUser->idForName();
			$dbr = &wfGetDB( DB_SLAVE );
			//read, if available, the not selected titles from the user, and deselect it
			if (isset($_POST['Auswahl']))
			{
				$SelectedTitleArray = $_POST['Auswahl'];
				unset($SelectedTitleArray[0]);
			}
			else if($UserID > 0)
			{
				$sql = "SELECT user_not_selected_langfiles FROM user_miranda_lang WHERE user_id = $UserID";
				$res = $dbr->query($sql, $fname);
				$row = $dbr->fetchRow($res);
				if($row) {
					$arrNotSelected = unserialize($row[0]); }
				$dbr->freeResult($res);
			}
			// get language packs
			$sql = "SELECT page_title FROM page, categorylinks WHERE page.page_id = categorylinks.cl_from AND categorylinks.cl_to = 'Sprachtexte' AND page.page_namespace = 100 ORDER BY page_title DESC";
			$res = $dbr->query($sql, $fname);
			while($row = $dbr->fetchObject($res))
			{
				$page_title = $row->page_title;
				// check Select available
				if (isset($_POST['SelectAll']))
					$this->ArrayLanguageArticles[$page_title] = true;
				else if (isset($_POST['SelectNone']))
					$this->ArrayLanguageArticles[$page_title] = false;
				else if (is_array($SelectedTitleArray))
				{ // set actually selected
					if(in_array($page_title, $SelectedTitleArray))
						$this->ArrayLanguageArticles[$page_title] = true;
					else
						$this->ArrayLanguageArticles[$page_title] = false;
				}
				else if (count($arrNotSelected) > 0 && is_array($arrNotSelected))
				{ // set db selected
					if(in_array($page_title, $arrNotSelected))
						$this->ArrayLanguageArticles[$page_title] = false;
					else
						$this->ArrayLanguageArticles[$page_title] = true;
				}
				else
					$this->ArrayLanguageArticles[$page_title] = true;
			}
			$dbr->freeResult($res);
			if (is_array($SelectedTitleArray))
				$this->save_choise($SelectedTitleArray);
			if (isset($_POST['CreateFile']))
				$this->DownloadLanguagepack($SelectedTitleArray);
			$this->ShowLanguagepackSelection();
		}
		function save_choise($SelectedTitleArray)
		{
			global $wgUser;
			$dbrw = &wfGetDB( DB_MASTER );
			$UserID = $wgUser->idForName();
			if($UserID > 0)
			{
				$arrNotSelected = array();
				foreach($this->ArrayLanguageArticles as $title => $selected)
				{
					if(!$selected) {
						$arrNotSelected[] = $title; }
				}
				$serNotSelected = "'". mysql_escape_string(serialize($arrNotSelected)). "'";
				$sql = "REPLACE INTO user_miranda_lang (user_id, user_not_selected_langfiles) VALUES ($UserID, $serNotSelected)";
				$res = $dbrw->query($sql,$fname);
			}
		}
		//Create a textfile from all selected languagearticles
		function DownloadLanguagepack($SelectedTitleArray)
		{
			global $wgOut, $wgRequest, $wgUser, $wgLang;
			$dbrw = &wfGetDB( DB_MASTER );
			$fname = "MirandaLanguagepack::DownloadLanguagepack";
			//Without that the mediwiki software add the web site itself to the the output file
			$wgOut->disable();
			//save the NOT selected titles in the db per user, save the selected titles could make some problems for new translated files.
			$dbr = &wfGetDB( DB_SLAVE );
			$filename = "extensions/langpack_german_". date("m_s"). ".txt";
			$file = fopen($filename, "a");
			$sql = "SELECT old_text FROM page, text, revision WHERE page.page_title = 'Kopfzeile_Languagepack' AND revision.rev_id=page.page_latest AND revision.rev_text_id=text.old_id AND page.page_namespace=100";
			$res = $dbrw->query($sql, $fname);
			while ($row = $dbrw->fetchObject($res))
			{
				//only use text within pre-Tags; wiki is utf-8 langugepack use ANSI, windows-1252 not work correctly
				preg_match_all("#<pre>(.*)</pre>#Us",iconv("UTF-8","cp1252",str_replace("\n","\r\n",$row->old_text)),$arrTextBlocks);
				foreach($arrTextBlocks[1] as $TextBlock) {
					fwrite($file, $TextBlock); }
			}
			$dbrw->freeResult($res);
			fwrite($file, "X-Langpack-creation-date: ". date("d M Y H:m:s"). "\r\n");
			fwrite($file, "; FLID: Deutsche Sprachdatei-GermanLanguagePack ". date("0.y.m.d"). "\r\n"); //Updater support
			fwrite($file, "Plugins included: ". implode(",", $SelectedTitleArray). "\r\n\r\n"); //list included Plugins
			foreach ($SelectedTitleArray as $Title)
			{
				$sql = "SELECT old_text, rev_timestamp FROM page, text, revision WHERE page.page_title IN ('".$Title."') AND revision.rev_id=page.page_latest AND revision.rev_text_id=text.old_id AND page.page_namespace=100";
				$res = $dbrw->query($sql, $fname);
				while ($row = $dbrw->fetchObject($res))
				{
					preg_match_all("#<pre>(.*)</pre>#Us", iconv("UTF-8","cp1252", str_replace("\n", "\r\n", $row->old_text)), $arrTextBlocks); //only use text within pre-Tags; wiki is utf-8 langugepack use ANSI, windows-1252 not work correctly
					fwrite($file, "; Start of langpack ". $Title. " (Letzte Änderung: ".$wgLang->timeanddate($row->rev_timestamp, true, MW_DATE_DMY)." )\r\n");
					foreach($arrTextBlocks[1] as $TextBlock)
					{
						fwrite($file, $TextBlock);
					}
					fwrite($file, " \r\n; ##############################################\r\n; end of langpack: ".$Title."\r\n; ############################################## \r\n");
				}
				$dbrw->freeResult($res);
			}
			fwrite($file, "\r\n; End of langpack_german");
			fclose($file);
			header('Content-Description: File Transfer');
			header("Content-type: text; charset=CP1252" );
			header("Content-length: ".filesize($filename));
			header("Content-Disposition: attachment; filename=\"langpack_german.txt\"");
			readfile($filename);
			unlink($filename);
		}
		//Display the Buttons, the list with languagearticles and selection, selection is loaded from a special user DB Table
		function check_lngpack ($Title)
		{
			$errMessageTPL = '<li><span style="font-weight:bold">%s</span> Zeile erwartet in Zeile %d: %s</li>';
			$fname = "MirandaLanguagepack::DownloadLanguagepack";
			$dbrw = & wfGetDB( DB_MASTER );
			$sql = "SELECT old_text FROM page, text, revision WHERE page.page_title IN ('".$Title."') AND revision.rev_id=page.page_latest AND revision.rev_text_id=text.old_id AND page.page_namespace=100";
			$res = $dbrw->query($sql, $fname);
			$flg_en = true;
			$counter = 0;
			while ($row = $dbrw->fetchObject($res))
			{
				$textx = '';
				preg_match_all("#<pre>(.*)</pre>#Us", $row->old_text, $arrTextBlocks);
				foreach($arrTextBlocks[1] as $value)
				{
					$print="kein Fehler gefunden!<hr />";
					$flg_en = true;
					$errCount = 0;
					$errText = '';
					foreach(preg_split("*\n*", $value, -1) as $number => $zeile)
					{
						$line = trim($zeile);
						$number++;
						if ($line != '' && $line{0} != ';')
						{
							if ($flg_en)
							{//check: ist englische zeile?
								if (!preg_match('~^\[.{2,}\]$~', $line))
								{
									$errText.= sprintf($errMessageTPL, 'englische', $number, $line);
									$errCount++;
								}
								else
								{
									$flg_en = false;
								}
							} //check: ist deutsche Zeile?
							else
							{
								if (preg_match('~^\[.{2,}\]$~', $line))
								{
									$errText.= sprintf($errMessageTPL, 'deutsche', $number, $line);
									$errCount++;
								}
								else
								{
									$flg_en = true;
								}
							}
						}
						else if (!$flg_en)
						{
							$errText.= sprintf($errMessageTPL, 'deutsche', $number, $line);
							$errCount++;
							$flg_en = true;
						}
						if ($errText !='')
						{
							$print = $errCount. " Fehler gefunden<br /><ul>". $errText. "</ul><hr />";
						}
					} //End foreach zeile
					$counter = $counter + $errCount;
					$textx.= $print;
				} // End foreach block
 				if ($counter > 0)
				{
					return  "<span style=\"color:#FF0000;font-weight:bold\">".$counter." Fehler gefunden</span><hr />".$textx;
				}
				else
				{
					return "<span style=\"color:#00D900;font-weight:bold\">kein Fehler gefunden</span><br />"; }
				}
		}
		function ShowLanguagepackSelection()
		{
			global $wgOut, $wgRequest, $wgUser;
			$fname = "MirandaLanguagepack::ShowLanguagepackSelect";
			$titleObj = Title::makeTitle(NS_SPECIAL, 'MirandaLanguagepack');
			$wgOut->addWikiText("[[Sprachdatei:Quellcode MirandaLanguagepack.php]]");
			$wgOut->addWikiText("{{Sprachdatei erstellen}}");
			$text = '<hr /><form name="SelectedTitles" method="post" action="index.php?title=Spezial:MirandaLanguagepack" enctype="multipart/form-data">';
			$text.= '<input type="submit" name="CreateFile" value="Sprachdatei erstellen und herunterladen" style="width:300px;" /><br /><hr />';
			$text.= '<input type="hidden" name="Auswahl[0]" value="submit" />';
			$text.= '<input type="submit" name="CheckItAll" value="auf Fehler &uuml;berpr&uuml;fen" style="width:300px" /><br />';
			$text.= '<input type="submit" name="CheckIt" value="nur ausgew&auml;hlte Plugins" style="width:300px" /><br />';
			$text.= '<input type="radio" name="Auswahl[]" value="Core" checked="checked" /> ';
			$text.= $wgOut->parse("[[Sprachdatei:Core|Miranda IM 0.5 (Kern)]]", false)."\r\n";
			if (isset($_POST['CheckItAll']) || (isset($_POST['CheckIt'])))
			{
				$text.=$this->check_lngpack("Core");
			}
			else
			{
				$text.="<br />";
			}
			$text.='<p style="font-size:large">Plugin-Auswahl f&uuml;r <span style="font-weight:bold">'.$wgUser->getName().'</span></p>';
			$text.= '<input type="submit" name="SelectAll" value="Alle ausw&auml;hlen" style="font-size:small;width:150px" /><input type="submit" name="SelectNone" value="Alle abw&auml;hlen" style="width:150px" /><br />';
			$wgOut->addHTML($text);
			foreach(array_reverse($this->ArrayLanguageArticles, false) as $Title => $select)
			{
				if($Title != "Kopfzeile_Languagepack" && $Title != "Core")
				{
					$wgOut->addHTML('<input type="checkbox" name="Auswahl[]" value="'. $Title. '" ');
					$wgOut->addHTML($select ? ' checked="checked" />' : ' />');
					$wgOut->addHTML($wgOut->parse("[[Sprachdatei:$Title|$Title]]", false)."\r\n");
					// languagepack check
					if(isset($_POST['CheckItAll']) || (isset($_POST['CheckIt']) && $select === true))
					{
						$wgOut->addHTML($this->check_lngpack($Title));
					}
					else
					{
						$wgOut->addHTML("<br />");
					}
				}
			} //end foreach
			$wgOut->addHTML('</form><hr style="color:#696969;height:1px" /><span style="color:#696969">&copy; Lastwebpage, FREAK_THEMIGHTY, Armageddon</span>');
		}//end function ShowLanguagepackSelection
	} //end defination class MirandaLanguagepack
	SpecialPage::addPage(new MirandaLanguagepack);
	$wgMessageCache->addMessages( array("mirandalanguagepack" => "Sprachdatei erstellen und downloaden"));
} //end function wfExtensionCreateMirandaLanguagepack
?>