Compare commits

..

18 Commits

Author SHA1 Message Date
Jakub Vrana
5754b32693 PostgreSQL: Export serial as serial, not nextval() 2026-03-18 15:14:39 +01:00
Jakub Vrana
11234ef939 PostgreSQL: Export schema in REFERENCES 2026-03-18 15:14:39 +01:00
Jakub Vrana
e5e9b3a04d PostgreSQL: Export schema in nextval() 2026-03-18 15:14:39 +01:00
Jakub Vrana
45c7082373 Editor: Display tinyint(1) as checkbox (fix #1246, regression from 5.4.2) 2026-03-18 15:14:36 +01:00
Jakub Vrana
8fa7dedc4b IGDB: Data dumps 2026-03-18 15:13:24 +01:00
Jakub Vrana
f1c8f8532e Tables overview: keep sort 2026-03-18 15:13:24 +01:00
Jakub Vrana
00323425cb PostgreSQL: Run VACUUM ANALYZE for Optimize 2026-03-18 15:13:24 +01:00
Nikola
3d882578df Add Croatian (hr) translation
Add complete Croatian translation for Adminer, including all strings
in adminer/lang/hr.inc.php, plural forms support in lang.inc.php,
and Croatian descriptions and translations for all plugins.
2026-03-18 15:13:23 +01:00
Jakub Vrana
318e304c7e Tables overview: allow sorting (fix #1231) 2026-02-12 10:11:22 +01:00
Jakub Vrana
50852b9036 Select: Display NULL in column title 2026-02-12 10:11:22 +01:00
Jakub Vrana
c30f6227a2 Schema: Avoid PHP warning when referencing another schema 2026-02-12 10:11:22 +01:00
Jakub Vrana
a417a21ba6 Foreign key: Display new field in case of an error 2026-02-12 10:11:22 +01:00
Jakub Vrana
fb1b76e411 PostgreSQL: Display all SQL command warnings and only once 2026-02-12 10:11:22 +01:00
Jakub Vrana
38a937d966 Disable Ctrl+click inline edit without UPDATE privilege 2026-02-10 19:51:38 +01:00
Jakub Vrana
f0142f0b8e Export: Remember unchecked objects (regression from 5.0.6) 2026-02-10 18:52:16 +01:00
Jakub Vrana
cf1454f7a9 PostgreSQL: Order NULL last 2026-02-10 09:11:35 +01:00
Jakub Vrana
c0350d8893 IGDB: Engine 2026-02-10 07:34:20 +01:00
Jakub Vrana
1ac40e0c2b Develop 2026-02-08 16:44:14 +01:00
64 changed files with 580 additions and 56 deletions

View File

@@ -1,3 +1,17 @@
## Adminer dev
- Tables overview: allow sorting (bug #1231)
- Select: Disable Ctrl+click inline edit without UPDATE privilege
- Select: Display NULL in column title
- Export: Remember unchecked objects (regression from 5.0.6)
- Foreign key: Display new field in case of an error
- PostgreSQL: Order NULL last
- PostgreSQL: Display all SQL command warnings and only once
- PostgreSQL: Export serial as serial, not nextval()
- PostgreSQL: Export schema in nextval()
- PostgreSQL: Export schema in REFERENCES
- Editor: Display tinyint(1) as checkbox (bug #1246, regression from 5.4.2)
- Croatian translation
## Adminer 5.4.2 (released 2026-02-08) ## Adminer 5.4.2 (released 2026-02-08)
- Avoid denial-of-service via version check (GHSA-q4f2-39gr-45jh, regression from 4.6.2) - Avoid denial-of-service via version check (GHSA-q4f2-39gr-45jh, regression from 4.6.2)
- Pretty print JSON in edit - Pretty print JSON in edit

View File

@@ -38,7 +38,7 @@ if ($tables_views && !$error && !$_POST["search"]) {
} elseif (JUSH != "sql") { } elseif (JUSH != "sql") {
$result = (JUSH == "sqlite" $result = (JUSH == "sqlite"
? queries("VACUUM") ? queries("VACUUM")
: apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"]) : apply_queries("VACUUM" . ($_POST["optimize"] ? " ANALYZE" : ""), $_POST["tables"])
); );
$message = lang('Tables have been optimized.'); $message = lang('Tables have been optimized.');
} elseif (!$_POST["tables"]) { } elseif (!$_POST["tables"]) {
@@ -49,15 +49,16 @@ if ($tables_views && !$error && !$_POST["search"]) {
} }
} }
queries_redirect(substr(ME, 0, -1), $message, $result); queries_redirect($_SERVER["REQUEST_URI"], $message, $result);
} }
page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true); page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
if (adminer()->homepage()) { if (adminer()->homepage()) {
if ($_GET["ns"] !== "") { if ($_GET["ns"] !== "") {
$order = $_GET["order"];
echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n"; echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
$tables_list = tables_list(); $tables_list = ($order ? table_status() : tables_list());
if (!$tables_list) { if (!$tables_list) {
echo "<p class='message'>" . lang('No tables.') . "\n"; echo "<p class='message'>" . lang('No tables.') . "\n";
} else { } else {
@@ -79,7 +80,7 @@ if (adminer()->homepage()) {
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});"); echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo '<thead><tr class="wrap">'; echo '<thead><tr class="wrap">';
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);", ""); echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);", "");
echo '<th>' . lang('Table'); echo '<th><a href="' . h(substr(ME, 0, -1)) . '">' . lang('Table') . '</a>';
$columns = array("Engine" => array(lang('Engine') . doc_link(array('sql' => 'storage-engines.html')))); $columns = array("Engine" => array(lang('Engine') . doc_link(array('sql' => 'storage-engines.html'))));
if (collations()) { if (collations()) {
$columns["Collation"] = array(lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/'))); $columns["Collation"] = array(lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/')));
@@ -98,27 +99,40 @@ if (adminer()->homepage()) {
if (support("comment")) { if (support("comment")) {
$columns["Comment"] = array(lang('Comment') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-info.html#FUNCTIONS-INFO-COMMENT-TABLE'))); $columns["Comment"] = array(lang('Comment') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-info.html#FUNCTIONS-INFO-COMMENT-TABLE')));
} }
foreach ($columns as $column) { foreach ($columns as $key => $column) {
echo "<td>$column[0]"; echo "<th><a href='" . h(ME) . "order=$key'>$column[0]</a>";
} }
echo "</thead>\n"; echo "</thead>\n";
if ($order) {
uasort($tables_list, function ($a, $b) use ($order) {
$return = ($a[$order] < $b[$order] ? -1 : ($a[$order] > $b[$order] ? 1 : 0)); // <=> available since PHP 7.1
return (in_array($order, array('Engine', 'Collation', 'Comment')) ? $return : -$return);
});
}
$tables = 0; $tables = 0;
foreach ($tables_list as $name => $type) { foreach ($tables_list as $name => $status) {
$view = ($type !== null && !preg_match('~table|sequence~i', $type)); $view = ($order ? is_view($status) : $status !== null && !preg_match('~table|sequence~i', $status));
$status = ($order ? $status : array('Engine' => $status));
$id = h("Table-" . $name); $id = h("Table-" . $name);
echo '<tr><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array("$name", $tables_views, true), "", "", "", $id); // "$name" to check numeric table names echo '<tr><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array("$name", $tables_views, true), "", "", "", $id); // "$name" to check numeric table names
echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name)); echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name));
if ($view && !preg_match('~materialized~i', $type)) { if ($view && !preg_match('~materialized~i', $status['Engine'])) {
$title = lang('View'); $title = lang('View');
echo '<td colspan="6">' . (support("view") ? "<a href='" . h(ME) . "view=" . urlencode($name) . "' title='" . lang('Alter view') . "'>$title</a>" : $title); echo '<td colspan="' . (count($columns) - 2) . '">' . (support("view") ? "<a href='" . h(ME) . "view=" . urlencode($name) . "' title='" . lang('Alter view') . "'>$title</a>" : $title);
echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>'; echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
echo '<td>' . h($status['Comment']);
} else { } else {
foreach ($columns as $key => $column) { foreach ($columns as $key => $column) {
$id = " id='$key-" . h($name) . "'"; $id = " id='$key-" . h($name) . "'";
$val = idx($status, $key, '?');
echo ($column[1] echo ($column[1]
? "<td align='right'><a href='" . h(ME . "$column[1]=") . urlencode($name) . "'$id title='$column[2]'>?</a>" ? "<td align='right'><a href='" . h(ME . "$column[1]=") . urlencode($name) . "'$id title='$column[2]'>" . (is_numeric($val)
: "<td id='$key-" . h($name) . "'>" ? ($val < 0 ? '?' : ($key == "Rows" && $val && $status["Engine"] == (JUSH == "pgsql" ? "table" : "InnoDB") ? '~ ' : '') . format_number($val))
: $val
) . "</a>"
: "<td id='$key-" . h($name) . "'>" . h($val)
); );
} }
$tables++; $tables++;
@@ -128,18 +142,18 @@ if (adminer()->homepage()) {
echo "<tr><td><th>" . lang('%d in total', count($tables_list)); echo "<tr><td><th>" . lang('%d in total', count($tables_list));
echo "<td>" . h(JUSH == "sql" ? get_val("SELECT @@default_storage_engine") : ""); echo "<td>" . h(JUSH == "sql" ? get_val("SELECT @@default_storage_engine") : "");
echo "<td>" . h(db_collation(DB, collations())); echo (collations() ? "<td>" . h(db_collation(DB, collations())) : '');
foreach (array("Data_length", "Index_length", "Data_free") as $key) { foreach (array("Data_length", "Index_length", "Data_free") as $key) {
echo ($columns[$key] ? "<td align='right' id='sum-$key'>" : ""); echo ($columns[$key] ? "<td align='right' id='sum-$key'>" : "");
} }
echo "\n"; echo "\n";
echo "</table>\n"; echo "</table>\n";
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');"); echo ($order ? '' : script("ajaxSetHtml('" . js_escape(ME) . "script=db');"));
echo "</div>\n"; echo "</div>\n";
if (!information_schema(DB)) { if (!information_schema(DB)) {
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'"); $vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . on_help(JUSH == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'"); $optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . on_help(JUSH == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM ANALYZE'");
$print = (JUSH == "sqlite" ? $vacuum . "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'PRAGMA integrity_check'") $print = (JUSH == "sqlite" ? $vacuum . "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'PRAGMA integrity_check'")
: (JUSH == "pgsql" ? $vacuum . $optimize : (JUSH == "pgsql" ? $vacuum . $optimize
: (JUSH == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'") : (JUSH == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'")

View File

@@ -88,7 +88,13 @@ if (isset($_GET["pgsql"])) {
} }
function warnings() { function warnings() {
return h(pg_last_notice($this->link)); // second parameter is available since PHP 7.1.0 if (PHP_VERSION_ID >= 70100) {
$return = implode("\n", pg_last_notice($this->link, 2)); // 2 - PGSQL_NOTICE_ALL
pg_last_notice($this->link, 3); // 3 - PGSQL_NOTICE_CLEAR
} else {
$return = pg_last_notice($this->link);
}
return nl_br(h($return));
} }
/** Copy from array into a table /** Copy from array into a table
@@ -909,11 +915,12 @@ AND typelem = 0"
$return = ""; $return = "";
$status = table_status1($table); $status = table_status1($table);
$ns = idf_escape($status['nspname']);
$fkeys = foreign_keys($table); $fkeys = foreign_keys($table);
ksort($fkeys); ksort($fkeys);
foreach ($fkeys as $fkey_name => $fkey) { foreach ($fkeys as $fkey_name => $fkey) {
$return .= "ALTER TABLE ONLY " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " ADD CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition];\n"; $return .= "ALTER TABLE ONLY $ns." . idf_escape($status['Name']) . " ADD CONSTRAINT " . idf_escape($fkey_name) . " " . preg_replace('~( REFERENCES )([^(.]+\()~', "\\1$ns.\\2", $fkey["definition"]) . ";\n";
} }
return ($return ? "$return\n" : $return); return ($return ? "$return\n" : $return);
@@ -939,8 +946,13 @@ AND typelem = 0"
// fields' definitions // fields' definitions
foreach ($fields as $field) { foreach ($fields as $field) {
if ($field['default'] == "nextval('$status[Name]_$field[field]_seq')") {
$field['default'] = null;
$field['full_type'] = preg_replace('~int(eger)?~', 'serial', $field['full_type']);
}
$part = idf_escape($field['field']) . ' ' . $field['full_type'] $part = idf_escape($field['field']) . ' ' . $field['full_type']
. default_value($field) . preg_replace('~(nextval\(\')([^.\']+\')~', '\1' . str_replace("'", "''", $status['nspname']) . '.\2', default_value($field))
. ($field['null'] ? "" : " NOT NULL"); . ($field['null'] ? "" : " NOT NULL");
$return_parts[] = $part; $return_parts[] = $part;

View File

@@ -4,8 +4,14 @@ namespace Adminer;
$TABLE = $_GET["dump"]; $TABLE = $_GET["dump"];
if ($_POST && !$error) { if ($_POST && !$error) {
$default = array("auto_increment" => '');
foreach (array("type", "routine", "event", "trigger") as $support) {
if (support($support)) {
$default[$support . "s"] = '';
}
}
save_settings( save_settings(
array_intersect_key($_POST, array_flip(array("output", "format", "db_style", "types", "routines", "events", "table_style", "auto_increment", "triggers", "data_style"))), array_intersect_key($_POST + $default, array_flip(array("output", "format", "db_style", "table_style", "data_style")) + $default),
"adminer_export" "adminer_export"
); );
$tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]); $tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]);
@@ -153,10 +159,6 @@ $row = get_settings("adminer_export");
if (!$row) { if (!$row) {
$row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT"); $row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
} }
if (!isset($row["events"])) { // backwards compatibility
$row["routines"] = $row["events"] = ($_GET["dump"] == "");
$row["triggers"] = $row["table_style"];
}
echo "<tr><th>" . lang('Output') . "<td>" . html_radios("output", adminer()->dumpOutput(), $row["output"]) . "\n"; echo "<tr><th>" . lang('Output') . "<td>" . html_radios("output", adminer()->dumpOutput(), $row["output"]) . "\n";

View File

@@ -39,10 +39,10 @@ page_header(lang('Foreign key'), $error, array("table" => $TABLE), h($TABLE));
if ($_POST) { if ($_POST) {
ksort($row["source"]); ksort($row["source"]);
if ($_POST["add"]) { if ($_POST["change"] || $_POST["change-js"]) {
$row["source"][] = "";
} elseif ($_POST["change"] || $_POST["change-js"]) {
$row["target"] = array(); $row["target"] = array();
} else {
$row["source"][] = "";
} }
} elseif ($name != "") { } elseif ($name != "") {
$foreign_keys = foreign_keys($TABLE); $foreign_keys = foreign_keys($TABLE);

View File

@@ -182,7 +182,7 @@ class Adminer {
* @return string HTML code, "" to ignore field * @return string HTML code, "" to ignore field
*/ */
function fieldName(array $field, int $order = 0): string { function fieldName(array $field, int $order = 0): string {
$type = $field["full_type"]; $type = $field["full_type"] . ($field["null"] ? " NULL" : "");
$comment = $field["comment"]; $comment = $field["comment"];
return '<span title="' . h($type . ($comment != "" ? ($type ? ": " : "") . $comment : '')) . '">' . h($field["field"]) . '</span>'; return '<span title="' . h($type . ($comment != "" ? ($type ? ": " : "") . $comment : '')) . '">' . h($field["field"]) . '</span>';
} }
@@ -614,7 +614,7 @@ class Adminer {
foreach ((array) $_GET["order"] as $key => $val) { foreach ((array) $_GET["order"] as $key => $val) {
if ($val != "") { if ($val != "") {
$return[] = (preg_match('~^((COUNT\(DISTINCT |[A-Z0-9_]+\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\)|COUNT\(\*\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses [] $return[] = (preg_match('~^((COUNT\(DISTINCT |[A-Z0-9_]+\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\)|COUNT\(\*\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses []
. (isset($_GET["desc"][$key]) ? " DESC" : "") . (isset($_GET["desc"][$key]) ? " DESC" . (JUSH == 'pgsql' && idx($fields[$val], "null") ? " NULLS LAST" : "") : "")
; ;
} }
} }

View File

@@ -26,7 +26,7 @@ function lang_format($translation, $number = null): string {
: (LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other : (LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
: (LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other : (LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
: (LANG == 'lv' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number ? 1 : 2)) // different forms for 1 except 11, other, 0 : (LANG == 'lv' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number ? 1 : 2)) // different forms for 1 except 11, other, 0
: (in_array(LANG, array('bs', 'ru', 'sr', 'uk')) ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other : (in_array(LANG, array('bs', 'hr', 'ru', 'sr', 'uk')) ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other
: 1)))))))) // different forms for 1, other : 1)))))))) // different forms for 1, other
; // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html ; // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos]; $translation = $translation[$pos];
@@ -67,6 +67,7 @@ function langs(): array {
'gl' => 'Galego', // Eduardo Penabad Ramos 'gl' => 'Galego', // Eduardo Penabad Ramos
'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/ 'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/
'hi' => 'हिन्दी', // Joshi yogesh 'hi' => 'हिन्दी', // Joshi yogesh
'hr' => 'Hrvatski', // Nikola Paradžik
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu 'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org 'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti 'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti

View File

@@ -1,4 +1,4 @@
<?php <?php
namespace Adminer; namespace Adminer;
const VERSION = "5.4.2"; const VERSION = "5.4.3-dev";

364
adminer/lang/hr.inc.php Normal file
View File

@@ -0,0 +1,364 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sustav',
'Server' => 'Poslužitelj',
'Username' => 'Korisničko ime',
'Password' => 'Lozinka',
'Permanent login' => 'Trajna prijava',
'Login' => 'Prijava',
'Logout' => 'Odjava',
'Logged as: %s' => 'Prijavljen kao: %s',
'Logout successful.' => 'Uspješna odjava.',
'Invalid credentials.' => 'Neispravni podaci za prijavu.',
'Language' => 'Jezik',
'Invalid CSRF token. Send the form again.' => 'Nevažeći CSRF token. Pošaljite obrazac ponovo.',
'No extension' => 'Nema proširenja',
'None of the supported PHP extensions (%s) are available.' => 'Nijedno od podržanih PHP proširenja (%s) nije dostupno.',
'Session support must be enabled.' => 'Podrška za sesije mora biti uključena.',
'Session expired, please login again.' => 'Sesija je istekla, molimo prijavite se ponovo.',
'%s version: %s through PHP extension %s' => '%s verzija: %s putem PHP proširenja %s',
'Refresh' => 'Osvježi',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Ovlasti',
'Create user' => 'Novi korisnik',
'User has been dropped.' => 'Korisnik je izbrisan.',
'User has been altered.' => 'Korisnik je izmijenjen.',
'User has been created.' => 'Korisnik je kreiran.',
'Hashed' => 'Hashirano',
'Column' => 'Stupac',
'Routine' => 'Rutina',
'Grant' => 'Dodijeli',
'Revoke' => 'Opozovi',
'Process list' => 'Popis procesa',
'%d process(es) have been killed.' => array('%d proces je zaustavljen.', '%d procesa su zaustavljena.', '%d procesa je zaustavljeno.'),
'Kill' => 'Zaustavi',
'Variables' => 'Varijable',
'Status' => 'Status',
'SQL command' => 'SQL naredba',
'%d query(s) executed OK.' => array('%d upit je uspješno izvršen.', '%d upita su uspješno izvršena.', '%d upita je uspješno izvršeno.'),
'Query executed OK, %d row(s) affected.' => array('Upit je uspješno izvršen, %d redak je ažuriran.', 'Upit je uspješno izvršen, %d retka su ažurirana.', 'Upit je uspješno izvršen, %d redaka je ažurirano.'),
'No commands to execute.' => 'Nema naredbi za izvršavanje.',
'Error in query' => 'Greška u upitu',
'Execute' => 'Izvrši',
'Stop on error' => 'Zaustavi pri grešci',
'Show only errors' => 'Prikaži samo greške',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Povijest',
'Clear' => 'Očisti',
'Edit all' => 'Uredi sve',
'File upload' => 'Prijenos datoteke',
'From server' => 'S poslužitelja',
'Webserver file %s' => 'Datoteka %s s web poslužitelja',
'Run file' => 'Pokreni datoteku',
'File does not exist.' => 'Datoteka ne postoji.',
'File uploads are disabled.' => 'Prijenos datoteka je onemogućen.',
'Unable to upload a file.' => 'Prijenos datoteke nije uspio.',
'Maximum allowed file size is %sB.' => 'Maksimalna dozvoljena veličina datoteke je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliki POST podaci. Smanjite podatke ili povećajte vrijednost konfiguracijske direktive %s.',
'Export' => 'Izvoz',
'Output' => 'Ispis',
'open' => 'otvori',
'save' => 'spremi',
'Format' => 'Format',
'Data' => 'Podaci',
'Database' => 'Baza podataka',
'Use' => 'Koristi',
'Select database' => 'Odaberite bazu',
'Invalid database.' => 'Neispravna baza podataka.',
'Database has been dropped.' => 'Baza podataka je izbrisana.',
'Databases have been dropped.' => 'Baze podataka su izbrisane.',
'Database has been created.' => 'Baza podataka je kreirana.',
'Database has been renamed.' => 'Baza podataka je preimenovana.',
'Database has been altered.' => 'Baza podataka je izmijenjena.',
'Alter database' => 'Izmijeni bazu podataka',
'Create database' => 'Kreiraj bazu podataka',
'Database schema' => 'Shema baze podataka',
// link to current database schema layout
'Permanent link' => 'Trajna veza',
// thousands separator - must contain single byte
',' => '.',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Uspoređivanje',
'Data Length' => 'Duljina podataka',
'Index Length' => 'Duljina indeksa',
'Data Free' => 'Slobodan prostor',
'Rows' => 'Redaka',
'%d in total' => 'ukupno %d',
'Analyze' => 'Analiziraj',
'Optimize' => 'Optimiziraj',
'Check' => 'Provjeri',
'Repair' => 'Popravi',
'Truncate' => 'Isprazni',
'Tables have been truncated.' => 'Tablice su ispražnjene.',
'Move to other database' => 'Premjesti u drugu bazu podataka',
'Move' => 'Premjesti',
'Tables have been moved.' => 'Tablice su premještene.',
'Copy' => 'Kopiraj',
'Tables have been copied.' => 'Tablice su kopirane.',
'Routines' => 'Rutine',
'Routine has been called, %d row(s) affected.' => array('Rutina je pozvana, %d redak je ažuriran.', 'Rutina je pozvana, %d retka su ažurirana.', 'Rutina je pozvana, %d redaka je ažurirano.'),
'Call' => 'Pozovi',
'Parameter name' => 'Naziv parametra',
'Create procedure' => 'Kreiraj proceduru',
'Create function' => 'Kreiraj funkciju',
'Routine has been dropped.' => 'Rutina je izbrisana.',
'Routine has been altered.' => 'Rutina je izmijenjena.',
'Routine has been created.' => 'Rutina je kreirana.',
'Alter function' => 'Izmijeni funkciju',
'Alter procedure' => 'Izmijeni proceduru',
'Return type' => 'Tip povratne vrijednosti',
'Events' => 'Događaji',
'Event has been dropped.' => 'Događaj je izbrisan.',
'Event has been altered.' => 'Događaj je izmijenjen.',
'Event has been created.' => 'Događaj je kreiran.',
'Alter event' => 'Izmijeni događaj',
'Create event' => 'Kreiraj događaj',
'At given time' => 'U zadano vrijeme',
'Every' => 'Svako',
'Schedule' => 'Raspored',
'Start' => 'Početak',
'End' => 'Kraj',
'On completion preserve' => 'Zadrži po završetku',
'Tables' => 'Tablice',
'Tables and views' => 'Tablice i pogledi',
'Table' => 'Tablica',
'No tables.' => 'Nema tablica.',
'Alter table' => 'Izmijeni tablicu',
'Create table' => 'Kreiraj tablicu',
'Table has been dropped.' => 'Tablica je izbrisana.',
'Tables have been dropped.' => 'Tablice su izbrisane.',
'Tables have been optimized.' => 'Tablice su optimizirane.',
'Table has been altered.' => 'Tablica je izmijenjena.',
'Table has been created.' => 'Tablica je kreirana.',
'Table name' => 'Naziv tablice',
'Show structure' => 'Prikaži strukturu',
'engine' => 'motor',
'collation' => 'uspoređivanje',
'Column name' => 'Naziv stupca',
'Type' => 'Tip',
'Length' => 'Duljina',
'Auto Increment' => 'Auto-inkrement',
'Options' => 'Opcije',
'Comment' => 'Komentar',
'Default values' => 'Zadane vrijednosti',
'Drop' => 'Izbriši',
'Are you sure?' => 'Jeste li sigurni?',
'Move up' => 'Pomakni gore',
'Move down' => 'Pomakni dolje',
'Remove' => 'Ukloni',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Premašen je maksimalni broj dozvoljenih polja. Molimo povećajte %s.',
'Partition by' => 'Particioniraj po',
'Partitions' => 'Particije',
'Partition name' => 'Naziv particije',
'Values' => 'Vrijednosti',
'View' => 'Pogled',
'View has been dropped.' => 'Pogled je izbrisan.',
'View has been altered.' => 'Pogled je izmijenjen.',
'View has been created.' => 'Pogled je kreiran.',
'Alter view' => 'Izmijeni pogled',
'Create view' => 'Kreiraj pogled',
'Indexes' => 'Indeksi',
'Indexes have been altered.' => 'Indeksi su izmijenjeni.',
'Alter indexes' => 'Izmijeni indekse',
'Add next' => 'Dodaj sljedeći',
'Index Type' => 'Tip indeksa',
'length' => 'duljina',
'Foreign keys' => 'Strani ključevi',
'Foreign key' => 'Strani ključ',
'Foreign key has been dropped.' => 'Strani ključ je izbrisan.',
'Foreign key has been altered.' => 'Strani ključ je izmijenjen.',
'Foreign key has been created.' => 'Strani ključ je kreiran.',
'Target table' => 'Ciljna tablica',
'Change' => 'Izmijeni',
'Source' => 'Izvor',
'Target' => 'Cilj',
'Add column' => 'Dodaj stupac',
'Alter' => 'Izmijeni',
'Add foreign key' => 'Dodaj strani ključ',
'ON DELETE' => 'ON DELETE (pri brisanju)',
'ON UPDATE' => 'ON UPDATE (pri ažuriranju)',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorni i ciljni stupci moraju biti istog tipa podataka, ciljni stupci moraju biti indeksirani i referencirani podaci moraju postojati.',
'Triggers' => 'Okidači',
'Add trigger' => 'Dodaj okidač',
'Trigger has been dropped.' => 'Okidač je izbrisan.',
'Trigger has been altered.' => 'Okidač je izmijenjen.',
'Trigger has been created.' => 'Okidač je kreiran.',
'Alter trigger' => 'Izmijeni okidač',
'Create trigger' => 'Kreiraj okidač',
'Time' => 'Vrijeme',
'Event' => 'Događaj',
'Name' => 'Naziv',
'select' => 'odaberi',
'Select' => 'Odaberi',
'Selected' => 'Odabrano',
'Select data' => 'Odaberi podatke',
'Functions' => 'Funkcije',
'Aggregation' => 'Agregacija',
'Search' => 'Pretraži',
'anywhere' => 'bilo gdje',
'Search data in tables' => 'Pretraži podatke u tablicama',
'Sort' => 'Sortiraj',
'descending' => 'silazno',
'Limit' => 'Ograničenje',
'Text length' => 'Duljina teksta',
'Action' => 'Radnja',
'Full table scan' => 'Puno pretraživanje tablice',
'Unable to select the table' => 'Nije moguće odabrati tablicu',
'No rows.' => 'Nema redaka.',
'%d row(s)' => array('%d redak', '%d retka', '%d redaka'),
'Page' => 'Stranica',
'last' => 'posljednja',
'Loading' => 'Učitavanje',
'Load more data' => 'Učitaj više podataka',
'Whole result' => 'Cijeli skup rezultata',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajtova'),
'Import' => 'Uvoz',
'%d row(s) have been imported.' => array('%d redak je uvezen.', '%d retka su uvezena.', '%d redaka je uvezeno.'),
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrijednost za izmjenu.',
'Use edit link to modify this value.' => 'Koristite vezu za uređivanje ove vrijednosti.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Stavka %s je unesena.',
'Item has been deleted.' => 'Stavka je izbrisana.',
'Item has been updated.' => 'Stavka je ažurirana.',
'%d item(s) have been affected.' => array('%d stavka je zahvaćena.', '%d stavke su zahvaćene.', '%d stavki je zahvaćeno.'),
'New item' => 'Nova stavka',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'prazno',
'edit' => 'uredi',
'Edit' => 'Uredi',
'Insert' => 'Unesi',
'Save' => 'Spremi',
'Save and continue edit' => 'Spremi i nastavi uređivanje',
'Save and insert next' => 'Spremi i unesi sljedeće',
'Clone' => 'Kloniraj',
'Delete' => 'Izbriši',
'Modify' => 'Izmijeni',
// data type descriptions
'Numbers' => 'Brojevi',
'Date and time' => 'Datum i vrijeme',
'Strings' => 'Tekst',
'Binary' => 'Binarno',
'Lists' => 'Liste',
'Network' => 'Mreža',
'Geometry' => 'Geometrija',
'Relations' => 'Odnosi',
'Editor' => 'Uređivač',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5.$3.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'dd.mm.[yyyy]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'sada',
'yes' => 'da',
'no' => 'ne',
// general SQLite error in create, drop or rename database
'File exists.' => 'Datoteka već postoji.',
'Please use one of the extensions %s.' => 'Molimo koristite jedan od nastavaka %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Izmijeni shemu',
'Create schema' => 'Kreiraj shemu',
'Schema has been dropped.' => 'Shema je izbrisana.',
'Schema has been created.' => 'Shema je kreirana.',
'Schema has been altered.' => 'Shema je izmijenjena.',
'Schema' => 'Shema',
'Invalid schema.' => 'Neispravna shema.',
// PostgreSQL sequences support
'Sequences' => 'Nizovi',
'Create sequence' => 'Kreiraj niz',
'Sequence has been dropped.' => 'Niz je izbrisan.',
'Sequence has been created.' => 'Niz je kreiran.',
'Sequence has been altered.' => 'Niz je izmijenjen.',
'Alter sequence' => 'Izmijeni niz',
// PostgreSQL user types support
'User types' => 'Korisnički tipovi',
'Create type' => 'Kreiraj tip',
'Type has been dropped.' => 'Tip je izbrisan.',
'Type has been created.' => 'Tip je kreiran.',
'Alter type' => 'Izmijeni tip',
// MS SQL login
'Too many unsuccessful logins, try again in %d minute(s).' => array('Previše neuspješnih pokušaja prijave, pokušajte ponovo za %d minutu.', 'Previše neuspješnih pokušaja prijave, pokušajte ponovo za %d minute.', 'Previše neuspješnih pokušaja prijave, pokušajte ponovo za %d minuta.'),
'Check has been dropped.' => 'Provjera je izbrisana.',
'Check has been altered.' => 'Provjera je izmijenjena.',
'Check has been created.' => 'Provjera je kreirana.',
'Alter check' => 'Izmijeni provjeru',
'Create check' => 'Kreiraj provjeru',
'Drop %s?' => 'Izbrisati %s?',
'Vacuum' => 'Vakuumiranje',
'overwrite' => 'prepiši',
'Disable %s or enable %s or %s extensions.' => 'Onemogućite %s ili omogućite %s ili %s proširenja.',
'Database does not support password.' => 'Baza podataka ne podržava lozinku.',
'DB' => 'BP',
'hostname[:port] or :socket' => 'hostname[:port] ili :socket',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer ne podržava pristup bazi podataka bez lozinke, <a href="https://www.adminer.org/en/password/"%s>više informacija</a>.',
'Warnings' => 'Upozorenja',
'Default value' => 'Zadana vrijednost',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Hvala što koristite Adminer, razmislite o <a href="https://www.adminer.org/en/donation/">donaciji</a>.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Glavna lozinka je istekla. <a href="https://www.adminer.org/en/extension/"%s>Implementirajte</a> metodu %s kako biste je učinili trajnom.',
'The action will be performed after successful login with the same credentials.' => 'Radnja će biti izvršena nakon uspješne prijave s istim podacima.',
'Connecting to privileged ports is not allowed.' => 'Spajanje na privilegirane portove nije dopušteno.',
'There is a space in the input password which might be the cause.' => 'U unesenoj lozinci postoji razmak koji bi mogao biti uzrok problema.',
'If you did not send this request from Adminer then close this page.' => 'Ako ovaj zahtjev niste poslali iz Adminera, zatvorite ovu stranicu.',
'You can upload a big SQL file via FTP and import it from server.' => 'Veliku SQL datoteku možete prenijeti putem FTP-a i uvesti je s poslužitelja.',
'Size' => 'Veličina',
'Compute' => 'Izračunaj',
'Loaded plugins' => 'Učitani dodaci',
'screenshot' => 'snimka zaslona',
'You are offline.' => 'Niste povezani s mrežom.',
'Increase %s.' => 'Povećajte %s.',
'You have no privileges to update this table.' => 'Nemate ovlasti za ažuriranje ove tablice.',
'Saving' => 'Spremanje',
'Unknown error.' => 'Nepoznata greška.',
'%s must <a%s>return an array</a>.' => '%s mora <a%s>vratiti niz</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Konfigurirajte</a> %s u %s.',
'Algorithm' => 'Algoritam',
'Columns' => 'Stupci',
'Condition' => 'Uvjet',
'File must be in UTF-8 encoding.' => 'Datoteka mora biti u UTF-8 kodiranju.',
'ATTACH queries are not supported.' => 'ATTACH upiti nisu podržani.',
'%d / ' => '%d / ',
'Limit rows' => 'Ograniči retke',
'Materialized view' => 'Materijaliziran pogled',
'Inherits from' => 'Nasljeđuje od',
'Checks' => 'Provjere',
'Inherited by' => 'Nasljeđeno od',
);
// run `php ../../lang.php hr` to update this file

View File

@@ -103,16 +103,18 @@ foreach ($schema as $name => $table) {
foreach ($schema as $name => $table) { foreach ($schema as $name => $table) {
foreach ((array) $table["references"] as $target_name => $refs) { foreach ((array) $table["references"] as $target_name => $refs) {
foreach ($refs as $left => $ref) { if ($schema[$target_name]) { // otherwise table in another schema
$min_pos = $top; foreach ($refs as $left => $ref) {
$max_pos = -10; $min_pos = $top;
foreach ($ref[0] as $key => $source) { $max_pos = -10;
$pos1 = $table["pos"][0] + $table["fields"][$source]["pos"]; foreach ($ref[0] as $key => $source) {
$pos2 = $schema[$target_name]["pos"][0] + $schema[$target_name]["fields"][$ref[1][$key]]["pos"]; $pos1 = $table["pos"][0] + $table["fields"][$source]["pos"];
$min_pos = min($min_pos, $pos1, $pos2); $pos2 = $schema[$target_name]["pos"][0] + $schema[$target_name]["fields"][$ref[1][$key]]["pos"];
$max_pos = max($max_pos, $pos1, $pos2); $min_pos = min($min_pos, $pos1, $pos2);
$max_pos = max($max_pos, $pos1, $pos2);
}
echo "<div class='references' id='refl$left' style='left: $left" . "em; top: $min_pos" . "em; padding: .5em 0;'><div style='border-right: 1px solid gray; margin-top: 1px; height: " . ($max_pos - $min_pos) . "em;'></div></div>\n";
} }
echo "<div class='references' id='refl$left' style='left: $left" . "em; top: $min_pos" . "em; padding: .5em 0;'><div style='border-right: 1px solid gray; margin-top: 1px; height: " . ($max_pos - $min_pos) . "em;'></div></div>\n";
} }
} }
} }

View File

@@ -455,7 +455,8 @@ if (!$columns && support("table")) {
$html = select_value($val, $link, $field, $text_length); $html = select_value($val, $link, $field, $text_length);
$id = h("val[$unique_idf][" . bracket_escape($key) . "]"); $id = h("val[$unique_idf][" . bracket_escape($key) . "]");
$posted = idx(idx($_POST["val"], $unique_idf), bracket_escape($key)); $posted = idx(idx($_POST["val"], $unique_idf), bracket_escape($key));
$editable = !is_array($row[$key]) && is_utf8($html) && $rows[$n][$key] == $row[$key] && !$functions[$key] && !$field["generated"]; $update = idx($field["privileges"], "update");
$editable = !is_array($row[$key]) && is_utf8($html) && $rows[$n][$key] == $row[$key] && !$functions[$key] && !$field["generated"] && $update;
$type = (preg_match('~^(AVG|MIN|MAX)\((.+)\)~', $column, $match) ? $fields[idf_unescape($match[2])]["type"] : $field["type"]); $type = (preg_match('~^(AVG|MIN|MAX)\((.+)\)~', $column, $match) ? $fields[idf_unescape($match[2])]["type"] : $field["type"]);
$text = preg_match('~text|json|lob~', $type); $text = preg_match('~text|json|lob~', $type);
$is_number = preg_match(number_type(), $type) || preg_match('~^(CHAR_LENGTH|ROUND|FLOOR|CEIL|TIME_TO_SEC|COUNT|SUM)\(~', $column); $is_number = preg_match(number_type(), $type) || preg_match('~^(CHAR_LENGTH|ROUND|FLOOR|CEIL|TIME_TO_SEC|COUNT|SUM)\(~', $column);
@@ -465,10 +466,11 @@ if (!$columns && support("table")) {
echo ">" . ($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 ">" . ($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($html, "<i>…</i>"); $long = strpos($html, "<i>…</i>");
echo " data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'" echo ($update
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'") ? " data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
. ">$html" . ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
; : ""
) . ">$html";
} }
} }
next($select); next($select);

View File

@@ -43,8 +43,8 @@ function send_mail(string $email, string $subject, string $message, string $from
} }
/** Check whether the column looks like boolean /** Check whether the column looks like boolean
* @param array{type: string} $field single field returned from fields() * @param array{type: string, length?: string} $field single field returned from fields()
*/ */
function like_bool(array $field): bool { function like_bool(array $field): bool {
return preg_match("~bool|bit~", $field["type"]); return $field["type"] == "bool" || (preg_match('~bit|tinyint~', $field["type"]) && $field["length"] == 1);
} }

View File

@@ -22,6 +22,7 @@ parameters:
- "~expects bool~" # truthy values - "~expects bool~" # truthy values
- "~fread expects int<1, max>, 100000~" # 1e6 - "~fread expects int<1, max>, 100000~" # 1e6
- "~'strlen' given~" # used as a bool callback - "~'strlen' given~" # used as a bool callback
- "~between int<70100~" # PHP_VERSION_ID check
- -
message: "~ type specified~" # duplicate functions and methods message: "~ type specified~" # duplicate functions and methods

View File

@@ -23,5 +23,6 @@ class AdminerDotJs extends Adminer\Plugin {
'pl' => array('' => 'Wczytuj adminer.js'), 'pl' => array('' => 'Wczytuj adminer.js'),
'ro' => array('' => 'Încarcă adminer.js'), 'ro' => array('' => 'Încarcă adminer.js'),
'ja' => array('' => 'adminer.js を読込み'), 'ja' => array('' => 'adminer.js を読込み'),
'hr' => array('' => 'Učitava adminer.js'),
); );
} }

View File

@@ -75,5 +75,6 @@ ORDER BY s.ordinal_position", null, "") as $row
'de' => array('' => 'Links zu Tabellen anzeigen die auf die aktuelle Zeile verweisen, wie im Adminer Editor'), 'de' => array('' => 'Links zu Tabellen anzeigen die auf die aktuelle Zeile verweisen, wie im Adminer Editor'),
'ja' => array('' => 'Adminer Editor と同様に、カレント行を参照しているテーブルへのリンクを表示'), 'ja' => array('' => 'Adminer Editor と同様に、カレント行を参照しているテーブルへのリンクを表示'),
'pl' => array('' => 'Wyświetlaj linki do tabel odnoszących się do bieżącego wiersza, tak samo jak w Edytorze administratora'), 'pl' => array('' => 'Wyświetlaj linki do tabel odnoszących się do bieżącego wiersza, tak samo jak w Edytorze administratora'),
'hr' => array('' => 'Prikazuje veze na tablice koje referenciraju trenutni redak, kao u Adminer Editoru'),
); );
} }

View File

@@ -36,5 +36,6 @@ onbeforeunload = () => editChanged;
'de' => array('' => 'Zeigt eine Bestätigung an bevor die Seite neu geladen wird, wenn ein Formularfeld geändert wurde'), 'de' => array('' => 'Zeigt eine Bestätigung an bevor die Seite neu geladen wird, wenn ein Formularfeld geändert wurde'),
'ja' => array('' => 'フォームの列が変更された時、ページを再読込みする前に確認を表示'), 'ja' => array('' => 'フォームの列が変更された時、ページを再読込みする前に確認を表示'),
'pl' => array('' => 'Wyświetlaj potwierdzenie przed rozładowaniem strony, jeśli pole formularza zostało zmienione'), 'pl' => array('' => 'Wyświetlaj potwierdzenie przed rozładowaniem strony, jeśli pole formularza zostało zmienione'),
'hr' => array('' => 'Prikazuje potvrdu prije napuštanja stranice ako je polje obrasca promijenjeno'),
); );
} }

