Skip to content

Instantly share code, notes, and snippets.

@nickvergessen
Created March 14, 2012 12:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nickvergessen/2036091 to your computer and use it in GitHub Desktop.
Save nickvergessen/2036091 to your computer and use it in GitHub Desktop.
Language File Conflict Detector
<?php
/**
*
* @package Language File Conflict Detector
* @version $Id$
* @copyright (c) 2012 nickvergessen nickvergessen@gmx.de http://www.flying-bits.org
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* The path to your phpBB root file (the one with the config file)
*/
$phpbb_root_path = '../';
/**
* Languages to test
*/
$languages = array(
'en',
);
/**
* YOUR LANGUAGE FILES
*/
$mod_files = array(
'mods/exif_data',
'mods/gallery',
'mods/gallery_acp',
'mods/gallery_mcp',
'mods/gallery_ucp',
'mods/info_acp_gallery',
'mods/info_acp_gallery_logs',
'mods/info_ucp_gallery',
'mods/install_gallery',
'mods/permissions_gallery',
);
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
include('lfcd/lfcd.' . $phpEx);
$lfcd = new lfcd();
$lfcd->validate($mod_files);
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-gb" xml:lang="en-gb">
<head>
<title>LFCD</title>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body>';
echo $lfcd->get_report(lfcd::OUTPUT_BBCODE);
echo '</body>
</html>';
<?php
/**
*
* @package Language File Conflict Detector
* @version $Id$
* @copyright (c) 2012 nickvergessen nickvergessen@gmx.de http://www.flying-bits.org
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
$lfcd_lang = array(
'LFCD_TESTING_FILES' => "[b][size=150]Testing language files:[/size][/b]\n%s",
'LFCD_CONFLICTS' => '[b][size=150]Conflicts:[/size][/b]',
'LFCD_STATISTIC' => '[b][size=150]Statistic:[/size][/b]',
'LFCD_STATISTIC_FILE' => '[b]%1$s:[/b] [b][color=red]%2$s[/color][/b] Fails, [b][color=orange]%3$s[/color][/b] Warnings, [b][color=blue]%4$s[/color][/b] Notices, [b][color=purple]%5$s[/color][/b] Infos',
'LFCD_STATISTIC_PERMISSION' => '[b]%1$s:[/b] [color=#008080]Permission files are currently not supported![/color]',
'LFCD_CONFLICT' => 'MOD´s language file [b]"%1$s"[/b] conflicts with phpBB´s language file [b]"%2$s"[/b] on key [b]"%3$s"[/b]:' . "\n". 'MOD:[code]%4$s[/code]phpBB:[code]%5$s[/code]',
'LFCD_FAIL_RESULT' => 'Fail',
'LFCD_INFO_RESULT' => 'Info',
'LFCD_NOTICE_RESULT' => 'Notice',
'LFCD_PERMISSION_MESSAGE' => 'Permission files are currently not supported!',
'LFCD_PERMISSION_RESULT' => 'Note',
'LFCD_WARNING_RESULT' => 'Warning',
);
<?php
/**
*
* @package Language File Conflict Detector
* @version $Id$
* @copyright (c) 2012 nickvergessen nickvergessen@gmx.de http://www.flying-bits.org
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
class lfcd
{
/**
* Constant for "fail" error
*/
const ERROR_FAIL = 1;
/**
* Constant for warnings
*/
const ERROR_WARNING = 2;
/**
* Constant for notices
*/
const ERROR_NOTICE = 3;
/**
* Constant for information notices
*/
const ERROR_INFO = 4;
/**
* Constant for permission errors
*/
const ERROR_PERMISSION = 5;
/**
* Output validation report as plain text
*/
const OUTPUT_TEXT = 0;
/*
* Output validation report as BBcode
*/
const OUTPUT_BBCODE = 1;
/**
* Output validation report as HTML
*/
const OUTPUT_HTML = 2;
/**
* The language we want to check
*/
private $language = '';
/**
* The MOD files we want to check
*/
private $mod_files = array();
/**
* All phpBB files
*/
private $phpbb_files = array(
'acp/attachments',
'acp/ban',
'acp/board',
'acp/bots',
'acp/common',
'acp/database',
'acp/email',
'acp/forums',
'acp/groups',
'acp/language',
'acp/mods',
'acp/modules',
'acp/permissions',
'acp/permissions_phpbb',
'acp/posting',
'acp/profile',
'acp/prune',
'acp/search',
'acp/styles',
'acp/users',
'captcha_qa',
'captcha_recaptcha',
'common',
'groups',
'install',
'mcp',
'memberlist',
'posting',
'search',
'ucp',
'viewforum',
'viewtopic',
);
/**
* The phpBB files we ignore
*/
private $ignore_phpbb_files = array(
'help_bbcode',
'help_faq',
'search_ignore_words',
'search_synonyms',
);
/**
* Errors which were encountered during testing
*/
private $errors;
private $error_files;
/**
* Our pre-formatted PM content
*/
private $message;
public function __construct($ignore_phpbb_files = null, $language = 'en')
{
if ($ignore_phpbb_files != null)
{
if (is_array($ignore_phpbb_files))
{
$this->ignore_phpbb_files = $ignore_phpbb_files;
}
else
{
$this->ignore_phpbb_files = array();
}
}
$this->language = $language;
$this->errors = array();
$this->error_files = array();
$this->message = '';
global $phpEx, $lfcd_lang;
include('lang.' . $phpEx);
}
public function validate($mod_files = array())
{
global $phpbb_root_path, $phpEx, $lfcd_lang;
$this->mod_files = $mod_files;
$this->errors = array();
$this->error_files = array();
$this->message = '';
if (!file_exists($phpbb_root_path . 'language/' . $this->language . '/'))
{
//echo '<h3>Error: language-package "' . $this->language . '" could not be found!</h3>';
continue;
}
foreach ($this->mod_files as $mod_file)
{
include($phpbb_root_path . 'language/' . $this->language . '/' . $mod_file . '.' . $phpEx);
$mod_lang = $lang;
$lang = null;
foreach ($this->phpbb_files as $phpbb_file)
{
if (in_array($phpbb_file, $this->ignore_phpbb_files))
{
continue;
}
include($phpbb_root_path . 'language/' . $this->language . '/' . $phpbb_file . '.' . $phpEx);
$phpbb_lang = $lang;
$lang = null;
$conflicting_keys = array_keys(array_intersect_key($mod_lang, $phpbb_lang));
if (!empty($conflicting_keys))
{
foreach ($conflicting_keys as $conflict)
{
$this->push_error($mod_file, $phpbb_file, $conflict, $mod_lang, $phpbb_lang);
}
}
}
}
}
private function push_error($mod_file, $phpbb_file, $conflict, $mod_lang, $phpbb_lang)
{
global $lfcd_lang;
$type = $this->get_error_type($mod_file, $phpbb_file);
switch ($type)
{
case self::ERROR_FAIL:
$this->message .= '[color=red][ [b]' . $lfcd_lang['LFCD_FAIL_RESULT'] . '[/b] ][/color] ';
break;
case self::ERROR_NOTICE:
$this->message .= '[color=blue][ [b]' . $lfcd_lang['LFCD_NOTICE_RESULT'] . '[/b] ][/color] ';
break;
case self::ERROR_WARNING:
$this->message .= '[color=orange][ [b]' . $lfcd_lang['LFCD_WARNING_RESULT'] . '[/b] ][/color] ';
break;
case self::ERROR_INFO:
$this->message .= '[color=purple][ [b]' . $lfcd_lang['LFCD_INFO_RESULT'] . '[/b] ][/color] ';
break;
case self::ERROR_PERMISSION:
$this->message .= '[color=#008080][ [b]' . $lfcd_lang['LFCD_PERMISSION_RESULT'] . '[/b] ][/color] ' . $lfcd_lang['LFCD_PERMISSION_MESSAGE'];
break;
default:
return;
//$this->message .= '[color=orange][ [b]' . $lfcd_lang['LFCD_WARNING_RESULT'] . '[/b] ][/color] [b]' . $lfcd_lang['LFCD_INVALID_TYPE'] . "\n";
//$this->message .= '[color=purple][ [b]' . $lfcd_lang['LFCD_INFO_RESULT'] . '[/b] ][/color] ' . $message . "\n";
}
if ($type != self::ERROR_PERMISSION)
{
$this->message .= sprintf(
$lfcd_lang['LFCD_CONFLICT'],
$mod_file,
$phpbb_file,
$conflict,
self::to_string($mod_lang[$conflict]),
self::to_string($phpbb_lang[$conflict])
) . "\n\n";
$this->errors[$type][] = array(
'mod_file' => $mod_file,
'phpbb_file' => $phpbb_file,
'conflict' => $conflict,
'mod_lang' => $mod_lang,
'phpbb_lang' => $phpbb_lang,
);
}
$this->error_files[$mod_file][$type][] = array(
'mod_file' => $mod_file,
'phpbb_file' => $phpbb_file,
'conflict' => $conflict,
'mod_lang' => $mod_lang,
'phpbb_lang' => $phpbb_lang,
);
}
public function get_report($output = self::OUTPUT_BBCODE)
{
global $lfcd_lang;
$return = sprintf($lfcd_lang['LFCD_TESTING_FILES'], implode(",\n", $this->mod_files)) . "\n\n ";
$return .= $lfcd_lang['LFCD_STATISTIC'] . "\n";
foreach ($this->error_files as $file => $errors)
{
if (!isset($errors[self::ERROR_PERMISSION]))
{
$return .= sprintf(
$lfcd_lang['LFCD_STATISTIC_FILE'],
$file,
(isset($errors[self::ERROR_FAIL]) ? sizeof($errors[self::ERROR_FAIL]) : '[/color][color=black]0'),
(isset($errors[self::ERROR_WARNING]) ? sizeof($errors[self::ERROR_WARNING]) : '[/color][color=black]0'),
(isset($errors[self::ERROR_NOTICE]) ? sizeof($errors[self::ERROR_NOTICE]) : '[/color][color=black]0'),
(isset($errors[self::ERROR_INFO]) ? sizeof($errors[self::ERROR_INFO]) : '[/color][color=black]0')
) . "\n";
}
else
{
$return .= sprintf($lfcd_lang['LFCD_STATISTIC_PERMISSION'], $file) . "\n";
}
}
$return .= "\n\n";
$return .= $lfcd_lang['LFCD_CONFLICTS'] . "\n";
switch ($output)
{
case self::OUTPUT_BBCODE:
$text = htmlspecialchars($return . $this->message);
return self::generate_text_for_html_display($text, true);
case self::OUTPUT_HTML:
$text = htmlspecialchars($return . $this->message);
return self::generate_text_for_html_display($text);
case self::OUTPUT_TEXT:
$text = htmlspecialchars($return . $this->message);
$text = self::generate_text_for_html_display($text);
//$text = htmlspecialchars_decode(strip_tags(str_replace('<br />', "\n", $text)));
$text = str_replace("\n\n", "\n", $text);
$text = str_replace("\n", PHP_EOL, $text);
return $text;
}
}
private function get_error_type($mod_file, $phpbb_file)
{
if (strpos($mod_file, 'permission') !== false && strpos($phpbb_file, 'permission') !== false)
{
return self::ERROR_PERMISSION;
}
if ((strpos($mod_file, 'mods/info_acp_') === 0 && strpos($phpbb_file, 'acp/') === 0) ||
(strpos($mod_file, 'mods/info_mcp_') === 0 && $phpbb_file == 'mcp') ||
(strpos($mod_file, 'mods/info_ucp_') === 0 && $phpbb_file == 'ucp') ||
(strpos($mod_file, 'acp') !== false && $phpbb_file == 'acp/common') ||
($phpbb_file == 'common'))
{
return self::ERROR_FAIL;
}
if ((strpos($mod_file, 'acp') === false && strpos($phpbb_file, 'acp/') === 0))
{
return self::ERROR_NOTICE;
}
if (strpos($mod_file, 'install') || strpos($phpbb_file, 'install'))
{
return self::ERROR_INFO;
}
return self::ERROR_WARNING;
}
/**
* Display validation results as HTML
*/
static public function generate_text_for_html_display($text, $soft = false)
{
//Replace new
$text = str_replace("\n", "<br />\n", $text);
if ($soft)
{
return $text;
}
//BBCode replacement array
$bbcode = array(
"/\[b\](.*?)\[\/b\]/is" => '<span style="font-weight:bold;">$1</span>',
"/\[u\](.*?)\[\/u\]/is" => '<span style="text-decoration:underline;">$1</span>',
"/\[color\=(.*?)\](.*?)\[\/color\]/is" => '<span style="color:$1;">$2</span>',
"/\[code\](.*?)\[\/code\]/is" => '<pre style="padding-left:20px;">$1</pre>',
'#\[url(=(.*))?\](.*)\[/url\]#iUe' => "validate_url('\$2', '\$3')",
"/\[size\=(.*?)\](.*?)\[\/size\]/is" => '<span style="font-size: $1%;">$2</span>',
);
//Replace BBCode
$text = preg_replace(array_keys($bbcode), array_values($bbcode), $text);
return $text;
}
/**
* Convert the language entry to a beautiful string
*/
static public function to_string($mixed, $depth = 0)
{
if (!is_array($mixed))
{
return /*str_repeat("\t", $depth) . */$mixed . "\n";
}
$return = str_repeat("\t", $depth) . "Array(\n";
foreach ($mixed as $key => $value)
{
$return .= str_repeat("\t", $depth + 1) . $key . ' => ' . self::to_string($value, $depth + 1);
}
return $return . str_repeat("\t", $depth) . ")\n";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment