1
0
mirror of https://github.com/vrana/adminer.git synced 2025-09-04 03:35:41 +02:00

Compare commits

..

18 Commits

Author SHA1 Message Date
Jakub Vrana
7247f801bd Release 4.7.1 2019-01-24 15:57:17 +01:00
Jakub Vrana
21f0481a1d Remember visible columns in Create Table form (bug #493) 2019-01-22 13:24:15 +01:00
Jakub Vrana
7defb7787d Editor: Allow disabling boolean fields in PostgreSQL (bug #640) 2019-01-22 12:04:08 +01:00
Jan
659003e07f fix: haeckel adminer.css (#323)
- fix: broken menu layout on Firefox 64+
 - add: option to hide "new version" link (commented out)
 - add: author credits for changes made in 2018
2019-01-22 10:39:52 +01:00
Jakub Vrana
2cb426b464 SQLite: Hide server field in login form 2019-01-16 14:57:21 +01:00
Jakub Vrana
2117f224b6 Improve MariaDB status variables link (bug #658) 2019-01-16 12:49:24 +01:00
popcorner
7ea6266482 Update zh-tw.inc.php 2019-01-16 12:26:58 +01:00
popcorner
edb79998a9 Update zh.inc.php 2019-01-16 12:26:58 +01:00
Jakub Vrana
41043f8dad Display the tables scrollbar (bug #647) 2019-01-16 12:16:51 +01:00
Jakub Vrana
31bbadb479 Document change 2018-12-18 16:20:34 +01:00
Tim Düsterhus
a2fbcbe28e Fix PHP 7.3 compatibility (#318) 2018-12-18 16:17:21 +01:00
Edgar Barrantes
a623cd69de Position of the background database image changed. (#316) 2018-12-18 16:07:53 +01:00
alekseymvt
ed346be313 Fix mvt theme (#315) 2018-12-18 15:52:43 +01:00
Peter Knut
7eaa57fc0b Use <ul> list for logins (#314) 2018-12-18 15:45:04 +01:00
Jakub Vrana
c275362c30 Add missing Japanese translations (thanks to Shirai Takashi) 2018-12-18 14:45:46 +01:00
Peter Knut
b2606cda0e Change '...' to horizontal ellipsis character 2018-12-18 14:45:37 +01:00
helix84
da76e6b9b8 php <5.4 compat: array syntax (#313) 2018-12-18 14:21:23 +01:00
Jakub Vrana
83fe083f2f Add autocomplete attributes to login form 2018-12-12 16:13:14 +01:00
32 changed files with 731 additions and 499 deletions

View File

@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true; $row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
} }
if ($_POST) {
set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
}
if ($_POST && !process_fields($row["fields"]) && !$error) { if ($_POST && !process_fields($row["fields"]) && !$error) {
if ($_POST["drop"]) { if ($_POST["drop"]) {
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE))); queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
@@ -173,27 +177,16 @@ foreach ($engines as $engine) {
<div class="scrollable"> <div class="scrollable">
<table cellspacing="0" id="edit-fields" class="nowrap"> <table cellspacing="0" id="edit-fields" class="nowrap">
<?php <?php
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != ""); edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
if (!$_POST && !$comments) {
foreach ($row["fields"] as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
}
}
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
?> ?>
</table> </table>
</div> </div>
<p> <p>
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>"> <?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<?php echo checkbox("defaults", 1, !$_POST || $_POST["defaults"], lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?> <?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php echo ($_POST ? "" : script("editingHideDefaults();")); ?>
<?php echo (support("comment") <?php echo (support("comment")
? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>" ? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
. script("qsl('input').onclick = partial(editingCommentsClick, true);") . ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
: '') : '')
; ?> ; ?>
<p> <p>
@@ -227,4 +220,4 @@ foreach ($row["partition_names"] as $key => $val) {
?> ?>
<input type="hidden" name="token" value="<?php echo $token; ?>"> <input type="hidden" name="token" value="<?php echo $token; ?>">
</form> </form>
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick.call(qs('#form')['comments']);" : "")); ?> <?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>

View File

@@ -259,7 +259,7 @@ if (isset($_GET["clickhouse"])) {
} }
function unconvert_field($field, $return) { function unconvert_field($field, $return) {
if (in_array($field['type'], ["Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"])) { if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
return "to$field[type]($return)"; return "to$field[type]($return)";
} }
return $return; return $return;

View File

@@ -526,7 +526,7 @@ if (isset($_GET["mongo"])) {
$op = '$regex'; $op = '$regex';
break; break;
default: default:
continue; continue 2;
} }
if ($type == 'and') { if ($type == 'and') {
$data['$and'][] = array($col => array($op => $val)); $data['$and'][] = array($col => array($op => $val));

View File

@@ -119,10 +119,10 @@ class Adminer {
function loginForm() { function loginForm() {
global $drivers; global $drivers;
echo "<table cellspacing='0' class='layout'>\n"; echo "<table cellspacing='0' class='layout'>\n";
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER) . "\n"); echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);") . "\n");
echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n"); echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));")); echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n"); echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n"); echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
echo "</table>\n"; echo "</table>\n";
echo "<p><input type='submit' value='" . lang('Login') . "'>\n"; echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
@@ -641,7 +641,7 @@ class Adminer {
$history[$_GET["db"]] = array(); $history[$_GET["db"]] = array();
} }
if (strlen($query) > 1e6) { if (strlen($query) > 1e6) {
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment $query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n"; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
} }
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"] $history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
$sql_id = "sql-" . count($history[$_GET["db"]]); $sql_id = "sql-" . count($history[$_GET["db"]]);
@@ -933,12 +933,12 @@ class Adminer {
foreach ($usernames as $username => $password) { foreach ($usernames as $username => $password) {
if ($password !== null) { if ($password !== null) {
if ($first) { if ($first) {
echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});"); echo "<ul id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
$first = false; $first = false;
} }
$dbs = $_SESSION["db"][$vendor][$server][$username]; $dbs = $_SESSION["db"][$vendor][$server][$username];
foreach (($dbs ? array_keys($dbs) : array("")) as $db) { foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n"; echo "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
} }
} }
} }

View File

@@ -112,6 +112,31 @@ function referencable_primary($self) {
return $return; return $return;
} }
/** Get settings stored in a cookie
* @return array
*/
function adminer_settings() {
parse_str($_COOKIE["adminer_settings"], $settings);
return $settings;
}
/** Get setting stored in a cookie
* @param string
* @return array
*/
function adminer_setting($key) {
$settings = adminer_settings();
return $settings[$key];
}
/** Store settings to a cookie
* @param array
* @return bool
*/
function set_adminer_settings($settings) {
return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
}
/** Print SQL <textarea> tag /** Print SQL <textarea> tag
* @param string * @param string
* @param string or array in which case [0] of every element is used * @param string or array in which case [0] of every element is used
@@ -236,10 +261,9 @@ function type_class($type) {
* @param array * @param array
* @param string TABLE or PROCEDURE * @param string TABLE or PROCEDURE
* @param array returned by referencable_primary() * @param array returned by referencable_primary()
* @param bool display comments column
* @return null * @return null
*/ */
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) { function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
global $inout; global $inout;
$fields = array_values($fields); $fields = array_values($fields);
?> ?>
@@ -259,7 +283,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
'mssql' => "ms186775.aspx", 'mssql' => "ms186775.aspx",
)); ?> )); ?>
<td id="label-default"><?php echo lang('Default value'); ?> <td id="label-default"><?php echo lang('Default value'); ?>
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?> <?php echo (support("comment") ? "<td id='label-comment'>" . lang('Comment') : ""); ?>
<?php } ?> <?php } ?>
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?> <td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?>
</thead> </thead>
@@ -280,7 +304,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?> <td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php <td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : ""); echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
} }
echo "<td>"; echo "<td>";
echo (support("move_col") ? echo (support("move_col") ?

View File

@@ -815,7 +815,7 @@ function shorten_utf8($string, $length = 80, $suffix = "") {
if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match); preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
} }
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>"); return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i></i>");
} }
/** Format decimal number /** Format decimal number
@@ -1476,7 +1476,7 @@ function edit_form($TABLE, $fields, $row, $update) {
? lang('Save and continue edit') ? lang('Save and continue edit')
: lang('Save and insert next') : lang('Save and insert next')
) . "' title='Ctrl+Shift+Enter'>\n"; ) . "' title='Ctrl+Shift+Enter'>\n";
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "...', this); };") : ""); echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "', this); };") : "");
} }
} }
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n" echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"

View File

@@ -1,2 +1,2 @@
<?php <?php
$VERSION = "4.7.0"; $VERSION = "4.7.1";

View File

@@ -178,7 +178,7 @@ $translations = array(
'Optimize' => '最適化', 'Optimize' => '最適化',
'Check' => 'チェック', 'Check' => 'チェック',
'Repair' => '修復', 'Repair' => '修復',
'Truncate' => 'Truncate', 'Truncate' => '空にする',
'Move to other database' => '別のデータベースへ移動', 'Move to other database' => '別のデータベースへ移動',
'Move' => '移動', 'Move' => '移動',
'Save and continue edit' => '保存して継続', 'Save and continue edit' => '保存して継続',
@@ -264,4 +264,14 @@ $translations = array(
'Permanent link' => 'パーマネントリンク', 'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集', 'Edit all' => 'すべて編集',
'HH:MM:SS' => '時:分:秒', 'HH:MM:SS' => '時:分:秒',
'Selected' => '選択済',
'Modify' => '修正',
'Load more data' => '続きを読み込み',
'Loading' => '読み込み中',
'Size' => 'サイズ',
'Compute' => '算出',
'Saving' => '保存中',
'yes' => 'はい',
'no' => 'いいえ',
'Default value' => '既定値',
); );

View File

@@ -1,131 +1,38 @@
<?php <?php
$translations = array( $translations = array(
'Login' => '登入', // label for database system selection (MySQL, SQLite, ...)
'Logout successful.' => '成功登出。', 'System' => '資料庫系統',
'Invalid credentials.' => '無效的憑證。',
'Server' => '伺服器', 'Server' => '伺服器',
'Username' => '帳號', 'Username' => '帳號',
'Password' => '密碼', 'Password' => '密碼',
'Select database' => '選擇資料庫', 'Permanent login' => '永久登入',
'Invalid database.' => '無效的資料庫。', 'Login' => '登入',
'Table has been altered.' => '資料表已修改。',
'Table has been created.' => '資料表已建立。',
'Alter table' => '修改資料表',
'Create table' => '建立資料表',
'Table name' => '資料表名稱',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '欄位名稱',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動遞增',
'Options' => '選項',
'Save' => '儲存',
'Drop' => '刪除',
'Database has been dropped.' => '資料庫已刪除。',
'Database has been created.' => '已建立資料庫。',
'Database has been renamed.' => '已重新命名資料庫。',
'Database has been altered.' => '已修改資料庫。',
'Alter database' => '修改資料庫',
'Create database' => '建立資料庫',
'SQL command' => 'SQL 命令',
'Logout' => '登出', 'Logout' => '登出',
'database' => '資料庫', 'Logged as: %s' => '登錄為: %s',
'Use' => '使用', 'Logout successful.' => '成功登出。',
'No tables.' => '沒有資料表。', 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感謝使用Adminer請考慮為我們<a href="https://www.adminer.org/en/donation/">捐款(英文網頁)</a>.',
'select' => '選擇', 'Invalid credentials.' => '無效的憑證。',
'Item has been updated.' => '已更新項目。', 'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
'Item%s has been inserted.' => '已新增項目 %s。', 'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer預設不支援訪問沒有密碼的資料庫<a href="https://www.adminer.org/en/password/"%s>詳情見這裡</a>.',
'Edit' => '編輯', 'Database does not support password.' => '資料庫不支援密碼。',
'Insert' => '新增', 'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
'Save and insert next' => '儲存並新增下一筆', 'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密碼已過期。<a href="https://www.adminer.org/en/extension/"%s>請擴展</a> %s 方法讓它永久化。',
'Delete' => '刪除',
'Database' => '資料庫',
'Routines' => '程序',
'Indexes have been altered.' => '已修改索引。',
'Indexes' => '索引',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Language' => '語言', 'Language' => '語言',
'Select' => '選擇',
'New item' => '新增項目',
'Search' => '搜尋',
'Sort' => '排序',
'descending' => '降冪 (遞減)',
'Limit' => '限定',
'No rows.' => '沒有資料行。',
'Action' => '動作',
'edit' => '編輯',
'Page' => '頁',
'Query executed OK, %d row(s) affected.' => '執行查詢 OK%d 行受影響。',
'Error in query' => '查詢發生錯誤',
'Execute' => '執行',
'Table' => '資料表',
'Foreign keys' => '外來鍵',
'Triggers' => '觸發器',
'View' => '檢視表',
'Unable to select the table' => '無法選擇該資料表',
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。', 'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
'Comment' => '註解', 'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求請關閉此頁面。',
'Default values' => '預設值',
'%d byte(s)' => '%d byte(s)',
'No commands to execute.' => '沒有命令可執行。',
'Unable to upload a file.' => '無法上傳檔案。',
'File upload' => '檔案上傳',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
'Call' => '呼叫',
'No extension' => '無擴充模組', 'No extension' => '無擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s。', 'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s。',
'Connecting to privileged ports is not allowed.' => '不允許連接到特權埠。',
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或啟用 %s 或 %s 擴充模組。',
'Session support must be enabled.' => 'Session 必須被啟用。', 'Session support must be enabled.' => 'Session 必須被啟用。',
'Session expired, please login again.' => 'Session 已過期,請重新登入。', 'Session expired, please login again.' => 'Session 已過期,請重新登入。',
'Text length' => 'Text 長度', 'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
'Foreign key has been dropped.' => '已刪除外來鍵。',
'Foreign key has been altered.' => '已修改外來鍵。',
'Foreign key has been created.' => '已建立外來鍵。',
'Foreign key' => '外來鍵',
'Target table' => '目標資料表',
'Change' => '變更',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增欄位',
'Alter' => '修改',
'Add foreign key' => '新增外來鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引類型',
'Column (length)' => '欄位(長度)',
'View has been dropped.' => '已刪除檢視表。',
'View has been altered.' => '已修改檢視表。',
'View has been created.' => '已建立檢視表。',
'Alter view' => '修改檢視表',
'Create view' => '建立檢視表',
'Name' => '名稱',
'Process list' => '處理程序列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Parameter name' => '參數名稱',
'Database schema' => '資料庫結構',
'Create procedure' => '建立預存程序',
'Create function' => '建立函式',
'Routine has been dropped.' => '已刪除程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '修改函式',
'Alter procedure' => '修改預存程序',
'Return type' => '回傳類型',
'Add trigger' => '建立觸發器',
'Trigger has been dropped.' => '已刪除觸發器。',
'Trigger has been altered.' => '已修改觸發器。',
'Trigger has been created.' => '已建立觸發器。',
'Alter trigger' => '修改觸發器',
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s', '%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
'%d row(s)' => '%d 行', 'Refresh' => '重新載入',
'Remove' => '移除',
'Are you sure?' => '你確定嗎?', // text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '權限', 'Privileges' => '權限',
'Create user' => '建立使用者', 'Create user' => '建立使用者',
'User has been dropped.' => '已刪除使用者。', 'User has been dropped.' => '已刪除使用者。',
@@ -136,132 +43,306 @@ $translations = array(
'Routine' => '程序', 'Routine' => '程序',
'Grant' => '授權', 'Grant' => '授權',
'Revoke' => '廢除', 'Revoke' => '廢除',
'Logged as: %s' => '登錄為: %s',
'Process list' => '處理程序列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Variables' => '變數',
'Status' => '狀態',
'SQL command' => 'SQL 命令',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Query executed OK, %d row(s) affected.' => '執行查詢 OK%d 行受影響。',
'No commands to execute.' => '沒有命令可執行。',
'Error in query' => '查詢發生錯誤',
'Unknown error.' => '未知錯誤。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支援ATTACH查詢。',
'Execute' => '執行',
'Stop on error' => '出錯時停止',
'Show only errors' => '僅顯示錯誤訊息',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '紀錄',
'Clear' => '清除',
'Edit all' => '編輯全部',
'File upload' => '檔案上傳',
'From server' => '從伺服器',
'Webserver file %s' => '網頁伺服器檔案 %s',
'Run file' => '執行檔案',
'File does not exist.' => '檔案不存在',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Unable to upload a file.' => '無法上傳檔案。',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。', 'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
'Move up' => '上移', 'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
'Move down' => '下移', 'You are offline.' => '您離線了。',
'Export' => '匯出', 'Export' => '匯出',
'Tables' => '資料表',
'Data' => '資料',
'Output' => '輸出', 'Output' => '輸出',
'open' => '打開', 'open' => '打開',
'save' => '儲存', 'save' => '儲存',
'Saving' => '保存中',
'Format' => '格式', 'Format' => '格式',
'Functions' => '函式', 'Data' => '資料',
'Aggregation' => '集合',
'Event has been dropped.' => '已刪除事件。', 'Database' => '資料庫',
'Event has been altered.' => '已修改事件。', 'database' => '資料庫',
'Event has been created.' => '已建立事件。', 'DB' => '資料庫',
'Alter event' => '修改事件', 'Use' => '使用',
'Create event' => '建立事件', 'Select database' => '選擇資料庫',
'Start' => '開始', 'Invalid database.' => '無效的資料庫。',
'End' => '結束', 'Database has been dropped.' => '資料庫已刪除。',
'Every' => '', 'Databases have been dropped.' => '資料庫已刪除。',
'Status' => '狀態', 'Database has been created.' => '已建立資料庫。',
'On completion preserve' => '在完成後儲存', 'Database has been renamed.' => '已重新命名資料庫。',
'Events' => '事件', 'Database has been altered.' => '已修改資料庫。',
'Schedule' => '排程', 'Alter database' => '修改資料庫',
'At given time' => '在指定時間', 'Create database' => '建立資料庫',
'Tables have been truncated.' => '已清空資料表。', 'Database schema' => '資料庫結構',
'Tables have been moved.' => '已轉移資料表。',
'Tables and views' => '資料表和檢視表', // link to current database schema layout
'Permanent link' => '永久連結',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎', 'Engine' => '引擎',
'Collation' => '校對', 'Collation' => '校對',
'Data Length' => '資料長度', 'Data Length' => '資料長度',
'Index Length' => '索引長度', 'Index Length' => '索引長度',
'Data Free' => '資料空閒', 'Data Free' => '資料空閒',
'Rows' => '行數', 'Rows' => '行數',
',' => ',', '%d in total' => '總共 %d 個',
'0123456789' => '0123456789',
'Analyze' => '分析', 'Analyze' => '分析',
'Optimize' => '最佳化', 'Optimize' => '最佳化',
'Vacuum' => '整理Vacuum',
'Check' => '檢查', 'Check' => '檢查',
'Repair' => '修復', 'Repair' => '修復',
'Truncate' => '清空', 'Truncate' => '清空',
'Tables have been truncated.' => '已清空資料表。',
'Move to other database' => '轉移到其它資料庫', 'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移', 'Move' => '轉移',
'Save and continue edit' => '儲存並繼續編輯', 'Tables have been moved.' => '已轉移資料表。',
'original' => '原始', 'Copy' => '複製',
'%d item(s) have been affected.' => '%d 個項目受到影響。', 'Tables have been copied.' => '資料表已經複製',
'Whole result' => '所有結果',
'Routines' => '程序',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
'Call' => '呼叫',
'Parameter name' => '參數名稱',
'Create procedure' => '建立預存程序',
'Create function' => '建立函式',
'Routine has been dropped.' => '已刪除程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '修改函式',
'Alter procedure' => '修改預存程序',
'Return type' => '回傳類型',
'Events' => '事件',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '修改事件',
'Create event' => '建立事件',
'At given time' => '在指定時間',
'Every' => '每',
'Schedule' => '排程',
'Start' => '開始',
'End' => '結束',
'On completion preserve' => '在完成後儲存',
'Tables' => '資料表',
'Tables and views' => '資料表和檢視表',
'Table' => '資料表',
'No tables.' => '沒有資料表。',
'Alter table' => '修改資料表',
'Create table' => '建立資料表',
'Table has been dropped.' => '已經刪除資料表。',
'Tables have been dropped.' => '已經將資料表刪除。', 'Tables have been dropped.' => '已經將資料表刪除。',
'Clone' => '複製', 'Tables have been optimized.' => '已優化資料表。',
'Table has been altered.' => '資料表已修改。',
'Table has been created.' => '資料表已建立。',
'Table name' => '資料表名稱',
'Show structure' => '顯示結構',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '欄位名稱',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動遞增',
'Options' => '選項',
'Comment' => '註解',
'Default value' => '預設值',
'Default values' => '預設值',
'Drop' => '刪除',
'Drop %s?' => '刪除 %s?',
'Are you sure?' => '你確定嗎?',
'Size' => '大小',
'Compute' => '計算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。', 'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
'Partition by' => '分區類型', 'Partition by' => '分區類型',
'Partitions' => '分區', 'Partitions' => '分區',
'Partition name' => '分區名稱', 'Partition name' => '分區名稱',
'Values' => '值', 'Values' => '值',
'%d row(s) have been imported.' => '已匯入 %d 行。',
'anywhere' => '任意位置', 'View' => '檢視表',
'Import' => '匯入', 'Materialized view' => '物化視圖',
'Stop on error' => '出錯時停止', 'View has been dropped.' => '已刪除檢視表。',
'%.3f s' => '%.3f 秒', 'View has been altered.' => '已修改檢視表。',
'$1-$3-$5' => '$1.$3.$5', 'View has been created.' => '已建立檢視表。',
'[yyyy]-mm-dd' => '[yyyy].mm.dd', 'Alter view' => '修改檢視表',
'History' => '紀錄', 'Create view' => '建立檢視表',
'Variables' => '變數',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Index Type' => '索引類型',
'Column (length)' => '欄位(長度)',
'Foreign keys' => '外來鍵',
'Foreign key' => '外來鍵',
'Foreign key has been dropped.' => '已刪除外來鍵。',
'Foreign key has been altered.' => '已修改外來鍵。',
'Foreign key has been created.' => '已建立外來鍵。',
'Target table' => '目標資料表',
'Change' => '變更',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增欄位',
'Alter' => '修改',
'Add foreign key' => '新增外來鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。', 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
'Relations' => '關聯',
'Run file' => '執行檔案', 'Triggers' => '觸發器',
'Clear' => '清除', 'Add trigger' => '建立觸發器',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB', 'Trigger has been dropped.' => '已刪除觸發器。',
'Trigger has been altered.' => '已修改觸發器。',
'Trigger has been created.' => '已建立觸發器。',
'Alter trigger' => '修改觸發器',
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'Name' => '名稱',
'select' => '選擇',
'Select' => '選擇',
'Select data' => '選擇資料',
'Functions' => '函式',
'Aggregation' => '集合',
'Search' => '搜尋',
'anywhere' => '任意位置',
'Search data in tables' => '在資料庫搜尋',
'Sort' => '排序',
'descending' => '降冪 (遞減)',
'Limit' => '限定',
'Limit rows' => '限制行數',
'Text length' => 'Text 長度',
'Action' => '動作',
'Full table scan' => '全資料表掃描',
'Unable to select the table' => '無法選擇該資料表',
'No rows.' => '沒有資料行。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '頁',
'last' => '最後一頁',
'Load more data' => '載入更多資料',
'Loading' => '載入中',
'Whole result' => '所有結果',
'%d byte(s)' => '%d byte(s)',
'Import' => '匯入',
'%d row(s) have been imported.' => '已匯入 %d 行。',
'File must be in UTF-8 encoding.' => '檔必須使用UTF-8編碼。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl並按一下某個值進行修改。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已新增項目 %s。',
'Item has been deleted.' => '該項目已被刪除',
'Item has been updated.' => '已更新項目。',
'%d item(s) have been affected.' => '%d 個項目受到影響。',
'New item' => '新增項目',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空值',
'edit' => '編輯',
'Edit' => '編輯',
'Insert' => '新增',
'Save' => '儲存',
'Save and continue edit' => '儲存並繼續編輯',
'Save and insert next' => '儲存並新增下一筆',
'Selected' => '已選中',
'Clone' => '複製',
'Delete' => '刪除',
'You have no privileges to update this table.' => '您沒有許可權更新這個資料表。',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主旨',
'Attachments' => '附件',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
// data type descriptions
'Numbers' => '數字', 'Numbers' => '數字',
'Date and time' => '日期時間', 'Date and time' => '日期時間',
'Strings' => '字串', 'Strings' => '字串',
'Binary' => '二進位', 'Binary' => '二進位',
'Lists' => '列表', 'Lists' => '列表',
'Network' => '網路',
'Geometry' => '幾何',
'Relations' => '關聯',
'Editor' => '編輯器', 'Editor' => '編輯器',
'E-mail' => '電子郵件', // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'From' => '來自', '$1-$3-$5' => '$1.$3.$5',
'Subject' => '主旨', // hint for date format - use language equivalents for day, month and year shortcuts
'Send' => '寄出', '[yyyy]-mm-dd' => '[yyyy].mm.dd',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。', // hint for time format - use language equivalents for hour, minute and second shortcuts
'Webserver file %s' => '網頁伺服器檔案 %s', 'HH:MM:SS' => 'HH:MM:SS',
'File does not exist.' => '檔案不存在', 'now' => '在',
'Item has been deleted.' => '該項目已被刪除', 'yes' => '',
'%d in total' => '總共 %d 個', 'no' => '',
'Permanent login' => '永久登入',
'Table has been dropped.' => '已經刪除資料表。', // general SQLite error in create, drop or rename database
'Databases have been dropped.' => '資料庫已刪除。', 'File exists.' => '檔案已存在。',
'Search data in tables' => '在資料庫搜尋', 'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
'Schema' => '資料表結構',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改資料表結構', 'Alter schema' => '修改資料表結構',
'Create schema' => '建立資料表結構', 'Create schema' => '建立資料表結構',
'Schema has been dropped.' => '已刪除資料表結構。', 'Schema has been dropped.' => '已刪除資料表結構。',
'Schema has been created.' => '已建立資料表結構。', 'Schema has been created.' => '已建立資料表結構。',
'Schema has been altered.' => '已修改資料表結構。', 'Schema has been altered.' => '已修改資料表結構。',
'Schema' => '資料表結構',
'Invalid schema.' => '無效的資料表結構。',
// PostgreSQL sequences support
'Sequences' => '序列', 'Sequences' => '序列',
'Create sequence' => '建立序列', 'Create sequence' => '建立序列',
'Alter sequence' => '修改序列',
'Sequence has been dropped.' => '已刪除序列。', 'Sequence has been dropped.' => '已刪除序列。',
'Sequence has been created.' => '已建立序列。', 'Sequence has been created.' => '已建立序列。',
'Sequence has been altered.' => '已修改序列。', 'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '使用者類型', 'User types' => '使用者類型',
'Create type' => '建立類型', 'Create type' => '建立類型',
'Alter type' => '修改類型',
'Type has been dropped.' => '已刪除類型。', 'Type has been dropped.' => '已刪除類型。',
'Type has been created.' => '已建立類型。', 'Type has been created.' => '已建立類型。',
'Use edit link to modify this value.' => '使用編輯連結來修改。', 'Alter type' => '修改類型',
'last' => '最後一頁',
'From server' => '從伺服器',
'System' => '資料庫系統',
'Select data' => '選擇資料',
'Show structure' => '顯示結構',
'empty' => '空值',
'Network' => '網路',
'Geometry' => '幾何',
'File exists.' => '檔案已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Show only errors' => '僅顯示錯誤訊息',
'Refresh' => '重新載入',
'Invalid schema.' => '無效的資料表結構。',
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
'now' => '現在',
'ltr' => 'ltr',
'Tables have been copied.' => '資料表已經複製',
'Copy' => '複製',
'Permanent link' => '永久連結',
'Edit all' => '編輯全部',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -1,133 +1,38 @@
<?php <?php
$translations = array( $translations = array(
'Login' => '登录', // label for database system selection (MySQL, SQLite, ...)
'Logout successful.' => '注销成功。', 'System' => '系统',
'Invalid credentials.' => '无效凭据。',
'Server' => '服务器', 'Server' => '服务器',
'Username' => '用户名', 'Username' => '用户名',
'Password' => '密码', 'Password' => '密码',
'Select database' => '选择数据库', 'Permanent login' => '保持登录',
'Invalid database.' => '无效数据库。', 'Login' => '登录',
'Table has been dropped.' => '已删除表。', 'Logout' => '登出',
'Table has been altered.' => '已修改表。', 'Logged as: %s' => '登录用户:%s',
'Table has been created.' => '已创建表。', 'Logout successful.' => '成功登出。',
'Alter table' => '修改表', 'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感谢使用Adminer请考虑为我们<a href="https://www.adminer.org/en/donation/">捐款(英文页面)</a>.',
'Create table' => '创建表', 'Invalid credentials.' => '无效凭据。',
'Table name' => '表名', 'There is a space in the input password which might be the cause.' => '您输入的密码中有一个空格,这可能是导致问题的原因。',
'engine' => '引擎', 'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer默认不支持访问没有密码的数据库<a href="https://www.adminer.org/en/password/"%s>详情见这里</a>.',
'collation' => '校对', 'Database does not support password.' => '数据库不支持密码。',
'Column name' => '字段名', 'Too many unsuccessful logins, try again in %d minute(s).' => '登录失败次数过多,请 %d 分钟后重试。',
'Type' => '类型', 'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密码已过期。<a href="https://www.adminer.org/en/extension/"%s>请扩展</a> %s 方法让它永久化。',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Save' => '保存',
'Drop' => '删除',
'Database has been dropped.' => '已删除数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已修改数据库。',
'Alter database' => '修改数据库',
'Create database' => '创建数据库',
'SQL command' => 'SQL命令',
'Logout' => '注销',
'database' => '数据库',
'Use' => '使用',
'No tables.' => '没有表。',
'select' => '选择',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'Item%s has been inserted.' => '已插入项目%s。',
'Edit' => '编辑',
'Insert' => '插入',
'Save and insert next' => '保存并插入下一个',
'Delete' => '删除',
'Database' => '数据库',
'Routines' => '子程序',
'Indexes have been altered.' => '已修改索引。',
'Indexes' => '索引',
'Alter indexes' => '修改索引',
'Add next' => '下一行插入',
'Language' => '语言', 'Language' => '语言',
'Select' => '选择', 'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。请重新发送表单。',
'New item' => '新建数据', 'If you did not send this request from Adminer then close this page.' => '如果您并没有从Adminer发送请求请关闭此页面。',
'Search' => '搜索',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '范围',
'No rows.' => '无数据。',
'Action' => '动作',
'edit' => '编辑',
'Page' => '页面',
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
'Error in query' => '查询出错',
'Execute' => '执行',
'Table' => '表',
'Foreign keys' => '外键',
'Triggers' => '触发器',
'View' => '视图',
'Unable to select the table' => '不能选择该表',
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。重新发送表单。',
'Comment' => '注释',
'Default values' => '默认值',
'%d byte(s)' => '%d 字节',
'No commands to execute.' => '没有命令被执行。',
'Unable to upload a file.' => '不能上传文件。',
'File upload' => '文件上传',
'File uploads are disabled.' => '文件上传被禁用。',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'No extension' => '没有扩展', 'No extension' => '没有扩展',
'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s。', 'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s。',
'Session support must be enabled.' => 'Session 必须被启用。', 'Connecting to privileged ports is not allowed.' => '不允许连接到特权端口。',
'Session expired, please login again.' => 'Session 已过期,请重新登录。', 'Disable %s or enable %s or %s extensions.' => '禁用 %s 或启用 %s 或 %s 扩展。',
'Text length' => '文本显示限制', 'Session support must be enabled.' => '必须启用会话支持。',
'Foreign key has been dropped.' => '已删除外键。', 'Session expired, please login again.' => '会话已过期,请重新登录。',
'Foreign key has been altered.' => '已修改外键。', 'The action will be performed after successful login with the same credentials.' => '此操作将在成功使用相同的凭据登录后执行。',
'Foreign key has been created.' => '已创建外键。',
'Foreign key' => '外键',
'Target table' => '目标表',
'Change' => '修改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '修改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'View has been dropped.' => '已删除视图。',
'View has been altered.' => '已修改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '修改视图',
'Create view' => '创建视图',
'Name' => '名称',
'Process list' => '进程列表',
'%d process(es) have been killed.' => '%d 个进程被终止',
'Kill' => '终止',
'Parameter name' => '参数名',
'Database schema' => '数据库概要',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '修改函数',
'Alter procedure' => '修改过程',
'Return type' => '返回类型',
'Add trigger' => '创建触发器',
'Trigger has been dropped.' => '已删除触发器。',
'Trigger has been altered.' => '已修改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '修改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s 版本:%s 使用PHP扩展 %s', '%s version: %s through PHP extension %s' => '%s 版本:%s 使用PHP扩展 %s',
'%d row(s)' => '%d 行', 'Refresh' => '刷新',
'Remove' => '移除',
'Are you sure?' => '你确定吗?', // text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '权限', 'Privileges' => '权限',
'Create user' => '创建用户', 'Create user' => '创建用户',
'User has been dropped.' => '已删除用户。', 'User has been dropped.' => '已删除用户。',
@@ -138,130 +43,306 @@ $translations = array(
'Routine' => '子程序', 'Routine' => '子程序',
'Grant' => '授权', 'Grant' => '授权',
'Revoke' => '废除', 'Revoke' => '废除',
'Logged as: %s' => '登录用户:%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。', 'Process list' => '进程列表',
'Move up' => '上移', '%d process(es) have been killed.' => '%d 个进程被终止',
'Move down' => '下移', 'Kill' => '终止',
'Variables' => '变量',
'Status' => '状态',
'SQL command' => 'SQL命令',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
'No commands to execute.' => '没有命令被执行。',
'Error in query' => '查询出错',
'Unknown error.' => '未知错误。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支持ATTACH查询。',
'Execute' => '执行',
'Stop on error' => '出错时停止',
'Show only errors' => '仅显示错误',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '历史',
'Clear' => '清除',
'Edit all' => '编辑全部',
'File upload' => '文件上传',
'From server' => '来自服务器',
'Webserver file %s' => 'Web服务器文件 %s',
'Run file' => '运行文件',
'File does not exist.' => '文件不存在。',
'File uploads are disabled.' => '文件上传被禁用。',
'Unable to upload a file.' => '不能上传文件。',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB。',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 数据太大。请减少数据或者增加 %s 配置命令。',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通过FTP上传大型SQL文件并从服务器导入。',
'You are offline.' => '您离线了。',
'Export' => '导出', 'Export' => '导出',
'Tables' => '表',
'Data' => '数据',
'Output' => '输出', 'Output' => '输出',
'open' => '打开', 'open' => '打开',
'save' => '保存', 'save' => '保存',
'Saving' => '保存中',
'Format' => '格式', 'Format' => '格式',
'Functions' => '数', 'Data' => '数',
'Aggregation' => '集合',
'Event has been dropped.' => '已删除事件。', 'Database' => '数据库',
'Event has been altered.' => '已修改事件。', 'database' => '数据库',
'Event has been created.' => '已创建事件。', 'DB' => '数据库',
'Alter event' => '修改事件', 'Use' => '使用',
'Create event' => '创建事件', 'Select database' => '选择数据库',
'Start' => '开始', 'Invalid database.' => '无效数据库。',
'End' => '结束', 'Database has been dropped.' => '已删除数据库。',
'Every' => '', 'Databases have been dropped.' => '已删除数据库。',
'Status' => '状态', 'Database has been created.' => '已创建数据库。',
'On completion preserve' => '完成后保存', 'Database has been renamed.' => '已重命名数据库。',
'Events' => '事件', 'Database has been altered.' => '已修改数据库。',
'Schedule' => '调度', 'Alter database' => '修改数据库',
'At given time' => '在指定时间', 'Create database' => '创建数据库',
'Tables have been truncated.' => '已清空表。', 'Database schema' => '数据库概要',
'Tables have been moved.' => '已转移表。',
'Tables and views' => '表和视图', // link to current database schema layout
'Permanent link' => '固定链接',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎', 'Engine' => '引擎',
'Collation' => '校对', 'Collation' => '校对',
'Data Length' => '数据长度', 'Data Length' => '数据长度',
'Index Length' => '索引长度', 'Index Length' => '索引长度',
'Data Free' => '数据空闲', 'Data Free' => '数据空闲',
'Rows' => '行数', 'Rows' => '行数',
',' => ',', '%d in total' => '共计 %d',
'0123456789' => '0123456789',
'Analyze' => '分析', 'Analyze' => '分析',
'Optimize' => '优化', 'Optimize' => '优化',
'Vacuum' => '整理Vacuum',
'Check' => '检查', 'Check' => '检查',
'Repair' => '修复', 'Repair' => '修复',
'Truncate' => '清空', 'Truncate' => '清空',
'Tables have been truncated.' => '已清空表。',
'Move to other database' => '转移到其它数据库', 'Move to other database' => '转移到其它数据库',
'Move' => '转移', 'Move' => '转移',
'Save and continue edit' => '保存并继续编辑', 'Tables have been moved.' => '已转移表。',
'original' => '原始', 'Copy' => '复制',
'%d item(s) have been affected.' => '%d 个项目受到影响。', 'Tables have been copied.' => '已复制表。',
'Whole result' => '所有结果',
'Routines' => '子程序',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'Parameter name' => '参数名',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '修改函数',
'Alter procedure' => '修改过程',
'Return type' => '返回类型',
'Events' => '事件',
'Event has been dropped.' => '已删除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '修改事件',
'Create event' => '创建事件',
'At given time' => '在指定时间',
'Every' => '每',
'Schedule' => '调度',
'Start' => '开始',
'End' => '结束',
'On completion preserve' => '完成后仍保留',
'Tables' => '表',
'Tables and views' => '表和视图',
'Table' => '表',
'No tables.' => '没有表。',
'Alter table' => '修改表',
'Create table' => '创建表',
'Table has been dropped.' => '已删除表。',
'Tables have been dropped.' => '已删除表。', 'Tables have been dropped.' => '已删除表。',
'Clone' => '复制', 'Tables have been optimized.' => '已优化表。',
'Table has been altered.' => '已修改表。',
'Table has been created.' => '已创建表。',
'Table name' => '表名',
'Show structure' => '显示结构',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '字段名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Comment' => '注释',
'Default value' => '默认值',
'Default values' => '默认值',
'Drop' => '删除',
'Drop %s?' => '删除 %s?',
'Are you sure?' => '您确定吗?',
'Size' => '大小',
'Compute' => '计算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。', 'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
'Partition by' => '分区类型', 'Partition by' => '分区类型',
'Partitions' => '分区', 'Partitions' => '分区',
'Partition name' => '分区名', 'Partition name' => '分区名',
'Values' => '值', 'Values' => '值',
'%d row(s) have been imported.' => '%d 行已导入。',
'anywhere' => '任意位置', 'View' => '视图',
'Import' => '导入', 'Materialized view' => '物化视图',
'Stop on error' => '出错时停止', 'View has been dropped.' => '已删除视图。',
'%.3f s' => '%.3f 秒', 'View has been altered.' => '已修改视图。',
'$1-$3-$5' => '$1.$3.$5', 'View has been created.' => '已创建视图。',
'[yyyy]-mm-dd' => '[yyyy].mm.dd', 'Alter view' => '修改视图',
'History' => '历史', 'Create view' => '创建视图',
'Variables' => '变量',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '下一行插入',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'Foreign keys' => '外键',
'Foreign key' => '外键',
'Foreign key has been dropped.' => '已删除外键。',
'Foreign key has been altered.' => '已修改外键。',
'Foreign key has been created.' => '已创建外键。',
'Target table' => '目标表',
'Change' => '修改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '修改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。', 'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
'Relations' => '关联信息',
'Run file' => '运行文件', 'Triggers' => '触发器',
'Clear' => '清除', 'Add trigger' => '创建触发器',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB', 'Trigger has been dropped.' => '已删除触发器。',
'Trigger has been altered.' => '已修改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '修改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'Name' => '名称',
'select' => '选择',
'Select' => '选择',
'Select data' => '选择数据',
'Functions' => '函数',
'Aggregation' => '集合',
'Search' => '搜索',
'anywhere' => '任意位置',
'Search data in tables' => '在表中搜索数据',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '范围',
'Limit rows' => '限制行数',
'Text length' => '文本显示限制',
'Action' => '动作',
'Full table scan' => '全表扫描',
'Unable to select the table' => '不能选择该表',
'No rows.' => '无数据。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '页面',
'last' => '最后',
'Load more data' => '加载更多数据',
'Loading' => '加载中',
'Whole result' => '所有结果',
'%d byte(s)' => '%d 字节',
'Import' => '导入',
'%d row(s) have been imported.' => '%d 行已导入。',
'File must be in UTF-8 encoding.' => '文件必须使用UTF-8编码。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl并单击某个值进行修改。',
'Use edit link to modify this value.' => '使用编辑链接修改该值。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已插入项目%s。',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'%d item(s) have been affected.' => '%d 个项目受到影响。',
'New item' => '新建数据',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空',
'edit' => '编辑',
'Edit' => '编辑',
'Insert' => '插入',
'Save' => '保存',
'Save and continue edit' => '保存并继续编辑',
'Save and insert next' => '保存并插入下一个',
'Selected' => '已选中',
'Clone' => '复制',
'Delete' => '删除',
'You have no privileges to update this table.' => '您没有权限更新这个表。',
'E-mail' => '电子邮件',
'From' => '来自',
'Subject' => '主题',
'Attachments' => '附件',
'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
// data type descriptions
'Numbers' => '数字', 'Numbers' => '数字',
'Date and time' => '日期时间', 'Date and time' => '日期时间',
'Strings' => '字符串', 'Strings' => '字符串',
'Binary' => '二进制', 'Binary' => '二进制',
'Lists' => '列表', 'Lists' => '列表',
'Network' => '网络',
'Geometry' => '几何图形',
'Relations' => '关联信息',
'Editor' => '编辑器', 'Editor' => '编辑器',
'E-mail' => '电子邮件', // date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'From' => '来自', '$1-$3-$5' => '$1.$3.$5',
'Subject' => '主题', // hint for date format - use language equivalents for day, month and year shortcuts
'Send' => '发送', '[yyyy]-mm-dd' => '[yyyy].mm.dd',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。', // hint for time format - use language equivalents for hour, minute and second shortcuts
'Webserver file %s' => 'Web服务器文件 %s', 'HH:MM:SS' => 'HH:MM:SS',
'File does not exist.' => '文件不存在。', 'now' => '现在',
'%d in total' => '共计 %d', 'yes' => '',
'Permanent login' => '保持登录', 'no' => '',
'Databases have been dropped.' => '已删除数据库。',
'Search data in tables' => '在表中搜索数据', // general SQLite error in create, drop or rename database
'Schema' => '模式', 'File exists.' => '文件已存在。',
'Please use one of the extensions %s.' => '请使用其中一个扩展:%s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改模式', 'Alter schema' => '修改模式',
'Create schema' => '创建模式', 'Create schema' => '创建模式',
'Schema has been dropped.' => '已删除模式。', 'Schema has been dropped.' => '已删除模式。',
'Schema has been created.' => '已创建模式。', 'Schema has been created.' => '已创建模式。',
'Schema has been altered.' => '已修改模式。', 'Schema has been altered.' => '已修改模式。',
'Schema' => '模式',
'Invalid schema.' => '非法模式。',
// PostgreSQL sequences support
'Sequences' => '序列', 'Sequences' => '序列',
'Create sequence' => '创建序列', 'Create sequence' => '创建序列',
'Alter sequence' => '修改序列',
'Sequence has been dropped.' => '已删除序列。', 'Sequence has been dropped.' => '已删除序列。',
'Sequence has been created.' => '已创建序列。', 'Sequence has been created.' => '已创建序列。',
'Sequence has been altered.' => '已修改序列。', 'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '用户类型', 'User types' => '用户类型',
'Create type' => '创建类型', 'Create type' => '创建类型',
'Alter type' => '修改类型',
'Type has been dropped.' => '已删除类型。', 'Type has been dropped.' => '已删除类型。',
'Type has been created.' => '已创建类型。', 'Type has been created.' => '已创建类型。',
'Use edit link to modify this value.' => '使用编辑链接来修改该值。', 'Alter type' => '修改类型',
'last' => '最后',
'From server' => '来自服务器',
'System' => '系统',
'Select data' => '选择数据',
'Show structure' => '显示结构',
'empty' => '空',
'Network' => '网络',
'Geometry' => '几何图形',
'File exists.' => '文件已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Show only errors' => '仅显示错误',
'Refresh' => '刷新',
'Invalid schema.' => '非法模式。',
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
'now' => '现在',
'ltr' => 'ltr',
'Tables have been copied.' => '表已复制。',
'Copy' => '复制',
'Permanent link' => '固定链接',
'Edit all' => '编辑全部',
'HH:MM:SS' => 'HH:MM:SS',
); );

View File

@@ -440,7 +440,7 @@ if (!$columns && support("table")) {
$h_value = h($value !== null ? $value : $row[$key]); $h_value = h($value !== null ? $value : $row[$key]);
echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>"); echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
} else { } else {
$long = strpos($val, "<i>...</i>"); $long = strpos($val, "<i></i>");
echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'" echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'") . ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
. ">$val</td>" . ">$val</td>"
@@ -484,7 +484,7 @@ if (!$columns && support("table")) {
if ($pagination) { if ($pagination) {
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
? '<p><a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>' ? '<p><a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>'
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "...');", "") . script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "');", "")
: '' : ''
); );
echo "\n"; echo "\n";
@@ -503,12 +503,12 @@ if (!$columns && support("table")) {
if ($jush != "simpledb") { if ($jush != "simpledb") {
echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>"; echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>";
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };"); echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
echo pagination(0, $page) . ($page > 5 ? " ..." : ""); echo pagination(0, $page) . ($page > 5 ? " " : "");
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) { for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
echo pagination($i, $page); echo pagination($i, $page);
} }
if ($max_page > 0) { if ($max_page > 0) {
echo ($page + 5 < $max_page ? " ..." : ""); echo ($page + 5 < $max_page ? " " : "");
echo ($exact_count && $found_rows !== false echo ($exact_count && $found_rows !== false
? pagination($max_page, $page) ? pagination($max_page, $page)
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>" : " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
@@ -516,9 +516,9 @@ if (!$columns && support("table")) {
} }
} else { } else {
echo "<legend>" . lang('Page') . "</legend>"; echo "<legend>" . lang('Page') . "</legend>";
echo pagination(0, $page) . ($page > 1 ? " ..." : ""); echo pagination(0, $page) . ($page > 1 ? " " : "");
echo ($page ? pagination($page, $page) : ""); echo ($page ? pagination($page, $page) : "");
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : ""); echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " " : "") : "");
} }
echo "</fieldset>\n"; echo "</fieldset>\n";
} }

View File

@@ -32,7 +32,6 @@ input.wayoff { left: -1000px; position: absolute; }
.version { color: #777; font-size: 67%; } .version { color: #777; font-size: 67%; }
.js .hidden, .nojs .jsonly { display: none; } .js .hidden, .nojs .jsonly { display: none; }
.js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; } .js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
.scrollable { overflow-x: auto; }
.nowrap td, .nowrap th, td.nowrap, p.nowrap { white-space: pre; } .nowrap td, .nowrap th, td.nowrap, p.nowrap { white-space: pre; }
.wrap td { white-space: normal; } .wrap td { white-space: normal; }
.error { color: red; background: #fee; } .error { color: red; background: #fee; }
@@ -67,8 +66,8 @@ input.wayoff { left: -1000px; position: absolute; }
.loadmore { margin-left: 1ex; } .loadmore { margin-left: 1ex; }
/* .edit used in designs */ /* .edit used in designs */
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; } #menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
#menu p, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; } #menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#tables li{ list-style: none; } #logins li, #tables li { list-style: none; }
#dbs { overflow: hidden; } #dbs { overflow: hidden; }
#logins, #tables { white-space: nowrap; overflow: auto; } #logins, #tables { white-space: nowrap; overflow: auto; }
#logins a, #tables a, #tables span { background: #fff; } #logins a, #tables a, #tables span { background: #fff; }