View File

@@ -96,5 +96,14 @@ class AdminerConfig extends Adminer\Plugin {
'Use %s if exists' => 'あれば %s を使う', 'Use %s if exists' => 'あれば %s を使う',
'Use builtin design' => '組込みのデザインを使う', 'Use builtin design' => '組込みのデザインを使う',
), ),
'hr' => array(
'' => 'Nikola Radovanović - cobisimo@gmail.com',
'Configuration saved.' => 'Konfiguracija je spremljena.',
'Configuration' => 'Konfiguracija',
'Only some plugins support configuration, e.g. %s.' => 'Samo neki dodaci podržavaju konfiguraciju, npr. %s.',
'Use %s if exists' => 'Koristi %s ako postoji',
'Use builtin design' => 'Koristi ugrađeni dizajn',
'Design' => 'Dizajn',
),
); );
} }

View File

@@ -50,5 +50,6 @@ if (saved) {
'de' => array('' => 'Umschalten zwischen hellem und dunklem Design erlauben'), 'de' => array('' => 'Umschalten zwischen hellem und dunklem Design erlauben'),
'ja' => array('' => 'ダークモードへの切替え'), 'ja' => array('' => 'ダークモードへの切替え'),
'pl' => array('' => 'Zezwalaj na przełączanie trybu jasnego i ciemnego'), 'pl' => array('' => 'Zezwalaj na przełączanie trybu jasnego i ciemnego'),
'hr' => array('' => 'Omogućuje prebacivanje između svijetlog i tamnog izgleda'),
); );
} }

