Files
mrbs-equbao-2026/checklang.php
T
人事系统开发 48092cab42
Docker image / push (push) Canceled after 0s
MRBS 1.12.2 等保2.0二级整改完整提交
包含:登录失败锁定、90天密码有效期、30分钟会话超时、
强制改密、登录审计日志、屏幕水印、企业背景图、
备案信息固定底部、favicon、登录页JS修复等全部改动
2026-09-08 21:19:47 +08:00

280 lines
6.4 KiB
PHP

<!DOCTYPE html>
<html lang="en">
<head>
<title>Language File Checker</title>
<style>
form {
padding-left: 2em;
}
form div {
display: flex;
align-items: flex-start;
margin: 0.8em 0;
}
label,
input[type="checkbox"] {
margin-right: 1em;
}
table {
border-collapse: collapse;
}
th, td {
border: 1px solid black;
padding: 0.2em 0.5em;
text-align: left;
}
select {
vertical-align: bottom;
}
</style>
</head>
<body>
<h1>Language File Checker</h1>
<p>
This will report missing or untranslated strings in the language files.
</p>
<?php
// NOTE: You need to change this if you run checklang.php from anywhere but
// the MRBS 'web' directory
$path_to_mrbs = ".";
const PATTERN_START = '/^\$vocab\["([^"]+)"]/';
const PATTERN_END = '/;\s*(?:(?:#|\/\/).*)?$/';
unset($lang);
$lang = array();
if (!empty($_GET))
{
$lang = $_GET['lang'];
$update = empty($_GET['update']) ? false : true;
}
// Language file prefix
$langs = "lang/lang.";
// Reference language:
$ref_lang = "en";
// Make a list of language files to check. This is similar to glob() in
// PEAR File/Find.
$dh = opendir($path_to_mrbs.'/lang');
while (($filename = readdir($dh)) !== false)
{
$files[] = $filename;
}
closedir($dh);
sort($files);
?>
<form method="get" action="checklang.php">
<div>
<label for="languages">Select one or more languages:</label>
<select id="languages" multiple="multiple" size="5" name="lang[]">
<?php
foreach ($files as $filename)
{
if (preg_match('/^lang\.(.*)/', $filename, $name) && $name[1] != $ref_lang)
{
if (preg_match('/~|\.bak|\.swp\$/', $name[1]))
{
continue;
}
print "<option";
if (array_search($name[1], $lang) !== FALSE)
{
print " selected=\"selected\"";
}
print ">$name[1]</option>\n";
}
}
?>
</select>
</div>
<div>
<input id="update" type="checkbox" name="update">
<label for="update">Update file(s) with new token lines (web server user requires write permission
on files and directory)</label>
</div>
<div>
<input type="submit" name="submit" value="Go">
</div>
</form>
<?php
include "$path_to_mrbs/$langs$ref_lang";
$ref = $vocab;
foreach ($lang as $l)
{
unset($vocab);
include "$path_to_mrbs/$langs$l";
if ($update)
{
$ref_statements = array();
$in = fopen("$path_to_mrbs/$langs$ref_lang", "r")
or die("Failed to open $path_to_mrbs/$langs$ref_lang for reading\n");
while (!feof($in))
{
$line = fgets($in);
// Handle multi-line statements.
// If we've started a statement append this line to it.
if (isset($statement))
{
$statement .= $line;
}
// Otherwise, if this is the start of a new statement, make this line the first line.
elseif (preg_match(PATTERN_START, $line, $matches))
{
$statement = $line;
$token = $matches[1];
}
// And if this line is also the end of a statement, close it off and add it to the array.
if (preg_match(PATTERN_END, $line))
{
$ref_statements[$token] = $statement;
unset($statement);
}
}
fclose($in);
$in = fopen("$path_to_mrbs/$langs$l", "r") or
die("Failed to open $path_to_mrbs/$langs$l for reading");
$out = fopen("$path_to_mrbs/$langs$l.new", "w") or
die("Failed to open $path_to_mrbs/$langs$l.new for writing");
$seen = array();
$added = array();
// DEBUG print "<table>\n";
while (!feof($in))
{
$line = fgets($in);
$token_match = "";
if (preg_match(PATTERN_START, $line, $matches))
{
// DEBUG print "<tr><td>$matches[1]</td><td>".key($ref_statements);
$token_match = $matches[1];
if (!array_key_exists($token_match, $ref_statements))
{
fwrite($out, "// REMOVED - ".$line);
continue;
}
while (($token_match != key($ref_statements)) &&
(!array_key_exists(key($ref_statements), $vocab)))
{
if (array_key_exists(key($ref_statements), $seen))
{
break;
}
$seen[key($ref_statements)] = 1;
fwrite($out, current($ref_statements));
$added[] = htmlspecialchars(key($ref_statements));
$ret = next($ref_statements);
// DEBUG print " ".key($ref_statements);
if (!$ret)
{
break;
}
}
next($ref_statements);
}
$seen[$token_match] = 1;
fwrite($out, $line);
// DEBUG print "</td></tr>\n";
}
fclose($in);
fclose($out);
// DEBUG print "</table>\n";
if (count($added))
{
print "Added the following tokens:\n<ul>\n<li>".
implode("</li>\n<li>",$added)."</li>\n</ul>\n";
rename("$path_to_mrbs/$langs$l", "$path_to_mrbs/$langs$l.old") or
die("Failed to rename $path_to_mrbs/$langs$l to $path_to_mrbs/$langs$l.old");
rename("$path_to_mrbs/$langs$l.new", "$path_to_mrbs/$langs$l") or
die("Failed to rename $path_to_mrbs/$langs$l.new to $path_to_mrbs/$langs$l");
// Re-read the updated file
unset($vocab);
include "$path_to_mrbs/$langs$l";
}
else
{
print "No token lines added.";
unlink("$path_to_mrbs/$langs$l.new") or
print "<span style=\"color: red; font-weight: bold\">
Failed to delete $path_to_mrbs/$langs".htmlspecialchars($l).".new</span>.\n";
}
}
?>
<h2>Language: <?php echo htmlspecialchars($l) ?></h2>
<table>
<tr>
<th>Problem</th>
<th>Key</th>
<th>Value</th>
</tr>
<?php
$ntotal = 0;
$nmissing = 0;
$nunxlate = 0;
foreach ($ref as $key => $val)
{
$ntotal++;
$status = "";
if (!isset($vocab[$key]))
{
$nmissing++;
$status = "Missing";
} else if (($key != "charset") &&
($vocab[$key] == $ref[$key]) &&
($ref[$key] != "") &&
(!preg_match('/^mail_/', $key)))
{
$status = "Untranslated";
$nunxlate++;
}
if ($status != "")
{
echo " <tr><td>$status</td><td>" .
htmlspecialchars($key) . "</td><td>" .
htmlspecialchars($ref[$key]) . "</td></tr>\n";
}
}
echo "</table>\n";
echo "<p>Total entries in reference language file: $ntotal\n";
echo "<br>For language file $l: ";
if ($nmissing + $nunxlate == 0)
{
echo "no missing or untranslated entries.\n";
}
else
{
echo "missing: $nmissing, untranslated: $nunxlate.\n";
}
print "<hr>\n";
}
?>
</body>
</html>