View File

@@ -17,7 +17,8 @@ function bodyLoad(version, maria) {
for (var i = 1; i < obj.length; i++) { for (var i = 1; i < obj.length; i++) {
obj[i] = obj[i] obj[i] = obj[i]
.replace(/\.html/, '/') .replace(/\.html/, '/')
.replace(/(numeric)(-type-overview)/, (maria ? '$1-data$2' : '$&')) // MariaDB .replace(/(numeric)(-type-overview)/, '$1-data$2')
.replace(/#statvar_.*/, '#$$1')
; ;
} }
} }
@@ -81,6 +82,18 @@ function messagesPrint() {
/** Hide or show some login rows for selected driver
* @param HTMLSelectElement
*/
function loginDriver(driver) {
var trs = parentTag(driver, 'table').rows;
var disabled = /sqlite/.test(selectValue(driver));
alterClass(trs[1], 'hidden', disabled); // 1 - row with server
trs[1].getElementsByTagName('input')[0].disabled = disabled;
}
var dbCtrl; var dbCtrl;
var dbPrevious = {}; var dbPrevious = {};
@@ -447,14 +460,6 @@ function columnShow(checked, column) {
} }
} }
/** Hide column with default values in narrow window
*/
function editingHideDefaults() {
if (innerWidth < document.documentElement.scrollWidth) {
qs('#form')['defaults'].checked = false;
}
}
/** Display partition options /** Display partition options
* @this HTMLSelectElement * @this HTMLSelectElement
*/ */
@@ -476,14 +481,14 @@ function partitionNameChange() {
} }
/** Show or hide comment fields /** Show or hide comment fields
* @param HTMLInputElement
* @param [boolean] whether to focus Comment if checked * @param [boolean] whether to focus Comment if checked
* @this HTMLInputElement
*/ */
function editingCommentsClick(focus) { function editingCommentsClick(el, focus) {
var comment = this.form['Comment']; var comment = el.form['Comment'];
columnShow(this.checked, 6); columnShow(el.checked, 6);
alterClass(comment, 'hidden', !this.checked); alterClass(comment, 'hidden', !el.checked);
if (focus && this.checked) { if (focus && el.checked) {
comment.focus(); comment.focus();
} }
} }