View File

@@ -32,5 +32,6 @@ class AdminerDatabaseHide extends Adminer\Plugin {
'pl' => array('' => 'Ukryj niektóre bazy danych w interfejsie tylko po to, aby ulepszyć motyw, a nie wtyczkę zabezpieczającą'), 'pl' => array('' => 'Ukryj niektóre bazy danych w interfejsie tylko po to, aby ulepszyć motyw, a nie wtyczkę zabezpieczającą'),
'ro' => array('' => 'Ascundeți unele baze de date din interfață - doar pentru a îmbunătăți designul, nu un plugin de securitate'), 'ro' => array('' => 'Ascundeți unele baze de date din interfață - doar pentru a îmbunătăți designul, nu un plugin de securitate'),
'ja' => array('' => '一部データベースを UI 上で表示禁止 (デザイン的な効果のみでセキュリティ的には効果なし)'), 'ja' => array('' => '一部データベースを UI 上で表示禁止 (デザイン的な効果のみでセキュリティ的には効果なし)'),
'hr' => array('' => 'Sakriva neke baze podataka iz sučelja samo radi poboljšanja izgleda, nije sigurnosni dodatak'),
); );
} }

View File

@@ -49,5 +49,6 @@ class AdminerDesigns extends Adminer\Plugin {
'pl' => array('' => 'Zezwalaj na przełączanie motywów'), 'pl' => array('' => 'Zezwalaj na przełączanie motywów'),
'ro' => array('' => 'Permiteți comutarea designurilor'), 'ro' => array('' => 'Permiteți comutarea designurilor'),
'ja' => array('' => 'テーマ設定を有効化'), 'ja' => array('' => 'テーマ設定を有効化'),
'hr' => array('' => 'Omogućuje promjenu dizajna'),
); );
} }

View File

@@ -59,7 +59,7 @@ if (isset($_GET["igdb"])) {
function query($query, $unbuffered = false) { function query($query, $unbuffered = false) {
if (preg_match('~^SELECT COUNT\(\*\) FROM (\w+)( WHERE ((MATCH \(search\) AGAINST \((.+)\))|.+))?$~', $query, $match)) { if (preg_match('~^SELECT COUNT\(\*\) FROM (\w+)( WHERE ((MATCH \(search\) AGAINST \((.+)\))|.+))?$~', $query, $match)) {
return new Result(array($this->request("$match[1]/count", ($match[5] ? 'search "' . addcslashes($match[5], '\\"') . '";' return new Result(array($match[1] == 'dumps' ? array('count' => 50) : $this->request("$match[1]/count", ($match[5] ? 'search "' . addcslashes($match[5], '\\"') . '";'
: ($match[3] ? 'where ' . str_replace(' AND ', ' & ', $match[3]) . ';' : ($match[3] ? 'where ' . str_replace(' AND ', ' & ', $match[3]) . ';'
: '' : ''
))))); )))));
@@ -182,7 +182,7 @@ if (isset($_GET["igdb"])) {
} }
$this->fields[$table]['id'] = array('full_type' => 'bigint', 'comment' => ''); $this->fields[$table]['id'] = array('full_type' => 'bigint', 'comment' => '');
$this->links[$link] = $table; $this->links[$link] = $table;
$this->tables[$table] = array('Name' => $table, 'Comment' => $comment); $this->tables[$table] = array('Name' => $table, 'Engine' => 'endpoint', 'Comment' => $comment);
foreach ($xpath->query('tbody/tr', $els[$i+2]) as $tr) { foreach ($xpath->query('tbody/tr', $els[$i+2]) as $tr) {
$tds = $xpath->query('td', $tr); $tds = $xpath->query('td', $tr);
$field = $tds[0]->nodeValue; $field = $tds[0]->nodeValue;
@@ -211,7 +211,28 @@ if (isset($_GET["igdb"])) {
}); });
} }
} }
$this->tables['webhooks'] = array('Name' => 'webhooks', 'Comment' => 'Webhooks allow us to push data to you when it is added, updated, or deleted');
$this->tables['dumps'] = array(
'Name' => 'dumps',
'Engine' => 'dumps',
'Comment' => 'Daily updated CSV Data Dumps which can be used to kick start your projects or keep your data up to date (within 24 hours)',
);
$this->links['data-dumps'] = 'dumps';
$this->fields['dumps'] = array(
's3_url' => array('comment' => 'The download Url is a presigned S3 url that is valid for 5 minutes'),
'endpoint' => array(),
'file_name' => array(),
'size_bytes' => array(),
'updated_at' => array('full_type' => 'datetime'),
'schema_version' => array('full_type' => 'datetime', 'comment' => 'Will change when the schema changes'),
'schema' => array('comment' => 'Reflects the current data structure and data type that the Dump is using'),
);
$this->tables['webhooks'] = array(
'Name' => 'webhooks',
'Engine' => 'webhooks',
'Comment' => 'Webhooks allow us to push data to you when it is added, updated, or deleted',
);
$this->links['webhooks'] = 'webhooks'; $this->links['webhooks'] = 'webhooks';
$this->fields['webhooks'] = array( $this->fields['webhooks'] = array(
'endpoint' => array( 'endpoint' => array(
@@ -258,7 +279,8 @@ if (isset($_GET["igdb"])) {
} }
$columns = ($select != array('*') ? $select : array_keys($this->fields[$table])); $columns = ($select != array('*') ? $select : array_keys($this->fields[$table]));
$common = ($where ? "\nwhere " . implode(" & ", $where) . ";" : ""); $common = ($where ? "\nwhere " . implode(" & ", $where) . ";" : "");
if ($table != 'webhooks') { $method = ($table == 'webhooks' || $table == 'dumps' ? 'GET' : 'POST');
if ($method == 'POST') {
$query .= "fields " . implode(",", $select) . ";" $query .= "fields " . implode(",", $select) . ";"
. ($select == array('*') ? "\nexclude checksum;" : "") . ($select == array('*') ? "\nexclude checksum;" : "")
. $common . $common
@@ -268,12 +290,11 @@ if (isset($_GET["igdb"])) {
; ;
} }
$start = microtime(true); $start = microtime(true);
$multi = (!$search && $table != 'webhooks' && array_key_exists($table, driver()->tables)); $multi = (!$search && $method == 'POST' && array_key_exists($table, driver()->tables));
$method = ($table == 'webhooks' ? 'GET' : 'POST');
$realQuery = str_replace("*;\nexclude checksum", implode(',', $columns), $query); // exclude deprecated columns $realQuery = str_replace("*;\nexclude checksum", implode(',', $columns), $query); // exclude deprecated columns
$return = ($multi $return = ($multi
? $this->conn->request('multiquery', "query $table \"result\" { $realQuery };\nquery $table/count \"count\" { $common };") ? $this->conn->request('multiquery', "query $table \"result\" { $realQuery };\nquery $table/count \"count\" { $common };")
: $this->conn->request($table, $realQuery, $method) : $this->conn->request(($method == 'GET' && $where ? "$table/" . reset($_GET["where"]) : $table), $realQuery, $method)
); );
if ($print) { if ($print) {
echo adminer()->selectQuery("$method $table;\n$query", $start); echo adminer()->selectQuery("$method $table;\n$query", $start);
@@ -283,7 +304,9 @@ if (isset($_GET["igdb"])) {
} }
$this->foundRows = ($multi ? $return[1]['count'] : null); $this->foundRows = ($multi ? $return[1]['count'] : null);
$return = ($multi ? $return[0]['result'] : $return); $return = ($multi ? $return[0]['result'] : $return);
if ($return && $table != 'webhooks') { if ($table == 'dumps' && $where) {
$return = array($return);
} elseif ($return && $method == 'POST') {
$return[0] = array_merge(array_fill_keys($columns, null), $return[0]); $return[0] = array_merge(array_fill_keys($columns, null), $return[0]);
} }
return new Result($return); return new Result($return);
@@ -345,7 +368,7 @@ if (isset($_GET["igdb"])) {
} }
function indexes($table, $connection2 = null) { function indexes($table, $connection2 = null) {
$return = array(array("type" => "PRIMARY", "columns" => array("id"))); $return = array(array('type' => 'PRIMARY', 'columns' => array($table == 'dumps' ? 'endpoint' : 'id')));
if (in_array($table, array('characters', 'collections', 'games', 'platforms', 'themes'))) { // https://api-docs.igdb.com/#search-1 if (in_array($table, array('characters', 'collections', 'games', 'platforms', 'themes'))) { // https://api-docs.igdb.com/#search-1
$return[] = array("type" => "FULLTEXT", "columns" => array("search")); $return[] = array("type" => "FULLTEXT", "columns" => array("search"));
} }
@@ -359,7 +382,7 @@ if (isset($_GET["igdb"])) {
$return[$key] = $val + array( $return[$key] = $val + array(
"field" => $key, "field" => $key,
"type" => ($type == 'reference' ? 'int' : $type), // align right reference columns "type" => ($type == 'reference' ? 'int' : $type), // align right reference columns
"privileges" => array("select" => 1) + ($table == 'webhooks' ? array() : array("where" => 1, "order" => 1)), "privileges" => array("select" => 1) + ($table == 'webhooks' || $table == 'dumps' ? array() : array("where" => 1, "order" => 1)),
); );
} }
return $return; return $return;

View File

@@ -174,5 +174,6 @@ DROP PROCEDURE adminer_alter;
'pl' => array('' => 'Eksportuje jedną bazę danych (np. programistyczną), aby można ją było zsynchronizować z inną bazą danych (np. produkcyjną)'), 'pl' => array('' => 'Eksportuje jedną bazę danych (np. programistyczną), aby można ją było zsynchronizować z inną bazą danych (np. produkcyjną)'),
'ro' => array('' => 'Exportați o bază de date (de exemplu, development) astfel încât să poată fi sincronizată cu o altă bază de date (de exemplu, de producție)'), 'ro' => array('' => 'Exportați o bază de date (de exemplu, development) astfel încât să poată fi sincronizată cu o altă bază de date (de exemplu, de producție)'),
'ja' => array('' => 'データベース (開発用など) をエクスポートし、別のデータベース (本番用など) と同期'), 'ja' => array('' => 'データベース (開発用など) をエクスポートし、別のデータベース (本番用など) と同期'),
'hr' => array('' => 'Izvozi bazu podataka (npr. razvojnu) tako da se može sinkronizirati s drugom bazom (npr. produkcijskom)'),
); );
} }