View File

@@ -1,3 +1,11 @@
Adminer 4.7.1 (released 2019-01-24):
Display the tables scrollbar (bug #647)
Remember visible columns in Create Table form (bug #493)
Add autocomplete attributes to login form
PHP <5.4 compatibility even with ClickHouse enabled (regression from 4.7.0)
SQLite: Hide server field in login form
Editor: Allow disabling boolean fields in PostgreSQL (bug #640)
Adminer 4.7.0 (released 2018-11-24): Adminer 4.7.0 (released 2018-11-24):
Simplify storing executed SQL queries to bookmarks Simplify storing executed SQL queries to bookmarks
Warn when using password with leading or trailing spaces Warn when using password with leading or trailing spaces

View File

@@ -46,7 +46,7 @@ border:5px solid #ccc;margin:0}
#menu a:hover{background:#333;color:#fff;border-color:#333} #menu a:hover{background:#333;color:#fff;border-color:#333}
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0; #menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px} outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
#menu p,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0} #menu p,#logins,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;line-height:40px;padding:0;z-index:1;margin:0} #breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;line-height:40px;padding:0;z-index:1;margin:0}
#breadcrumb a{color:#ff9} #breadcrumb a{color:#ff9}
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9} #breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}

View File

@@ -339,7 +339,7 @@ border: 1px solid #E3E3E3;
#menu form { #menu form {
margin: 0; margin: 0;
} }
#menu p, #tables { #menu p, #logins, #tables {
padding-left: 8px; padding-left: 8px;
border-bottom: none; border-bottom: none;
} }