View File

@@ -43,5 +43,6 @@ class AdminerDumpBz2 extends Adminer\Plugin {
'pl' => array('' => 'Zrzuć do formatu Bzip2'), 'pl' => array('' => 'Zrzuć do formatu Bzip2'),
'ro' => array('' => 'Dump în format Bzip2'), 'ro' => array('' => 'Dump în format Bzip2'),
'ja' => array('' => 'Bzip2 形式でエクスポート'), 'ja' => array('' => 'Bzip2 形式でエクスポート'),
'hr' => array('' => 'Izvoz u Bzip2 format'),
); );
} }

View File

@@ -18,5 +18,6 @@ class AdminerDumpDate extends Adminer\Plugin {
'pl' => array('' => 'Dołącz bieżącą datę i godzinę do nazwy pliku eksportu'), 'pl' => array('' => 'Dołącz bieżącą datę i godzinę do nazwy pliku eksportu'),
'ro' => array('' => 'Includeți data și ora curentă în numele fișierului de export'), 'ro' => array('' => 'Includeți data și ora curentă în numele fișierului de export'),
'ja' => array('' => 'エクスポートファイル名に現在日時を含める'), 'ja' => array('' => 'エクスポートファイル名に現在日時を含める'),
'hr' => array('' => 'Dodaje trenutni datum i vrijeme u naziv datoteke izvoza'),
); );
} }

View File

@@ -64,5 +64,6 @@ class AdminerDumpJson extends Adminer\Plugin {
'pl' => array('' => 'Zrzuć do formatu JSON'), 'pl' => array('' => 'Zrzuć do formatu JSON'),
'ro' => array('' => 'Dump în format JSON'), 'ro' => array('' => 'Dump în format JSON'),
'ja' => array('' => 'JSON 形式でエクスポート'), 'ja' => array('' => 'JSON 形式でエクスポート'),
'hr' => array('' => 'Izvoz u JSON format'),
); );
} }

View File

@@ -52,5 +52,6 @@ class AdminerDumpPhp extends Adminer\Plugin {
'pl' => array('' => 'Zrzucaj do formatu PHP'), 'pl' => array('' => 'Zrzucaj do formatu PHP'),
'ro' => array('' => 'Dump în format PHP'), 'ro' => array('' => 'Dump în format PHP'),
'ja' => array('' => 'PHP 形式でエクスポート'), 'ja' => array('' => 'PHP 形式でエクスポート'),
'hr' => array('' => 'Izvoz u PHP format'),
); );
} }

View File

@@ -58,5 +58,6 @@ class AdminerDumpXml extends Adminer\Plugin {
'pl' => array('' => 'Zrzut do formatu XML w strukturze <database name=""><table name=""><column name="">value'), 'pl' => array('' => 'Zrzut do formatu XML w strukturze <database name=""><table name=""><column name="">value'),
'ro' => array('' => 'Dump în format XML în structura <database name=""><table name=""><column name="">value'), 'ro' => array('' => 'Dump în format XML în structura <database name=""><table name=""><column name="">value'),
'ja' => array('' => '構造化 XML 形式でエクスポート <database name=""><table name=""><column name="">value'), 'ja' => array('' => '構造化 XML 形式でエクスポート <database name=""><table name=""><column name="">value'),
'hr' => array('' => 'Izvoz u XML format u strukturi <database name=""><table name=""><column name="">vrijednost'),
); );
} }

View File

@@ -47,5 +47,6 @@ class AdminerDumpZip extends Adminer\Plugin {
'pl' => array('' => 'Zrzuć do formatu ZIP'), 'pl' => array('' => 'Zrzuć do formatu ZIP'),
'ro' => array('' => 'Dump în format ZIP'), 'ro' => array('' => 'Dump în format ZIP'),
'ja' => array('' => 'ZIP 形式でエクスポート'), 'ja' => array('' => 'ZIP 形式でエクスポート'),
'hr' => array('' => 'Izvoz u ZIP format'),
); );
} }

View File

@@ -57,5 +57,6 @@ class AdminerEditCalendar extends Adminer\Plugin {
'pl' => array('' => 'Wyświetl interfejs jQuery Timepicker dla każdego pola daty i godziny'), 'pl' => array('' => 'Wyświetl interfejs jQuery Timepicker dla każdego pola daty i godziny'),
'ro' => array('' => 'Afișați jQuery UI Timepicker pentru fiecare câmp de dată și dată-timp'), 'ro' => array('' => 'Afișați jQuery UI Timepicker pentru fiecare câmp de dată și dată-timp'),
'ja' => array('' => '各日時列に jQuery UI の Timepicker を表示'), 'ja' => array('' => '各日時列に jQuery UI の Timepicker を表示'),
'hr' => array('' => 'Prikazuje jQuery UI Timepicker za svako polje datuma i datuma-vremena'),
); );
} }

View File

@@ -46,5 +46,6 @@ class AdminerEditForeign extends Adminer\Plugin {
'pl' => array('' => 'Wybierz klucz obcy w formularzu edycji'), 'pl' => array('' => 'Wybierz klucz obcy w formularzu edycji'),
'ro' => array('' => 'Selectați cheia străină în formularul de editare'), 'ro' => array('' => 'Selectați cheia străină în formularul de editare'),
'ja' => array('' => '外部キーを編集フォームで選択'), 'ja' => array('' => '外部キーを編集フォームで選択'),
'hr' => array('' => 'Odabir stranog ključa u obrascu za uređivanje'),
); );
} }

View File

@@ -20,5 +20,6 @@ class AdminerEditTextarea extends Adminer\Plugin {
'pl' => array('' => 'Użyj <textarea> dla char i varchar'), 'pl' => array('' => 'Użyj <textarea> dla char i varchar'),
'ro' => array('' => 'Utilizați <textarea> pentru char și varchar'), 'ro' => array('' => 'Utilizați <textarea> pentru char și varchar'),
'ja' => array('' => 'char や varchar に <textarea> を使用'), 'ja' => array('' => 'char や varchar に <textarea> を使用'),
'hr' => array('' => 'Koristi <textarea> za char i varchar polja'),
); );
} }

View File

@@ -43,5 +43,6 @@ class AdminerEditorSetup extends Adminer\Plugin {
'de' => array('' => 'Treiber, Server und Datenbank für die Verwendung mit Adminer Editor einrichten'), 'de' => array('' => 'Treiber, Server und Datenbank für die Verwendung mit Adminer Editor einrichten'),
'ja' => array('' => 'Adminer Editor で使用するドライバ、サーバ、データベースを設定'), 'ja' => array('' => 'Adminer Editor で使用するドライバ、サーバ、データベースを設定'),
'pl' => array('' => 'Konfiguruj sterownik, serwer i bazę danych do użycia z Adminer Editorem'), 'pl' => array('' => 'Konfiguruj sterownik, serwer i bazę danych do użycia z Adminer Editorem'),
'hr' => array('' => 'Postavlja upravljački program, poslužitelj i bazu podataka za korištenje s Adminer Editorom'),
); );
} }

View File

@@ -18,5 +18,6 @@ class AdminerEditorViews extends Adminer\Plugin {
'pl' => array('' => 'Wyświetlaj widoki w Adminer Editorze'), 'pl' => array('' => 'Wyświetlaj widoki w Adminer Editorze'),
'ro' => array('' => 'Afișează vizualizări în Adminer Editor'), 'ro' => array('' => 'Afișează vizualizări în Adminer Editor'),
'ja' => array('' => 'Adminer Editor にビューを表示'), 'ja' => array('' => 'Adminer Editor にビューを表示'),
'hr' => array('' => 'Prikazuje poglede u Adminer Editoru'),
); );
} }

View File

@@ -61,5 +61,6 @@ class AdminerEmailTable extends Adminer\Plugin {
'pl' => array('' => 'Pobieraj temat i wiadomość e-mail z bazy danych (Adminer Editor)'), 'pl' => array('' => 'Pobieraj temat i wiadomość e-mail z bazy danych (Adminer Editor)'),
'ro' => array('' => 'Obțineți subiectul e-mailului și mesajul din baza de date (Adminer Editor)'), 'ro' => array('' => 'Obțineți subiectul e-mailului și mesajul din baza de date (Adminer Editor)'),
'ja' => array('' => 'メールの件名と本文をデータベースから取得 (Adminer Editor)'), 'ja' => array('' => 'メールの件名と本文をデータベースから取得 (Adminer Editor)'),
'hr' => array('' => 'Dohvaća predmet i poruku e-pošte iz baze podataka (Adminer Editor)'),
); );
} }

View File

@@ -39,5 +39,6 @@ class AdminerEnumOption extends Adminer\Plugin {
'pl' => array('' => 'Użyj <select><option> do edycji enum zamiast <input type="radio">'), 'pl' => array('' => 'Użyj <select><option> do edycji enum zamiast <input type="radio">'),
'ro' => array('' => 'Utilizați <select><option> pentru editarea enum în loc de <input type="radio">'), 'ro' => array('' => 'Utilizați <select><option> pentru editarea enum în loc de <input type="radio">'),
'ja' => array('' => '列挙型の編集に <input type="radio"> ではなく <select><option> を使用'), 'ja' => array('' => '列挙型の編集に <input type="radio"> ではなく <select><option> を使用'),
'hr' => array('' => 'Koristi <select><option> za uređivanje enum polja umjesto <input type="radio">'),
); );
} }

View File

@@ -55,5 +55,6 @@ class AdminerFileUpload extends Adminer\Plugin {
'pl' => array('' => 'Edytuj pola kończące się na "_path" za pomocą <input type="file"> i link do przesłanych plików z wybierz'), 'pl' => array('' => 'Edytuj pola kończące się na "_path" za pomocą <input type="file"> i link do przesłanych plików z wybierz'),
'ro' => array('' => 'Modificați câmpurile care se termină cu "_path" prin <input type="file"> și creați un link către fișierele încărcate din select'), 'ro' => array('' => 'Modificați câmpurile care se termină cu "_path" prin <input type="file"> și creați un link către fișierele încărcate din select'),
'ja' => array('' => '列名が "_path" で終わる列を <input type="file"> で変更し、"選択" からアップロードされたファイルにリンク'), 'ja' => array('' => '列名が "_path" で終わる列を <input type="file"> で変更し、"選択" からアップロードされたファイルにリンク'),
'hr' => array('' => 'Uređuje polja koja završavaju s "_path" putem <input type="file"> i povezuje ih s učitanim datotekama'),
); );
} }