View File

@@ -173,7 +173,7 @@ h3{
margin:0;} margin:0;}
#menu form{ #menu form{
margin:0;} margin:0;}
#menu p,#tables{ #menu p,#logins,#tables{
padding-left:8px; padding-left:8px;
border-bottom:none;} border-bottom:none;}
#menu form p{ #menu form p{

View File

@@ -733,7 +733,7 @@ legend{
} }
/* tables */ /* tables */
#tables{ #logins, #tables{
border-bottom: none; border-bottom: none;
line-height: 20px; line-height: 20px;
padding: 18px 0; padding: 18px 0;
@@ -759,12 +759,20 @@ legend{
font-size: 14px; font-size: 14px;
} }
#logins a {
display: block;
padding: 5px 18px 9px;
color: inherit;
font-size: 14px;
}
#tables a.select.active, #tables a.select.active,
#tables a.select:hover #tables a.select:hover
{ {
color: #fba; color: #fba;
} }
#logins a:hover,
#tables a[title]:hover, #tables a[title]:hover,
#tables a.active, #tables a.active,
#tables a.select:hover + a, #tables a.select:hover + a,
@@ -979,4 +987,4 @@ code.jush-sql ~ a:first-of-type::before{
body > form{ body > form{
position: absolute; position: absolute;
} }

View File

@@ -3,15 +3,15 @@
* *
* Klemens Häckel [http://clickdimension.wordpress.com/] * Klemens Häckel [http://clickdimension.wordpress.com/]
* *
* update 2018-02
* adapted for adminer 4.6.1
*
* new remaster based on style for WT-NMP 13.12 * new remaster based on style for WT-NMP 13.12
* *
* Created by Miroslav Pokorný [http://fuch.cz]. * Created by Miroslav Pokorný [http://fuch.cz].
* Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified). * Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified).
* Slightly inspired by themes created by Martin Hořínek and Klemens Häckel. * Slightly inspired by themes created by Martin Hořínek and Klemens Häckel.
* *
* updated 2018-02 by Jan [http://cloux.org]
* - fixes and usability improvements for Adminer 4.6.1
*
*/ */
/*** Fonts ***/ /*** Fonts ***/
@@ -139,10 +139,15 @@ html>/**/body #menu li a[href*="&select="]:link:hover {
/* Menu - Show structure */ /* Menu - Show structure */
html>/**/body #menu li a[href*="&table="] { html>/**/body #menu li a[href*="&table="] {
width: 263px; width: 280px;
float: left; float: left;
} }
/* Hide "new version" link in the top bar */
/*
html>body #menu h1 a#version {
display: none;
}
*/
/*** Tables and views ***/ /*** Tables and views ***/
/* set default alignment to left */ /* set default alignment to left */
@@ -388,7 +393,7 @@ h2 {
display: none; display: none;
} }
#content { #content {
margin-left: 325px; margin-left: 355px;
} }
.tabs { .tabs {
margin: 12px auto 10px auto; margin: 12px auto 10px auto;
@@ -429,7 +434,7 @@ td, th {
border-width: 0 1px 1px 0; border-width: 0 1px 1px 0;
font-size: 0.83em; /* x-small; font size */ font-size: 0.83em; /* x-small; font size */
} }
#tables a { #logins a, #tables a {
height: 18px; height: 18px;
line-height: 18px; line-height: 18px;
} }
@@ -458,7 +463,7 @@ a:link:hover, a:visited:hover {
#menu { #menu {
background-color: #f8f8f8; background-color: #f8f8f8;
box-shadow: 0px 0px 3px rgba(0,0,0,0.50) !important; box-shadow: 0px 0px 3px rgba(0,0,0,0.50) !important;
width: 310px; width: 330px;
margin: 0; margin: 0;
top: 0; top: 0;
padding-bottom: 0; padding-bottom: 0;

View File

@@ -18,10 +18,10 @@ img { vertical-align: middle; margin: 0; padding: 0; }
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; } .message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; } #menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
#menu form { margin: 0; } #menu form { margin: 0; }
#menu p, #tables li { text-align: center; font-size: 11px; } #menu p, #logins li, #tables li { text-align: center; font-size: 11px; }
#menu p a, #tables li a { color: black; } #menu p a, #logins li a, #tables li a { color: black; }
#menu p a:hover, #tables li a:hover { color: #626262; text-decoration: none; } #menu p a:hover, #logins li a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
#tables a, #tables span { background: #FFE594; } #logins a, #tables a, #tables span { background: #FFE594; }
#content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; } #content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; }
#lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; } #lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; }
#lang a { color: black; font-weight: bold; } #lang a { color: black; font-weight: bold; }