View File

@@ -191,5 +191,6 @@ class AdminerForeignSystem extends Adminer\Plugin {
'pl' => array('' => 'Połącz tabele systemowe (w bazach danych "mysql" i "information_schema") za pomocą kluczy obcych'), 'pl' => array('' => 'Połącz tabele systemowe (w bazach danych "mysql" i "information_schema") za pomocą kluczy obcych'),
'ro' => array('' => 'Conectați tabelele de sistem (în bazele de date "mysql" și "information_schema") prin chei străine'), 'ro' => array('' => 'Conectați tabelele de sistem (în bazele de date "mysql" și "information_schema") prin chei străine'),
'ja' => array('' => 'システムテーブル ("mysql" と "information_schema") を外部キーを用いて接続'), 'ja' => array('' => 'システムテーブル ("mysql" と "information_schema") を外部キーを用いて接続'),
'hr' => array('' => 'Povezuje sistemske tablice (u bazama "mysql" i "information_schema") stranim ključevima'),
); );
} }

View File

@@ -30,5 +30,6 @@ class AdminerFrames extends Adminer\Plugin {
'pl' => array('' => 'Zezwalaj na używanie Adminera wewnątrz ramki'), 'pl' => array('' => 'Zezwalaj na używanie Adminera wewnątrz ramki'),
'ro' => array('' => 'Permiteți utilizarea Adminer în interiorul unui cadru'), 'ro' => array('' => 'Permiteți utilizarea Adminer în interiorul unui cadru'),
'ja' => array('' => 'フレーム内での Adminer 利用を許可'), 'ja' => array('' => 'フレーム内での Adminer 利用を許可'),
'hr' => array('' => 'Dopušta korištenje Adminera unutar framea'),
); );
} }

View File

@@ -107,5 +107,6 @@ addEventListener('DOMContentLoaded', () => {
'de' => array('' => 'CodeMirror 5 verwenden für die Syntaxhervorhebung und <textarea> einschließlich der Überschrift von Schlüsselwörtern und Tabellen'), 'de' => array('' => 'CodeMirror 5 verwenden für die Syntaxhervorhebung und <textarea> einschließlich der Überschrift von Schlüsselwörtern und Tabellen'),
'ja' => array('' => 'CodeMirror 5 を用い、キーワードやテーブルを含む構文や <textarea> を強調表示'), 'ja' => array('' => 'CodeMirror 5 を用い、キーワードやテーブルを含む構文や <textarea> を強調表示'),
'pl' => array('' => 'Użyj CodeMirror 5 do podświetlania składni i <textarea>, uwzględniając wcześniejsze wpisywanie słów kluczowych i tabel'), 'pl' => array('' => 'Użyj CodeMirror 5 do podświetlania składni i <textarea>, uwzględniając wcześniejsze wpisywanie słów kluczowych i tabel'),
'hr' => array('' => 'Koristi CodeMirror 5 za isticanje sintakse i <textarea>, uključujući dovršavanje ključnih riječi i tablica'),
); );
} }

View File

@@ -77,5 +77,6 @@ addEventListener('DOMContentLoaded', () => {
'de' => array('' => 'Monaco-Editor von VS Code verwenden, für die Syntaxhervorhebung und SQL <textarea>'), 'de' => array('' => 'Monaco-Editor von VS Code verwenden, für die Syntaxhervorhebung und SQL <textarea>'),
'ja' => array('' => '構文や <textarea> の強調表示に VS Code の Monaco Editor を使用'), 'ja' => array('' => '構文や <textarea> の強調表示に VS Code の Monaco Editor を使用'),
'pl' => array('' => 'Użyj Monaco Editora programu VS Code do podświetlania składni i <textarea> SQL'), 'pl' => array('' => 'Użyj Monaco Editora programu VS Code do podświetlania składni i <textarea> SQL'),
'hr' => array('' => 'Koristi Monaco Editor iz VS Code za isticanje sintakse i SQL <textarea>'),
); );
} }

View File

@@ -65,5 +65,6 @@ if (el) {
'de' => array('' => 'Prism Code Editor verwenden, für die Syntaxhervorhebung und <textarea>'), 'de' => array('' => 'Prism Code Editor verwenden, für die Syntaxhervorhebung und <textarea>'),
'ja' => array('' => '構文や <textarea> の強調表示に Prism Code Editor を使用'), 'ja' => array('' => '構文や <textarea> の強調表示に Prism Code Editor を使用'),
'pl' => array('' => 'Użyj Prism Code Editora do podświetlania składni i <textarea>'), 'pl' => array('' => 'Użyj Prism Code Editora do podświetlania składni i <textarea>'),
'hr' => array('' => 'Koristi Prism Code Editor za isticanje sintakse i SQL <textarea>'),
); );
} }

View File

@@ -52,5 +52,6 @@ class AdminerJsonColumn extends Adminer\Plugin {
'pl' => array('' => 'Wyświetl wartości JSON jako tabelę w edycji'), 'pl' => array('' => 'Wyświetl wartości JSON jako tabelę w edycji'),
'ro' => array('' => 'Afișează valorile JSON sub formă de tabel în editare'), 'ro' => array('' => 'Afișează valorile JSON sub formă de tabel în editare'),
'ja' => array('' => 'JSON 値をテーブルとして編集画面に表示'), 'ja' => array('' => 'JSON 値をテーブルとして編集画面に表示'),
'hr' => array('' => 'Prikazuje JSON vrijednosti kao tablicu u uređivanju'),
); );
} }

View File

@@ -42,5 +42,6 @@ class AdminerLoginIp extends Adminer\Plugin {
'pl' => array('' => 'Sprawdzaj adres IP i zezwakaj na puste hasło'), 'pl' => array('' => 'Sprawdzaj adres IP i zezwakaj na puste hasło'),
'ro' => array('' => 'Verificați adresa IP și permiteți parola goală'), 'ro' => array('' => 'Verificați adresa IP și permiteți parola goală'),
'ja' => array('' => 'IP アドレスの確認、及び空パスワードの許可'), 'ja' => array('' => 'IP アドレスの確認、及び空パスワードの許可'),
'hr' => array('' => 'Provjerava IP adresu i dopušta praznu lozinku'),
); );
} }

View File

@@ -75,5 +75,10 @@ class AdminerLoginOtp extends Adminer\Plugin {
'ja' => array( 'ja' => array(
'' => 'ログイン時にワンタイムパスワード (二要素認証) が必要', '' => 'ログイン時にワンタイムパスワード (二要素認証) が必要',
), ),
'hr' => array(
'' => 'Jednokratna lozinka (dvofaktorska autentifikacija) potrebna pri prijavi',
'One Time Password' => 'Jednokratna lozinka',
'Invalid OTP.' => 'Nevažeća jednokratna lozinka.',
),
); );
} }

View File

@@ -33,5 +33,6 @@ class AdminerLoginPasswordLess extends Adminer\Plugin {
'pl' => array('' => 'Włącz logowanie bez hasła'), 'pl' => array('' => 'Włącz logowanie bez hasła'),
'ro' => array('' => 'Activați autentificarea fără parolă'), 'ro' => array('' => 'Activați autentificarea fără parolă'),
'ja' => array('' => 'パスワードなしのログインを許可'), 'ja' => array('' => 'パスワードなしのログインを許可'),
'hr' => array('' => 'Omogućuje prijavu bez lozinke'),
); );
} }

View File

@@ -44,5 +44,6 @@ class AdminerLoginServers extends Adminer\Plugin {
'pl' => array('' => 'Wyświetlaj stałą listę serwerów w formularzu logowania'), 'pl' => array('' => 'Wyświetlaj stałą listę serwerów w formularzu logowania'),
'ro' => array('' => 'Afișarea unei liste constante de servere în formularul de conectare'), 'ro' => array('' => 'Afișarea unei liste constante de servere în formularul de conectare'),
'ja' => array('' => 'ログイン画面に定義済のサーバリストを表示'), 'ja' => array('' => 'ログイン画面に定義済のサーバリストを表示'),
'hr' => array('' => 'Prikazuje konstantan popis poslužitelja u obrascu za prijavu'),
); );
} }

View File

@@ -28,5 +28,6 @@ class AdminerLoginSsl extends Adminer\Plugin {
'pl' => array('' => 'Połącz się z MySQL, PostgreSQL, MS SQL za pomocą protokołu SSL'), 'pl' => array('' => 'Połącz się z MySQL, PostgreSQL, MS SQL za pomocą protokołu SSL'),
'ro' => array('' => 'Conectați-vă la MySQL, PostgreSQL, MS SQL utilizând SSL'), 'ro' => array('' => 'Conectați-vă la MySQL, PostgreSQL, MS SQL utilizând SSL'),
'ja' => array('' => 'MySQL, PostgreSQL, MS SQL への接続時に SSL を利用'), 'ja' => array('' => 'MySQL, PostgreSQL, MS SQL への接続時に SSL を利用'),
'hr' => array('' => 'Spajanje na MySQL, PostgreSQL i MS SQL putem SSL-a'),
); );
} }

View File

@@ -33,5 +33,6 @@ class AdminerLoginTable extends Adminer\Plugin {
'pl' => array('' => 'Uwierzytelnij użytkownika z tabeli "login"'), 'pl' => array('' => 'Uwierzytelnij użytkownika z tabeli "login"'),
'ro' => array('' => 'Autentificați un utilizator din tabelul "login"'), 'ro' => array('' => 'Autentificați un utilizator din tabelul "login"'),
'ja' => array('' => '"login" テーブルによるユーザ認証'), 'ja' => array('' => '"login" テーブルによるユーザ認証'),
'hr' => array('' => 'Autentificira korisnika prema tablici "login"'),
); );
} }

View File

@@ -44,5 +44,6 @@ class AdminerMasterSlave extends Adminer\Plugin {
'pl' => array('' => 'Wykonuje zapisy na komputerze głównym i odczyty na komputerze podrzędnym'), 'pl' => array('' => 'Wykonuje zapisy na komputerze głównym i odczyty na komputerze podrzędnym'),
'ro' => array('' => 'Executarea scrierilor pe master și a citirilor pe slave'), 'ro' => array('' => 'Executarea scrierilor pe master și a citirilor pe slave'),
'ja' => array('' => 'マスタ書込みとスレーブ読込みの有効化'), 'ja' => array('' => 'マスタ書込みとスレーブ読込みの有効化'),
'hr' => array('' => 'Izvodi pisanje na masteru i čitanje na slaveu'),
); );
} }