View File

@@ -106,7 +106,7 @@ img {vertical-align: middle; margin: 0; padding: 0;}
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em } #breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;} #menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}
#menu form {margin: 0;} #menu form {margin: 0;}
#menu p, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;} #menu p, #logins, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
#menu form p {padding-left: 0; text-align: left;} #menu form p {padding-left: 0; text-align: left;}
h1 .h1:hover {text-decoration: underline;} h1 .h1:hover {text-decoration: underline;}
h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;} h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;}

View File

@@ -794,7 +794,7 @@ legend{
} }
/* tables */ /* tables */
#tables{ #logins, #tables{
border-bottom: none; border-bottom: none;
line-height: 20px; line-height: 20px;
padding: 18px 0; padding: 18px 0;
@@ -820,12 +820,21 @@ legend{
font-size: 14px; font-size: 14px;
} }
#logins a {
display: block;
padding: 5px 18px;
line-height: 14px;
color: #F1E5B3;
font-size: 14px;
}
#tables a.select.active, #tables a.select.active,
#tables a.select:hover #tables a.select:hover
{ {
color: red; color: red;
} }
#logins a:hover,
#tables a[title]:hover, #tables a[title]:hover,
#tables a.active, #tables a.active,
#tables a.select:hover + a, #tables a.select:hover + a,

View File

@@ -124,7 +124,6 @@ input,
optgroup, optgroup,
select, select,
textarea { textarea {
color: inherit;
font: inherit; font: inherit;
margin: 0; margin: 0;
} }
@@ -557,7 +556,7 @@ table tbody input ~ a[href*="&edit="][href*="&where"] {
top: 0; top: 0;
} }
#tables { #logins, #tables {
padding: 0 0 0 5px; padding: 0 0 0 5px;
margin: 0; margin: 0;
list-style: none; list-style: none;
@@ -588,7 +587,7 @@ table tbody input ~ a[href*="&edit="][href*="&where"] {
font-size: 11px; font-size: 11px;
} }
#menu a, #tables .select { #menu a, #logins a, #tables .select {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
margin-right: 5px margin-right: 5px

View File

@@ -282,7 +282,7 @@ table code {
margin-right: 4px; margin-right: 4px;
} }
#tables a { #logins a, #tables a {
padding: 1px 2px; padding: 1px 2px;
} }
@@ -290,7 +290,7 @@ table code {
color: #FFF; color: #FFF;
} }
#menu p, #tables { #menu p, #logins, #tables {
border: none; border: none;
margin: 0 0 4px; margin: 0 0 4px;
padding: 0 0 4px; padding: 0 0 4px;
@@ -383,7 +383,7 @@ a[href$="dump="] {
} }
select[name="db"] { select[name="db"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left center white; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll 90% center white;
padding-left: 16px; padding-left: 16px;
} }