View File

@@ -112,5 +112,14 @@ class AdminerMenuLinks extends Adminer\Plugin {
'Select data' => 'データ', 'Select data' => 'データ',
'Show structure' => '構造', 'Show structure' => '構造',
), ),
'hr' => array(
'' => 'Prikazuje veze na odabir podataka ili strukturu tablice u izborniku',
'Select data' => 'Odaberi podatke',
'Show structure' => 'Prikaži strukturu',
'Both' => 'Oboje',
'Auto (select on select page, structure otherwise)' => 'Automatski (odabir na stranici odabira, inače struktura)',
'Menu table links' => 'Veze tablice u izborniku',
'select' => 'odaberi',
),
); );
} }

View File

@@ -37,5 +37,6 @@ class AdminerPrettyJsonColumn extends Adminer\Plugin {
'pl' => array('' => 'Ładnie drukuj wartości JSON w edycji'), 'pl' => array('' => 'Ładnie drukuj wartości JSON w edycji'),
'ro' => array('' => 'Afisare frumoasa a valorilor JSON în editare'), 'ro' => array('' => 'Afisare frumoasa a valorilor JSON în editare'),
'ja' => array('' => '編集時に JSON 文字列を見易く表示'), 'ja' => array('' => '編集時に JSON 文字列を見易く表示'),
'hr' => array('' => 'Lijepo prikazuje JSON vrijednosti u uređivanju'),
); );
} }

View File

@@ -23,5 +23,6 @@ class AdminerRowNumbers extends Adminer\Plugin {
protected $translations = array( protected $translations = array(
'cs' => array('' => 'Zobrazí čísla řádek ve výpisu'), 'cs' => array('' => 'Zobrazí čísla řádek ve výpisu'),
'hr' => array('' => 'Prikazuje brojeve redaka u ispisu'),
); );
} }

View File

@@ -457,5 +457,14 @@ class AdminerSelectEmail extends Adminer\Plugin {
'Attachments' => '附件', 'Attachments' => '附件',
'Send' => '发送', 'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。'), '%d e-mail(s) have been sent.' => '%d 封邮件已发送。'),
'hr' => array(
'' => 'Slanje e-pošte odabranim recima',
'E-mail' => 'E-pošta',
'From' => 'Od',
'Subject' => 'Predmet',
'Attachments' => 'Privici',
'Send' => 'Pošalji',
'%d e-mail(s) have been sent.' => array('%d e-mail je poslan.', '%d e-maila su poslana.', '%d e-mailova je poslano.'),
),
); );
} }

View File

@@ -53,5 +53,6 @@ class AdminerSlugify extends Adminer\Plugin {
'pl' => array('' => 'Wstępnie wypełnij pole zawierające "_slug" osłabioną wartością poprzedniego pola (JavaScript)'), 'pl' => array('' => 'Wstępnie wypełnij pole zawierające "_slug" osłabioną wartością poprzedniego pola (JavaScript)'),
'ro' => array('' => 'Precompletați câmpul care conține "_slug" cu valoarea slugificată a unui câmp anterior (JavaScript)'), 'ro' => array('' => 'Precompletați câmpul care conține "_slug" cu valoarea slugificată a unui câmp anterior (JavaScript)'),
'ja' => array('' => '列名に "_slug" を含む列を、前列の URL 化された値でプレフィル (JavaScript)'), 'ja' => array('' => '列名に "_slug" を含む列を、前列の URL 化された値でプレフィル (JavaScript)'),
'hr' => array('' => 'Popunjava polje koje sadrži "_slug" slugificiranom vrijednošću prethodnog polja (JavaScript)'),
); );
} }

View File

@@ -116,5 +116,10 @@ geminiText.onkeydown = event => {
'Ask Gemini' => 'Gemini に聞く', 'Ask Gemini' => 'Gemini に聞く',
'Just a sec...' => 'しばらくお待ち下さい...', 'Just a sec...' => 'しばらくお待ち下さい...',
), ),
'hr' => array(
'' => 'Generiranje SQL naredbi pomoću Google Gemini AI',
'Ask Gemini' => 'Pitaj Gemini',
'Just a sec...' => 'Samo trenutak...',
),
); );
} }

View File

@@ -42,5 +42,6 @@ class AdminerSqlLog extends Adminer\Plugin {
'pl' => array('' => 'Rejestruj wszystkie zapytania do pliku SQL'), 'pl' => array('' => 'Rejestruj wszystkie zapytania do pliku SQL'),
'ro' => array('' => 'Logați toate interogările în fișierul SQL'), 'ro' => array('' => 'Logați toate interogările în fișierul SQL'),
'ja' => array('' => '全クエリを SQL ファイルに記録'), 'ja' => array('' => '全クエリを SQL ファイルに記録'),
'hr' => array('' => 'Bilježi sve upite u SQL datoteku'),
); );
} }

View File

@@ -33,5 +33,6 @@ class AdminerTableIndexesStructure extends Adminer\Plugin {
'pl' => array('' => 'Rozszerzona tabela wyników struktury indeksów'), 'pl' => array('' => 'Rozszerzona tabela wyników struktury indeksów'),
'ro' => array('' => 'Ieșirea expandată a structurii indecsilor tabelului'), 'ro' => array('' => 'Ieșirea expandată a structurii indecsilor tabelului'),
'ja' => array('' => 'テーブルのインデックス構造を拡張表示'), 'ja' => array('' => 'テーブルのインデックス構造を拡張表示'),
'hr' => array('' => 'Prošireni prikaz indeksa tablice'),
); );
} }

View File

@@ -44,5 +44,6 @@ class AdminerTableStructure extends Adminer\Plugin {
'pl' => array('' => 'Rozszerzone wyjście struktury tabeli'), 'pl' => array('' => 'Rozszerzone wyjście struktury tabeli'),
'ro' => array('' => 'Ieșirea expandată a structurii tabelei'), 'ro' => array('' => 'Ieșirea expandată a structurii tabelei'),
'ja' => array('' => 'テーブル構造を拡張表示'), 'ja' => array('' => 'テーブル構造を拡張表示'),
'hr' => array('' => 'Prošireni prikaz strukture tablice'),
); );
} }

View File

@@ -85,5 +85,9 @@ sessionStorage && document.addEventListener('DOMContentLoaded', () => {
'ja' => array( 'ja' => array(
'' => 'テーブル一覧をテーブル名でフィルタリング', '' => 'テーブル一覧をテーブル名でフィルタリング',
), ),
'hr' => array(
'' => 'Filtriranje tablice prema imenu',
'Filter' => 'Filtar',
),
); );
} }

View File

@@ -50,5 +50,10 @@ class AdminerTimeout extends Adminer\Plugin {
'Queries timeout' => 'Timeout dotazů', 'Queries timeout' => 'Timeout dotazů',
'seconds' => 'sekund', 'seconds' => 'sekund',
), ),
'hr' => array(
'' => 'Postavljanje vremenskog ograničenja upita',
'Queries timeout' => 'Vremensko ograničenje upita',
'seconds' => 'sekundi',
),
); );
} }

View File

@@ -73,5 +73,6 @@ qs('#form').onsubmit = () => {
'pl' => array('' => 'Edytuj wszystkie pola zawierające "_html" za pomocą edytora HTML TinyMCE i wyświetl kod HTML w wybranych'), 'pl' => array('' => 'Edytuj wszystkie pola zawierające "_html" za pomocą edytora HTML TinyMCE i wyświetl kod HTML w wybranych'),
'ro' => array('' => 'Editați toate câmpurile care conțin "_html" cu ajutorul editorului HTML TinyMCE și afișați HTML-ul în select'), 'ro' => array('' => 'Editați toate câmpurile care conțin "_html" cu ajutorul editorului HTML TinyMCE și afișați HTML-ul în select'),
'ja' => array('' => '列名が "_html" を含む列を TinyMCE の HTML エディタで編集し、編集結果の HTML コードを "選択" 画面に表示'), 'ja' => array('' => '列名が "_html" を含む列を TinyMCE の HTML エディタで編集し、編集結果の HTML コードを "選択" 画面に表示'),
'hr' => array('' => 'Uređuje sva polja koja sadrže "_html" pomoću HTML editora TinyMCE i prikazuje HTML u ispisu'),
); );
} }

View File

@@ -57,5 +57,6 @@ class AdminerTranslation extends Adminer\Plugin {
'pl' => array('' => 'Przetłumacz wszystkie komentarze do tabeli i pól, wartości enum i set z tabeli "translation" (automatycznie wstawia nowe tłumaczenia)'), 'pl' => array('' => 'Przetłumacz wszystkie komentarze do tabeli i pól, wartości enum i set z tabeli "translation" (automatycznie wstawia nowe tłumaczenia)'),
'ro' => array('' => 'Traduceți toate comentariile tabelelor și câmpurilor, valorile enum și set din tabelul "translation" (inserează automat noi traduceri)'), 'ro' => array('' => 'Traduceți toate comentariile tabelelor și câmpurilor, valorile enum și set din tabelul "translation" (inserează automat noi traduceri)'),
'ja' => array('' => 'テーブル "translation" を用いてすべてのテーブルや列のコメント、列挙型、セット値を翻訳 (自動的に翻訳文で更新)'), 'ja' => array('' => 'テーブル "translation" を用いてすべてのテーブルや列のコメント、列挙型、セット値を翻訳 (自動的に翻訳文で更新)'),
'hr' => array('' => 'Prevodi sve komentare tablica i polja, vrijednosti enum i set iz tablice "translation" (automatski ubacuje nove prijevode)'),
); );
} }

View File

@@ -34,5 +34,6 @@ verifyVersion = current => {
'de' => array('' => 'Neue Versionen von GitHub verifizieren'), 'de' => array('' => 'Neue Versionen von GitHub verifizieren'),
'ja' => array('' => 'GitHub の新版を管理'), 'ja' => array('' => 'GitHub の新版を管理'),
'pl' => array('' => 'Weryfikuj nowe wersje z GitHuba'), 'pl' => array('' => 'Weryfikuj nowe wersje z GitHuba'),
'hr' => array('' => 'Provjera novih verzija s GitHuba'),
); );
} }

View File

@@ -18,5 +18,6 @@ class AdminerVersionNoverify extends Adminer\Plugin {
'pl' => array('' => 'Wyłącz sprawdzanie wersji'), 'pl' => array('' => 'Wyłącz sprawdzanie wersji'),
'ro' => array('' => 'Dezactivați verificatorul de versiuni'), 'ro' => array('' => 'Dezactivați verificatorul de versiuni'),
'ja' => array('' => 'バージョンチェックを無効化'), 'ja' => array('' => 'バージョンチェックを無効化'),
'hr' => array('' => 'Onemogućuje provjeru novih verzija'),
); );
} }