View File

@@ -268,7 +268,7 @@ td.nowrap {
padding: 0 0 30px 0; padding: 0 0 30px 0;
background: #f1f1f1; background: #f1f1f1;
} }
#menu p, #tables { #menu p, #logins, #tables {
margin: 0; margin: 0;
padding: .8em 1em; padding: .8em 1em;
border-bottom: 1px solid #c7c7c7; border-bottom: 1px solid #c7c7c7;

View File

@@ -232,7 +232,7 @@ tr.odd td {
border-right:2px solid #34495e; border-right:2px solid #34495e;
} }
#menu p, #tables{ #menu p, #logins, #tables{
border-bottom:1px solid rgb(85, 112, 139); border-bottom:1px solid rgb(85, 112, 139);
} }

View File

@@ -177,11 +177,11 @@ h3 {
top: 38px; top: 38px;
width: 180px; width: 180px;
background-color: #DEF; } background-color: #DEF; }
#menu p, #tables { #menu p, #logins, #tables {
padding-left: 8px; padding-left: 8px;
font-size: 10pt; font-size: 10pt;
border-bottom: none; } border-bottom: none; }
#tables a, #tables span { #logins a, #tables a, #tables span {
background: #DEF; background: #DEF;
} }

View File

@@ -51,11 +51,17 @@
width: 270px; width: 270px;
} }
#tables li { #logins li, #tables li {
position: relative; position: relative;
height: 23px; height: 23px;
} }
#logins a {
display: block;
margin-top: 5px;
padding: 0 10px;
}
#tables a { #tables a {
display: block; display: block;
margin: 0; margin: 0;

View File

@@ -244,7 +244,7 @@ td, th {
border-color: #bbb; border-color: #bbb;
border-width: 0 1px 1px 0; border-width: 0 1px 1px 0;
} }
#tables a { #logins a, #tables a {
height: 18px; height: 18px;
line-height: 18px; line-height: 18px;
} }
@@ -270,7 +270,7 @@ a, a:visited {
padding-bottom: 0; padding-bottom: 0;
top: 0; top: 0;
} }
#tables a, #tables span { #logins a, #tables a, #tables span {
background: #fafafa; background: #fafafa;
} }
/*** Forms ***/ /*** Forms ***/

View File

@@ -72,8 +72,8 @@ class Adminer {
function loginForm() { function loginForm() {
echo "<table cellspacing='0' class='layout'>\n"; echo "<table cellspacing='0' class='layout'>\n";
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));")); echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username'));"));
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n"); echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
echo "</table>\n"; echo "</table>\n";
echo "<p><input type='submit' value='" . lang('Login') . "'>\n"; echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n"; echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
@@ -485,7 +485,7 @@ qsl('div').onclick = whisperClick;", "")
); );
} }
if (like_bool($field)) { if (like_bool($field)) {
return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>"; return '<input type="checkbox" value="1"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
} }
$hint = ""; $hint = "";
if (preg_match('~time~', $field["type"])) { if (preg_match('~time~', $field["type"])) {
@@ -517,7 +517,7 @@ qsl('div').onclick = whisperClick;", "")
} }
$return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return)); $return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return));
if ($value == "" && like_bool($field)) { if ($value == "" && like_bool($field)) {
$return = "0"; $return = "'0'";
} elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) { } elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) {
$return = "NULL"; $return = "NULL";
} elseif (preg_match('~^(md5|sha1)$~', $function)) { } elseif (preg_match('~^(md5|sha1)$~', $function)) {
@@ -586,11 +586,11 @@ qsl('div').onclick = whisperClick;", "")
foreach ($servers[""] as $username => $password) { foreach ($servers[""] as $username => $password) {
if ($password !== null) { if ($password !== null) {
if ($first) { if ($first) {
echo "<p id='logins'>"; echo "<ul id='logins'>";
echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});"); echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
$first = false; $first = false;
} }
echo "<a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n"; echo "<li><a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a>\n";
} }
} }
} }

View File

@@ -40,14 +40,16 @@ tinyMCE.init({
function selectVal(&$val, $link, $field, $original) { function selectVal(&$val, $link, $field, $original) {
if (preg_match("~_html~", $field["field"]) && $val != '') { if (preg_match("~_html~", $field["field"]) && $val != '') {
$shortened = (substr($val, -10) == "<i>...</i>"); $ellipsis = "<i></i>";
$length = strlen($ellipsis);
$shortened = (substr($val, -$length) == $ellipsis);
if ($shortened) { if ($shortened) {
$val = substr($val, 0, -10); $val = substr($val, 0, -$length);
} }
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php //! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened) $val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
if ($shortened) { if ($shortened) {
$val .= "<i>...</i>"; $val .= $ellipsis;
} }
if (class_exists('DOMDocument')) { // close all opened tags if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument; $dom = new DOMDocument;

View File

@@ -29,14 +29,16 @@ class AdminerWymeditor {
function selectVal(&$val, $link, $field, $original) { function selectVal(&$val, $link, $field, $original) {
// copied from tinymce.php // copied from tinymce.php
if (preg_match("~_html~", $field["field"]) && $val != '') { if (preg_match("~_html~", $field["field"]) && $val != '') {
$shortened = (substr($val, -10) == "<i>...</i>"); $ellipsis = "<i></i>";
$length = strlen($ellipsis);
$shortened = (substr($val, -$length) == $ellipsis);
if ($shortened) { if ($shortened) {
$val = substr($val, 0, -10); $val = substr($val, 0, -$length);
} }
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php //! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened) $val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
if ($shortened) { if ($shortened) {
$val .= "<i>...</i>"; $val .= $ellipsis;
} }
if (class_exists('DOMDocument')) { // close all opened tags if (class_exists('DOMDocument')) { // close all opened tags
$dom = new DOMDocument; $dom = new DOMDocument;