1
0
mirror of https://github.com/vrana/adminer.git synced 2025-08-29 09:10:09 +02:00

Compare commits

...

2010 Commits

Author SHA1 Message Date
Jakub Vrana
dcf11d8fc9 PgSQL <11: Fix error in table list (fix #1128) 2025-08-04 07:46:14 +02:00
Jakub Vrana
0de6a057d3 PgSQL <10: Don't try partitions 2025-08-04 07:44:46 +02:00
Jakub Vrana
18b62aba38 Fix typo (fix #1137) 2025-08-02 08:24:00 +02:00
Jakub Vrana
10ff74552d PostgreSQL: Quote edit value with interval operator 2025-07-29 16:47:47 +02:00
Jakub Vrana
f5c7ab54f7 Update JUSH 2025-07-29 11:05:25 +02:00
Jakub Vrana
cc110c448c Plugins: PHP 5 compatibility (fix #1125) 2025-07-28 22:46:31 +02:00
Jakub Vrana
6f766f8c52 PostgreSQL: Limit dollar-quoted strings 2025-07-16 11:16:58 +02:00
Jakub Vrana
9a60d158f1 Increase routine textarea size 2025-07-07 15:22:46 +02:00
Jakub Vrana
6dec0d63b0 New plugin: Specify query timeout 2025-07-07 15:21:02 +02:00
Jakub Vrana
c9a52cd28c Link routines from syntax highlighting 2025-07-07 15:06:41 +02:00
Jakub Vrana
9424b7431e Elastic: Avoid extra newline 2025-07-07 15:06:41 +02:00
Jakub Vrana
35b2b969be Save vertical real estate 2025-06-28 18:04:30 +02:00
Jakub Vrana
165f1b241c AdminerBackwardKeys: Work with null ns in non-PgSQL 2025-06-28 11:31:05 +02:00
Jakub Vrana
4d75f822e9 PostgreSQL: Shorten values in hstore columns 2025-06-25 18:39:32 +02:00
Jakub Vrana
5e9c185596 Display data length and index length for materialized views 2025-06-25 18:38:34 +02:00
Jakub Vrana
cfd69dfd8c Trigger script=db sooner 2025-06-25 17:15:34 +02:00
Jakub Vrana
1fc5acb389 AdminerBackwardKeys: Skip relations without selected column 2025-06-25 14:57:35 +02:00
Jakub Vrana
8ca0e36970 AdminerBackwardKeys: Link only tables in the same schema 2025-06-25 14:52:12 +02:00
Jakub Vrana
9e8de24e3d Fix a typo 2025-06-25 14:39:55 +02:00
Jakub Vrana
4cb09852e3 Display @ after username without server in existing logins 2025-06-23 19:08:55 +02:00
Jakub Vrana
e115dccdae MariaDB: Parse COLLATE in routine definition (fix #1104) 2025-06-19 10:03:39 +02:00
Jakub Vrana
1ba410cad1 MySQL: Simplify routines() 2025-06-19 09:56:36 +02:00
Jakub Vrana
0764a20a19 New plugin: Display row numbers in select (fix #1106) 2025-06-19 09:35:01 +02:00
Jakub Vrana
b2c4574325 AdminerBackwardKeys: Strip table prefix 2025-06-19 09:25:03 +02:00
Jakub Vrana
466eceff40 Rename highlight plugins 2025-06-19 09:12:48 +02:00
Jakub Vrana
27c5f6d21b AdminerBackwardKeys: Support PostgreSQL 2025-06-18 18:21:38 +02:00
Jakub Vrana
2744538c8c Fix type error in multiple database export (fix #1109) 2025-06-18 10:40:06 +02:00
Matthaiks
41456c9eb7 Update Polish translation 2025-06-18 10:04:38 +02:00
Jakub Vrana
9745c12769 AdminerSqlGemini: Remove extra comments (fix #1075) 2025-06-18 09:36:17 +02:00
Jakub Vrana
f24f72ac51 Allow exporting SQL in SQL command (fix #1092) 2025-06-18 09:19:15 +02:00
Jakub Vrana
2b52a9b653 PostgreSQL: Allow comparing json columns (fix #1107) 2025-06-18 09:00:34 +02:00
Jakub Vrana
9ba4b86916 AdminerTablesFilter: Add title 2025-06-18 08:08:54 +02:00
Jakub Vrana
1cc3fdf915 Add section links in database overview 2025-06-11 19:33:07 +02:00
Jakub Vrana
b960c41d63 Elastic: Display indexes in alias (unused for now) 2025-06-11 15:16:19 +02:00
Jakub Vrana
3ec750ef7e Hide view links without view support 2025-06-11 15:16:17 +02:00
Jakub Vrana
737b631dda Elasticsearch: Support dropping aliases 2025-06-11 08:45:21 +02:00
Jakub Vrana
8fc450946c Driver plugins: Readme 2025-06-11 08:16:57 +02:00
Jakub Vrana
e282d6eb89 PostgreSQL: Display index expressions 2025-06-06 10:42:20 +02:00
Jakub Vrana
86ffeb2a1e PostgreSQL: Add SQL operator to select 2025-06-06 10:19:24 +02:00
Jakub Vrana
31530ba03e Do not order descending in GROUP BY select 2025-06-05 10:26:11 +02:00
Jakub Vrana
146d3539d8 Warn about exceeded max_file_uploads in import 2025-06-04 14:04:24 +02:00
Jakub Vrana
04068a631e Allow null value in where_link() 2025-06-03 16:17:55 +02:00
Jakub Vrana
4698686232 PostgreSQL: Hide only partitions, not all inherited tables from menu 2025-06-03 15:05:12 +02:00
Jakub Vrana
57b6afc8cb Fix heading of inherited tables 2025-06-03 14:40:08 +02:00
Jakub Vrana
e589c80f42 PostgreSQL: Show structure of inherited tables 2025-06-03 14:33:30 +02:00
Ludek Benedik
acfebf1788 Plugins pretty-json-column: Encode value to JSON without white spaces 2025-05-30 14:02:18 +02:00
Jakub Vrana
246c3c489b MySQL 5.0-: Do not load partitioning info in alter table (fix #1099) 2025-05-30 13:28:28 +02:00
yamamoto
92b95606c1 Updates Japanese translation (#1096) 2025-05-27 16:28:59 +02:00
Jakub Vrana
ac8318f387 PostgreSQL 11-: Avoid duplicate oid in table status (fix #1089) 2025-05-27 13:58:22 +02:00
Maxim Milovanov
d1c2679acd Add Win98-style design theme 2025-05-27 13:58:19 +02:00
Jakub Vrana
caf6e495dc Update externals 2025-05-27 10:37:12 +02:00
salacr
ec5ad85470 Make kill_process / process_list extendable 2025-05-07 08:29:43 +02:00
Jakub Vrana
307fabaf22 Allow specifying operator in search anywhere 2025-05-05 09:56:59 +02:00
schucan
1862b84612 Mute chmod warning 2025-05-05 08:05:36 +02:00
Jakub Vrana
e76be9f890 Develop 2025-05-05 08:04:55 +02:00
Jakub Vrana
1cfc8451ef Release 5.3.0 2025-05-04 18:30:08 +02:00
Jakub Vrana
62a9cf3e3f Editor: Fix bit edit 2025-05-04 15:20:11 +02:00
Jakub Vrana
e707c7a5f4 Editor: Fix bit and enum search (fix #1062) 2025-05-04 15:20:11 +02:00
Alex Yu
c92b127b56 Add lavender-light theme 2025-05-04 15:20:09 +02:00
Pexle Chris
cf52c4c0a8 AdminerDarkSwitcher: Handle first click
Fixed an issue where the Dark Mode Switcher icon did not respond on the first click if the Dark Mode cookie had not been set yet. Now, clicking the icon correctly sets the cookie and immediately toggles Dark Mode.
2025-05-04 13:10:38 +02:00
Jakub Vrana
5f7fb62803 PostgreSQL: Add NOT ILIKE operator (fix #1066) 2025-05-04 13:03:47 +02:00
Jakub Vrana
9b0acfa7c9 PostgreSQL: Align numbers in SQL command right (fix #1071) 2025-05-04 13:03:47 +02:00
Jakub Vrana
45d61803c4 Align money values right (bug #1071) 2025-05-04 13:03:47 +02:00
Jakub Vrana
48160f2cd7 Add border to column actions (fix #1072) 2025-05-04 13:03:46 +02:00
Jakub Vrana
61f2b370df AdminerSelectEmail: Use Adminer translation 2025-04-26 05:53:10 +02:00
Jakub Vrana
e13910b5c5 AdminerSelectEmail: Wrap long lines 2025-04-26 05:51:07 +02:00
Jakub Vrana
de86789bfc Indexes: Link algorithm doc 2025-04-26 05:43:25 +02:00
Jakub Vrana
ebcf4feeb2 Use variable 2025-04-26 05:31:48 +02:00
Jakub Vrana
d881f51deb MySQL: Fix connecting with port (fix #1057, regression from 5.1.1) 2025-04-24 22:31:03 +02:00
Matthaiks
b9c39e77fc Update Polish translation 2025-04-24 16:20:16 +02:00
salacr
c734deca84 PostgreSQL: Partial Indexes 2025-04-24 11:39:59 +02:00
Jakub Vrana
1466051402 Fix type error in Create function (fix #1053) 2025-04-21 08:36:32 +02:00
Joshi yogesh
36e55a3f55 Add Hindi translations for previously untranslated strings (#1052) 2025-04-19 20:05:11 +02:00
Joshi yogesh
155668906d Add Bengali (bn) translations for missing phrases (#1051) 2025-04-18 23:00:45 +02:00
Jakub Vrana
70ce02a798 AdminerTableIndexesStructure: Print algorithm 2025-04-18 15:00:08 +02:00
Jakub Vrana
de3220acc7 MySQL: Hide index algorithm if only one 2025-04-18 14:58:41 +02:00
Jakub Vrana
1030e84904 CSS: Remove icon padding on iOS 2025-04-18 14:37:16 +02:00
Jakub Vrana
f4ca974623 Add forgotten move_col 2025-04-18 06:53:03 +02:00
Jakub Vrana
af627e7116 AdminerForeignSystem: Link pg_catalog 2025-04-17 19:57:14 +02:00
Jakub Vrana
0c5bba47da non-MySQL: Fix computing unique array 2025-04-17 18:07:23 +02:00
Jakub Vrana
e340a2973e Select: Align numeric functions right 2025-04-17 18:00:49 +02:00
Jakub Vrana
be2afb49c5 PostgreSQL: Link COUNT(*) 2025-04-17 17:46:43 +02:00
Jakub Vrana
c8fa515ed5 CSS: Switch between independent adminer[-dark].css 2025-04-17 17:23:57 +02:00
Jakub Vrana
3dad86d279 Plugins: Allow setting dark mode in css() (bug #1049) 2025-04-17 16:58:58 +02:00
Jakub Vrana
d9c1ac00f3 Extract variable 2025-04-17 15:38:16 +02:00
Jakub Vrana
2a4d2cfb39 Fix typo in comment 2025-04-17 15:34:20 +02:00
Jakub Vrana
67a64c8d72 JUSH: PostgreSQL keywords, autocomplate table aliases 2025-04-17 14:26:55 +02:00
Jakub Vrana
d59d6c4075 MySQL: Support index algorithms with MEMORY and NDB engines 2025-04-17 10:54:04 +02:00
Jakub Vrana
dbec3a1b92 Pass $tableStatus to indexMethods, rename 2025-04-17 10:22:32 +02:00
Jakub Vrana
a93f0003ae MySQL: Remove negation from support() 2025-04-17 10:06:56 +02:00
Jakub Vrana
29a31c6b9c Lang: Use GLOB_BRACE 2025-04-17 08:49:53 +02:00
Joshi yogesh
a04823f4c4 Add Hindi (hi) language translation file for Adminer
This commit adds a new Hindi (hi) translation file for Adminer, based on the existing Bengali (bn) language file.

All interface strings have been translated from Bengali to Hindi to make Adminer more accessible to Hindi-speaking users. The structure of the file follows the format used in other language files within the repository.

The translations were carefully reviewed to ensure accuracy, readability, and consistency with the context of the Adminer application.

File added:
- lang/hi.inc.php

Looking forward to your feedback and happy to make any improvements as needed!
2025-04-17 08:43:05 +02:00
Jakub Vrana
82c544514d Move translation 2025-04-17 08:39:00 +02:00
salacr
7185d7854f Add PHP_CodeSniffer to pipeline (#1044) 2025-04-17 08:31:05 +02:00
Matthaiks
d845d4b358 Update Polish translation 2025-04-17 08:27:48 +02:00
salacr
92ce506243 PostgreSQL: Support index algorithms 2025-04-16 09:22:28 +02:00
Jakub Vrana
6d6998c3d3 PostgreSQL: Support calling functions returning table (fix #1040) 2025-04-15 23:22:36 +02:00
Jakub Vrana
45799f4605 AdminerSqlLog: Store schema 2025-04-15 22:47:48 +02:00
Jakub Vrana
b999f123c8 Swap ' and " 2025-04-15 21:59:41 +02:00
Jakub Vrana
7642b00877 Designs: Don't sniff protocol-relative URLs 2025-04-15 21:43:18 +02:00
Jakub Vrana
45be56e4e1 Add todo 2025-04-15 21:38:29 +02:00
Jakub Vrana
e1b92f73aa Issues: Link Docker image repo 2025-04-15 16:43:58 +02:00
Jakub Vrana
63850ebf19 CSS: Highlight anchor 2025-04-15 09:48:33 +02:00
Jakub Vrana
49fd96f8b9 PostgreSQL: Display partition info (bug #1031) 2025-04-15 08:58:24 +02:00
Matthaiks
fcae403f60 Update Polish translation 2025-04-15 08:40:48 +02:00
Jakub Vrana
7dc152b732 CockroachDB: Partitioning 2025-04-15 07:18:22 +02:00
Jakub Vrana
29f7b2df96 Tests PostgreSQL: Partitioning 2025-04-15 06:51:13 +02:00
Jakub Vrana
3466ab730b Partitioning: Compact array earlier 2025-04-15 06:46:23 +02:00
Jakub Vrana
9235cb8350 Doc: Update 2025-04-15 06:20:13 +02:00
Jakub Vrana
020285772b MySQL: Avoid warning on selecting tables with fulltext indexes (fix #1036) 2025-04-14 17:52:55 +02:00
Jakub Vrana
8238838285 Bug template: offer single language 2025-04-14 17:45:47 +02:00
Jakub Vrana
a165d4ed81 PostgreSQL: Export PARTITION BY (bug #1031) 2025-04-14 16:41:31 +02:00
Jakub Vrana
f5b42eae55 PostgreSQL: Allow renaming inherited tables 2025-04-14 16:03:44 +02:00
Jakub Vrana
460a24ea2d PostgreSQL: Creating partitioned tables (fix #1031) 2025-04-14 15:50:17 +02:00
Jakub Vrana
4646298015 Partitioning: Move to MySQL 2025-04-14 15:33:58 +02:00
Jakub Vrana
cde6b9008c Move partitioning functions 2025-04-14 13:54:20 +02:00
Jakub Vrana
8783f4d3ac PostgreSQL: Include inherited tables in table_status (bug #1031) 2025-04-14 13:13:08 +02:00
Jakub Vrana
3d2395fc59 Remove unnecessary aliases 2025-04-14 12:41:36 +02:00
Jakub Vrana
3a73815ba4 Do not attempt allFields without DB (fix #1033) 2025-04-14 09:21:51 +02:00
Jakub Vrana
d0a2de53ef Bug template: Ask for more info 2025-04-14 08:50:17 +02:00
Jakub Vrana
982233d7e5 Code style: Ignore long translations 2025-04-14 07:58:29 +02:00
salacr
cedfe97f40 Generic.Whitespace -> Generic.WhiteSpace 2025-04-14 07:56:56 +02:00
Jakub Vrana
9beb72edc2 PostgreSQL: Simplify OID 2025-04-13 22:42:05 +02:00
Jakub Vrana
9555c96d6a PostgreSQL: Link parent from inherited tables (bug #1031) 2025-04-13 16:59:16 +02:00
Jakub Vrana
a3d0bbba8f Compile: Fix type (fix #1027) 2025-04-13 16:36:15 +02:00
Jakub Vrana
a9bcde334f PostgreSQL: Move partitioned tables from table list to parent table (bug #1031) 2025-04-13 16:36:10 +02:00
Jakub Vrana
a735b795b2 PostgreSQL: Show partitioned tables as tables, not views (bug #1031) 2025-04-13 14:05:54 +02:00
Jakub Vrana
008cd33058 Designs: adminer.css with 'prefers-color-scheme: dark' don't disable dark mode (fix #1009) 2025-04-13 11:44:58 +02:00
Jakub Vrana
036ce4f1c5 Handle unloaded driver plugins 2025-04-13 08:31:56 +02:00
Jakub Vrana
5867b0724f Plugins: Method bodyClass() to add <body class> (fix #309) 2025-04-13 08:24:16 +02:00
Jakub Vrana
71f2578af6 Driver plugins: Show possible extensions 2025-04-12 09:01:30 +02:00
Jakub Vrana
c809216a56 Develop 2025-04-11 22:27:01 +02:00
Jakub Vrana
eb43ea3025 Release 5.2.1 2025-04-11 22:26:41 +02:00
Jakub Vrana
2ba833409a non-MySQL: Parse '--' without trailing space as comment in SQL command (fix #1025, regression from 5.2.0) 2025-04-11 22:15:14 +02:00
Jakub Vrana
5eaaa498d3 PostgreSQL PDO: Fix bytea without primary key (fix #1021) 2025-04-11 15:29:59 +02:00
Jakub Vrana
746c0a7b0b Update JUSH 2025-04-11 14:53:33 +02:00
Jakub Vrana
b30526213d Lang: Display line of the update 2025-04-10 19:04:06 +02:00
Jakub Vrana
6819815b88 Don't display Loaded plugins with only driver plugins 2025-04-10 18:56:38 +02:00
Jakub Vrana
a83626c8af Fix import without primary key (fix #1017, regression from 5.1.1) 2025-04-10 17:58:22 +02:00
Jakub Vrana
d4ddbc0639 Import: Add margin (fix #1012) 2025-04-10 17:32:03 +02:00
Jakub Vrana
a6cb91f0d2 AdminerLoginOtp: Translate 2025-04-09 08:05:06 +02:00
Jakub Vrana
78d3ce830d Do not highlight table 0 as active 2025-04-09 06:27:09 +02:00
Jakub Vrana
88099b7dd7 Code style: Fix 2025-04-08 21:26:08 +02:00
Jakub Vrana
8bce359fae Fix search anywhere (fix #1004, regression from 5.1.1) 2025-04-08 20:41:44 +02:00
Jakub Vrana
8ca7066625 AdminerMenuLinks: Translation in single language version (fix #1001) 2025-04-08 20:11:47 +02:00
Jakub Vrana
51bcc2a064 Develop 2025-04-08 18:29:13 +02:00
Jakub Vrana
588af652d4 Release 5.2.0 2025-04-08 18:28:50 +02:00
Jakub Vrana
b0c345f9be Update Poslish translations 2025-04-08 17:03:02 +02:00
Jakub Vrana
b2677187f1 Autocomplete: Populate only on pages where useful 2025-04-08 16:57:25 +02:00
Jakub Vrana
52ee085ca7 Update German translation (bug #1001) 2025-04-08 14:33:58 +02:00
Jakub Vrana
00459b302a Translations: Remove trailing fullstops 2025-04-08 13:49:21 +02:00
Jakub Vrana
17598c7ab3 Fix typo in translation 2025-04-08 13:47:36 +02:00
Jakub Vrana
b489cec651 Remove doubled spaces 2025-04-08 13:36:26 +02:00
Jakub Vrana
6da8bb670a Plugins: Compatibility with PHP 5 2025-04-08 13:14:32 +02:00
Takashi SHIRAI
e601a3d8ce Update Japanese translation
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-04-08 13:10:05 +02:00
Jakub Vrana
efde7fcc6c Lang: Non-static $translations 2025-04-08 13:06:27 +02:00
Jakub Vrana
91b3526e8d Plugins: non-static $translations (fix #1000)
The main reason is that static properties are minified.
2025-04-08 12:57:03 +02:00
Jakub Vrana
a3ddd59015 Update externals 2025-04-08 12:54:06 +02:00
Jakub Vrana
7908d86c9f Doc: Plugin translations 2025-04-08 11:00:31 +02:00
Jakub Vrana
0cb41c63c7 Compile: Ignore $this->lang 2025-04-07 21:35:25 +02:00
Jakub Vrana
50de50571d AdminerSqlGemini: Version in User-Agent 2025-04-07 21:27:33 +02:00
Jakub Vrana
de38cb65b6 Designs: Fix logout background 2025-04-07 21:16:30 +02:00
Jakub Vrana
e6cc8bf91e AdminerConfig: Move link (fix #995) 2025-04-07 20:55:01 +02:00
Jakub Vrana
be6cf07d26 Foreign key: Avoid extra newline in error 2025-04-07 19:59:53 +02:00
Jakub Vrana
3f979793f7 Fix foreign key actions (regression from 5.1.1)
https://github.com/vrana/adminer/discussions/969#discussioncomment-12752117
2025-04-07 19:51:43 +02:00
Jakub Vrana
c8878d1652 CSS: Avoid footer shadow over text 2025-04-07 19:24:33 +02:00
Jakub Vrana
bf24198e68 Plugins: Link screenshot 2025-04-07 19:18:43 +02:00
Jakub Vrana
e33ead15e5 AdminerPlugin: Delete 2025-04-07 18:55:14 +02:00
Jakub Vrana
1087d55913 AdminerDotJs: Translate description 2025-04-07 18:53:38 +02:00
Jakub Vrana
38bdd0a961 lang.php: Add translation of plugin description 2025-04-07 18:26:31 +02:00
Jakub Vrana
3dd040abd1 Plugins: Translate descriptions (fix #994) 2025-04-07 18:26:28 +02:00
Jakub Vrana
3e455a4787 Plugins: Extend Adminer\Plugin 2025-04-07 17:02:16 +02:00
Jakub Vrana
95f14bca56 Plugins: Allow providing description 2025-04-07 15:54:31 +02:00
Jakub Vrana
121b77e866 Update German translation (bug #994) 2025-04-07 15:37:08 +02:00
Jakub Vrana
41c71f8854 Plugins: Defer syntax highlighting 2025-04-07 14:58:19 +02:00
Jakub Vrana
b0e5c1d6e4 Defer syntax highlighting 2025-04-07 14:58:19 +02:00
Jakub Vrana
7d3d46e509 Add driver plugins readme 2025-04-07 12:51:10 +02:00
Jakub Vrana
9bd23b1395 Compress served static files 2025-04-07 12:46:15 +02:00
Jakub Vrana
93f8a0e7ed Compress HTML by default 2025-04-07 12:33:51 +02:00
Jakub Vrana
e6810258bd Accessibility: Use <option>(label) as label 2025-04-07 11:43:52 +02:00
Jakub Vrana
aac223e279 Accessibility: Add <label> to <select> 2025-04-07 11:32:22 +02:00
Jakub Vrana
75f9aa9e7d Compile: JUSH autocomplete 2025-04-07 11:13:28 +02:00
Jakub Vrána
05170899dc Update PayPal link 2025-04-07 09:10:40 +02:00
Jakub Vrana
69890ffc48 Driver plugins: Compatibility with compiled version 2025-04-07 07:53:42 +02:00
Jakub Vrana
025d77c7c6 Move comment 2025-04-07 06:48:49 +02:00
Jakub Vrana
de95807eaf CSS: Fix typo 2025-04-06 17:12:36 +02:00
Jakub Vrana
833fa22e3f Update comment 2025-04-06 16:41:25 +02:00
Jakub Vrana
9e0aa1b91a Update translations in plugins 2025-04-06 16:36:10 +02:00
Jakub Vrana
f2e1243fb7 Generalize updating translations 2025-04-06 16:36:10 +02:00
Jakub Vrana
0d683fd57c CSS: Add --dim variable 2025-04-06 16:36:10 +02:00
Matthaiks
9683342792 Add Polish translation 2025-04-06 16:36:03 +02:00
Matthaiks
cdd8448908 Update Polish translation 2025-04-06 14:51:56 +02:00
Jakub Vrana
3578517e15 CSS: Add background to logout (fix #987)
Also simplify shadows which might fix #986.
2025-04-06 14:39:03 +02:00
Jakub Vrana
2d853b633a AdminerMenuLinks: Use more descriptive labels 2025-04-06 08:24:18 +02:00
Jakub Vrana
089093d4b1 AdminerConfig: Support permalinks 2025-04-06 08:15:20 +02:00
Jakub Vrana
39b977bd80 AdminerConfig: Configure using adminer.css 2025-04-06 08:15:18 +02:00
Jakub Vrana
0aff6e06a6 Highlight current table in menu when editing Check 2025-04-06 07:29:23 +02:00
Jakub Vrana
b36bd12291 Use plural for index columns 2025-04-06 07:29:23 +02:00
Jakub Vrana
fb32c10f94 Plugins: Move lang() to Adminer\Plugin 2025-04-06 07:29:23 +02:00
Jakub Vrana
7ff1d82903 New plugin: Configure menu table links 2025-04-06 07:29:23 +02:00
Jakub Vrana
cca943015f New plugin: Configure options by end-users and store them to a cookie 2025-04-06 07:29:16 +02:00
Jakub Vrana
48f82b3454 Move loaded plugins down (dg/adminer#49) 2025-04-05 23:03:42 +02:00
Jakub Vrana
91d43b574b Designs: Add default dark 2025-04-05 07:28:57 +02:00
Jakub Vrana
6258c975c1 Designs: Adapt to iPad 2025-04-05 07:04:00 +02:00
Jakub Vrana
e12d12524f CSS: Display menu on modern iPads (fix #985)
https://www.ios-resolution.com/
2025-04-04 22:23:40 +02:00
Jakub Vrana
a43a9fbd52 Designs: Fix on mobile (fix #985) 2025-04-04 20:54:26 +02:00
Jakub Vrana
79ae6d8541 Designs: Fix logo 2025-04-04 19:54:12 +02:00
Richard Kapička
60ea595cdc Wrap Loaded plugins into div 2025-04-04 19:38:46 +02:00
Jakub Vrana
ebd2e4f5b4 MS SQL: Limit one INSERT in export to 1000 rows (fix #983) 2025-04-04 19:13:03 +02:00
Jakub Vrana
806efe5e2d AdminerSqlGemini: Add Czech translation 2025-04-04 18:52:18 +02:00
Jakub Vrana
54d3239cfb Editor: Do not remove .icon-move 2025-04-04 18:31:17 +02:00
Jakub Vrana
7198ad5229 Anchor Logout button to body, not to viewport (bug #979)
This reverts commit e277d05162.
2025-04-04 18:27:45 +02:00
Jakub Vrana
01d8fe112c Do not include compiled logo twice 2025-04-04 17:44:58 +02:00
Jakub Vrana
510cd2e068 Move comment 2025-04-04 17:34:18 +02:00
Jakub Vrana
7dbd929600 CSS: Link logo 2025-04-04 17:29:14 +02:00
Jakub Vrana
6c9ac63508 Editor: Split sending e-mails to a plugin 2025-04-04 17:26:56 +02:00
Jakub Vrana
ab0dc19c9f Plugins: Allow formatting translations using Adminer\lang_format() 2025-04-04 17:18:34 +02:00
Jakub Vrana
4aa7647a55 Use LANG instead of get_lang() 2025-04-04 17:18:34 +02:00
Jakub Vrana
db2709d15a Update Spanish translation 2025-04-04 16:14:54 +02:00
Jakub Vrana
5f5d114dac Add missing space 2025-04-04 09:32:54 +02:00
Jakub Vrana
dadaa02b52 Update German translation (fix #981) 2025-04-04 09:30:56 +02:00
Jakub Vrana
e277d05162 CSS: Move Logout on mobile (fix #979) 2025-04-04 09:28:28 +02:00
Jakub Vrana
ef3946ee52 CSS: Align logo with menu 2025-04-04 08:41:55 +02:00
Jakub Vrana
57f6d296fb CSS: Match -dark only in filename 2025-04-04 08:39:40 +02:00
Jakub Vrana
bd35de5a6b Designs: Remove duplicate logo 2025-04-04 08:34:55 +02:00
Jakub Vrana
64816a3d7a CSS: Inlline icon 2025-04-04 08:02:36 +02:00
Jakub Vrana
6e8c89ee71 CSS: Add logo 2025-04-04 07:59:17 +02:00
Jakub Vrana
3f6136205d CSS: Add border-radius to fieldset (fix #980) 2025-04-03 23:17:02 +02:00
Jakub Vrana
1500a3f2c8 Mobile: Move menu 1px up (fix #976) 2025-04-03 22:11:22 +02:00
Jakub Vrana
63236ea5d1 Mobile: Add shadow to menu (fix #975) 2025-04-03 22:07:42 +02:00
Jakub Vrana
c6398736ac Update JUSH 2025-04-03 22:01:19 +02:00
Jakub Vrana
dc25ccec0d Tests: Search in tables 2025-04-03 18:46:10 +02:00
Jakub Vrana
364d18f166 AdminerSqlGemini: Display errors 2025-04-03 17:43:27 +02:00
Matrixman
e7c2d09fa8 New version of design rmSOFT 2025-04-03 16:24:43 +02:00
Jakub Vrana
646af54e7b Fix type for search anywhere (fix #973) 2025-04-03 16:05:52 +02:00
Jakub Vrana
96191587cc New plugin: Set up driver, server and database in Adminer Editor 2025-04-03 15:50:30 +02:00
Jakub Vrana
dea16493ff Editor: Fix SQLite example 2025-04-03 15:20:39 +02:00
Jakub Vrana
d7c14b16b1 Autocomplete SQL commands 2025-04-03 15:10:22 +02:00
Jakub Vrana
986433dd3a Changes: Improve message 2025-04-03 12:07:46 +02:00
Jakub Vrana
a70089f8ce PostgreSQL: Support COPY FROM stdin in SQL query (fix #942) 2025-04-03 11:41:43 +02:00
Jakub Vrana
49eefa2585 Call credentials() from connect() 2025-04-03 10:23:31 +02:00
Jakub Vrana
3693992650 non-MySQL: Parse '--' as comment in SQL command (bug SF-842) 2025-04-03 09:17:55 +02:00
Jakub Vrana
30847c97eb Do not edit NULL values by Modify (fix #967) 2025-04-03 08:57:49 +02:00
Jakub Vrana
9b179bca21 AdminerSqlGemini: Add default key 2025-04-03 08:28:02 +02:00
Jakub Vrana
ce03585210 MySQL: Display number of found rows in group queries (regression from 5.1.1) 2025-04-02 21:32:28 +02:00
Jakub Vrana
22dc4ff444 SQLite: Add missing border to Status 2025-04-02 21:12:48 +02:00
Jakub Vrana
2b6a262d56 Develop 2025-04-02 19:56:59 +02:00
Jakub Vrana
5fdcfd0978 Release 5.1.1 2025-04-02 19:56:11 +02:00
Jakub Vrana
5b7dfbec11 Select: Allow ordering by COUNT(*) (fix #966, regression from 5.0.2) 2025-04-02 18:01:14 +02:00
Jakub Vrana
76dd19b69f Japanese: Update message 2025-04-02 17:41:40 +02:00
Takashi SHIRAI
104edc75fa Plugins autoloading: Modify the Japanese message.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-04-02 17:35:12 +02:00
Jakub Vrana
bd85f19a44 AdminerBeforeUnload: No error for Ctrl+Enter 2025-04-01 20:56:35 +02:00
Jakub Vrana
2db83e9b8f Fix JS error on Ctrl+Shift+Enter on select= 2025-04-01 20:45:39 +02:00
Jakub Vrana
5e3990e473 Turkish: Fix date hint (thanks Shirai Takashi) 2025-04-01 20:27:37 +02:00
Takashi SHIRAI
3e9d47ad08 Modify the Japanese messages.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-04-01 20:25:11 +02:00
Jakub Vrana
04ed73be26 Explicitly mark nullable params (thanks to @dg) 2025-04-01 19:14:44 +02:00
Jakub Vrana
01ea001f22 Explicitly mark nullable params (thanks to @dg) 2025-04-01 19:09:46 +02:00
Jakub Vrana
634b0aaacf AdminerLoginServers: Add comment (bug #965) 2025-04-01 18:55:34 +02:00
Jakub Vrana
06469660e8 Login: Fix hiding server with AdminerLoginServers 2025-04-01 18:27:04 +02:00
Jakub Vrana
e0629c6445 Fix lang.php 2025-04-01 17:21:32 +02:00
makss
1f58f664ae Update Ukrainian and Russian translation 2025-04-01 17:21:23 +02:00
Jakub Vrana
d9956c8a5c New plugin: Use Monaco Editor for syntax highlighting 2025-04-01 16:37:12 +02:00
Jakub Vrana
a03b05ceb4 AdminerPrism: Add border and resize 2025-04-01 12:31:45 +02:00
Jakub Vrana
b386463dcf AdminerPrism: Use Code Editor for highlighting 2025-04-01 12:10:44 +02:00
Jakub Vrana
954cc17312 AdminerPrism: Add Code Editor 2025-04-01 11:57:50 +02:00
Jakub Vrana
45a68bd6f7 New plugin: Use Prism for syntax highlighting 2025-04-01 10:00:59 +02:00
Jakub Vrana
9ec24b9244 Syntax highlighting: Hook AJAX 2025-04-01 09:52:04 +02:00
Jakub Vrana
717f0b0e10 AdminerCodemirror: Use latest version 2025-04-01 07:33:46 +02:00
Jakub Vrana
a27f0953a6 AdminerCodemirror: Use allFields (bug #962) 2025-03-31 21:45:06 +02:00
Jakub Vrana
177429d59f Optimize retrieving columns for schema 2025-03-31 21:45:06 +02:00
Jakub Vrana
9f3f3b9515 Plugins: Allow changing CSP by more plugins 2025-03-31 20:20:26 +02:00
Jakub Vrana
595c228175 AdminerCodemirror: Use jsDelivr by default 2025-03-31 20:17:30 +02:00
Jakub Vrana
058a9ec2ce Tests: Add comment 2025-03-31 19:42:34 +02:00
Jakub Vrana
7f6ae00b0d AdminerSqlGemini: Empty query 2025-03-31 19:37:27 +02:00
Jakub Vrana
cfde891ea4 Unify textarea highlighting 2025-03-31 19:30:23 +02:00
Jakub Vrana
63ab8561be Auth: Set token after unsuccessful login
Broken by d59830c
2025-03-31 18:40:18 +02:00
Jakub Vrana
5b095e9f4e SQL: Stop session 2025-03-31 18:39:02 +02:00
Jakub Vrana
b2fb3587fd AdminerForeignSystem: Add more views 2025-03-31 18:38:46 +02:00
Jakub Vrana
5cfd3f422c Select: Align numeric null right 2025-03-31 17:14:02 +02:00
Jakub Vrana
eb6b23e014 Fix type when missing $field
This happens e.g. for INNODB_BUFFER_PAGE.IS_STALE which is undeclared but returned.
2025-03-31 17:07:27 +02:00
Jakub Vrana
10bc856ebe Call static method 2025-03-31 12:35:45 +02:00
Jakub Vrana
7dd214a03c Use a helper 2025-03-31 12:24:27 +02:00
Jakub Vrana
2504ea23c4 Tests: Fix MySQL PDO 2025-03-31 11:23:43 +02:00
Jakub Vrana
e6c0c8ab6b Fix type of select_db() 2025-03-31 11:08:37 +02:00
Jakub Vrana
366342985d Tests: Fix generating PDO after c7140c2 2025-03-31 10:50:17 +02:00
Jakub Vrana
27c688b902 SQLite: Do not return unrelated auto_increment 2025-03-31 10:42:53 +02:00
Jakub Vrana
41964badb0 SQLite: Fix type of $auto_increment 2025-03-31 10:42:30 +02:00
Jakub Vrana
c76b4f1805 Update PhpShrink 2025-03-31 10:23:03 +02:00
Jakub Vrana
1b52d3a975 Localize help links 2025-03-31 10:18:17 +02:00
Jakub Vrana
695ce8c4da Use Lang::$translations instead of $translations 2025-03-31 10:18:14 +02:00
Jakub Vrana
30a8c4caca MS SQL: Fix type 2025-03-31 10:09:31 +02:00
Jakub Vrana
21347e6ef5 Initialize optional variable 2025-03-31 10:09:31 +02:00
Jakub Vrana
f2871266ad Tests: Fix 2025-03-31 10:09:31 +02:00
Jakub Vrana
79bebe77ba AdminerForeignSystem: Support new tables 2025-03-31 10:09:30 +02:00
Jakub Vrana
007c97d0d2 Fix converting long values to unique_idf
Found by PHP error: Trying to access array offset on null
2025-03-31 10:09:30 +02:00
Jakub Vrana
b50d19629f PHPStan: Use int for $limit 2025-03-31 10:09:30 +02:00
Jakub Vrana
016c1b2357 PHPStan: Fix types 2025-03-31 10:09:30 +02:00
Jakub Vrana
c05b1ac048 Tests: Add screenshots 2025-03-31 10:09:30 +02:00
Jakub Vrana
c64ee3d907 PostgreSQL: Fix login 2025-03-31 10:09:30 +02:00
Jakub Vrana
b64c80acc9 Schema: Reduce precision to pixels 2025-03-31 10:09:30 +02:00
Matrixman
fa22df0d7f New version of design rmSOFT
New version of design rmSOFT
2025-03-31 10:09:30 +02:00
Jakub Vrana
a93e4cb694 Return Db from connection()
It's not a real type declaration because compile.php passes stdClass here.
2025-03-31 10:09:30 +02:00
Jakub Vrana
7ee6f4f7ac Move connect() to Driver 2025-03-31 10:09:30 +02:00
Jakub Vrana
992561f75e Add comment 2025-03-31 10:09:30 +02:00
Jakub Vrana
65fd673d05 Remove ignored errors 2025-03-31 10:09:30 +02:00
Jakub Vrana
4b262ededa Remove unnecessary braces 2025-03-31 10:09:29 +02:00
Jakub Vrana
0d67bd9eb8 Update docs 2025-03-31 10:09:29 +02:00
Jakub Vrana
9b6943d5af Add helper for $connection2 2025-03-29 22:21:18 +01:00
Jakub Vrana
291ae7f1ac Fix types of $connection2 2025-03-29 22:17:16 +01:00
Jakub Vrana
712d96b22c Use connection() instead of $connection 2025-03-29 22:10:20 +01:00
Jakub Vrana
168ea5ae6d Use driver() instead of $driver 2025-03-29 22:05:31 +01:00
Jakub Vrana
845445baad Use adminer() instead of $adminer 2025-03-29 21:43:29 +01:00
Jakub Vrana
87f149ce1d Move HTML function, fix types 2025-03-29 18:10:32 +01:00
Jakub Vrana
79f5280f3d AdminerCodemirror: Simplify code 2025-03-29 17:50:43 +01:00
Jakub Vrana
82450b1ad2 Changelog: Use bullets 2025-03-29 17:00:15 +01:00
Jakub Vrana
eeb13253a8 Add comment 2025-03-29 16:25:35 +01:00
Jakub Vrana
6a3161cd49 Fix type of permanentLogin() 2025-03-29 15:21:25 +01:00
Jakub Vrana
141db3cb8d Add comment 2025-03-29 15:17:39 +01:00
Jakub Vrana
fd1661d811 Doc: Move type stripping 2025-03-29 15:01:51 +01:00
Jakub Vrana
6ea34e3b9a CSS: Add --fg color 2025-03-29 14:51:25 +01:00
Jakub Vrana
e4ed78ff7a Designs: Define --bg 2025-03-29 13:15:14 +01:00
Jakub Vrana
262366b120 CSS: Use --bg 2025-03-29 11:31:45 +01:00
Jakub Vrana
79fbf9c58a CSS: Hide menu on mobile 2025-03-29 11:11:57 +01:00
Jakub Vrana
6cf3d5d2b8 Inline GIF to CSS 2025-03-29 08:49:51 +01:00
Jakub Vrana
5b329ae720 JUSH: Fix opening help to new window 2025-03-28 23:29:14 +01:00
Jakub Vrana
225b6671c7 Delete function moved to get_val 2025-03-28 23:00:47 +01:00
Jakub Vrana
cec6db144f Compile: Fix single driver 2025-03-28 22:59:58 +01:00
Jakub Vrana
aceb4ce7a5 Move $drivers to SqlDriver 2025-03-28 22:58:32 +01:00
Jakub Vrana
1f88485a3c Rename variable 2025-03-28 22:58:03 +01:00
Jakub Vrana
4e1e638f98 MySQLi: Use default credentials
Accidentally removed by c96894e.
2025-03-28 22:29:00 +01:00
Jakub Vrana
03d0daff5c Remove global $permanent 2025-03-28 22:29:00 +01:00
Jakub Vrana
1eb7538e8c PHPStan: Mute LANG not found 2025-03-28 22:29:00 +01:00
Jakub Vrana
29339c5223 Db: Unify connection error handling 2025-03-28 22:28:52 +01:00
Jakub Vrana
d5bba383ea Check numeric table names after error 2025-03-28 20:45:27 +01:00
Jakub Vrana
d59830c7b2 Delete $has_token 2025-03-28 20:40:28 +01:00
Jakub Vrana
ff37ac1d35 MySQLi: Check for more results (fix #955) 2025-03-28 20:13:06 +01:00
Jakub Vrana
75c94cec6b Fix types 2025-03-28 19:48:25 +01:00
Jakub Vrana
65d97caeb9 Move $error to Adminer::$error 2025-03-28 19:48:23 +01:00
Jakub Vrana
3cfae4b8f4 Pass $error as param 2025-03-28 19:04:13 +01:00
Jakub Vrana
e219ef9ad1 Move $token to get_token() 2025-03-28 19:04:11 +01:00
Jakub Vrana
74457f0895 Move $HTTPS to HTTPS 2025-03-28 18:39:30 +01:00
Jakub Vrana
f6d311457e Move $langs to langs() 2025-03-28 18:39:30 +01:00
Jakub Vrana
adab18da78 Bump Composer PHP version 2025-03-28 18:39:30 +01:00
Jakub Vrana
508baa8c6b Move $LANG and get_lang() to LANG 2025-03-28 18:39:30 +01:00
Jakub Vrana
f0920af6b7 Move $VERSION and version() to VERSION 2025-03-28 18:39:30 +01:00
Jakub Vrana
06f0a926dd Docs: update 2025-03-28 18:39:28 +01:00
Jakub Vrana
81c5ae33ab Docs: wrap 2025-03-28 17:43:13 +01:00
Jakub Vrana
4cbe50fd49 Tests: select with where and order 2025-03-28 17:43:13 +01:00
Jakub Vrana
2396397b75 Elasticsearch: Make it work with Elasticsearch 8 2025-03-28 17:43:11 +01:00
Jakub Vrana
bd823716fc Elastic: Fix types 2025-03-28 16:17:26 +01:00
Jakub Vrana
7a19fa67fd Integrate Db::result in get_val 2025-03-28 15:41:38 +01:00
Jakub Vrana
195341d075 Split editFunctions 2025-03-28 15:41:38 +01:00
Jakub Vrana
46f6a96c95 Doc-comments: Fix type errors 2025-03-28 15:41:36 +01:00
Jakub Vrana
dc38a7ded3 Plugins: Move operators to a method 2025-03-28 14:30:00 +01:00
Jakub Vrana
c7140c2158 Tests: Run from /adminer/
To run them on the compiled version, rename adminer.php to index.php and start a web server one directory up.
2025-03-28 12:51:45 +01:00
Jakub Vrana
c2c8992dd0 PHPStan: Fix errors in Plugins 2025-03-28 12:47:09 +01:00
Jakub Vrana
a691bcbf15 Rename function with the same name as Driver::select 2025-03-28 12:47:09 +01:00
Jakub Vrana
e3a4a214e6 Doc-comments: Remove redundant info 2025-03-28 12:47:09 +01:00
Jakub Vrana
a9143ccbdc Doc-comments: Fix type errors 2025-03-28 12:47:09 +01:00
Jakub Vrana
c169c55d70 Call Plugins from Adminer class 2025-03-28 12:47:09 +01:00
Jakub Vrana
54f3437a6a Plugins: Simplify calling
The class Plugins don't extend Adminer anymore. Adminer is now treated like any other plugin.
Hooks are now registered in the constructor and they are called dynamically.
Apart from being much more pleasant to work with, it shaves 7 kB from the compiled file.
2025-03-28 12:47:09 +01:00
Jakub Vrana
96178b83ad Compile: Strip types 2025-03-28 12:47:08 +01:00
Jakub Vrana
b948f77af4 Doc-comments: Fix type errors 2025-03-28 12:47:06 +01:00
Jakub Vrana
54f8d731b3 Doc-comments: Sync method signatures 2025-03-28 12:45:02 +01:00
Jakub Vrana
ab4208dcb8 Doc-comments: Declare type properties 2025-03-28 12:45:02 +01:00
Jakub Vrana
5e88dae4e2 Doc-comments: Format 2025-03-28 12:45:02 +01:00
Jakub Vrana
45c045382a Doc-comments: Move return types to declaration 2025-03-28 12:45:02 +01:00
Jakub Vrana
641ee4ff26 Doc-comments: Move param types to declaration 2025-03-28 12:45:02 +01:00
Jakub Vrana
69073d9d54 AdminerLoginSsl: Document type 2025-03-28 12:45:02 +01:00
Jakub Vrana
911f3b71b7 Doc-comments: Add param names 2025-03-28 12:45:02 +01:00
Jakub Vrana
3bde36b68e Tests: Invalid table 2025-03-28 12:45:01 +01:00
Jakub Vrana
d47d3cb4c5 Document error revealed by PHPStan 2025-03-27 21:05:32 +01:00
Jakub Vrana
0cdc18d22c Tests PostgreSQL: Sequence and schema 2025-03-27 21:05:32 +01:00
Jakub Vrana
47c533db4d Test wrong password 2025-03-27 21:05:32 +01:00
Jakub Vrana
feaed0497a Tests: Add test adder 2025-03-27 21:05:32 +01:00
Jakub Vrana
104132de36 Fix errors discovered by tests 2025-03-27 21:05:31 +01:00
Jakub Vrana
4d22e8fd4e PostgreSQL: Fix PHP warning when creating new routine 2025-03-27 18:56:10 +01:00
Jakub Vrana
a2ff6a7fb1 PostgreSQL: Unuse deleted fetch_field 2025-03-27 18:47:05 +01:00
Jakub Vrana
b23bf6c055 PHPStan: Fix more errors 2025-03-27 18:39:48 +01:00
Jakub Vrana
e2deed9a02 Use common parent for Db 2025-03-27 18:39:47 +01:00
Jakub Vrana
0578b5c490 JS: Add 'use strict' 2025-03-27 10:27:46 +01:00
Jakub Vrana
81ae16bce1 JS: Remove forgotten log 2025-03-27 07:23:34 +01:00
Jakub Vrana
806aa51f48 AdminerSqlGemini: Make work with CodeMirror 2025-03-27 07:22:51 +01:00
Jakub Vrana
8f2a829b2e WYMeditor not updated since 2014 2025-03-27 07:13:17 +01:00
Jakub Vrana
36b44248aa Travis is not free anymore 2025-03-27 07:00:00 +01:00
Jakub Vrana
23f5d64d75 Compile: Fix pgsql (fix #956) 2025-03-26 22:23:58 +01:00
Jakub Vrana
584d04b5b3 PHPStan: Check level 8 without level 7 2025-03-26 21:54:17 +01:00
Jakub Vrana
d3b53d9d9c PHPStan: Fix level 6 errors 2025-03-26 21:54:00 +01:00
Jakub Vrana
c96894ecd4 PHPStan: Fix level 5 errors 2025-03-26 19:29:50 +01:00
Jakub Vrana
c78299a3f6 PHPStan: Fix level 4 errors 2025-03-26 18:32:45 +01:00
Jakub Vrana
53d5e7b60a PHPStan: Check only one driver 2025-03-26 18:21:02 +01:00
Jakub Vrana
d77ed18842 Separate queries(null) 2025-03-26 17:04:30 +01:00
Jakub Vrana
309fdb0d86 PHPStan: Fix level 3 errors 2025-03-26 16:57:58 +01:00
Jakub Vrana
7e5757f8b4 PHPStan: Fix level 2 errors 2025-03-26 16:22:15 +01:00
Jakub Vrana
d39cc24c61 PHPStan: Fix level 1 errors 2025-03-26 13:49:11 +01:00
Jakub Vrana
3de9b23156 PHPStan: Use @return void
PHPStan then warns abouts using the return value
2025-03-26 13:14:12 +01:00
Jakub Vrana
63c258a7f9 PHPStan: Fix level 0 errors 2025-03-26 13:14:10 +01:00
Jakub Vrana
f75f0aacfe SQLite: Fix non-PDO driver after 99163fe 2025-03-26 11:39:06 +01:00
Jakub Vrana
a60e00bf72 Use Adminer\Plugins 2025-03-26 11:10:37 +01:00
Jakub Vrana
109b0df6de Readme: Remove duplicite information 2025-03-26 10:34:11 +01:00
Jakub Vrana
6e7158537f Add comment 2025-03-26 10:25:13 +01:00
Jakub Vrana
c5f87110ff Notices: Use idx() 2025-03-26 10:21:36 +01:00
Jakub Vrana
1a2ae0e29e AdminerDarkSwitcher: Work with compiled version (bug #926) 2025-03-26 07:28:47 +01:00
Jakub Vrana
1b8a428d2f Notices: Avoid accessing offset on null
Thanks to @peterpp at 62017e3.
2025-03-26 07:20:10 +01:00
Jakub Vrana
d3be21e000 Tests: Add schema 2025-03-26 07:18:46 +01:00
Jakub Vrana
012562571a MySQL: Simplify condition in fk_support 2025-03-26 03:29:22 +01:00
Jakub Vrana
41aad5bc37 Doc-comment: Use type aliases for arrays
Type aliases could be defined either globally (https://phpstan.org/writing-php-code/phpdoc-types#global-type-aliases) or just for a class.
I prefer having them at the place where they are created.
2025-03-26 02:43:08 +01:00
Jakub Vrana
cd5ccddd22 Display error for invalid table 2025-03-26 01:37:53 +01:00
Jakub Vrana
cccc784da4 Always return array from table_status() 2025-03-26 01:34:48 +01:00
Jakub Vrana
cd207238b7 Move icons to CSS 2025-03-26 00:08:16 +01:00
Jakub Vrana
67fa4c2a6f Schema: Move style to CSS 2025-03-25 22:35:31 +01:00
Jakub Vrana
eac7d042ed Avoid <optgroup> in <datalist> 2025-03-25 22:04:19 +01:00
Jakub Vrana
a2077070af CSS: Invert icons in dark mode 2025-03-25 21:47:25 +01:00
Jakub Vrana
26adca1003 Simplify designs.php 2025-03-25 21:10:02 +01:00
Jakub Vrana
76d810faca lucas-sandery design: Icons with uncompiled version (fix #954) 2025-03-25 21:07:34 +01:00
Jakub Vrana
db0e44221b Doc-comments: Use special PHPStan types 2025-03-25 15:18:47 +01:00
Jakub Vrana
01e2fe4234 Doc-comments: Use array shapes in @return
This uses https://phpstan.org/writing-php-code/phpdoc-types#array-shapes
I'm not going to do this in @param, it would be better to use https://phpstan.org/writing-php-code/phpdoc-types#global-type-aliases
2025-03-25 15:08:13 +01:00
Jakub Vrana
4d2b5144b1 Doc-comments: Improve array @var 2025-03-25 14:41:26 +01:00
Jakub Vrana
2ee325183b Doc-comment: Improve array @param
This uses syntax from https://phpstan.org/writing-php-code/phpdoc-types#general-arrays.

int[] means an array of ints with arbitrary keys (usually strings)
list<string> means an array of strings with sequential integer keys starting at 0
list<string>[] means an arbitrary array of string lists
list<string[]> means list of arbitrary string arrays
string[][] means two dimensional array with arbitrary keys in both dimensions
array was left in the comments for https://phpstan.org/writing-php-code/phpdoc-types#array-shapes
2025-03-25 14:31:27 +01:00
Jakub Vrana
26aa48122f Doc-comments: Improve array @return 2025-03-25 13:27:54 +01:00
Jakub Vrana
19b7358452 AdminerSqlGemini: Highlight button 2025-03-25 07:33:30 +01:00
Jakub Vrana
a1080ea8dc JS: Simplify SubmitHighlight 2025-03-25 07:03:42 +01:00
Jakub Vrana
9b1b779dbd AdminerSqlGemini: Handle Ctrl+Enter 2025-03-25 06:56:00 +01:00
Jakub Vrana
4bbbea2fbe AdminerSqlGemini: Wrap returned text to comment 2025-03-25 06:49:34 +01:00
Jakub Vrana
16e49d27cb AdminerSqlGemini: Return more columns by default 2025-03-25 06:29:41 +01:00
Jakub Vrana
190d91a0f9 AdminerSqlGemini: Send vendor 2025-03-25 06:17:27 +01:00
Jakub Vrana
2c72b879e9 Simplify saving flavor 2025-03-25 06:15:09 +01:00
Jakub Vrana
001f5ac21a AdminerSqlGemini: Avoid button jumping 2025-03-25 06:09:00 +01:00
Jakub Vrana
b13c76149f Add comment 2025-03-25 06:08:54 +01:00
Jakub Vrana
27a5aeea86 AdminerSqlLog: Update comment 2025-03-24 23:49:30 +01:00
Jakub Vrana
5a1be8ae65 More developer notes 2025-03-24 19:17:18 +01:00
Jakub Vrana
5dea23a07a Develop 2025-03-24 17:36:47 +01:00
Jakub Vrana
99a0949d2a Release 5.1.0 2025-03-24 17:35:22 +01:00
Jakub Vrana
1cf5a91d98 Export: Use output buffering 2025-03-24 17:28:53 +01:00
Jakub Vrana
dcde78eef2 Document //! 2025-03-24 17:21:44 +01:00
Jakub Vrana
88821a5780 Move beforeunload to plugin 2025-03-24 16:55:40 +01:00
Jakub Vrana
078a8b3d6b Improve handling of translations with ' 2025-03-24 15:57:46 +01:00
Inoyatulloh
4df205d4ec Added Uzbek language 2025-03-24 15:44:30 +01:00
Karel Uhlík
a50395c275 AdminerTablesFilter: Fix JS variable visibility
fix error: Uncaught ReferenceError: reg is not defined
2025-03-24 15:28:02 +01:00
Jakub Vrana
8b93d51c68 MS SQL PDO: Hide unsupported EXPLAIN 2025-03-24 14:47:55 +01:00
Jakub Vrana
50cdbbe415 Non-MySQL: Better field types in SQL command 2025-03-24 14:43:15 +01:00
Jakub Vrana
f5d23a8cad MS SQL PDO: Display last insert ID 2025-03-24 14:25:38 +01:00
Jakub Vrana
3bc675b0fc MS SQL: Common parent for PDO Db 2025-03-24 14:11:25 +01:00
Jakub Vrana
b86a9cb5fb Turn on output buffering only after sending headers
Otherwise output sent before Location (usually errors) is lost.
2025-03-24 14:04:17 +01:00
Jakub Vrana
cd53c54b6a Tests MS SQL: Connect to default server 2025-03-24 13:53:11 +01:00
Jakub Vrana
99163feefb SQLite PDO: Display results in SQL query 2025-03-24 13:53:11 +01:00
Jakub Vrana
84e4971b1e Tests: Check loaded plugin 2025-03-24 13:53:11 +01:00
Jakub Vrana
d22b1091f1 Notices: fetch_field in PDO 2025-03-24 13:53:10 +01:00
Jakub Vrana
b349830758 PostgreSQL: Fix number of affected rows after clone 2025-03-24 12:18:24 +01:00
Jakub Vrana
b8eb0ad8f5 Notices: Declare properties in fetch_field() 2025-03-24 12:18:24 +01:00
Jakub Vrana
c47590bb0d Fix JS error on AI column input 2025-03-24 12:18:24 +01:00
Jakub Vrana
486f164247 Notices: Declare Db::$info at least in MySQL 2025-03-24 12:18:24 +01:00
Jakub Vrana
edce93ca80 Tests: Fix AI 2025-03-24 12:18:20 +01:00
Jakub Vrana
858c914a50 AdminerDarkSwitcher: Icon 2025-03-24 07:38:33 +01:00
Jakub Vrana
9fd9a1fc8d Mute the same error in PHP 5 2025-03-24 07:30:22 +01:00
Jakub Vrana
60555c5736 Editor: Fix pre-selecting empty enum 2025-03-24 07:30:22 +01:00
Jakub Vrana
8cec1bd611 Notices: Declare Adminer::$error 2025-03-24 07:30:22 +01:00
Jakub Vrana
9b84908b99 Notices: Require declared properties 2025-03-24 07:30:22 +01:00
Jakub Vrana
3dd1b41472 Notices: Store maria into a declared variable 2025-03-24 07:30:22 +01:00
Jakub Vrana
b89f628e40 Reset onbeforeupload after Save and continue edit 2025-03-24 07:30:22 +01:00
Jakub Vrana
708646156a Notices: Enable E_NOTICE and E_STRICT 2025-03-24 07:30:20 +01:00
Jakub Vrana
9e52f0fa2e Notices: Check session status before restarting 2025-03-23 22:09:46 +01:00
Jakub Vrana
3cd50c9a02 Notices: Silent unavoidable error 2025-03-23 21:47:32 +01:00
Jakub Vrana
f5ecb18896 Notices: Add helper for reset() with expression 2025-03-23 21:39:25 +01:00
Jakub Vrana
0501846743 AdminerSqlGemini: Support multiple instructions
Example:
Cities speaking Czech.
Then create indexes so it's fast.
2025-03-23 20:24:25 +01:00
Jakub Vrana
8db8b7a10d Plugins: Use call_user_func_array 2025-03-23 20:22:41 +01:00
Jakub Vrana
d6a417fa58 Add comment 2025-03-23 20:22:41 +01:00
Jakub Vrana
4477f95426 AdminerEditCalendar: Avoid work in constructor 2025-03-23 20:22:41 +01:00
Jakub Vrana
6a64c7771b Plugins: Display doc-comments at server overview 2025-03-23 20:22:41 +01:00
Jakub Vrana
c32e4f82fe AdminerSqlGemini: Display progress 2025-03-23 20:22:41 +01:00
Jakub Vrana
19bb320e7a New plugin: Verify new versions from GitHub
Thanks to @adrianbj in 441e7f0.
2025-03-23 20:22:40 +01:00
Jakub Vrana
fb47ba6bbb Add instructions to translation files 2025-03-23 15:35:30 +01:00
Jakub Vrana
03ff0bbc04 JS: Use classList instead of className 2025-03-23 15:10:18 +01:00
Jakub Vrana
e8055329a6 CSS: Move Logout down on narrow screens (fix #938) 2025-03-23 14:06:11 +01:00
Jakub Vrana
9142e7e8a5 AdminerDumpAlter: Rename colliding method (fix #943) 2025-03-23 13:56:40 +01:00
Jakub Vrana
e975e546e1 Docs: improve style thanks to ChatGPT 2025-03-23 13:52:38 +01:00
Jakub Vrana
1b59b10f62 MySQLi: Avoid using PHP 8.1 method
This reverts 359fdf3.
2025-03-23 12:40:12 +01:00
Jakub Vrana
f1a8bd9ef8 Chrome 134 on iOS: Allow zooming out (bug #940) 2025-03-23 12:40:07 +01:00
Jakub Vrana
204176b33b New plugin: AI prompt in SQL command creating the queries with Google Gemini 2025-03-23 08:02:48 +01:00
Jakub Vrana
cf436d7317 Add CONTRIBUTING 2025-03-23 00:25:49 +01:00
Jakub Vrana
7eb92d9601 Add notes for developers 2025-03-23 00:25:48 +01:00
Jakub Vrana
8da9239279 Plugins: Remove obsolete instructions 2025-03-22 22:34:52 +01:00
Jakub Vrana
e0dde9034f Doc-comments: Use consistent style 2025-03-22 21:04:58 +01:00
Jakub Vrana
9b162e8291 PostgreSQL: Fix clone after e395fe5 2025-03-22 20:55:51 +01:00
Jakub Vrana
359fdf3d07 MySQLi: Use fetch_column 2025-03-22 08:50:47 +01:00
Jakub Vrana
00b7056147 MySQLi: Add comment 2025-03-22 08:47:21 +01:00
Jakub Vrana
db829fd463 PDO: Handle PHP warnings for internal queries 2025-03-22 08:47:21 +01:00
Jakub Vrana
359d153130 Tests PostgreSQL: Fix after e395fe5 2025-03-22 08:47:21 +01:00
Jakub Vrana
ab44927442 Tests: Run also in PDO 2025-03-22 08:47:03 +01:00
Jakub Vrana
01a6af8b70 Tests: Remove localhost:8080 2025-03-22 08:20:30 +01:00
Jakub Vrana
3f2eec9b92 URL parameter ?ext=pdo to force using PDO 2025-03-22 08:18:39 +01:00
Jakub Vrana
aaca1eee8e JS: Unsupport event.srcElement 2025-03-21 23:58:45 +01:00
Jakub Vrana
26db8596aa JS: Simplify hiding ajaxstatus 2025-03-21 23:58:45 +01:00
Jakub Vrana
5aedb33fb6 JS: Simplify onbeforeunload 2025-03-21 23:58:45 +01:00
Jakub Vrana
7fca87dfd7 JS: Unsupport old IE 2025-03-21 23:58:42 +01:00
Jakub Vrana
711f41d05b Ctrl+click in select moves the cursor in modern browsers 2025-03-21 23:58:15 +01:00
Jakub Vrana
f7b20b5f6f Increase space after SQL result (fix #937) 2025-03-21 22:32:49 +01:00
Jakub Vrana
719c1e7067 Plugins autoloading: Link help 2025-03-21 22:23:45 +01:00
John F. Arroyave Gutiérrez
83a8b18c85 Spanish translation upgrade
Just some edditions and new translations
2025-03-21 22:23:44 +01:00
Matthaiks
4d082d4fcd Update Polish translation 2025-03-21 07:33:40 +01:00
Jakub Vrana
a705be7a94 Confirm before exiting edited edit form 2025-03-20 17:15:18 +01:00
Jakub Vrana
a2586e7265 Update comment: Chrome doesn't propagate Ctrl+Up 2025-03-20 16:00:25 +01:00
Jakub Vrana
f38bbff5bf Increase maximum width of string edit (bug #930) 2025-03-20 15:39:55 +01:00
Peter Knut
09720b31f1 Remove hardcoded textarea height 2025-03-20 15:26:06 +01:00
Jakub Vrana
0e28daac55 Multi-edit: Increase size of textarea 2025-03-20 15:19:32 +01:00
Jakub Vrana
3eb478b65a CSS: Fix adminer.css recognition (includes version) 2025-03-20 14:50:58 +01:00
Jakub Vrana
192ce41bd3 Tests: Run on compiled version 2025-03-20 14:33:17 +01:00
Jakub Vrana
bcd5164e2f Plugins: Handle autoloading errors 2025-03-20 14:33:17 +01:00
Jakub Vrana
cd686c7a1e CSS: Light background in dark bold error 2025-03-20 14:33:17 +01:00
Jakub Vrána
e9feb1587a Add plugins/README.md 2025-03-20 14:32:56 +01:00
Jakub Vrana
1f5a7fa717 JS: Use arrow functions
All function () {} left in the code reference `this` and thus couldn't use arrow functions.
2025-03-20 10:35:08 +01:00
Jakub Vrana
3c310ddfaf Designs: Link gallery 2025-03-20 09:54:45 +01:00
Jakub Vrana
6d4896e03c JS: Add ESLint config
To use this: Create package.json and run:
npm install --save-dev eslint @eslint/js
2025-03-20 09:54:44 +01:00
Jakub Vrana
5ef77ec399 JS: Fix typo after def9e07 2025-03-20 09:17:04 +01:00
Jakub Vrana
62c18efbd5 JS: Use let/const for globals 2025-03-20 08:59:07 +01:00
Jakub Vrana
101229043e JS: Use let/const in spaghetti code 2025-03-20 08:58:48 +01:00
Jakub Vrana
0e21106e48 JS: Change var to let/const
Created by `eslint . --fix` with rules no-var and then prefer-const.
2025-03-20 08:32:23 +01:00
Jakub Vrana
f16a6d415a JS: Style issues 2025-03-20 08:03:54 +01:00
Jakub Vrana
11699223df JS: Remove outdated check 2025-03-20 07:39:21 +01:00
Jakub Vrana
7c75d3f86c JS: Remove unnecessary escape 2025-03-20 07:26:17 +01:00
Jakub Vrana
287667d631 Designs: Link screenshots 2025-03-20 06:53:52 +01:00
Jakub Vrana
ef4c340cc2 PostgreSQL 11: Support PROCEDURE 2025-03-19 22:43:40 +01:00
Jakub Vrana
f2a5d5127a Display collation at table structure if different from table 2025-03-19 22:42:02 +01:00
Jakub Vrana
889ffe28c7 JS: Add missing function 2025-03-19 22:04:30 +01:00
Jakub Vrana
5f6aa1e267 JS: Depend on JSON 2025-03-19 21:51:25 +01:00
Jakub Vrana
def9e07831 JS: Use for..of 2025-03-19 21:51:23 +01:00
Jakub Vrana
c73bd1233e Changelog for new plugins 2025-03-19 20:29:20 +01:00
Jakub Vrana
e6ead2d12c New plugin: Allow switching light and dark mode (fix #926) 2025-03-19 20:20:43 +01:00
Jakub Vrana
4802389ce6 Delete stale comment after 3eba731 2025-03-19 19:21:22 +01:00
Takashi SHIRAI
7845b70d7d Modify the Japanese messages.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-03-19 18:38:54 +01:00
Takashi SHIRAI
9f8344e53c Fix the uncaught exception because of namespace.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-03-19 18:35:32 +01:00
Jakub Vrana
2dd32cf534 Plugin pretty-json-column: fix with enum (fix #928)
Also add syntax highlighting.
2025-03-19 18:22:57 +01:00
Jakub Vrana
0b063262ee Remove ns= from auth_url 2025-03-19 17:53:26 +01:00
Peter Knut
458d07122f Bigger font size for code blocks 2025-03-19 17:45:31 +01:00
Jakub Vrana
740a4b8b1c Issue template: Use italics 2025-03-19 17:33:46 +01:00
Jakub Vrana
6be1e1c069 Plugins: Fix displaying with legacy AdminerPlugin 2025-03-19 17:29:42 +01:00
Jakub Vrana
b861500910 Make Adminer\Plugins visible for adminer_object 2025-03-19 17:29:42 +01:00
Jakub Vrana
eca176f362 MS SQL: Fix collation issues when retrieving default values
I was getting this error:
Error in query (4189): Cannot convert to text/ntext or collate to 'Czech_100_CI_AI_SC_UTF8' because these legacy LOB types do not support UTF-8 or UTF-16 encodings. Use types varchar(max), nvarchar(max) or a collation which does not have the _SC or _UTF8 flags.

This reverts part of a2adb67.
2025-03-19 17:29:42 +01:00
Jakub Vrana
8f489da2bd Tests MS SQL: Use default server 2025-03-19 17:29:42 +01:00
Jakub Vrana
3138b1de88 CockroachDB: not actually fixed 2025-03-19 17:29:42 +01:00
Matthaiks
e723158bbf Update Polish translation 2025-03-19 17:29:31 +01:00
Jakub Vrana
feed6e4488 PostgreSQL: Use language sql when creating routines by default 2025-03-19 06:49:48 +01:00
Jakub Vrana
9b345fbafb CockroachDB: Do not use version number when linking docs 2025-03-19 06:49:48 +01:00
Jakub Vrana
ca30d04575 PostgreSQL: Display shorter version (regression from 5.0.5) 2025-03-19 06:49:48 +01:00
Jakub Vrana
b4e41f5e4b CockroachDB: Pass param length to routine drop (cockroachdb/cockroach#142886) 2025-03-19 06:49:30 +01:00
Jakub Vrana
8979baca28 Remove forgotten newline 2025-03-19 05:45:22 +01:00
Jakub Vrana
8019b9ae4d Autoloaded plugins: Drivers work too 2025-03-19 05:14:41 +01:00
Jakub Vrana
7fec2992d9 Autoloaded plugins: Use in Editor 2025-03-19 05:08:24 +01:00
Jakub Vrana
df98f2453d Plugins: Load config from adminer-plugins.php 2025-03-19 05:05:42 +01:00
Jakub Vrana
eb1d8d5468 Display loaded plugins 2025-03-18 22:30:51 +01:00
Jakub Vrana
ea3da56b6d Add plugins/plugin.php for backwards compatibility 2025-03-18 22:30:51 +01:00
Jakub Vrana
41dabfb4f2 Plugins: Autoload plugins in adminer-plugins/ 2025-03-18 22:30:49 +01:00
Jakub Vrana
ff0fe92c00 Add forgotten space 2025-03-18 19:51:25 +01:00
Jakub Vrana
06c15aa263 IMAP: Use db mail 2025-03-18 19:46:40 +01:00
Jakub Vrana
8a64fb16cd IMAP: Use imap_num_msg() 2025-03-18 19:46:08 +01:00
Jakub Vrana
bda53f0734 CSS: Allow more custom styles with dark mode (fix #925) 2025-03-18 17:49:33 +01:00
Jakub Vrana
bc9de24d77 Add helper for <input type=hidden> 2025-03-18 17:15:10 +01:00
Jakub Vrana
9cfea02e19 Avoid excessive PHP and HTML mixing 2025-03-18 16:45:15 +01:00
Jakub Vrana
eeb78d7e48 Vendor display: Do not overwrite PostgreSQL by MySQL at the same server 2025-03-18 16:30:23 +01:00
Jakub Vrana
751405e006 - PostgreSQL: Avoid warning about crdb_version (fix #924, regression from 5.0.5) 2025-03-18 16:20:44 +01:00
Jakub Vrana
3fb6cac361 PostgreSQL: Display description of system variables 2025-03-18 16:00:21 +01:00
Matrixman
8613f97948 New version of design rmSOFT 2025-03-18 15:43:50 +01:00
Jakub Vrana
249807fc48 IMAP: Simplify expunge 2025-03-18 14:56:37 +01:00
Jakub Vrana
6e76454f59 Update changes 2025-03-18 14:45:10 +01:00
Jakub Vrana
655cca0872 IMAP: Export 2025-03-18 14:05:51 +01:00
Jakub Vrana
16989a736c IMAP: Use halfopen 2025-03-18 13:58:05 +01:00
Jakub Vrana
a3d1ab34bb Move engines() to Driver 2025-03-18 13:41:24 +01:00
Jakub Vrana
b2f904c64f IMAP: Add Data_length 2025-03-18 13:36:49 +01:00
Jakub Vrana
05d27a132d Compile: Do not require unsupported functions 2025-03-18 13:29:48 +01:00
Jakub Vrana
4861c88cc6 IMAP: Create, drop, truncate 2025-03-18 13:10:45 +01:00
Jakub Vrana
1424a42b1f IMAP: Avoid globals 2025-03-18 13:00:40 +01:00
Jakub Vrana
1c5a192cb5 Add forgotten colon 2025-03-18 12:57:29 +01:00
Jakub Vrana
336fdaf09c Revert "Table-less drivers: Hide Create table link"
This reverts commit 841f76fb00.
This reverts commit 8fed1523ec.
2025-03-18 12:55:30 +01:00
Jakub Vrana
57e6c2651c IMAP: Number of rows 2025-03-18 12:52:17 +01:00
Jakub Vrana
693dc5b8a7 IMAP: Delete message
Also support mailboxes with spaces
2025-03-18 12:35:36 +01:00
Jakub Vrana
753642630b IMAP: Select columns 2025-03-18 12:15:31 +01:00
Jakub Vrana
8fed1523ec Table-less drivers: Hide Create table link 2025-03-18 11:35:15 +01:00
Jakub Vrana
ebb31bdac8 IMAP: New driver created just for fun 2025-03-18 11:35:14 +01:00
Jakub Vrana
5069e5a400 JSON: Remove unnecessary escape 2025-03-18 11:15:03 +01:00
Jakub Vrana
33b69ed82b Edit: prefer JSON over text 2025-03-18 11:12:07 +01:00
Jakub Vrana
4e4f280061 Table-less drivers: display empty field only without fields() 2025-03-18 11:00:57 +01:00
Jakub Vrana
841f76fb00 Table-less drivers: Hide Create table link 2025-03-18 11:00:28 +01:00
Jakub Vrana
73e7e00c77 fieldName: Display : before comment only with type 2025-03-18 09:26:16 +01:00
Jakub Vrana
29f954069d CSS: Sticky table headers (fix #918) 2025-03-18 02:10:57 +01:00
Jakub Vrana
c1eccc9cdd Use CHANGELOG.md 2025-03-17 21:13:15 +01:00
Jakub Vrana
430cdaeb3a Use README.md 2025-03-17 20:29:50 +01:00
Jakub Vrana
e395fe583a PostgreSQL: Display auto_increment of inserted rows 2025-03-17 19:58:22 +01:00
Jakub Vrana
19313a8dab Pass $result to last_id 2025-03-17 19:58:21 +01:00
Jakub Vrana
17c0960e7f Consider plugins autoloading 2025-03-17 19:58:21 +01:00
Jakub Vrana
a9b020452e Plugins: Add backward-keys 2025-03-17 19:58:20 +01:00
Jakub Vrana
e1f0fded69 Add helper for <input type=hidden name=token> 2025-03-17 18:45:08 +01:00
Jakub Vrana
91f9980267 Bug reports: Add screenshot 2025-03-17 17:37:29 +01:00
Jakub Vrana
5f3fac4b48 Develop 2025-03-17 17:15:17 +01:00
Jakub Vrana
b7679701ce Release 5.0.6 2025-03-17 17:13:46 +01:00
Jakub Vrana
b7258d2e95 Shorten queries saved from SQL command to URL (fix #917) 2025-03-17 15:05:56 +01:00
Jakub Vrana
c51d9919fe Update tests 2025-03-17 14:29:07 +01:00
Jakub Vrana
78c431ab20 Fix typos after 22a3efe 2025-03-17 14:28:04 +01:00
Jakub Vrana
916889bb8e Compile: Fix joining conditional echos 2025-03-17 14:25:57 +01:00
Jakub Vrana
e8b15c99f4 Add back function to get driver name (fix #919)
This reverts fe88f83.
2025-03-17 08:07:24 +01:00
Jakub Vrana
a460019535 Compile PostgreSQL: Address warnings (fix #916) 2025-03-17 07:43:10 +01:00
Jakub Vrana
ea5a7453fb CSS: Set also light color-scheme 2025-03-17 07:14:26 +01:00
Jakub Vrana
587f6a5375 CSS: Dark input fields in dark mode 2025-03-17 07:04:21 +01:00
Jakub Vrana
2bb74e7467 Compile: fetch_column() is used only internally 2025-03-17 06:38:16 +01:00
Jakub Vrana
a684044bb3 Compile SQLite: Remove server login field 2025-03-17 06:13:48 +01:00
Jakub Vrana
36a3465a64 Compile: Rename variable with other meaning in Adminer 2025-03-17 05:54:24 +01:00
Jakub Vrana
223aee70d5 Mark bugs at https://sourceforge.net/p/adminer/bugs-and-features/ 2025-03-17 05:38:14 +01:00
Jakub Vrana
c02a7d6abe Add missing namespace 2025-03-17 00:49:12 +01:00
Jakub Vrana
22a3efe4ed Code style: avoid excesive mixing of PHP and HTML 2025-03-17 00:02:41 +01:00
Jakub Vrana
dd47df9b9c Display comment in title of field 2025-03-16 22:49:50 +01:00
Jakub Vrana
0b0e8940e0 Update externals 2025-03-16 22:42:45 +01:00
Jakub Vrana
fa8339c8c2 Plugins: Remove fragile autoloader 2025-03-16 22:09:43 +01:00
Jakub Vrana
f0ee812b29 Add todo 2025-03-16 21:55:36 +01:00
Jakub Vrana
f093cb6db2 Rename file 2025-03-16 21:49:39 +01:00
Jakub Vrana
68d4a5a650 Delete adminer.version before writing (bug #855) 2025-03-16 21:43:09 +01:00
Jakub Vrana
6576fa6a73 Security: Disallow writing temporary files to symlinks (bug #855)
Cc @peterpp
2025-03-16 21:43:08 +01:00
Peter Knut
28535bf384 Refactor generating of private key
Generating of private key is atomic now.
2025-03-16 20:54:28 +01:00
Peter Knut
43e3fe375d Refactor working with a locked file 2025-03-16 20:54:24 +01:00
Jakub Vrana
d8a9a3db8d CockroachDB: Display CockroachDB instead of PostgreSQL 2025-03-16 19:07:42 +01:00
Jakub Vrana
777d5dca0e Store information about vendor 2025-03-16 19:03:12 +01:00
Jakub Vrana
6d71cd678e Separate HTML functions 2025-03-16 19:03:02 +01:00
Jakub Vrana
30714d98f9 Save bytes 2025-03-16 18:05:52 +01:00
Jakub Vrana
8353bd48de MariaDB: Display MariaDB instead of MySQL 2025-03-16 18:02:34 +01:00
Peter Knut
0762c761ac Rename functions for settings stored in a cookie 2025-03-16 17:24:28 +01:00
Jakub Vrana
529197f403 Compile: Move caching headers to file.inc.php 2025-03-16 17:16:23 +01:00
Jakub Vrana
d20cbf14e7 Remember export setting at SQL command 2025-03-16 15:13:10 +01:00
Jakub Vrana
517f63835d Plugins: add syntaxHighlighting() and CodeMirror 2025-03-16 14:00:39 +01:00
Jakub Vrana
4fee062b73 Simplify autofocus 2025-03-16 11:08:01 +01:00
Jakub Vrana
26769b2357 Do not align right non-numbers, e.g. NULL or foreign keys 2025-03-16 09:10:43 +01:00
Jakub Vrana
42bf7b9ca0 Align numbers right (bug #912) 2025-03-15 15:13:41 +01:00
Jakub Vrana
d8755c903d Save bytes 2025-03-15 13:57:29 +01:00
Jakub Vrana
a391fcb6c4 Compile: Use external PhpShrink 2025-03-15 09:38:06 +01:00
Jakub Vrana
c99ca863ce php_shrink: Move add_apo_slashes to compile.php 2025-03-15 09:10:43 +01:00
Jakub Vrana
e0283543f3 Support adminer.css + adminer-dark.css together 2025-03-15 08:51:51 +01:00
Jakub Vrana
a72e053520 php_shrink: Use foreach 2025-03-15 07:35:37 +01:00
Jakub Vrana
de654712d5 php_shrink: Preprocess ?>HTML<?php 2025-03-15 07:33:47 +01:00
Jakub Vrana
9c1d5484a2 php_shrink: Join echos interleaved with comments 2025-03-15 07:21:37 +01:00
Jakub Vrana
1fd8aa885b Fix bs,ru,sr,uk single lang version after f2ce6c0 2025-03-15 02:32:37 +01:00
Jakub Vrana
08882c6a8e Add comments to places processed by compile.php 2025-03-15 02:26:16 +01:00
Jakub Vrana
fd199ec156 php_shrink: Document bug 2025-03-15 02:26:07 +01:00
Jakub Vrana
e3515fd63f CSS: Dark mode syntax highlighting and adminer-dark.css 2025-03-15 02:00:21 +01:00
Jakub Vrana
be0a485b14 JUSH: Revert to original colors 2025-03-14 12:35:06 +01:00
Jakub Vrana
94c04712d6 SQL textarea: Open help on Ctrl+click 2025-03-14 11:01:20 +01:00
Jakub Vrana
caea0b7f68 JUSH: Use dark mode 2025-03-14 09:55:34 +01:00
Jakub Vrana
134301b3ff Tests CockroachDB: Link bug 2025-03-14 08:02:11 +01:00
Jakub Vrana
d14f3dd2d8 Tests: Check status variables 2025-03-14 07:31:57 +01:00
Jakub Vrana
67c313c86d Tests SQLite: Add more 2025-03-14 07:27:58 +01:00
Jakub Vrana
5eaa73583a Tests PostgreSQL: Materialized view 2025-03-14 06:44:02 +01:00
Jakub Vrana
68b6af6fce Tests: Check that check constraints work 2025-03-14 06:38:26 +01:00
Jakub Vrana
e65fdba5d1 Test PostgreSQL: enum 2025-03-14 06:18:42 +01:00
Jakub Vrana
8f336cd0b3 Tests: Remove useless xpath= 2025-03-14 05:58:45 +01:00
Jakub Vrana
5f3bfe8451 JUSH textarea: Use oninput 2025-03-14 05:56:30 +01:00
Jakub Vrana
1a3d58e74e Tests: Add newlines 2025-03-13 23:04:22 +01:00
Jakub Vrana
af9a851c5e Tests: generated columns 2025-03-13 23:00:14 +01:00
Jakub Vrana
3a40a855ea Develop 2025-03-13 18:29:28 +01:00
Jakub Vrana
967647759e Release 5.0.5 2025-03-13 18:28:43 +01:00
Jakub Vrana
e4323ced55 Tests: Fix CockroachDB after 48308f3 2025-03-13 18:22:06 +01:00
Jakub Vrana
85c6af6f87 Compile: strip space after CSS comment 2025-03-13 18:00:54 +01:00
Jakub Vrana
9226804aa2 CSS: Move media selector to <link> 2025-03-13 17:55:42 +01:00
Jakub Vrana
041e7064ca php_shrink: Simplify test 2025-03-13 17:45:16 +01:00
Jakub Vrana
4c2a8b0050 Compile: Move ?><? removal to php_shrink 2025-03-13 17:43:20 +01:00
Jakub Vrana
9afbf1a465 Compile: dark.css 2025-03-13 17:33:19 +01:00
Jakub Vrana
352ef9c778 CSS: Don't use dark theme with adminer.css 2025-03-13 17:11:40 +01:00
Jakub Vrana
45107dc46e Don't highlight NULL as JSON 2025-03-13 16:55:17 +01:00
Jakub Vrana
21f3426adb Design: Update dark mode (by rmsoft) 2025-03-13 16:48:56 +01:00
Jakub Vrana
95dccfe9fb MongoDB: Rename file 2025-03-13 15:21:19 +01:00
Jakub Vrana
fe88f83c95 Elastic: Fix number of rows in group queries 2025-03-13 14:34:26 +01:00
Jakub Vrana
078957fe32 MongoDB: Move to plugin 2025-03-13 14:27:54 +01:00
Jakub Vrana
61f07867f9 Update readme 2025-03-13 14:09:45 +01:00
Jakub Vrana
0135dd5b81 Tests: Add tests for MS SQL 2025-03-13 14:07:31 +01:00
Jakub Vrana
773a2253d3 Export: Display unknown number of rows as ? 2025-03-13 13:29:10 +01:00
Jakub Vrana
272042a30e Fix skipOriginal after unconvertFunction 2025-03-13 13:13:06 +01:00
Jakub Vrana
48308f3357 CockroachDB: Recognize unique_rowid() as auto_increment 2025-03-13 13:09:05 +01:00
Jakub Vrana
c90033a962 Test PostgreSQL: SQL command 2025-03-13 13:03:24 +01:00
Jakub Vrana
8bd022f974 CockroachDB: Fix test 2025-03-13 13:02:53 +01:00
Jakub Vrana
b1550b052d MySQL: Simplify checking for MariaDB 2025-03-13 12:24:35 +01:00
Jakub Vrana
9862846a7c CockroachDB: Declare support 2025-03-13 12:15:37 +01:00
Jakub Vrana
f14e3e38f6 CockroachDB: Disable processlist 2025-03-13 12:12:44 +01:00
Jakub Vrana
95262c4215 CSS: Fix style 2025-03-13 12:08:01 +01:00
Jakub Vrana
dacfdc4608 Tests: Work with JUSH textarea 2025-03-13 12:07:49 +01:00
Jakub Vrana
7636c253fb CockroachDB: Display version 2025-03-13 11:51:03 +01:00
Jakub Vrana
44d26a9dd3 Tests: Add tests for CockroachDB 2025-03-13 11:08:42 +01:00
Jakub Vrana
b229e7b583 Tests: Add tests for MariaDB and PostgreSQL 2025-03-13 10:45:53 +01:00
Jakub Vrana
8e91417be1 MySQL: Display converting function for binary, bit or geometry fields 2025-03-13 07:50:20 +01:00
Peter Knut
db7202fcf0 MySQL: Fix saving string default value of json field 2025-03-13 07:19:27 +01:00
Jakub Vrana
260487fbc2 Designs: Update rmsoft (fix #911) 2025-03-13 07:10:23 +01:00
Jakub Vrana
3ae964c915 Designs: Fix price 2025-03-13 07:06:43 +01:00
Jakub Vrana
d56c8cbaae CSS: Simplify .odds 2025-03-13 07:03:42 +01:00
Jakub Vrana
d347f88c54 Design: Update rmsoft (fix #911) 2025-03-13 06:38:32 +01:00
Jakub Vrana
b9b4db0c8e Compile: Add more php_shrink tests 2025-03-13 06:10:58 +01:00
Jakub Vrana
818b9ad903 Compile: Strip public 2025-03-12 23:15:24 +01:00
Jakub Vrana
4a6436773f Compile: Add tests for php_shrink 2025-03-12 23:15:22 +01:00
Jakub Vrana
81594e4a2d Issues: Prefer MySQLi 2025-03-12 18:28:56 +01:00
Jakub Vrana
f0bdb0e6ca Designs: Update .odds 2025-03-12 17:50:24 +01:00
Jakub Vrana
b9e4806d3c CSS: lowercase color names 2025-03-12 17:43:58 +01:00
Jakub Vrana
7e708dae57 CSS: Add dark theme 2025-03-12 17:42:53 +01:00
Jakub Vrana
a0fe44ec18 CSS: Expand <code> in <pre> 2025-03-12 17:35:44 +01:00
Jakub Vrana
eb0f280776 CSS: Fix highlighting checked odd rows 2025-03-12 17:35:34 +01:00
Jakub Vrana
3b1189cd3c MySQL: Allow setting default values of json column 2025-03-12 14:25:19 +01:00
Jakub Vrana
434a8f7705 CSS: Disable odd on hover 2025-03-12 13:58:20 +01:00
Jakub Vrana
f9478c67d2 CSS: Merge rules 2025-03-12 12:57:59 +01:00
Jakub Vrana
f2ce6c0a71 Wrap long lines 2025-03-12 11:43:21 +01:00
Jakub Vrana
a50b3d6385 MS SQL: Fix editing rows with datetime column in primary key
Inspired by adminneo-org@b4afc08.
This fixes https://sourceforge.net/p/adminer/discussion/960418/thread/a547e79622/.
2025-03-12 09:28:22 +01:00
Jakub Vrana
e39deca4f1 Wrap Schema: in navigation to <span> (fix #907) 2025-03-12 09:26:04 +01:00
Jakub Vrana
ce69970f54 Update German translation (by @wintstar) 2025-03-12 09:09:09 +01:00
Jakub Vrana
51ac1312a1 MariaDB: Don't display NULL as default value 2025-03-12 08:51:25 +01:00
Jakub Vrana
4505544953 Code style: exclude removed extensions 2025-03-12 08:12:28 +01:00
Jakub Vrana
fa75213ff6 Coverage: Fix newlines 2025-03-12 06:15:47 +01:00
Jakub Vrana
63acb37ea6 Coverage: Display drivers 2025-03-12 06:09:18 +01:00
Jakub Vrana
3ad6c16f59 Coverage: Modernize HTML 2025-03-12 06:06:28 +01:00
Jakub Vrana
22d08b4a50 Add comment 2025-03-12 06:01:29 +01:00
Jakub Vrana
dd3cc4e683 Add plugin AdminerEditorViews (fix #905) 2025-03-12 05:22:57 +01:00
Jakub Vrana
5504a617d0 Compile: Support private static 2025-03-12 05:03:42 +01:00
Jakub Vrana
2fdebfda29 Ensure PHP 5.3 compatibility 2025-03-11 21:43:59 +01:00
Jakub Vrana
dc2e945aef MySQL: Convert binary default value to hex when editing 2025-03-11 20:25:52 +01:00
Jakub Vrana
43d86287c4 Fix focusing first field 2025-03-11 20:16:49 +01:00
Jakub Vrana
a94a727af7 PostgreSQL PDO: Escape bytea values (bug #218) 2025-03-11 19:42:10 +01:00
Jakub Vrana
c2d29a6937 MySQL: Display default values of binary columns 2025-03-11 19:25:42 +01:00
Jakub Vrana
c082136558 Rename variable 2025-03-11 18:40:34 +01:00
Jakub Vrana
7b1ea5fa2c AdminerDumpAlter: Use dumpFooter 2025-03-11 18:20:11 +01:00
Jakub Vrana
156839142e Fix plugin AdminerPrettyJsonColumn 2025-03-11 18:16:44 +01:00
Jakub Vrana
2ee4e3b2e1 Compile: Fix shortening in protected functions 2025-03-11 17:56:21 +01:00
Jakub Vrana
8b4c8b0156 Fix coverage 2025-03-11 14:37:08 +01:00
Jakub Vrana
9702878297 Develop 2025-03-11 14:00:37 +01:00
Jakub Vrana
4a54648995 Release 5.0.4 2025-03-11 13:52:53 +01:00
Jakub Vrana
2e5027a1aa Compile: Fix shortening in private methods 2025-03-11 13:50:36 +01:00
Jakub Vrana
5a4c4dd892 Release 5.0.3 2025-03-11 13:16:35 +01:00
Jakub Vrana
7ef009336f PostgreSQL: Fix where and order privileges (fix #902) 2025-03-11 13:07:50 +01:00
Jakub Vrana
1defc94d12 Fix $result visibility 2025-03-11 12:53:35 +01:00
Jakub Vrana
5d3376e620 Check more style 2025-03-11 12:21:07 +01:00
Jakub Vrana
d410cdc5be Mongo: Add helper method 2025-03-11 11:13:40 +01:00
Jakub Vrana
a44e625882 Set visibility to protected 2025-03-11 11:05:39 +01:00
Jakub Vrana
ae57d42105 SQLite: Fix calling private property 2025-03-11 11:05:10 +01:00
Jakub Vrana
199edfe11f Plugins: Add method dumpFooter() 2025-03-11 08:59:38 +01:00
Jakub Vrana
b02c3e1f7f Use private visibility 2025-03-11 08:36:35 +01:00
Jakub Vrana
98cb9b9aca Add comment 2025-03-11 08:29:01 +01:00
Jakub Vrana
514d64048d Disallow var 2025-03-11 08:17:02 +01:00
Jakub Vrana
1e963cf90f Change var to public 2025-03-11 08:17:00 +01:00
Jakub Vrana
0c15a9f42d Use private visibility on methods 2025-03-11 08:16:41 +01:00
Jakub Vrana
c454ea8430 Use protected visibility 2025-03-11 08:16:41 +01:00
Jakub Vrana
607febea8e Use private visibility 2025-03-11 08:16:39 +01:00
Jakub Vrana
ebd5f19dd4 Use protected visibility 2025-03-11 08:12:09 +01:00
Jakub Vrana
1b0984ff31 Compile: Change public to var 2025-03-11 07:16:20 +01:00
Jakub Vrana
b017928256 Revert accidental revert 2025-03-11 07:05:16 +01:00
Jakub Vrana
526077535e Update changes 2025-03-11 07:00:21 +01:00
Jakub Vrana
8274b2e0e8 Update bug template 2025-03-11 06:50:04 +01:00
Jakub Vrana
8f7d456887 Update changes 2025-03-11 06:45:38 +01:00
Jakub Vrana
91b735c576 Compile: Support \r\n line ends 2025-03-11 06:30:31 +01:00
Jakub Vrana
916b9e62de Fix double unescaping 2025-03-11 06:24:21 +01:00
Jakub Vrana
f25c65837f Add comment 2025-03-11 06:24:21 +01:00
Jakub Vrana
b0182834bf Fix typo 2025-03-11 06:24:21 +01:00
David Grudl
6bf0b85919 Compile: supports visibility modifiers 2025-03-11 06:24:07 +01:00
Jakub Vrana
37e63dd82f MySQL: Stop treating enum as set as numbers (bug #475) 2025-03-10 23:40:07 +01:00
Jakub Vrana
6fdde32f86 Remove check for PHP version 2025-03-10 23:03:20 +01:00
Jakub Vrana
aeac0a3329 MySQL: Allow setting default values of text column 2025-03-10 21:15:01 +01:00
Christian Weiske
fde7d7dde2 Elastic: Properly display sparse result rows
Result records in Elasticsearch do not always have all columns
that are defined in an index.
This often happens when multiple document types are stored in the same index.

The first row has columns ["_id", "html", "url"], while the second
misses the "html" column: ["_id", "url"].

Adminer expects that all result rows include all columns.
This leads to the problem that the "url" value in the 2nd example row
was rendered in the "html" column.

This patch fixes this problem by fetching the actual column list first
when all fields are to be shown, and using that field list
as base for all rows.
2025-03-10 21:14:54 +01:00
Christian Weiske
e993462412 Elastic: Fix record insertion on Elasticsearch 7
1. Make values NULLable by default, so that empty values do not
get submitted to the Elasticsearch server.
This helps e.g. with empty date fields - Elasticsearch would try to
convert the field type to string when the value is an empty string,
but that fails when there are documents with properly filled date fields

2. Remove _id from the POST array because this is not allowed.
The server fails if it is included with
> mapper_parsing_exception:
> Field [_id] is a metadata field and cannot be added inside a document.
> Use the index API request parameters.

3. Use the correct URL to create a document: "$index/_doc/"
and "$index/_doc/$id". This is the same for ES 7 and 8:
- https://www.elastic.co/guide/en/elasticsearch/reference/8.17/docs-index_.html#docs-index-api-request
- https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-index_.html#docs-index-api-request

4. Handle failed creations by checking for false

5. Return the "result" property string instead of the non-existing
"created" property.
2025-03-10 21:13:16 +01:00
Jakub Vrana
31f8f61d0e MySQL, MariaDB: Fix default values with ' (fix #895) 2025-03-10 21:01:21 +01:00
Jakub Vrana
e589ee3fde MariaDB: Fix creating and altering generated columns (fixes #897) 2025-03-10 19:18:14 +01:00
Jakub Vrána
35274f18bb Update issue templates 2025-03-10 19:09:56 +01:00
Jakub Vrana
f8b2640156 Fix gzip export (fixes #896) 2025-03-10 18:51:28 +01:00
Jakub Vrana
bb23546478 Use <datalist> for altering collations 2025-03-10 14:13:34 +01:00
Jakub Vrana
dddfc190a5 Split helper html_radios 2025-03-10 11:31:43 +01:00
Jakub Vrana
40760d153c Update changes 2025-03-10 09:09:09 +01:00
Peter Knut
4fe3d17255 Update Slovak translation 2025-03-10 09:09:09 +01:00
Jakub Vrana
6dcc5081e1 Fix importing multiple SQL files not terminated by semicolon
Inspired by adminneo-org/adminneo#1c08e86.
2025-03-10 09:09:09 +01:00
Jakub Vrana
df6fe6b108 Fix link 2025-03-10 09:09:09 +01:00
Jakub Vrana
e6339046ff Remove unused variable 2025-03-10 09:09:09 +01:00
Jakub Vrana
2c0cfbdd3f Develop 2025-03-10 09:09:09 +01:00
Christian Weiske
f13770c664 Make login to Elasticsearch work again
By partially reverting the changes made by
commit 2c9f380c64
> Elastic: Remove plugin for version 5
which removed the passwordless login plugin from adminer/elastic.php
2025-03-10 08:53:19 +01:00
Jakub Vrana
100a1f49bc Release 5.0.2 2025-03-10 07:18:15 +01:00
Jakub Vrana
47ccd9b44d Add comment 2025-03-09 18:29:02 +01:00
Dragsio
7512bc2d51 Wrap username in <span>
Username enclosed in tags for better use of custom themes (eg. vertical padding).
2025-03-09 18:28:50 +01:00
Jakub Vrana
4991817b0d Extract variable 2025-03-08 23:12:08 +01:00
Peter Knut
e883ad428e Add support for "order" field privilege
In Elasticsearch, text fields are not sortable.
2025-03-08 23:12:00 +01:00
Peter Knut
87d87248c1 Add support for "where" field privilege
In Elasticsearch, only indexed fields are searchable.
2025-03-08 23:05:16 +01:00
Jakub Vrana
862e5b4aa4 Move variable initialization 2025-03-08 21:45:21 +01:00
Jakub Vrana
ad2cbbf26e Use helper function 2025-03-08 19:59:32 +01:00
Jakub Vrana
afe7dd9ad9 Display explain on first click
Also remove extra newlines in explain
2025-03-08 18:18:58 +01:00
Jakub Vrana
3b2ef32349 Add missing namespace to plugin 2025-03-08 17:32:52 +01:00
Jakub Vrana
47b64f4752 Composer: Add script for cleaning 2025-03-08 17:10:21 +01:00
Jakub Vrana
a1c3e34e04 Translations: check fullstops in 'ja' and 'he' 2025-03-08 17:06:30 +01:00
Jakub Vrana
608eec89dd Translations: Add missing placeholders 2025-03-08 10:05:14 +01:00
Jakub Vrana
cfe39e48ca Update xx translation 2025-03-08 10:05:11 +01:00
Jakub Vrana
900a3c0d6a Translations: Fix fullstops 2025-03-08 08:09:29 +01:00
Jakub Vrana
ead6a9a36f Polish: Change link to web 2025-03-08 06:49:32 +01:00
Matthaiks
d05a758a88 Update Polish translation 2025-03-08 06:47:52 +01:00
Jakub Vrana
b0450d0d2a PostgreSQL: Fix setting NULL and original value on enum (bug #884) 2025-03-08 06:44:12 +01:00
Jakub Vrana
e7c3a046a7 Oracle: Fix Db::result 2025-03-08 06:14:26 +01:00
Jakub Vrana
d35c896b92 Add helper function 2025-03-08 06:13:18 +01:00
Jakub Vrana
4b71549ca0 CockroachDB: Add support via PostgreSQL driver
This fixes cockroachdb/cockroach#40391.
2025-03-08 05:56:49 +01:00
Jakub Vrana
ab0f07dd81 Don't create Driver with connection error 2025-03-08 05:37:01 +01:00
Jakub Vrana
c19e6f27f1 Move issues to GitHub 2025-03-07 19:42:21 +01:00
Jakub Vrana
14b257784b Develop 2025-03-07 13:19:34 +01:00
Jakub Vrana
b93d4e2882 Release 5.0.1 2025-03-07 13:17:55 +01:00
Jakub Vrana
28c171f681 PostgreSQL: Support indexes on materialized views (PR #467) 2025-03-07 13:13:58 +01:00
Jakub Vrana
22a544f71c Add missing namespace 2025-03-07 12:50:23 +01:00
Jakub Vrana
2c9f380c64 Elastic: Remove plugin for version 5 2025-03-07 12:17:14 +01:00
Jakub Vrana
9918f4155e Pass credentials to connect() 2025-03-07 12:03:29 +01:00
Jakub Vrana
95e6a65999 Remove duplicate columns from select (bug #670) 2025-03-07 11:36:36 +01:00
Jakub Vrana
94ed6f0e98 MariaDB: Fix link to status variable doc (bug #658) 2025-03-07 11:05:31 +01:00
Jakub Vrana
99eb2f95a5 Develop 2025-03-07 09:41:01 +01:00
Jakub Vrana
8d7cb5954d Release 5.0.0 2025-03-07 09:40:15 +01:00
Jakub Vrana
47700f2763 PostgreSQL: Fix exporting foreign keys 2025-03-07 08:02:06 +01:00
Jakub Vrana
a4a8f48a9c PHPCS: Ignore compiled files 2025-03-07 07:56:35 +01:00
Jakub Vrana
770a77ac33 Wrap long lines 2025-03-07 07:44:26 +01:00
Jakub Vrana
8ceaf36de7 Editor: Fix getting fields 2025-03-07 07:17:05 +01:00
Jakub Vrana
517d2d1c2f MS SQL: Support computed columns 2025-03-07 06:42:27 +01:00
Jakub Vrana
af5d519266 SQLite: Support generated columns 2025-03-07 06:07:25 +01:00
Jakub Vrana
c045b20a8e Allow creating generated columns (bug #857) 2025-03-07 05:18:56 +01:00
Jakub Vrana
874307a27f Fix undefined variable 2025-03-07 04:56:31 +01:00
Jakub Vrana
c27b91a167 MySQL: Drop support for MySQL 4 2025-03-07 03:58:42 +01:00
Jakub Vrana
afe03ef720 MySQL: Display generated value in table structure 2025-03-07 03:58:33 +01:00
Jakub Vrana
c0e2ab22d5 Syntax highlight generated expressions 2025-03-06 19:47:05 +01:00
Jakub Vrana
7351980beb Skip generated columns in multi-edit (bug #882) 2025-03-06 19:32:19 +01:00
Jakub Vrana
7b5a20334d Don't allow inline edit of generated columns 2025-03-06 18:59:20 +01:00
Jakub Vrana
6262b120f5 PostgreSQL: Skip editing generated columns 2025-03-06 18:44:18 +01:00
Jakub Vrana
bd27ca0b2b Add comment 2025-03-06 18:36:26 +01:00
Jakub Vrana
aa7cf70d25 JS: Use || 2025-03-06 18:23:20 +01:00
Jakub Vrana
94a4f61db2 PHP: Use ?: 2025-03-06 18:12:22 +01:00
Jakub Vrana
dc50bf17ea SQLite: Remove useless condition 2025-03-06 17:55:45 +01:00
Jakub Vrana
f05f4b4cbc Change $jush to constant 2025-03-06 17:51:20 +01:00
Jakub Vrana
0541680d73 Move constants to namespace 2025-03-06 17:34:21 +01:00
Jakub Vrana
5a84ff7647 PostgreSQL: Display ? instead of -1 rows in table overview (bug #883) 2025-03-06 17:08:32 +01:00
Jakub Vrana
edd7c67797 Delete incorporated plugin 2025-03-06 14:59:48 +01:00
Jakub Vrana
c6f825a786 Move $enum_length to Driver 2025-03-06 14:51:24 +01:00
Jakub Vrana
f711135574 Move $inout to Driver 2025-03-06 14:49:08 +01:00
Jakub Vrana
2b16f51933 PDO: Support search by expression.
This reverts b848764.
2025-03-06 14:40:13 +01:00
Jakub Vrana
d268e0ebb4 ClickHouse: Check for allow_url_fopen 2025-03-06 14:30:50 +01:00
Jakub Vrana
5fdaae27dc Move possible drivers and JUSH to Driver 2025-03-06 14:27:58 +01:00
Jakub Vrana
049536da90 Mongo: Use $this->_conn 2025-03-06 14:10:05 +01:00
Jakub Vrana
bddce074fa Mongo: Add Driver outside of if 2025-03-06 14:08:19 +01:00
Jakub Vrana
347d9f1f55 Move on_actions to Driver 2025-03-06 14:04:47 +01:00
Jakub Vrana
a8feb00098 Move unsigned to Driver 2025-03-06 13:58:15 +01:00
Jakub Vrana
69d7d76dc5 Move operators, functions and grouping to Driver 2025-03-06 13:51:49 +01:00
Jakub Vrana
2f0cd4185b Move edit functions to Driver 2025-03-06 13:28:04 +01:00
Jakub Vrana
37a75f3759 Move types to Driver 2025-03-06 12:35:20 +01:00
Takashi SHIRAI
d2add4dd72 Fix the primary key for MS SQL
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-03-06 08:54:59 +01:00
Jakub Vrana
f5d47d46a0 Use anonymous function 2025-03-05 17:08:29 +01:00
Jakub Vrana
e8d9a126be Rely on PHP 5.3 2025-03-05 17:05:19 +01:00
Jakub Vrana
12f0a4bc9a Inform about namespace use 2025-03-05 16:54:53 +01:00
Jakub Vrana
d9df9693e3 Code style: Add more checks 2025-03-05 16:33:22 +01:00
Jakub Vrana
873d6d50fd Code style: explain rules 2025-03-05 15:55:33 +01:00
Jakub Vrana
c873ceba17 Use PHP 5.3 functions 2025-03-05 15:54:13 +01:00
Jakub Vrana
0bf8861dd1 Plugins: Use namespace for driver functions 2025-03-05 15:54:08 +01:00
Jakub Vrana
137ac2396b Fix plugin autoloading 2025-03-05 15:39:48 +01:00
Jakub Vrana
755d7b47ac Code style: Check camel caps except in drivers 2025-03-05 15:37:16 +01:00
Jakub Vrana
dd947fc1ee Don't check code style in compiled files 2025-03-05 15:36:25 +01:00
Jakub Vrana
105999f62e Code style: Indent long statements 2025-03-05 15:01:21 +01:00
Jakub Vrana
ed5de27dd3 Code style: Indent long statements 2025-03-05 14:59:13 +01:00
Jakub Vrana
293e031498 Plugins: Add missing namespaces 2025-03-05 14:51:55 +01:00
Jakub Vrana
a7f097e78c Code style: Indent long statements 2025-03-05 14:51:17 +01:00
Jakub Vrana
af68e30742 Code style: Remove newline before } 2025-03-05 14:38:48 +01:00
Jakub Vrana
f820fa1c26 Mark abstract classes 2025-03-05 14:31:53 +01:00
Jakub Vrana
f468c095ae Make root namespace explicit 2025-03-05 14:25:09 +01:00
Jakub Vrana
c10b614ee1 Mongo: inline class names 2025-03-05 14:20:54 +01:00
Jakub Vrana
f5b255230b Don't require namespace in example 2025-03-05 14:15:32 +01:00
Jakub Vrana
54568ddef6 PDO: Support namespaces 2025-03-05 14:15:17 +01:00
Jakub Vrana
3da09dd31a Rename Min_ classes 2025-03-05 14:12:42 +01:00
Jakub Vrana
45ac930e06 Update todo 2025-03-05 13:45:42 +01:00
Jakub Vrana
e801753519 Remove extra newline 2025-03-05 13:45:23 +01:00
Jakub Vrana
a4e9f7b87b Fix tests 2025-03-05 13:31:50 +01:00
Jakub Vrana
35829eedaf Use namespace 2025-03-05 13:31:03 +01:00
Jakub Vrana
44c2e979f7 Compile: Support else after if (support) 2025-03-05 13:19:17 +01:00
Jakub Vrana
2a8b4009b1 Namespaces in compile 2025-03-05 13:14:21 +01:00
Jakub Vrana
6ceebc99df Add namespace in lang.php 2025-03-05 13:10:41 +01:00
Jakub Vrana
2f49bfb67e Return accidentally removed error message 2025-03-05 13:10:41 +01:00
Jakub Vrana
e1e085f312 Use namespace in callbacks 2025-03-05 13:10:40 +01:00
Jakub Vrana
50e7a65e6e Use namespaces in plugins 2025-03-05 13:10:40 +01:00
Jakub Vrana
52c5392089 PHP: Use namespace 2025-03-05 13:10:40 +01:00
Jakub Vrana
5a708df6ca Coding style: Check newline at {} 2025-03-05 13:10:40 +01:00
Jakub Vrana
c52ba0308e Specify coding style and follow it 2025-03-05 13:10:37 +01:00
Jakub Vrana
422668f2d7 Composer: Exclude drivers from classmap 2025-03-05 06:35:54 +01:00
Jakub Vrana
f0335f7f8b Hide Refresh link if it does nothing 2025-03-04 19:58:26 +01:00
Jakub Vrana
cc635acd20 Remove unnecessary function 2025-03-04 19:52:07 +01:00
Jakub Vrana
63dd38c44d PostgreSQL: Compute size of all databases (bug #881) 2025-03-04 19:40:42 +01:00
Jakub Vrana
e411c229ab Fix enum alignment 2025-03-04 18:53:01 +01:00
Jakub Vrana
b9d6529442 Remove margin from td pre 2025-03-04 18:46:28 +01:00
Jakub Vrana
0426bd4610 Designs: Fix logout button 2025-03-04 18:44:40 +01:00
Jakub Vrana
c7d283d262 Designs: Fix background of pre.jush 2025-03-04 18:34:07 +01:00
Jakub Vrana
d61678f5cb Reapply "Fix background color of <pre> used as edit field"
This reverts commit 9b25969fb2.
2025-03-04 18:11:32 +01:00
Jakub Vrana
94088474dd Design bilal-dark: Add missing icons 2025-03-04 18:10:23 +01:00
Jakub Vrana
9b25969fb2 Revert "Fix background color of <pre> used as edit field"
This reverts commit 0717bce535.
2025-03-04 11:04:26 +01:00
Jakub Vrana
996b178406 MySQL: Fix connecting with self-signed cert 2025-03-03 16:06:10 +01:00
Jakub Vrana
116827060f PostgreSQL, MS SQL, Oracle: Hide table actions for information_schema 2025-03-03 15:54:08 +01:00
Jakub Vrana
af87336116 Add TODO 2025-03-03 15:43:04 +01:00
jfonsato
17939b56c4 PostgreSQL: Show only accessible databases 2025-03-03 15:34:43 +01:00
Christian Weiske
d5a17835ff Elastic: Fix text search on boolean fields
When searching in all fields for a text value, an error was thrown
with ElasticSearch 7.17.23 when the index contains boolean fields:

> query_shard_exception: failed to create query:
> Can't parse boolean value [textvalue], expected [true] or [false]

This patch fixes that problem by skipping boolean fields when the
search word is not the string "true" or "false".
2025-03-03 10:40:38 +01:00
Matrixman
4967a40410 New version of design rmSOFT
New version of design rmSOFT
2025-03-03 09:36:21 +01:00
Jan Tojnar
4cdcb44bee Use more [] in doc-comments
Follow up to 42de70d032
2025-03-03 08:39:17 +01:00
Jakub Vrana
160beb726a MS SQL: Link help from sys tables 2025-03-03 08:18:20 +01:00
Jakub Vrana
fb3b23617d Don't autofocus computed fields in insert form 2025-03-03 06:34:02 +01:00
Jakub Vrana
dfe3cc1888 Warn about failed type export 2025-03-03 05:17:00 +01:00
Jakub Vrana
c1704d83c1 Add comment 2025-03-03 05:16:15 +01:00
Jakub Vrana
364a4bce1f Update todo 2025-02-28 17:28:35 +01:00
Jakub Vrana
d9bca2df37 Speed up with disabled output buffering 2025-02-28 15:37:18 +01:00
Jakub Vrana
315ffc9d8b CSV import: Don't unquote " in unquoted values 2025-02-28 14:40:31 +01:00
Denitz
530b3dd1e5 Add Reset button for tables-filter plugin 2025-02-28 13:52:32 +01:00
Jakub Vrana
980c22fe8d MS SQL: Don't insert identity without IDENTITY_INSERT 2025-02-27 09:42:33 +01:00
Jakub Vrana
26d1e51916 PostgreSQL: Display ENUM types 2025-02-27 09:41:31 +01:00
Jakub Vrana
6d889b9f99 Add test for check constraints 2025-02-27 08:26:05 +01:00
Jakub Vrana
7e4ee77cc0 Fix Create table test 2025-02-27 08:10:44 +01:00
Jakub Vrana
742fd7dcb6 Remove <datalist> from tests 2025-02-27 08:09:45 +01:00
Jakub Vrana
d23a0eb77e PostgreSQL: Export ENUM types (bug #587) 2025-02-26 23:55:17 +01:00
Jakub Vrana
5eac6a44bd PostgreSQL: Link enum doc 2025-02-26 23:38:07 +01:00
Jakub Vrana
db300bc38b MS SQL: Specify columns in CSV import 2025-02-26 22:49:22 +01:00
Jakub Vrana
48a680658c MS SQL: Do not update primary key in CSV import 2025-02-26 22:47:16 +01:00
Jakub Vrana
70f9ff75fc MS SQL: Fix CSV import (bug #859) 2025-02-26 22:40:28 +01:00
Jakub Vrana
81340ff7e5 MS SQL: Compute arrays in insertUpdate only once 2025-02-26 22:35:00 +01:00
Jakub Vrana
89b097c699 Don't hide import if there was an error 2025-02-26 22:28:01 +01:00
Jakub Vrana
e075f4bd8b MS SQL: Import all CSV rows with one command 2025-02-26 22:27:43 +01:00
Jakub Vrana
e8fa48a257 MS SQL: Set identity_insert in CSV import 2025-02-26 22:11:41 +01:00
Takashi SHIRAI
0ed3c5cb19 Fix insertUpdate for mssql
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-02-26 22:04:58 +01:00
Jakub Vrana
2f237dfa04 MS SQL export: Create foreign keys after all tables 2025-02-26 21:39:45 +01:00
Jakub Vrana
afdc78a07b PostgreSQL: Sort PRIMARY and UNIQUE indexes first 2025-02-26 21:28:02 +01:00
Jakub Vrana
3dc87c1811 PostgreSQL: Do not alter indexes with expressions 2025-02-26 21:24:47 +01:00
Jakub Vrana
de7bb79132 Remove empty string 2025-02-26 20:01:56 +01:00
Jakub Vrana
f81658ecfe PostgreSQL: Add missing CHECK in export 2025-02-26 19:56:16 +01:00
Jakub Vrana
a603de853d PostgreSQL: Move primary key in export back to table 2025-02-26 19:55:49 +01:00
Jakub Vrana
2998db57d4 PostgreSQL: Print errors in export 2025-02-26 19:37:18 +01:00
Jakub Vrana
9aaa429528 PostgreSQL: Fix export of indexes with expressions (bug #768) 2025-02-26 19:27:19 +01:00
Jakub Vrana
ba70be12a4 PostgreSQL: Fix help link to pg_catalog views 2025-02-26 19:21:13 +01:00
Jakub Vrana
4b47326ffa Use use_sql 2025-02-26 18:47:25 +01:00
Jakub Vrana
848cd482e2 MS SQL: Add support for PDO_SQLSRV extension 2025-02-26 18:08:18 +01:00
Takashi SHIRAI
15cd83fc39 Add seek() to Min_PDOStatement for mssql.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-02-26 17:43:35 +01:00
Jakub Vrana
4de6e47c0a Use \W in friendly_url() 2025-02-26 16:48:02 +01:00
Jakub Vrana
45f24a8f62 Delete unused functions 2025-02-26 16:48:02 +01:00
Jakub Vrana
cf835515b1 Support compiling Elastic driver 2025-02-26 16:48:02 +01:00
Jakub Vrana
c38b967fc4 Foreign keys: Switch schema back after getting the tables 2025-02-26 16:48:02 +01:00
Jakub Vrana
efb1eb9d6b MS SQL: Remove support for MSSQL extension 2025-02-26 16:48:02 +01:00
Jakub Vrana
ce1031e017 MS SQL: Split altering foreign key to two commands 2025-02-26 16:48:02 +01:00
Jakub Vrana
d54be5ac2e MS SQL: Display foreign keys ON UPDATE and ON DELETE 2025-02-26 16:47:55 +01:00
Jakub Vrana
76cc7c6614 MS SQL: Set identity_insert in export 2025-02-26 16:47:24 +01:00
Jakub Vrana
54dd702763 Fix bug number 2025-02-26 16:47:24 +01:00
Jakub Vrana
dfd26d0704 MS SQL: Support export 2025-02-26 16:47:18 +01:00
Jakub Vrana
0f8460b5e8 PostgreSQL: Use function for exporting constraints 2025-02-26 12:35:25 +01:00
Jakub Vrana
09883aa2f5 SQLite: Remove support for SQLite version 2 2025-02-26 12:20:37 +01:00
Jakub Vrana
e3a2b1b57a SQLite: Support CHECK constraint 2025-02-26 12:20:37 +01:00
Jakub Vrana
a28d95a023 SQLite: Constraint getting view by name to views only 2025-02-26 12:20:37 +01:00
Jakub Vrana
ab025e74a3 SQLite: Display all rows of variable values 2025-02-26 12:20:37 +01:00
Jakub Vrana
8077ef41c1 SQLite: Add command Check tables 2025-02-26 12:20:36 +01:00
Jakub Vrana
9d8864a6c7 Compile: Fix removing single driver login form field 2025-02-26 12:20:36 +01:00
Jakub Vrana
e107ef52d5 Move \n to loginFormField 2025-02-26 12:20:36 +01:00
Jakub Vrana
57ec1f924d Allow compiling driver from plugins 2025-02-26 12:20:36 +01:00
Jakub Vrana
491b481b7f Use __DIR__ 2025-02-26 12:20:36 +01:00
Jakub Vrana
e327d31a08 Hide SQL export if driver doesn't support it 2025-02-26 12:20:34 +01:00
Denitz
708a4e9494 Update table-structure.php 2025-02-25 16:44:25 +01:00
Jakub Vrana
c55ad679ac Use Default setup for CodeQL analysis 2025-02-25 16:41:08 +01:00
Jakub Vrana
dccbdfde97 MongoDB: Remove support for deprecated extension mongo 2025-02-25 15:59:04 +01:00
Jakub Vrana
09091c0dac Develop 2025-02-25 07:32:48 +01:00
Jakub Vrana
bb22a965b2 Release 4.17.1 2025-02-25 07:31:42 +01:00
Jakub Vrana
4f0da70733 Move is_c_style_escapes to Min_Driver 2025-02-25 07:26:08 +01:00
Jakub Vrana
a1235f68ff SQLite: Disable backslash escapes 2025-02-25 07:15:57 +01:00
Jakub Vrana
0138f3b0a5 Oracle: Fix foreign key doc link 2025-02-25 07:09:10 +01:00
Jakub Vrana
192ae38d57 MS SQL: Link doc with current version 2025-02-25 06:58:10 +01:00
Jakub Vrana
620e147b8c Check: Add doc link 2025-02-25 06:54:07 +01:00
Jakub Vrana
644cde4855 MS SQL: Update doc_links 2025-02-25 06:52:27 +01:00
Jakub Vrana
c15576bbf8 Use get_rows() 2025-02-25 06:36:32 +01:00
Jakub Vrana
0d8028ddc5 Compile: Do not warn about functions without declared support 2025-02-25 06:30:22 +01:00
Jakub Vrana
242f5a1ed8 MySQL: Fix typo in the date type (regression from 4.17.0) 2025-02-25 05:41:41 +01:00
Jakub Vrana
d12ea17b17 Remove bogus comment 2025-02-25 05:41:12 +01:00
Jakub Vrana
a7365a50b1 Remove border-collapse: separate in designs after removing cellspacing 2025-02-24 16:41:35 +01:00
Jakub Vrana
b5beffb37c Develop 2025-02-24 12:21:15 +01:00
Jakub Vrana
6b20230d50 Release 4.17.0 2025-02-24 12:20:55 +01:00
Jakub Vrana
836dba07af Warn about missing functions only in single-driver compile 2025-02-24 10:05:31 +01:00
Jakub Vrana
883e0a6619 MySQL 9+: Support vector type 2025-02-23 23:01:43 +01:00
Jakub Vrana
5000e7dc16 Inline function 2025-02-23 18:48:50 +01:00
Jakub Vrana
798432935d PostgreSQL 8+: Fix exporting table constraints 2025-02-23 18:47:11 +01:00
Jakub Vrana
08060f3253 PostgreSQL: Export functions 2025-02-23 18:28:33 +01:00
Jakub Vrana
6d59ed6d7e Fix comment 2025-02-23 18:17:11 +01:00
Jakub Vrana
eb0d5c3c5e Print SQL errors as comments in export 2025-02-23 17:42:23 +01:00
Jakub Vrana
04d707ef94 Anonymous functions require PHP 5.3 2025-02-23 17:07:01 +01:00
Jakub Vrana
004ac1c782 Use less brackets 2025-02-23 17:04:43 +01:00
Jakub Vrana
3ad62d55c8 Show comments at routine call (bug #874) 2025-02-23 16:35:23 +01:00
Jakub Vrana
42de70d032 Use [] in doc-comments 2025-02-23 14:39:14 +01:00
Jakub Vrana
aa2907190e MS SQL: Don't support C-style escapes 2025-02-23 14:39:14 +01:00
Jakub Vrana
5c8b6a3408 Use $connection->result 2025-02-23 14:39:13 +01:00
Jakub Vrana
7f883b9302 Fit number 100 in .size (text length) 2025-02-23 13:40:41 +01:00
Jakub Vrana
27db0914ca Style auto_increment value 2025-02-23 13:40:14 +01:00
Jakub Vrana
483cbf1616 Fix indent 2025-02-23 13:36:37 +01:00
Jakub Vrana
08a956cf2a Offer original values in multi-row editing (regression from 4.16.0) 2025-02-23 13:28:21 +01:00
Jakub Vrana
9d992e4be6 MySQL: Don't offer empty enum value in edit
MySQL errors if there's an invalid value on the first row of INSERT or
UPDATE, regardless of the sql_mode variable.
2025-02-23 13:24:30 +01:00
Jakub Vrana
7ece69a8c4 Remove unused HTLM attribute 2025-02-23 11:42:05 +01:00
Jakub Vrana
1838df9465 Narrows screens: Move lang and logout under h1 2025-02-23 11:25:07 +01:00
Jakub Vrana
4e6ad13eac Move Logout button on narrow screens
This avoids overlapping Logout and breadcrumb.
The button also didn't display on far right due to width: fit-content.
2025-02-23 10:59:56 +01:00
Jakub Vrana
ba35e11bae Ignore error in dropping old constraint 2025-02-23 08:41:33 +01:00
Jakub Vrana
834f4b6c5b Specify viewport width 2025-02-23 08:35:09 +01:00
Jakub Vrana
176f2923cd Fix comment 2025-02-22 23:18:18 +01:00
Jakub Vrana
aaaca731cd MS SQL: Support CHECK constraint 2025-02-22 21:21:47 +01:00
Jakub Vrana
ee9932a0dd PostgreSQL: Support CHECK constraint 2025-02-22 21:08:23 +01:00
Jakub Vrana
c34c672df9 Support constraint checks in compile 2025-02-22 20:40:14 +01:00
Joe Koop
550289de51 MySQL: Support CHECK constraint
added list of check constraints to mysql table view

added create, alter, drop check constraints (mysql)

chore: use the correct function to sql-escape

fix: feature detection for check constraints (mysql)

fix: get check constraint info (mysql)

correct the capitalization of a section title

to be consistent with the other section titles

added a missing `</thead>`
2025-02-22 20:37:59 +01:00
Jakub Vrana
f652ff807e Update CodeQL 2025-02-22 19:01:06 +01:00
Jakub Vrana
746603bdc7 Update tests 2025-02-22 16:31:02 +01:00
Jakub Vrana
e9d9a30844 Use password in example 2025-02-22 16:21:07 +01:00
Jakub Vrana
4d5de895e2 Use new Katalon format 2025-02-22 16:20:31 +01:00
Jakub Vrana
e282ced59e PostgreSQL: Constraint enum values in editing (bug #270) 2025-02-22 13:42:28 +01:00
Jakub Vrana
20d722b882 PostgreSQL: Link user defined types 2025-02-22 12:36:58 +01:00
Jakub Vrana
c1c3b84fff Fix links to PostgreSQL docs 2025-02-22 12:18:14 +01:00
Jakub Vrana
b176a0fbd4 Add TODO 2025-02-22 12:16:15 +01:00
Jakub Vrana
8456779e18 MS SQL: Allow changing default values 2025-02-22 11:08:23 +01:00
Jakub Vrana
3b69ff4ce2 MS SQL: Fix length of nvarchar columns 2025-02-22 10:39:14 +01:00
Jakub Vrana
3a101e873f MS SQL: Allow adding default values 2025-02-22 10:36:44 +01:00
Jakub Vrana
6ecef5eca6 MS SQL: Display default values (bug #732) 2025-02-22 10:11:03 +01:00
Jakub Vrana
707958c63d Remove (beta) from MS SQL 2025-02-22 09:50:20 +01:00
Jakub Vrana
5d18df1d82 MS SQL: Allow altering table in non-default schema (bug #405) 2025-02-22 09:42:36 +01:00
Jakub Vrana
8602304d86 Hide index column options by default 2025-02-22 09:25:39 +01:00
Jakub Vrana
e744fecd98 Make space for the Use button 2025-02-22 08:12:04 +01:00
Jakub Vrana
b58e03f5fc Editor: PDO: Select value of foreign key in edit (bug #847) 2025-02-22 07:56:22 +01:00
Jakub Vrana
40a86bffa2 Add HTML newlines 2025-02-21 21:40:59 +01:00
Jakub Vrana
b7b22486b2 Fix undefined variable in SQL export 2025-02-21 21:35:25 +01:00
Jakub Vrana
cbf7373b54 Wrap long lines in designs 2025-02-21 21:31:58 +01:00
Jakub Vrana
b29767dcfb Use CSS to highlight odd rows 2025-02-21 21:27:41 +01:00
Jakub Vrana
db75be9ba7 Add TODO 2025-02-21 18:40:07 +01:00
Jakub Vrana
67c991846e Hide collations if empty 2025-02-21 18:21:41 +01:00
Jakub Vrana
7d3266b369 MySQL: Fix links to information_schema help 2025-02-21 17:31:56 +01:00
Sebastian Butsch
5f3a820571 Set body width to auto 2025-02-21 17:20:17 +01:00
Jakub Vrana
e7df6bf616 Remove CSS vendor prefixes 2025-02-21 17:01:54 +01:00
Jakub Vrana
1d8bd0a210 Wrap connection error message 2025-02-21 14:29:22 +01:00
Jakub Vrana
6fe9827eea Trim trailing whitespace 2025-02-21 13:59:17 +01:00
Jakub Vrána
7900062d4d Update funding 2025-02-21 11:57:52 +01:00
Jakub Vrana
63cffbbc8a Fix style 2025-02-21 10:57:11 +01:00
Jakub Vrana
0b3baa1e23 Fix Latvian plurals 2025-02-21 09:40:31 +01:00
Jakub Vrana
e3fbc56b6f SQLite: Show all supported pragmas in Variables 2025-02-20 18:11:18 +01:00
Jakub Vrana
00607012af Update TODO 2025-02-20 17:59:02 +01:00
Jakub Vrana
e4e5941b90 Wrap long lines 2025-02-20 17:58:00 +01:00
Jakub Vrana
097f2a1242 Develop 2025-02-20 16:40:14 +01:00
Jakub Vrana
c81bed0baa Fix indent 2025-02-20 16:27:39 +01:00
Jakub Vrana
9c9fc4a85b Release 4.16.0 2025-02-20 15:58:15 +01:00
Jakub Vrana
b46b1dd574 Fix typo in comment 2025-02-20 11:47:38 +01:00
Jakub Vrana
f248fb29b1 PostgreSQL: Support adding auto_increment (bug #761) 2025-02-20 11:13:50 +01:00
Jakub Vrana
94f75f9798 PostgreSQL: Support dropping auto_increment 2025-02-20 11:12:39 +01:00
Jakub Vrana
f2e2c6e4ac SQLite: Fix expressions in default values (bug #860) 2025-02-20 09:37:43 +01:00
Jakub Vrana
e321a26ee5 Move functions unused in Editor 2025-02-20 09:11:59 +01:00
Jakub Vrana
f35dd89c65 Fix style 2025-02-20 08:37:13 +01:00
Bilal Yameen
8f2b4ced62 Dark theme for Adminer 2025-02-19 21:22:57 +01:00
Peter Knut
5eb3446908 MSSQL: Allow to set Encrypt and TrustServerCertificate with AdminerLoginSsl plugin (issue #5)
https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax#use-trustservercertificate
2025-02-19 21:20:53 +01:00
Peter Knut
a685d414ad Change version layout 2025-02-19 20:47:36 +01:00
Pavel Železný
7c9fec4e6b Fix mysqli ssl without server certificate 2025-02-19 20:17:48 +01:00
araisch
224cbfed56 MySQL SSL: Allow disabling cert verification 2025-02-19 19:20:37 +01:00
Jakub Vrana
490d274662 Update TODO 2025-02-19 19:10:36 +01:00
Peter Knut
3a27c4f64c Editor: Fix searching in tables
Thanks to ytetsuro (https://github.com/vrana/adminer/pull/473)
2025-02-19 19:04:47 +01:00
Jakub Vrana
bd6ebcaab9 Remove spaces 2025-02-19 19:00:47 +01:00
Peter Knut
1f97968e65 PostgreSQL: Allow to set connection's sslmode with AdminerLoginSsl plugin
Thanks to wodka (https://github.com/vrana/adminer/pull/427/files)
2025-02-19 18:54:24 +01:00
Vladimir
dfb33a323d Add .gitattributes, exclude tests from archive 2025-02-19 17:03:34 +01:00
Jakub Vrana
869c2b92ea Remove design submodules 2025-02-19 15:13:46 +01:00
Jakub Vrana
675dbaad73 SQLite: Fix getting result of queries with no rows 2025-02-19 15:06:55 +01:00
Jakub Vrana
a001a3a061 SQLite: Fix altering forign keys (bug #841) 2025-02-19 15:02:11 +01:00
Jakub Vrana
df451f4374 MySQL: Fix saving bit(64) values (bug #839) 2025-02-19 14:57:41 +01:00
Jakub Vrana
9def8d7f95 MS SQL: Foreign keys in non-default schema (bug #833) 2025-02-19 14:36:54 +01:00
Vladimir Goncharov
2385bf72bd support for array values in clickhouse driver 2025-02-19 14:36:07 +01:00
Jakub Vrana
12427467f7 Fix lowercase title 2025-02-19 14:36:07 +01:00
Jakub Vrana
2bec4ca11b Avoid global variables in plugins drivers 2025-02-19 14:36:07 +01:00
panji
e676303a26 MongoDB: Execute commands against the selected DB 2025-02-19 14:36:04 +01:00
Jakub Vrana
9261abc415 PostgreSQL: Preserve whitespace in EXPLAIN (bug #827) 2025-02-19 14:35:19 +01:00
Jakub Vrana
e5c05fe26c Elastic 5: Do not set Content-Type without content 2025-02-19 12:31:44 +01:00
Tim Alexander
21bf7e0570 Fix German Translation Errors 2025-02-19 12:07:19 +01:00
Jakub Vrana
93f04464a2 Oracle: Remove NOT REGEXP (bug #804) 2025-02-19 11:16:46 +01:00
Jakub Vrana
e03713ce2d Add LICENSE 2025-02-19 11:16:46 +01:00
Takashi SHIRAI
2da5683b99 Support to access tablespaces of granted tables
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2025-02-19 11:16:46 +01:00
Jakub Vrana
8ff20622fb Develop 2025-02-19 11:16:46 +01:00
Jakub Vrana
9ef14dbf77 Release 2025-02-19 11:16:46 +01:00
Jakub Vrana
274fa2259b Escape unknown field in select 2025-02-19 11:16:45 +01:00
Jakub Vrana
7541149522 Use Unicode 2025-02-19 11:16:45 +01:00
Jakub Vrana
2a3626faae SimpleDB: Disable XML entity loader 2025-02-19 11:16:45 +01:00
Jakub Vrana
d94e348f57 Use a better random string 2025-02-19 11:16:45 +01:00
Jakub Vrana
51dbfb6987 Hide error message from HTTP servers 2025-02-19 11:16:45 +01:00
Jakub Vrana
578c9fca92 Don't allow path in HTTP servers 2025-02-19 11:16:45 +01:00
Jakub Vrana
d9289355d7 Fix style 2025-02-19 11:16:45 +01:00
Jakub Vrana
874b9ee746 Use autofocus HTML attribute 2025-02-19 11:16:45 +01:00
Jakub Vrana
17974cdf76 VersionNoverify plugin: Do not block other plugins 2025-02-19 11:16:44 +01:00
Jakub Vrana
2d8b6ec771 Add PHP 8.1-8.4 2025-02-19 11:16:44 +01:00
Adrian Jones
5982060f3b Fix links to MySQL docs
It was directing to https://dev.mysql.com/doc/refman/9.2en/select.html instead of https://dev.mysql.com/doc/refman/9.2/en/select.html
2025-02-19 11:16:44 +01:00
Saiful Alam Rakib
6496ff5a47 Fix the UI of pappu687 for latest version 2025-02-19 11:16:44 +01:00
Jakub Vrana
6aa55d806b Bump version 2025-02-19 11:16:44 +01:00
Peter Knut
0ef358a6b5 Release 4.14.0 2025-02-19 11:16:44 +01:00
Peter Knut
882e9d02a0 PostgreSQL: Fix renaming database 2025-02-19 11:16:44 +01:00
Peter Knut
e346f47384 PostgreSQL: Fix starting value of exported autoincrement
Thanks to @OmlineEditor (https://github.com/adminerevo/adminerevo/issues/113)
2025-02-19 11:16:44 +01:00
Peter Knut
fdd02a5485 Modify naming of new foreign rows
Regexp is used to unify implementation with other similar situations. This also prevents false detection in CodeQL security scanning.
2025-02-19 11:16:43 +01:00
Lucas Sandery
7238bc7900 Update lucas-sandery theme
::file-selector-button got standardised.
2025-02-19 11:16:43 +01:00
Peter Knut
15ac0889c0 Bump version to 4.14-dev 2025-02-19 11:16:43 +01:00
Peter Knut
ab40931365 Fix main visual glitches in designs, remove broken designs 2025-02-19 11:16:43 +01:00
Peter Knut
5d6e9fff65 Bump version to 4.12.1-dev 2025-02-19 11:16:43 +01:00
Kian-Meng Ang
d6d86fa26a Fix some typos
https://github.com/adminerevo/adminerevo/pull/210
2025-02-19 11:16:43 +01:00
Peter Knut
f25ffb36f9 Update German translation
Thanks to wintstar (https://github.com/adminerevo/adminerevo/issues/219)
2025-02-19 11:16:43 +01:00
Peter Knut
49fd7858ac Release 4.12 2025-02-19 11:16:43 +01:00
Peter Knut
0628b8de02 MSSQL, MongoDB: Connect to localhost with default port if server is not specified 2025-02-19 11:16:42 +01:00
Peter Knut
99434644ef MongoDB: Fix parsing WHERE condition from SQL query
Thanks to herobank110 (https://github.com/vrana/adminer/pull/491)
2025-02-19 11:16:42 +01:00
vukbgit
5492b3e055 MariaDB: Add support for UUID data type
- MariaDB >= 10.7
- UUID string data type
- uuid() function for UUID type on new/edit item form
2025-02-19 11:16:42 +01:00
Peter Knut
84b69da58d Fix SQL query code direction if RTL language is used 2025-02-19 11:16:42 +01:00
Peter Knut
a51d0f4701 Bump version to 4.12.0-dev 2025-02-19 11:16:42 +01:00
Peter Knut
7cd82c8fd7 Release 4.11 2025-02-19 11:16:42 +01:00
Peter Knut
d065c9ba51 MySQL: Fix highlighting current table in menu on macOS 2025-02-19 11:16:41 +01:00
Peter Knut
f79340a0b5 Update CS and SK translations 2025-02-19 11:16:41 +01:00
HyP3r
4bc9a29f3e MS SQL: Prefix Unicode strings with 'N' so they are treated correctly 2025-02-19 11:16:41 +01:00
Peter Knut
81530227c2 MariaDB: Fix several links to documentation pages 2025-02-19 11:16:41 +01:00
Peter Knut
d8217d6ee2 Bump version to 4.10.1-dev 2025-02-19 11:16:41 +01:00
Peter Knut
02c13131e3 Release 4.10.0 2025-02-19 11:16:41 +01:00
Jakub Vrana
21c339901c PHP <5.6 compatibility 2025-02-19 11:16:41 +01:00
Peter Knut
06c4fd4855 Print username next to the logout button 2025-02-19 11:16:41 +01:00
Peter Knut
0a473cef18 Update readme.txt 2025-02-19 11:16:41 +01:00
Roy-Orbison
652a09bb91 Plugin to auto-include adminer.js when present 2025-02-19 11:16:40 +01:00
Peter Knut
47a9453ace Do not display empty action links in main menu 2025-02-19 11:16:40 +01:00
Peter Knut
d4f99d5cdc Bump version to 4.10-dev 2025-02-19 11:16:40 +01:00
Peter Knut
72ed1b5cdc Release 4.9.4 2025-02-19 11:16:40 +01:00
Peter Knut
4e825a36d3 Editor: Fix building links with array parameters
This solves a situation when enum data type has a foreign key to another table.
2025-02-19 11:16:40 +01:00
Peter Knut
927444ffdd Editor: Fix array conversion to string (issue #3) 2025-02-19 11:16:40 +01:00
Peter Knut
d9976c25fc Firefox: Fix opening a database to the new browser's tab with Ctrl+click 2025-02-19 11:16:40 +01:00
Peter Knut
c5fa212b26 Unify displaying of 'New item' action based on privileges 2025-02-19 11:16:40 +01:00
Peter Knut
edef2b1a3d Fix the width of inline edit field 2025-02-19 11:16:39 +01:00
Peter Knut
7eccd59856 Bump version to 4.9.4-dev 2025-02-19 11:16:39 +01:00
Peter Knut
476b957565 Release 4.9.3 2025-02-19 11:16:39 +01:00
Peter Knut
8e43fffe53 Hide invalid edit form if table record is not found 2025-02-19 11:16:39 +01:00
Peter Knut
d2c6ea21b6 PostgreSQL: Fix editing record that contains a field with GENERATED ALWAYS default value
Fields with GENERATED ALWAYS default values are also disabled.

Thanks to PurpleTape (https://github.com/adminerevo/adminerevo/issues/201).
2025-02-19 11:16:39 +01:00
SeaEagle
a310d52327 MySQL: Fix where clause for JSON column
Issue: https://github.com/adminerevo/adminerevo/issues/175
2025-02-19 11:16:39 +01:00
Peter Knut
0717bce535 Fix background color of <pre> used as edit field 2025-02-19 11:16:39 +01:00
Peter Knut
53aad3bb62 Do not include unchanged PARTITION BY definition into ALTER TABLE query 2025-02-19 11:16:39 +01:00
Peter Knut
99cd514a29 MariaDB: Fix comparing CURRENT_TIMESTAMP definition while altering a table 2025-02-19 11:16:39 +01:00
Peter Knut
8ea4892523 MySQL, PostgreSQL: Fix queries splitting and string constants
Thanks to alxivnov (https://github.com/vrana/adminer/pull/490).
2025-02-19 11:16:38 +01:00
Michael Graß
74e4bb9a6f Do not limit unlimited memory, fix number conversion warning 2025-02-19 11:16:38 +01:00
Peter Knut
3d2d39e7d0 Bump version to 4.9.3-dev 2025-02-19 11:16:38 +01:00
Peter Knut
06a4d294bd Release 4.9.2 2025-02-19 11:16:38 +01:00
Peter Knut
0d5e5819a0 Basic JS code cleanup 2025-02-19 11:16:38 +01:00
khoazero123
b17ffcc512 PostgreSQL: Fix exporting CREATE TABLE with sequence default value 2025-02-19 11:16:38 +01:00
Roy-Orbison
d91bd659a5 Function to retrieve driver name
Plugins cannot access $drivers global after compilation.
2025-02-19 11:16:38 +01:00
Peter Knut
1efb87fcbe PostgreSQL: Fix exporting CREATE TABLE query with GENERATED default values
Thanks to GottfriedCP (https://github.com/adminerevo/adminerevo/issues/157)
2025-02-19 11:16:38 +01:00
Peter Knut
d8f1521b60 PostreSQL: Fix search condition for network address types, add macaddr8 type
This fixes issue https://github.com/adminerevo/adminerevo/issues/115
2025-02-19 11:16:38 +01:00
Peter Knut
cb6e2f9a86 Bump version to 4.9.2-dev 2025-02-19 11:16:37 +01:00
Peter Knut
4824c578bf Release 4.9.1 2025-02-19 11:16:37 +01:00
Jakub Vrana
f4607d763c Ignore undefined property PHP warning 2025-02-19 11:16:37 +01:00
Peter Knut
12293ce215 PostgreSQL: Fix documentation link for SERIAL type
Thanks to leggiero (https://github.com/vrana/adminer/pull/432)
2025-02-19 11:16:37 +01:00
caltong
c47d933ab0 PostgreSQL: Make data length calculation more accurate 2025-02-19 11:16:37 +01:00
Thomas Daniels
6e6785ebc4 PostgreSQL: Show only accessible databases 2025-02-19 11:16:37 +01:00
Peter Knut
6d848bf165 Replace deprecated <acronym> with <abbr> 2025-02-19 11:16:37 +01:00
Peter Knut
2189947c43 AdminerLoginOtp: Autocomplete hints for OTP input field, code refactoring
Tanks to SGCBB (https://github.com/vrana/adminer/pull/488)
2025-02-19 11:16:37 +01:00
Sneda8
b6f9f58712 PHP 8.3 error suppression
PHP 8.3 has shortened the array access on null error message to "Trying to access array offset on null". This commit changes the regular expression used to circumvent errors.
2025-02-19 11:16:36 +01:00
Peter Knut
fdeb9557cd Improved displaying of long table names in menu 2025-02-19 11:16:36 +01:00
Peter Knut
11e1290b5b Add .editorconfig file
Thanks to cweiske (https://github.com/adminerevo/adminerevo/pull/163).
2025-02-19 11:16:36 +01:00
Peter Knut
ac9fd04f87 Fix field selection in Elasticsearch
Thanks to cweiske: https://github.com/adminerevo/adminerevo/pull/159
2025-02-19 11:16:36 +01:00
Peter Knut
2128c05e53 Bump version to 4.9.1-dev 2025-02-19 11:16:36 +01:00
Peter Knut
550db0691e Release 4.9 2025-02-19 11:16:36 +01:00
Adrian Jones
4484f5f620 Fix uninitialized string offset
This can happen if you include an unpaired single or double quote, eg: SELECT * FROM table_name WHERE field_name = 'test
2025-02-19 11:16:36 +01:00
Denitz
c2f8ccc8d8 Skip dump of generated columns 2025-02-19 11:16:36 +01:00
Peter Knut
bd279b2758 Update changes.txt 2025-02-19 11:16:36 +01:00
Peter Knut
76575a95f1 Move Elastic drivers to plugins, driver for Elastic 7+ is the default 2025-02-19 11:16:35 +01:00
Peter Knut
95bab4c077 Modify tables hierarchy for Elasticsearch 7
- Properly display list of databases, indexes, aliases and fields.
- Fix search and delete queries.
2025-02-19 11:16:35 +01:00
Peter Knut
e85af88227 New Elasticsearch 7 plugin as a copy of the old one 2025-02-19 11:16:35 +01:00
Peter Knut
c6bb98ad22 Improve code readability by using of empty lines 2025-02-19 11:16:35 +01:00
Peter Knut
2a0f17b6d9 Compatibility with Elasticsearch 7.14
- Removed empty body from requests.
- Fix deleting records.
2025-02-19 11:16:35 +01:00
Peter Knut
dc1ad9e8ed Fix global search in all tables 2025-02-19 11:16:35 +01:00
Peter Knut
1270748f74 Fix version condition for deprecated mapping types
Mapping types are still supported in version 6, but only one mapping type can be created.
In version 7, mapping types are deprecated and there is only one system '_doc' mapping type.
See: https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html
2025-02-19 11:16:35 +01:00
Peter Knut
266fda37a1 Fix searching if "anywhere" field is selected
- Allow to search only in fields with index.
2025-02-19 11:16:35 +01:00
Peter Knut
1f14ab470f Replace deprecated "filtered" query with "bool" query
- Allow to choose "must", "should", "must_not" condition.
- Add system "_id" column to the field list. So it can be used in search condition.
2025-02-19 11:16:35 +01:00
Peter Knut
501234c2d1 Fix undefined $sql variable 2025-02-19 11:16:34 +01:00
Peter Knut
197ab976b8 Update changes.txt 2025-02-16 18:03:17 +01:00
Peter Knut
b2759df1f9 Disable redirections in HTTP based drivers 2025-02-16 18:03:17 +01:00
Peter Knut
de07f00ccb Bump version to 4.9.0-dev 2025-02-16 18:03:16 +01:00
Peter Knut
031d2c6a34 Make jush and JsShring submodules available 2025-02-16 18:03:16 +01:00
Lucas Sandery
e2810adc05 Allow responsive styles on larger devices
and fix a media query.

Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
(cherry picked from commit 4b0b011b93f9b684e5ab81f493f239f478fc3f2b)
2025-02-16 18:03:16 +01:00
Peter Knut
baeeb362f7 Fix and complete Slovak translation 2025-02-16 18:03:16 +01:00
Lukáš Rajchl
347ac77bab Update Czech translation
(cherry picked from commit 7338eadd7c)
2025-02-16 18:03:16 +01:00
Anastasia
6b9eb3f446 Update Russian translation
(cherry picked from commit 33fcfbc13b)
2025-02-16 18:03:16 +01:00
Gerry Demaret
f58b13e994 Update Dutch translation
(cherry picked from commit 6024d73ae6)
2025-02-16 18:03:16 +01:00
Lionel Laffineur
fe295bc78a Update French and Italian translations
(cherry picked from commit 496ab9a262)
2025-02-16 18:03:09 +01:00
Hossain Ahmed Saiman
b39469eb9f Bangla language corrections
Some informal words has been replaced with formal words. Some incorrect words has been corrected.

(cherry picked from commit a4ebae8706)

(cherry picked from commit 965598b640)
2025-02-15 14:05:39 +01:00
@krysits.COM
20684a5166 Add Latvian language translation
(cherry picked from commit fad4ce785b)
2025-02-15 14:04:34 +01:00
Roy-Orbison
2c8dbf49cc Fix misaligned inputs
Signed-off-by: Roy-Orbison <Roy-Orbison@users.noreply.github.com>
(cherry picked from commit 2717333789)
2024-03-15 23:02:41 +01:00
Linus Törngren
88647b93e4 Improved spelling. 2021-05-23 13:40:36 +02:00
Jakub Vrana
b8c5eec46d MS SQL: Support [ in udf_unescape 2021-05-23 12:50:14 +02:00
Jakub Vrana
dadbb37f00 PostgreSQL: Don't reset table comments 2021-05-23 11:45:57 +02:00
Jakub Vrana
ea1acfc8bc Preventively escape name 2021-05-23 11:38:51 +02:00
Jakub Vrana
2dd65f0c0f Support multi-line table comments 2021-05-23 11:38:04 +02:00
Jakub Vrana
473f7264f8 PostgreSQL: Use separator in limit1 2021-05-23 11:08:29 +02:00
Benjamin Cremer
db01282e29 Use ST_SRID() in mysql driver for MySQL 8
`SRID()` is no longer available in MySQL 8 and has been replaced with `ST_SRID`
2021-05-23 09:45:55 +02:00
Jakub Vrana
1f173e18bd Release 4.8.1 2021-05-14 07:39:59 +02:00
Jakub Vrana
4043092ec2 Escape link in doc_link (bug #797) 2021-05-14 07:12:44 +02:00
Jakub Vrana
60ad161178 PostgreSQL: Fix parsing of foreign keys with non-ASCII column names (thanks to Tomas Pecina) 2021-05-14 06:21:09 +02:00
luigifab
a12d31c5a8 Fix editRowPrint for plugin 2021-03-04 10:57:55 +01:00
Vladimír Dudr
f6880b59d6 Prevent adminer to consider MariaDB sequences being views 2021-03-03 11:17:32 +01:00
Jakub Vrana
72beecc0ab PostgreSQL: Support UPDATE OF triggers (bug #789) and triggers with more events (OR) 2021-03-03 11:07:58 +01:00
Jakub Vrana
42de1051a6 Update bug numbers 2021-02-24 09:52:22 +01:00
Jakub Vrana
af1a908f56 Unsubstite constants (PHP 5 is now required) 2021-02-23 12:42:11 +01:00
Jakub Vrana
205305d6b5 Avoid PHP warnings with PDO drivers (bug #786) 2021-02-23 12:33:30 +01:00
Jaume Barber
0e5f39042a Update ca.inc.php
Minor ca translation corrections
2021-02-18 08:52:19 +01:00
Jakub Vrana
f94f29124a Oracle: Fix column name in index (thanks to Shirai Takashi) 2021-02-18 08:44:56 +01:00
Jakub Vrana
28996e2286 PostgreSQL < 10 PDO: Avoid displaying GENERATED ALWAYS BY IDENTITY everywhere (bug #785) 2021-02-15 18:33:19 +01:00
Jakub Vrana
7f8c93a6f1 SQLite: Fix displayed types (bug #784) 2021-02-15 18:33:19 +01:00
Jakub Vrana
25dda09bce Update TODO 2021-02-15 18:33:19 +01:00
Jakub Vrana
ff45b8f7a9 Save bytes 2021-02-15 18:33:19 +01:00
Konstantinos Megas
3a36112a10 Fixes greek language typos and translated strings 2021-02-15 15:40:35 +01:00
Jakub Vrana
e9e61fce26 MySQL: Allow moving views to other DB and renaming DB with views (bug #783) 2021-02-12 11:49:35 +01:00
Jakub Vrana
5a1498d160 Use common code 2021-02-12 11:28:55 +01:00
Jakub Vrana
ccb7442d1b Fix more PHP 8 warnings (bug #781) 2021-02-12 09:53:20 +01:00
Takashi SHIRAI
eebda8695b Oracle: Fix the bugs for indexes.
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-12 09:08:56 +01:00
Jakub Vrana
94d18d003e Remove version 2021-02-11 12:20:09 +01:00
Jakub Vrana
3881fc1680 Fix designs after 7db10e95 2021-02-11 08:52:33 +01:00
Jakub Vrana
9bd63a1326 Update readme 2021-02-10 19:52:55 +01:00
Jakub Vrana
92d5858b03 Link instructions 2021-02-10 19:52:55 +01:00
Jakub Vrána
d506f1e241 Enable CodeQL Analysis 2021-02-10 19:51:49 +01:00
Jakub Vrána
cd7f06c8b2 Create security policy 2021-02-10 19:43:30 +01:00
Jakub Vrana
b83c61fca3 Release 4.8.0 2021-02-10 17:21:55 +01:00
Jakub Vrana
3882bfaac1 Remove .inc extension from driver plugins 2021-02-10 11:43:56 +01:00
Jakub Vrana
29e2475b5a Oracle: Use correct DB in db_size, fix typo (thanks to Shirai Takashi) 2021-02-10 11:15:18 +01:00
Jakub Vrana
fd1dd4ecf4 MongoDB: Alpha 2021-02-10 09:50:21 +01:00
Jakub Vrana
dc9e87dbd6 MongoDB: Prefer driver used in other functions 2021-02-10 09:45:34 +01:00
Jakub Vrana
66f335fb63 Save bytes 2021-02-09 20:42:25 +01:00
Jakub Vrana
574c07b8f5 MongoDB: Fix edit operations in select 2021-02-09 20:36:23 +01:00
Jakub Vrana
84e4122225 Fix typo 2021-02-09 20:20:19 +01:00
Jakub Vrana
a61a76716b MongoDB: Use ObjectID only if used 2021-02-09 20:19:43 +01:00
Jakub Vrana
5d317111c7 MongoDB: Fix operators 2021-02-09 20:12:41 +01:00
Jakub Vrana
6af375c67d MongoDB: Handle errors 2021-02-09 20:09:11 +01:00
Jakub Vrana
609b8690ec MongoDB: Fix query 2021-02-09 19:47:51 +01:00
Jakub Vrana
13260dcb76 Save bytes 2021-02-09 16:56:16 +01:00
Jakub Vrana
e002a3bc99 MongoDB: Display error when selecting wrong table 2021-02-09 16:53:05 +01:00
Jakub Vrana
f44f186b38 MongoDB: Display arrays as JSON 2021-02-09 16:34:42 +01:00
Jakub Vrana
c24a6a6aef MongoDB: Fix executeQuery 2021-02-09 16:32:38 +01:00
Jakub Vrana
f11a31e0a9 MongoDB: Modern extension doesn't allow connecting with random user/password 2021-02-09 16:13:28 +01:00
Jakub Vrana
38e741054a MongoDB: Add operators 2021-02-09 11:31:37 +01:00
Jakub Vrana
513e1f425f MongoDB: Handle exceptions 2021-02-09 11:30:14 +01:00
Jakub Vrana
a023e98c4d MongoDB: Fix getting binary fields 2021-02-09 11:07:47 +01:00
Jakub Vrana
633e7ced9c MongoDB: Fix num_rows 2021-02-09 11:04:18 +01:00
Jakub Vrana
3a3df6962b MongoDB: Move common code to function 2021-02-09 11:04:17 +01:00
Jakub Vrana
1e4fb073b5 MongoDB: Display Authentication failed instead of exception 2021-02-09 11:04:10 +01:00
Jakub Vrana
08637cee62 Delete duplicate code 2021-02-09 10:29:19 +01:00
Jakub Vrana
4742bde873 Fix operators init 2021-02-09 10:19:05 +01:00
Jakub Vrana
7a89b5a037 PostgreSQL: Fix displaying NULL bytea fields 2021-02-09 10:08:27 +01:00
Takashi SHIRAI
c5b5b61be1 Avoid errors about 'view_trigger'
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:29 +01:00
Takashi SHIRAI
2b0ac4c0e1 Support unprivileged users for schema list
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:29 +01:00
Takashi SHIRAI
ef53494df0 Support altering indexes
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:27 +01:00
Takashi SHIRAI
98458f737d Avoid errors when alter table column
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:00 +01:00
Takashi SHIRAI
68edea54ea Avoid errors about auto increment
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:00 +01:00
Takashi SHIRAI
6660789d04 Support granted table to list up indexes
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:57:00 +01:00
Takashi SHIRAI
ee4ffe9b65 Correct column size with string type
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:56:55 +01:00
Takashi SHIRAI
27de0417fe Sort the DB list
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:42:23 +01:00
Takashi SHIRAI
339981b9d6 Support importing table data
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:42:18 +01:00
Takashi SHIRAI
53a8496412 The table with another scheme is deleted from the table list
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:38:47 +01:00
Takashi SHIRAI
fb38ae2ffd Support computing DB infos
Signed-off-by: Takashi SHIRAI <shirai@nintendo.co.jp>
2021-02-09 09:24:26 +01:00
salacr
91da14b15c PostgreSQL: Do not show triggers from other schemas 2021-02-09 08:59:06 +01:00
Jakub Vrana
51abdcdab9 SimpleDB, Firebird, ClickHouse: Move to plugin 2021-02-08 19:56:15 +01:00
Jakub Vrana
4038144c38 Add comments 2021-02-08 19:35:25 +01:00
Jakub Vrana
50ed4f7ce7 Prepare for moving drivers to plugins 2021-02-08 19:35:22 +01:00
Jakub Vrana
4f8ecd3c11 Support function default values in insert (bug #713) 2021-02-08 17:52:10 +01:00
Jakub Vrana
f2063c92c5 Allow SQL pseudo-function in insert 2021-02-08 17:41:59 +01:00
Jakub Vrana
5db1ea3301 Save bytes 2021-02-08 17:22:53 +01:00
Jakub Vrana
e915f73f18 PostgreSQL: Fix multi-parameter functions in default values (bug #736) 2021-02-08 16:23:36 +01:00
Jakub Vrana
92f197b7c1 Add id to <th> in select (bug #724) 2021-02-08 16:10:37 +01:00
Jakub Vrana
63484fb875 Remove newline before error message 2021-02-08 16:06:22 +01:00
Jakub Vrana
701c5cd73b Fix whitespace 2021-02-08 15:50:02 +01:00
Jakub Vrana
4310d710d9 Add bug number 2021-02-08 15:46:24 +01:00
Jakub Vrana
2bb472d7a6 PostgreSQL: Avoid exporting empty sequence last value 2021-02-08 14:12:39 +01:00
Jakub Vrana
9e74c0632f PostgreSQL: Create PRIMARY KEY for auto increment columns 2021-02-08 14:00:38 +01:00
Jakub Vrana
d4f7e04156 PostgreSQL PDO: Do not select NULL function for false values in edit (thanks to PR #380) 2021-02-08 13:23:48 +01:00
Jakub Vrana
124092fd7c MySQL 8: Fix EXPLAIN in SQL command 2021-02-08 12:26:51 +01:00
Jakub Vrana
144039d0cb Update tests 2021-02-08 11:50:02 +01:00
Jakub Vrana
a8c218f192 Add callback before edit form (bug #759) 2021-02-08 10:57:53 +01:00
Jakub Vrana
2dd3bd0e1a Skip date columns for non-date values in search anywhere (thanks to PR #408) 2021-02-08 10:53:20 +01:00
Jakub Vrana
28209301ca Fix PHP 8 warning 2021-02-08 10:40:38 +01:00
Jakub Vrana
7ccc1e3e15 Add DB version to comment in export 2021-02-08 09:47:10 +01:00
Jakub Vrana
93c7fb248c Release 4.7.9 2021-02-07 18:25:18 +01:00
Jakub Vrana
73934caec8 Reorder changes 2021-02-07 18:23:41 +01:00
Jakub Vrana
4559e7541c Editor: Avoid trailing dot in export filename
Context: https://sourceforge.net/p/adminer/discussion/960418/thread/ca36ed7b66/
2021-02-07 16:40:29 +01:00
Jakub Vrana
d847f0d1aa Skip impossible condition ($link always contains ?username=) 2021-02-07 15:27:53 +01:00
Jakub Vrana
c727231ccd Fix displayed foreign key columns from other DB (bug #766) 2021-02-07 15:19:03 +01:00
Jakub Vrana
3d92eb703b Do not display empty database in the list twice 2021-02-07 14:28:16 +01:00
Jakub Vrana
3d88cc2c8e Display CSRF logout error after connecting
Context: https://sourceforge.net/p/adminer/discussion/960418/thread/74e1d2d4bc/
2021-02-07 14:23:46 +01:00
Peter Knut
922e1d96b0 Fix displaying type mapping for Elasticsearch >= 6.0
Earlier versions of Elasticsearch (<= 5) supported multiple types per index. That meant that you could have different data mappings for each type. With Elasticsearch 6, this was removed and you can only have single mapping type.
2021-02-07 13:24:03 +01:00
Jakub Vrana
52defd6f19 MongoDB: Prefer modern extension 2021-02-07 13:09:09 +01:00
ImDong
318cece1bd Fix MongoDB connect 'Database does not support password.' tips
Add MongoDB Drivers func ping.
2021-02-07 13:08:29 +01:00
Jakub Vrana
5c2f74136c Update bug numbers 2021-02-07 11:34:47 +01:00
Josef Drabek
8c392363b1 Postgres - fix missing partitioned tables in navigation 2021-02-07 11:21:50 +01:00
Albert Peschar
66b01a4b9c Linkify URLs in SQL results 2021-02-07 11:07:56 +01:00
tiso
7db10e95d9 Title for select data link 2021-02-07 11:00:35 +01:00
Jakub Vrana
31e28fbd00 Quote values with leading and trailing zeroes in CSV export (bug #777) 2021-02-07 09:41:07 +01:00
Jakub Vrana
19f23fe9ee MySQL: Don't quote default value of text fields (bug #779) 2021-02-07 09:31:31 +01:00
David Grudl
6e5315349b fixed Unsupported operand types when $port is socket 2021-02-07 09:31:28 +01:00
Jakub Vrana
95729680ef Respect SQL command URL parameters 2021-02-06 19:09:54 +01:00
Jakub Vrana
5c395afc09 Fix XSS in browsers which don't encode URL parameters (bug #775) 2021-02-06 19:09:42 +01:00
Jakub Vrana
cde988853d SQLite: Set busy_timeout to 500 2021-02-06 18:01:39 +01:00
Jakub Vrana
f8288dd227 PostgreSQL 11: Create PRIMARY KEY for auto increment columns 2021-02-06 18:01:24 +01:00
Jakub Vrana
94194aac19 PostgreSQL: Support smallserial 2021-02-06 18:00:22 +01:00
Jakub Vrana
438c7f55be Add comment 2021-02-06 16:58:59 +01:00
Jakub Vrana
7edf80f636 PostgreSQL PDO: Support PgBouncer, unsupport PostgreSQL < 9.1 (bug #771) 2021-02-06 16:45:20 +01:00
Pőcze Bence
b2e0d9f396 fix wrong hungarian translation 2021-02-06 16:22:28 +01:00
Jakub Vrana
cc9ed0939c Editor: Cast to string when searching (bug #325) 2021-02-06 16:11:21 +01:00
Jakub Vrana
ee75df6f15 Don't syntax highlight during IME composition (bug #747) 2021-02-06 16:11:02 +01:00
Jakub Vrana
23fdbedba1 PostgreSQL: Use bigserial for bigint auto increment (bug #765, regression from 3.0.0) 2021-02-06 15:33:50 +01:00
Michal Adamec
8762895bb3 MSSQL: Don't trucate displayed comments to 30 chars (use varchar maximum of 8000 upon casting) 2021-02-06 14:52:26 +01:00
Jakub Vrana
84063fb7cd Update Korean translation (thanks to B. Cansmile Cha) 2021-02-06 14:38:38 +01:00
Douglas Damasio
eb20ba30a1 add alternative design dracula theme 2021-02-06 14:19:30 +01:00
Oliver Tušla
1ce0a9aa94 show correct collation for PostgresSQL 2021-02-06 14:15:32 +01:00
Ivan Masár
96be913994 PostgreSQL: Fix current schema in view definition 2021-02-06 14:03:59 +01:00
shiipou
6f972ff9ab Add external designs as submodules 2021-02-06 13:45:58 +01:00
Lucas Sandery
7c4718ae3d Fixes to lucas-sandery theme 2021-02-06 12:32:32 +01:00
Jakub Vrana
b558ec8ecf Do not export names in quotes with sql_mode='ANSI_QUOTES' (bug #749) 2021-02-06 12:30:39 +01:00
Sartor
5cab8eabb7 Fix PgSQL generated always as identity fix 2021-02-06 12:18:27 +01:00
makss
d888031603 Update Russian translation. 2021-02-06 11:42:57 +01:00
makss
49f365384b Update Ukrainian translation. 2021-02-06 11:42:57 +01:00
Ivan Masár
34345d8071 PostgreSQL: Export all FKs after all CREATE TABLE 2021-02-06 11:37:47 +01:00
Jakub Vrana
97ec60bb5f MySQL, MariaDB: Fix doc links 2021-02-06 11:15:33 +01:00
Jakub Vrana
5a6e5b4443 Do not display SQL function for checkbox 2021-02-06 10:45:56 +01:00
Jakub Vrana
7b524ff5d2 Fix style (bug #743) 2021-02-06 10:45:56 +01:00
Jakub Vrana
64d4818a82 PostgreSQL: Fix dollar-quoted syntax highlighting (bug #738) 2021-02-06 10:45:56 +01:00
Jakub Vrana
ccd2374b0b Elasticsearch, ClickHouse: Do not print response if HTTP code is not 200
Thanks to Adam Crosser and Brian Sizemore
2021-02-06 10:45:56 +01:00
Evgeny Chernyavskiy
1e1c46ac72 Add basic Makefile. 2021-02-06 10:45:48 +01:00
Milan Felix Šulc
75cd1c3f28 Travis: add php 7.4 && 8.0 2020-12-10 09:05:31 +01:00
Jakub Vrana
b89d418dcf Re-enable PHP warnings 2020-12-09 15:45:54 +01:00
Jakub Vrana
190146672f Release 4.7.8 2020-12-06 13:58:20 +01:00
Jakub Vrana
d6e71b5c53 MySQL: Use renamed variable 2020-12-06 13:50:44 +01:00
Jakub Vrana
0618429bce Avoid PDO exceptions in PHP 8 2020-12-06 13:50:13 +01:00
Jakub Vrana
b0a217abdd Fix method call after #406 2020-12-06 13:45:55 +01:00
Jakub Vrana
35bfaa7506 Improve check for numeric ports (bug #769) 2020-12-06 13:14:41 +01:00
Jakub Vrana
e0a3205676 Add missing method 2020-12-06 13:00:17 +01:00
David Grudl
50bb83dbf2 Fix compatibility with PHP 8 2020-12-06 12:56:01 +01:00
Jakub Vrana
697eedc6a1 Avoid each() not available in PHP 8 2020-12-06 12:53:28 +01:00
Jakub Vrana
d94adc09cc Fix style 2020-12-06 12:53:27 +01:00
Jakub Vrana
4e2a448e28 Escape : also in remove_from_param 2020-05-11 12:35:19 +02:00
Jakub Vrana
ac40be998d Release 4.7.7 2020-05-11 11:51:57 +02:00
Jakub Vrana
6a2de873e1 Fix open redirect if Adminer is accessible at //adminer.php%2F@ (thanks to Prakash Sharma) 2020-05-11 11:49:46 +02:00
Jakub Vrana
a9c1004232 Update Finnish translation 2020-03-10 16:09:25 +01:00
Theodore Tsirpanis
37fa4de650 Fix typo in Greek translation 2020-03-06 16:36:09 +01:00
Jakub Vrana
1d1f11504c Add missing translation 2020-03-06 16:12:37 +01:00
Hugues Lismonde
3f38b61366 Fix forwarded IP comparison in login-ip plugin
The issue described in #372 is the same for the HTTP_X_FORWARDED_FOR comparison. strncasecmp returns 0 when the two strings are equal which is falsey.
2020-02-04 16:58:13 +01:00
Jakub Vrana
9ab205776d Release 4.7.6 2020-01-31 11:24:45 +01:00
Lukáš Holeczy
681b5e7b7a Fix comparing IPs 2020-01-30 18:32:34 +01:00
Jakub Vrana
9c5efb9f8c Update readme 2020-01-30 18:29:47 +01:00
Jakub Vrana
2373409631 Add example for using SQLite with Editor 2020-01-30 18:03:21 +01:00
Jakub Vrana
ad16cb8581 PostgreSQL: Support exporting views 2020-01-30 17:13:50 +01:00
Jakub Vrana
0293613c21 Disallow connecting to ports > 65535 (bug #730) 2020-01-30 17:13:17 +01:00
Jakub Vrana
fe9ea18d2e Display time of procedure execution 2020-01-30 16:27:12 +01:00
Jakub Vrana
6d39f290cc Hide columns when rendering 2019-12-20 14:00:40 +01:00
Jakub Vrana
1bfffbf26b Speed up alter table form 2019-12-20 13:50:20 +01:00
Jakub Vrana
f09003ea4b Fix clicking on non-input fields in alter table 2019-12-20 13:25:08 +01:00
Jakub Vrana
2f7f0df09f Editor: Fix focusing foreign key search in select 2019-12-12 15:37:30 +01:00
Jakub Vrana
5da5b75536 MySQL: Always set foreign_key_checks in export 2019-12-09 13:20:24 +01:00
Jakub Vrana
8706bc7c0f Release 4.7.5 2019-11-13 08:17:14 +01:00
Jakub Vrana
c2b7d38f2c Re-apply https://github.com/vrana/adminer/pull/363/commits/89b6e9bb 2019-11-11 14:41:11 +01:00
popcorner
fcd90a74f6 Update zh-tw.inc.php 2019-11-11 14:41:03 +01:00
popcorner
05cddd38e5 Update zh.inc.php 2019-11-11 14:41:03 +01:00
Mike Baranski
c7550bf68f Stop using adsrc column
Was removed in V12, invalid since V8.

See https://www.postgresql.org/docs/8.3/catalog-pg-attrdef.html
2019-11-11 14:19:39 +01:00
Vladimir Goncharov
6ae81cd0ea fixed: SQL command for insert, create table, etc. new: create/rename table, add/drop/change type for column 2019-11-11 14:11:49 +01:00
Raphael de Almeida
677774405c Fix brazilian portuguese translation 2019-11-11 14:04:47 +01:00
Rasmus
39375b82d8 Swedish translation 2019-11-11 14:01:45 +01:00
Jakub Vrana
5944ca09a3 Update hever design 2019-11-11 13:45:30 +01:00
Jakub Vrana
5a507ec586 Don't overwrite variable 2019-11-11 13:40:47 +01:00
Jakub Vrana
c24dd79c22 Add id="" to cells with failed inline edit (bug #708) 2019-11-11 12:27:53 +01:00
Jakub Vrana
08c132cbea Unify dumpTable declarations (bug #707) 2019-11-11 12:27:53 +01:00
Jakub Vrana
a4e997fe60 PostgreSQL, Oracle: Set schema for EXPLAIN queries in SQL command (bug #706) 2019-11-11 12:27:53 +01:00
Jakub Vrana
0678ce1222 Initialize version-noverify sooner (bug #705) 2019-11-11 12:27:53 +01:00
Jakub Vrana
5acdc55a4a Make context in qsa() optional 2019-11-11 12:27:53 +01:00
Jakub Vrana
fd5f5b8805 Delete extra newlines 2019-11-11 12:27:53 +01:00
Lucas Sandery
d90d06e832 correct complement of responsive media query 2019-11-11 12:27:34 +01:00
Lucas Sandery
feb59fa8cf update lucas-sandery theme 2019-11-11 12:27:34 +01:00
Jakub Vrána
1bcb440698 Add funding 2019-11-08 11:51:41 +01:00
Jakub Vrana
b9594d13d6 Release 4.7.4 2019-10-22 08:33:20 +02:00
Jakub Vrana
789ebc07bd Fix XSS if Adminer is accessible at URL /data: 2019-10-22 08:30:32 +02:00
Jakub Vrana
3310e18efa Do not put unused doc links to single driver compiled version 2019-08-28 10:57:47 +02:00
Jakub Vrana
965fe2e8ae Fix PostgreSQL doc root 2019-08-28 10:31:12 +02:00
Jakub Vrana
acb3f9b9d1 Save bytes 2019-08-28 10:30:54 +02:00
Ivan Masár
8ae059d2ac add links to oracle docs 2019-08-28 10:14:31 +02:00
Ivan Masár
2a3de78a8e add links to postgres docs 2019-08-28 10:14:31 +02:00
Jakub Vrana
cb37a141f4 Bump version 2019-08-28 10:14:31 +02:00
Jakub Vrana
32955f7802 Release 4.7.3 2019-08-27 17:58:21 +02:00
Jakub Vrana
5ffec58a8f Fix blocking of concurrent instances in PHP >7.2 (bug #703) 2019-08-27 13:03:03 +02:00
František Hána
34a0bfd939 setup Mongo authSource by ENV 2019-08-22 09:43:46 +02:00
Jakub Vrana
b07908282b Reset table after changing DB 2019-08-21 15:09:47 +02:00
Jakub Vrana
bce0e8d54a Move <p> after a possible error 2019-08-21 15:05:02 +02:00
Jakub Vrana
c6fc6b63e8 Allow editing foreign keys pointing to tables in other database/schema (bug #694) 2019-08-21 15:00:11 +02:00
Jakub Vrana
03961bbe1b MS SQL: Support foreign keys to other DB 2019-08-21 14:33:17 +02:00
Jakub Vrana
f37a878b62 Do not display error for foreign keys to other databases 2019-08-21 14:19:48 +02:00
Jakub Vrana
021e3f900d Save bytes 2019-08-21 14:13:08 +02:00
Jakub Vokoun
3d32470b87 MSSQL: use textarea in edit form for Memo type (#357)
Signed-off-by: Jakub Vokoun <jakub.vokoun@gmail.com>
2019-08-21 13:13:16 +02:00
Jakub Vrana
f692b6498f MySQL: Support STORED GENERATED 2019-08-21 12:23:08 +02:00
Jakub Vrana
3b056fe308 SQLite: Skip renaming when recreating table if not necessary 2019-08-21 12:06:32 +02:00
Jakub Vrana
d6ec4ca0b3 SQLite: Preserve auto increment when recreating table 2019-08-21 11:54:07 +02:00
Jakub Vrana
903de0e889 SQLite: Allow setting auto increment for empty tables 2019-08-21 11:46:38 +02:00
Jakub Vrana
48f33f6255 Remove extra space in alter table command 2019-08-21 11:28:33 +02:00
Jakub Vrana
1b33729110 SQLite: Handle error in altering table (bug #697) 2019-08-21 11:21:17 +02:00
Troy Olson
788d383609 init mancave-hever design 2019-08-20 18:01:41 +02:00
Jakub Vrana
364e032b69 MySQL: Allow editing rows identified by negative floats (bug #695) 2019-08-20 17:58:54 +02:00
Troy Olson
b7641a2d13 added floating footer css for adminer-theme-mancave2-2.1.alpha 2019-08-20 17:42:23 +02:00
Jakub Vrana
5f4af56f68 Add a comment (bug #691) 2019-08-20 16:24:33 +02:00
Jakub Vrana
95a92ceb95 Use is_numeric() 2019-08-20 09:47:01 +02:00
Jakub Vrana
306e8733e7 Support MariaDB virtual columns 2019-08-19 18:38:57 +02:00
Jakub Vrana
67b84d1167 MySQL: Speed up displaying tables in large databases (bug #700) 2019-08-19 18:29:05 +02:00
Jakub Vrana
ab76024da7 Support unquoted floats in export 2019-08-19 17:18:56 +02:00
Jakub Vrana
4a27882a97 SQLite: Quote strings stored in integer columns in export (bug #696) 2019-08-19 17:14:27 +02:00
Malte Riesch
00d36efcf1 MySQL: Skip editing generated columns 2019-08-19 16:51:28 +02:00
Jakub Vrana
92d443dac0 Add AdminerLoginIp 2019-07-19 14:36:42 +02:00
Jakub Vrana
d71cb127cf Close </ul> of logins 2019-07-19 13:52:24 +02:00
Jakub Vrana
fd1691cb1d Release 4.7.2 2019-07-18 08:56:37 +02:00
Jakub Vrana
d5bf51b2a7 MySQL: Fix getting foreign keys 2019-07-18 08:50:52 +02:00
Jakub Vrana
b7b4157bcb Fix table status in PostgreSQL 12 (bug #683) 2019-07-15 13:37:10 +02:00
Jakub Vrana
10b00e13b1 Fix displaying SQL command after Save and continue edit 2019-07-15 13:16:24 +02:00
Jakub Vrana
45caae1660 PostgreSQL: Display definitions of materialized views (bug #682) 2019-07-15 13:03:57 +02:00
Michal Adamec
36e9a4d6e1 Support for viewing and editing of column comments in mssql driver 2019-07-15 12:45:39 +02:00
Jakub Vrana
9b58ecf925 PostgreSQL: Fix setting column comments on new table 2019-07-15 12:21:17 +02:00
Jakub Vrana
36ade4e197 MySQL: Fix displaying multi-columns foreign keys (bug #675) 2019-07-14 19:53:41 +02:00
grass@dionera.com
6a5b0abbb4 Check if PDO SSL Attributes are set within config, and only set them in PDO Options. otherwise Mysql PDO throws errors if attribute is set and empty 2019-07-14 19:20:13 +02:00
Bohuslav Simek
33234fef19 Elasticsearch: Show executed query as a json 2019-07-14 19:11:17 +02:00
Bohuslav Simek
4b6833ba65 MongoDB: number of records should be count on provide rows 2019-07-14 19:10:16 +02:00
Inge Brattaas
d846eac97e Keep font size in all tables.
Prevent CSS rule "table { font-size: 90% }" from making nested tables
unreadable.
2019-07-14 18:58:07 +02:00
Adam Žurek
0eab60c338 travis: test on php 5.6-7.3 (#330) 2019-07-14 17:22:32 +02:00
Jonathon Sim
7f32e26759 Cache busting for adminer.css 2019-05-18 17:29:33 +02:00
Dennis Stolmeijer
327041874e Always pass the SRID part of a geometry property with the GeomFromText function 2019-05-18 17:24:35 +02:00
Jakub Vrana
37a3dd6c6b Update rmsoft designs 2019-05-18 17:24:35 +02:00
Mario Wenzel
02f5cbdc4d Allow bruteForceKey to be overwritten (#342)
As per Documentation (https://www.adminer.org/en/extension/#api) bruteForceKey can be overwritten by plugins. This change actually allows for that to happen.
2019-05-14 10:49:52 +02:00
Jakub Vrana
deea21dd2d Allow overwriting tables when copying them 2019-05-14 09:56:29 +02:00
Jakub Vrana
f00f7a0e19 Update rmsoft design 2019-05-14 09:43:58 +02:00
Jakub Vrana
48292b70e8 Stretch footer over the whole table width (bug #624) 2019-05-14 09:31:51 +02:00
Jakub Vrana
15900301ee Do not attempt logging in without password (bug #676) 2019-05-14 09:07:51 +02:00
Jakub Vrana
0e6f1972e9 Fix typo in translation (bug #673) 2019-03-21 08:38:57 +01:00
Christoph Thelen
4e91550b14 missing translation DE
added missing translation for donation link
2019-01-29 10:02:39 +01:00
0x1793d1
333da64cdb Fix too small #lang margin on pepa-linha design 2019-01-28 13:55:21 +01:00
Jakub Vrana
a2ec51e948 Fix creating users and changing password in MySQL 8 (bug #663) 2019-01-28 13:47:53 +01:00
0x1793d1
d114535911 Fix #tables margin (#326) 2019-01-25 10:00:26 +01:00
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
Jakub Vrana
85e6f2ac9e Release 4.7.0 2018-11-24 14:13:01 +01:00
Jakub Vrana
e148db4b0f Fix whitespace 2018-11-24 12:16:12 +01:00
Jakub Vrana
660703e422 Clarify change description 2018-11-24 12:08:02 +01:00
Lucas Sandery
55f11df052 Updated theme for v4.7 (#310)
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2018-11-24 11:09:47 +01:00
Winnie Lin
ea6370ef77 Update zh-tw.inc.php (#299)
Fix some typo and add white spaces for readability
2018-11-01 07:03:53 +01:00
Jakub Vrana
0ad6a1e578 Fix a typo 2018-10-29 11:46:04 +01:00
Jakub Vrana
e546b483a1 Delete copy/pasted code 2018-10-29 11:43:45 +01:00
Jakub Vrana
5b443a4e7d Change inline style to class name 2018-10-27 21:21:20 +02:00
kPherox
e4837a0564 Wrap table.nowrap with div[style="overflow-x: auto"] 2018-10-27 21:16:57 +02:00
Jakub Vrana
83a0776e8d Fix MariaDB link to numeric types 2018-10-27 20:13:55 +02:00
Jakub Vrana
5bebb439a1 MySQL: Descending indexes in MySQL 8 (bug #643) 2018-10-27 20:05:04 +02:00
sartor
9f0ee9cf41 PostgreSQL: Support for GENERATED BY DEFAULT AS IDENTITY 2018-10-27 19:42:01 +02:00
Jakub Vrana
c002009bfe Fix style 2018-10-27 19:38:43 +02:00
sartor
a592ad52f1 ClickHouse: support for decimal types, SQL operator 2018-10-27 19:32:52 +02:00
sartor
3127c0d95e ClickHouse: Fix for drop multiple tables and views 2018-10-27 19:32:10 +02:00
sartor
9447d97a6a ClickHouse ALTER DELETE and ALTER UPDATE support 2018-10-27 19:31:35 +02:00
sartor
c8e41ee649 ClickHouse fix select-like queries format postfix 2018-10-27 19:30:33 +02:00
Jakub Vrana
b327a76fc0 Avoid overwriting existing tables when copying tables (bug #642) 2018-10-27 18:50:50 +02:00
Jakub Vrana
7f2dd73670 PostgreSQL: Export DESC indexes (bug #639) 2018-10-27 18:14:00 +02:00
Jakub Vrana
c8975a151c Recognize current_timestamp() in edit (bug #638) 2018-10-27 18:06:20 +02:00
ilessiivi
150841e5d7 Hide import from server if no path 2018-10-01 18:07:51 +02:00
Jakub Vrana
ae03bdd4c4 Simplify storing executed SQL queries to bookmarks 2018-10-01 17:08:58 +02:00
alekseymvt
01e08cc053 fix editor theme (#302) 2018-09-19 16:42:22 +02:00
Jakub Vrana
a426fefd40 Remove unused code 2018-09-19 11:16:21 +02:00
Jakub Vrana
90df1b14f0 MySQL: Recognize ON UPDATE current_timestamp() (bug #632) 2018-09-19 10:08:41 +02:00
Jakub Vrana
cd3231b4af PostgreSQL: Quote array values in export (bug #621) 2018-09-19 09:49:56 +02:00
Christopher CHEN
65c52735fb Add plugin pretty-json-column
(cherry picked from commit 9b8612a49c43ff170837dbf84f8c08a0e85386a8)
2018-09-18 18:59:24 +02:00
Jakub Vrana
93ccc7502b Update translation 2018-09-18 15:47:22 +02:00
Christopher CHEN
84e86cf572 DOM not ready when restoring adminer_tables_filter (#289)
Uncaught TypeError: Cannot set property 'value' of null
2018-09-18 15:38:13 +02:00
Jakub Vrana
1ce5b5ad31 Add Georgian translation 2018-09-18 15:34:09 +02:00
Aleksey M
941bf22e52 Update mvt design 2018-09-18 13:40:58 +02:00
Jakub Vrana
a5c54563c6 Fix design (thanks to apmuthu) 2018-09-18 13:32:26 +02:00
Jakub Vrana
0234fe4a66 ClickHouse: Fix escaping 2018-09-18 13:13:34 +02:00
Sartor
1883e250ff ClickHouse support alpha version 2018-09-18 13:09:46 +02:00
Huy Cat, Hoang
56d8b89bee Fix typo in Vietnamese translation 2018-09-18 12:20:21 +02:00
Peter Knut
4d66e42817 Add class 'layout' to all non-data tables 2018-09-18 12:08:19 +02:00
harryxu
94f6a45a2a Set default db to sqlsrv connection 2018-09-18 11:44:02 +02:00
Jakub Vrana
0f08592bc0 Warn when using password with leading or trailing spaces 2018-09-13 16:08:57 +02:00
Jakub Vrana
a5cbad504c Update donation link 2018-09-06 17:22:56 +02:00
Jakub Vrana
d581f3dedb Make maxlength in all fields a soft limit 2018-07-15 21:05:26 +02:00
Jakub Vrana
e8e4934e97 Increase username maxlength to 80 (bug #623) 2018-07-15 21:01:38 +02:00
Jared Brandt
e959e46fa5 Fixes foreign key pattern in MySQL
Foreign keys are not displaying in MySQL when ANSI_QUOTES is enabled because the preg_match_all() is looking specifically for backticks. This fix allows for double quotes as well, so foreign keys are recognized even when ANSI_QUOTES is enabled.
2018-07-15 20:51:09 +02:00
Jakub Vrana
bb3d2957e1 Fix function change with set data type (thanks to osoba hrdelnata) 2018-07-15 20:37:47 +02:00
Aleksey M
ea408aa530 Adminer theme 2018-07-15 20:12:07 +02:00
Jakub Vrana
df90d9f68c Reset event handlers after cloning (thanks to Salko) 2018-07-15 20:10:13 +02:00
Jakub Vrana
cf76ad529b Fix inline editing of empty cells 2018-07-09 16:52:10 +02:00
Jakub Vrana
3d84dcf859 Release 4.6.3 2018-06-28 21:58:29 +02:00
Jakub Vrana
4b9d88545e Fix typo 2018-06-28 20:35:19 +02:00
Jakub Vrana
26a39ac243 Revert "PgSQL search operator "SQL" added"
This reverts commit af7ac6f06a.
2018-06-27 22:23:56 +02:00
Jakub Vrana
3676b7fb71 Add TODO 2018-06-27 08:55:19 +02:00
Jakub Vrana
c564a8ef50 MySQL: Disallow LOAD DATA LOCAL INFILE 2018-06-26 08:53:12 +02:00
Jakub Vrana
2780eb01f5 PostgreSQL: Export false as 0 in PDO (bug #619) 2018-06-09 12:45:17 +02:00
Gintautas Miselis
b98d0bcc55 mssql: ignore serverproperty error
This change allows connection to Sybase ASE 15
2018-06-09 12:25:24 +02:00
Jakub Vrana
e856e28892 Add spaces 2018-06-09 12:24:18 +02:00
Petr Sedlacek
8f269d66b0 Fix table list in sidebar in designs/pokorny (#278) 2018-06-09 12:23:15 +02:00
Peter Knut
3de94b67ca Allow AdminerTablesFilter plugin to be used with third-party table list plugins (#275) 2018-05-13 09:49:09 +02:00
Jakub Vrana
a9a7488454 Recommend inlining the hash 2018-05-07 12:23:13 +02:00
Jakub Vrana
36f13031f7 Improve error message 2018-05-07 12:22:52 +02:00
Jakub Vrana
6f25b1b5cf Escape \ in enum edit 2018-05-06 19:21:58 +02:00
Jakub Vrana
659c34f7c5 Improve enum parsing 2018-05-06 19:21:58 +02:00
Jakub Vrana
11f24a52e4 Order database names in MySQL 8(bug #613) 2018-05-06 18:11:03 +02:00
Franklin Tse
3c3d861f41 Respect 'session.cookie_secure' if it is On 2018-05-06 17:49:39 +02:00
Jakub Vrana
7b60b03e6a Copy triggers when copying table 2018-05-06 17:36:52 +02:00
Jakub Vrana
84c65fcca6 MS SQL: Support port with sqlsrc 2018-05-06 11:46:36 +02:00
Jakub Vrana
733fe9e430 PostgreSQL: Do not cast uuid searches to text (bug #608) 2018-05-06 11:41:59 +02:00
Jakub Vrana
5c3fb875e1 Editor: Do not check boolean checkboxes with false in PostgreSQL (bug #607) 2018-05-06 11:26:43 +02:00
Jakub Vrana
60d1b7b3b4 Disallow using password-less databases 2018-05-04 16:52:41 +02:00
Jakub Vrana
db11fa4c1a MongoDB: Consolidate code 2018-05-04 16:39:21 +02:00
Jakub Vrana
c3cfc0e69b MongoDB: Consolidate code 2018-05-04 16:38:24 +02:00
Jakub Vrana
5f4d407f2e MongoDB: Consolidate code 2018-05-04 16:37:36 +02:00
Jakub Vrana
70afe70b72 MongoDB: Report version 2018-05-04 15:37:29 +02:00
Jakub Vrana
75f43a4454 Document that Elasticsearch requires allow_url_fopen 2018-05-04 15:26:57 +02:00
Matěj Humpál
78f4513d9d PostgreSQL: Do not cast boolean to text on search (#264) 2018-03-18 14:34:54 +01:00
Jakub Vrana
89c66ccabe PostgreSQL: Do not cast number searches to text 2018-03-13 14:09:53 +01:00
Jakub Vrana
6ba77b7899 PostgreSQL: Fix editing data in views (bug #605) 2018-03-11 16:41:04 +01:00
Jakub Vrana
d271d0b481 Elasticsearch: Fix PHP warning 2018-03-11 16:07:54 +01:00
Sartor
af7ac6f06a PgSQL search operator "SQL" added 2018-03-11 15:48:42 +01:00
Jakub Vrana
19034c35fe PostgreSQL: Fix slow query 2018-03-10 17:16:07 +01:00
Jakub Vrana
88438cd607 Update JUSH 2018-03-10 17:15:55 +01:00
Jakub Vrana
34c792bb59 Display that *.gz files are supported in file upload 2018-03-09 18:21:44 +01:00
Jakub Vrana
6ed94f1f6d Save bytes 2018-03-09 18:19:14 +01:00
Jakub Vrana
8c4726bb61 Stay on import page when switching database 2018-03-09 18:19:14 +01:00
Jakub Vrana
8ab2c7e03b Decrease timeout for running slow queries from 5 seconds to 2 seconds 2018-03-09 18:19:14 +01:00
Jakub Vrana
665fafb297 Simplify running slow queries 2018-03-09 18:19:14 +01:00
Jakub Vrana
67c2a91c67 Remove unused argument 2018-03-09 18:19:14 +01:00
Jakub Vrana
78b8707bd0 Update JUSH 2018-03-09 18:19:14 +01:00
Jakub Vrana
7c15940be8 Use JUSH from GitHub 2018-03-02 09:38:58 +01:00
Jakub Vrana
8c5603a822 Clarify changelog 2018-03-01 13:08:58 +01:00
Jakub Vrana
4e7c31a589 Display missing database in navigation 2018-03-01 12:09:10 +01:00
David Sinquin
cf9cad66e2 MongoDB driver: Add create_database methods.
MongoDB databases are created on the fly when some data is written in
the database, so this method does not need to do anything.
2018-03-01 11:48:02 +01:00
Jakub Vrana
26a3967cf9 Fix comment 2018-03-01 11:46:23 +01:00
Pero Brbora
6c63c2f91e Add $driver to global variables 2018-03-01 11:46:12 +01:00
Pero Brbora
acee5c0011 Add $driver to global variables 2018-03-01 11:30:13 +01:00
Jakub Vrana
36b75b4203 Use $adminer->operators 2018-03-01 11:29:04 +01:00
Jakub Vrana
4a24ee7672 PostgreSQL: Do not cast time search 2018-03-01 11:23:01 +01:00
Matěj Humpál
e21ddd9767 Do not cast date/timestamp exact searches in PostgreSQL to text 2018-03-01 11:21:50 +01:00
Matěj Humpál
f844fc499e Do not cast date/timestamp exact searches in PostgreSQL to text 2018-03-01 11:06:12 +01:00
Jakub Vrana
52d7c38ef1 MySQL: Use CONVERT() only when searching for non-ASCII (bug #603) 2018-03-01 11:01:35 +01:00
Jakub Vrana
53dd78f5af Remove optional submodule 2018-03-01 09:54:20 +01:00
Róbert Mesároš
ea1dad584b Update adminer-design (rmsoft) to version 4.6.2.1 2018-02-23 08:12:11 +01:00
Jakub Vrana
910bb39424 Wrap lines 2018-02-23 08:09:21 +01:00
Jakub Vrana
14db884471 Fix displaying info about non-alphabetical objects (bug #599) 2018-02-22 16:47:30 +01:00
Jakub Vrana
3410836c12 Allow connecting to different drivers in login-servers 2018-02-22 12:38:22 +01:00
Jakub Vrana
cd503f6a0d Wrap long line 2018-02-22 11:39:09 +01:00
Jakub Vrana
00721402e0 Add login-otp plugin 2018-02-22 11:36:11 +01:00
Jakub Vrana
4355aaa96f Update translation 2018-02-21 21:36:55 +01:00
Jakub Vrana
b1cdc7902b Comment 2018-02-21 00:28:59 +01:00
Jakub Vrana
3f4f3454f8 Centralize stopping session 2018-02-20 23:14:36 +01:00
Jakub Vrana
846435aef8 Stop session before connecting (thanks to Kareem Zidane) 2018-02-20 23:11:05 +01:00
Jakub Vrana
d7982e0b29 Update design (thanks to Jan) 2018-02-20 22:44:10 +01:00
Jakub Vrana
7b35ebd82e PDO: Support binary fields download 2018-02-20 22:40:20 +01:00
Jakub Vrana
5b359263eb Don't try to check missing checkboxes 2018-02-20 22:09:47 +01:00
Jakub Vrana
6ebbd8c719 Use file caching only in non-dev 2018-02-20 22:08:52 +01:00
Jakub Vrana
8bb51bec36 Editor: Delete images from compiled version 2018-02-20 16:53:53 +01:00
Jakub Vrana
fc5ddddf92 Remove driver from file URLs (stored in path) 2018-02-20 16:40:14 +01:00
Jakub Vrana
d3a429314a Fix image in compiled version 2018-02-20 16:35:34 +01:00
Jakub Vrana
b4392b3f91 Use single \ in ' strings 2018-02-20 16:27:40 +01:00
Jakub Vrana
2021ea8fd7 &nbsp; is not needed with border-collapse 2018-02-20 16:02:25 +01:00
Jakub Vrana
7cb3e768bb Release 4.6.2 2018-02-20 09:20:42 +01:00
Jakub Vrana
baf7225602 Fix test 2018-02-20 09:17:13 +01:00
Jakub Vrana
0cfc68e6c6 Fix typo 2018-02-20 00:00:47 +01:00
Jakub Vrana
03dfea2943 Comment 2018-02-20 00:00:00 +01:00
Jakub Vrana
54f6806339 Use function after declaring it 2018-02-19 23:48:51 +01:00
Jakub Vrana
ee4f7db641 Remove test server 2018-02-19 23:38:32 +01:00
Jakub Vrana
b53762ae5f Make test works with MariaDB 2018-02-19 23:37:19 +01:00
Jakub Vrana
866d109a9b Make test work on wide screen 2018-02-19 23:25:43 +01:00
Jakub Vrana
37c57c386a Editor: Fix displaying of true boolean values 2018-02-19 23:09:46 +01:00
Jakub Vrana
1f5ca321b6 Comment 2018-02-19 23:04:27 +01:00
Jakub Vrana
059d6266e2 Store current version before authentication and in Editor 2018-02-19 23:02:39 +01:00
Jakub Vrana
0e1d8c67fc Update design (thanks to Jan) 2018-02-19 14:07:11 +01:00
Jakub Vrana
a113a25123 Add missing fullstop 2018-02-15 22:25:45 +01:00
Róbert Mesároš
49a865d106 Version 4.6.1.1 (#254)
Update to Version 4.6.1.1
2018-02-15 22:25:16 +01:00
Nuri Akman
026b362e7d Turkish language file updated. 2018-02-15 22:20:58 +01:00
Jakub Vrana
7c32360c67 Align Whole result 2018-02-14 06:46:59 +01:00
Jakub Vrana
8a94bc6f41 Always hide import 2018-02-14 06:42:07 +01:00
Jakub Vrana
3f901cfe30 Print email only with rows or page 2018-02-14 06:41:44 +01:00
Jakub Vrana
c8fd73d70a Move import out of footer 2018-02-13 22:24:59 +01:00
Jakub Vrana
30d0060b96 Move pagination to fieldset 2018-02-13 22:17:59 +01:00
Jakub Vrana
8b157a673e Update readme 2018-02-10 01:58:14 +01:00
Jakub Vrana
ce381aaf48 Make Login test work with jush-textarea 2018-02-10 01:56:48 +01:00
Jakub Vrana
d3eac979d4 Add SQLite test 2018-02-10 01:51:03 +01:00
Jakub Vrana
f19e23c98b Test warnings 2018-02-10 01:47:29 +01:00
Jakub Vrana
705d3a910f Convert tests to Katalon 2018-02-10 01:24:14 +01:00
Jakub Vrana
d18c7b3587 Promote MongoDB, demote Oracle and MS SQL 2018-02-10 00:09:07 +01:00
Jakub Vrana
1f12ea4e4a Capitalize Whole result 2018-02-09 23:45:53 +01:00
Jakub Vrana
71a6a1269d Fill footer to the right 2018-02-09 23:36:53 +01:00
Jakub Vrana
6a3bce1174 Make footer smaller 2018-02-09 23:33:46 +01:00
Jakub Vrana
28acee861f Move pagination outside footer 2018-02-09 23:28:19 +01:00
Jakub Vrana
42b15654c4 Wrap more into if (!is_ajax) 2018-02-09 23:09:05 +01:00
Jakub Vrana
e2d858d638 Move <p> 2018-02-09 23:05:21 +01:00
Jakub Vrana
879963dec1 PostgreSQL: Add IF EXISTS to DROP SEQUENCE in export (bug #595) 2018-02-09 22:11:27 +01:00
Jakub Vrana
daa19b0a6e Make footer border more obvious 2018-02-09 22:05:11 +01:00
Jakub Vrana
d27ee7a388 Make footer margin not transparent 2018-02-09 21:55:18 +01:00
Jakub Vrana
1ec4637ade Centralize oninput 2018-02-09 21:23:42 +01:00
Jakub Vrana
ea1ff7e902 Speed up alter table
Alter table mysql.user takes 0.9 instead of 1.5 seconds.
2018-02-09 21:11:12 +01:00
Jakub Vrana
2761f44cf4 Use Unicode arrows in alt 2018-02-09 17:54:52 +01:00
Jakub Vrana
557b8b178e Avoid hiding column only to show it later 2018-02-09 17:50:25 +01:00
Jakub Vrana
07d1bc4291 Respect unchecked Default values 2018-02-09 17:45:50 +01:00
Jakub Vrana
7ac96dd0b2 Update UI when coming from history 2018-02-09 17:35:17 +01:00
Jakub Vrana
eeb7ce1939 PostgreSQL: Fix exporting string default values (thanks to PotatoPangolin) 2018-02-09 15:29:54 +01:00
Jakub Vrana
ea4ac5c8f3 Semi-transparent border on table actions 2018-02-09 15:14:10 +01:00
Jakub Vrana
3906231dc5 Fix exporting sequences in PostgreSQL 10 2018-02-09 14:43:25 +01:00
Jakub Vrana
fad20d1065 Do not append empty values 2018-02-09 13:48:50 +01:00
Jakub Vrana
ffb4ee3a61 Shorten JSON values in select (bug #594) 2018-02-09 13:48:33 +01:00
Jakub Vrana
34d338b185 Fix id in databases list 2018-02-09 13:34:46 +01:00
Jakub Vrana
1b148bc08c Suggest updating Git submodules 2018-02-09 11:09:49 +01:00
Jakub Vrana
f4983dfd5f Declare MariaDB support 2018-02-09 09:24:12 +01:00
Jakub Vrana
800fbb9b9e Release 4.6.1 2018-02-09 00:20:58 +01:00
Jakub Vrana
4b1960f498 Round 9.2 to 9.2 2018-02-08 23:58:09 +01:00
Jakub Vrana
e299e9d82d MariaDB: Links to documentation in syntax highlighting 2018-02-08 23:47:16 +01:00
Jakub Vrana
cf7fe88990 Display notification about performing action after relogin 2018-02-08 16:49:56 +01:00
Jakub Vrana
60e5d24116 Reorder changes 2018-02-08 14:34:43 +01:00
Jakub Vrana
a1927d5b71 Allow specifying server name displayed in breadcrumbs 2018-02-08 14:32:21 +01:00
Jakub Vrana
76d7560d27 MariaDB: Links to documentation 2018-02-08 13:56:22 +01:00
Jakub Vrana
f0b7d8ccd0 Reorder changes 2018-02-08 12:10:37 +01:00
Jakub Vrana
d322e0165b Remove .lcZ from timeFormat (bug #593) 2018-02-08 11:52:11 +01:00
Jakub Vrana
4009ede3ee Add todo 2018-02-08 11:26:21 +01:00
Jakub Vrana
cddd61c214 Add more system tables help links 2018-02-08 11:21:33 +01:00
Jakub Vrana
8b8cfd9f04 Respect empty tableName in tablesPrint 2018-02-08 10:35:54 +01:00
Jakub Vrana
99d7b88341 Use tableName() in table.inc.php 2018-02-08 10:34:43 +01:00
Jakub Vrana
2db1c74310 Avoid qsl in a loop 2018-02-08 09:52:23 +01:00
Jakub Vrana
fb2d34f739 Support Shift+click in server export 2018-02-08 09:47:15 +01:00
Jakub Vrana
6e2f681faa Avoid qsl in a loop 2018-02-08 09:30:16 +01:00
Jakub Vrana
686865bc10 Sticky position of table actions 2018-02-08 00:14:32 +01:00
Jakub Vrana
996ebf61d7 Document regression 2018-02-07 21:08:24 +01:00
Jakub Vrana
6a7ee5a2f3 Avoid qsl in check[]
Table with 1000 rows rendered in 1.8 instead of 7.5 seconds.
2018-02-07 18:55:28 +01:00
Jakub Vrana
4b45722fad Avoid qsl in a loop
Table with 500 rows rendered in 1.5 instead of 5.5 seconds.
2018-02-07 18:55:16 +01:00
Jakub Vrana
14998e12b6 Mark optional parameter 2018-02-07 18:14:00 +01:00
Jakub Vrana
718f9d3791 SQLite: Support ` in PRIMARY KEY 2018-02-07 16:43:21 +01:00
Jakub Vrana
964a988fef Avoid Invalid credentials with no credentials 2018-02-07 16:29:57 +01:00
Jakub Vrana
66e7ec56bb SQLite: Allow deleting PRIMARY KEY from tables with auto increment 2018-02-07 14:47:29 +01:00
Jakub Vrana
ca336427f5 Do not wrap alter table thead 2018-02-07 14:22:58 +01:00
Jakub Vrana
8a75cbc630 Add version() to use in plugins 2018-02-07 12:49:53 +01:00
Jakub Vrana
c8bb112a5d Select original if nothing else is selected 2018-02-07 12:46:43 +01:00
Jakub Vrana
06660882b5 Remove nested array 2018-02-07 12:42:46 +01:00
Jakub Vrana
42eec7d728 Support connecting to MySQL via SSL 2018-02-07 12:13:58 +01:00
Jakub Vrana
cac523402a Display Invalid credentials if connection error is empty 2018-02-07 11:37:53 +01:00
Jakub Vrana
02cd416093 Delete unused functions 2018-02-06 16:33:47 +01:00
Jakub Vrana
33f0023d37 Ignore functions in Min_Driver 2018-02-06 16:32:56 +01:00
Jakub Vrana
f09d26a51d Remove unnecessary quotes 2018-02-06 16:25:58 +01:00
Jakub Vrana
b500a46f9a Add truncate_sql to PostgreSQL 2018-02-06 16:24:12 +01:00
Jakub Vrana
19653de764 PostgreSQL: Unescape bytea fields 2018-02-06 16:05:50 +01:00
Jakub Vrana
29c127e94a Save bytes 2018-02-06 15:54:19 +01:00
Jakub Vrana
4417a8b220 Add missing function to compile.php 2018-02-06 15:52:48 +01:00
Jakub Vrana
17b110f0d5 PostgreSQL: Upload binary files to bytea fields 2018-02-06 15:42:14 +01:00
Jakub Vrana
b649fb2f3f Allow using number_type() as pattern 2018-02-06 14:52:12 +01:00
Jakub Vrana
d3914ea58e Translate thousands separator in JS 2018-02-06 14:47:43 +01:00
Jakub Vrana
31d8803db2 Editor: Use type=search for Search tables 2018-02-06 14:13:51 +01:00
Jakub Vrana
d43b773214 Move tableCheck() below </form> 2018-02-06 13:53:15 +01:00
Jakub Vrana
f09a04ed09 Pass operator from db.inc.php 2018-02-06 13:51:56 +01:00
Jakub Vrana
d7f9b6b5de PostgreSQL: Cast to string when searching using LIKE (bug #325) 2018-02-06 13:51:53 +01:00
Jakub Vrana
197abdcb70 MySQL: Support non-utf8 charset in search in column 2018-02-06 13:51:23 +01:00
Jakub Vrana
c2de3b8ec1 Use ST_GeomFromText in MySQL 8 (bug #574) 2018-02-06 13:50:40 +01:00
Jakub Vrana
c52fb951b0 Do not modify $_GET["where"] 2018-02-06 13:00:17 +01:00
Jakub Vrana
14429ff355 Display empty operator as LIKE %% 2018-02-06 12:56:18 +01:00
Jakub Vrana
a7632fd9fd Fix whitespace 2018-02-06 12:50:44 +01:00
Jakub Vrana
967d5c64a3 Avoid deprecated each() 2018-02-06 12:49:39 +01:00
Jakub Vrana
c34ada5368 PostgreSQL: Fix condition for selecting no rows 2018-02-06 12:43:10 +01:00
Jakub Vrana
2d7bda4d1e Fix error display in Search tables 2018-02-06 12:40:28 +01:00
Jakub Vrana
6cfb3676a7 PostgreSQL: Don't treat interval type as number (bug #474) 2018-02-06 12:17:01 +01:00
Jakub Vrana
11a7fc0277 Pass required parameter 2018-02-06 12:00:22 +01:00
Jakub Vrana
de539cf0c7 Use existing variable 2018-02-06 11:57:02 +01:00
Jakub Vrana
880902da17 Add class to use in designs 2018-02-06 08:47:28 +01:00
Jakub Vrana
89ceb06208 Use primary key instead of LIMIT 1 if available 2018-02-05 11:21:19 +01:00
Jakub Vrana
d2ed0f7810 Release 4.6.0 2018-02-05 09:30:33 +01:00
Jakub Vrana
7b0c58af32 Fix affected rows after getting warnings 2018-02-05 09:23:07 +01:00
Jakub Vrana
d3cdfc17de Fix number of affected rows after getting warnings 2018-02-05 09:09:41 +01:00
Jakub Vrana
f097817386 Fix test 2018-02-05 08:43:31 +01:00
Jakub Vrana
3b55c4c0f7 Fix 5.1 being displayed as 5.09999... 2018-02-05 08:42:25 +01:00
Jakub Vrana
6636434378 PRIMARY KEY in SQLite 2018-02-05 08:32:51 +01:00
Jakub Vrana
dd3e57086b Add design Esterka 2018-02-02 09:18:38 +01:00
Jakub Vrana
473b60361b Disable autocompleting password on create user page 2018-02-02 08:52:15 +01:00
Jakub Vrana
f128c2d1ea Use primary key to edit rows even if not selected 2018-02-01 23:09:40 +01:00
Jakub Vrana
c75096f173 Space between DB and Use 2018-02-01 22:22:29 +01:00
Jakub Vrana
c0b2c506bc Translate DB 2018-02-01 22:20:56 +01:00
Jakub Vrana
0ebf710d41 Select converted fields only once 2018-02-01 22:03:48 +01:00
Jakub Vrana
fa41126c37 Don't count rows if we reached the end 2018-02-01 20:59:05 +01:00
Jakub Vrana
09920e0056 Fix count_rows with more than one group by column 2018-02-01 20:45:49 +01:00
Jakub Vrana
685bf29abc Use separator in limit1 2018-02-01 18:53:53 +01:00
Jakub Vrana
0866c79afb SQLite: Limit rows in data manipulation without unique key 2018-02-01 18:47:57 +01:00
Jakub Vrana
e8e3ced948 Document that tests don't work with oninput 2018-02-01 17:04:50 +01:00
Jakub Vrana
52d98e16fa PostgreSQL: Limit rows in data manipulation without unique key 2018-02-01 16:58:01 +01:00
Jakub Vrana
763e66a148 Don't use ctid as it's not stable 2018-02-01 16:45:31 +01:00
Jakub Vrana
8868b48e4c Move variables close to their usage 2018-02-01 16:40:58 +01:00
Jakub Vrana
4961588f7d Limit non-unique where updates 2018-02-01 16:25:30 +01:00
Jakub Vrana
f4625da53d Use Oid as the name of the column 2018-02-01 16:15:36 +01:00
Jakub Vrana
dc94b2ec38 Save bytes 2018-02-01 16:00:40 +01:00
Jakub Vrana
f8af8c9cbf Update rmsoft design 2018-02-01 15:38:15 +01:00
Jakub Vrana
e55f0d7cb2 MySQL: Add FIND_IN_SET search operator 2018-02-01 15:25:38 +01:00
Jakub Vrana
5b7f2d9086 Add rmsoft design 2018-02-01 14:54:18 +01:00
Jakub Vrana
6d55395d9e MySQL: Add floor and ceil functions 2018-02-01 14:32:01 +01:00
Jakub Vrana
2e6190fdf1 Fix links to PostgreSQL 10 documentation 2018-02-01 14:02:25 +01:00
Jakub Vrana
b9ad864b75 Delete unused variable 2018-02-01 13:57:46 +01:00
Jakub Vrana
7296f017fb Display options for timestamp columns when creating a new table (thanks to Robert Vlach) 2018-02-01 13:55:11 +01:00
Jakub Vrana
ae91088cb3 Don't display warnings for failed queries 2018-02-01 13:16:37 +01:00
Jakub Vrana
51a574926d Fix variable name 2018-02-01 13:08:28 +01:00
Jakub Vrana
532a4ee083 Reorder variables 2018-02-01 12:27:22 +01:00
Jakub Vrana
6b9c0dee14 Use pg_last_notice only with pgsql 2018-02-01 12:03:11 +01:00
Jakub Vrana
be75939344 Print warnings in call 2018-02-01 11:58:04 +01:00
Jakub Vrana
d667f585e0 Pass start time to selectQuery 2018-02-01 11:54:56 +01:00
Jakub Vrana
ebb23a7a88 PostgreSQL: Display warnings 2018-02-01 11:50:15 +01:00
Jakub Vrana
e9add6d985 Return string from warnings() 2018-02-01 11:43:44 +01:00
Jakub Vrana
e3346fb0bc Display warnings in messages 2018-02-01 09:21:50 +01:00
Jakub Vrana
ae2ea56681 Show select warnings 2018-02-01 08:59:46 +01:00
Colin Mollenhour
080fd0f374 Support X-Forwarded-Prefix (e.g. Traefik PathPrefixStrip feature) 2018-01-31 20:38:14 +01:00
Jakub Vrana
e32f90f8ff Lowercase EXPLAIN but don't translate it 2018-01-31 20:25:41 +01:00
Jakub Vrana
7ad09d2cb4 Move explain below warnings 2018-01-31 20:25:11 +01:00
Jakub Vrana
40038d4210 Fix return type 2018-01-31 18:29:01 +01:00
Jakub Vrana
2adc174541 MySQL: Display warnings in SQL command 2018-01-31 17:28:12 +01:00
Jakub Vrana
2fb2d208c0 Quote default values not starting with a letter 2018-01-31 16:46:50 +01:00
Jakub Vrana
4de6e3180d Stop redirecting links via adminer.org 2018-01-31 11:11:34 +01:00
Jakub Vrana
8829ccdf93 Fix min_version use 2018-01-30 23:53:04 +01:00
Jakub Vrana
0320bcdda6 Quote dates in default value 2018-01-30 17:00:34 +01:00
Jakub Vrana
851700516d Fully support functions in default values 2018-01-30 16:50:37 +01:00
Jakub Vrana
d542843fdd Fix min_version use 2018-01-30 16:42:13 +01:00
Jakub Vrana
4bb2f806b1 PostgreSQL: Allow now() as default value (bug #525) 2018-01-30 16:24:31 +01:00
Jakub Vrana
cc31a69b65 Fix edit_type after 1f21cd43 2018-01-30 16:21:04 +01:00
Jakub Vrana
78f0a1152e PostgreSQL: Allow editing views with uppercase letters (bug #467) 2018-01-30 16:03:13 +01:00
Jakub Vrana
1f21cd4329 PostgreSQL: Allow creating trigger functions 2018-01-30 15:55:50 +01:00
Jakub Vrana
9f69160797 Add placeholders 2018-01-30 15:24:01 +01:00
Jakub Vrana
e81334ef87 PostgreSQL: Support functions 2018-01-30 15:18:26 +01:00
Jakub Vrana
6c3e1e2768 Add min_version to compile.php 2018-01-30 14:47:22 +01:00
Jakub Vrana
92739f48ce SimpleDB: Document that allow_url_fopen is required (bug #340) 2018-01-30 13:19:21 +01:00
Jakub Vrana
d28d01e76c Focus correct field in selectSearch 2018-01-29 21:19:11 +01:00
Jakub Vrana
75450548b3 Support JSON since MariaDB 10.2 (bug #590) 2018-01-29 21:08:38 +01:00
Jakub Vrana
c3b4208853 Use min_version 2018-01-29 20:54:24 +01:00
Jakub Vrana
d38c673e2a Add min_version 2018-01-29 19:34:26 +01:00
Jakub Vrana
93686eab65 Save bytes 2018-01-29 18:33:26 +01:00
Pisyek
224ddb5a33 add malay translation 2018-01-29 18:25:58 +01:00
Radosław Kowalewski
4db23fd471 Added and translated missing keys in polish translation 2018-01-29 18:13:50 +01:00
Steven Adger
a003866a55 Update compatibility with TinyMCE v4 (#247) 2018-01-29 18:09:35 +01:00
Jakub Vrana
0d90f1f1dd Fix elastic after ef5a7639 2018-01-27 11:08:56 +01:00
helix84
ef5a76392d fix elastic.inc.php to work on PHP 5.2
Without this change, I get the following syntax error on PHP 5.2.6:
PHP Parse error:  syntax error, unexpected ':' in /var/www/adminer/adminer/drivers/elastic.inc.php on line 415

I haven't actually tested the alter_table() method.
2018-01-26 16:48:34 +01:00
Jakub Vrana
8d0cbb6eb4 Fix counting selected rows after going back to select page 2018-01-26 08:52:12 +01:00
Jakub Vrana
536999d4dc Release 4.5.0 2018-01-24 21:55:47 +01:00
Jakub Vrana
827a2b8a54 Fix tests after 95d02bb9 2018-01-24 20:52:44 +01:00
Jakub Vrana
a954f7d4b4 Simplify drop object confirmation questions 2018-01-24 18:36:19 +01:00
Jakub Vrana
a137f248f7 Translate message added in 4.4.0 2018-01-24 18:22:20 +01:00
Jakub Vrana
95d02bb924 Display name of the object in confirmation when dropping it 2018-01-24 18:13:05 +01:00
Jakub Vrana
921e57b9aa Display error when getting row to edit 2018-01-24 17:37:35 +01:00
Jakub Vrana
25f9655a38 Avoid CONVERT() except in MySQL (bug #509) 2018-01-24 17:37:14 +01:00
Jakub Vrana
919204dd38 Bump version 2018-01-24 16:51:53 +01:00
Jakub Vrana
34f25afe90 MySQL: Support routines with comments in parameters (bug #460) 2018-01-24 16:37:38 +01:00
Jakub Vrana
8b29ae910f Verify if adminer.version was created on www.adminer.org 2018-01-24 15:10:44 +01:00
Jakub Vrana
6c96b060e7 Store current Adminer version server-side to avoid excessive requests 2018-01-24 15:09:11 +01:00
Jakub Vrana
f4662d5e27 Send token as last param 2018-01-24 13:44:31 +01:00
Jakub Vrana
b15618fcfd Allow using adminer.invalid by other users in a group 2018-01-24 12:11:26 +01:00
Jakub Vrana
03e3f517a8 Extract file_open_lock and file_write_unlock 2018-01-24 12:04:53 +01:00
Jakub Vrana
f0d2af329a Display boolean values as code (bug #562) 2018-01-24 10:53:25 +01:00
Jakub Vrana
452b9ad7f1 MariaDB: Support fulltext and spatial indexes in InnoDB (bug #583) 2018-01-24 09:18:19 +01:00
Jakub Vrana
fb18e814de PostgreSQL: Display foreign tables (bug #576) 2018-01-23 15:03:53 +01:00
Jakub Vrana
75413c56d2 Add designs.php 2018-01-23 14:36:32 +01:00
Jakub Vrana
c3d83d5412 Fix compiled version after 5cc831c1 2018-01-23 14:10:21 +01:00
Jakub Vrana
b14aa75a98 Hide window.opener from pages opened in a new window (bug #561) 2018-01-23 12:53:22 +01:00
Jakub Vrana
dbc76a2b1e Fix GPL version 2018-01-23 12:21:42 +01:00
Jakub Vrana
6d774794c8 Add plugin for switching designs 2018-01-23 12:15:38 +01:00
Jakub Vrana
81be5edb97 Display bold parts of error (bug #565) 2018-01-23 11:16:28 +01:00
Jakub Vrana
e30e5dd059 Add bottom border to last cells 2018-01-23 11:11:41 +01:00
Jakub Vrana
0cdd8beab1 Editor: Fix displaying of false values in PostgreSQL (bug #568) 2018-01-23 11:02:15 +01:00
Jakub Vrana
7b9d5a29aa Decrease float precision (bug #578) 2018-01-23 10:52:57 +01:00
Andrea Giacobino
5cc831c1e1 Add ability to override file name (path) when loading dump from webserver 2018-01-23 09:24:57 +01:00
Jakub Vrana
72aa3c5127 Support current_timestamp() as default of time fields (bug #572) 2018-01-23 08:36:11 +01:00
Jakub Vrana
43ccfcef8f Display newlines in column comments (bug #573) 2018-01-22 21:05:56 +01:00
Jakub Vrana
c789c147b7 MySQL: Support geometry in MySQL 8 (bug #574) 2018-01-22 20:56:35 +01:00
Uherkovich Péter
a2adb67d2f MSSQL driver fixed for freetds drivers. See bug #167, #291 2018-01-22 18:35:08 +01:00
Jakub Vrana
34e2f47761 Fix search focus (regression from 4.4.0) 2018-01-22 18:34:16 +01:00
Jakub Vrana
0d2b232bd7 Compatibility with PHP < 5.3 2018-01-22 17:30:12 +01:00
Jakub Vrana
83e16e059f Add mongodb as a possible driver 2018-01-22 17:12:48 +01:00
Jakub Vrana
6e4dc3911f Save bytes 2018-01-22 17:05:49 +01:00
Vladimir Goncharov
2a08a11e89 php7 support with minimal changes of original code 2018-01-22 16:59:55 +01:00
Jakub Vrana
993dce398d PostgreSQL: Export DROP SEQUENCE if dropping table 2018-01-22 14:33:21 +01:00
Jakub Vrana
eee9a62c8f PostgreSQL: Do not export triggers if not requested 2018-01-22 14:25:27 +01:00
Jakub Vrana
ce17b6cf46 Ignore removed CREATE+ALTER mode in trigger_sql() 2018-01-22 14:14:42 +01:00
Jakub Vrana
923c0ffc87 Fix whitespace 2018-01-22 13:51:47 +01:00
Jakub Vrana
48ed20323f CSP: Allow any CSS 2018-01-22 12:22:25 +01:00
Troy
9a4cd8936d adminer-theme-mancave2-2.0.alpha 2018-01-22 12:20:33 +01:00
Jáchym Toušek
019ada8da5 Fix NULL value in edit form with Postgres 2018-01-22 12:06:15 +01:00
Jakub Vrana
6a95b71164 Do not warn about MySQL specific functions 2018-01-22 12:00:38 +01:00
Jakub Vrana
3b4ce4a0b4 Fix single driver non-MySQL compiled versions (regression from 150301ed) 2018-01-22 11:42:17 +01:00
Jakub Vrana
a414896885 Hide driver selection in single-driver version (regression from e762a6aa) 2018-01-22 11:34:25 +01:00
Peter Knut
47734d8ff4 Unify HTML for list of tables in Editor according to Adminer 2018-01-22 10:57:20 +01:00
Peter Knut
fef1808288 Encapsulate fulltext part in search box into <div> 2018-01-22 10:53:50 +01:00
Fabio Montefuscolo
d2c82fdeca Enhance ElasticSearch integration 2018-01-19 18:32:41 +01:00
Jakub Vrana
e657cdbc3a Allow PHP 5.6 in Travis 2018-01-19 18:20:02 +01:00
Jakub Vrana
bc14e8432f Select numeric database name in DB list (bug #580) 2018-01-19 17:39:27 +01:00
Jakub Vrana
34b03ef835 SQLite: Enable foreign key checks 2018-01-19 14:57:58 +01:00
Jakub Vrana
329b7de9cc CSP: Allow any images, media and fonts, disallow base-uri 2018-01-19 11:05:26 +01:00
Jakub Vrana
2dcad1f284 Define JS functions in AdminerTablesFilter sooner 2018-01-19 10:55:51 +01:00
Jakub Vrana
1b98a10100 Adminer: Fix Search data in tables 2018-01-19 10:46:35 +01:00
Jakub Vrana
187dd56b1c Release 4.4.0 2018-01-17 12:41:38 +01:00
Jakub Vrana
ba9099f084 Allow sending multiple CSP headers 2018-01-17 11:05:59 +01:00
Jakub Vrana
16e05167a4 Use __construct for constructor 2018-01-16 20:05:07 +01:00
Jakub Vrana
756e304c92 Set session cache limiter only without session.auto_start (bug #586) 2018-01-16 16:56:14 +01:00
Jakub Vrana
e762a6aa95 Add missing newline 2018-01-16 16:44:49 +01:00
Jakub Vrana
b3d5c9affe Require specifying credentials in login-sqlite plugin 2018-01-16 16:37:59 +01:00
Jakub Vrana
0268aba85a Avoid count(null) 2018-01-16 16:22:24 +01:00
Jakub Vrana
9ca92309a1 Disallow PHP 5.3 in Travis 2018-01-16 13:51:02 +01:00
Jakub Vrana
0fae40fb61 Disallow connecting to privileged ports (thanks to hyp3rlinx) 2018-01-16 11:18:32 +01:00
Jakub Vrana
0e5df34ea8 Rate limit password-less login attempts from the same IP address (thanks to hyp3rlinx) 2018-01-16 11:17:25 +01:00
Jakub Vrana
f3938c1a66 Use HTTPS 2018-01-14 11:03:54 +01:00
Jakub Vrana
07aa80048a Use HTTPS in doc_link() 2018-01-14 10:38:01 +01:00
Jakub Vrana
c57e7ac3e3 Do not set '' for empty enum 2018-01-14 10:19:56 +01:00
Jakub Vrana
6d14b47d02 Fix select function onchange 2018-01-14 10:18:38 +01:00
Jakub Vrana
ef3b468626 Clone all event handlers in cloneNode() 2018-01-14 10:04:53 +01:00
Jakub Vrana
4d38c09db5 Use border-collapse to prevent unnecessary wrapping in Chrome 2018-01-14 09:35:13 +01:00
Jakub Vrana
3ba99a1c2a Fix whitespace 2018-01-14 08:52:22 +01:00
Jakub Vrana
9cbdb6262b Fix selectCount() in information_schema 2018-01-14 08:36:10 +01:00
Jakub Vrana
cc268428b8 Fix SQL command toggle 2018-01-14 00:10:42 +01:00
Jakub Vrana
80d030f51a Disallow scripts without nonce 2018-01-13 22:19:16 +01:00
Jakub Vrana
e23da5da0e Fix wrapping in Create table 2018-01-13 17:40:21 +01:00
Jakub Vrana
9d532fc0a1 Use script_src for <script src> 2018-01-13 16:25:11 +01:00
Jakub Vrana
144c7de27f Fix typo in script() 2018-01-13 15:23:47 +01:00
Jakub Vrana
b7fcebfba8 Do not send empty CSP 2018-01-13 14:21:54 +01:00
Jakub Vrana
d39a6e59c7 Move inline event handlers to <script> 2018-01-13 09:34:01 +01:00
Jakub Vrana
fc559a1cf6 Move inline event handlers to <script> 2018-01-13 09:21:21 +01:00
Jakub Vrana
f457053d85 Use the fact that we handle oninput in whisper() 2018-01-13 09:07:35 +01:00
Jakub Vrana
e255ba9aa4 Move inline event handlers to <script> 2018-01-13 08:58:01 +01:00
Jakub Vrana
3fe0d88f98 Editor: Fix Search data in tables 2018-01-12 23:59:04 +01:00
Jakub Vrana
68c6b1c942 Move inline event handlers to <script> 2018-01-12 23:42:20 +01:00
Jakub Vrana
001c37e240 Use <script> instead of inline event handler for skipping original 2018-01-12 23:27:14 +01:00
Jakub Vrana
b6cc584f48 Move inline event handlers to <script> 2018-01-12 22:46:16 +01:00
Jakub Vrana
af1ad47a64 Return false from editingMoveRow() 2018-01-12 22:35:05 +01:00
Jakub Vrana
2eaac2e94e Move inline event handlers to <script> 2018-01-12 22:25:38 +01:00
Jakub Vrana
40abffe8de Use oninput instead of onchange 2018-01-12 22:18:54 +01:00
Jakub Vrana
259a465125 Move inline event handlers to <script> 2018-01-12 21:57:54 +01:00
Jakub Vrana
6c1fbf13c6 Fix fieldChange() after 6353a898 2018-01-12 21:49:45 +01:00
Jakub Vrana
6353a89816 Use oninput instead of onkeyup 2018-01-12 18:46:44 +01:00
Jakub Vrana
38aac7ada2 Move inline event handlers to <script> 2018-01-12 18:34:19 +01:00
Jakub Vrana
24245867d7 Use <script> instead of inline event handler in on_help() 2018-01-12 18:11:00 +01:00
Jakub Vrana
1459df56bc Move inline event handlers to <script> 2018-01-12 17:59:46 +01:00
Jakub Vrana
dc3a0e1a32 Clone onchange in cloneNode() 2018-01-12 17:33:23 +01:00
Jakub Vrana
0411495d20 Move inline event handlers to <script> 2018-01-12 17:19:47 +01:00
Jakub Vrana
3d69fbf5f7 Allow searching data in tables by Ctrl+Enter 2018-01-12 17:11:29 +01:00
Jakub Vrana
5e9df49fd1 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
565a5ca0eb Fix selectors in schema after 58b2904d 2018-01-12 17:11:29 +01:00
Jakub Vrana
9061583538 Rely on event always passed to handlers 2018-01-12 17:11:29 +01:00
Jakub Vrana
35b1db6974 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
068ee71bf7 Return false from editingRemoveRow 2018-01-12 17:11:29 +01:00
Jakub Vrana
efcf37d162 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
e645693147 Use script() for <script> 2018-01-12 17:10:33 +01:00
Jakub Vrana
12fbfc9847 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
6b2ba65084 Use <script> instead of inline event handler in print_fieldset() 2018-01-12 17:09:41 +01:00
Jakub Vrana
a5ee3451ac Use <script> instead of inline event handler in confirm() 2018-01-12 17:09:41 +01:00
Jakub Vrana
da671df728 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
650221357d Return false from ajaxSetHtml() 2018-01-12 17:09:41 +01:00
Jakub Vrana
d996b48cfa Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
22b4322710 Revert using @this in formChecked 2018-01-12 17:09:41 +01:00
Jakub Vrana
36edd445a6 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
7305783c21 Return false from toggle() 2018-01-12 17:09:41 +01:00
Jakub Vrana
ee3a88d574 onchange='selectFieldChange 2018-01-12 17:09:41 +01:00
Jakub Vrana
e5c52589ec Use @this in selectFieldChange 2018-01-12 17:09:41 +01:00
Jakub Vrana
3b0e1cf289 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
767fc0e47e Fix indexesAddColumn after 14778165 2018-01-12 17:09:41 +01:00
Jakub Vrana
63581af0f6 Move inline event handlers to <script> 2018-01-12 17:09:35 +01:00
Jakub Vrana
813ada6661 Revert using @this in formChecked 2018-01-11 18:58:00 +01:00
Jakub Vrana
4be72a2a0d Allow customizing CSP 2018-01-11 18:39:49 +01:00
Jakub Vrana
541c3c1fed Allow img-src data: common in skins 2018-01-11 18:39:49 +01:00
Jakub Vrana
3408d4ad78 Use JSON.parse if available 2018-01-11 18:39:49 +01:00
Jakub Vrana
e614ae08c4 Add Content Security Policy 2018-01-11 18:39:49 +01:00
Jakub Vrana
552d2a6be4 Always send security headers in customization 2018-01-11 18:39:49 +01:00
Jakub Vrana
415253b1b1 Add nosniff header 2018-01-11 18:39:22 +01:00
Jakub Vrana
d07b7e3773 Use Referrer-Policy instead of <meta name="referrer">
To make securityheaders.io happy.

Also fix a typo in the value (https://lists.w3.org/Archives/Public/public-webappsec/2015May/0059.html).
2018-01-11 18:38:15 +01:00
Jakub Vrana
3de101dff4 Editor: Fix doubleclick on database page 2018-01-11 17:24:57 +01:00
Jakub Vrana
48dacd1e97 Fix a typo from 9cb28186 2018-01-11 17:05:37 +01:00
Jakub Vrana
14778165a8 Use @this in JavaScript (prepares for removing inline event handlers) 2018-01-11 17:01:29 +01:00
Jakub Vrana
72b199378a Prevent PHP 7.1 warning about non-numeric values 2018-01-11 16:22:29 +01:00
Jakub Vrana
329fa55af5 Unindent doc-comments 2018-01-11 15:14:05 +01:00
Jakub Vrana
ecf34769ad Delete type="text/css" from <style> as it is the default in HTML5 2018-01-11 14:14:15 +01:00
Jakub Vrana
dc85ba2d86 Delete type="text/javascript" from <script> as it is the default in HTML5 2018-01-11 14:13:43 +01:00
Jakub Vrana
741b76fbd4 Replace getElementsByTagName by shortcut for querySelectorAll 2018-01-11 14:00:04 +01:00
Jakub Vrana
58b2904d62 Use querySelector 2018-01-11 13:55:48 +01:00
Jakub Vrana
9cb281868f Replace getElementById by shortcut for querySelector (requires IE8) 2018-01-11 13:51:32 +01:00
Jakub Vrana
67f6aea77f Fix skin for Chrome 61 (thanks to Dominik Ulrich) 2017-10-28 15:05:07 +02:00
Jakub Vrana
7bcba262df Editor: Display field comment's text inside [] only in edit form 2017-10-01 08:45:17 -07:00
Itamar Schen
75c0786d2e Fix hebrew typos (#228) 2017-09-29 09:25:32 +02:00
Jakub Vrana
c4f6cbb32e Add new Hebrew translations 2017-09-11 13:25:49 +02:00
Jakub Vrana
b10e9e127e Add Hebrew translation 2017-09-09 12:06:14 +02:00
Lukas Tribus
32f1e856ad Editor: Don't set time zone from PHP
Current implementation checks the delta between the local time and
UTC, and applies the delta as time zone for MySQL.

This assumption is wrong if the current time is DST enabled, but the
time that is converted isn't - and vice versa.

For example, Europe/Prague is "CET-1CEST,M3.5.0,M10.5.0/3", when
the MySQL connections is setup now (September, DST enabled) and
we are reading a TIMESTAMP from November, then MySQL applies +0200
instead of +0100 to that timestamp even though November is supposed
to be DST disabled.

There is no reliable and portable way in PHP to understand the
time zone, especially since PHP >= 5.4.0 ignores environment
variable and OS settings [1].

MySQL needs to be properly setup (TZ data loaded [2] and default
TZ set [3]), then everything will work just fine.

The current implementation however causes wrong data 50% of the
time, even when OS/MySQL/PHP is properly setup. As a MySQL
connection will converte timestamps from both DST enabled and
DST disabled dates, a static UTC offset must never be set at
connection level (set time_zone = ...).

This change removes the current implementation, therefor maintaining
OS/MySQL defaults, fixing the DST issue in properly configured
environments.

[1] http://php.net/manual/en/function.date-default-timezone-get.php
[2] https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html
[3] https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
2017-09-09 11:44:42 +02:00
Jonathan Vollebregt
17e45e9a9c Make sure all sidebar elements are pushed down, not just the form.
This was breaking the #logins block at the log in screen.
2017-09-09 11:39:47 +02:00
Jonathan Vollebregt
e1f43da8df Update AdminerTablesFilter to produce li as per c9801e2e24 2017-05-19 11:23:35 +02:00
Jakub Vrana
70aef8a55a MySQL: Remove dedicated view for replication status 2017-05-19 11:11:44 +02:00
Jakub Vrana
0b824dad29 Sort table names (bug #552) 2017-05-19 10:57:20 +02:00
Alfonso Montero
65fa4b4e31 Update es.inc.php 2017-04-22 10:07:55 +02:00
Jakub Vrana
c0a3f30060 Add a donate link 2017-04-16 10:42:27 +02:00
Jakub Vrana
7af1ee3702 Release 4.3.1 2017-04-14 09:48:11 +02:00
Jakub Vrana
3cbece1ec0 Fix SQL command autofocus 2017-04-09 12:30:34 +02:00
Jakub Vrana
0d73372c50 Add a todo 2017-04-09 12:13:18 +02:00
Jakub Vrana
fb7bd02713 Don't overwrite previous cookies (bug #539) 2017-04-09 11:04:57 +02:00
Jakub Vrana
fb71941daa PostgreSQL: Fix JSONB version support 2017-04-08 20:17:08 +02:00
Jakub Vrana
504c56216c PostgreSQL: Support JSON and JSONB data types (bug #542) 2017-04-08 19:59:13 +02:00
Jakub Vrana
88803c6d0e Update haeckel design (thanks to Klemens Haeckel) 2017-04-08 19:51:13 +02:00
Andre Polykanine A.K.A. Menelion Elensúlë
b585ee8261 Updating Russian translation 2017-04-08 19:41:36 +02:00
Deni
f4817e8568 Fix table dependency on export 2017-04-08 19:38:03 +02:00
Deni
105aca9b04 Fix PostgreSQL nullable fields in export 2017-04-08 19:37:56 +02:00
Jakub Vrana
f556f6acb1 PostgreSQL: Fix index size computation in PostgreSQL < 9.0 (reverts 4c78976c) 2017-04-08 19:33:46 +02:00
Jakub Vrana
22d0cf4171 Release 4.3.0 2017-03-15 18:24:12 +01:00
Jakub Vrana
fa0963f370 Reorder changelog 2017-03-15 16:57:58 +01:00
Jakub Vrana
ba28845651 Update JUSH 2017-03-15 12:53:26 +01:00
Jakub Vrana
8fd7ff0187 Highlight JSON 2017-03-10 08:56:58 +01:00
Jakub Vrana
e040b296c5 Print number of bytes in blob in italics 2017-03-10 08:19:58 +01:00
Jakub Vrana
b616c57352 MySQL: Support JSON data type 2017-03-10 08:15:52 +01:00
Jakub Vrana
50390ea38c Support MySQL 8 2017-03-09 18:52:00 +01:00
Jakub Vrana
9d7d30891e Use SameSite cookies (except session cookie) 2017-03-07 18:12:23 +01:00
Jakub Vrana
4cf73abccd Rely on noreferrer in Firefox too 2017-03-01 11:35:01 +01:00
Jakub Vrana
2d6451b99a Improve SQLite login error message 2017-03-01 11:23:20 +01:00
Jakub Vrana
40d1feec9f Update URL 2017-02-27 13:44:22 +01:00
Jakub Vrana
e40d9692c7 Save bytes 2017-02-22 11:49:25 +01:00
Jakub Vrana
770fc9673c Lint PHP files 2017-02-21 13:47:19 +01:00
Jakub Vrana
56b6590a4f Simplify SQLite development 2017-02-21 13:13:39 +01:00
Jakub Vrana
f8fd4dd6e3 Document new engines 2017-02-21 13:05:43 +01:00
Jakub Vrana
d8c28d1c91 Avoid referencing global variable (doesn't work in PHP 7.1 if Adminer is included inside a function) 2017-02-21 12:07:13 +01:00
Jakub Vrana
46f39f3cdb Bump version 2017-02-21 12:07:13 +01:00
Jakub Vrana
8a9df8ede1 Elasticsearch: allow empty server name 2017-02-21 12:07:13 +01:00
Jakub Vrana
e4d35f9591 Hide materialized views in MySQL 2017-02-20 19:28:16 +01:00
Jakub Vrana
346353153d Unindent 2017-02-20 19:28:16 +01:00
Jakub Vrana
9df33e82e6 Elasticsearch: Support HTTPS by inputting https://server (bug #446) 2017-02-20 18:06:14 +01:00
Jakub Vrana
fa09eba15e Save bytes 2017-02-20 17:25:59 +01:00
Jakub Vrana
d5b329a1a4 MySQL: Support spatial indexes (bug #455) 2017-02-20 17:25:34 +01:00
Jakub Vrana
0cd02bb98a Fix dropping foreign keys linking to other database 2017-02-20 16:59:13 +01:00
Jakub Vrana
a7cbf66347 Move 'Create user' above the list of users 2017-02-20 16:52:10 +01:00
Jakub Vrana
fa6865da6a Use 'Create database' instead of 'Create new database' 2017-02-20 16:47:03 +01:00
Jakub Vrana
63b6b99365 Support high Unicode characters in shorten_utf8 (bug #481) 2017-02-20 16:22:30 +01:00
Jakub Vrana
a0a1476e5b Fix where() escaping in MS SQL (bug #496) 2017-02-20 15:23:22 +01:00
Jakub Vrana
8a9d803137 Add jsonly class to JS checkboxes 2017-02-20 15:11:47 +01:00
Jakub Vrana
4588af77ac Display message about missing master status 2017-02-20 14:06:19 +01:00
Jakub Vrana
91bd2e84f5 Add Czech translation 2017-02-20 12:55:57 +01:00
Matthew Gamble
2a534798fa Add basic support for MySQL replication 2017-02-20 12:54:40 +01:00
Adam Kuśmierz
a062e9cc58 Checkbox for bool in psql 2017-02-20 12:31:36 +01:00
Peter Knut
6c84764334 Fixed all alternative designs after changes in a list of tables made here: https://github.com/vrana/adminer/pull/116 2017-02-20 12:21:50 +01:00
Jakub Vrana
a01ca3ade4 PostgreSQL: Allow changing materialized views 2017-02-20 12:13:09 +01:00
Jakub Vrana
6ee4692afd PostgreSQL: Fix index size computation 2017-02-20 12:06:41 +01:00
Jakub Vrana
b8cd3b317d Verify commit success after import.
Fixes https://sourceforge.net/p/adminer/bugs-and-features/521/.
2017-02-19 14:22:41 +01:00
Jonathan Vollebregt
64a49e95e8 Add javascript move for editing 2017-02-19 13:55:50 +01:00
Jan Kalina
8dd971ca5e foreign key link fix - added missing ns 2017-02-19 13:02:55 +01:00
Peter Knut
c9801e2e24 Tables list implemented as <ul>
Encapsulation of list items is necessery for advanced CSS themes.
2017-02-19 11:39:04 +01:00
newsiram
4578d47409 Changed NULL format
+ <i> was not italics
+ reduce font & showed border
2017-02-19 11:36:20 +01:00
Loren Klingman
12aaf506b8 Fix MS SQL Driver to not show warnings for version fetching on connection and to retrieve the next set of results properly 2017-02-19 11:35:24 +01:00
Mathieu Rochette
4cfe6263d9 fix logger for SQL commands 2017-02-19 11:00:07 +01:00
Felix Geyer
b8bea7fc56 Hide databases the user can't connect to
pg_database lists all databases including the ones the user can't connect to.
There is little point in showing them when we know connecting will fail.
2017-02-19 10:33:22 +01:00
0xACE
cd8ff96a09 Breadcumb no longer blocks the logout button.
Not sure why the top bar is blocking the logout button. This patch allows the user  to see and click the logout button.
2017-02-19 10:15:05 +01:00
Kakysha
4a69059e1b Edit json and jsonb types in textarea 2017-02-19 10:02:51 +01:00
Gargaj
842ea0bd46 Add namespace to routine call
MSSQL is picky about this, shouldn't affect the drivers that don't use namespaces.
2017-02-19 09:53:51 +01:00
K0n24d
1d0607177d Do not set input type as numeric if field is an array 2017-02-19 09:45:05 +01:00
isra00
9e4d9fda65 New skin 'flat' 2017-02-19 09:31:19 +01:00
nafex
47c582acb3 make bytea fields shortable 2017-02-19 09:30:39 +01:00
Lubor Bilek
32334f1106 PostgreSQL export: table structure, columns, sequences, indexes, foreign keys, comments, trigger definition 2017-02-19 09:26:47 +01:00
Matthew Gamble
a10238516c Add plugin for printing table indexes structure in expanded format 2017-02-18 19:22:47 +01:00
Matthew Gamble
4801da091b Add plugin for printing table structure in expanded format
Instead of trying to squeeze everything into three columns, this plugin
uses multiple columns for each part of a column's structure.
2017-02-18 19:21:16 +01:00
Matthew Gamble
76612b1e8a Move rendering of table structure and indexes list into plugin system
This allows the creation of a plugin to extend the display of either or
both of these things.
2017-02-18 19:15:23 +01:00
Matthew Gamble
eb8c9929d3 Handle checkboxes properly in selectAddRow() 2017-02-18 18:59:06 +01:00
Ion Bazan
cf10398104 fixed Elastic table_status() 2017-02-18 18:45:23 +01:00
Jiří Barouš
d00927ce66 Improve limit check in edit-foreign plugin
The limit is enforced in the query to prevent out-of-memory errors for big target tables.
2017-02-18 18:32:32 +01:00
Jonathan Vollebregt
28a84fec18 AdminerTablesFilter: Persist filter value in a tab 2017-02-18 18:13:05 +01:00
Jonathan Vollebregt
2c8eff9b53 Update AdminerTablesFilter
* Removes children request (Should work on IE6, 7, 8 now)
* Uses <strong> instead of <b>
* Doesn't leave said <strong> tags behind after updating the list
* Highlights multiple matches in a single table name
* Works case insensitively
* Improves performance with setTimeout
    With 400 tables, the old implementation locks up the tab (or
    browser if using something without multiprocess) for about
    half a second per keyup. Yes, this includes modifiers that
    don't actually change the filter. The new version handles
    the same event in 0.09 milliseconds.

    That's with all the above improvements.
    Tested in firefox 45.1.1 performance monitor.
2017-02-18 18:12:58 +01:00
Alessandro Frangioni
5f26d3a1b8 Added support for binary foreign keys selection on edit 2017-02-18 18:06:14 +01:00
Adam Kuśmierz
3344fae96e Plugin: Use <select> on custom user types in psql 2017-02-18 18:01:17 +01:00
Janne Cederberg
dedbd01f64 Tabs must also be escaped in JSON strings
If database table data contains tab characters (0x09) then those
must also be escaped along with newlines and carriage returns for
the resulting JSON file to be valid.
2017-02-18 17:51:55 +01:00
PiR-B-
4c78976cba Fix index length with Postgresql 2017-02-18 17:42:34 +01:00
soleuu
1a6186648c postgresql error with index on hidden columns (ctid) 2017-02-18 17:41:45 +01:00
Daniel Berthereau
36f42d0fda Fixed background of the list of the tables. 2017-02-18 17:40:00 +01:00
Jakub Vrana
45712a5d4c Document changes 2017-02-18 17:37:12 +01:00
Charles Wu
73690164b7 Added pdo_dblib as a driver for MSSQL (as native MSSQL driver does not exist for PHP7) 2017-02-18 17:35:36 +01:00
Jakub Vrana
3fa1eadf2c Use null instead of undefined on after parsing JSON 2017-02-18 17:32:40 +01:00
shaununderwood
3a1c251065 Changed 'undefined' to 'null'
'undefined' is not a valid JSON attribute value and should been 'null'
2017-02-18 17:32:40 +01:00
Massimiliano Torromeo
d0268c69da Fixed mssql driver for usage with microsoft's php7 sqlsrv extension 2017-02-18 17:32:40 +01:00
Adam Kusmierz
fd3d1c7e2e Plugin which shows sql structure comments in field names title 2017-02-18 17:32:40 +01:00
Adam Kusmierz
cbd3adc564 PHP Warning hidden and better parsing times (at least for postgresql) 2017-02-18 17:32:40 +01:00
soleuu
86e26846a8 postgresql : ERROR: function connection_id() does not exist 2017-02-18 17:32:40 +01:00
soleuu
6860478950 postgresql : unique partial index musn't be considered as unique. can cause problems on row edition 2017-02-18 17:32:40 +01:00
Jakub Vrana
dc9ae77e2f Fix error found by PHPStan 2017-02-16 19:05:45 +01:00
jose
8f60870d9a mistype correction 2017-02-13 17:17:36 +01:00
Jakub Vrana
d6c3430607 Add accessibility labels to Foreign keys 2017-01-23 15:12:42 -08:00
Jakub Vrana
2cee788ad3 Add accessibility labels to Indexes 2017-01-23 14:29:00 -08:00
Jakub Vrana
647cab7c69 Use class instead inline style 2017-01-23 14:10:50 -08:00
Jakub Vrana
9bb75e1230 Add accessibility labels to databases and tables checkboxes 2017-01-23 14:05:47 -08:00
Jakub Vrana
7099560add Escape quote in field name to make it work in Chrome (thanks to zcepenela pani) 2017-01-23 13:30:05 -08:00
Lucas Sandery
14cb9ca1ef Additional theme with responsive and RTL support
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2017-01-23 12:53:27 -08:00
Lucas Sandery
31057f0ef2 RTL layout fixes
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2017-01-23 12:50:23 -08:00
Jakub Vrana
fa09962ab1 Add SQLite auto-login plugin 2016-11-28 10:09:51 -08:00
Jakub Vrana
bad3c6b086 Disallow selecting driver if there's only one 2016-11-28 10:07:03 -08:00
MegaXLR
0922b312d3 Changed 'geraakt' to 'beinvloed' in Dutch translation 2016-10-02 11:27:23 +02:00
Jakub Vrana
949b913d4f Change comment not supported by compile.php 2016-09-27 22:04:44 -07:00
Jakub Vrana
af25827ff4 Add Cache-Control: immutable to static files 2016-09-27 21:53:11 -07:00
Jakub Vrana
9872229e11 Make maxlength in edit fields a soft limit 2016-09-19 10:12:33 -07:00
Jakub Vrana
682e86d236 Add accessibility labels to Create Table fields 2016-09-19 15:33:12 +02:00
Jakub Vrana
f0a5fb56a5 Update Indonesian translation (thanks to Benny) 2016-07-22 17:30:38 +02:00
Jakub Vrana
53dfafd2ea Release 4.2.5 2016-06-01 10:09:29 -07:00
Jakub Vrana
7a33661b72 SQLite: Require credentials to use (thanks to Vincent Waart) 2016-06-01 09:59:20 -07:00
Jakub Vrana
a5b65fba5b Fix remote execution in SQLite query (thanks to Vincent Waart) 2016-06-01 09:56:40 -07:00
Jakub Vrana
63f2a041ed Remove global variable 2016-02-28 12:30:52 -08:00
Bernhard J. M. Gruen
3289eca040 improved kill command support for MySQL and initial support for PgSQL 2016-02-28 12:27:45 -08:00
Petr Sedlacek
c5a7174a2a Fix http:// links in stylesheets to protocol-independent ones (//)
The http links do not load on https pages due to mixed content restriction
of modern browsers
2016-02-28 11:34:10 -08:00
Jakub Vrana
49e2ac4559 Release 4.2.4 2016-02-06 11:10:16 -08:00
Jakub Vrana
e5352cc5ac Fix remote execution in SQLite query (discovered by 庞申杰(千霄)) 2016-02-06 11:00:19 -08:00
Jakub Vrana
0bb5a52dc4 Add Finnish translation 2016-02-06 10:50:57 -08:00
Jakub Vrana
37b9f0ec01 Add Bosnian translation 2016-02-01 09:10:07 -08:00
ekurtovic
73f94e4873 Bosnian language 2016-02-01 09:09:54 -08:00
Jakub Vrana
a2f0806804 Delete unused variable and method 2016-01-24 14:25:17 -08:00
Jakub Vrana
b317fe156a Support PHP 7 2016-01-24 12:02:41 -08:00
Angristan
763d3e9f89 Use HTTPS Google Font URL 2016-01-24 11:23:33 -08:00
Jakub Vrana
f83e3f41d2 Release 4.2.3 2015-11-15 10:49:48 -08:00
Jakub Vrana
aa40e803e2 Add escaping (not fixing any XSS) 2015-11-08 12:15:45 -08:00
Jakub Vrana
4be0b6655e Fix XSS in indexes (non-MySQL only) 2015-11-08 12:12:16 -08:00
Jakub Vrana
6c6bb45d3d Update Bulgarian translation 2015-11-03 08:48:08 -08:00
Jakub Vrana
0a31742ee8 Add Bulgarian translation 2015-11-01 11:33:04 -08:00
David Grudl
1f700ceea0 plugin.php: added missing arguments 2015-11-01 11:09:21 -08:00
David Grudl
a6ebd4a3e0 uses PHP 5 constructors 2015-11-01 11:08:46 -08:00
Jakub Vrana
d1aa3542ae Update xx translation 2015-09-22 08:52:53 -07:00
Jakub Vrana
b1da3995f6 Update Greek translation 2015-09-22 08:47:14 -07:00
Jakub Vrana
79d438ed80 Add Galician translation 2015-09-22 08:29:49 -07:00
Jakub Vrana
35b71f0472 Add Greek translation 2015-09-20 11:09:34 -07:00
Jakub Vrana
a01b2efc22 Change links to HTTPS 2015-09-10 09:26:36 -07:00
Jakub Vrana
a248f8b008 Change protocol to HTTPS 2015-09-08 11:41:29 -07:00
Nabil Kadimi
69ff979ee7 Improve Arabic translation 2015-08-13 09:13:18 -07:00
Nabil Kadimi
1aa7833a90 Improve Arabic translation 2015-08-13 09:10:50 -07:00
Jakub Vrana
40ce23d5ae Add nicu style 2015-08-06 09:01:14 -07:00
Jakub Vrana
060e220806 Add galkaev design 2015-08-05 19:13:29 -07:00
Jakub Vrana
1fcdaedb5f Add release date 2015-08-05 18:29:29 -07:00
311 changed files with 32101 additions and 13015 deletions

20
.editorconfig Normal file
View File

@@ -0,0 +1,20 @@
# https://editorconfig.org/
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{php,css,js,xml}]
indent_style = tab
[*.json]
indent_style = space
indent_size = 4
[*.md]
indent_style = space
trim_trailing_whitespace = false
max_line_length = 120

6
.gitattributes vendored Normal file
View File

@@ -0,0 +1,6 @@
/.gitattributes export-ignore
/.github export-ignore
/.gitignore export-ignore
/.gitmodules export-ignore
/.travis.yml export-ignore
/tests export-ignore

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
github: vrana
patreon: jakubvrana
custom: ["https://www.paypal.com/donate/?hosted_button_id=6PK5VNUCFT3FG"]

18
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,18 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Adminer version:** please use latest published or Git
**Compiled:** single file / single language / source codes / custom compilation
**Driver:** e.g. MySQLi
**Database version:** e.g. 10.2.12-MariaDB
**Plugins used:**
_Please provide reproducible steps including a SQL dump (with no personal information) if applicable.
Also please include a screenshot.
Report issues with Adminer Docker image at https://github.com/TimWolla/docker-adminer._

17
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: CI
on:
pull_request:
branches: [ master ]
jobs:
build-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: php-actions/composer@v6
- uses: php-actions/phpcs@v1
with:
path: adminer/
standard: phpcs.xml

8
.gitignore vendored
View File

@@ -1,4 +1,12 @@
/adminer/adminer.css
/adminer/adminer-dark.css
/editor/adminer.css
/editor/adminer-dark.css
/adminer*.php
/editor*.php
/tests/pdo-*.html
/tests/screenshots/
/tests/cropped/
/vendor/
adminer-plugins/
adminer-plugins.php

10
.gitmodules vendored
View File

@@ -1,9 +1,9 @@
[submodule "jush"]
path = externals/jush
url = git://git.code.sf.net/p/jush/git
[submodule "wymeditor"]
path = externals/wymeditor
url = git://github.com/wymeditor/wymeditor.git
url = https://github.com/vrana/jush
[submodule "JsShrink"]
path = externals/JsShrink
url = git://github.com/vrana/JsShrink.git
url = https://github.com/vrana/JsShrink
[submodule "PhpShrink"]
path = externals/PhpShrink
url = https://github.com/vrana/PhpShrink

1234
CHANGELOG.md Normal file

File diff suppressed because it is too large Load Diff

3
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,3 @@
- Reproducible [bug reports](https://github.com/vrana/adminer/issues/new?template=bug_report.md) are warmly welcomed.
- [Feature requests](https://github.com/vrana/adminer/issues/new?template=BLANK_ISSUE) are also fine, but I'm quite picky about what to accept into Adminer. Please don't be offended if I close the issue as "Not Planned," especially if it can be achieved with a plugin.
- [Pull requests](https://github.com/vrana/adminer/pulls) for both bug fixes and simple features are welcome. Before working on anything more complicated, get familiar with the [Adminer philosophy](https://github.com/vrana/adminer/blob/master/developing.md).

1
LICENSE Normal file
View File

@@ -0,0 +1 @@
Apache License 2.0 or GPL 2

39
Makefile Normal file
View File

@@ -0,0 +1,39 @@
ROOT_DIRECTORY = $(shell dirname "$(realpath $(lastword $(MAKEFILE_LIST)))")
PHP := $(shell which php)
PORT := 8000
.DEFAULT_GOAL := default
.PHONY: default
default: compile
.PHONY: compile
compile:
$(PHP) $(ROOT_DIRECTORY)/compile.php
.PHONY: server
server:
php \
--server 127.0.0.1:$(PORT) \
--docroot $(ROOT_DIRECTORY)
.PHONY: initialize
initialize:
git \
-C $(ROOT_DIRECTORY) \
submodule \
update \
--init \
--recursive
.PHONY: clean
clean:
rm \
--recursive \
--force \
$(ROOT_DIRECTORY)/adminer.php
.PHONY: clean.all
clean.all: clean

26
README.md Normal file
View File

@@ -0,0 +1,26 @@
# Adminer
**Adminer** is a full-featured database management tool written in PHP. It consists of a single file ready to deploy to the target server.
**Adminer Editor** offers data manipulation for end-users.
[Official Website](https://www.adminer.org/)
## Features
- **Supports:** MySQL, MariaDB, PostgreSQL, CockroachDB, SQLite, MS SQL, Oracle
- **Plugins for:** Elasticsearch, SimpleDB, MongoDB, Firebird, ClickHouse, IMAP
- **Requirements:** PHP 5.3+ (compiled file), PHP 7.4+ (source codes)
## Screenshot
![Table structure](https://www.adminer.org/static/screenshots/table.png)
## Installation
If downloaded from Git then run: `git submodule update --init`
- `adminer/index.php` - Run development version of Adminer
- `editor/index.php` - Run development version of Adminer Editor
- `editor/example.php` - Example customization
- `compile.php` - Create a single file version
- `lang.php` - Update translations
- `tests/*.html` - Katalon Recorder test suites
## Plugins
There are several plugins distributed with Adminer, as well as many user-contributed plugins listed on the [Adminer Plugins page](https://www.adminer.org/plugins/).

11
SECURITY.md Normal file
View File

@@ -0,0 +1,11 @@
# Security Policy
## Supported Versions
Only the latest published version and the latest development version (last commit) are supported.
## Reporting a Vulnerability
To report a vulnerability, create a new draft security advisory at [GitHub Security Advisories](https://github.com/vrana/adminer/security/advisories/new).
Security issues are handled with top priority. If you don't receive a response within a week, please follow up on the report. Once a vulnerability is acknowledged, a fix should be available and a new version released within a few days. The issue will be made public after the fix is released or if the report is declined.

View File

@@ -1,12 +1,14 @@
<?php
$PROCEDURE = $_GET["call"];
namespace Adminer;
$PROCEDURE = ($_GET["name"] ?: $_GET["call"]);
page_header(lang('Call') . ": " . h($PROCEDURE), $error);
$routine = routine($PROCEDURE, (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
$routine = routine($_GET["call"], (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
$in = array();
$out = array();
foreach ($routine["fields"] as $i => $field) {
if (substr($field["inout"], -3) == "OUT") {
if (substr($field["inout"], -3) == "OUT" && JUSH == 'sql') {
$out[$i] = "@" . idf_escape($field["field"]) . " AS " . idf_escape($field["field"]);
}
if (!$field["inout"] || substr($field["inout"], 0, 2) == "IN") {
@@ -17,40 +19,50 @@ foreach ($routine["fields"] as $i => $field) {
if (!$error && $_POST) {
$call = array();
foreach ($routine["fields"] as $key => $field) {
$val = "";
if (in_array($key, $in)) {
$val = process_input($field);
if ($val === false) {
$val = "''";
}
if (isset($out[$key])) {
$connection->query("SET @" . idf_escape($field["field"]) . " = $val");
connection()->query("SET @" . idf_escape($field["field"]) . " = $val");
}
}
$call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
if (isset($out[$key])) {
$call[] = "@" . idf_escape($field["field"]);
} elseif (in_array($key, $in)) {
$call[] = $val;
}
}
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")";
echo "<p><code class='jush-$jush'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n";
if (!$connection->multi_query($query)) {
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . table($PROCEDURE) . "(" . implode(", ", $call) . ")";
$start = microtime(true);
$result = connection()->multi_query($query);
$affected = connection()->affected_rows; // getting warnings overwrites this
echo adminer()->selectQuery($query, $start, !$result);
if (!$result) {
echo "<p class='error'>" . error() . "\n";
} else {
$connection2 = connect();
if (is_object($connection2)) {
if ($connection2) {
$connection2->select_db(DB);
}
do {
$result = $connection->store_result();
$result = connection()->store_result();
if (is_object($result)) {
select($result, $connection2);
print_select_result($result, $connection2);
} else {
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $affected)
. " <span class='time'>" . @date("H:i:s") . "</span>\n" // @ - time zone may be not set
;
}
} while ($connection->next_result());
} while (connection()->next_result());
if ($out) {
select($connection->query("SELECT " . implode(", ", $out)));
print_select_result(connection()->query("SELECT " . implode(", ", $out)));
}
}
}
@@ -59,21 +71,18 @@ if (!$error && $_POST) {
<form action="" method="post">
<?php
if ($in) {
echo "<table cellspacing='0'>\n";
echo "<table class='layout'>\n";
foreach ($in as $key) {
$field = $routine["fields"][$key];
$name = $field["field"];
echo "<tr><th>" . $adminer->fieldName($field);
$value = $_POST["fields"][$name];
echo "<tr><th>" . adminer()->fieldName($field);
$value = idx($_POST["fields"], $name);
if ($value != "") {
if ($field["type"] == "enum") {
$value = +$value;
}
if ($field["type"] == "set") {
$value = array_sum($value);
$value = implode(",", $value);
}
}
input($field, $value, (string) $_POST["function"][$name]); // param name can be empty
input($field, $value, idx($_POST["function"], $name, "")); // param name can be empty
echo "\n";
}
echo "</table>\n";
@@ -81,5 +90,31 @@ if ($in) {
?>
<p>
<input type="submit" value="<?php echo lang('Call'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php echo input_token(); ?>
</form>
<pre>
<?php
/** Format string as table row
* @return string HTML
*/
function pre_tr(string $s): string {
return preg_replace('~^~m', '<tr>', preg_replace('~\|~', '<td>', preg_replace('~\|$~m', "", rtrim($s))));
}
$table = '(\+--[-+]+\+\n)';
$row = '(\| .* \|\n)';
echo preg_replace_callback(
"~^$table?$row$table?($row*)$table?~m",
function ($match) {
$first_row = pre_tr($match[2]);
return "<table>\n" . ($match[1] ? "<thead>$first_row</thead>\n" : $first_row) . pre_tr($match[4]) . "\n</table>";
},
preg_replace(
'~(\n( -|mysql)&gt; )(.+)~',
"\\1<code class='jush-sql'>\\3</code>",
preg_replace('~(.+)\n---+\n~', "<b>\\1</b>\n", h($routine['comment']))
)
);
?>
</pre>

51
adminer/check.inc.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
namespace Adminer;
$TABLE = $_GET["check"];
$name = $_GET["name"];
$row = $_POST;
if ($row && !$error) {
if (JUSH == "sqlite") {
$result = recreate_table($TABLE, $TABLE, array(), array(), array(), "", array(), "$name", ($row["drop"] ? "" : $row["clause"]));
} else {
$result = ($name == "" || queries("ALTER TABLE " . table($TABLE) . " DROP CONSTRAINT " . idf_escape($name)));
if (!$row["drop"]) {
$result = queries("ALTER TABLE " . table($TABLE) . " ADD" . ($row["name"] != "" ? " CONSTRAINT " . idf_escape($row["name"]) : "") . " CHECK ($row[clause])"); //! SQL injection
}
}
queries_redirect(
ME . "table=" . urlencode($TABLE),
($row["drop"] ? lang('Check has been dropped.') : ($name != "" ? lang('Check has been altered.') : lang('Check has been created.'))),
$result
);
}
page_header(($name != "" ? lang('Alter check') . ": " . h($name) : lang('Create check')), $error, array("table" => $TABLE));
if (!$row) {
$checks = driver()->checkConstraints($TABLE);
$row = array("name" => $name, "clause" => $checks[$name]);
}
?>
<form action="" method="post">
<p><?php
if (JUSH != "sqlite") {
echo lang('Name') . ': <input name="name" value="' . h($row["name"]) . '" data-maxlength="64" autocapitalize="off"> ';
}
echo doc_link(array(
'sql' => "create-table-check-constraints.html",
'mariadb' => "constraint/",
'pgsql' => "ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS",
'mssql' => "relational-databases/tables/create-check-constraints",
'sqlite' => "lang_createtable.html#check_constraints",
), "?");
?>
<p><?php textarea("clause", $row["clause"]); ?>
<p><input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($name != "") { ?>
<input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $name)); ?>
<?php } ?>
<?php echo input_token(); ?>
</form>

View File

@@ -1,9 +1,9 @@
<?php
namespace Adminer;
$TABLE = $_GET["create"];
$partition_by = array();
foreach (array('HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY', 'RANGE', 'LIST') as $key) {
$partition_by[$key] = $key;
}
$partition_by = driver()->partitionBy;
$partitions_info = ($partition_by ? driver()->partitionsInfo($TABLE) : array());
$referencable_primary = referencable_primary($TABLE);
$foreign_keys = array();
@@ -15,8 +15,8 @@ $orig_fields = array();
$table_status = array();
if ($TABLE != "") {
$orig_fields = fields($TABLE);
$table_status = table_status($TABLE);
if (!$table_status) {
$table_status = table_status1($TABLE);
if (count($table_status) < 2) { // there's only the Name field
$error = lang('No tables.');
}
}
@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
}
if ($_POST) {
save_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
}
if ($_POST && !process_fields($row["fields"]) && !$error) {
if ($_POST["drop"]) {
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
@@ -35,7 +39,6 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
$all_fields = array();
$use_all_fields = false;
$foreign = array();
ksort($row["fields"]);
$orig_field = reset($orig_fields);
$after = " FIRST";
@@ -43,22 +46,19 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
$foreign_key = $foreign_keys[$field["type"]];
$type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
if ($field["field"] != "") {
if (!$field["has_default"]) {
if (!$field["generated"]) {
$field["default"] = null;
}
if ($key == $row["auto_increment_col"]) {
$field["auto_increment"] = true;
}
$process_field = process_field($field, $type_field);
$all_fields[] = array($field["orig"], $process_field, $after);
if ($process_field != process_field($orig_field, $orig_field)) {
if (!$orig_field || $process_field !== process_field($orig_field, $orig_field)) {
$fields[] = array($field["orig"], $process_field, $after);
if ($field["orig"] != "" || $after) {
$use_all_fields = true;
}
}
if ($foreign_key !== null) {
$foreign[idf_escape($field["field"])] = ($TABLE != "" && $jush != "sqlite" ? "ADD" : " ") . format_foreign_key(array(
$foreign[idf_escape($field["field"])] = ($TABLE != "" && JUSH != "sqlite" ? "ADD" : " ") . format_foreign_key(array(
'table' => $foreign_keys[$field["type"]],
'source' => array($field["field"]),
'target' => array($type_field["field"]),
@@ -78,21 +78,26 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
}
}
$partitioning = "";
if ($partition_by[$row["partition_by"]]) {
$partitions = array();
if ($row["partition_by"] == 'RANGE' || $row["partition_by"] == 'LIST') {
foreach (array_filter($row["partition_names"]) as $key => $val) {
$value = $row["partition_values"][$key];
$partitions[] = "\n PARTITION " . idf_escape($val) . " VALUES " . ($row["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
$partitioning = array();
if (in_array($row["partition_by"], $partition_by)) {
foreach ($row as $key => $val) {
if (preg_match('~^partition~', $key)) {
$partitioning[$key] = $val;
}
}
$partitioning .= "\nPARTITION BY $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
? " (" . implode(",", $partitions) . "\n)"
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
);
} elseif (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
$partitioning .= "\nREMOVE PARTITIONING";
foreach ($partitioning["partition_names"] as $key => $name) {
if ($name == "") {
unset($partitioning["partition_names"][$key]);
unset($partitioning["partition_values"][$key]);
}
}
$partitioning["partition_names"] = array_values($partitioning["partition_names"]);
$partitioning["partition_values"] = array_values($partitioning["partition_values"]);
if ($partitioning == $partitions_info) {
$partitioning = array();
}
} elseif (preg_match("~partitioned~", $table_status["Create_options"])) {
$partitioning = null;
}
$message = lang('Table has been altered.');
@@ -105,7 +110,7 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table(
$TABLE,
$name,
($jush == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
(JUSH == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
$foreign,
($row["Comment"] != $table_status["Comment"] ? $row["Comment"] : null),
($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""),
@@ -119,9 +124,10 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), h($TABLE));
if (!$_POST) {
$types = driver()->types();
$row = array(
"Engine" => $_COOKIE["adminer_engine"],
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")))),
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")), "on_update" => "")),
"partition_names" => array(""),
);
@@ -133,24 +139,23 @@ if (!$_POST) {
$row["Auto_increment"] = "";
}
foreach ($orig_fields as $field) {
$field["has_default"] = isset($field["default"]);
$field["generated"] = $field["generated"] ?: (isset($field["default"]) ? "DEFAULT" : "");
$row["fields"][] = $field;
}
if (support("partitioning")) {
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
$partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
$partitions[""] = "";
$row["partition_names"] = array_keys($partitions);
$row["partition_values"] = array_values($partitions);
if ($partition_by) {
$row += $partitions_info;
$row["partition_names"][] = "";
$row["partition_values"][] = "";
}
}
}
$collations = collations();
$engines = engines();
if (is_array(reset($collations))) {
$collations = call_user_func_array('array_merge', array_values($collations));
}
$engines = driver()->engines();
// case of engine may differ
foreach ($engines as $engine) {
if (!strcasecmp($engine, $row["Engine"])) {
@@ -162,65 +167,60 @@ foreach ($engines as $engine) {
<form action="" method="post" id="form">
<p>
<?php if (support("columns") || $TABLE == "") { ?>
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
<?php echo ($engines ? "<select name='Engine' onchange='helpClose();'" . on_help("getTarget(event).value", 1) . ">" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" : ""); ?>
<?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php } ?>
<?php if (support("columns")) { ?>
<table cellspacing="0" id="edit-fields" class="nowrap">
<?php
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
if (!$_POST && !$comments) {
foreach ($row["fields"] as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
if (support("columns") || $TABLE == "") {
echo lang('Table name') . ": <input name='name'" . ($TABLE == "" && !$_POST ? " autofocus" : "") . " data-maxlength='64' value='" . h($row["name"]) . "' autocapitalize='off'>\n";
echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . on_help("event.target.value", 1) . script("qsl('select').onchange = helpClose;") . "\n" : "");
if ($collations) {
echo "<datalist id='collations'>" . optionlist($collations) . "</datalist>\n";
echo (preg_match("~sqlite|mssql~", JUSH) ? "" : "<input list='collations' name='Collation' value='" . h($row["Collation"]) . "' placeholder='(" . lang('collation') . ")'>\n");
}
echo "<input type='submit' value='" . lang('Save') . "'>\n";
}
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
?>
</table>
<p>
<?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, true, lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
<?php echo (support("comment")
? "<label><input type='checkbox' name='comments' value='1' class='jsonly' onclick=\"columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();\"" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
. ' <input name="Comment" id="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
: '')
; ?>
if (support("columns")) {
echo "<div class='scrollable'>\n";
echo "<table id='edit-fields' class='nowrap'>\n";
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
echo "</table>\n";
echo script("editFields();");
echo "</div>\n<p>\n";
echo lang('Auto Increment') . ": <input type='number' name='Auto_increment' class='size' value='" . h($row["Auto_increment"]) . "'>\n";
echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : get_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly");
$comments = ($_POST ? $_POST["comments"] : get_setting("comments"));
echo (support("comment")
? checkbox("comments", 1, $comments, lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
. ' ' . (preg_match('~\n~', $row["Comment"])
? "<textarea name='Comment' rows='2' cols='20'" . ($comments ? "" : " class='hidden'") . ">" . h($row["Comment"]) . "</textarea>"
: '<input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? "" : " class='hidden'") . '>'
)
: '')
;
?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php } ?>
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<?php if ($TABLE != "") { ?>
<input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $TABLE)); ?>
<?php } ?>
<?php
if (support("partitioning")) {
if ($partition_by && (JUSH == 'sql' || $TABLE == "")) {
$partition_table = preg_match('~RANGE|LIST~', $row["partition_by"]);
print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
?>
<p>
<?php echo "<select name='partition_by' onchange='partitionByChange(this);'" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . ">" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>"; ?>
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
<?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size<?php echo ($partition_table || !$row["partition_by"] ? " hidden" : ""); ?>" value="<?php echo h($row["partitions"]); ?>">
<table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
<thead><tr><th><?php echo lang('Partition name'); ?><th><?php echo lang('Values'); ?></thead>
<?php
foreach ($row["partition_names"] as $key => $val) {
echo '<tr>';
echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . ' autocapitalize="off">';
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
echo "<p>" . html_select("partition_by", array_merge(array(""), $partition_by), $row["partition_by"]) . on_help("event.target.value.replace(/./, 'PARTITION BY \$&')", 1) . script("qsl('select').onchange = partitionByChange;");
echo "(<input name='partition' value='" . h($row["partition"]) . "'>)\n";
echo lang('Partitions') . ": <input type='number' name='partitions' class='size" . ($partition_table || !$row["partition_by"] ? " hidden" : "") . "' value='" . h($row["partitions"]) . "'>\n";
echo "<table id='partition-table'" . ($partition_table ? "" : " class='hidden'") . ">\n";
echo "<thead><tr><th>" . lang('Partition name') . "<th>" . lang('Values') . "</thead>\n";
foreach ($row["partition_names"] as $key => $val) {
echo '<tr>';
echo '<td><input name="partition_names[]" value="' . h($val) . '" autocapitalize="off">';
echo ($key == count($row["partition_names"]) - 1 ? script("qsl('input').oninput = partitionNameChange;") : '');
echo '<td><input name="partition_values[]" value="' . h(idx($row["partition_values"], $key)) . '">';
}
echo "</table>\n</div></fieldset>\n";
}
echo input_token();
?>
</table>
</div></fieldset>
<?php
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,7 +1,9 @@
<?php
namespace Adminer;
$row = $_POST;
if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x
if ($_POST && !$error && !$_POST["add"]) {
$name = trim($row["name"]);
if ($_POST["drop"]) {
$_GET["db"] = ""; // to save in global history
@@ -44,10 +46,10 @@ if ($_POST) {
$name = $row["name"];
} elseif (DB != "") {
$row["collation"] = db_collation(DB, $collations);
} elseif ($jush == "sql") {
} elseif (JUSH == "sql") {
// propose database name with limited privileges
foreach (get_vals("SHOW GRANTS") as $grant) {
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) {
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~', $grant, $match) && $match[1]) {
$name = stripcslashes(idf_unescape("`$match[2]`"));
break;
}
@@ -58,22 +60,22 @@ if ($_POST) {
<form action="" method="post">
<p>
<?php
echo ($_POST["add_x"] || strpos($name, "\n")
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
echo ($_POST["add"] || strpos($name, "\n")
? '<textarea autofocus name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input name="name" autofocus value="' . h($name) . '" data-maxlength="64" autocapitalize="off">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
'sql' => "charset-charsets.html",
'mssql' => "ms187963.aspx",
'mariadb' => "supported-character-sets-and-collations/",
'mssql' => "relational-databases/system-functions/sys-fn-helpcollations-transact-sql",
)) : "");
?>
<script type='text/javascript'>focus(document.getElementById('name'));</script>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php
if (DB != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
} elseif (!$_POST["add_x"] && $_GET["db"] == "") {
echo "<input type='image' class='icon' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm(lang('Drop %s?', DB)) . "\n";
} elseif (!$_POST["add"] && $_GET["db"] == "") {
echo icon("plus", "add[0]", "+", lang('Add next')) . "\n";
}
echo input_token();
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,10 +1,12 @@
<?php
namespace Adminer;
$tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]);
if ($tables_views && !$error && !$_POST["search"]) {
$result = true;
$message = "";
if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
if (JUSH == "sql" && $_POST["tables"] && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once
}
@@ -27,15 +29,21 @@ if ($tables_views && !$error && !$_POST["search"]) {
$result = drop_tables($_POST["tables"]);
}
$message = lang('Tables have been dropped.');
} elseif ($jush != "sql") {
$result = ($jush == "sqlite"
} elseif (JUSH == "sqlite" && $_POST["check"]) {
foreach ((array) $_POST["tables"] as $table) {
foreach (get_rows("PRAGMA integrity_check(" . q($table) . ")") as $row) {
$message .= "<b>" . h($table) . "</b>: " . h($row["integrity_check"]) . "<br>";
}
}
} elseif (JUSH != "sql") {
$result = (JUSH == "sqlite"
? queries("VACUUM")
: apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"])
);
$message = lang('Tables have been optimized.');
} elseif (!$_POST["tables"]) {
$message = lang('No tables.');
} elseif ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"])))) {
} elseif ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('Adminer\idf_escape', $_POST["tables"])))) {
while ($row = $result->fetch_assoc()) {
$message .= "<b>" . h($row["Table"]) . "</b>: " . h($row["Msg_text"]) . "<br>";
}
@@ -46,7 +54,7 @@ if ($tables_views && !$error && !$_POST["search"]) {
page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
if ($adminer->homepage()) {
if (adminer()->homepage()) {
if ($_GET["ns"] !== "") {
echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
$tables_list = tables_list();
@@ -56,110 +64,131 @@ if ($adminer->homepage()) {
echo "<form action='' method='post'>\n";
if (support("table")) {
echo "<fieldset><legend>" . lang('Search data in tables') . " <span id='selected2'></span></legend><div>";
echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
echo html_select("op", adminer()->operators(), idx($_POST, "op", JUSH == "elastic" ? "should" : "LIKE %%"));
echo " <input type='search' name='query' value='" . h($_POST["query"]) . "'>";
echo script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');", "");
echo " <input type='submit' name='search' value='" . lang('Search') . "'>\n";
echo "</div></fieldset>\n";
if ($_POST["search"] && $_POST["query"] != "") {
$_GET["where"][0]["op"] = $_POST["op"];
search_tables();
}
}
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);">';
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
echo "<div class='scrollable'>\n";
echo "<table class='nowrap checkable odds'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
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 '<th>' . lang('Table');
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-mysql.html'));
echo '<td>' . lang('Data Length') . $doc_link;
echo '<td>' . lang('Index Length') . $doc_link;
echo '<td>' . lang('Data Free') . $doc_link;
echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html'));
echo '<td>' . lang('Rows') . $doc_link;
echo (support("comment") ? '<td>' . lang('Comment') . $doc_link : '');
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/'));
echo '<td>' . lang('Data Length') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-admin.html#FUNCTIONS-ADMIN-DBOBJECT', 'oracle' => 'REFRN20286'));
echo '<td>' . lang('Index Length') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-admin.html#FUNCTIONS-ADMIN-DBOBJECT'));
echo '<td>' . lang('Data Free') . doc_link(array('sql' => 'show-table-status.html'));
echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html', 'mariadb' => 'auto_increment/'));
echo '<td>' . lang('Rows') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'catalog-pg-class.html#CATALOG-PG-CLASS', 'oracle' => 'REFRN20286'));
echo (support("comment") ? '<td>' . lang('Comment') . doc_link(array('sql' => 'show-table-status.html', 'pgsql' => 'functions-info.html#FUNCTIONS-INFO-COMMENT-TABLE')) : '');
echo "</thead>\n";
$tables = 0;
foreach ($tables_list as $name => $type) {
$view = ($type !== null && !preg_match('~table~i', $type));
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
echo '<th>' . (support("table") || support("indexes") ? '<a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>' : h($name));
if ($view) {
echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '" title="' . lang('Alter view') . '">' . (preg_match('~materialized~i', $type) ? lang('Materialized View') : lang('View')) . '</a>';
$view = ($type !== null && !preg_match('~table|sequence~i', $type));
$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 '<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)) {
$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 align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
} else {
foreach (array(
"Engine" => array(),
"Collation" => array(),
"Data_length" => array("create", lang('Alter table')),
"Index_length" => array("indexes", lang('Alter indexes')),
"Data_free" => array("edit", lang('New item')),
"Auto_increment" => array("auto_increment=1&create", lang('Alter table')),
"Rows" => array("select", lang('Select data')),
) as $key => $link) {
foreach (
array(
"Engine" => array(),
"Collation" => array(),
"Data_length" => array("create", lang('Alter table')),
"Index_length" => array("indexes", lang('Alter indexes')),
"Data_free" => array("edit", lang('New item')),
"Auto_increment" => array("auto_increment=1&create", lang('Alter table')),
"Rows" => array("select", lang('Select data')),
) as $key => $link
) {
$id = " id='$key-" . h($name) . "'";
echo ($link ? "<td align='right'>" . (support("table") || $key == "Rows" || (support("indexes") && $key != "Data_length")
? "<a href='" . h(ME . "$link[0]=") . urlencode($name) . "'$id title='$link[1]'>?</a>"
: "<span$id>?</span>"
) : "<td id='$key-" . h($name) . "'>&nbsp;");
) : "<td id='$key-" . h($name) . "'>");
}
$tables++;
}
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>" : "");
echo "\n";
}
echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
echo "<td>" . nbsp($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
echo "<td>" . nbsp(db_collation(DB, collations()));
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(db_collation(DB, collations()));
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
echo "<td align='right' id='sum-$key'>&nbsp;";
echo "<td align='right' id='sum-$key'>";
}
echo "\n";
echo "</table>\n";
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
echo "</div>\n";
if (!information_schema(DB)) {
$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'") . "> ";
echo "<div class='footer'><div>\n";
$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'");
echo "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>"
. ($jush == "sqlite" ? $vacuum
: ($jush == "pgsql" ? $vacuum . $optimize
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'" . on_help("'ANALYZE TABLE'") . "> " . $optimize
. "<input type='submit' name='check' value='" . lang('Check') . "'" . on_help("'CHECK TABLE'") . "> "
. "<input type='submit' name='repair' value='" . lang('Repair') . "'" . on_help("'REPAIR TABLE'") . "> "
. (JUSH == "sqlite" ? $vacuum . "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'PRAGMA integrity_check'")
: (JUSH == "pgsql" ? $vacuum . $optimize
: (JUSH == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'")
. $optimize
. "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'CHECK TABLE'")
. "<input type='submit' name='repair' value='" . lang('Repair') . "'> " . on_help("'REPAIR TABLE'")
: "")))
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm() . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . "> "
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . on_help("'DROP TABLE'") . ">\n";
$databases = (support("scheme") ? $adminer->schemas() : $adminer->databases());
if (count($databases) != 1 && $jush != "sqlite") {
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
echo "<p>" . lang('Move to other database') . ": ";
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
echo "\n";
}
echo "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^(tables|views)\[/));" . (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "") . "\">\n"; // used by trCheck()
echo "<input type='hidden' name='token' value='$token'>\n";
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'> " . on_help(JUSH == "sqlite" ? "'DELETE'" : "'TRUNCATE" . (JUSH == "pgsql" ? "'" : " TABLE'")) . confirm()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . on_help("'DROP TABLE'") . confirm() . "\n";
$databases = (support("scheme") ? adminer()->schemas() : adminer()->databases());
echo "</div></fieldset>\n";
$script = "";
if (count($databases) != 1 && JUSH != "sqlite") {
echo "<fieldset><legend>" . lang('Move to other database') . " <span id='selected3'></span></legend><div>";
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
echo "</label> <input type='submit' name='move' value='" . lang('Move') . "'>";
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'> " . checkbox("overwrite", 1, $_POST["overwrite"], lang('overwrite')) : "");
echo "</div></fieldset>\n";
$script = " selectCount('selected3', formChecked(this, /^(tables|views)\[/));";
}
echo "<input type='hidden' name='all' value=''>"; // used by trCheck()
echo script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^(tables|views)\[/));"
. (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "")
. "$script }"
);
echo input_token();
echo "</div></div>\n";
}
echo "</form>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n";
echo script("tableCheck();");
}
echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
echo (support("view") ? '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
echo (support("materializedview") ? '<a href="' . h(ME) . 'view=&amp;materialized=1">' . lang('Create materialized view') . "</a>\n" : "");
echo "<p class='links'><a href='" . h(ME) . "create='>" . lang('Create table') . "</a>\n";
echo (support("view") ? "<a href='" . h(ME) . "view='>" . lang('Create view') . "</a>\n" : "");
if (support("routine")) {
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
$routines = routines();
if ($routines) {
echo "<table cellspacing='0'>\n";
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td>&nbsp;</thead>\n";
odd('');
echo "<table class='odds'>\n";
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td></thead>\n";
foreach ($routines as $row) {
echo '<tr' . odd() . '>';
echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
$name = ($row["SPECIFIC_NAME"] == $row["ROUTINE_NAME"] ? "" : "&name=" . urlencode($row["ROUTINE_NAME"])); // not computed on the pages to be able to print the header first
echo '<tr>';
echo '<th><a href="' . h(ME . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["SPECIFIC_NAME"]) . $name) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
echo '<td>' . h($row["ROUTINE_TYPE"]);
echo '<td>' . h($row["DTD_IDENTIFIER"]);
echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
echo '<td><a href="' . h(ME . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["SPECIFIC_NAME"]) . $name) . '">' . lang('Alter') . "</a>";
}
echo "</table>\n";
}
@@ -173,11 +202,10 @@ if ($adminer->homepage()) {
echo "<h3 id='sequences'>" . lang('Sequences') . "</h3>\n";
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema() ORDER BY sequence_name");
if ($sequences) {
echo "<table cellspacing='0'>\n";
echo "<table class='odds'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($sequences as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
echo "<tr><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
}
echo "</table>\n";
}
@@ -188,11 +216,10 @@ if ($adminer->homepage()) {
echo "<h3 id='user-types'>" . lang('User types') . "</h3>\n";
$user_types = types();
if ($user_types) {
echo "<table cellspacing='0'>\n";
echo "<table class='odds'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($user_types as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
echo "<tr><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
}
echo "</table>\n";
}
@@ -203,7 +230,7 @@ if ($adminer->homepage()) {
echo "<h3 id='events'>" . lang('Events') . "</h3>\n";
$rows = get_rows("SHOW EVENTS");
if ($rows) {
echo "<table cellspacing='0'>\n";
echo "<table>\n";
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "<td></thead>\n";
foreach ($rows as $row) {
echo "<tr>";
@@ -213,16 +240,12 @@ if ($adminer->homepage()) {
echo '<td><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . lang('Alter') . '</a>';
}
echo "</table>\n";
$event_scheduler = $connection->result("SELECT @@event_scheduler");
$event_scheduler = get_val("SELECT @@event_scheduler");
if ($event_scheduler && $event_scheduler != "ON") {
echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\n";
}
}
echo '<p class="links"><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
}
if ($tables_list) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
}
}
}

13
adminer/designs.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
function adminer_object() {
include_once "../plugins/designs.php";
$designs = array();
foreach (glob("../designs/*/*.css") as $filename) {
$designs[$filename] = basename(dirname($filename));
}
return new Adminer\Plugins(array(
new AdminerDesigns($designs),
));
}
include "./index.php";

View File

@@ -1,10 +1,12 @@
<?php
namespace Adminer;
$TABLE = $_GET["download"];
$fields = fields($TABLE);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"]));
$select = array(idf_escape($_GET["field"]));
$result = $driver->select($TABLE, $select, array(where($_GET, $fields)), $select);
$result = driver()->select($TABLE, $select, array(where($_GET, $fields)), $select);
$row = ($result ? $result->fetch_row() : array());
echo $row[0];
echo driver()->value($row[0], $fields[$_GET["field"]]);
exit; // don't output footer

View File

@@ -1,374 +0,0 @@
<?php
$drivers["elastic"] = "Elasticsearch (beta)";
if (isset($_GET["elastic"])) {
$possible_drivers = array("json");
define("DRIVER", "elastic");
if (function_exists('json_decode')) {
class Min_DB {
var $extension = "JSON", $server_info, $errno, $error, $_url;
/** Performs query
* @param string
* @param array
* @param string
* @return mixed
*/
function rootQuery($path, $content = array(), $method = 'GET') {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents($this->_url . '/' . ltrim($path, '/'), false, stream_context_create(array('http' => array(
'method' => $method,
'content' => json_encode($content),
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if (!$file) {
$this->error = $php_errormsg;
return $file;
}
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
$this->error = $file;
return false;
}
$return = json_decode($file, true);
if ($return === null) {
$this->errno = json_last_error();
if (function_exists('json_last_error_msg')) {
$this->error = json_last_error_msg();
} else {
$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
$this->error = $name;
break;
}
}
}
}
return $return;
}
/** Performs query relative to actual selected DB
* @param string
* @param array
* @param string
* @return mixed
*/
function query($path, $content = array(), $method = 'GET') {
return $this->rootQuery(($this->_db != "" ? "$this->_db/" : "/") . ltrim($path, '/'), $content, $method);
}
function connect($server, $username, $password) {
$this->_url = "http://$username:$password@$server/";
$return = $this->query('');
if ($return) {
$this->server_info = $return['version']['number'];
}
return (bool) $return;
}
function select_db($database) {
$this->_db = $database;
return true;
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows;
function Min_Result($rows) {
$this->num_rows = count($this->_rows);
$this->_rows = $rows;
reset($this->_rows);
}
function fetch_assoc() {
$return = current($this->_rows);
next($this->_rows);
return $return;
}
function fetch_row() {
return array_values($this->fetch_assoc());
}
}
}
class Min_Driver extends Min_SQL {
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer;
$data = array();
$query = "$table/_search";
if ($select != array("*")) {
$data["fields"] = $select;
}
if ($order) {
$sort = array();
foreach ($order as $col) {
$col = preg_replace('~ DESC$~', '', $col, 1, $count);
$sort[] = ($count ? array($col => "desc") : $col);
}
$data["sort"] = $sort;
}
if ($limit) {
$data["size"] = +$limit;
if ($page) {
$data["from"] = ($page * $limit);
}
}
foreach ($where as $val) {
list($col,$op,$val) = explode(" ",$val,3);
if ($col == "_id") {
$data["query"]["ids"]["values"][] = $val;
}
elseif ($col . $val != "") {
$term = array("term" => array(($col != "" ? $col : "_all") => $val));
if ($op == "=") {
$data["query"]["filtered"]["filter"]["and"][] = $term;
} else {
$data["query"]["filtered"]["query"]["bool"]["must"][] = $term;
}
}
}
if ($data["query"] && !$data["query"]["filtered"]["query"] && !$data["query"]["ids"]) {
$data["query"]["filtered"]["query"] = array("match_all" => array());
}
$start = microtime(true);
$search = $this->_conn->query($query, $data);
if ($print) {
echo $adminer->selectQuery("$query: " . print_r($data, true), format_time($start));
}
if (!$search) {
return false;
}
$return = array();
foreach ($search['hits']['hits'] as $hit) {
$row = array();
if ($select == array("*")) {
$row["_id"] = $hit["_id"];
}
$fields = $hit['_source'];
if ($select != array("*")) {
$fields = array();
foreach ($select as $key) {
$fields[$key] = $hit['fields'][$key];
}
}
foreach ($fields as $key => $val) {
if ($data["fields"]) {
$val = $val[0];
}
$row[$key] = (is_array($val) ? json_encode($val) : $val); //! display JSON and others differently
}
$return[] = $row;
}
return new Min_Result($return);
}
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function support($feature) {
return preg_match("~database|table|columns~", $feature);
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function get_databases() {
global $connection;
$return = $connection->rootQuery('_aliases');
if ($return) {
$return = array_keys($return);
sort($return, SORT_STRING);
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function engines() {
return array();
}
function count_tables($databases) {
global $connection;
$return = $connection->query('_mapping');
if ($return) {
$return = array_map('count', $return);
}
return $return;
}
function tables_list() {
global $connection;
$return = $connection->query('_mapping');
if ($return) {
$return = array_fill_keys(array_keys($return[$connection->_db]["mappings"]), 'table');
}
return $return;
}
function table_status($name = "", $fast = false) {
global $connection;
$search = $connection->query("_search?search_type=count", array(
"facets" => array(
"count_by_type" => array(
"terms" => array(
"field" => "_type",
)
)
)
), "POST");
$return = array();
if ($search) {
foreach ($search["facets"]["count_by_type"]["terms"] as $table) {
$return[$table["term"]] = array(
"Name" => $table["term"],
"Engine" => "table",
"Rows" => $table["count"],
);
}
if ($name != "" && $name == $table["term"]) {
return $return[$name];
}
}
return $return;
}
function error() {
global $connection;
return h($connection->error);
}
function information_schema() {
}
function is_view($table_status) {
}
function indexes($table, $connection2 = null) {
return array(
array("type" => "PRIMARY", "columns" => array("_id")),
);
}
function fields($table) {
global $connection;
$result = $connection->query("$table/_mapping");
$return = array();
if ($result) {
$mappings = $result[$table]['properties'];
if (!$mappings) {
$mappings = $result[$connection->_db]['mappings'][$table]['properties'];
}
if ($mappings) {
foreach ($mappings as $name => $field) {
$return[$name] = array(
"field" => $name,
"full_type" => $field["type"],
"type" => $field["type"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
);
if ($field["properties"]) { // only leaf fields can be edited
unset($return[$name]["privileges"]["insert"]);
unset($return[$name]["privileges"]["update"]);
}
}
}
}
return $return;
}
function foreign_keys($table) {
return array();
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function fk_support($table_status) {
}
function found_rows($table_status, $where) {
return null;
}
/** Create database
* @param string
* @return mixed
*/
function create_database($db) {
global $connection;
return $connection->rootQuery(urlencode($db), array(), 'PUT');
}
/** Drop databases
* @param array
* @return mixed
*/
function drop_databases($databases) {
global $connection;
return $connection->rootQuery(urlencode(implode(',', $databases)), array(), 'DELETE');
}
/** Drop tables
* @param array
* @return bool
*/
function drop_tables($tables) {
global $connection;
$return = true;
foreach ($tables as $table) { //! convert to bulk api
$return = $return && $connection->query(urlencode($table), array(), 'DELETE');
}
return $return;
}
$jush = "elastic";
$operators = array("=", "query");
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
}

View File

@@ -1,357 +0,0 @@
<?php
$drivers["mongo"] = "MongoDB (beta)";
if (isset($_GET["mongo"])) {
$possible_drivers = array("mongo");
define("DRIVER", "mongo");
if (class_exists('MongoDB')) {
class Min_DB {
var $extension = "Mongo", $error, $last_id, $_link, $_db;
function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
$options = array();
if ($username != "") {
$options["username"] = $username;
$options["password"] = $password;
}
if ($db != "") {
$options["db"] = $db;
}
try {
$this->_link = @new MongoClient("mongodb://$server", $options);
return true;
} catch (Exception $ex) {
$this->error = $ex->getMessage();
return false;
}
}
function query($query) {
return false;
}
function select_db($database) {
try {
$this->_db = $this->_link->selectDB($database);
return true;
} catch (Exception $ex) {
$this->error = $ex->getMessage();
return false;
}
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows = array(), $_offset = 0, $_charset = array();
function Min_Result($result) {
foreach ($result as $item) {
$row = array();
foreach ($item as $key => $val) {
if (is_a($val, 'MongoBinData')) {
$this->_charset[$key] = 63;
}
$row[$key] =
(is_a($val, 'MongoId') ? 'ObjectId("' . strval($val) . '")' :
(is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
(is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
(is_a($val, 'MongoRegex') ? strval($val) :
(is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
$val
)))));
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = count($this->_rows);
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
$name = $keys[$this->_offset++];
return (object) array(
'name' => $name,
'charsetnr' => $this->_charset[$name],
);
}
}
}
class Min_Driver extends Min_SQL {
public $primary = "_id";
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
$select = ($select == array("*")
? array()
: array_fill_keys($select, true)
);
$sort = array();
foreach ($order as $val) {
$val = preg_replace('~ DESC$~', '', $val, 1, $count);
$sort[$val] = ($count ? -1 : 1);
}
return new Min_Result($this->_conn->_db->selectCollection($table)
->find(array(), $select)
->sort($sort)
->limit(+$limit)
->skip($page * $limit)
);
}
function insert($table, $set) {
try {
$return = $this->_conn->_db->selectCollection($table)->insert($set);
$this->_conn->errno = $return['code'];
$this->_conn->error = $return['err'];
$this->_conn->last_id = $set['_id'];
return !$return['err'];
} catch (Exception $ex) {
$this->_conn->error = $ex->getMessage();
return false;
}
}
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function error() {
global $connection;
return h($connection->error);
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function get_databases($flush) {
global $connection;
$return = array();
$dbs = $connection->_link->listDBs();
foreach ($dbs['databases'] as $db) {
$return[] = $db['name'];
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function count_tables($databases) {
global $connection;
$return = array();
foreach ($databases as $db) {
$return[$db] = count($connection->_link->selectDB($db)->getCollectionNames(true));
}
return $return;
}
function tables_list() {
global $connection;
return array_fill_keys($connection->_db->getCollectionNames(true), 'table');
}
function table_status($name = "", $fast = false) {
$return = array();
foreach (tables_list() as $table => $type) {
$return[$table] = array("Name" => $table);
if ($name == $table) {
return $return[$table];
}
}
return $return;
}
function information_schema() {
}
function is_view($table_status) {
}
function drop_databases($databases) {
global $connection;
foreach ($databases as $db) {
$response = $connection->_link->selectDB($db)->drop();
if (!$response['ok']) {
return false;
}
}
return true;
}
function indexes($table, $connection2 = null) {
global $connection;
$return = array();
foreach ($connection->_db->selectCollection($table)->getIndexInfo() as $index) {
$descs = array();
foreach ($index["key"] as $column => $type) {
$descs[] = ($type == -1 ? '1' : null);
}
$return[$index["name"]] = array(
"type" => ($index["name"] == "_id_" ? "PRIMARY" : ($index["unique"] ? "UNIQUE" : "INDEX")),
"columns" => array_keys($index["key"]),
"lengths" => array(),
"descs" => $descs,
);
}
return $return;
}
function fields($table) {
return fields_from_edit();
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function foreign_keys($table) {
return array();
}
function fk_support($table_status) {
}
function engines() {
return array();
}
function found_rows($table_status, $where) {
global $connection;
//! don't call count_rows()
return $connection->_db->selectCollection($_GET["select"])->count($where);
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
global $connection;
if ($table == "") {
$connection->_db->createCollection($name);
return true;
}
}
function drop_tables($tables) {
global $connection;
foreach ($tables as $table) {
$response = $connection->_db->selectCollection($table)->drop();
if (!$response['ok']) {
return false;
}
}
return true;
}
function truncate_tables($tables) {
global $connection;
foreach ($tables as $table) {
$response = $connection->_db->selectCollection($table)->remove();
if (!$response['ok']) {
return false;
}
}
return true;
}
function alter_indexes($table, $alter) {
global $connection;
foreach ($alter as $val) {
list($type, $name, $set) = $val;
if ($set == "DROP") {
$return = $connection->_db->command(array("deleteIndexes" => $table, "index" => $name));
} else {
$columns = array();
foreach ($set as $column) {
$column = preg_replace('~ DESC$~', '', $column, 1, $count);
$columns[$column] = ($count ? -1 : 1);
}
$return = $connection->_db->selectCollection($table)->ensureIndex($columns, array(
"unique" => ($type == "UNIQUE"),
"name" => $name,
//! "sparse"
));
}
if ($return['errmsg']) {
$connection->error = $return['errmsg'];
return false;
}
}
return true;
}
function last_id() {
global $connection;
return $connection->last_id;
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function support($feature) {
return preg_match("~database|indexes~", $feature);
}
$jush = "mongo";
$operators = array("=");
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
}

View File

@@ -5,16 +5,19 @@
* @author Jakub Vrana
*/
$drivers["mssql"] = "MS SQL";
namespace Adminer;
add_driver("mssql", "MS SQL");
if (isset($_GET["mssql"])) {
$possible_drivers = array("SQLSRV", "MSSQL");
define("DRIVER", "mssql");
if (extension_loaded("sqlsrv")) {
class Min_DB {
var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $errno, $error;
define('Adminer\DRIVER', "mssql");
function _get_error() {
if (extension_loaded("sqlsrv") && $_GET["ext"] != "pdo") {
class Db extends SqlDb {
public $extension = "sqlsrv";
private $link, $result;
private function get_error() {
$this->error = "";
foreach (sqlsrv_errors() as $error) {
$this->errno = $error["code"];
@@ -23,40 +26,53 @@ if (isset($_GET["mssql"])) {
$this->error = rtrim($this->error);
}
function connect($server, $username, $password) {
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
if ($this->_link) {
$info = sqlsrv_server_info($this->_link);
function attach(?string $server, string $username, string $password): string {
$connection_info = array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8");
$ssl = adminer()->connectSsl();
if (isset($ssl["Encrypt"])) {
$connection_info["Encrypt"] = $ssl["Encrypt"];
}
if (isset($ssl["TrustServerCertificate"])) {
$connection_info["TrustServerCertificate"] = $ssl["TrustServerCertificate"];
}
$db = adminer()->database();
if ($db != "") {
$connection_info["Database"] = $db;
}
$this->link = @sqlsrv_connect(preg_replace('~:~', ',', $server), $connection_info);
if ($this->link) {
$info = sqlsrv_server_info($this->link);
$this->server_info = $info['SQLServerVersion'];
} else {
$this->_get_error();
$this->get_error();
}
return (bool) $this->_link;
return ($this->link ? '' : $this->error);
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
function quote(string $string): string {
$unicode = strlen($string) != strlen(utf8_decode($string));
return ($unicode ? "N" : "") . "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
return $this->query("USE " . idf_escape($database));
function select_db(string $database) {
return $this->query(use_sql($database));
}
function query($query, $unbuffered = false) {
$result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => "keyset"))
function query(string $query, bool $unbuffered = false) {
$result = sqlsrv_query($this->link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => "keyset"))
$this->error = "";
if (!$result) {
$this->_get_error();
$this->get_error();
return false;
}
return $this->store_result($result);
}
function multi_query($query) {
$this->_result = sqlsrv_query($this->_link, $query);
function multi_query(string $query) {
$this->result = sqlsrv_query($this->link, $query);
$this->error = "";
if (!$this->_result) {
$this->_get_error();
if (!$this->result) {
$this->get_error();
return false;
}
return true;
@@ -64,41 +80,33 @@ if (isset($_GET["mssql"])) {
function store_result($result = null) {
if (!$result) {
$result = $this->_result;
$result = $this->result;
}
if (!$result) {
return false;
}
if (sqlsrv_field_metadata($result)) {
return new Min_Result($result);
return new Result($result);
}
$this->affected_rows = sqlsrv_rows_affected($result);
return true;
}
function next_result() {
return $this->_result ? sqlsrv_next_result($this->_result) : null;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
$row = $result->fetch_row();
return $row[$field];
function next_result(): bool {
return $this->result ? !!sqlsrv_next_result($this->result) : false;
}
}
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
class Result {
public $num_rows;
private $result, $offset = 0, $fields;
function Min_Result($result) {
$this->_result = $result;
function __construct($result) {
$this->result = $result;
// $this->num_rows = sqlsrv_num_rows($result); // available only in scrollable results
}
function _convert($row) {
private function convert($row) {
foreach ((array) $row as $key => $val) {
if (is_a($val, 'DateTime')) {
$row[$key] = $val->format("Y-m-d H:i:s");
@@ -109,162 +117,174 @@ if (isset($_GET["mssql"])) {
}
function fetch_assoc() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT));
return $this->convert(sqlsrv_fetch_array($this->result, SQLSRV_FETCH_ASSOC));
}
function fetch_row() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_NEXT));
return $this->convert(sqlsrv_fetch_array($this->result, SQLSRV_FETCH_NUMERIC));
}
function fetch_field() {
if (!$this->_fields) {
$this->_fields = sqlsrv_field_metadata($this->_result);
function fetch_field(): \stdClass {
if (!$this->fields) {
$this->fields = sqlsrv_field_metadata($this->result);
}
$field = $this->_fields[$this->_offset++];
$return = new stdClass;
$field = $this->fields[$this->offset++];
$return = new \stdClass;
$return->name = $field["Name"];
$return->orgname = $field["Name"];
$return->type = ($field["Type"] == 1 ? 254 : 0);
$return->type = ($field["Type"] == 1 ? 254 : 15);
$return->charsetnr = 0;
return $return;
}
function seek($offset) {
for ($i=0; $i < $offset; $i++) {
sqlsrv_fetch($this->_result); // SQLSRV_SCROLL_ABSOLUTE added in sqlsrv 1.1
sqlsrv_fetch($this->result); // SQLSRV_SCROLL_ABSOLUTE added in sqlsrv 1.1
}
}
function __destruct() {
sqlsrv_free_stmt($this->_result);
sqlsrv_free_stmt($this->result);
}
}
} elseif (extension_loaded("mssql")) {
class Min_DB {
var $extension = "MSSQL", $_link, $_result, $server_info, $affected_rows, $error;
function last_id($result) {
return get_val("SELECT SCOPE_IDENTITY()"); // @@IDENTITY can return trigger INSERT
}
function connect($server, $username, $password) {
$this->_link = @mssql_connect($server, $username, $password);
if ($this->_link) {
$result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')");
$row = $result->fetch_row();
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
} else {
$this->error = mssql_get_last_message();
}
return (bool) $this->_link;
function explain($connection, $query) {
$connection->query("SET SHOWPLAN_ALL ON");
$return = $connection->query($query);
$connection->query("SET SHOWPLAN_ALL OFF"); // connection is used also for indexes
return $return;
}
} else {
abstract class MssqlDb extends PdoDb {
function select_db(string $database) {
// database selection is separated from the connection so dbname in DSN can't be used
return $this->query(use_sql($database));
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
return mssql_select_db($database);
}
function query($query, $unbuffered = false) {
$result = mssql_query($query, $this->_link); //! $unbuffered
$this->error = "";
if (!$result) {
$this->error = mssql_get_last_message();
return false;
}
if ($result === true) {
$this->affected_rows = mssql_rows_affected($this->_link);
return true;
}
return new Min_Result($result);
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return mssql_next_result($this->_result);
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
return mssql_result($result->_result, 0, $field);
function lastInsertId() {
return $this->pdo->lastInsertId();
}
}
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
function Min_Result($result) {
$this->_result = $result;
$this->num_rows = mssql_num_rows($result);
}
function fetch_assoc() {
return mssql_fetch_assoc($this->_result);
}
function fetch_row() {
return mssql_fetch_row($this->_result);
}
function num_rows() {
return mssql_num_rows($this->_result);
}
function fetch_field() {
$return = mssql_fetch_field($this->_result);
$return->orgtable = $return->table;
$return->orgname = $return->name;
return $return;
}
function seek($offset) {
mssql_data_seek($this->_result, $offset);
}
function __destruct() {
mssql_free_result($this->_result);
}
function last_id($result) {
return connection()->lastInsertId();
}
function explain($connection, $query) {
}
if (extension_loaded("pdo_sqlsrv")) {
class Db extends MssqlDb {
public $extension = "PDO_SQLSRV";
function attach(?string $server, string $username, string $password): string {
return $this->dsn("sqlsrv:Server=" . str_replace(":", ",", $server), $username, $password);
}
}
} elseif (extension_loaded("pdo_dblib")) {
class Db extends MssqlDb {
public $extension = "PDO_DBLIB";
function attach(?string $server, string $username, string $password): string {
return $this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)), $username, $password);
}
}
}
}
class Driver extends SqlDriver {
static $extensions = array("SQLSRV", "PDO_SQLSRV", "PDO_DBLIB");
static $jush = "mssql";
class Min_Driver extends Min_SQL {
public $insertFunctions = array("date|time" => "getdate");
public $editFunctions = array(
"int|decimal|real|float|money|datetime" => "+/-",
"char|text" => "+",
);
function insertUpdate($table, $rows, $primary) {
foreach ($rows as $set) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
public $functions = array("len", "lower", "round", "upper");
public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
public $generated = array("PERSISTED", "VIRTUAL");
public $onActions = "NO ACTION|CASCADE|SET NULL|SET DEFAULT";
static function connect(?string $server, string $username, string $password) {
if ($server == "") {
$server = "localhost:1433";
}
return parent::connect($server, $username, $password);
}
function __construct(Db $connection) {
parent::__construct($connection);
$this->types = array( //! use sys.types
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
);
}
function insertUpdate(string $table, array $rows, array $primary) {
$fields = fields($table);
$update = array();
$where = array();
$set = reset($rows);
$columns = "c" . implode(", c", range(1, count($set)));
$c = 0;
$insert = array();
foreach ($set as $key => $val) {
$c++;
$name = idf_unescape($key);
if (!$fields[$name]["auto_increment"]) {
$insert[$key] = "c$c";
}
//! can use only one query for all rows
if (!queries("MERGE " . table($table) . " USING (VALUES(" . implode(", ", $set) . ")) AS source (c" . implode(", c", range(1, count($set))) . ") ON " . implode(" AND ", $where) //! source, c1 - possible conflict
. " WHEN MATCHED THEN UPDATE SET " . implode(", ", $update)
. " WHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ");" // ; is mandatory
)) {
return false;
if (isset($primary[$name])) {
$where[] = "$key = c$c";
} else {
$update[] = "$key = c$c";
}
}
return true;
$values = array();
foreach ($rows as $set) {
$values[] = "(" . implode(", ", $set) . ")";
}
if ($where) {
$identity = queries("SET IDENTITY_INSERT " . table($table) . " ON");
$return = queries(
"MERGE " . table($table) . " USING (VALUES\n\t" . implode(",\n\t", $values) . "\n) AS source ($columns) ON " . implode(" AND ", $where) //! source, c1 - possible conflict
. ($update ? "\nWHEN MATCHED THEN UPDATE SET " . implode(", ", $update) : "")
. "\nWHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($identity ? $set : $insert)) . ") VALUES (" . ($identity ? $columns : implode(", ", $insert)) . ");" // ; is mandatory
);
if ($identity) {
queries("SET IDENTITY_INSERT " . table($table) . " OFF");
}
} else {
$return = queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES\n" . implode(",\n", $values));
}
return $return;
}
function begin() {
return queries("BEGIN TRANSACTION");
}
function tableHelp(string $name, bool $is_view = false) {
$links = array(
"sys" => "catalog-views/sys-",
"INFORMATION_SCHEMA" => "information-schema-views/",
);
$link = $links[get_schema()];
if ($link) {
return "relational-databases/system-$link" . preg_replace('~_~', '-', strtolower($name)) . "-transact-sql";
}
}
}
@@ -277,40 +297,24 @@ if (isset($_GET["mssql"])) {
return ($_GET["ns"] != "" ? idf_escape($_GET["ns"]) . "." : "") . idf_escape($idf);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("EXEC sp_databases");
function get_databases($flush) {
return get_vals("SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
return ($limit ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
}
function limit1($query, $where) {
return limit($query, $where, 1);
function limit1($table, $query, $where, $separator = "\n") {
return limit($query, $where, 1, 0, $separator);
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
}
function engines() {
return array();
return get_val("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
}
function logged_user() {
global $connection;
return $connection->result("SELECT SUSER_NAME()");
return get_val("SELECT SUSER_NAME()");
}
function tables_list() {
@@ -318,21 +322,21 @@ if (isset($_GET["mssql"])) {
}
function count_tables($databases) {
global $connection;
$return = array();
foreach ($databases as $db) {
$connection->select_db($db);
$return[$db] = $connection->result("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES");
connection()->select_db($db);
$return[$db] = get_val("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES");
}
return $return;
}
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
if ($name != "") {
return $row;
}
foreach (
get_rows("SELECT ao.name AS Name, ao.type_desc AS Engine, (SELECT value FROM fn_listextendedproperty(default, 'SCHEMA', schema_name(schema_id), 'TABLE', ao.name, null, null)) AS Comment
FROM sys.all_objects AS ao
WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row
) {
$return[$row["Name"]] = $row;
}
return $return;
@@ -347,41 +351,55 @@ if (isset($_GET["mssql"])) {
}
function fields($table) {
$comments = get_key_vals("SELECT objname, cast(value as varchar(max)) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
$return = array();
foreach (get_rows("SELECT c.*, t.name type, d.definition [default]
$table_id = get_val("SELECT object_id FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') AND name = " . q($table));
foreach (
get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, d.definition [default], d.name default_constraint, i.is_primary_key
FROM sys.all_columns c
JOIN sys.all_objects o ON c.object_id = o.object_id
JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.parent_column_id
WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U', 'V') AND o.name = " . q($table)
) as $row) {
LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
LEFT JOIN sys.index_columns ic ON c.object_id = ic.object_id AND c.column_id = ic.column_id
LEFT JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE c.object_id = " . q($table_id)) as $row
) {
$type = $row["type"];
$length = (preg_match("~char|binary~", $type) ? $row["max_length"] : ($type == "decimal" ? "$row[precision],$row[scale]" : ""));
$length = (preg_match("~char|binary~", $type)
? intval($row["max_length"]) / ($type[0] == 'n' ? 2 : 1)
: ($type == "decimal" ? "$row[precision],$row[scale]" : "")
);
$return[$row["name"]] = array(
"field" => $row["name"],
"full_type" => $type . ($length ? "($length)" : ""),
"type" => $type,
"length" => $length,
"default" => $row["default"],
"default" => (preg_match("~^\('(.*)'\)$~", $row["default"], $match) ? str_replace("''", "'", $match[1]) : $row["default"]),
"default_constraint" => $row["default_constraint"],
"null" => $row["is_nullable"],
"auto_increment" => $row["is_identity"],
"collation" => $row["collation_name"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
"primary" => $row["is_identity"], //! or indexes.is_primary_key
"privileges" => array("insert" => 1, "select" => 1, "update" => 1, "where" => 1, "order" => 1),
"primary" => $row["is_primary_key"],
"comment" => $comments[$row["name"]],
);
}
foreach (get_rows("SELECT * FROM sys.computed_columns WHERE object_id = " . q($table_id)) as $row) {
$return[$row["name"]]["generated"] = ($row["is_persisted"] ? "PERSISTED" : "VIRTUAL");
$return[$row["name"]]["default"] = $row["definition"];
}
return $return;
}
function indexes($table, $connection2 = null) {
$return = array();
// sp_statistics doesn't return information about primary key
foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name, is_descending_key
foreach (
get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name, is_descending_key
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE OBJECT_NAME(i.object_id) = " . q($table)
, $connection2) as $row) {
WHERE OBJECT_NAME(i.object_id) = " . q($table), $connection2) as $row
) {
$name = $row["name"];
$return[$name]["type"] = ($row["is_primary_key"] ? "PRIMARY" : ($row["is_unique"] ? "UNIQUE" : "INDEX"));
$return[$name]["lengths"] = array();
@@ -392,8 +410,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
function view($name) {
global $connection;
return array("select" => preg_replace('~^(?:[^[]|\\[[^]]*])*\\s+AS\\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
return array("select" => preg_replace('~^(?:[^[]|\[[^]]*])*\s+AS\s+~isU', '', get_val("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
}
function collations() {
@@ -405,12 +422,11 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
function information_schema($db) {
return false;
return get_schema() == "INFORMATION_SCHEMA";
}
function error() {
global $connection;
return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
return nl_br(h(preg_replace('~^(\[[^]]*])+~m', '', connection()->error)));
}
function create_database($db, $collation) {
@@ -418,7 +434,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
function drop_databases($databases) {
return queries("DROP DATABASE " . implode(", ", array_map('idf_escape', $databases)));
return queries("DROP DATABASE " . implode(", ", array_map('Adminer\idf_escape', $databases)));
}
function rename_database($name, $collation) {
@@ -435,21 +451,39 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
$comments = array();
$orig_fields = fields($table);
foreach ($fields as $field) {
$column = idf_escape($field[0]);
$val = $field[1];
if (!$val) {
$alter["DROP"][] = " COLUMN $column";
} else {
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
$comments[$field[0]] = $val[5];
unset($val[5]);
if (preg_match('~ AS ~', $val[3])) {
unset($val[1], $val[2]);
}
if ($field[0] == "") {
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
} else {
$default = $val[3];
unset($val[3]); // default values are set separately
unset($val[6]); //! identity can't be removed
if ($column != $val[0]) {
queries("EXEC sp_rename " . q(table($table) . ".$column") . ", " . q(idf_unescape($val[0])) . ", 'COLUMN'");
}
$alter["ALTER COLUMN " . implode("", $val)][] = "";
$orig_field = $orig_fields[$field[0]];
if (default_value($orig_field) != $default) {
if ($orig_field["default"] !== null) {
$alter["DROP"][] = " " . idf_escape($orig_field["default_constraint"]);
}
if ($default) {
$alter["ADD"][] = "\n $default FOR $column";
}
}
}
}
}
@@ -463,10 +497,24 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
$alter[""] = $foreign;
}
foreach ($alter as $key => $val) {
if (!queries("ALTER TABLE " . idf_escape($name) . " $key" . implode(",", $val))) {
if (!queries("ALTER TABLE " . table($name) . " $key" . implode(",", $val))) {
return false;
}
}
foreach ($comments as $key => $val) {
$comment = substr($val, 9); // 9 - strlen(" COMMENT ")
queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
queries("EXEC sp_addextendedproperty
@name = N'MS_Description',
@value = $comment,
@level0type = N'Schema',
@level0name = " . q(get_schema()) . ",
@level1type = N'Table',
@level1name = " . q($name) . ",
@level2type = N'Column',
@level2name = " . q($key))
;
}
return true;
}
@@ -480,10 +528,12 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
} else {
$index[] = idf_escape($val[1]) . " ON " . table($table);
}
} elseif (!queries(($val[0] != "PRIMARY"
? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
: "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
) . " (" . implode(", ", $val[2]) . ")")) {
} elseif (
!queries(($val[0] != "PRIMARY"
? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
: "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
) . " (" . implode(", ", $val[2]) . ")")
) {
return false;
}
}
@@ -492,26 +542,19 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
;
}
function last_id() {
global $connection;
return $connection->result("SELECT SCOPE_IDENTITY()"); // @@IDENTITY can return trigger INSERT
}
function explain($connection, $query) {
$connection->query("SET SHOWPLAN_ALL ON");
$return = $connection->query($query);
$connection->query("SET SHOWPLAN_ALL OFF"); // connection is used also for indexes
return $return;
}
function found_rows($table_status, $where) {
}
function foreign_keys($table) {
$return = array();
foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table)) as $row) {
$on_actions = array("CASCADE", "NO ACTION", "SET NULL", "SET DEFAULT");
foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table) . ", @fktable_owner = " . q(get_schema())) as $row) {
$foreign_key = &$return[$row["FK_NAME"]];
$foreign_key["db"] = $row["PKTABLE_QUALIFIER"];
$foreign_key["ns"] = $row["PKTABLE_OWNER"];
$foreign_key["table"] = $row["PKTABLE_NAME"];
$foreign_key["on_update"] = $on_actions[$row["UPDATE_RULE"]];
$foreign_key["on_delete"] = $on_actions[$row["DELETE_RULE"]];
$foreign_key["source"][] = $row["FKCOLUMN_NAME"];
$foreign_key["target"][] = $row["PKCOLUMN_NAME"];
}
@@ -523,22 +566,23 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
function drop_views($views) {
return queries("DROP VIEW " . implode(", ", array_map('table', $views)));
return queries("DROP VIEW " . implode(", ", array_map('Adminer\table', $views)));
}
function drop_tables($tables) {
return queries("DROP TABLE " . implode(", ", array_map('table', $tables)));
return queries("DROP TABLE " . implode(", ", array_map('Adminer\table', $tables)));
}
function move_tables($tables, $views, $target) {
return apply_queries("ALTER SCHEMA " . idf_escape($target) . " TRANSFER", array_merge($tables, $views));
}
function trigger($name) {
function trigger($name, $table) {
if ($name == "") {
return array();
}
$rows = get_rows("SELECT s.name [Trigger],
$rows = get_rows(
"SELECT s.name [Trigger],
CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(s.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(s.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing],
c.text
@@ -548,20 +592,21 @@ WHERE s.xtype = 'TR' AND s.name = " . q($name)
); // triggers are not schema-scoped
$return = reset($rows);
if ($return) {
$return["Statement"] = preg_replace('~^.+\\s+AS\\s+~isU', '', $return["text"]); //! identifiers, comments
$return["Statement"] = preg_replace('~^.+\s+AS\s+~isU', '', $return["text"]); //! identifiers, comments
}
return $return;
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT sys1.name,
foreach (
get_rows("SELECT sys1.name,
CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing]
FROM sysobjects sys1
JOIN sysobjects sys2 ON sys1.parent_obj = sys2.id
WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
) as $row) { // triggers are not schema-scoped
WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)) as $row
) { // triggers are not schema-scoped
$return[$row["name"]] = array($row["Timing"], $row["Event"]);
}
return $return;
@@ -580,27 +625,69 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
function get_schema() {
global $connection;
if ($_GET["ns"] != "") {
return $_GET["ns"];
}
return $connection->result("SELECT SCHEMA_NAME()");
return get_val("SELECT SCHEMA_NAME()");
}
function set_schema($schema) {
$_GET["ns"] = $schema;
return true; // ALTER USER is permanent
}
function create_sql($table, $auto_increment, $style) {
if (is_view(table_status1($table))) {
$view = view($table);
return "CREATE VIEW " . table($table) . " AS $view[select]";
}
$fields = array();
$primary = false;
foreach (fields($table) as $name => $field) {
$val = process_field($field, $field);
if ($val[6]) {
$primary = true;
}
$fields[] = implode("", $val);
}
foreach (indexes($table) as $name => $index) {
if (!$primary || $index["type"] != "PRIMARY") {
$columns = array();
foreach ($index["columns"] as $key => $val) {
$columns[] = idf_escape($val) . ($index["descs"][$key] ? " DESC" : "");
}
$name = idf_escape($name);
$fields[] = ($index["type"] == "INDEX" ? "INDEX $name" : "CONSTRAINT $name " . ($index["type"] == "UNIQUE" ? "UNIQUE" : "PRIMARY KEY")) . " (" . implode(", ", $columns) . ")";
}
}
foreach (driver()->checkConstraints($table) as $name => $check) {
$fields[] = "CONSTRAINT " . idf_escape($name) . " CHECK ($check)";
}
return "CREATE TABLE " . table($table) . " (\n\t" . implode(",\n\t", $fields) . "\n)";
}
function foreign_keys_sql($table) {
$fields = array();
foreach (foreign_keys($table) as $foreign) {
$fields[] = ltrim(format_foreign_key($foreign));
}
return ($fields ? "ALTER TABLE " . table($table) . " ADD\n\t" . implode(",\n\t", $fields) . ";\n\n" : "");
}
function truncate_sql($table) {
return "TRUNCATE TABLE " . table($table);
}
function use_sql($database) {
return "USE " . idf_escape($database);
}
function show_variables() {
return array();
}
function show_status() {
return array();
function trigger_sql($table) {
$return = "";
foreach (triggers($table) as $name => $trigger) {
$return .= create_trigger(" ON " . table($table), trigger($name, $table)) . ";";
}
return $return;
}
function convert_field($field) {
@@ -611,31 +698,6 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
return preg_match('~^(check|comment|columns|database|drop_col|dump|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
}
$jush = "mssql";
$types = array();
$structured_types = array();
foreach (array( //! use sys.types
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
$functions = array("len", "lower", "round", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(
array(
"date|time" => "getdate",
), array(
"int|decimal|real|float|money|datetime" => "+/-",
"char|text" => "+",
)
);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,16 @@
<?php
$drivers["oracle"] = "Oracle";
namespace Adminer;
add_driver("oracle", "Oracle (beta)");
if (isset($_GET["oracle"])) {
$possible_drivers = array("OCI8", "PDO_OCI");
define("DRIVER", "oracle");
if (extension_loaded("oci8")) {
class Min_DB {
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
define('Adminer\DRIVER', "oracle");
if (extension_loaded("oci8") && $_GET["ext"] != "pdo") {
class Db extends SqlDb {
public $extension = "oci8";
public $_current_db;
private $link;
function _error($errno, $error) {
if (ini_bool("html_errors")) {
@@ -16,30 +20,30 @@ if (isset($_GET["oracle"])) {
$this->error = $error;
}
function connect($server, $username, $password) {
$this->_link = @oci_new_connect($username, $password, $server, "AL32UTF8");
if ($this->_link) {
$this->server_info = oci_server_version($this->_link);
return true;
function attach(?string $server, string $username, string $password): string {
$this->link = @oci_new_connect($username, $password, $server, "AL32UTF8");
if ($this->link) {
$this->server_info = oci_server_version($this->link);
return '';
}
$error = oci_error();
$this->error = $error["message"];
return false;
return $error["message"];
}
function quote($string) {
function quote(string $string): string {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
function select_db(string $database) {
$this->_current_db = $database;
return true;
}
function query($query, $unbuffered = false) {
$result = oci_parse($this->_link, $query);
function query(string $query, bool $unbuffered = false) {
$result = oci_parse($this->link, $query);
$this->error = "";
if (!$result) {
$error = oci_error($this->_link);
$error = oci_error($this->link);
$this->errno = $error["code"];
$this->error = $error["message"];
return false;
@@ -49,44 +53,30 @@ if (isset($_GET["oracle"])) {
restore_error_handler();
if ($return) {
if (oci_num_fields($result)) {
return new Min_Result($result);
return new Result($result);
}
$this->affected_rows = oci_num_rows($result);
oci_free_statement($result);
}
return $return;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function result($query, $field = 1) {
$result = $this->query($query);
if (!is_object($result) || !oci_fetch($result->_result)) {
return false;
}
return oci_result($result->_result, $field);
function timeout(int $ms): bool {
return oci_set_call_timeout($this->link, $ms);
}
}
class Min_Result {
var $_result, $_offset = 1, $num_rows;
class Result {
public $num_rows;
private $result, $offset = 1;
function Min_Result($result) {
$this->_result = $result;
function __construct($result) {
$this->result = $result;
}
function _convert($row) {
private function convert($row) {
foreach ((array) $row as $key => $val) {
if (is_a($val, 'OCI-Lob')) {
if (is_a($val, 'OCILob') || is_a($val, 'OCI-Lob')) {
$row[$key] = $val->load();
}
}
@@ -94,38 +84,38 @@ if (isset($_GET["oracle"])) {
}
function fetch_assoc() {
return $this->_convert(oci_fetch_assoc($this->_result));
return $this->convert(oci_fetch_assoc($this->result));
}
function fetch_row() {
return $this->_convert(oci_fetch_row($this->_result));
return $this->convert(oci_fetch_row($this->result));
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
$return->name = oci_field_name($this->_result, $column);
$return->orgname = $return->name;
$return->type = oci_field_type($this->_result, $column);
function fetch_field(): \stdClass {
$column = $this->offset++;
$return = new \stdClass;
$return->name = oci_field_name($this->result, $column);
$return->type = oci_field_type($this->result, $column); //! map to MySQL numbers
$return->charsetnr = (preg_match("~raw|blob|bfile~", $return->type) ? 63 : 0); // 63 - binary
return $return;
}
function __destruct() {
oci_free_statement($this->_result);
oci_free_statement($this->result);
}
}
} elseif (extension_loaded("pdo_oci")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_OCI";
class Db extends PdoDb {
public $extension = "PDO_OCI";
public $_current_db;
function connect($server, $username, $password) {
$this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
return true;
function attach(?string $server, string $username, string $password): string {
return $this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
}
function select_db($database) {
function select_db(string $database) {
$this->_current_db = $database;
return true;
}
}
@@ -134,7 +124,33 @@ if (isset($_GET["oracle"])) {
class Min_Driver extends Min_SQL {
class Driver extends SqlDriver {
static $extensions = array("OCI8", "PDO_OCI");
static $jush = "oracle";
public $insertFunctions = array( //! no parentheses
"date" => "current_date",
"timestamp" => "current_timestamp",
);
public $editFunctions = array(
"number|float|double" => "+/-",
"date|timestamp" => "+ interval/- interval",
"char|clob" => "||",
);
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
public $functions = array("length", "lower", "round", "upper");
public $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
function __construct(Db $connection) {
parent::__construct($connection);
$this->types = array(
lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
);
}
//! support empty $set in insert()
@@ -142,6 +158,29 @@ if (isset($_GET["oracle"])) {
return true; // automatic start
}
function insertUpdate(string $table, array $rows, array $primary) {
foreach ($rows as $set) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
}
if (
!(($where && queries("UPDATE " . table($table) . " SET " . implode(", ", $update) . " WHERE " . implode(" AND ", $where)) && connection()->affected_rows)
|| queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")"))
) {
return false;
}
}
return true;
}
function hasCStyleEscapes(): bool {
return true;
}
}
@@ -154,66 +193,82 @@ if (isset($_GET["oracle"])) {
return idf_escape($idf);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT tablespace_name FROM user_tablespaces");
function get_databases($flush) {
return get_vals(
"SELECT DISTINCT tablespace_name FROM (
SELECT tablespace_name FROM user_tablespaces
UNION SELECT tablespace_name FROM all_tables WHERE tablespace_name IS NOT NULL
)
ORDER BY 1"
);
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset"
: ($limit !== null ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
: ($limit ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
: " $query$where"
));
}
function limit1($query, $where) {
return " $query$where";
function limit1($table, $query, $where, $separator = "\n") {
return " $query$where"; //! limit
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'"); //! respect $db
}
function engines() {
return array();
return get_val("SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'"); //! respect $db
}
function logged_user() {
global $connection;
return $connection->result("SELECT USER FROM DUAL");
return get_val("SELECT USER FROM DUAL");
}
function get_current_db() {
$db = connection()->_current_db ?: DB;
unset(connection()->_current_db);
return $db;
}
function where_owner($prefix, $owner = "owner") {
if (!$_GET["ns"]) {
return '';
}
return "$prefix$owner = sys_context('USERENV', 'CURRENT_SCHEMA')";
}
function views_table($columns) {
$owner = where_owner('');
return "(SELECT $columns FROM all_views WHERE " . ($owner ?: "rownum < 0") . ")";
}
function tables_list() {
return get_key_vals("SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "
UNION SELECT view_name, 'view' FROM user_views
$view = views_table("view_name");
$owner = where_owner(" AND ");
return get_key_vals(
"SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "$owner
UNION SELECT view_name, 'view' FROM $view
ORDER BY 1"
); //! views don't have schema
}
function count_tables($databases) {
return array();
$return = array();
foreach ($databases as $db) {
$return[$db] = get_val("SELECT COUNT(*) FROM all_tables WHERE tablespace_name = " . q($db));
}
return $return;
}
function table_status($name = "") {
$return = array();
$search = q($name);
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") . "
ORDER BY 1"
) as $row) {
if ($name != "") {
return $row;
}
$db = get_current_db();
$view = views_table("view_name");
$owner = where_owner(" AND ");
foreach (
get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q($db) . $owner . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view', 0, 0 FROM $view" . ($name != "" ? " WHERE view_name = $search" : "") . "
ORDER BY 1") as $row
) {
$return[$row["Name"]] = $row;
}
return $return;
@@ -229,11 +284,12 @@ ORDER BY 1"
function fields($table) {
$return = array();
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . " ORDER BY column_id") as $row) {
$owner = where_owner(" AND ");
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . "$owner ORDER BY column_id") as $row) {
$type = $row["DATA_TYPE"];
$length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
if ($length == ",") {
$length = $row["DATA_LENGTH"];
$length = $row["CHAR_COL_DECL_LENGTH"];
} //! int
$return[$row["COLUMN_NAME"]] = array(
"field" => $row["COLUMN_NAME"],
@@ -244,7 +300,7 @@ ORDER BY 1"
"null" => ($row["NULLABLE"] == "Y"),
//! "auto_increment" => false,
//! "collation" => $row["CHARACTER_SET_NAME"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
"privileges" => array("insert" => 1, "select" => 1, "update" => 1, "where" => 1, "order" => 1),
//! "comment" => $row["Comment"],
//! "primary" => ($row["Key"] == "PRI"),
);
@@ -254,22 +310,29 @@ ORDER BY 1"
function indexes($table, $connection2 = null) {
$return = array();
foreach (get_rows("SELECT uic.*, uc.constraint_type
FROM user_ind_columns uic
LEFT JOIN user_constraints uc ON uic.index_name = uc.constraint_name AND uic.table_name = uc.table_name
WHERE uic.table_name = " . q($table) . "
ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
$owner = where_owner(" AND ", "aic.table_owner");
foreach (
get_rows("SELECT aic.*, ac.constraint_type, atc.data_default
FROM all_ind_columns aic
LEFT JOIN all_constraints ac ON aic.index_name = ac.constraint_name AND aic.table_name = ac.table_name AND aic.index_owner = ac.owner
LEFT JOIN all_tab_cols atc ON aic.column_name = atc.column_name AND aic.table_name = atc.table_name AND aic.index_owner = atc.owner
WHERE aic.table_name = " . q($table) . "$owner
ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row
) {
$index_name = $row["INDEX_NAME"];
$column_name = $row["DATA_DEFAULT"];
$column_name = ($column_name ? trim($column_name, '"') : $row["COLUMN_NAME"]); // trim - possibly wrapped in quotes but never contains quotes inside
$return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
$return[$index_name]["columns"][] = $row["COLUMN_NAME"];
$return[$index_name]["columns"][] = $column_name;
$return[$index_name]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null);
$return[$index_name]["descs"][] = ($row["DESCEND"] ? '1' : null);
$return[$index_name]["descs"][] = ($row["DESCEND"] && $row["DESCEND"] == "DESC" ? '1' : null);
}
return $return;
}
function view($name) {
$rows = get_rows('SELECT text "select" FROM user_views WHERE view_name = ' . q($name));
$view = views_table("view_name, text");
$rows = get_rows('SELECT text "select" FROM ' . $view . ' WHERE view_name = ' . q($name));
return reset($rows);
}
@@ -278,12 +341,11 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
}
function information_schema($db) {
return false;
return get_schema() == "INFORMATION_SCHEMA";
}
function error() {
global $connection;
return h($connection->error); //! highlight sqltext from offset
return h(connection()->error); //! highlight sqltext from offset
}
function explain($connection, $query) {
@@ -294,13 +356,25 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
function found_rows($table_status, $where) {
}
function auto_increment() {
return "";
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = $drop = array();
$orig_fields = ($table ? fields($table) : array());
foreach ($fields as $field) {
$val = $field[1];
if ($val && $field[0] != "" && idf_escape($field[0]) != $val[0]) {
queries("ALTER TABLE " . table($table) . " RENAME COLUMN " . idf_escape($field[0]) . " TO $val[0]");
}
$orig_field = $orig_fields[$field[0]];
if ($val && $orig_field) {
$old = process_field($orig_field, $orig_field);
if ($val[2] == $old[2]) {
$val[2] = "";
}
}
if ($val) {
$alter[] = ($table != "" ? ($field[0] != "" ? "MODIFY (" : "ADD (") : " ") . implode($val) . ($table != "" ? ")" : ""); //! error with name change only
} else {
@@ -316,6 +390,34 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
;
}
function alter_indexes($table, $alter) {
$drop = array();
$queries = array();
foreach ($alter as $val) {
if ($val[0] != "INDEX") {
$val[2] = preg_replace('~ DESC$~', '', $val[2]);
$create = ($val[2] == "DROP"
? "\nDROP CONSTRAINT " . idf_escape($val[1])
: "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $val[2]) . ")"
);
array_unshift($queries, "ALTER TABLE " . table($table) . $create);
} elseif ($val[2] == "DROP") {
$drop[] = idf_escape($val[1]);
} else {
$queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " (" . implode(", ", $val[2]) . ")";
}
}
if ($drop) {
array_unshift($queries, "DROP INDEX " . implode(", ", $drop));
}
foreach ($queries as $query) {
if (!queries($query)) {
return false;
}
}
return true;
}
function foreign_keys($table) {
$return = array();
$query = "SELECT c_list.CONSTRAINT_NAME as NAME,
@@ -354,30 +456,50 @@ AND c_src.TABLE_NAME = " . q($table);
return apply_queries("DROP TABLE", $tables);
}
function last_id() {
function last_id($result) {
return 0; //!
}
function schemas() {
return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
$return = get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX')) ORDER BY 1");
return ($return ?: get_vals("SELECT DISTINCT owner FROM all_tables WHERE tablespace_name = " . q(DB) . " ORDER BY 1"));
}
function get_schema() {
global $connection;
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
return get_val("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
}
function set_schema($scheme) {
global $connection;
return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
function set_schema($scheme, $connection2 = null) {
if (!$connection2) {
$connection2 = connection();
}
return $connection2->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
}
function show_variables() {
return get_key_vals('SELECT name, display_value FROM v$parameter');
return get_rows('SELECT name, display_value FROM v$parameter');
}
function show_status() {
$return = array();
$rows = get_rows('SELECT * FROM v$instance');
foreach (reset($rows) as $key => $val) {
$return[] = array($key, $val);
}
return $return;
}
function process_list() {
return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
return get_rows('SELECT
sess.process AS "process",
sess.username AS "user",
sess.schemaname AS "schema",
sess.status AS "status",
sess.wait_class AS "wait_class",
sess.seconds_in_wait AS "seconds_in_wait",
sql.sql_text AS "sql_text",
sess.machine AS "machine",
sess.port AS "port"
FROM v$session sess LEFT OUTER JOIN v$sql sql
ON sql.sql_id = sess.sql_id
WHERE sess.type = \'USER\'
@@ -385,11 +507,6 @@ ORDER BY PROCESS
');
}
function show_status() {
$rows = get_rows('SELECT * FROM v$instance');
return reset($rows);
}
function convert_field($field) {
}
@@ -398,33 +515,6 @@ ORDER BY PROCESS
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view)$~', $feature); //!
}
$jush = "oracle";
$types = array();
$structured_types = array();
foreach (array(
lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
$functions = array("length", "lower", "round", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(
array( //! no parentheses
"date" => "current_date",
"timestamp" => "current_timestamp",
), array(
"number|float|double" => "+/-",
"date|timestamp" => "+ interval/- interval",
"char|clob" => "||",
)
);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,214 +1,146 @@
<?php
$drivers["sqlite"] = "SQLite 3";
$drivers["sqlite2"] = "SQLite 2";
namespace Adminer;
if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$possible_drivers = array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite");
define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
if (isset($_GET["sqlite"])) {
add_driver("sqlite", "SQLite");
class Min_SQLite {
var $extension = "SQLite3", $server_info, $affected_rows, $errno, $error, $_link;
if (isset($_GET["sqlite"])) {
define('Adminer\DRIVER', "sqlite");
function Min_SQLite($filename) {
$this->_link = new SQLite3($filename);
$version = $this->_link->version();
$this->server_info = $version["versionString"];
}
if (class_exists("SQLite3") && $_GET["ext"] != "pdo") {
abstract class SqliteDb extends SqlDb {
public $extension = "SQLite3";
private $link;
function query($query) {
$result = @$this->_link->query($query);
$this->error = "";
if (!$result) {
$this->errno = $this->_link->lastErrorCode();
$this->error = $this->_link->lastErrorMsg();
return false;
} elseif ($result->numColumns()) {
return new Min_Result($result);
}
$this->affected_rows = $this->_link->changes();
return true;
}
function quote($string) {
return (is_utf8($string)
? "'" . $this->_link->escapeString($string) . "'"
: "x'" . reset(unpack('H*', $string)) . "'"
);
}
function store_result() {
return $this->_result;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
$row = $result->_result->fetchArray();
return $row[$field];
}
function attach(?string $filename, string $username, string $password): string {
$this->link = new \SQLite3($filename);
$version = $this->link->version();
$this->server_info = $version["versionString"];
return '';
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($result) {
$this->_result = $result;
}
function fetch_assoc() {
return $this->_result->fetchArray(SQLITE3_ASSOC);
}
function fetch_row() {
return $this->_result->fetchArray(SQLITE3_NUM);
}
function fetch_field() {
$column = $this->_offset++;
$type = $this->_result->columnType($column);
return (object) array(
"name" => $this->_result->columnName($column),
"type" => $type,
"charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary
);
}
function __desctruct() {
return $this->_result->finalize();
function query(string $query, bool $unbuffered = false) {
$result = @$this->link->query($query);
$this->error = "";
if (!$result) {
$this->errno = $this->link->lastErrorCode();
$this->error = $this->link->lastErrorMsg();
return false;
} elseif ($result->numColumns()) {
return new Result($result);
}
$this->affected_rows = $this->link->changes();
return true;
}
} else {
function quote(string $string): string {
return (is_utf8($string)
? "'" . $this->link->escapeString($string) . "'"
: "x'" . first(unpack('H*', $string)) . "'"
);
}
}
class Min_SQLite {
var $extension = "SQLite", $server_info, $affected_rows, $error, $_link;
class Result {
public $num_rows;
private $result, $offset = 0;
function Min_SQLite($filename) {
$this->server_info = sqlite_libversion();
$this->_link = new SQLiteDatabase($filename);
}
function query($query, $unbuffered = false) {
$method = ($unbuffered ? "unbufferedQuery" : "query");
$result = @$this->_link->$method($query, SQLITE_BOTH, $error);
$this->error = "";
if (!$result) {
$this->error = $error;
return false;
} elseif ($result === true) {
$this->affected_rows = $this->changes();
return true;
}
return new Min_Result($result);
}
function quote($string) {
return "'" . sqlite_escape_string($string) . "'";
}
function store_result() {
return $this->_result;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
$row = $result->_result->fetch();
return $row[$field];
}
function __construct($result) {
$this->result = $result;
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($result) {
$this->_result = $result;
if (method_exists($result, 'numRows')) { // not available in unbuffered query
$this->num_rows = $result->numRows();
}
}
function fetch_assoc() {
$row = $this->_result->fetch(SQLITE_ASSOC);
if (!$row) {
return false;
}
$return = array();
foreach ($row as $key => $val) {
$return[($key[0] == '"' ? idf_unescape($key) : $key)] = $val;
}
return $return;
}
function fetch_row() {
return $this->_result->fetch(SQLITE_NUM);
}
function fetch_field() {
$name = $this->_result->fieldName($this->_offset++);
$pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) {
$table = ($match[3] != "" ? $match[3] : idf_unescape($match[2]));
$name = ($match[5] != "" ? $match[5] : idf_unescape($match[4]));
}
return (object) array(
"name" => $name,
"orgname" => $name,
"orgtable" => $table,
);
}
function fetch_assoc() {
return $this->result->fetchArray(SQLITE3_ASSOC);
}
function fetch_row() {
return $this->result->fetchArray(SQLITE3_NUM);
}
function fetch_field(): \stdClass {
$column = $this->offset++;
$type = $this->result->columnType($column);
return (object) array(
"name" => $this->result->columnName($column),
"type" => ($type == SQLITE3_TEXT ? 15 : 0),
"charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary
);
}
function __destruct() {
$this->result->finalize();
}
}
} elseif (extension_loaded("pdo_sqlite")) {
class Min_SQLite extends Min_PDO {
var $extension = "PDO_SQLite";
abstract class SqliteDb extends PdoDb {
public $extension = "PDO_SQLite";
function Min_SQLite($filename) {
function attach(?string $filename, string $username, string $password): string {
$this->dsn(DRIVER . ":$filename", "", "");
$this->query("PRAGMA foreign_keys = 1");
$this->query("PRAGMA busy_timeout = 500");
return '';
}
}
}
if (class_exists("Min_SQLite")) {
class Min_DB extends Min_SQLite {
function Min_DB() {
$this->Min_SQLite(":memory:");
if (class_exists('Adminer\SqliteDb')) {
class Db extends SqliteDb {
function attach(?string $filename, string $username, string $password): string {
parent::attach($filename, $username, $password);
$this->query("PRAGMA foreign_keys = 1");
$this->query("PRAGMA busy_timeout = 500");
return '';
}
function select_db($filename) {
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
$this->Min_SQLite($filename);
return true;
function select_db(string $filename): bool {
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) {
return !self::attach($filename, '', '');
}
return false;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function next_result() {
return false;
}
}
}
class Min_Driver extends Min_SQL {
class Driver extends SqlDriver {
static $extensions = array("SQLite3", "PDO_SQLite");
static $jush = "sqlite";
function insertUpdate($table, $rows, $primary) {
protected $types = array(array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0));
public $insertFunctions = array(); // "text" => "date('now')/time('now')/datetime('now')",
public $editFunctions = array(
"integer|real|numeric" => "+/-",
// "text" => "date/time/datetime",
"text" => "||",
);
public $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
public $functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
public $grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
static function connect(?string $server, string $username, string $password) {
if ($password != "") {
return lang('Database does not support password.');
}
return parent::connect(":memory:", "", "");
}
function __construct(Db $connection) {
parent::__construct($connection);
if (min_version(3.31, 0, $connection)) {
$this->generated = array("STORED", "VIRTUAL");
}
}
function structuredTypes(): array {
return array_keys($this->types[0]);
}
function insertUpdate(string $table, array $rows, array $primary) {
$values = array();
foreach ($rows as $set) {
$values[] = "(" . implode(", ", $set) . ")";
@@ -216,6 +148,29 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return queries("REPLACE INTO " . table($table) . " (" . implode(", ", array_keys(reset($rows))) . ") VALUES\n" . implode(",\n", $values));
}
function tableHelp(string $name, bool $is_view = false) {
if ($name == "sqlite_sequence") {
return "fileformat2.html#seqtab";
}
if ($name == "sqlite_master") {
return "fileformat2.html#$name";
}
}
function checkConstraints(string $table): array {
preg_match_all('~ CHECK *(\( *(((?>[^()]*[^() ])|(?1))*) *\))~', get_val("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table), 0, $this->conn), $matches); //! could be inside a comment
return array_combine($matches[2], $matches[2]);
}
function allFields(): array {
$return = array();
foreach (tables_list() as $table => $type) {
foreach (fields($table) as $field) {
$return[$table][] = $field;
}
}
return $return;
}
}
@@ -228,30 +183,23 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return idf_escape($idf);
}
function connect() {
return new Min_DB;
}
function get_databases() {
function get_databases($flush) {
return array();
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
return " $query$where" . ($limit ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
global $connection;
return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where");
function limit1($table, $query, $where, $separator = "\n") {
return (preg_match('~^INTO~', $query) || get_val("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')")
? limit($query, $where, 1, 0, $separator)
: " $query WHERE rowid = (SELECT rowid FROM " . table($table) . $where . $separator . "LIMIT 1)" //! use primary key in tables with WITHOUT rowid
);
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("PRAGMA encoding"); // there is no database list so $db == DB
}
function engines() {
return array();
return get_val("PRAGMA encoding"); // there is no database list so $db == DB
}
function logged_user() {
@@ -259,7 +207,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function tables_list() {
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name", 1);
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name");
}
function count_tables($databases) {
@@ -267,18 +215,15 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function table_status($name = "") {
global $connection;
$return = array();
foreach (get_rows("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
$row["Oid"] = 1;
$row["Auto_increment"] = "";
$row["Rows"] = $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["Name"]));
foreach (get_rows("SELECT name AS Name, type AS Engine, 'rowid' AS Oid, '' AS Auto_increment FROM sqlite_master WHERE type IN ('table', 'view') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
$row["Rows"] = get_val("SELECT COUNT(*) FROM " . idf_escape($row["Name"]));
$return[$row["Name"]] = $row;
}
foreach (get_rows("SELECT * FROM sqlite_sequence", null, "") as $row) {
foreach (get_rows("SELECT * FROM sqlite_sequence" . ($name != "" ? " WHERE name = " . q($name) : ""), null, "") as $row) {
$return[$row["name"]]["Auto_increment"] = $row["seq"];
}
return ($name != "" ? $return[$name] : $return);
return $return;
}
function is_view($table_status) {
@@ -286,15 +231,13 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function fk_support($table_status) {
global $connection;
return !$connection->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");
return !get_val("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");
}
function fields($table) {
global $connection;
$return = array();
$primary = "";
foreach (get_rows("PRAGMA table_info(" . table($table) . ")") as $row) {
foreach (get_rows("PRAGMA table_" . (min_version(3.31) ? "x" : "") . "info(" . table($table) . ")") as $row) {
$name = $row["name"];
$type = strtolower($row["type"]);
$default = $row["dflt_value"];
@@ -302,9 +245,9 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
"field" => $name,
"type" => (preg_match('~int~i', $type) ? "integer" : (preg_match('~char|clob|text~i', $type) ? "text" : (preg_match('~blob~i', $type) ? "blob" : (preg_match('~real|floa|doub~i', $type) ? "real" : "numeric")))),
"full_type" => $type,
"default" => (preg_match("~'(.*)'~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
"default" => (preg_match("~^'(.*)'$~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
"null" => !$row["notnull"],
"privileges" => array("select" => 1, "insert" => 1, "update" => 1),
"privileges" => array("select" => 1, "insert" => 1, "update" => 1, "where" => 1, "order" => 1),
"primary" => $row["pk"],
);
if ($row["pk"]) {
@@ -316,27 +259,31 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$primary = $name;
}
}
$sql = $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
preg_match_all('~(("[^"]*+")+|[a-z0-9_]+)\s+text\s+COLLATE\s+(\'[^\']+\'|\S+)~i', $sql, $matches, PREG_SET_ORDER);
$sql = get_val("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
$idf = '(("[^"]*+")+|[a-z0-9_]+)';
preg_match_all('~' . $idf . '\s+text\s+COLLATE\s+(\'[^\']+\'|\S+)~i', $sql, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$name = str_replace('""', '"', preg_replace('~^"|"$~', '', $match[1]));
if ($return[$name]) {
$return[$name]["collation"] = trim($match[3], "'");
}
}
preg_match_all('~' . $idf . '\s.*GENERATED ALWAYS AS \((.+)\) (STORED|VIRTUAL)~i', $sql, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$name = str_replace('""', '"', preg_replace('~^"|"$~', '', $match[1]));
$return[$name]["default"] = $match[3];
$return[$name]["generated"] = strtoupper($match[4]);
}
return $return;
}
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
$connection2 = $connection;
}
$connection2 = connection($connection2);
$return = array();
$sql = $connection2->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
if (preg_match('~\bPRIMARY\s+KEY\s*\((([^)"]+|"[^"]*")++)~i', $sql, $match)) {
$sql = get_val("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table), 0, $connection2);
if (preg_match('~\bPRIMARY\s+KEY\s*\((([^)"]+|"[^"]*"|`[^`]*`)++)~i', $sql, $match)) {
$return[""] = array("type" => "PRIMARY", "columns" => array(), "lengths" => array(), "descs" => array());
preg_match_all('~((("[^"]*+")+)|(\S+))(\s+(ASC|DESC))?(,\s*|$)~i', $match[1], $matches, PREG_SET_ORDER);
preg_match_all('~((("[^"]*+")+|(?:`[^`]*+`)+)|(\S+))(\s+(ASC|DESC))?(,\s*|$)~i', $match[1], $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$return[""]["columns"][] = idf_unescape($match[2]) . $match[4];
$return[""]["descs"][] = (preg_match('~DESC~i', $match[5]) ? '1' : null);
@@ -378,7 +325,6 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$return = array();
foreach (get_rows("PRAGMA foreign_key_list(" . table($table) . ")") as $row) {
$foreign_key = &$return[$row["id"]];
//! idf_unescape in SQLite2
if (!$foreign_key) {
$foreign_key = $row;
}
@@ -389,8 +335,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function view($name) {
global $connection;
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\s+~iU', '', get_val("SELECT sql FROM sqlite_master WHERE type = 'view' AND name = " . q($name)))); //! identifiers may be inside []
}
function collations() {
@@ -402,34 +347,32 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function error() {
global $connection;
return h($connection->error);
return h(connection()->error);
}
function check_sqlite_name($name) {
// avoid creating PHP files on unsecured servers
global $connection;
$extensions = "db|sdb|sqlite";
if (!preg_match("~^[^\\0]*\\.($extensions)\$~", $name)) {
$connection->error = lang('Please use one of the extensions %s.', str_replace("|", ", ", $extensions));
connection()->error = lang('Please use one of the extensions %s.', str_replace("|", ", ", $extensions));
return false;
}
return true;
}
function create_database($db, $collation) {
global $connection;
if (file_exists($db)) {
$connection->error = lang('File exists.');
connection()->error = lang('File exists.');
return false;
}
if (!check_sqlite_name($db)) {
return false;
}
try {
$link = new Min_SQLite($db);
} catch (Exception $ex) {
$connection->error = $ex->getMessage();
$link = new Db();
$link->attach($db, '', '');
} catch (\Exception $ex) {
connection()->error = $ex->getMessage();
return false;
}
$link->query('PRAGMA encoding = "UTF-8"');
@@ -439,11 +382,10 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function drop_databases($databases) {
global $connection;
$connection->Min_SQLite(":memory:"); // to unlock file, doesn't work in PDO on Windows
connection()->attach(":memory:", '', ''); // to unlock file, doesn't work in PDO on Windows
foreach ($databases as $db) {
if (!@unlink($db)) {
$connection->error = lang('File exists.');
connection()->error = lang('File exists.');
return false;
}
}
@@ -451,17 +393,16 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function rename_database($name, $collation) {
global $connection;
if (!check_sqlite_name($name)) {
return false;
}
$connection->Min_SQLite(":memory:");
$connection->error = lang('File exists.');
connection()->attach(":memory:", '', '');
connection()->error = lang('File exists.');
return @rename(DB, $name);
}
function auto_increment() {
return " PRIMARY KEY" . (DRIVER == "sqlite" ? " AUTOINCREMENT" : "");
return " PRIMARY KEY AUTOINCREMENT";
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
@@ -491,19 +432,38 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
return false;
}
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign, $auto_increment)) {
return false;
}
if ($auto_increment) {
queries("BEGIN");
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
if (!connection()->affected_rows) {
queries("INSERT INTO sqlite_sequence (name, seq) VALUES (" . q($name) . ", $auto_increment)");
}
queries("COMMIT");
}
return true;
}
function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
/** Recreate table
* @param string $table original name
* @param string $name new name
* @param list<list<string>> $fields [process_field()], empty to preserve
* @param string[] $originals [$original => idf_escape($new_column)], empty to preserve
* @param string[] $foreign [format_foreign_key()], empty to preserve
* @param numeric-string $auto_increment set auto_increment to this value, "" to preserve
* @param list<array{string, string, list<string>|'DROP'}> $indexes [[$type, $name, $columns]], empty to preserve
* @param string $drop_check CHECK constraint to drop
* @param string $add_check CHECK constraint to add
*/
function recreate_table(string $table, string $name, array $fields, array $originals, array $foreign, string $auto_increment = "", $indexes = array(), string $drop_check = "", string $add_check = ""): bool {
if ($table != "") {
if (!$fields) {
foreach (fields($table) as $key => $field) {
if ($indexes) {
$field["auto_increment"] = 0;
}
$fields[] = process_field($field, $field);
$originals[$key] = idf_escape($key);
}
@@ -554,29 +514,46 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
queries("BEGIN");
}
foreach ($fields as $key => $field) {
$fields[$key] = " " . implode($field);
$changes = array();
foreach ($fields as $field) {
if (preg_match('~GENERATED~', $field[3])) {
unset($originals[array_search($field[0], $originals)]);
}
$changes[] = " " . implode($field);
}
$fields = array_merge($fields, array_filter($foreign));
if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $fields) . "\n)")) {
// implicit ROLLBACK to not overwrite $connection->error
$changes = array_merge($changes, array_filter($foreign));
foreach (driver()->checkConstraints($table) as $check) {
if ($check != $drop_check) {
$changes[] = " CHECK ($check)";
}
}
if ($add_check) {
$changes[] = " CHECK ($add_check)";
}
$temp_name = ($table == $name ? "adminer_$name" : $name);
if (!queries("CREATE TABLE " . table($temp_name) . " (\n" . implode(",\n", $changes) . "\n)")) {
// implicit ROLLBACK to not overwrite connection()->error
return false;
}
if ($table != "") {
if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
if ($originals && !queries("INSERT INTO " . table($temp_name) . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('Adminer\idf_escape', array_keys($originals))) . " FROM " . table($table))) {
return false;
}
$triggers = array();
foreach (triggers($table) as $trigger_name => $timing_event) {
$trigger = trigger($trigger_name);
$trigger = trigger($trigger_name, $table);
$triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
}
if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
$auto_increment = $auto_increment ? "" : get_val("SELECT seq FROM sqlite_sequence WHERE name = " . q($table)); // if $auto_increment is set then it will be updated later
if (
!queries("DROP TABLE " . table($table)) // drop before creating indexes and triggers to allow using old names
|| ($table == $name && !queries("ALTER TABLE " . table($temp_name) . " RENAME TO " . table($name)))
|| !alter_indexes($name, $indexes)
) {
return false;
}
queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
if (!alter_indexes($name, $indexes)) {
return false;
if ($auto_increment) {
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
}
foreach ($triggers as $trigger) {
if (!queries($trigger)) {
@@ -599,14 +576,15 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function alter_indexes($table, $alter) {
foreach ($alter as $primary) {
if ($primary[0] == "PRIMARY") {
return recreate_table($table, $table, array(), array(), array(), $alter);
return recreate_table($table, $table, array(), array(), array(), "", $alter);
}
}
foreach (array_reverse($alter) as $val) {
if (!queries($val[2] == "DROP"
if (
!queries($val[2] == "DROP"
? "DROP INDEX " . idf_escape($val[1])
: index_sql($table, $val[0], $val[1], "(" . implode(", ", $val[2]) . ")")
)) {
: index_sql($table, $val[0], $val[1], "(" . implode(", ", $val[2]) . ")"))
) {
return false;
}
}
@@ -629,23 +607,22 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return false;
}
function trigger($name) {
global $connection;
function trigger($name, $table) {
if ($name == "") {
return array("Statement" => "BEGIN\n\t;\nEND");
}
$idf = '(?:[^`"\\s]+|`[^`]*`|"[^"]*")+';
$idf = '(?:[^`"\s]+|`[^`]*`|"[^"]*")+';
$trigger_options = trigger_options();
preg_match(
"~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",
$connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
get_val("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
$match
);
$of = $match[3];
return array(
"Timing" => strtoupper($match[1]),
"Event" => strtoupper($match[2]) . ($of ? " OF" : ""),
"Of" => ($of[0] == '`' || $of[0] == '"' ? idf_unescape($of) : $of),
"Of" => idf_unescape($of),
"Trigger" => $name,
"Statement" => $match[4],
);
@@ -655,7 +632,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$return = array();
$trigger_options = trigger_options();
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(' . implode("|", $trigger_options["Timing"]) . ')\\s*(.*)\\s+ON\\b~iU', $row["sql"], $match);
preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*(' . implode("|", $trigger_options["Timing"]) . ')\s*(.*?)\s+ON\b~i', $row["sql"], $match);
$return[$row["name"]] = array($match[1], $match[2]);
}
return $return;
@@ -669,25 +646,12 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
);
}
function routine($name, $type) {
// not supported by SQLite
}
function routines() {
// not supported by SQLite
}
function routine_languages() {
// not supported by SQLite
}
function begin() {
return queries("BEGIN");
}
function last_id() {
global $connection;
return $connection->result("SELECT LAST_INSERT_ROWID()");
function last_id($result) {
return get_val("SELECT LAST_INSERT_ROWID()");
}
function explain($connection, $query) {
@@ -697,30 +661,17 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function found_rows($table_status, $where) {
}
function types() {
function types(): array {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($scheme) {
return true;
}
function create_sql($table, $auto_increment) {
global $connection;
$return = $connection->result("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = " . q($table));
function create_sql($table, $auto_increment, $style) {
$return = get_val("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = " . q($table));
foreach (indexes($table) as $name => $index) {
if ($name == '') {
continue;
}
$return .= ";\n\n" . index_sql($table, $index['type'], $name, "(" . implode(", ", array_map('idf_escape', $index['columns'])) . ")");
$return .= ";\n\n" . index_sql($table, $index['type'], $name, "(" . implode(", ", array_map('Adminer\idf_escape', $index['columns'])) . ")");
}
return $return;
}
@@ -732,15 +683,20 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function use_sql($database) {
}
function trigger_sql($table, $style) {
function trigger_sql($table) {
return implode(get_vals("SELECT sql || ';;\n' FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)));
}
function show_variables() {
global $connection;
$return = array();
foreach (array("auto_vacuum", "cache_size", "count_changes", "default_cache_size", "empty_result_callbacks", "encoding", "foreign_keys", "full_column_names", "fullfsync", "journal_mode", "journal_size_limit", "legacy_file_format", "locking_mode", "page_size", "max_page_count", "read_uncommitted", "recursive_triggers", "reverse_unordered_selects", "secure_delete", "short_column_names", "synchronous", "temp_store", "temp_store_directory", "schema_version", "integrity_check", "quick_check") as $key) {
$return[$key] = $connection->result("PRAGMA $key");
foreach (get_rows("PRAGMA pragma_list") as $row) {
$name = $row["name"];
if ($name != "pragma_list" && $name != "compile_options") {
$return[$name] = array($name, '');
foreach (get_rows("PRAGMA $name") as $row) {
$return[$name][1] .= implode(", ", $row) . "\n";
}
}
}
return $return;
}
@@ -748,8 +704,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function show_status() {
$return = array();
foreach (get_vals("PRAGMA compile_options") as $option) {
list($key, $val) = explode("=", $option, 2);
$return[$key] = $val;
$return[] = explode("=", $option, 2) + array('', '');
}
return $return;
}
@@ -762,23 +717,6 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|dump|indexes|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
return preg_match('~^(check|columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
}
$jush = "sqlite";
$types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0);
$structured_types = array_keys($types);
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
$functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
$edit_functions = array(
array(
// "text" => "date('now')/time('now')/datetime('now')",
), array(
"integer|real|numeric" => "+/-",
// "text" => "date/time/datetime",
"text" => "||",
)
);
}

View File

@@ -1,28 +1,31 @@
<?php
namespace Adminer;
$TABLE = $_GET["dump"];
if ($_POST && !$error) {
$cookie = "";
foreach (array("output", "format", "db_style", "routines", "events", "table_style", "auto_increment", "triggers", "data_style") as $key) {
$cookie .= "&$key=" . urlencode($_POST[$key]);
}
cookie("adminer_export", substr($cookie, 1));
save_settings(
array_intersect_key($_POST, array_flip(array("output", "format", "db_style", "types", "routines", "events", "table_style", "auto_increment", "triggers", "data_style"))),
"adminer_export"
);
$tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]);
$ext = dump_headers(
(count($tables) == 1 ? key($tables) : DB),
(DB == "" || count($tables) > 1));
(DB == "" || count($tables) > 1)
);
$is_sql = preg_match('~sql~', $_POST["format"]);
if ($is_sql) {
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump\n\n";
if ($jush == "sql") {
echo "-- Adminer " . VERSION . " " . get_driver(DRIVER) . " " . str_replace("\n", " ", connection()->server_info) . " dump\n\n";
if (JUSH == "sql") {
echo "SET NAMES utf8;
SET time_zone = '+00:00';
" . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
SET foreign_key_checks = 0;
" . ($_POST["data_style"] ? "SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
" : "") . "
";
$connection->query("SET time_zone = '+00:00';");
connection()->query("SET time_zone = '+00:00'");
connection()->query("SET sql_mode = ''");
}
}
@@ -36,9 +39,9 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
}
foreach ((array) $databases as $db) {
$adminer->dumpDatabase($db);
if ($connection->select_db($db)) {
if ($is_sql && preg_match('~CREATE~', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
adminer()->dumpDatabase($db);
if (connection()->select_db($db)) {
if ($is_sql && preg_match('~CREATE~', $style) && ($create = get_val("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
set_utf8mb4($create);
if ($style == "DROP+CREATE") {
echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n";
@@ -51,27 +54,37 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
}
$out = "";
if ($_POST["routines"]) {
foreach (array("FUNCTION", "PROCEDURE") as $routine) {
foreach (get_rows("SHOW $routine STATUS WHERE Db = " . q($db), null, "-- ") as $row) {
$create = remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
if ($_POST["types"]) {
foreach (types() as $id => $type) {
$enums = type_values($id);
if ($enums) {
$out .= ($style != 'DROP+CREATE' ? "DROP TYPE IF EXISTS " . idf_escape($type) . ";;\n" : "") . "CREATE TYPE " . idf_escape($type) . " AS ENUM ($enums);\n\n";
} else {
//! https://github.com/postgres/postgres/blob/REL_17_4/src/bin/pg_dump/pg_dump.c#L10846
$out .= "-- Could not export type $type\n\n";
}
}
}
if ($_POST["routines"]) {
foreach (routines() as $row) {
$name = $row["ROUTINE_NAME"];
$routine = $row["ROUTINE_TYPE"];
$create = create_routine($routine, array("name" => $name) + routine($row["SPECIFIC_NAME"], $routine));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($name) . ";;\n" : "") . "$create;\n\n";
}
}
if ($_POST["events"]) {
foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) {
$create = remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3));
$create = remove_definer(get_val("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
}
}
if ($out) {
echo "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n";
}
echo ($out && JUSH == 'sql' ? "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n" : $out);
}
if ($_POST["table_style"] || $_POST["data_style"]) {
@@ -80,19 +93,20 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
$table = (DB == "" || in_array($name, (array) $_POST["tables"]));
$data = (DB == "" || in_array($name, (array) $_POST["data"]));
if ($table || $data) {
$tmp_file = null;
if ($ext == "tar") {
$tmp_file = new TmpFile;
ob_start(array($tmp_file, 'write'), 1e5);
}
$adminer->dumpTable($name, ($table ? $_POST["table_style"] : ""), (is_view($table_status) ? 2 : 0));
adminer()->dumpTable($name, ($table ? $_POST["table_style"] : ""), (is_view($table_status) ? 2 : 0));
if (is_view($table_status)) {
$views[] = $name;
} elseif ($data) {
$fields = fields($name);
$adminer->dumpData($name, $_POST["data_style"], "SELECT *" . convert_fields($fields, $fields) . " FROM " . table($name));
adminer()->dumpData($name, $_POST["data_style"], "SELECT *" . convert_fields($fields, $fields) . " FROM " . table($name));
}
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($name, $_POST["table_style"]))) {
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($name))) {
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
}
@@ -105,8 +119,18 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
}
}
// add FKs after creating tables (except in MySQL which uses SET FOREIGN_KEY_CHECKS=0)
if (function_exists('Adminer\foreign_keys_sql')) {
foreach (table_status('', true) as $name => $table_status) {
$table = (DB == "" || in_array($name, (array) $_POST["tables"]));
if ($table && !is_view($table_status)) {
echo foreign_keys_sql($name);
}
}
}
foreach ($views as $view) {
$adminer->dumpTable($view, $_POST["table_style"], 1);
adminer()->dumpTable($view, $_POST["table_style"], 1);
}
if ($ext == "tar") {
@@ -116,9 +140,7 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
}
}
if ($is_sql) {
echo "-- " . $connection->result("SELECT NOW()") . "\n";
}
adminer()->dumpFooter();
exit;
}
@@ -126,15 +148,15 @@ page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_
?>
<form action="" method="post">
<table cellspacing="0">
<table class="layout">
<?php
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
$table_style = array('', 'DROP+CREATE', 'CREATE');
$data_style = array('', 'TRUNCATE+INSERT', 'INSERT');
if ($jush == "sql") { //! use insertUpdate() in all drivers
if (JUSH == "sql") { //! use insertUpdate() in all drivers
$data_style[] = 'INSERT+UPDATE';
}
parse_str($_COOKIE["adminer_export"], $row);
$row = get_settings("adminer_export");
if (!$row) {
$row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
}
@@ -143,11 +165,12 @@ if (!isset($row["events"])) { // backwards compatibility
$row["triggers"] = $row["table_style"];
}
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
echo "<tr><th>" . lang('Output') . "<td>" . html_radios("output", adminer()->dumpOutput(), $row["output"]) . "\n";
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
echo "<tr><th>" . lang('Format') . "<td>" . html_radios("format", adminer()->dumpFormat(), $row["format"]) . "\n";
echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
echo (JUSH == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
. (support("type") ? checkbox("types", 1, $row["types"], lang('User types')) : "")
. (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
. (support("event") ? checkbox("events", 1, $row["events"], lang('Events')) : "")
);
@@ -161,16 +184,17 @@ echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style,
?>
</table>
<p><input type="submit" value="<?php echo lang('Export'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php echo input_token(); ?>
<table cellspacing="0">
<table>
<?php
echo script("qsl('table').onclick = dumpClick;");
$prefixes = array();
if (DB != "") {
$checked = ($TABLE != "" ? "" : " checked");
echo "<thead><tr>";
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked>" . lang('Tables') . "</label>" . script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);", "");
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked></label>" . script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);", "");
echo "</thead>\n";
$views = "";
@@ -178,28 +202,31 @@ if (DB != "") {
foreach ($tables_list as $name => $type) {
$prefix = preg_replace('~_.*~', '', $name);
$checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');", "block");
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "", "block");
if ($type !== null && !preg_match('~table~i', $type)) {
$views .= "$print\n";
} else {
echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked) . "</label>\n";
}
$prefixes[$prefix]++;
}
echo $views;
if ($tables_list) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
}
} else {
echo "<thead><tr><th style='text-align: left;'><label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n";
$databases = $adminer->databases();
echo "<thead><tr><th style='text-align: left;'>";
echo "<label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . ">" . lang('Database') . "</label>";
echo script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);", "");
echo "</thead>\n";
$databases = adminer()->databases();
if ($databases) {
foreach ($databases as $db) {
if (!information_schema($db)) {
$prefix = preg_replace('~_.*~', '', $db);
echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "formUncheck('check-databases');", "block") . "\n";
echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "", "block") . "\n";
$prefixes[$prefix]++;
}
}

View File

@@ -1,10 +1,15 @@
<?php
namespace Adminer;
$TABLE = $_GET["edit"];
$fields = fields($TABLE);
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
$where = (isset($_GET["select"])
? ($_POST["check"] && count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "")
: where($_GET, $fields)
);
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
foreach ($fields as $name => $field) {
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
if (!isset($field["privileges"][$update ? "update" : "insert"]) || adminer()->fieldName($field) == "" || $field["generated"]) {
unset($fields[$name]);
}
}
@@ -25,7 +30,7 @@ if ($_POST && !$error && !isset($_GET["select"])) {
queries_redirect(
$location,
lang('Item has been deleted.'),
$driver->delete($TABLE, $query_where, !$unique_array)
driver()->delete($TABLE, $query_where, $unique_array ? 0 : 1)
);
} else {
@@ -44,7 +49,7 @@ if ($_POST && !$error && !isset($_GET["select"])) {
queries_redirect(
$location,
lang('Item has been updated.'),
$driver->update($TABLE, $set, $query_where, !$unique_array)
driver()->update($TABLE, $set, $query_where, $unique_array ? 0 : 1)
);
if (is_ajax()) {
page_headers();
@@ -52,8 +57,8 @@ if ($_POST && !$error && !isset($_GET["select"])) {
exit;
}
} else {
$result = $driver->insert($TABLE, $set);
$last_id = ($result ? last_id() : 0);
$result = driver()->insert($TABLE, $set);
$last_id = ($result ? last_id($result) : 0);
queries_redirect($location, lang('Item%s has been inserted.', ($last_id ? " $last_id" : "")), $result); //! link
}
}
@@ -66,13 +71,7 @@ if ($_POST["save"]) {
$select = array();
foreach ($fields as $name => $field) {
if (isset($field["privileges"]["select"])) {
$as = convert_field($field);
if ($_POST["clone"] && $field["auto_increment"]) {
$as = "''";
}
if ($jush == "sql" && preg_match("~enum|set~", $field["type"])) {
$as = "1*" . idf_escape($name);
}
$as = ($_POST["clone"] && $field["auto_increment"] ? "''" : convert_field($field));
$select[] = ($as ? "$as AS " : "") . idf_escape($name);
}
}
@@ -81,10 +80,14 @@ if ($_POST["save"]) {
$select = array("*");
}
if ($select) {
$result = $driver->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1));
$row = $result->fetch_assoc();
if (!$row) { // MySQLi returns null
$row = false;
$result = driver()->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1));
if (!$result) {
$error = error();
} else {
$row = $result->fetch_assoc();
if (!$row) { // MySQLi returns null
$row = false;
}
}
if (isset($_GET["select"]) && (!$row || $result->fetch_assoc())) { // $result->num_rows != 1 isn't available in all drivers
$row = null;
@@ -92,12 +95,12 @@ if ($_POST["save"]) {
}
}
if (!support("table") && !$fields) {
if (!support("table") && !$fields) { // used by Mongo and SimpleDB
if (!$where) { // insert
$result = $driver->select($TABLE, array("*"), $where, array("*"));
$result = driver()->select($TABLE, array("*"), array(), array("*"));
$row = ($result ? $result->fetch_assoc() : false);
if (!$row) {
$row = array($driver->primary => "");
$row = array(driver()->primary => "");
}
}
if ($row) {
@@ -105,9 +108,9 @@ if (!support("table") && !$fields) {
if (!$where) {
$row[$key] = null;
}
$fields[$key] = array("field" => $key, "null" => ($key != $driver->primary), "auto_increment" => ($key == $driver->primary));
$fields[$key] = array("field" => $key, "null" => ($key != driver()->primary), "auto_increment" => ($key == driver()->primary));
}
}
}
edit_form($TABLE, $fields, $row, $update);
edit_form($TABLE, $fields, $row, $update, $error);

13
adminer/elastic.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
// To create Adminer just for Elasticsearch, run `../compile.php elastic`.
function adminer_object() {
include_once "../plugins/login-password-less.php";
include_once "../plugins/drivers/elastic.php";
return new Adminer\Plugins(array(
// TODO: inline the result of password_hash() so that the password is not visible in source codes
new AdminerLoginPasswordLess(password_hash("YOUR_PASSWORD_HERE", PASSWORD_DEFAULT)),
));
}
include "./index.php";

View File

@@ -1,4 +1,6 @@
<?php
namespace Adminer;
$EVENT = $_GET["event"];
$intervals = array("YEAR", "QUARTER", "MONTH", "DAY", "HOUR", "MINUTE", "WEEK", "SECOND", "YEAR_MONTH", "DAY_HOUR", "DAY_MINUTE", "DAY_SECOND", "HOUR_MINUTE", "HOUR_SECOND", "MINUTE_SECOND");
$statuses = array("ENABLED" => "ENABLE", "DISABLED" => "DISABLE", "SLAVESIDE_DISABLED" => "DISABLE ON SLAVE");
@@ -15,14 +17,18 @@ if ($_POST && !$error) {
: "AT " . q($row["STARTS"])
) . " ON COMPLETION" . ($row["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
;
queries_redirect(substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')), queries(($EVENT != ""
? "ALTER EVENT " . idf_escape($EVENT) . $schedule
. ($EVENT != $row["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($row["EVENT_NAME"]) : "")
: "CREATE EVENT " . idf_escape($row["EVENT_NAME"]) . $schedule
) . "\n" . $statuses[$row["STATUS"]] . " COMMENT " . q($row["EVENT_COMMENT"])
. rtrim(" DO\n$row[EVENT_DEFINITION]", ";") . ";"
));
queries_redirect(
substr(ME, 0, -1),
($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')),
queries(
($EVENT != ""
? "ALTER EVENT " . idf_escape($EVENT) . $schedule . ($EVENT != $row["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($row["EVENT_NAME"]) : "")
: "CREATE EVENT " . idf_escape($row["EVENT_NAME"]) . $schedule
) . "\n" . $statuses[$row["STATUS"]] . " COMMENT " . q($row["EVENT_COMMENT"])
. rtrim(" DO\n$row[EVENT_DEFINITION]", ";") . ";"
)
);
}
}
@@ -35,18 +41,20 @@ if (!$row && $EVENT != "") {
?>
<form action="" method="post">
<table cellspacing="0">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64" autocapitalize="off">
<table class="layout">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" data-maxlength="64" autocapitalize="off">
<tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
<tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
<tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
<tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
<tr><th>&nbsp;<td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" data-maxlength="64">
<tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
</table>
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php if ($EVENT != "") { ?>
<input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $EVENT)); ?>
<?php } ?>
<?php echo input_token(); ?>
</form>

View File

@@ -1,32 +1,42 @@
<?php
if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
header("HTTP/1.1 304 Not Modified");
exit;
namespace Adminer;
if (substr(VERSION, -4) != '-dev') {
if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
header("HTTP/1.1 304 Not Modified");
exit;
}
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: immutable");
}
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
@ini_set("zlib.output_compression", '1'); // @ - may be disabled
if ($_GET["file"] == "favicon.ico") {
header("Content-Type: image/x-icon");
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
} elseif ($_GET["file"] == "default.css") {
if ($_GET["file"] == "default.css") {
header("Content-Type: text/css; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/default.css;../externals/jush/jush.css', 'minify_css'));
} elseif ($_GET["file"] == "dark.css") {
header("Content-Type: text/css; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/dark.css;../externals/jush/jush-dark.css', 'minify_css'));
} elseif ($_GET["file"] == "functions.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
} elseif ($_GET["file"] == "jush.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.js;../externals/jush/modules/jush-sql.js;../externals/jush/modules/jush-pgsql.js;../externals/jush/modules/jush-sqlite.js;../externals/jush/modules/jush-mssql.js;../externals/jush/modules/jush-oracle.js;../externals/jush/modules/jush-simpledb.js', 'minify_js'));
} else {
header("Content-Type: image/gif");
switch ($_GET["file"]) {
case "plus.gif": echo compile_file('../adminer/static/plus.gif'); break;
case "cross.gif": echo compile_file('../adminer/static/cross.gif'); break;
case "up.gif": echo compile_file('../adminer/static/up.gif'); break;
case "down.gif": echo compile_file('../adminer/static/down.gif'); break;
case "arrow.gif": echo compile_file('../adminer/static/arrow.gif'); break;
}
echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;
../externals/jush/modules/jush-autocomplete-sql.js;
../externals/jush/modules/jush-textarea.js;
../externals/jush/modules/jush-txt.js;
../externals/jush/modules/jush-js.js;
../externals/jush/modules/jush-sql.js;
../externals/jush/modules/jush-pgsql.js;
../externals/jush/modules/jush-sqlite.js;
../externals/jush/modules/jush-mssql.js;
../externals/jush/modules/jush-oracle.js;
../externals/jush/modules/jush-simpledb.js', 'minify_js'));
} elseif ($_GET["file"] == "logo.png") {
header("Content-Type: image/png");
echo compile_file('../adminer/static/logo.png');
}
exit;

View File

@@ -1,32 +1,38 @@
<?php
namespace Adminer;
$TABLE = $_GET["foreign"];
$name = $_GET["name"];
$row = $_POST;
if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) {
$message = ($_POST["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
$location = ME . "table=" . urlencode($TABLE);
$row["source"] = array_filter($row["source"], 'strlen');
ksort($row["source"]); // enforce input order
$target = array();
foreach ($row["source"] as $key => $val) {
$target[$key] = $row["target"][$key];
if (!$_POST["drop"]) {
$row["source"] = array_filter($row["source"], 'strlen');
ksort($row["source"]); // enforce input order
$target = array();
foreach ($row["source"] as $key => $val) {
$target[$key] = $row["target"][$key];
}
$row["target"] = $target;
}
$row["target"] = $target;
if ($jush == "sqlite") {
queries_redirect($location, $message, recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($_POST["drop"] ? "" : " " . format_foreign_key($row)))));
if (JUSH == "sqlite") {
$result = recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($row["drop"] ? "" : " " . format_foreign_key($row))));
} else {
$alter = "ALTER TABLE " . table($TABLE);
$drop = "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name);
if ($_POST["drop"]) {
query_redirect($alter . $drop, $location, $message);
} else {
query_redirect($alter . ($name != "" ? "$drop," : "") . "\nADD" . format_foreign_key($row), $location, $message);
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
$result = ($name == "" || queries("$alter DROP " . (JUSH == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name)));
if (!$row["drop"]) {
$result = queries("$alter ADD" . format_foreign_key($row));
}
}
queries_redirect(
ME . "table=" . urlencode($TABLE),
($row["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.'))),
$result
);
if (!$row["drop"]) {
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.'); //! no partitioning
}
}
page_header(lang('Foreign key'), $error, array("table" => $TABLE), h($TABLE));
@@ -46,44 +52,69 @@ if ($_POST) {
$row["table"] = $TABLE;
$row["source"] = array("");
}
$source = array_keys(fields($TABLE)); //! no text and blob
$target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"])));
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
?>
<form action="" method="post">
<p>
<?php if ($row["db"] == "" && $row["ns"] == "") { ?>
<?php echo lang('Target table'); ?>:
<?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?>
<input type="hidden" name="change-js" value="">
<?php
$source = array_keys(fields($TABLE)); //! no text and blob
if ($row["db"] != "") {
connection()->select_db($row["db"]);
}
if ($row["ns"] != "") {
$orig_schema = get_schema();
set_schema($row["ns"]);
}
$referencable = array_keys(array_filter(table_status('', true), 'Adminer\fk_support'));
$target = array_keys(fields(in_array($row["table"], $referencable) ? $row["table"] : reset($referencable)));
$onchange = "this.form['change-js'].value = '1'; this.form.submit();";
echo "<p><label>" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "</label>\n";
if (support("scheme")) {
$schemas = array_filter(adminer()->schemas(), function ($schema) {
return !preg_match('~^information_schema$~i', $schema);
});
echo "<label>" . lang('Schema') . ": " . html_select("ns", $schemas, $row["ns"] != "" ? $row["ns"] : $_GET["ns"], $onchange) . "</label>";
if ($row["ns"] != "") {
set_schema($orig_schema);
}
} elseif (JUSH != "sqlite") {
$dbs = array();
foreach (adminer()->databases() as $db) {
if (!information_schema($db)) {
$dbs[] = $db;
}
}
echo "<label>" . lang('DB') . ": " . html_select("db", $dbs, $row["db"] != "" ? $row["db"] : $_GET["db"], $onchange) . "</label>";
}
echo input_hidden("change-js");
?>
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0">
<thead><tr><th><?php echo lang('Source'); ?><th><?php echo lang('Target'); ?></thead>
<table>
<thead><tr><th id="label-source"><?php echo lang('Source'); ?><th id="label-target"><?php echo lang('Target'); ?></thead>
<?php
$j = 0;
foreach ($row["source"] as $key => $val) {
echo "<tr>";
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1));
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key]);
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow.call(this);" : ""), "label-source");
echo "<td>" . html_select("target[" . (+$key) . "]", $target, idx($row["target"], $key), "", "label-target");
$j++;
}
?>
</table>
<p>
<?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", $on_actions), $row["on_delete"]); ?>
<?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", $on_actions), $row["on_update"]); ?>
<label><?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", driver()->onActions), $row["on_delete"]); ?></label>
<label><?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", driver()->onActions), $row["on_update"]); ?></label>
<?php echo doc_link(array(
'sql' => "innodb-foreign-key-constraints.html",
'mariadb' => "foreign-keys/",
'pgsql' => "sql-createtable.html#SQL-CREATETABLE-REFERENCES",
'mssql' => "ms174979.aspx",
'oracle' => "clauses002.htm#sthref2903",
'mssql' => "t-sql/statements/create-table-transact-sql",
'oracle' => "SQLRF01111",
)); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
<?php if ($name != "") { ?>
<input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $name)); ?>
<?php } ?>
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php echo input_token(); ?>
</form>

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,5 @@
<?php
$connection = '';
$has_token = $_SESSION["token"];
if (!$has_token) {
$_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery
}
$token = get_token(); ///< @var string CSRF protection
namespace Adminer;
$permanent = array();
if ($_COOKIE["adminer_permanent"]) {
@@ -15,17 +9,21 @@ if ($_COOKIE["adminer_permanent"]) {
}
}
function add_invalid_login() {
global $adminer;
$filename = get_temp_dir() . "/adminer.invalid";
$fp = @fopen($filename, "r+"); // @ - may not exist
if (!$fp) { // c+ is available since PHP 5.2.6
$fp = @fopen($filename, "w"); // @ - may not be writable
if (!$fp) {
return;
function add_invalid_login(): void {
$base = get_temp_dir() . "/adminer.invalid";
// adminer.invalid may not be writable by us, try the files with random suffixes
foreach (glob("$base*") ?: array($base) as $filename) {
$fp = file_open_lock($filename);
if ($fp) {
break;
}
}
flock($fp, LOCK_EX);
if (!$fp) {
$fp = file_open_lock("$base-" . rand_string());
}
if (!$fp) {
return;
}
$invalids = unserialize(stream_get_contents($fp));
$time = time();
if ($invalids) {
@@ -35,27 +33,35 @@ function add_invalid_login() {
}
}
}
$invalid = &$invalids[$adminer->bruteForceKey()];
$invalid = &$invalids[adminer()->bruteForceKey()];
if (!$invalid) {
$invalid = array($time + 30*60, 0); // active for 30 minutes
}
$invalid[1]++;
$serialized = serialize($invalids);
rewind($fp);
fwrite($fp, $serialized);
ftruncate($fp, strlen($serialized));
flock($fp, LOCK_UN);
fclose($fp);
file_write_unlock($fp, serialize($invalids));
}
/** @param string[] $permanent */
function check_invalid_login(array &$permanent): void {
$invalids = array();
foreach (glob(get_temp_dir() . "/adminer.invalid*") as $filename) {
$fp = file_open_lock($filename);
if ($fp) {
$invalids = unserialize(stream_get_contents($fp));
file_unlock($fp);
break;
}
}
/** @var array{int, int} */
$invalid = idx($invalids, adminer()->bruteForceKey(), array());
$next_attempt = ($invalid[1] > 29 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
if ($next_attempt > 0) { //! do the same with permanent login
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)), $permanent);
}
}
$auth = $_POST["auth"];
if ($auth) {
$invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
$invalid = $invalids[$adminer->bruteForceKey()];
$next_attempt = ($invalid[1] > 30 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
if ($next_attempt > 0) { //! do the same with permanent login
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
}
session_regenerate_id(); // defense against session fixation
$vendor = $auth["driver"];
$server = $auth["server"];
@@ -65,12 +71,13 @@ if ($auth) {
set_password($vendor, $server, $username, $password);
$_SESSION["db"][$vendor][$server][$username][$db] = true;
if ($auth["permanent"]) {
$key = base64_encode($vendor) . "-" . base64_encode($server) . "-" . base64_encode($username) . "-" . base64_encode($db);
$private = $adminer->permanentLogin(true);
$key = implode("-", array_map('base64_encode', array($vendor, $server, $username, $db)));
$private = adminer()->permanentLogin(true);
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($password, $private) : "");
cookie("adminer_permanent", implode(" ", $permanent));
}
if (count($_POST) == 1 // 1 - auth
if (
count($_POST) == 1 // 1 - auth
|| DRIVER != $vendor
|| SERVER != $server
|| $_GET["username"] !== $username // "0" == "00"
@@ -78,23 +85,17 @@ if ($auth) {
) {
redirect(auth_url($vendor, $server, $username, $db));
}
} elseif ($_POST["logout"]) {
if ($has_token && !verify_token()) {
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
page_footer("db");
exit;
} else {
foreach (array("pwds", "db", "dbs", "queries") as $key) {
set_session($key, null);
}
unset_permanent();
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
} elseif ($_POST["logout"] && (!$_SESSION["token"] || verify_token())) {
foreach (array("pwds", "db", "dbs", "queries") as $key) {
set_session($key, null);
}
unset_permanent($permanent);
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
} elseif ($permanent && !$_SESSION["pwds"]) {
session_regenerate_id();
$private = $adminer->permanentLogin();
$private = adminer()->permanentLogin();
foreach ($permanent as $key => $val) {
list(, $cipher) = explode(":", $val);
list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
@@ -103,8 +104,10 @@ if ($auth) {
}
}
function unset_permanent() {
global $permanent;
/** Remove credentials from permanent login
* @param string[] $permanent
*/
function unset_permanent(array &$permanent): void {
foreach ($permanent as $key => $val) {
list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
if ($vendor == DRIVER && $server == SERVER && $username == $_GET["username"] && $db == DB) {
@@ -114,65 +117,96 @@ function unset_permanent() {
cookie("adminer_permanent", implode(" ", $permanent));
}
/** Renders an error message and a login form
* @param string plain text
* @return null exits
/** Render an error message and a login form
* @param string $error plain text
* @param string[] $permanent
* @return never
*/
function auth_error($error) {
global $adminer, $has_token;
$error = h($error);
function auth_error(string $error, array &$permanent) {
$session_name = session_name();
if (isset($_GET["username"])) {
header("HTTP/1.1 403 Forbidden"); // 401 requires sending WWW-Authenticate header
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$_SESSION["token"]) {
$error = lang('Session expired, please login again.');
} else {
restart_session();
add_invalid_login();
$password = get_password();
if ($password !== null) {
if ($password === false) {
$error .= '<br>' . lang('Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.', '<code>permanentLogin()</code>');
$error .= ($error ? '<br>' : '') . lang('Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.', target_blank(), '<code>permanentLogin()</code>');
}
set_password(DRIVER, SERVER, $_GET["username"], null);
}
unset_permanent();
unset_permanent($permanent);
}
}
if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_bool("session.use_only_cookies")) {
$error = lang('Session support must be enabled.');
}
$params = session_get_cookie_params();
cookie("adminer_key", ($_COOKIE["adminer_key"] ? $_COOKIE["adminer_key"] : rand_string()), $params["lifetime"]);
cookie("adminer_key", ($_COOKIE["adminer_key"] ?: rand_string()), $params["lifetime"]);
if (!$_SESSION["token"]) {
$_SESSION["token"] = rand(1, 1e6); // this is for next attempt
}
page_header(lang('Login'), $error, null);
echo "<form action='' method='post'>\n";
$adminer->loginForm();
echo "<div>";
hidden_fields($_POST, array("auth")); // expired session
if (hidden_fields($_POST, array("auth"))) { // expired session
echo "<p class='message'>" . lang('The action will be performed after successful login with the same credentials.') . "\n";
}
echo "</div>\n";
adminer()->loginForm();
echo "</form>\n";
page_footer("auth");
exit;
}
if (isset($_GET["username"])) {
if (!class_exists("Min_DB")) {
unset($_SESSION["pwds"][DRIVER]);
unset_permanent();
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
page_footer("auth");
exit;
if (isset($_GET["username"]) && !class_exists('Adminer\Db')) {
unset($_SESSION["pwds"][DRIVER]);
unset_permanent($permanent);
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", Driver::$extensions)), false);
page_footer("auth");
exit;
}
$connection = '';
if (isset($_GET["username"]) && is_string(get_password())) {
list($host, $port) = explode(":", SERVER, 2);
if (preg_match('~^\s*([-+]?\d+)~', $port, $match) && ($match[1] < 1024 || $match[1] > 65535)) { // is_numeric('80#') would still connect to port 80
auth_error(lang('Connecting to privileged ports is not allowed.'), $permanent);
}
check_invalid_login($permanent);
$credentials = adminer()->credentials();
$connection = Driver::connect($credentials[0], $credentials[1], $credentials[2]);
if (is_object($connection)) {
Db::$instance = $connection;
Driver::$instance = new Driver($connection);
if ($connection->flavor) {
save_settings(array("vendor-" . DRIVER . "-" . SERVER => get_driver(DRIVER)));
}
}
$connection = connect();
}
$driver = new Min_Driver($connection);
if (!is_object($connection) || !$adminer->login($_GET["username"], get_password())) {
auth_error((is_string($connection) ? $connection : lang('Invalid credentials.')));
$login = null;
if (!is_object($connection) || ($login = adminer()->login($_GET["username"], get_password())) !== true) {
$error = (is_string($connection) ? nl_br(h($connection)) : (is_string($login) ? $login : lang('Invalid credentials.')))
. (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : '');
auth_error($error, $permanent);
}
if ($_POST["logout"] && $_SESSION["token"] && !verify_token()) {
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
page_footer("db");
exit;
}
if (!$_SESSION["token"]) {
$_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery
}
stop_session(true);
if ($auth && $_POST["token"]) {
$_POST["token"] = $token; // reset token after explicit login
$_POST["token"] = get_token(); // reset token after explicit login
}
$error = ''; ///< @var string
@@ -194,7 +228,7 @@ if ($_POST) {
: lang('Invalid CSRF token. Send the form again.') . ' ' . lang('If you did not send this request from Adminer then close this page.')
);
}
} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
// posted form with no data means that post_max_size exceeded because Adminer always sends token at least
$error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");

View File

@@ -1,6 +1,9 @@
<?php
error_reporting(6135); // errors and warnings
namespace Adminer;
include "../adminer/include/version.inc.php";
include "../adminer/include/errors.inc.php";
// this is matched by compile.php
include "../adminer/include/coverage.inc.php";
// disable filter.default
@@ -18,14 +21,25 @@ if (function_exists("mb_internal_encoding")) {
mb_internal_encoding("8bit");
}
include "../adminer/include/functions.inc.php";
include "../adminer/include/html.inc.php";
// used only in compiled file
if (isset($_GET["file"])) {
include "../adminer/file.inc.php";
}
include "../adminer/include/functions.inc.php";
if ($_GET["script"] == "version") {
$filename = get_temp_dir() . "/adminer.version";
@unlink($filename); // it may not be writable by us, @ - it may not exist
$fp = file_open_lock($filename);
if ($fp) {
file_write_unlock($fp, serialize(array("signature" => $_POST["signature"], "version" => $_POST["version"])));
}
exit;
}
global $adminer, $connection, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
// Adminer doesn't use any global variables; they used to be declared here
if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
@@ -33,63 +47,66 @@ if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
$_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
}
$HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
if ($_SERVER["HTTP_X_FORWARDED_PREFIX"]) {
$_SERVER["REQUEST_URI"] = $_SERVER["HTTP_X_FORWARDED_PREFIX"] . $_SERVER["REQUEST_URI"];
}
define('Adminer\HTTPS', ($_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")) || ini_bool("session.cookie_secure")); // session.cookie_secure could be set on HTTP if we are behind a reverse proxy
@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
session_cache_limiter(""); // to allow restarting session and to not send Cache-Control: no-store
@ini_set("session.use_trans_sid", '0'); // protect links in export, @ - may be disabled
if (!defined("SID")) {
session_cache_limiter(""); // to allow restarting session
session_name("adminer_sid"); // use specific session name to get own namespace
$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
$params[] = true; // HttpOnly
}
call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled
session_set_cookie_params(0, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", HTTPS, true); // ini_set() may be disabled
session_start();
}
// disable magic quotes to be able to use database escaping function
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
if (get_magic_quotes_runtime()) {
if (function_exists("get_magic_quotes_runtime") && get_magic_quotes_runtime()) {
set_magic_quotes_runtime(false);
}
@set_time_limit(0); // @ - can be disabled
@ini_set("zend.ze1_compatibility_mode", false); // @ - deprecated
@ini_set("precision", 20); // @ - can be disabled
@ini_set("precision", '15'); // @ - can be disabled, 15 - internal PHP precision
include "../adminer/include/lang.inc.php";
include "../adminer/lang/$LANG.inc.php";
include "../adminer/lang/" . LANG . ".inc.php";
include "../adminer/include/db.inc.php";
include "../adminer/include/pdo.inc.php";
include "../adminer/include/driver.inc.php";
include "../adminer/drivers/sqlite.inc.php";
include "../adminer/drivers/pgsql.inc.php";
include "../adminer/drivers/oracle.inc.php";
include "../adminer/drivers/mssql.inc.php";
include "../adminer/drivers/firebird.inc.php";
include "../adminer/drivers/simpledb.inc.php";
include "../adminer/drivers/mongo.inc.php";
include "../adminer/drivers/elastic.inc.php";
include "./include/adminer.inc.php";
include "../adminer/include/plugins.inc.php";
include "../adminer/include/plugin.inc.php";
Adminer::$instance =
(function_exists('adminer_object') ? adminer_object() :
(is_dir("adminer-plugins") || file_exists("adminer-plugins.php") ? new Plugins(null) :
new Adminer
));
// this is matched by compile.php
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
define("DB", $_GET["db"]); // for the sake of speed and size
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?'
. (sid() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
. (DB != "" ? 'db=' . urlencode(DB) . '&' . (isset($_GET["ns"]) ? "ns=" . urlencode($_GET["ns"]) . "&" : "") : '')
define('Adminer\JUSH', Driver::$jush);
define('Adminer\SERVER', $_GET[DRIVER]); // read from pgsql=localhost, '' means default server, null means no server
define('Adminer\DB', "$_GET[db]"); // for the sake of speed and size
define(
'Adminer\ME',
preg_replace('~\?.*~', '', relative_uri()) . '?'
. (sid() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. ($_GET["ext"] ? "ext=" . urlencode($_GET["ext"]) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
. (DB != "" ? 'db=' . urlencode(DB) . '&' . (isset($_GET["ns"]) ? "ns=" . urlencode($_GET["ns"]) . "&" : "") : '')
);
include "../adminer/include/version.inc.php";
include "./include/adminer.inc.php";
include "../adminer/include/design.inc.php";
include "../adminer/include/xxtea.inc.php";
include "../adminer/include/auth.inc.php";
if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
}
include "./include/editing.inc.php";
include "./include/connect.inc.php";
$on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys()
adminer()->afterConnect();

View File

@@ -1,73 +1,5 @@
<?php
function connect_error() {
global $adminer, $connection, $token, $error, $drivers;
if (DB != "") {
header("HTTP/1.1 404 Not Found");
page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true);
} else {
if ($_POST["db"] && !$error) {
queries_redirect(substr(ME, 0, -1), lang('Databases have been dropped.'), drop_databases($_POST["db"]));
}
page_header(lang('Select database'), $error, false);
echo "<p class='links'>\n";
foreach (array(
'database' => lang('Create new database'),
'privileges' => lang('Privileges'),
'processlist' => lang('Process list'),
'variables' => lang('Variables'),
'status' => lang('Status'),
) as $key => $val) {
if (support($key)) {
echo "<a href='" . h(ME) . "$key='>$val</a>\n";
}
}
echo "<p>" . lang('%s version: %s through PHP extension %s', $drivers[DRIVER], "<b>" . h($connection->server_info) . "</b>", "<b>$connection->extension</b>") . "\n";
echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
$databases = $adminer->databases();
if ($databases) {
$scheme = support("scheme");
$collations = collations();
echo "<form action='' method='post'>\n";
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo "<thead><tr>"
. (support("database") ? "<td>&nbsp;" : "")
. "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
. "<td>" . lang('Collation')
. "<td>" . lang('Tables')
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1' onclick=\"return !ajaxSetHtml('" . js_escape(ME) . "script=connect');\">" . lang('Compute') . "</a>"
. "</thead>\n"
;
$databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
foreach ($databases as $db => $tables) {
$root = h(ME) . "db=" . urlencode($db);
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])) : "");
echo "<th><a href='$root'>" . h($db) . "</a>";
$collation = nbsp(db_collation($db, $collations));
echo "<td>" . (support("database") ? "<a href='$root" . ($scheme ? "&amp;ns=" : "") . "&amp;database=' title='" . lang('Alter database') . "'>$collation</a>" : $collation);
echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
echo "\n";
}
echo "</table>\n";
echo (support("database")
? "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
. "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^db/));\">\n" // used by trCheck()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n"
. "</div></fieldset>\n"
: ""
);
echo "<script type='text/javascript'>tableCheck();</script>\n";
echo "<input type='hidden' name='token' value='$token'>\n";
echo "</form>\n";
}
}
page_footer("db");
}
namespace Adminer;
if (isset($_GET["status"])) {
$_GET["variables"] = $_GET["status"];
@@ -76,23 +8,125 @@ if (isset($_GET["import"])) {
$_GET["sql"] = $_GET["import"];
}
if (!(DB != "" ? $connection->select_db(DB) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["variables"]) || $_GET["script"] == "connect" || $_GET["script"] == "kill")) {
if (
!(DB != ""
? connection()->select_db(DB)
: isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["variables"])
|| $_GET["script"] == "connect" || $_GET["script"] == "kill"
)
) {
if (DB != "" || $_GET["refresh"]) {
restart_session();
set_session("dbs", null);
}
connect_error(); // separate function to catch SQLite error
if (DB != "") {
header("HTTP/1.1 404 Not Found");
page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true);
} else {
if ($_POST["db"] && !$error) {
queries_redirect(substr(ME, 0, -1), lang('Databases have been dropped.'), drop_databases($_POST["db"]));
}
page_header(lang('Select database'), $error, false);
echo "<p class='links'>\n";
foreach (
array(
'database' => lang('Create database'),
'privileges' => lang('Privileges'),
'processlist' => lang('Process list'),
'variables' => lang('Variables'),
'status' => lang('Status'),
) as $key => $val
) {
if (support($key)) {
echo "<a href='" . h(ME) . "$key='>$val</a>\n";
}
}
echo "<p>" . lang('%s version: %s through PHP extension %s', get_driver(DRIVER), "<b>" . h(connection()->server_info) . "</b>", "<b>" . connection()->extension . "</b>") . "\n";
echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
$databases = adminer()->databases();
if ($databases) {
$scheme = support("scheme");
$collations = collations();
echo "<form action='' method='post'>\n";
echo "<table class='checkable odds'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo "<thead><tr>"
. (support("database") ? "<td>" : "")
. "<th>" . lang('Database') . (get_session("dbs") !== null ? " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>" : "")
. "<td>" . lang('Collation')
. "<td>" . lang('Tables')
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1'>" . lang('Compute') . "</a>" . script("qsl('a').onclick = partial(ajaxSetHtml, '" . js_escape(ME) . "script=connect');", "")
. "</thead>\n"
;
$databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
foreach ($databases as $db => $tables) {
$root = h(ME) . "db=" . urlencode($db);
$id = h("Db-" . $db);
echo "<tr>" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]), "", "", "", $id) : "");
echo "<th><a href='$root' id='$id'>" . h($db) . "</a>";
$collation = h(db_collation($db, $collations));
echo "<td>" . (support("database") ? "<a href='$root" . ($scheme ? "&amp;ns=" : "") . "&amp;database=' title='" . lang('Alter database') . "'>$collation</a>" : $collation);
echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
echo "\n";
}
echo "</table>\n";
echo (support("database")
? "<div class='footer'><div>\n"
. "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
. input_hidden("all") . script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^db/)); };") // used by trCheck()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n"
. "</div></fieldset>\n"
. "</div></div>\n"
: ""
);
echo input_token();
echo "</form>\n";
echo script("tableCheck();");
}
if (!empty(adminer()->plugins)) {
echo "<div class='plugins'>\n";
echo "<h3>" . lang('Loaded plugins') . "</h3>\n<ul>\n";
foreach (adminer()->plugins as $plugin) {
$description = (method_exists($plugin, 'description') ? $plugin->description() : "");
if (!$description) {
$reflection = new \ReflectionObject($plugin);
if (preg_match('~^/[\s*]+(.+)~', $reflection->getDocComment(), $match)) {
$description = $match[1];
}
}
$screenshot = (method_exists($plugin, 'screenshot') ? $plugin->screenshot() : "");
echo "<li><b>" . get_class($plugin) . "</b>"
. h($description ? ": $description" : "")
. ($screenshot ? " (<a href='" . h($screenshot) . "'" . target_blank() . ">" . lang('screenshot') . "</a>)" : "")
. "\n"
;
}
echo "</ul>\n";
adminer()->pluginsLinks();
echo "</div>\n";
}
}
page_footer("db");
exit;
}
if (support("scheme") && DB != "" && $_GET["ns"] !== "") {
if (!isset($_GET["ns"])) {
redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema());
}
if (!set_schema($_GET["ns"])) {
header("HTTP/1.1 404 Not Found");
page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true);
page_footer("ns");
exit;
if (support("scheme")) {
if (DB != "" && $_GET["ns"] !== "") {
if (!isset($_GET["ns"])) {
redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema());
}
if (!set_schema($_GET["ns"])) {
header("HTTP/1.1 404 Not Found");
page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true);
page_footer("ns");
exit;
}
}
}

View File

@@ -1,12 +1,14 @@
<?php
namespace Adminer;
// coverage is used in tests and removed in compilation
if (extension_loaded("xdebug") && file_exists(sys_get_temp_dir() . "/adminer_coverage.ser")) {
function save_coverage() {
$coverage_filename = sys_get_temp_dir() . "/adminer_coverage.ser";
if (extension_loaded("xdebug") && file_exists(sys_get_temp_dir() . "/adminer.coverage")) {
function save_coverage(): void {
$coverage_filename = sys_get_temp_dir() . "/adminer.coverage";
$coverage = unserialize(file_get_contents($coverage_filename));
foreach (xdebug_get_code_coverage() as $filename => $lines) {
foreach ($lines as $l => $val) {
if (!$coverage[$filename][$l] || $val > 0) {
if (!idx($coverage[$filename], $l) || $val > 0) {
$coverage[$filename][$l] = $val;
}
}
@@ -14,5 +16,5 @@ if (extension_loaded("xdebug") && file_exists(sys_get_temp_dir() . "/adminer_cov
}
}
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
register_shutdown_function('save_coverage');
register_shutdown_function('Adminer\save_coverage');
}

View File

@@ -0,0 +1,56 @@
<?php
namespace Adminer;
// this could be interface when "Db extends \mysqli" can have compatible type declarations (PHP 7)
// interfaces can include properties only since PHP 8.4
abstract class SqlDb {
/** @var Db */ static $instance;
/** @var string */ public $extension; // extension name
/** @var string */ public $flavor = ''; // different vendor with the same API, e.g. MariaDB; usually stays empty
/** @var string */ public $server_info; // server version
/** @var int */ public $affected_rows = 0; // number of affected rows
/** @var string */ public $info = ''; // see https://php.net/mysql_info
/** @var int */ public $errno = 0; // last error code
/** @var string */ public $error = ''; // last error message
/** @var Result|bool */ protected $multi; // used for multiquery
/** Connect to server
* @return string error message
*/
abstract function attach(?string $server, string $username, string $password): string;
/** Quote string to use in SQL
* @return string escaped string enclosed in '
*/
abstract function quote(string $string): string;
/** Select database
* @return bool boolish
*/
abstract function select_db(string $database);
/** Send query
* @return Result|bool
*/
abstract function query(string $query, bool $unbuffered = false);
/** Send query with more resultsets
* @return Result|bool
*/
function multi_query(string $query) {
return $this->multi = $this->query($query);
}
/** Get current resultset
* @return Result|bool
*/
function store_result() {
return $this->multi;
}
/** Fetch next resultset */
function next_result(): bool {
return false;
}
}

View File

@@ -1,69 +1,115 @@
<?php
namespace Adminer;
/** Print HTML header
* @param string used in title, breadcrumb and heading, should be HTML escaped
* @param string
* @param mixed array("key" => "link", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server
* @param string used after colon in title and heading, should be HTML escaped
* @return null
* @param string $title used in title, breadcrumb and heading, should be HTML escaped
* @param mixed $breadcrumb ["key" => "link", "key2" => ["link", "desc"]], null for nothing, false for driver only, true for driver and server
* @param string $title2 used after colon in title and heading, should be HTML escaped
*/
function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
global $LANG, $VERSION, $adminer, $drivers, $jush;
function page_header(string $title, string $error = "", $breadcrumb = array(), string $title2 = ""): void {
page_headers();
if (is_ajax() && $error) {
page_messages($error);
exit;
}
if (!ob_get_level()) {
ob_start('ob_gzhandler', 4096);
}
$title_all = $title . ($title2 != "" ? ": $title2" : "");
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . adminer()->name());
// initial-scale=1 is the default but Chrome 134 on iOS is not able to zoom out without it
?>
<!DOCTYPE html>
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
<html lang="<?php echo LANG; ?>" dir="<?php echo lang('ltr'); ?>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="robots" content="noindex">
<meta name="referrer" content="origin-when-crossorigin">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><?php echo $title_page; ?></title>
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
<script type="text/javascript" src="../adminer/static/functions.js"></script>
<script type="text/javascript" src="static/editing.js"></script>
<?php if ($adminer->head()) { ?>
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
<?php if (file_exists("adminer.css")) { ?>
<link rel="stylesheet" type="text/css" href="adminer.css">
<?php } ?>
<?php } ?>
<body class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onclick="bodyClick(event);"<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " onload=\"verifyVersion('$VERSION');\""); ?>>
<script type="text/javascript">
document.body.className = document.body.className.replace(/ nojs/, ' js');
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
</script>
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden" onmouseover="helpOpen = 1;" onmouseout="helpMouseout(this, event);"></div>
<div id="content">
<link rel="stylesheet" href="../adminer/static/default.css">
<?php
$css = adminer()->css();
if (is_int(key($css))) { // legacy return value
$css = array_fill_keys($css, 'light');
}
$has_light = in_array('light', $css) || in_array('', $css);
$has_dark = in_array('dark', $css) || in_array('', $css);
$dark = ($has_light
? ($has_dark ? null : false) // both styles - autoswitching, only adminer.css - light
: ($has_dark ?: null) // only adminer-dark.css - dark, neither - autoswitching
);
$media = " media='(prefers-color-scheme: dark)'";
if ($dark !== false) {
echo "<link rel='stylesheet'" . ($dark ? "" : $media) . " href='../adminer/static/dark.css'>\n";
}
echo "<meta name='color-scheme' content='" . ($dark === null ? "light dark" : ($dark ? "dark" : "light")) . "'>\n";
// this is matched by compile.php
echo script_src("../adminer/static/functions.js");
echo script_src("static/editing.js");
if (adminer()->head($dark)) {
echo "<link rel='icon' href='data:image/gif;base64,R0lGODlhEAAQAJEAAAQCBPz+/PwCBAROZCH5BAEAAAAALAAAAAAQABAAAAI2hI+pGO1rmghihiUdvUBnZ3XBQA7f05mOak1RWXrNq5nQWHMKvuoJ37BhVEEfYxQzHjWQ5qIAADs='>\n";
echo "<link rel='apple-touch-icon' href='../adminer/static/logo.png'>\n";
}
foreach ($css as $url => $mode) {
$attrs = ($mode == 'dark' && !$dark
? $media
: ($mode == 'light' && $has_dark ? " media='(prefers-color-scheme: light)'" : "")
);
echo "<link rel='stylesheet'$attrs href='" . h($url) . "'>\n";
}
echo "\n<body class='" . lang('ltr') . " nojs";
adminer()->bodyClass();
echo "'>\n";
$filename = get_temp_dir() . "/adminer.version";
if (!$_COOKIE["adminer_version"] && function_exists('openssl_verify') && file_exists($filename) && filemtime($filename) + 86400 > time()) { // 86400 - 1 day in seconds
$version = unserialize(file_get_contents($filename));
$public = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK
RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs
DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8
h7FIx3jEaw5ckVPVTeo5JRm/1DZzJxjyDenXvBQ/6o9DgZKeNDgxwKzH+sw9/YCO
jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B
nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ
fQIDAQAB
-----END PUBLIC KEY-----
";
if (openssl_verify($version["version"], base64_decode($version["signature"]), $public) == 1) {
$_COOKIE["adminer_version"] = $version["version"]; // doesn't need to send to the browser
}
}
echo script("mixin(document.body, {onkeydown: bodyKeydown, onclick: bodyClick"
. (isset($_COOKIE["adminer_version"]) ? "" : ", onload: partial(verifyVersion, '" . VERSION . "', '" . js_escape(ME) . "', '" . get_token() . "')")
. "});
document.body.classList.replace('nojs', 'js');
const offlineMessage = '" . js_escape(lang('You are offline.')) . "';
const thousandsSeparator = '" . js_escape(lang(',')) . "';")
;
echo "<div id='help' class='jush-" . JUSH . " jsonly hidden'></div>\n";
echo script("mixin(qs('#help'), {onmouseover: () => { helpOpen = 1; }, onmouseout: helpMouseout});");
echo "<div id='content'>\n";
echo "<span id='menuopen' class='jsonly'>" . icon("move", "", "menu", "") . "</span>" . script("qs('#menuopen').onclick = event => { qs('#foot').classList.toggle('foot'); event.stopPropagation(); }");
if ($breadcrumb !== null) {
$link = substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1);
echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
echo '<p id="breadcrumb"><a href="' . h($link ?: ".") . '">' . get_driver(DRIVER) . '</a> » ';
$link = substr(preg_replace('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
$server = (SERVER != "" ? h(SERVER) : lang('Server'));
$server = adminer()->serverName(SERVER);
$server = ($server != "" ? $server : lang('Server'));
if ($breadcrumb === false) {
echo "$server\n";
} else {
echo "<a href='" . ($link ? h($link) : ".") . "' accesskey='1' title='Alt+Shift+1'>$server</a> &raquo; ";
echo "<a href='" . h($link) . "' accesskey='1' title='Alt+Shift+1'>$server</a> » ";
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> &raquo; ';
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> » ';
}
if (is_array($breadcrumb)) {
if ($_GET["ns"] != "") {
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> &raquo; ';
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> » ';
}
foreach ($breadcrumb as $key => $val) {
$desc = (is_array($val) ? $val[1] : h($val));
if ($desc != "") {
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> &raquo; ";
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> » ";
}
}
}
@@ -79,59 +125,87 @@ var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
$databases = null;
}
stop_session();
define("PAGE_HEADER", 1);
define('Adminer\PAGE_HEADER', 1);
}
/** Send HTTP headers
* @return null
*/
function page_headers() {
global $adminer;
/** Send HTTP headers */
function page_headers(): void {
header("Content-Type: text/html; charset=utf-8");
header("Cache-Control: no-cache");
if ($adminer->headers()) {
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
header("X-Content-Type-Options: nosniff");
header("Referrer-Policy: origin-when-cross-origin");
foreach (adminer()->csp(csp()) as $csp) {
$header = array();
foreach ($csp as $key => $val) {
$header[] = "$key $val";
}
header("Content-Security-Policy: " . implode("; ", $header));
}
adminer()->headers();
}
/** Print flash and error messages
* @param string
* @return null
/** Get Content Security Policy headers
* @return list<string[]> of arrays with directive name in key, allowed sources in value
*/
function page_messages($error) {
function csp(): array {
return array(
array(
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'", // 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
"connect-src" => "'self'",
"frame-src" => "https://www.adminer.org",
"object-src" => "'none'",
"base-uri" => "'none'",
"form-action" => "'self'",
),
);
}
/** Get a CSP nonce
* @return string Base64 value
*/
function get_nonce(): string {
static $nonce;
if (!$nonce) {
$nonce = base64_encode(rand_string());
}
return $nonce;
}
/** Print flash and error messages */
function page_messages(string $error): void {
$uri = preg_replace('~^[^?]*~', '', $_SERVER["REQUEST_URI"]);
$messages = $_SESSION["messages"][$uri];
$messages = idx($_SESSION["messages"], $uri);
if ($messages) {
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>\n";
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>" . script("messagesPrint();");
unset($_SESSION["messages"][$uri]);
}
if ($error) {
echo "<div class='error'>$error</div>\n";
}
if (adminer()->error) { // separate <div>
echo "<div class='error'>" . adminer()->error . "</div>\n";
}
}
/** Print HTML footer
* @param string "auth", "db", "ns"
* @return null
* @param ''|'auth'|'db'|'ns' $missing
*/
function page_footer($missing = "") {
global $adminer, $token;
?>
</div>
<?php switch_lang(); ?>
<?php if ($missing != "auth") { ?>
function page_footer(string $missing = ""): void {
echo "</div>\n\n<div id='foot' class='foot'>\n<div id='menu'>\n";
adminer()->navigation($missing);
echo "</div>\n";
if ($missing != "auth") {
?>
<form action="" method="post">
<p class="logout">
<span><?php echo h($_GET["username"]) . "\n"; ?></span>
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" id="logout">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</p>
<?php echo input_token(); ?>
</form>
<?php } ?>
<div id="menu">
<?php $adminer->navigation($missing); ?>
</div>
<script type="text/javascript">setupSubmitHighlight(document);</script>
<?php
}
echo "</div>\n\n";
echo script("setupSubmitHighlight(document);");
}

View File

@@ -1,110 +1,295 @@
<?php
namespace Adminer;
/*abstract*/ class Min_SQL {
var $_conn;
/** Create object for performing database operations
* @param Min_DB
/** Add or overwrite a driver */
function add_driver(string $id, string $name): void {
SqlDriver::$drivers[$id] = $name;
}
/** Get driver name */
function get_driver(string $id): ?string {
return SqlDriver::$drivers[$id];
}
abstract class SqlDriver {
/** @var Driver */ static $instance;
/** @var string[] */ static $drivers = array(); // all available drivers
/** @var list<string> */ static $extensions = array(); // possible extensions in the current driver
/** @var string */ static $jush; // JUSH identifier
/** @var Db */ protected $conn;
/** @var int[][] */ protected $types = array(); // [$group => [$type => $maximum_unsigned_length, ...], ...]
/** @var string[] */ public $insertFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit and insert
/** @var string[] */ public $editFunctions = array(); // ["$type|$type2" => "$function/$function2"] functions used in edit only
/** @var list<string> */ public $unsigned = array(); // number variants
/** @var list<string> */ public $operators = array(); // operators used in select
/** @var list<string> */ public $functions = array(); // functions used in select
/** @var list<string> */ public $grouping = array(); // grouping functions used in select
/** @var string */ public $onActions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; // used in foreign_keys()
/** @var list<string> */ public $partitionBy = array(); // supported partitioning types
/** @var string */ public $inout = "IN|OUT|INOUT"; // used in routines
/** @var string */ public $enumLength = "'(?:''|[^'\\\\]|\\\\.)*'"; // regular expression for parsing enum lengths
/** @var list<string> */ public $generated = array(); // allowed types of generated columns
/** Connect to the database
* @return Db|string string for error
*/
function Min_SQL($connection) {
$this->_conn = $connection;
static function connect(?string $server, string $username, string $password) {
$connection = new Db;
return ($connection->attach($server, $username, $password) ?: $connection);
}
/** Select data from table
* @param string
* @param array result of $adminer->selectColumnsProcess()[0]
* @param array result of $adminer->selectSearchProcess()
* @param array result of $adminer->selectColumnsProcess()[1]
* @param array result of $adminer->selectOrderProcess()
* @param int result of $adminer->selectLimitProcess()
* @param int index of page starting at zero
* @param bool whether to print the query
* @return Min_Result
/** Create object for performing database operations */
function __construct(Db $connection) {
$this->conn = $connection;
}
/** Get all types
* @return int[] [$type => $maximum_unsigned_length, ...]
*/
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer, $jush;
function types(): array {
return call_user_func_array('array_merge', array_values($this->types));
}
/** Get structured types
* @return list<string>[]|list<string> [$description => [$type, ...], ...]
*/
function structuredTypes(): array {
return array_map('array_keys', $this->types);
}
/** Get enum values
* @param Field $field
* @return string|void
*/
function enumLength(array $field) {
}
/** Function used to convert the value inputted by user
* @param Field $field
* @return string|void
*/
function unconvertFunction(array $field) {
}
/** Select data from table
* @param list<string> $select result of adminer()->selectColumnsProcess()[0]
* @param list<string> $where result of adminer()->selectSearchProcess()
* @param list<string> $group result of adminer()->selectColumnsProcess()[1]
* @param list<string> $order result of adminer()->selectOrderProcess()
* @param int $limit result of adminer()->selectLimitProcess()
* @param int $page index of page starting at zero
* @param bool $print whether to print the query
* @return Result|false
*/
function select(string $table, array $select, array $where, array $group, array $order = array(), int $limit = 1, ?int $page = 0, bool $print = false) {
$is_group = (count($group) < count($select));
$query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
$query = adminer()->selectQueryBuild($select, $where, $group, $order, $limit, $page);
if (!$query) {
$query = "SELECT" . limit(
($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
($_GET["page"] != "last" && $limit && $group && $is_group && JUSH == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
($where ? "\nWHERE " . implode(" AND ", $where) : "") . ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""),
($limit != "" ? +$limit : null),
$limit,
($page ? $limit * $page : 0),
"\n"
);
}
$start = microtime(true);
$return = $this->_conn->query($query);
$return = $this->conn->query($query);
if ($print) {
echo $adminer->selectQuery($query, format_time($start));
echo adminer()->selectQuery($query, $start, !$return);
}
return $return;
}
/** Delete data from table
* @param string
* @param string " WHERE ..."
* @param int 0 or 1
* @return bool
* @param string $queryWhere " WHERE ..."
* @param int $limit 0 or 1
* @return Result|bool
*/
function delete($table, $queryWhere, $limit = 0) {
function delete(string $table, string $queryWhere, int $limit = 0) {
$query = "FROM " . table($table);
return queries("DELETE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere"));
return queries("DELETE" . ($limit ? limit1($table, $query, $queryWhere) : " $query$queryWhere"));
}
/** Update data in table
* @param string
* @param array escaped columns in keys, quoted data in values
* @param string " WHERE ..."
* @param int 0 or 1
* @param string
* @return bool
* @param string[] $set escaped columns in keys, quoted data in values
* @param string $queryWhere " WHERE ..."
* @param int $limit 0 or 1
* @return Result|bool
*/
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
function update(string $table, array $set, string $queryWhere, int $limit = 0, string $separator = "\n") {
$values = array();
foreach ($set as $key => $val) {
$values[] = "$key = $val";
}
$query = table($table) . " SET$separator" . implode(",$separator", $values);
return queries("UPDATE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere"));
return queries("UPDATE" . ($limit ? limit1($table, $query, $queryWhere, $separator) : " $query$queryWhere"));
}
/** Insert data into table
* @param string
* @param array escaped columns in keys, quoted data in values
* @return bool
* @param string[] $set escaped columns in keys, quoted data in values
* @return Result|bool
*/
function insert($table, $set) {
function insert(string $table, array $set) {
return queries("INSERT INTO " . table($table) . ($set
? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")"
: " DEFAULT VALUES"
));
) . $this->insertReturning($table));
}
/** Get RETURNING clause for INSERT queries (PostgreSQL specific) */
function insertReturning(string $table): string {
return "";
}
/** Insert or update data in table
* @param string
* @param array
* @param array of arrays with escaped columns in keys and quoted data in values
* @return bool
* @param list<string[]> $rows of arrays with escaped columns in keys and quoted data in values
* @param int[] $primary column names in keys
* @return Result|bool
*/
/*abstract*/ function insertUpdate($table, $rows, $primary) {
function insertUpdate(string $table, array $rows, array $primary) {
return false;
}
/** Begin transaction
* @return bool
* @return Result|bool
*/
function begin() {
return queries("BEGIN");
}
/** Commit transaction
* @return Result|bool
*/
function commit() {
return queries("COMMIT");
}
/** Rollback transaction
* @return Result|bool
*/
function rollback() {
return queries("ROLLBACK");
}
/** Return query with a timeout
* @param int $timeout seconds
* @return string|void null if the driver doesn't support query timeouts
*/
function slowQuery(string $query, int $timeout) {
}
/** Convert column to be searchable
* @param string $idf escaped column name
* @param array{op:string, val:string} $val
* @param Field $field
*/
function convertSearch(string $idf, array $val, array $field): string {
return $idf;
}
/** Convert value returned by database to actual value
* @param Field $field
*/
function value(?string $val, array $field): ?string {
return (method_exists($this->conn, 'value') ? $this->conn->value($val, $field) : $val);
}
/** Quote binary string */
function quoteBinary(string $s): string {
return q($s);
}
/** Get warnings about the last command
* @return string|void HTML
*/
function warnings() {
}
/** Get help link for table
* @return string|void relative URL
*/
function tableHelp(string $name, bool $is_view = false) {
}
/** Get tables this table inherits from
* @return list<string>
*/
function inheritsFrom(string $table): array {
return array();
}
/** Get inherited tables
* @return list<string>
*/
function inheritedTables(string $table): array {
return array();
}
/** Get partitions info
* @return Partitions
*/
function partitionsInfo(string $table): array {
return array();
}
/** Check if C-style escapes are supported */
function hasCStyleEscapes(): bool {
return false;
}
/** Get supported engines
* @return list<string>
*/
function engines(): array {
return array();
}
/** Check whether table supports indexes
* @param TableStatus $table_status
*/
function supportsIndex(array $table_status): bool {
return !is_view($table_status);
}
/** Return list of supported index algorithms, first one is default
* @param TableStatus $tableStatus
* @return list<string>
*/
function indexAlgorithms(array $tableStatus): array {
return array();
}
/** Get defined check constraints
* @return string[] [$name => $clause]
*/
function checkConstraints(string $table): array {
// MariaDB contains CHECK_CONSTRAINTS.TABLE_NAME, MySQL and PostrgreSQL not
return get_key_vals("SELECT c.CONSTRAINT_NAME, CHECK_CLAUSE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS c
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t ON c.CONSTRAINT_SCHEMA = t.CONSTRAINT_SCHEMA AND c.CONSTRAINT_NAME = t.CONSTRAINT_NAME
WHERE c.CONSTRAINT_SCHEMA = " . q($_GET["ns"] != "" ? $_GET["ns"] : DB) . "
AND t.TABLE_NAME = " . q($table) . "
AND CHECK_CLAUSE NOT LIKE '% IS NOT NULL'", $this->conn); // ignore default IS NOT NULL checks in PostrgreSQL
}
/** Get all fields in the current schema
* @return array<list<array{field:string, null:bool, type:string, length:?numeric-string, primary?:numeric-string}>>
*/
function allFields(): array {
$return = array();
if (DB != "") {
foreach (
get_rows("SELECT TABLE_NAME AS tab, COLUMN_NAME AS field, IS_NULLABLE AS nullable, DATA_TYPE AS type, CHARACTER_MAXIMUM_LENGTH AS length" . (JUSH == 'sql' ? ", COLUMN_KEY = 'PRI' AS `primary`" : "") . "
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = " . q($_GET["ns"] != "" ? $_GET["ns"] : DB) . "
ORDER BY TABLE_NAME, ORDINAL_POSITION", $this->conn) as $row
) {
$row["null"] = ($row["nullable"] == "YES");
$return[$row["tab"]][] = $row;
}
}
return $return;
}
}

View File

@@ -1,33 +1,37 @@
<?php
namespace Adminer;
// This file is not used in Adminer Editor.
/** Print select result
* @param Min_Result
* @param Min_DB connection to examine indexes
* @param array
* @param int
* @return array $orgtables
* @param Result $result
* @param string[] $orgtables
* @param int|numeric-string $limit
* @return string[] $orgtables
*/
function select($result, $connection2 = null, $orgtables = array(), $limit = 0) {
global $jush;
function print_select_result($result, ?Db $connection2 = null, array $orgtables = array(), $limit = 0): array {
$links = array(); // colno => orgtable - create links from these columns
$indexes = array(); // orgtable => array(column => colno) - primary keys
$columns = array(); // orgtable => array(column => ) - not selected columns in primary key
$blobs = array(); // colno => bool - display bytes for blobs
$types = array(); // colno => type - display char in <code>
$return = array(); // table => orgtable - mapping to use in EXPLAIN
odd(''); // reset odd for each result
for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
if (!$i) {
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<div class='scrollable'>\n";
echo "<table class='nowrap odds'>\n";
echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) {
$field = $result->fetch_field();
$name = $field->name;
$orgtable = $field->orgtable;
$orgname = $field->orgname;
$return[$field->table] = $orgtable;
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$orgtable = (isset($field->orgtable) ? $field->orgtable : "");
$orgname = (isset($field->orgname) ? $field->orgname : $name);
if ($orgtables && JUSH == "sql") { // MySQL EXPLAIN
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
} elseif ($orgtable != "") {
if (isset($field->table)) {
$return[$field->table] = $orgtable;
}
if (!isset($indexes[$orgtable])) {
// find primary key in each table
$indexes[$orgtable] = array();
@@ -50,49 +54,55 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
}
$types[$j] = $field->type;
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name)
. ($orgtables ? doc_link(array('sql' => "explain-output.html#explain_" . strtolower($name))) : "")
. ($orgtables ? doc_link(array(
'sql' => "explain-output.html#explain_" . strtolower($name),
'mariadb' => "explain/#the-columns-in-explain-select",
)) : "")
;
}
echo "</thead>\n";
}
echo "<tr" . odd() . ">";
echo "<tr>";
foreach ($row as $key => $val) {
$link = "";
if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($orgtables && JUSH == "sql") { // MySQL EXPLAIN
$table = $row[array_search("table=", $links)];
$link = ME . $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
} else {
$link = ME . "edit=" . urlencode($links[$key]);
foreach ($indexes[$links[$key]] as $col => $j) {
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
}
}
} elseif (is_url($val)) {
$link = $val;
}
if ($val === null) {
$val = "<i>NULL</i>";
} elseif ($blobs[$key] && !is_utf8($val)) {
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
} elseif (!strlen($val)) { // strlen - SQLite can return int
$val = "&nbsp;"; // some content to print a border
} else {
$val = h($val);
if ($types[$key] == 254) { // 254 - char
$val = "<code>$val</code>";
}
}
if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$table = $row[array_search("table=", $links)];
$link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
} else {
$link = "edit=" . urlencode($links[$key]);
foreach ($indexes[$links[$key]] as $col => $j) {
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
}
}
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
if ($link) {
$val = "<a href='" . h($link) . "'" . (is_url($link) ? target_blank() : '') . ">$val</a>";
}
echo "<td>$val";
// https://dev.mysql.com/doc/dev/mysql-server/latest/field__types_8h.html
echo "<td" . ($types[$key] <= 9 || $types[$key] == 246 ? " class='number'" : "") . ">$val";
}
}
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
echo ($i ? "</table>\n</div>" : "<p class='message'>" . lang('No rows.')) . "\n";
return $return;
}
/** Get referencable tables with single column primary key except self
* @param string
* @return array ($table_name => $field)
* @return array<string, Field> [$table_name => $field]
*/
function referencable_primary($self) {
function referencable_primary(string $self): array {
$return = array(); // table_name => field
foreach (table_status('', true) as $table_name => $table) {
if ($table_name != $self && fk_support($table)) {
@@ -111,15 +121,10 @@ function referencable_primary($self) {
}
/** Print SQL <textarea> tag
* @param string
* @param string or array in which case [0] of every element is used
* @param int
* @param int
* @return null
* @param string|list<array{string}> $value
*/
function textarea($name, $value, $rows = 10, $cols = 80) {
global $jush;
echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea jush-$jush' spellcheck='false' wrap='off'>";
function textarea(string $name, $value, int $rows = 10, int $cols = 80): void {
echo "<textarea name='" . h($name) . "' rows='$rows' cols='$cols' class='sqlarea jush-" . JUSH . "' spellcheck='false' wrap='off'>";
if (is_array($value)) {
foreach ($value as $val) { // not implode() to save memory
echo h($val[0]) . "\n\n\n"; // $val == array($query, $time, $elapsed)
@@ -130,39 +135,75 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
echo "</textarea>";
}
/** Print table columns for type edit
* @param string
* @param array
* @param array
* @param array returned by referencable_primary()
* @return null
/** Generate HTML <select> or <input> if $options are empty
* @param string[] $options
*/
function edit_type($key, $field, $collations, $foreign_keys = array()) {
global $structured_types, $types, $unsigned, $on_actions;
$type = $field["type"];
?>
<td><select name="<?php echo $key; ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"<?php echo on_help("getTarget(event).value", 1); ?>><?php
if ($type && !isset($types[$type]) && !isset($foreign_keys[$type])) {
array_unshift($structured_types, $type);
}
if ($foreign_keys) {
$structured_types[lang('Foreign keys')] = $foreign_keys;
}
echo optionlist($structured_types, $type);
?></select>
<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); ?> onchange="editingLengthChange(this);" onkeyup="this.onchange();"><td class="options"><?php //! type="number" with enabled JavaScript
echo "<select name='$key" . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$type || preg_match('~((^|[^o])int|float|double|decimal)$~', $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='$key" . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
echo ($foreign_keys ? "<select name='$key" . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
function select_input(string $attrs, array $options, ?string $value = "", string $onchange = "", string $placeholder = ""): string {
$tag = ($options ? "select" : "input");
return "<$tag$attrs" . ($options
? "><option value=''>$placeholder" . optionlist($options, $value, true) . "</select>"
: " size='10' value='" . h($value) . "' placeholder='$placeholder'>"
) . ($onchange ? script("qsl('$tag').onchange = $onchange;", "") : ""); //! use oninput for input
}
/** Filter length value including enums
* @param string
* @return string
/** Print one row in JSON object
* @param string $key or "" to close the object
* @param string|int $val
*/
function process_length($length) {
global $enum_length;
function json_row(string $key, $val = null, bool $escape = true): void {
static $first = true;
if ($first) {
echo "{";
}
if ($key != "") {
echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\t\"\\/") . '": ' . ($val !== null ? ($escape ? '"' . addcslashes($val, "\r\n\"\\/") . '"' : $val) : 'null');
$first = false;
} else {
echo "\n}\n";
$first = true;
}
}
/** Print table columns for type edit
* @param Field $field
* @param list<string> $collations
* @param string[] $foreign_keys
* @param list<string> $extra_types extra types to prepend
*/
function edit_type(string $key, array $field, array $collations, array $foreign_keys = array(), array $extra_types = array()): void {
$type = $field["type"];
echo "<td><select name='" . h($key) . "[type]' class='type' aria-labelledby='label-type'>";
if ($type && !array_key_exists($type, driver()->types()) && !isset($foreign_keys[$type]) && !in_array($type, $extra_types)) {
$extra_types[] = $type;
}
$structured_types = driver()->structuredTypes();
if ($foreign_keys) {
$structured_types[lang('Foreign keys')] = $foreign_keys;
}
echo optionlist(array_merge($extra_types, $structured_types), $type);
echo "</select><td>";
echo "<input name='" . h($key) . "[length]' value='" . h($field["length"]) . "' size='3'"
. (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : "") //! type="number" with enabled JavaScript
. " aria-labelledby='label-length'>";
echo "<td class='options'>";
echo ($collations
? "<input list='collations' name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . " value='" . h($field["collation"]) . "' placeholder='(" . lang('collation') . ")'>"
: ''
);
echo (driver()->unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match(number_type(), $type) ? "" : " class='hidden'") . '><option>' . optionlist(driver()->unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>'
. optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? "CURRENT_TIMESTAMP" : $field["on_update"]))
. '</select>' : ''
);
echo ($foreign_keys
? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", driver()->onActions), $field["on_delete"]) . "</select> "
: " " // space for IE
);
}
/** Filter length value including enums */
function process_length(?string $length): string {
$enum_length = driver()->enumLength;
return (preg_match("~^\\s*\\(?\\s*$enum_length(?:\\s*,\\s*$enum_length)*+\\s*\\)?\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches)
? "(" . implode(",", $matches[0]) . ")"
: preg_replace('~^[0-9].*~', '(\0)', preg_replace('~[^-0-9,+()[\]]~', '', $length))
@@ -170,54 +211,64 @@ function process_length($length) {
}
/** Create SQL string from field type
* @param array
* @param string
* @return string
* @param FieldType $field
*/
function process_type($field, $collate = "COLLATE") {
global $unsigned;
function process_type(array $field, string $collate = "COLLATE"): string {
return " $field[type]"
. process_length($field["length"])
. (preg_match('~(^|[^o])int|float|double|decimal~', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
. (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
. (preg_match(number_type(), $field["type"]) && in_array($field["unsigned"], driver()->unsigned) ? " $field[unsigned]" : "")
. (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . (JUSH == "mssql" ? $field["collation"] : q($field["collation"])) : "")
;
}
/** Create SQL string from field
* @param array basic field information
* @param array information about field type
* @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT")
* @param Field $field basic field information
* @param Field $type_field information about field type
* @return list<string> ["field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT"]
*/
function process_field($field, $type_field) {
global $jush;
$default = $field["default"];
function process_field(array $field, array $type_field): array {
// MariaDB exports CURRENT_TIMESTAMP as a function.
if ($field["on_update"]) {
$field["on_update"] = str_ireplace("current_timestamp()", "CURRENT_TIMESTAMP", $field["on_update"]);
}
return array(
idf_escape(trim($field["field"])),
process_type($type_field),
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
(isset($default) ? " DEFAULT " . (
(preg_match('~time~', $field["type"]) && preg_match('~^CURRENT_TIMESTAMP$~i', $default))
|| ($jush == "sqlite" && preg_match('~^CURRENT_(TIME|TIMESTAMP|DATE)$~i', $default))
|| ($field["type"] == "bit" && preg_match("~^([0-9]+|b'[0-1]+')\$~", $default))
|| ($jush == "pgsql" && preg_match("~^[a-z]+\\(('[^']*')+\\)\$~", $default))
? $default : q($default)) : ""),
default_value($field),
(preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
($field["auto_increment"] ? auto_increment() : null),
);
}
/** Get type class to use in CSS
* @param string
* @return string class=''
/** Get default value clause
* @param Field $field
*/
function type_class($type) {
foreach (array(
'char' => 'text',
'date' => 'time|year',
'binary' => 'blob',
'enum' => 'set',
) as $key => $val) {
function default_value(array $field): string {
$default = $field["default"];
$generated = $field["generated"];
return ($default === null ? "" : (in_array($generated, driver()->generated)
? (JUSH == "mssql" ? " AS ($default)" . ($generated == "VIRTUAL" ? "" : " $generated") . "" : " GENERATED ALWAYS AS ($default) $generated")
: " DEFAULT " . (!preg_match('~^GENERATED ~i', $default) && (preg_match('~char|binary|text|json|enum|set~', $field["type"]) || preg_match('~^(?![a-z])~i', $default))
? (JUSH == "sql" && preg_match('~text|json~', $field["type"]) ? "(" . q($default) . ")" : q($default)) // MySQL requires () around default value of text column
: str_ireplace("current_timestamp()", "CURRENT_TIMESTAMP", (JUSH == "sqlite" ? "($default)" : $default))
)
));
}
/** Get type class to use in CSS
* @return string|void class=''
*/
function type_class(string $type) {
foreach (
array(
'char' => 'text',
'date' => 'time|year',
'binary' => 'blob',
'enum' => 'set',
) as $key => $val
) {
if (preg_match("~$key|$val~", $type)) {
return " class='$key'";
}
@@ -225,72 +276,72 @@ function type_class($type) {
}
/** Print table interior for fields editing
* @param array
* @param array
* @param string TABLE or PROCEDURE
* @param array returned by referencable_primary()
* @param bool display comments column
* @return null
* @param (Field|RoutineField)[] $fields
* @param list<string> $collations
* @param 'TABLE'|'PROCEDURE' $type
* @param string[] $foreign_keys
*/
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
global $connection, $inout;
function edit_fields(array $fields, array $collations, $type = "TABLE", array $foreign_keys = array()): void {
$fields = array_values($fields);
?>
<thead><tr class="wrap">
<?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
<th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea>
<td><?php echo lang('Length'); ?>
<td><?php echo lang('Options'); ?>
<?php if ($type == "TABLE") { ?>
<td>NULL
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
'sql' => "example-auto-increment.html",
'sqlite' => "autoinc.html",
'pgsql' => "datatype.html#DATATYPE-SERIAL",
'mssql' => "ms186775.aspx",
)); ?>
<td><?php echo lang('Default value'); ?>
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?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 type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
</thead>
<tbody onkeydown="return editingKeydown(event);">
<?php
$default_class = (($_POST ? $_POST["defaults"] : get_setting("defaults")) ? "" : " class='hidden'");
$comment_class = (($_POST ? $_POST["comments"] : get_setting("comments")) ? "" : " class='hidden'");
echo "<thead><tr>\n";
echo ($type == "PROCEDURE" ? "<td>" : "");
echo "<th id='label-name'>" . ($type == "TABLE" ? lang('Column name') : lang('Parameter name'));
echo "<td id='label-type'>" . lang('Type') . "<textarea id='enum-edit' rows='4' cols='12' wrap='off' style='display: none;'></textarea>" . script("qs('#enum-edit').onblur = editingLengthBlur;");
echo "<td id='label-length'>" . lang('Length');
echo "<td>" . lang('Options'); // no label required, options have their own label
if ($type == "TABLE") {
echo "<td id='label-null'>NULL\n";
echo "<td><input type='radio' name='auto_increment_col' value=''><abbr id='label-ai' title='" . lang('Auto Increment') . "'>AI</abbr>";
echo doc_link(array(
'sql' => "example-auto-increment.html",
'mariadb' => "auto_increment/",
'sqlite' => "autoinc.html",
'pgsql' => "datatype-numeric.html#DATATYPE-SERIAL",
'mssql' => "t-sql/statements/create-table-transact-sql-identity-property",
));
echo "<td id='label-default'$default_class>" . lang('Default value');
echo (support("comment") ? "<td id='label-comment'$comment_class>" . lang('Comment') : "");
}
echo "<td>" . icon("plus", "add[" . (support("move_col") ? 0 : count($fields)) . "]", "+", lang('Add next'));
echo "</thead>\n<tbody>\n";
echo script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");
foreach ($fields as $i => $field) {
$i++;
$orig = $field[($_POST ? "orig" : "field")];
$display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == "");
?>
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="editingNameChange(this);<?php echo ($field["field"] != "" || count($fields) > 1 ? '' : ' editingAddRow(this);" onkeyup="if (this.value) editingAddRow(this);'); ?>" maxlength="64" autocapitalize="off"><?php } ?>
<input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
<?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
<?php if ($type == "TABLE") { ?>
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block"); ?>
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }"></label><td><?php
echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onkeyup="keyupChange.call(this);" onchange="this.previousSibling.checked = true;">
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . ($connection->server_info >= 5.5 ? 1024 : 255) . "'>" : ""); ?>
<?php } ?>
<?php
$display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !idx($_POST["drop_col"], $i))) && (support("drop_col") || $orig == "");
echo "<tr" . ($display ? "" : " style='display: none;'") . ">\n";
echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", driver()->inout), $field["inout"]) : "") . "<th>";
if ($display) {
echo "<input name='fields[$i][field]' value='" . h($field["field"]) . "' data-maxlength='64' autocapitalize='off' aria-labelledby='label-name'>";
}
echo input_hidden("fields[$i][orig]", $orig);
edit_type("fields[$i]", $field, $collations, $foreign_keys);
if ($type == "TABLE") {
echo "<td>" . checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null");
echo "<td><label class='block'><input type='radio' name='auto_increment_col' value='$i'" . ($field["auto_increment"] ? " checked" : "") . " aria-labelledby='label-ai'></label>";
echo "<td$default_class>" . (driver()->generated
? html_select("fields[$i][generated]", array_merge(array("", "DEFAULT"), driver()->generated), $field["generated"]) . " "
: checkbox("fields[$i][generated]", 1, $field["generated"], "", "", "", "label-default")
);
echo "<input name='fields[$i][default]' value='" . h($field["default"]) . "' aria-labelledby='label-default'>";
echo (support("comment") ? "<td$comment_class><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
}
echo "<td>";
echo (support("move_col") ?
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, 1);'>&nbsp;"
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;"
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>&nbsp;"
icon("plus", "add[$i]", "+", lang('Add next')) . " "
. icon("up", "up[$i]", "", lang('Move up')) . " "
. icon("down", "down[$i]", "", lang('Move down')) . " "
: "");
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'fields\$1[field]');\">" : "");
echo "\n";
echo ($orig == "" || support("drop_col") ? icon("cross", "drop_col[$i]", "x", lang('Remove')) : "");
}
}
/** Move fields up and down or add field
* @param array
* @return bool
* @param Field[] $fields
*/
function process_fields(&$fields) {
ksort($fields);
function process_fields(array &$fields): bool {
$offset = 0;
if ($_POST["up"]) {
$last = 0;
@@ -328,21 +379,19 @@ function process_fields(&$fields) {
}
/** Callback used in routine()
* @param array
* @return string
* @param list<string> $match
*/
function normalize_enum($match) {
return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0][0] . $match[0][0], $match[0][0], substr($match[0], 1, -1))), '\\')) . "'";
function normalize_enum(array $match): string {
$val = $match[0];
return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($val[0] . $val[0], $val[0], substr($val, 1, -1))), '\\')) . "'";
}
/** Issue grant or revoke commands
* @param string GRANT or REVOKE
* @param array
* @param string
* @param string
* @return bool
* @param 'GRANT'|'REVOKE' $grant
* @param list<string> $privileges
* @return Result|bool
*/
function grant($grant, $privileges, $columns, $on) {
function grant(string $grant, array $privileges, ?string $columns, string $on) {
if (!$privileges) {
return true;
}
@@ -353,24 +402,18 @@ function grant($grant, $privileges, $columns, $on) {
: queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
);
}
return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
return queries("$grant " . preg_replace('~(GRANT OPTION)\([^)]*\)~', '\1', implode("$columns, ", $privileges) . $columns) . $on);
}
/** Drop old object and create a new one
* @param string drop old object query
* @param string create new object query
* @param string drop new object query
* @param string create test object query
* @param string drop test object query
* @param string
* @param string
* @param string
* @param string
* @param string
* @param string
* @return null redirect in success
* @param string $drop drop old object query
* @param string $create create new object query
* @param string $drop_created drop new object query
* @param string $test create test object query
* @param string $drop_test drop test object query
* @return void redirect on success
*/
function drop_create($drop, $create, $drop_created, $test, $drop_test, $location, $message_drop, $message_alter, $message_create, $old_name, $new_name) {
function drop_create(string $drop, string $create, string $drop_created, string $test, string $drop_test, string $location, string $message_drop, string $message_alter, string $message_create, string $old_name, string $new_name): void {
if ($_POST["drop"]) {
query_redirect($drop, $location, $message_drop);
} elseif ($old_name == "") {
@@ -391,73 +434,67 @@ function drop_create($drop, $create, $drop_created, $test, $drop_test, $location
}
/** Generate SQL query for creating trigger
* @param string
* @param array result of trigger()
* @return string
* @param Trigger $row
*/
function create_trigger($on, $row) {
global $jush;
$timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : "");
function create_trigger(string $on, array $row): string {
$timing_event = " $row[Timing] $row[Event]" . (preg_match('~ OF~', $row["Event"]) ? " $row[Of]" : ""); // SQL injection
return "CREATE TRIGGER "
. idf_escape($row["Trigger"])
. ($jush == "mssql" ? $on . $timing_event : $timing_event . $on)
. (JUSH == "mssql" ? $on . $timing_event : $timing_event . $on)
. rtrim(" $row[Type]\n$row[Statement]", ";")
. ";"
;
}
/** Generate SQL query for creating routine
* @param string "PROCEDURE" or "FUNCTION"
* @param array result of routine()
* @return string
* @param 'PROCEDURE'|'FUNCTION' $routine
* @param Routine $row
*/
function create_routine($routine, $row) {
global $inout;
function create_routine($routine, array $row): string {
$set = array();
$fields = (array) $row["fields"];
ksort($fields); // enforce fields order
foreach ($fields as $field) {
if ($field["field"] != "") {
$set[] = (preg_match("~^($inout)\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
$set[] = (preg_match("~^(" . driver()->inout . ")\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
}
}
$definition = rtrim($row["definition"], ";");
return "CREATE $routine "
. idf_escape(trim($row["name"]))
. " (" . implode(", ", $set) . ")"
. (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
. ($routine == "FUNCTION" ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
. ($row["language"] ? " LANGUAGE $row[language]" : "")
. rtrim("\n$row[definition]", ";")
. ";"
. (JUSH == "pgsql" ? " AS " . q($definition) : "\n$definition;")
;
}
/** Remove current user definer from SQL command
* @param string
* @return string
*/
function remove_definer($query) {
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
/** Remove current user definer from SQL command */
function remove_definer(string $query): string {
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\1)', logged_user()) . '`~', '\1', $query); //! proper escaping of user
}
/** Format foreign key to use in SQL query
* @param array ("table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions)
* @return string
* @param ForeignKey $foreign_key
*/
function format_foreign_key($foreign_key) {
global $on_actions;
return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . table($foreign_key["table"])
. " (" . implode(", ", array_map('idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions
. (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "")
. (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "")
function format_foreign_key(array $foreign_key): string {
$db = $foreign_key["db"];
$ns = $foreign_key["ns"];
return " FOREIGN KEY (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["source"])) . ") REFERENCES "
. ($db != "" && $db != $_GET["db"] ? idf_escape($db) . "." : "")
. ($ns != "" && $ns != $_GET["ns"] ? idf_escape($ns) . "." : "")
. idf_escape($foreign_key["table"])
. " (" . implode(", ", array_map('Adminer\idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions
. (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "")
. (preg_match("~^(" . driver()->onActions . ")\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "")
;
}
/** Add a file to TAR
* @param string
* @param TmpFile
* @return null prints the output
* @param TmpFile $tmp_file
* @return void prints the output
*/
function tar_file($filename, $tmp_file) {
function tar_file(string $filename, $tmp_file): void {
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct($tmp_file->size), decoct(time()));
$checksum = 8*32; // space for checksum itself
for ($i=0; $i < strlen($return); $i++) {
@@ -470,52 +507,47 @@ function tar_file($filename, $tmp_file) {
echo str_repeat("\0", 511 - ($tmp_file->size + 511) % 512);
}
/** Get INI bytes value
* @param string
* @return int
*/
function ini_bytes($ini) {
/** Get INI bytes value */
function ini_bytes(string $ini): int {
$val = ini_get($ini);
switch (strtolower(substr($val, -1))) {
case 'g': $val *= 1024; // no break
case 'm': $val *= 1024; // no break
case 'k': $val *= 1024;
case 'g':
$val = (int) $val * 1024; // no break
case 'm':
$val = (int) $val * 1024; // no break
case 'k':
$val = (int) $val * 1024;
}
return $val;
}
/** Create link to database documentation
* @param array $jush => $path
* @param string[] $paths JUSH => $path
* @param string $text HTML code
* @return string HTML code
*/
function doc_link($paths) {
global $jush, $connection;
function doc_link(array $paths, string $text = "<sup>?</sup>"): string {
$server_info = connection()->server_info;
$version = preg_replace('~^(\d\.?\d).*~s', '\1', $server_info); // two most significant digits
$urls = array(
'sql' => "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/",
'sqlite' => "http://www.sqlite.org/",
'pgsql' => "http://www.postgresql.org/docs/" . substr($connection->server_info, 0, 3) . "/static/",
'mssql' => "http://msdn.microsoft.com/library/",
'oracle' => "http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
'sql' => "https://dev.mysql.com/doc/refman/$version/en/",
'sqlite' => "https://www.sqlite.org/",
'pgsql' => "https://www.postgresql.org/docs/" . (connection()->flavor == 'cockroach' ? "current" : $version) . "/",
'mssql' => "https://learn.microsoft.com/en-us/sql/",
'oracle' => "https://www.oracle.com/pls/topic/lookup?ctx=db" . preg_replace('~^.* (\d+)\.(\d+)\.\d+\.\d+\.\d+.*~s', '\1\2', $server_info) . "&id=",
);
return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]' target='_blank' rel='noreferrer'><sup>?</sup></a>" : "");
}
/** Wrap gzencode() for usage in ob_start()
* @param string
* @return string
*/
function ob_gzencode($string) {
// ob_start() callback recieves an optional parameter $phase but gzencode() accepts optional parameter $level
return gzencode($string);
if (connection()->flavor == 'maria') {
$urls['sql'] = "https://mariadb.com/kb/en/";
$paths['sql'] = (isset($paths['mariadb']) ? $paths['mariadb'] : str_replace(".html", "/", $paths['sql']));
}
return ($paths[JUSH] ? "<a href='" . h($urls[JUSH] . $paths[JUSH] . (JUSH == 'mssql' ? "?view=sql-server-ver$version" : "")) . "'" . target_blank() . ">$text</a>" : "");
}
/** Compute size of database
* @param string
* @return string formatted
*/
function db_size($db) {
global $connection;
if (!$connection->select_db($db)) {
function db_size(string $db): string {
if (!connection()->select_db($db)) {
return "?";
}
$return = 0;
@@ -525,15 +557,11 @@ function db_size($db) {
return format_number($return);
}
/** Print SET NAMES if utf8mb4 might be needed
* @param string
* @return null
*/
function set_utf8mb4($create) {
global $connection;
/** Print SET NAMES if utf8mb4 might be needed */
function set_utf8mb4(string $create): void {
static $set = false;
if (!$set && preg_match('~\butf8mb4~i', $create)) { // possible false positive
$set = true;
echo "SET NAMES " . charset($connection) . ";\n\n";
echo "SET NAMES " . charset(connection()) . ";\n\n";
}
}

View File

@@ -0,0 +1,9 @@
<?php
namespace Adminer;
error_reporting(24575); // all but E_DEPRECATED (overriding mysqli methods without types is deprecated)
set_error_handler(function ($errno, $errstr) {
// "Undefined array key" mutes $_GET["q"] if there's no ?q=
// "Undefined offset" and "Undefined index" are older messages for the same thing
return !!preg_match('~^Undefined (array key|offset|index)~', $errstr);
}, E_WARNING | E_NOTICE); // warning since PHP 8.0

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,486 @@
<?php
namespace Adminer;
/** Return <script> element */
function script(string $source, string $trailing = "\n"): string {
return "<script" . nonce() . ">$source</script>$trailing";
}
/** Return <script src> element */
function script_src(string $url, bool $defer = false): string {
return "<script src='" . h($url) . "'" . nonce() . ($defer ? " defer" : "") . "></script>\n";
}
/** Get a nonce="" attribute with CSP nonce */
function nonce(): string {
return ' nonce="' . get_nonce() . '"';
}
/** Get <input type="hidden">
* @param string|int $value
* @return string HTML
*/
function input_hidden(string $name, $value = ""): string {
return "<input type='hidden' name='" . h($name) . "' value='" . h($value) . "'>\n";
}
/** Get CSRF <input type="hidden" name="token">
* @return string HTML
*/
function input_token(): string {
return input_hidden("token", get_token());
}
/** Get a target="_blank" attribute */
function target_blank(): string {
return ' target="_blank" rel="noreferrer noopener"';
}
/** Escape for HTML */
function h(?string $string): string {
return str_replace("\0", "&#0;", htmlspecialchars($string, ENT_QUOTES, 'utf-8'));
}
/** Convert \n to <br> */
function nl_br(string $string): string {
return str_replace("\n", "<br>", $string); // nl2br() uses XHTML before PHP 5.3
}
/** Generate HTML checkbox
* @param string|int $value
*/
function checkbox(string $name, $value, ?bool $checked, string $label = "", string $onclick = "", string $class = "", string $labelled_by = ""): string {
$return = "<input type='checkbox' name='$name' value='" . h($value) . "'"
. ($checked ? " checked" : "")
. ($labelled_by ? " aria-labelledby='$labelled_by'" : "")
. ">"
. ($onclick ? script("qsl('input').onclick = function () { $onclick };", "") : "")
;
return ($label != "" || $class ? "<label" . ($class ? " class='$class'" : "") . ">$return" . h($label) . "</label>" : $return);
}
/** Generate list of HTML options
* @param string[]|string[][] $options array of strings or arrays (creates optgroup)
* @param mixed $selected
* @param bool $use_keys always use array keys for value="", otherwise only string keys are used
*/
function optionlist($options, $selected = null, bool $use_keys = false): string {
$return = "";
foreach ($options as $k => $v) {
$opts = array($k => $v);
if (is_array($v)) {
$return .= '<optgroup label="' . h($k) . '">';
$opts = $v;
}
foreach ($opts as $key => $val) {
$return .= '<option'
. ($use_keys || is_string($key) ? ' value="' . h($key) . '"' : '')
. ($selected !== null && ($use_keys || is_string($key) ? (string) $key : $val) === $selected ? ' selected' : '')
. '>' . h($val)
;
}
if (is_array($v)) {
$return .= '</optgroup>';
}
}
return $return;
}
/** Generate HTML <select>
* @param string[] $options
*/
function html_select(string $name, array $options, ?string $value = "", string $onchange = "", string $labelled_by = ""): string {
static $label = 0;
$label_option = "";
if (!$labelled_by && substr($options[""], 0, 1) == "(") {
$label++;
$labelled_by = "label-$label";
$label_option = "<option value='' id='$labelled_by'>" . h($options[""]);
unset($options[""]);
}
return "<select name='" . h($name) . "'"
. ($labelled_by ? " aria-labelledby='$labelled_by'" : "")
. ">" . $label_option . optionlist($options, $value) . "</select>"
. ($onchange ? script("qsl('select').onchange = function () { $onchange };", "") : "")
;
}
/** Generate HTML radio list
* @param string[] $options
*/
function html_radios(string $name, array $options, ?string $value = "", string $separator = ""): string {
$return = "";
foreach ($options as $key => $val) {
$return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>$separator";
}
return $return;
}
/** Get onclick confirmation */
function confirm(string $message = "", string $selector = "qsl('input')"): string {
return script("$selector.onclick = () => confirm('" . ($message ? js_escape($message) : lang('Are you sure?')) . "');", "");
}
/** Print header for hidden fieldset (close by </div></fieldset>)
* @param bool $visible
*/
function print_fieldset(string $id, string $legend, $visible = false): void {
echo "<fieldset><legend>";
echo "<a href='#fieldset-$id'>$legend</a>";
echo script("qsl('a').onclick = partial(toggle, 'fieldset-$id');", "");
echo "</legend>";
echo "<div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
}
/** Return class='active' if $bold is true */
function bold(bool $bold, string $class = ""): string {
return ($bold ? " class='active $class'" : ($class ? " class='$class'" : ""));
}
/** Escape string for JavaScript apostrophes */
function js_escape(string $string): string {
return addcslashes($string, "\r\n'\\/"); // slash for <script>
}
/** Generate page number for pagination */
function pagination(int $page, ?int $current): string {
return " " . ($page == $current
? $page + 1
: '<a href="' . h(remove_from_uri("page") . ($page ? "&page=$page" . ($_GET["next"] ? "&next=" . urlencode($_GET["next"]) : "") : "")) . '">' . ($page + 1) . "</a>"
);
}
/** Print hidden fields
* @param mixed[] $process
* @param list<string> $ignore
*/
function hidden_fields(array $process, array $ignore = array(), string $prefix = ''): bool {
$return = false;
foreach ($process as $key => $val) {
if (!in_array($key, $ignore)) {
if (is_array($val)) {
hidden_fields($val, array(), $key);
} else {
$return = true;
echo input_hidden(($prefix ? $prefix . "[$key]" : $key), $val);
}
}
}
return $return;
}
/** Print hidden fields for GET forms */
function hidden_fields_get(): void {
echo (sid() ? input_hidden(session_name(), session_id()) : '');
echo (SERVER !== null ? input_hidden(DRIVER, SERVER) : "");
echo input_hidden("username", $_GET["username"]);
}
/** Print enum or set input field
* @param 'radio'|'checkbox' $type
* @param Field $field
* @param mixed $value string|array
*/
function enum_input(string $type, string $attrs, array $field, $value, ?string $empty = null): string {
preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
$return = ($empty !== null ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === $empty) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
foreach ($matches[1] as $i => $val) {
$val = stripcslashes(str_replace("''", "'", $val));
$checked = (is_array($value) ? in_array($val, $value) : $value === $val);
$return .= " <label><input type='$type'$attrs value='" . h($val) . "'" . ($checked ? ' checked' : '') . '>' . h(adminer()->editVal($val, $field)) . '</label>';
}
return $return;
}
/** Print edit input field
* @param Field|RoutineField $field
* @param mixed $value
*/
function input(array $field, $value, ?string $function, ?bool $autofocus = false): void {
$name = h(bracket_escape($field["field"]));
echo "<td class='function'>";
if (is_array($value) && !$function) {
$value = json_encode($value, 128 | 64 | 256); // 128 - JSON_PRETTY_PRINT, 64 - JSON_UNESCAPED_SLASHES, 256 - JSON_UNESCAPED_UNICODE available since PHP 5.4
$function = "json";
}
$reset = (JUSH == "mssql" && $field["auto_increment"]);
if ($reset && !$_POST["save"]) {
$function = null;
}
$functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + adminer()->editFunctions($field);
$disabled = stripos($field["default"], "GENERATED ALWAYS AS ") === 0 ? " disabled=''" : "";
$attrs = " name='fields[$name]'$disabled" . ($autofocus ? " autofocus" : "");
$enums = driver()->enumLength($field);
if ($enums) {
$field["type"] = "enum";
$field["length"] = $enums;
}
echo driver()->unconvertFunction($field) . " ";
$table = $_GET["edit"] ?: $_GET["select"];
if ($field["type"] == "enum") {
echo h($functions[""]) . "<td>" . adminer()->editInput($table, $field, $attrs, $value);
} else {
$has_function = (in_array($function, $functions) || isset($functions[$function]));
echo (count($functions) > 1
? "<select name='function[$name]'$disabled>" . optionlist($functions, $function === null || $has_function ? $function : "") . "</select>"
. on_help("event.target.value.replace(/^SQL\$/, '')", 1)
. script("qsl('select').onchange = functionChange;", "")
: h(reset($functions))
) . '<td>';
$input = adminer()->editInput($table, $field, $attrs, $value); // usage in call is without a table
if ($input != "") {
echo $input;
} elseif (preg_match('~bool~', $field["type"])) {
echo "<input type='hidden'$attrs value='0'>"
. "<input type='checkbox'" . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? " checked='checked'" : "") . "$attrs value='1'>";
} elseif ($field["type"] == "set") {
preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
foreach ($matches[1] as $i => $val) {
$val = stripcslashes(str_replace("''", "'", $val));
$checked = in_array($val, explode(",", $value), true);
echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . h($val) . "'" . ($checked ? ' checked' : '') . ">" . h(adminer()->editVal($val, $field)) . '</label>';
}
} elseif (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
echo "<input type='file' name='fields-$name'>";
} elseif ($function == "json" || preg_match('~^jsonb?$~', $field["type"])) {
echo "<textarea$attrs cols='50' rows='12' class='jush-js'>" . h($value) . '</textarea>';
} elseif (($text = preg_match('~text|lob|memo~i', $field["type"])) || preg_match("~\n~", $value)) {
if ($text && JUSH != "sqlite") {
$attrs .= " cols='50' rows='12'";
} else {
$rows = min(12, substr_count($value, "\n") + 1);
$attrs .= " cols='30' rows='$rows'";
}
echo "<textarea$attrs>" . h($value) . '</textarea>';
} else {
// int(3) is only a display hint
$types = driver()->types();
$maxlength = (!preg_match('~int~', $field["type"]) && preg_match('~^(\d+)(,(\d+))?$~', $field["length"], $match)
? ((preg_match("~binary~", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0))
: ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0)
);
if (JUSH == 'sql' && min_version(5.6) && preg_match('~time~', $field["type"])) {
$maxlength += 7; // microtime
}
// type='date' and type='time' display localized value which may be confusing, type='datetime' uses 'T' as date and time separator
echo "<input"
. ((!$has_function || $function === "") && preg_match('~(?<!o)int(?!er)~', $field["type"]) && !preg_match('~\[\]~', $field["full_type"]) ? " type='number'" : "")
. " value='" . h($value) . "'" . ($maxlength ? " data-maxlength='$maxlength'" : "")
. (preg_match('~char|binary~', $field["type"]) && $maxlength > 20 ? " size='" . ($maxlength > 99 ? 60 : 40) . "'" : "")
. "$attrs>"
;
}
echo adminer()->editHint($table, $field, $value);
// skip 'original'
$first = 0;
foreach ($functions as $key => $val) {
if ($key === "" || !$val) {
break;
}
$first++;
}
if ($first && count($functions) > 1) {
echo script("qsl('td').oninput = partial(skipOriginal, $first);");
}
}
}
/** Process edit input field
* @param Field|RoutineField $field
* @return mixed false to leave the original value
*/
function process_input(array $field) {
if (stripos($field["default"], "GENERATED ALWAYS AS ") === 0) {
return;
}
$idf = bracket_escape($field["field"]);
$function = idx($_POST["function"], $idf);
$value = $_POST["fields"][$idf];
if ($field["type"] == "enum" || driver()->enumLength($field)) {
if ($value == -1) {
return false;
}
if ($value == "") {
return "NULL";
}
}
if ($field["auto_increment"] && $value == "") {
return null;
}
if ($function == "orig") {
return (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? idf_escape($field["field"]) : false);
}
if ($function == "NULL") {
return "NULL";
}
if ($field["type"] == "set") {
$value = implode(",", (array) $value);
}
if ($function == "json") {
$function = "";
$value = json_decode($value, true);
if (!is_array($value)) {
return false; //! report errors
}
return $value;
}
if (preg_match('~blob|bytea|raw|file~', $field["type"]) && ini_bool("file_uploads")) {
$file = get_file("fields-$idf");
if (!is_string($file)) {
return false; //! report errors
}
return driver()->quoteBinary($file);
}
return adminer()->processInput($field, $value, $function);
}
/** Print results of search in all tables
* @uses $_GET["where"][0]
* @uses $_POST["tables"]
*/
function search_tables(): void {
$_GET["where"][0]["val"] = $_POST["query"];
$sep = "<ul>\n";
foreach (table_status('', true) as $table => $table_status) {
$name = adminer()->tableName($table_status);
if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) {
$result = connection()->query("SELECT" . limit("1 FROM " . table($table), " WHERE " . implode(" AND ", adminer()->selectSearchProcess(fields($table), array())), 1));
if (!$result || $result->fetch_row()) {
$print = "<a href='" . h(ME . "select=" . urlencode($table) . "&where[0][op]=" . urlencode($_GET["where"][0]["op"]) . "&where[0][val]=" . urlencode($_GET["where"][0]["val"])) . "'>$name</a>";
echo "$sep<li>" . ($result ? $print : "<p class='error'>$print: " . error()) . "\n";
$sep = "";
}
}
}
echo ($sep ? "<p class='message'>" . lang('No tables.') : "</ul>") . "\n";
}
/** Return events to display help on mouse over
* @param string $command JS expression
* @param int $side 0 top, 1 left
*/
function on_help(string $command, int $side = 0): string {
return script("mixin(qsl('select, input'), {onmouseover: function (event) { helpMouseover.call(this, event, $command, $side) }, onmouseout: helpMouseout});", "");
}
/** Print edit data form
* @param Field[] $fields
* @param mixed $row
*/
function edit_form(string $table, array $fields, $row, ?bool $update, string $error = ''): void {
$table_name = adminer()->tableName(table_status1($table, true));
page_header(
($update ? lang('Edit') : lang('Insert')),
$error,
array("select" => array($table, $table_name)),
$table_name
);
adminer()->editRowPrint($table, $fields, $row, $update);
if ($row === false) {
echo "<p class='error'>" . lang('No rows.') . "\n";
return;
}
echo "<form action='' method='post' enctype='multipart/form-data' id='form'>\n";
if (!$fields) {
echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
} else {
echo "<table class='layout'>" . script("qsl('table').onkeydown = editingKeydown;");
$autofocus = !$_POST;
foreach ($fields as $name => $field) {
echo "<tr><th>" . adminer()->fieldName($field);
$default = idx($_GET["set"], bracket_escape($name));
if ($default === null) {
$default = $field["default"];
if ($field["type"] == "bit" && preg_match("~^b'([01]*)'\$~", $default, $regs)) {
$default = $regs[1];
}
if (JUSH == "sql" && preg_match('~binary~', $field["type"])) {
$default = bin2hex($default); // same as UNHEX
}
}
$value = ($row !== null
? ($row[$name] != "" && JUSH == "sql" && preg_match("~enum|set~", $field["type"]) && is_array($row[$name])
? implode(",", $row[$name])
: (is_bool($row[$name]) ? +$row[$name] : $row[$name])
)
: (!$update && $field["auto_increment"]
? ""
: (isset($_GET["select"]) ? false : $default)
)
);
if (!$_POST["save"] && is_string($value)) {
$value = adminer()->editVal($value, $field);
}
$function = ($_POST["save"]
? idx($_POST["function"], $name, "")
: ($update && preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"])
? "now"
: ($value === false ? null : ($value !== null ? '' : 'NULL'))
)
);
if (!$_POST && !$update && $value == $field["default"] && preg_match('~^[\w.]+\(~', $value)) {
$function = "SQL";
}
if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
$value = "";
$function = "now";
}
if ($field["type"] == "uuid" && $value == "uuid()") {
$value = "";
$function = "uuid";
}
if ($autofocus !== false) {
$autofocus = ($field["auto_increment"] || $function == "now" || $function == "uuid" ? null : true); // null - don't autofocus this input but check the next one
}
input($field, $value, $function, $autofocus);
if ($autofocus) {
$autofocus = false;
}
echo "\n";
}
if (!support("table") && !fields($table)) {
echo "<tr>"
. "<th><input name='field_keys[]'>"
. script("qsl('input').oninput = fieldChange;")
. "<td class='function'>" . html_select("field_funs[]", adminer()->editFunctions(array("null" => isset($_GET["select"]))))
. "<td><input name='field_vals[]'>"
. "\n"
;
}
echo "</table>\n";
}
echo "<p>\n";
if ($fields) {
echo "<input type='submit' value='" . lang('Save') . "'>\n";
if (!isset($_GET["select"])) {
echo "<input type='submit' name='insert' value='" . ($update
? lang('Save and continue edit')
: lang('Save and insert next')
) . "' title='Ctrl+Shift+Enter'>\n";
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" : "");
if (isset($_GET["select"])) {
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
}
echo input_hidden("referer", (isset($_POST["referer"]) ? $_POST["referer"] : $_SERVER["HTTP_REFERER"]));
echo input_hidden("save", 1);
echo input_token();
echo "</form>\n";
}
/** Shorten UTF-8 string
* @return string escaped string with appended ...
*/
function shorten_utf8(string $string, int $length = 80, string $suffix = ""): string {
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);
}
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>…</i>");
}
/** Get button with icon */
function icon(string $icon, string $name, string $html, string $title): string {
return "<button type='submit' name='$name' title='" . h($title) . "' class='icon icon-$icon'><span>$html</span></button>";
}

View File

@@ -1,71 +1,37 @@
<?php
// not used in a single language version
$langs = array(
'en' => 'English', // Jakub Vrána - http://www.vrana.cz
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
'ca' => 'Català', // Joan Llosas
'cs' => 'Čeština', // Jakub Vrána - http://www.vrana.cz
'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
'et' => 'Eesti', // Priit Kallas
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ko' => '한국어', // dalli - skcha67@gmail.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com
'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
'pt' => 'Português', // André Dias
'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'ru' => 'Русский язык', // Maksim Izmaylov
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'uk' => 'Українська', // Valerii Kryzhov
'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail
'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com
'zh-tw' => '繁體中文', // http://tzangms.com
);
/** Get current language
* @return string
*/
function get_lang() {
global $LANG;
return $LANG;
}
namespace Adminer;
/** Translate string
* @param string
* @param int
* @return string
* @param literal-string $idf
* @param float|string $number
*/
function lang($idf, $number = null) {
global $LANG, $translations;
$translation = ($translations[$idf] ? $translations[$idf] : $idf);
function lang(string $idf, $number = null): string {
$args = func_get_args();
// this is matched by compile.php
$args[0] = Lang::$translations[$idf] ?: $idf;
return call_user_func_array('Adminer\lang_format', $args);
}
/** Format translation, usable also by plugins
* @param string|list<string> $translation
* @param float|string $number
*/
function lang_format($translation, $number = null): string {
if (is_array($translation)) {
// this is matched by compile.php
$pos = ($number == 1 ? 0
: ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
: ($LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
: ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-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 == 'ru' || $LANG == 'sr' || $LANG == 'uk' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 2-4, other
: 1
))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
: (LANG == 'cs' || LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
: (LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
: (LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4 except 12-14, 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 == '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
: 1)))))))) // different forms for 1, other
; // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos];
}
$translation = str_replace("'", '', $translation); // translations can contain HTML or be used in optionlist (we couldn't escape them here) but they can also be used e.g. in title='' //! escape plaintext translations
$args = func_get_args();
array_shift($args);
$format = str_replace("%d", "%s", $translation);
@@ -75,27 +41,82 @@ function lang($idf, $number = null) {
return vsprintf($format, $args);
}
function switch_lang() {
global $LANG, $langs;
// this is matched by compile.php
// not used in a single language version from here
/** Get available languages
* @return string[]
*/
function langs(): array {
return array(
'en' => 'English', // Jakub Vrána - https://www.vrana.cz
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
'bg' => 'Български', // Deyan Delchev
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com, Hossain Ahmed Saiman - hossain.ahmed@altscope.com
'bs' => 'Bosanski', // Emir Kurtovic
'ca' => 'Català', // Joan Llosas
'cs' => 'Čeština', // Jakub Vrána - https://www.vrana.cz
'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr
'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
'et' => 'Eesti', // Priit Kallas
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com
'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'gl' => 'Galego', // Eduardo Penabad Ramos
'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/
'hi' => 'हिन्दी', // Joshi yogesh
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org
'ko' => '한국어', // dalli - skcha67@gmail.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'lv' => 'Latviešu', // Kristaps Lediņš - https://krysits.com
'ms' => 'Bahasa Melayu', // Pisyek
'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com
'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
'pt' => 'Português', // André Dias
'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
'sv' => 'Svenska', // rasmusolle - https://github.com/rasmusolle
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'uk' => 'Українська', // Valerii Kryzhov
'uz' => 'Oʻzbekcha', // Junaydullaev Inoyatullokhon - https://av.uz/
'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail
'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com
'zh-tw' => '繁體中文', // http://tzangms.com
);
}
function switch_lang(): void {
echo "<form action='' method='post'>\n<div id='lang'>";
echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();");
echo "<label>" . lang('Language') . ": " . html_select("lang", langs(), LANG, "this.form.submit();") . "</label>";
echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
echo "<input type='hidden' name='token' value='" . get_token() . "'>\n"; // $token may be empty in auth.inc.php
echo input_token();
echo "</div>\n</form>\n";
}
if (isset($_POST["lang"]) && verify_token()) { // $error not yet available
cookie("adminer_lang", $_POST["lang"]);
$_SESSION["lang"] = $_POST["lang"]; // cookies may be disabled
$_SESSION["translations"] = array(); // used in compiled version
redirect(remove_from_uri());
}
$LANG = "en";
if (isset($langs[$_COOKIE["adminer_lang"]])) {
if (idx(langs(), $_COOKIE["adminer_lang"])) {
cookie("adminer_lang", $_COOKIE["adminer_lang"]);
$LANG = $_COOKIE["adminer_lang"];
} elseif (isset($langs[$_SESSION["lang"]])) {
} elseif (idx(langs(), $_SESSION["lang"])) {
$LANG = $_SESSION["lang"];
} else {
$accept_language = array();
@@ -105,14 +126,20 @@ if (isset($langs[$_COOKIE["adminer_lang"]])) {
}
arsort($accept_language);
foreach ($accept_language as $key => $q) {
if (isset($langs[$key])) {
if (idx(langs(), $key)) {
$LANG = $key;
break;
}
$key = preg_replace('~-.*~', '', $key);
if (!isset($accept_language[$key]) && isset($langs[$key])) {
if (!isset($accept_language[$key]) && idx(langs(), $key)) {
$LANG = $key;
break;
}
}
}
define('Adminer\LANG', $LANG);
class Lang {
/** @var array<literal-string, string|list<string>> */ static array $translations;
}

View File

@@ -1,47 +1,49 @@
<?php
namespace Adminer;
// PDO can be used in several database drivers
if (extension_loaded('pdo')) {
/*abstract*/ class Min_PDO extends PDO {
var $_result, $server_info, $affected_rows, $errno, $error;
function __construct() {
global $adminer;
$pos = array_search("SQL", $adminer->operators);
if ($pos !== false) {
unset($adminer->operators[$pos]);
}
}
function dsn($dsn, $username, $password) {
abstract class PdoDb extends SqlDb {
protected \PDO $pdo;
/** Connect to server using DSN
* @param mixed[] $options
* @return string error message
*/
function dsn(string $dsn, string $username, string $password, array $options = array()): string {
$options[\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_SILENT;
$options[\PDO::ATTR_STATEMENT_CLASS] = array('Adminer\PdoResult');
try {
parent::__construct($dsn, $username, $password);
} catch (Exception $ex) {
auth_error($ex->getMessage());
$this->pdo = new \PDO($dsn, $username, $password, $options);
} catch (\Exception $ex) {
return $ex->getMessage();
}
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
$this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
$this->server_info = @$this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);
return '';
}
/*abstract function select_db($database);*/
function query($query, $unbuffered = false) {
$result = parent::query($query);
function quote(string $string): string {
return $this->pdo->quote($string);
}
function query(string $query, bool $unbuffered = false) {
/** @var Result|bool */
$result = $this->pdo->query($query);
$this->error = "";
if (!$result) {
list(, $this->errno, $this->error) = $this->errorInfo();
list(, $this->errno, $this->error) = $this->pdo->errorInfo();
if (!$this->error) {
$this->error = lang('Unknown error.');
}
return false;
}
$this->store_result($result);
return $result;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result($result = null) {
if (!$result) {
$result = $this->_result;
$result = $this->multi;
if (!$result) {
return false;
}
@@ -53,44 +55,50 @@ if (extension_loaded('pdo')) {
$this->affected_rows = $result->rowCount();
return true;
}
function next_result() {
if (!$this->_result) {
function next_result(): bool {
/** @var PdoResult|bool */
$result = $this->multi;
if (!is_object($result)) {
return false;
}
$this->_result->_offset = 0;
return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result) {
return false;
}
$row = $result->fetch();
return $row[$field];
$result->_offset = 0;
return @$result->nextRowset(); // @ - PDO_PgSQL doesn't support it
}
}
class Min_PDOStatement extends PDOStatement {
var $_offset = 0, $num_rows;
class PdoResult extends \PDOStatement {
public $_offset = 0, $num_rows;
function fetch_assoc() {
return $this->fetch(2); // PDO::FETCH_ASSOC
return $this->fetch_array(\PDO::FETCH_ASSOC);
}
function fetch_row() {
return $this->fetch(3); // PDO::FETCH_NUM
return $this->fetch_array(\PDO::FETCH_NUM);
}
function fetch_field() {
private function fetch_array(int $mode) {
$return = $this->fetch($mode);
return ($return ? array_map(array($this, 'unresource'), $return) : $return);
}
private function unresource($val) {
return (is_resource($val) ? stream_get_contents($val) : $val);
}
function fetch_field(): \stdClass {
$row = (object) $this->getColumnMeta($this->_offset++);
$row->orgtable = $row->table;
$row->orgname = $row->name;
$row->charsetnr = (in_array("blob", (array) $row->flags) ? 63 : 0);
$type = $row->pdo_type;
$row->type = ($type == \PDO::PARAM_INT ? 0 : 15);
$row->charsetnr = ($type == \PDO::PARAM_LOB || (isset($row->flags) && in_array("blob", (array) $row->flags)) ? 63 : 0);
return $row;
}
function seek($offset) {
for ($i=0; $i < $offset; $i++) {
$this->fetch();
}
}
}
}
$drivers = array();

View File

@@ -0,0 +1,31 @@
<?php
namespace Adminer;
// the overridable methods don't use return type declarations so that plugins can be compatible with PHP 5
abstract class Plugin {
/** @var array<literal-string, string|list<string>>[] */ protected $translations = array(); // key is language code
/** Get plain text plugin description; empty string means to use the first line of class doc-comment
* @return string
*/
function description() {
return $this->lang('');
}
/** Get URL of plugin screenshot
* @return string
*/
function screenshot() {
return "";
}
/** Translate a string from $this->translations; Adminer\lang() doesn't work for single language versions
* @param literal-string $idf
* @param float|string $number
*/
protected function lang(string $idf, $number = null): string {
$args = func_get_args();
$args[0] = idx($this->translations[LANG], $idf) ?: $idf;
return call_user_func_array('Adminer\lang_format', $args);
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace Adminer;
class Plugins {
/** @var true[] */ private static array $append = array('dumpFormat' => true, 'dumpOutput' => true, 'editRowPrint' => true, 'editFunctions' => true, 'config' => true); // these hooks expect the value to be appended to the result
/** @var list<object> @visibility protected(set) */ public array $plugins;
/** @visibility protected(set) */ public string $error = ''; // HTML
/** @var list<object>[] */ private array $hooks = array();
/** Register plugins
* @param ?list<object> $plugins object instances or null to autoload plugins from adminer-plugins/
*/
function __construct(?array $plugins) {
if ($plugins === null) {
$plugins = array();
$basename = "adminer-plugins";
if (is_dir($basename)) {
foreach (glob("$basename/*.php") as $filename) {
$include = include_once "./$filename";
}
}
$help = " href='https://www.adminer.org/plugins/#use'" . target_blank();
if (file_exists("$basename.php")) {
$include = include_once "./$basename.php"; // example: return array(new AdminerLoginOtp($secret))
if (is_array($include)) {
foreach ($include as $plugin) {
$plugins[get_class($plugin)] = $plugin;
}
} else {
$this->error .= lang('%s must <a%s>return an array</a>.', "<b>$basename.php</b>", $help) . "<br>";
}
}
foreach (get_declared_classes() as $class) {
if (!$plugins[$class] && preg_match('~^Adminer\w~i', $class)) {
// we need to use reflection because PHP 7.1 throws ArgumentCountError for missing arguments but older versions issue a warning
$reflection = new \ReflectionClass($class);
$constructor = $reflection->getConstructor();
if ($constructor && $constructor->getNumberOfRequiredParameters()) {
$this->error .= lang('<a%s>Configure</a> %s in %s.', $help, "<b>$class</b>", "<b>$basename.php</b>") . "<br>";
} else {
$plugins[$class] = new $class;
}
}
}
}
$this->plugins = $plugins;
$adminer = new Adminer;
$plugins[] = $adminer;
$reflection = new \ReflectionObject($adminer);
foreach ($reflection->getMethods() as $method) {
foreach ($plugins as $plugin) {
$name = $method->getName();
if (method_exists($plugin, $name)) {
$this->hooks[$name][] = $plugin;
}
}
}
}
/**
* @param literal-string $name
* @param mixed[] $params
* @return mixed
*/
function __call(string $name, array $params) {
$args = array();
foreach ($params as $key => $val) {
// some plugins accept params by reference - we don't need to propagate it outside, just to the other plugins
$args[] = &$params[$key];
}
$return = null;
foreach ($this->hooks[$name] as $plugin) {
$value = call_user_func_array(array($plugin, $name), $args);
if ($value !== null) {
if (!self::$append[$name]) { // non-null value from non-appending method short-circuits the other plugins
return $value;
}
$return = $value + (array) $return;
}
}
return $return;
}
}

View File

@@ -1,22 +1,22 @@
<?php
namespace Adminer;
class TmpFile {
var $handler;
var $size;
function TmpFile() {
/** @var resource */ private $handler;
/** @visibility protected(set) */ public int $size;
function __construct() {
$this->handler = tmpfile();
}
function write($contents) {
function write(string $contents): void {
$this->size += strlen($contents);
fwrite($this->handler, $contents);
}
function send() {
function send(): void {
fseek($this->handler, 0);
fpassthru($this->handler);
fclose($this->handler);
}
}

View File

@@ -1,2 +1,4 @@
<?php
$VERSION = "4.2.2";
namespace Adminer;
const VERSION = "5.3.1-dev";

View File

@@ -1,10 +1,12 @@
<?php
namespace Adminer;
/** PHP implementation of XXTEA encryption algorithm
* @author Ma Bingyao <andot@ujn.edu.cn>
* @link http://www.coolcode.cn/?action=show&id=128
*/
function int32($n) {
function int32(int $n): int {
while ($n >= 2147483648) {
$n -= 4294967296;
}
@@ -14,7 +16,10 @@ function int32($n) {
return (int) $n;
}
function long2str($v, $w) {
/**
* @param int[] $v
*/
function long2str(array $v, bool $w): string {
$s = '';
foreach ($v as $val) {
$s .= pack('V', $val);
@@ -25,7 +30,10 @@ function long2str($v, $w) {
return $s;
}
function str2long($s, $w) {
/**
* @return int[]
*/
function str2long(string $s, bool $w): array {
$v = array_values(unpack('V*', str_pad($s, 4 * ceil(strlen($s) / 4), "\0")));
if ($w) {
$v[] = strlen($s);
@@ -33,16 +41,15 @@ function str2long($s, $w) {
return $v;
}
function xxtea_mx($z, $y, $sum, $k) {
function xxtea_mx(int $z, int $y, int $sum, int $k): int {
return int32((($z >> 5 & 0x7FFFFFF) ^ $y << 2) + (($y >> 3 & 0x1FFFFFFF) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k ^ $z));
}
/** Cipher
* @param string plain-text password
* @param string
* @param string $str plain-text password
* @return string binary cipher
*/
function encrypt_string($str, $key) {
function encrypt_string(string $str, string $key): string {
if ($str == "") {
return "";
}
@@ -71,11 +78,10 @@ function encrypt_string($str, $key) {
}
/** Decipher
* @param string binary cipher
* @param string
* @return string plain-text password
* @param string $str binary cipher
* @return string|false plain-text password
*/
function decrypt_string($str, $key) {
function decrypt_string(string $str, string $key) {
if ($str == "") {
return "";
}

View File

@@ -1,21 +1,22 @@
<?php
/** Adminer - Compact database management
* @link http://www.adminer.org/
* @author Jakub Vrana, http://www.vrana.cz/
* @link https://www.adminer.org/
* @author Jakub Vrana, https://www.vrana.cz/
* @copyright 2007 Jakub Vrana
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
// this is matched by compile.php
namespace Adminer;
include "./include/bootstrap.inc.php";
include "./include/tmpfile.inc.php";
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*'";
$inout = "IN|OUT|INOUT";
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
$_GET["edit"] = $_GET["select"];
}
// this is matched by compile.php
if (isset($_GET["callf"])) {
$_GET["call"] = $_GET["callf"];
}
@@ -59,6 +60,8 @@ if (isset($_GET["download"])) {
include "./sequence.inc.php";
} elseif (isset($_GET["type"])) {
include "./type.inc.php";
} elseif (isset($_GET["check"])) {
include "./check.inc.php";
} elseif (isset($_GET["trigger"])) {
include "./trigger.inc.php";
} elseif (isset($_GET["user"])) {

View File

@@ -1,19 +1,28 @@
<?php
namespace Adminer;
$TABLE = $_GET["indexes"];
$index_types = array("PRIMARY", "UNIQUE", "INDEX");
$table_status = table_status($TABLE, true);
if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.6 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$table_status = table_status1($TABLE, true);
$index_algorithms = driver()->indexAlgorithms($table_status);
if (preg_match('~MyISAM|M?aria' . (min_version(5.6, '10.0.5') ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "FULLTEXT";
}
if (preg_match('~MyISAM|M?aria' . (min_version(5.7, '10.2.2') ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "SPATIAL";
}
$indexes = indexes($TABLE);
$fields = fields($TABLE);
$primary = array();
if ($jush == "mongo") { // doesn't support primary key
if (JUSH == "mongo") { // doesn't support primary key
$primary = $indexes["_id_"];
unset($index_types[0]);
unset($indexes["_id_"]);
}
$row = $_POST;
if ($row) {
save_settings(array("index_options" => $row["options"]));
}
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
$alter = array();
foreach ($row["indexes"] as $index) {
@@ -22,36 +31,41 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
$columns = array();
$lengths = array();
$descs = array();
$index_condition = (support("partial_indexes") ? $index["partial"] : "");
$index_algorithm = (in_array($index["algorithm"], $index_algorithms) ? $index["algorithm"] : "");
$set = array();
ksort($index["columns"]);
foreach ($index["columns"] as $key => $column) {
if ($column != "") {
$length = $index["lengths"][$key];
$desc = $index["descs"][$key];
$set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
$length = idx($index["lengths"], $key);
$desc = idx($index["descs"], $key);
$set[] = ($fields[$column] ? idf_escape($column) : $column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
$columns[] = $column;
$lengths[] = ($length ? $length : null);
$lengths[] = ($length ?: null);
$descs[] = $desc;
}
}
if ($columns) {
$existing = $indexes[$name];
if ($existing) {
ksort($existing["columns"]);
ksort($existing["lengths"]);
ksort($existing["descs"]);
if ($index["type"] == $existing["type"]
&& array_values($existing["columns"]) === $columns
&& (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)
&& array_values($existing["descs"]) === $descs
) {
// skip existing index
unset($indexes[$name]);
continue;
}
$existing = $indexes[$name];
if ($existing) {
ksort($existing["columns"]);
ksort($existing["lengths"]);
ksort($existing["descs"]);
if (
$index["type"] == $existing["type"]
&& array_values($existing["columns"]) === $columns
&& (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)
&& array_values($existing["descs"]) === $descs
&& $existing["partial"] == $index_condition
&& (!$index_algorithms || $existing["algorithm"] == $index_algorithm)
) {
// skip existing index
unset($indexes[$name]);
continue;
}
$alter[] = array($index["type"], $name, $set);
}
if ($columns) {
$alter[] = array($index["type"], $name, $set, $index_algorithm, $index_condition);
}
}
}
@@ -68,7 +82,7 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
page_header(lang('Indexes'), $error, array("table" => $TABLE), h($TABLE));
$fields = array_keys(fields($TABLE));
$fields_keys = array_keys($fields);
if ($_POST["add"]) {
foreach ($row["indexes"] as $key => $index) {
if ($index["columns"][count($index["columns"])] != "") {
@@ -88,21 +102,44 @@ if (!$row) {
$indexes[] = array("columns" => array(1 => ""));
$row["indexes"] = $indexes;
}
$lengths = (JUSH == "sql" || JUSH == "mssql");
$show_options = ($_POST ? $_POST["options"] : get_setting("index_options"));
?>
<form action="" method="post">
<table cellspacing="0" class="nowrap">
<div class="scrollable">
<table class="nowrap">
<thead><tr>
<th><?php echo lang('Index Type'); ?>
<th><input type="submit" style="left: -1000px; position: absolute;"><?php echo lang('Column (length)'); ?>
<th><?php echo lang('Name'); ?>
<th><noscript><input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='<?php echo lang('Add next'); ?>'></noscript>&nbsp;
<th id="label-type"><?php echo lang('Index Type'); ?>
<?php
$idxopts = " class='idxopts" . ($show_options ? "" : " hidden") . "'";
if ($index_algorithms) {
echo "<th id='label-algorithm'$idxopts>" . lang('Algorithm') . doc_link(array(
'sql' => 'create-index.html#create-index-storage-engine-index-types',
'mariadb' => 'storage-engine-index-types/',
'pgsql' => 'indexes-types.html',
));
}
?>
<th><input type="submit" class="wayoff"><?php
echo lang('Columns') . ($lengths ? "<span$idxopts> (" . lang('length') . ")</span>" : "");
if ($lengths || support("descidx")) {
echo checkbox("options", 1, $show_options, lang('Options'), "indexOptionsShow(this.checked)", "jsonly") . "\n";
}
?>
<th id="label-name"><?php echo lang('Name'); ?>
<?php
if (support("partial_indexes")) {
echo "<th id='label-condition'$idxopts>" . lang('Condition');
}
?>
<th><noscript><?php echo icon("plus", "add[0]", "+", lang('Add next')); ?></noscript>
</thead>
<?php
if ($primary) {
echo "<tr><td>PRIMARY<td>";
foreach ($primary["columns"] as $key => $column) {
echo select_input(" disabled", $fields, $column);
echo select_input(" disabled", $fields_keys, $column);
echo "<label><input disabled type='checkbox'>" . lang('descending') . "</label> ";
}
echo "<td><td>\n";
@@ -110,31 +147,41 @@ if ($primary) {
$j = 1;
foreach ($row["indexes"] as $index) {
if (!$_POST["drop_col"] || $j != key($_POST["drop_col"])) {
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow(this);" : 1));
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow.call(this);" : ""), "label-type");
if ($index_algorithms) {
echo "<td$idxopts>" . html_select("indexes[$j][algorithm]", array_merge(array(""), $index_algorithms), $index['algorithm'], "label-algorithm");
}
echo "<td>";
ksort($index["columns"]);
$i = 1;
foreach ($index["columns"] as $key => $column) {
echo "<span>" . select_input(
" name='indexes[$j][columns][$i]' onchange=\"" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "');\"",
($fields ? array_combine($fields, $fields) : $fields),
$column
" name='indexes[$j][columns][$i]' title='" . lang('Column') . "'",
($fields && ($column == "" || $fields[$column]) ? array_combine($fields_keys, $fields_keys) : array()),
$column,
"partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape(JUSH == "sql" ? "" : $_GET["indexes"] . "_") . "')"
);
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'>" : "");
echo ($jush != "sql" ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
echo " </span>";
echo "<span$idxopts>";
echo ($lengths ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h(idx($index["lengths"], $key)) . "' title='" . lang('Length') . "'>" : "");
echo (support("descidx") ? checkbox("indexes[$j][descs][$i]", 1, idx($index["descs"], $key), lang('descending')) : "");
echo "</span> </span>";
$i++;
}
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off'>\n";
echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'indexes\$1[type]');\">\n";
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off' aria-labelledby='label-name'>\n";
if (support("partial_indexes")) {
echo "<td$idxopts><input name='indexes[$j][partial]' value='" . h($index["partial"]) . "' autocapitalize='off' aria-labelledby='label-condition'>\n";
}
echo "<td>" . icon("cross", "drop_col[$j]", "x", lang('Remove')) . script("qsl('button').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");
}
$j++;
}
?>
</table>
</div>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php echo input_token(); ?>
</form>

View File

@@ -1,23 +1,24 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'تسجيل الدخول',
'Logout successful.' => 'مع السلامة.',
'Invalid credentials.' => 'فشل في تسجيل الدخول.',
'Logout successful.' => 'تم تسجيل الخروج بنجاح.',
'Invalid credentials.' => 'بيانات الدخول غير صالحة.',
'Server' => 'الخادم',
'Username' => 'المستعمل',
'Username' => 'اسم المستخدم',
'Password' => 'كلمة المرور',
'Select database' => 'إختر قاعدة البيانات',
'Invalid database.' => 'قاعدة بيانات خاطئة.',
'Create new database' => 'أنشئ فاعدة بيانات',
'Select database' => 'اختر قاعدة البيانات',
'Invalid database.' => 'قاعدة البيانات غير صالحة.',
'Table has been dropped.' => 'تم حذف الجدول.',
'Table has been altered.' => 'تم تعديل الجدول.',
'Table has been created.' => 'تم إنشاء الجدول.',
'Alter table' => 'تعديل الجدول',
'Create table' => 'إنشاء جدول',
'Table name' => 'إسم الجدول',
'Table name' => 'اسم الجدول',
'engine' => 'المحرك',
'collation' => 'الترتيب',
'Column name' => 'إسم العمود',
'Column name' => 'اسم العمود',
'Type' => 'النوع',
'Length' => 'الطول',
'Auto Increment' => 'تزايد تلقائي',
@@ -29,10 +30,9 @@ $translations = array(
'Database has been altered.' => 'تم تعديل قاعدة البيانات.',
'Alter database' => 'تعديل قاعدة البيانات',
'Create database' => 'إنشاء قاعدة بيانات',
'SQL command' => 'إستعلام SQL',
'SQL command' => 'استعلام SQL',
'Logout' => 'تسجيل الخروج',
'database' => 'قاعدة بيانات',
'Use' => 'المستعمل',
'Use' => 'استعمال',
'No tables.' => 'لا توجد جداول.',
'select' => 'تحديد',
'Item has been deleted.' => 'تم حذف العنصر.',
@@ -48,64 +48,64 @@ $translations = array(
'Alter indexes' => 'تعديل المؤشرات',
'Add next' => 'إضافة التالي',
'Language' => 'اللغة',
'Select' => 'إختيار',
'Select' => 'اختيار',
'New item' => 'عنصر جديد',
'Search' => 'بحث',
'Sort' => 'ترتيب',
'descending' => 'تنازلي',
'Limit' => 'حد',
'No rows.' => 'لا توجد نتائج.',
'Action' => 'حركة',
'Action' => 'الإجراء',
'edit' => 'تعديل',
'Page' => 'صفحة',
'Query executed OK, %d row(s) affected.' => 'تم تنفسذ الإستعلام, %d عدد الأسطر المعدلة.',
'Error in query' => 'هناك خطأ في الإستعلام',
'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 Token خاطئ. من فضلك أعد إرسال الإستمارة.',
'Unable to select the table' => 'يتعذر اختيار الجدول',
'Invalid CSRF token. Send the form again.' => 'رمز CSRF غير صالح. المرجو إرسال الاستمارة مرة أخرى.',
'Comment' => 'تعليق',
'Default values' => 'القيمة الإفتراضية',
'Default values' => 'القيم الافتراضية',
'%d byte(s)' => '%d بايت',
'No commands to execute.' => 'لا توجد أوامر للتنفيذ.',
'Unable to upload a file.' => 'من غير الممكن رفع الملف.',
'Unable to upload a file.' => 'يتعذر رفع ملف ما.',
'File upload' => 'رفع ملف',
'File uploads are disabled.' => 'تم إلغاء رفع الملفات.',
'Routine has been called, %d row(s) affected.' => 'تم إستدعاء الروتين, عدد الأسطر المعدلة %d.',
'Call' => 'إستدعاء',
'No extension' => 'إمتداد غير موجود',
'None of the supported PHP extensions (%s) are available.' => 'إمتدادات php المدعومة غير موجودة.',
'File uploads are disabled.' => 'رفع الملفات غير مشغل.',
'Routine has been called, %d row(s) affected.' => 'تم استدعاء الروتين, عدد الأسطر المعدلة %d.',
'Call' => 'استدعاء',
'No extension' => 'امتداد غير موجود',
'None of the supported PHP extensions (%s) are available.' => 'إمتدادات php (%s) المدعومة غير موجودة.',
'Session support must be enabled.' => 'عليك تفعيل نظام الجلسات.',
'Session expired, please login again.' => 'إنتهت الجلسة، من فضلك أعد تسجيل الدخول.',
'Text length' => 'طول النص',
'Foreign key has been dropped.' => 'المفتاح الأجنبي تم مسحه.',
'Foreign key has been altered.' => 'المفتاح الأجنبي تم تعديله.',
'Foreign key has been created.' => 'المفتاح الأجنبي تم إنشاؤه.',
'Foreign key has been dropped.' => 'تم مسح المفتاح الأجنبي.',
'Foreign key has been altered.' => 'تم تعديل المفتاح الأجنبي.',
'Foreign key has been created.' => 'تم إنشاء المفتاح الأجنبي.',
'Foreign key' => 'مفتاح أجنبي',
'Target table' => 'الجدول المستهدف',
'Change' => 'تعديل',
'Source' => 'المصدر',
'Target' => 'الهدف',
'Add column' => 'أضف عمود',
'Add column' => 'إضافة عمودا',
'Alter' => 'تعديل',
'Add foreign key' => 'إضافة مفتاح أجنبي',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'نوع المؤشر',
'Column (length)' => 'العمود (الطول)',
'length' => 'الطول',
'View has been dropped.' => 'تم مسح العرض.',
'View has been altered.' => 'تم تعديل العرض.',
'View has been created.' => 'تم إنشاء العرض.',
'Alter view' => 'تعديل عرض',
'Create view' => 'إنشاء عرض',
'Name' => 'الإسم',
'Name' => 'الاسم',
'Process list' => 'قائمة الإجراءات',
'%d process(es) have been killed.' => 'عدد الإجراءات التي تم إيقافها %d.',
'Kill' => 'إيقاف',
'Parameter name' => 'إسم المتغير',
'Parameter name' => 'اسم المتغير',
'Database schema' => 'مخطط فاعدة البيانات',
'Create procedure' => 'إنشاء إجراء',
'Create function' => 'إنشاء دالة',
@@ -137,7 +137,7 @@ $translations = array(
'Grant' => 'موافق',
'Revoke' => 'إلغاء',
'%s version: %s through PHP extension %s' => 'النسخة %s : %s عن طريق إمتداد ال PHP %s',
'Logged as: %s' => 'تم تسجيل الدخول بإسم %s',
'Logged as: %s' => 'تم تسجيل الدخول باسم %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'معلومات POST كبيرة جدا. قم بتقليص حجم المعلومات أو قم بزيادة قيمة %s في خيارات ال PHP.',
'Move up' => 'نقل للأعلى',
'Move down' => 'نقل للأسفل',
@@ -171,12 +171,12 @@ $translations = array(
'Tables and views' => 'الجداول و العروض',
'Engine' => 'المحرك',
'Collation' => 'ترتيب',
'Data Length' => 'طول المعطيات.',
'Index Length' => 'طول المؤشر.',
'Data Length' => 'طول المعطيات',
'Index Length' => 'طول المؤشر',
'Data Free' => 'المساحة الحرة',
'Rows' => 'الأسطر',
',' => ',',
'0123456789' => '٠١٢٣٤٥٦٧٨٩',
'0123456789' => '0123456789',
'Analyze' => 'تحليل',
'Optimize' => 'تحسين',
'Check' => 'فحص',
@@ -185,16 +185,16 @@ $translations = array(
'Move to other database' => 'نقل إلى قاعدة بيانات أخرى',
'Move' => 'نقل',
'%d item(s) have been affected.' => 'عدد العناصر المعدلة هو %d.',
'whole result' => 'نتيجة كاملة',
'Whole result' => 'نتيجة كاملة',
'Clone' => 'نسخ',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
'Partition by' => 'مقسم بواسطة',
'Partitions' => 'التقسيمات',
'Partition name' => 'إسم التقسيم',
'Partition name' => 'اسم التقسيم',
'Values' => 'القيم',
'%d row(s) have been imported.' => 'عدد الأسطر المستوردة هو %d.',
'%d row(s) have been imported.' => 'تم استيراد %d سطرا.',
'anywhere' => 'في اي مكان',
'Import' => 'إستيراد',
'Import' => 'استيراد',
'Stop on error' => 'أوقف في حالة حدوث خطأ',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
@@ -212,11 +212,6 @@ $translations = array(
'Binary' => 'ثنائية',
'Lists' => 'قوائم',
'Editor' => 'المحرر',
'E-mail' => 'البريد الإلكتروني',
'From' => 'من',
'Subject' => 'الموضوع',
'Send' => 'إرسال',
'%d e-mail(s) have been sent.' => 'تم إرسال %d رسالة.',
'Webserver file %s' => 'ملف %s من خادم الويب',
'File does not exist.' => 'الملف غير موجود.',
'%d in total' => '%d في المجموع',
@@ -241,7 +236,7 @@ $translations = array(
'Alter type' => 'تعديل نوع',
'Type has been dropped.' => 'تم حذف النوع.',
'Type has been created.' => 'تم إنشاء النوع.',
'Use edit link to modify this value.' => 'إستعمل الرابط "تعديل" لتعديل هذه القيمة.',
'Use edit link to modify this value.' => 'استعمل الرابط "تعديل" لتعديل هذه القيمة.',
'last' => 'الأخيرة',
'From server' => 'من الخادم',
'System' => 'النظام',
@@ -251,18 +246,19 @@ $translations = array(
'Network' => 'شبكة',
'Geometry' => 'هندسة',
'File exists.' => 'الملف موجود.',
'Attachments' => 'ملفات مرفقة.',
'Item%s has been inserted.' => 'تم إدراج العنصر.',
'Item%s has been inserted.' => '%sتم إدراج العنصر.',
'now' => 'الآن',
'%d query(s) executed OK.' => array('تم تنفيذ الإستعلام %d بنجاح.', 'تم تنفيذ الإستعلامات %d بنجاح.'),
'Show only errors' => عرض الأخطاء فقط',
'%d query(s) executed OK.' => array('تم تنفيذ الاستعلام %d بنجاح.', 'تم تنفيذ الاستعلامات %d بنجاح.'),
'Show only errors' => ظهار الأخطاء فقط',
'Refresh' => 'تحديث',
'Invalid schema.' => 'مخطط خاطئ.',
'Please use one of the extensions %s.' => 'من فضلك إستعمل إحدى الإمتدادات: %s.',
'Invalid schema.' => 'مخطط غير صالح.',
'Please use one of the extensions %s.' => 'المرجو استخدام إحدى الامتدادات %s.',
'ltr' => 'rtl',
'Tables have been copied.' => 'تم نسخ الجداول.',
'Copy' => 'نسخ',
'Permanent link' => 'وصلة دائمة',
'Permanent link' => 'رابط دائم',
'Edit all' => 'تعديل الكل',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php ar` to update this file

332
adminer/lang/bg.inc.php Normal file
View File

@@ -0,0 +1,332 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Система',
'Server' => 'Сървър',
'Username' => 'Потребител',
'Password' => 'Парола',
'Permanent login' => 'Запаметяване',
'Login' => 'Вход',
'Logout' => 'Изход',
'Logged as: %s' => 'Текущ потребител: %s',
'Logout successful.' => 'Излизането е успешно.',
'Invalid credentials.' => 'Невалидни потребителски данни.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Прекалено много неуспешни опити за вход, опитайте пак след %d минута.', 'Прекалено много неуспешни опити за вход, опитайте пак след %d минути.'),
'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 метод, за да я направите постоянна.',
'Language' => 'Език',
'Invalid CSRF token. Send the form again.' => 'Невалиден шифроващ ключ. Попълнете и изпратете формуляра отново.',
'If you did not send this request from Adminer then close this page.' => 'Ако не сте изпратили тази заявка през Adminer, затворете тази страница.',
'No extension' => 'Няма разширение',
'None of the supported PHP extensions (%s) are available.' => 'Никое от поддържаните PHP разширения (%s) не е налично.',
'Session support must be enabled.' => 'Поддръжката на сесии трябва да е разрешена.',
'Session expired, please login again.' => 'Сесията е изтекла; моля, влезте отново.',
'%s version: %s through PHP extension %s' => '%s версия: %s през PHP разширение %s',
'Refresh' => 'Обновяване',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Права',
'Create user' => 'Създаване на потребител',
'User has been dropped.' => 'Потребителя беше премахнат.',
'User has been altered.' => 'Потребителя беше променен.',
'User has been created.' => 'Потребителя беше създаден.',
'Hashed' => 'Хеширан',
'Column' => 'Колона',
'Routine' => 'Процедура',
'Grant' => 'Осигуряване',
'Revoke' => 'Отнемане',
'Process list' => 'Списък с процеси',
'%d process(es) have been killed.' => array('%d процес беше прекъснат.', '%d процеса бяха прекъснати.'),
'Kill' => 'Прекъсване',
'Variables' => 'Променливи',
'Status' => 'Състояние',
'SQL command' => 'SQL команда',
'%d query(s) executed OK.' => array('%d заявка е изпълнена.', '%d заявки са изпълнени.'),
'Query executed OK, %d row(s) affected.' => array('Заявката е изпълнена, %d ред е засегнат.', 'Заявката е изпълнена, %d редове са засегнати.'),
'No commands to execute.' => 'Няма команди за изпълнение.',
'Error in query' => 'Грешка в заявката',
'Execute' => 'Изпълнение',
'Stop on error' => 'Спиране при грешка',
'Show only errors' => 'Показване само на грешките',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'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.' => 'Изпратени са прекалено много данни. Намалете обема на данните или увеличете %s управляващата директива.',
'You can upload a big SQL file via FTP and import it from server.' => 'Можете да прикачите голям SQL файл чрез FTP и да го импортирате от сървъра.',
'You are offline.' => 'Вие сте офлайн.',
'Export' => 'Експорт',
'Output' => 'Резултат',
'open' => 'показване',
'save' => 'запис',
'Format' => 'Формат',
'Data' => 'Данни',
'Database' => 'База данни',
'Use' => 'Избор',
'Select database' => 'Избор на база данни',
'Invalid database.' => 'Невалидна база данни.',
'Database has been dropped.' => 'Базата данни беше премахната.',
'Databases have been dropped.' => 'Базите данни бяха премехнати.',
'Database has been created.' => 'Базата данни беше създадена.',
'Database has been renamed.' => 'Базата данни беше преименувана.',
'Database has been altered.' => 'Базата данни беше променена.',
'Alter database' => 'Промяна на база данни',
'Create database' => 'Създаване на база данни',
'Database schema' => 'Схема на базата данни',
// link to current database schema layout
'Permanent link' => 'Постоянна препратка',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Система',
'Collation' => 'Кодировка',
'Data Length' => 'Големина на данните',
'Index Length' => 'Големина на индекса',
'Data Free' => 'Свободно място',
'Rows' => 'Редове',
'%d in total' => '%d всичко',
'Analyze' => 'Анализиране',
'Optimize' => 'Оптимизиране',
'Vacuum' => 'Консолидиране',
'Check' => 'Проверка',
'Repair' => 'Поправка',
'Truncate' => 'Изрязване',
'Tables have been truncated.' => 'Таблиците бяха изрязани.',
'Move to other database' => 'Преместване в друга база данни',
'Move' => 'Преместване',
'Tables have been moved.' => 'Таблиците бяха преместени.',
'Copy' => 'Копиране',
'Tables have been copied.' => 'Таблиците бяха копирани.',
'Routines' => 'Процедури',
'Routine has been called, %d row(s) affected.' => array('Беше приложена процедура, %d ред е засегнат.', 'Беше приложена процедура, %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 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' => 'Премахване',
'Are you sure?' => 'Сигурни ли сте?',
'Size' => 'Големина',
'Compute' => 'Изчисляване',
'Move up' => 'Преместване нагоре',
'Move down' => 'Преместване надолу',
'Remove' => 'Премахване',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Максималния брой полета е превишен. Моля, увеличете %s.',
'Partition by' => 'Разделяне на',
'Partitions' => 'Раздели',
'Partition name' => 'Име на раздела',
'Values' => 'Стойности',
'View' => 'Изглед',
'Materialized view' => 'Запаметен изглед',
'View has been dropped.' => 'Изгледа беше премахнат.',
'View has been altered.' => 'Изгледа беше променен.',
'View has been created.' => 'Изгледа беше създаден.',
'Alter view' => 'Промяна на изглед',
'Create view' => 'Създаване на изглед',
'Indexes' => 'Индекси',
'Indexes have been altered.' => 'Индексите бяха променени.',
'Alter indexes' => 'Промяна на индекси',
'Add next' => 'Добавяне на следващ',
'Index Type' => 'Вид на индекса',
'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 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.' => 'Колоните източник и цел трябва да са от еднакъв вид, трябва да има индекс на колоните приемник и да има въведени данни.',
'Triggers' => 'Тригери',
'Add trigger' => 'Добавяне на тригер',
'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)' => array('%d ред', '%d реда'),
'Page' => 'Страница',
'last' => 'последен',
'Load more data' => 'Зареждане на повече данни',
'Loading' => 'Зареждане',
'Whole result' => 'Пълен резултат',
'%d byte(s)' => array('%d байт', '%d байта'),
'Import' => 'Импорт',
'%d row(s) have been imported.' => array('%d ред беше импортиран.', '%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.' => array('%d елемент беше засегнат.', '%d елемента бяха засегнати.'),
'New item' => 'Нов елемент',
'original' => 'оригинал',
// label for value '' in enum data type
'empty' => 'празно',
'edit' => 'редакция',
'Edit' => 'Редактиране',
'Insert' => 'Вмъкване',
'Save' => 'Запис',
'Saving' => 'Записване',
'Save and continue edit' => 'Запис и редакция',
'Save and insert next' => 'Запис и нов',
'Selected' => 'Избран',
'Clone' => 'Клониране',
'Delete' => 'Изтриване',
'You have no privileges to update this table.' => 'Нямате праве за обновяване на таблицата.',
// data type descriptions
'Numbers' => 'Числа',
'Date and time' => 'Дата и час',
'Strings' => 'Низове',
'Binary' => 'Двоични',
'Lists' => 'Списъци',
'Network' => 'Мрежа',
'Geometry' => 'Геометрия',
'Relations' => 'Зависимости',
'Editor' => 'Редактор',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[гггг]-мм-дд',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'ЧЧ:ММ:СС',
'now' => 'сега',
'yes' => 'да',
'no' => 'не',
// general SQLite error in create, drop or rename database
'File exists.' => 'Файла вече съществува.',
'Please use one of the extensions %s.' => 'Моля, използвайте някое от разширенията %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Промяна на схемата',
'Create schema' => 'Създаване на схема',
'Schema has been dropped.' => 'Схемата беше премахната.',
'Schema has been created.' => 'Схемата беше създадена.',
'Schema has been altered.' => 'Схемата беше променена.',
'Schema' => 'Схема',
'Invalid schema.' => 'Невалидна схема.',
// PostgreSQL sequences support
'Sequences' => 'Последователности',
'Create sequence' => 'Създаване на последователност',
'Sequence has been dropped.' => 'Последователността беше премахната.',
'Sequence has been created.' => 'Последователността беше създадена.',
'Sequence has been altered.' => 'Последователността беше променена.',
'Alter sequence' => 'Промяна на последователност',
// PostgreSQL user types support
'User types' => 'Видове потребители',
'Create type' => 'Създаване на вид',
'Type has been dropped.' => 'Вида беше пермахнат.',
'Type has been created.' => 'Вида беше създаден.',
'Alter type' => 'Промяна на вид',
);
// run `php ../../lang.php bg` to update this file

View File

@@ -1,54 +1,54 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'লগইন',
'Logout successful.' => 'লগআউট সম্পন্ন হয়েছে।',
'Logout successful.' => 'সফলভাবে লগআউট হয়েছে।',
'Invalid credentials.' => 'ভুল পাসওয়ার্ড।',
'Server' => 'সার্ভার',
'Username' => 'ইউজারের নাম',
'Password' => 'পাসওয়ার্ড',
'Select database' => 'ডাটাবেজ নির্বাচন কর',
'Invalid database.' => 'ভুল ডাটাবেজ।',
'Create new database' => 'নতুন ডাটাবেজ তৈরী করো',
'Select database' => 'ডাটাবেজ নির্বাচন করুন',
'Invalid database.' => 'অকার্যকর ডাটাবেজ।',
'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
'Table has been altered.' => 'টেবিল পরিবর্তন করা হয়েছে।',
'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
'Alter table' => 'টেবিল সম্পাদনা',
'Create table' => 'টেবিল তৈরী কর',
'Alter table' => 'টেবিল পরিবর্তন করুন',
'Create table' => 'টেবিল তৈরী করুন',
'Table name' => 'টেবিলের নাম',
'engine' => 'ইন্জিন',
'collation' => 'কলোকেশন',
'collation' => 'সমষ্টি',
'Column name' => 'কলামের নাম',
'Type' => 'টাইপ',
'Type' => 'ধরণ',
'Length' => 'দৈর্ঘ্য',
'Auto Increment' => 'স্বয়ংক্রিয় বৃদ্ধি',
'Options' => 'অপশন',
'Save' => 'সংরক্ষণ',
'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-কোয়্যারী',
'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.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
'Item has been updated.' => 'বিষয়বস্তু হালনাগাদ করা হয়েছে।',
'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ%s সংযোজন করা হয়েছে।',
'Edit' => 'সম্পাদনা',
'Insert' => 'সংযোজন',
'Save and insert next' => 'সংরক্ষন ও পরবর্তী সংযোজন',
'Delete' => 'মুছে ফেল',
'Save and insert next' => 'সংরক্ষন ও পরবর্তী সংযোজন করুন',
'Delete' => 'মুছে ফেলুন',
'Database' => 'ডাটাবেজ',
'Routines' => 'রুটিনসমূহ',
'Indexes have been altered.' => 'সূচীসমূহ সম্পাদনা করা হয়েছে।',
'Indexes' => 'সূচীসমূহ',
'Alter indexes' => 'সূচীসমূহ সম্পাদনা',
'Add next' => 'সংযোজন',
'Alter indexes' => 'সূচীসমূহ পরিবর্তন করুন',
'Add next' => 'পরবর্তী সংযোজন করুন',
'Language' => 'ভাষা',
'Select' => 'নির্বাচন',
'New item' => 'নতুন বিষয়বস্তু',
@@ -61,90 +61,90 @@ $translations = array(
'edit' => 'সম্পাদনা',
'Page' => 'পৃষ্ঠা',
'Query executed OK, %d row(s) affected.' => array('কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।', 'কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।'),
'Error in query' => 'কোয়্যারীতে ভুল আছে',
'Error in query' => 'অনুসন্ধানে ভুল আছে',
'Execute' => 'সম্পাদন করো',
'Table' => 'টেবিল',
'Foreign keys' => 'ফরেন কী',
'Triggers' => 'ট্রিগার',
'View' => 'ভিউ',
'Unable to select the table' => 'টেবিল নির্বাচন করতে অক্ষম',
'Invalid CSRF token. Send the form again.' => 'অবৈধ CSRF টোকেন। ফর্ম আবার পাঠা।',
'Invalid CSRF token. Send the form again.' => 'অবৈধ CSRF টোকেন। ফর্মটি আবার পাঠা।',
'Comment' => 'মন্তব্য',
'Default values' => 'ডিফল্ট মান',
'%d byte(s)' => array('%d বাইট', '%d বাইটসমূহ'),
'No commands to execute.' => 'সম্পাদন করার মত কোন নির্দেশ নই।',
'No commands to execute.' => 'সম্পাদন করার মত কোন নির্দেশ নই।',
'Unable to upload a file.' => 'ফাইল আপলোড করা সম্ভব হচ্ছে না।',
'File upload' => 'ফাইল আপলোড',
'File uploads are disabled.' => 'ফাইল আপলোড নিষ্ক্রিয় করা আছে।',
'Routine has been called, %d row(s) affected.' => array('রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।', 'রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।'),
'Routine has been called, %d row(s) affected.' => array('রুটিন কল করা হয়েছে, %d টি সারি(সমূহ) প্রভাবিত হয়েছে।', 'রুটিন কল করা হয়েছে, %d টি সারি(সমূহ) প্রভাবিত হয়েছে।'),
'Call' => 'কল',
'No extension' => 'কোন এক্সটেনশান নাই',
'None of the supported PHP extensions (%s) are available.' => 'কোন PHP সমর্থিত এক্সটেনশন (%s) পাওয়া যায় নাই।',
'Session support must be enabled.' => 'সেশন সমর্থন সক্রিয় করা আবশ্যক।',
'Session expired, please login again.' => 'সেশনের মেয়াদ শেষ হয়েছে, আবার লগইন করুন।',
'Session expired, please login again.' => 'সেশনের মেয়াদ শেষ হয়েছে, আবার লগইন করুন।',
'Text length' => 'টেক্সট দৈর্ঘ্য',
'Foreign key has been dropped.' => 'ফরেন কী মুছে ফেলা হয়েছে।',
'Foreign key has been altered.' => 'ফরেন কী সম্পাদনা করা হয়েছে।',
'Foreign key has been altered.' => 'ফরেন কী পরিবর্তন করা হয়েছে।',
'Foreign key has been created.' => 'ফরেন কী তৈরী করা হয়েছে।',
'Foreign key' => 'ফরেন কী ',
'Target table' => 'টার্গেট টেবিল',
'Change' => 'পরিবর্তন',
'Source' => 'উৎস',
'Target' => 'লক্ষ্য',
'Add column' => 'কলাম সংযোজন',
'Alter' => 'সম্পাদনা',
'Add foreign key' => 'ফরেন কী সংযোজন কর',
'Add column' => 'কলাম সংযোজন করুন',
'Alter' => 'পরিবর্তন',
'Add foreign key' => 'ফরেন কী সংযোজন করুন',
'ON DELETE' => 'অন ডিলিট',
'ON UPDATE' => 'অন আপডেট',
'Index Type' => 'সূচী-ধরণ',
'Column (length)' => 'কলাম (দৈর্ঘ্য)',
'length' => 'দৈর্ঘ্য',
'View has been dropped.' => 'ভিউ মুছে ফেলা হয়েছে।',
'View has been altered.' => 'ভিউ সম্পাদনা করা হয়েছে।',
'View has been altered.' => 'ভিউ পরিবর্তন করা হয়েছে।',
'View has been created.' => 'ভিউ তৈরী করা হয়েছে।',
'Alter view' => 'ভিউ সম্পাদনা কর',
'Create view' => 'ভিউ তৈরী কর',
'Alter view' => 'ভিউ পরিবর্তন করুন',
'Create view' => 'ভিউ তৈরী করুন',
'Name' => 'নাম',
'Process list' => 'প্রসেস তালিকা',
'%d process(es) have been killed.' => array('%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।', '%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।'),
'%d process(es) have been killed.' => array('%d টি প্রসেস(সমূহ) বিনষ্ট করা হয়েছে।', '%d টি প্রসেস(সমূহ) বিনষ্ট করা হয়েছে।'),
'Kill' => 'বিনষ্ট করো',
'Parameter name' => 'প্যারামিটারের নাম',
'Database schema' => 'ডাটাবেজ স্কিমা',
'Create procedure' => 'প্রসিডিওর তৈরী কর',
'Create function' => 'ফাংশন তৈরী কর',
'Create procedure' => 'কার্যপ্রণালী তৈরী করুন',
'Create function' => 'ফাংশন তৈরী করুন',
'Routine has been dropped.' => 'রুটিন মুছে ফেলা হয়েছে।',
'Routine has been altered.' => 'রুটিন সম্পাদনা করা হয়েছে।',
'Routine has been altered.' => 'রুটিন পরিবর্তন করা হয়েছে।',
'Routine has been created.' => 'রুটিন তৈরী করা হয়েছে।',
'Alter function' => 'ফাংশন সম্পাদনা কর',
'Alter procedure' => 'প্রসিডিওর সম্পাদনা কর',
'Alter function' => 'ফাংশন পরিবর্তন করুন',
'Alter procedure' => 'কার্যপ্রণালী পরিবর্তন করুন',
'Return type' => 'রিটার্ন টাইপ',
'Add trigger' => 'ট্রিগার সংযোজন কর',
'Add trigger' => 'ট্রিগার সংযোজন করুন',
'Trigger has been dropped.' => 'ট্রিগার মুছে ফেলা হয়েছে।',
'Trigger has been altered.' => 'ট্রিগার সম্পাদনা করা হয়েছে।',
'Trigger has been altered.' => 'ট্রিগার পরিবর্তন করা হয়েছে।',
'Trigger has been created.' => 'ট্রিগার তৈরী করা হয়েছে।',
'Alter trigger' => 'ট্রিগার সম্পাদনা কর',
'Create trigger' => 'ট্রিগার তৈরী কর',
'Alter trigger' => 'ট্রিগার পরিবর্তন করুন',
'Create trigger' => 'ট্রিগার তৈরী করুন',
'Time' => 'সময়',
'Event' => 'ইভেন্ট',
'%s version: %s through PHP extension %s' => 'ভার্সন %s: %s, %s PHP এক্সটেনশনের মধ্য দিয়ে',
'%d row(s)' => array('%d সারি', '%d সারি সমূহ'),
'Remove' => 'অপসারণ',
'Are you sure?' => 'তুমি কি নিশ্চিত?',
'Remove' => 'মুছে ফেলুন',
'Are you sure?' => 'আপনি কি নিশ্চিত?',
'Privileges' => 'প্রিভিলেজেস',
'Create user' => 'ইউজার তৈরী কর',
'User has been dropped.' => 'ইউজার মুছে ফেলা হয়েছে।',
'User has been altered.' => 'ইউজার সম্পাদনা করা হয়েছে।',
'User has been created.' => 'ইউজার তৈরী করা হয়েছে।',
'Hashed' => 'হ্যাড',
'Create user' => 'ব্যবহারকারি তৈরী করুন',
'User has been dropped.' => 'ব্যবহারকারি মুছে ফেলা হয়েছে।',
'User has been altered.' => 'ব্যবহারকারি সম্পাদনা করা হয়েছে।',
'User has been created.' => 'ব্যবহারকারি তৈরী করা হয়েছে।',
'Hashed' => 'হ্যাড',
'Column' => 'কলাম',
'Routine' => 'রুটিন',
'Grant' => 'গ্র্যান্ট',
'Revoke' => 'রিভোক',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'খুব বড় POST ডাটা। ডাটা সংক্ষিপ্ত করো অথবা %s কনফিগারেশন নির্দেশ বৃদ্ধি করো',
'Grant' => 'অনুমতি',
'Revoke' => 'প্রত্যাহার',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'খুব বড় POST ডাটা। ডাটা সংক্ষিপ্ত করো অথবা %s কনফিগারেশন নির্দেশ বৃদ্ধি করো',
'Logged as: %s' => '%s হিসাবে লগড',
'Move up' => 'উপরে স্থানান্তর',
'Move down' => 'নীচে স্থানান্তর',
'Functions' => 'ফাংশন সমূহ',
'Aggregation' => 'মোট পরিমাণ',
'Aggregation' => 'সমষ্টি',
'Export' => 'এক্সপোর্ট',
'Output' => 'আউটপুট',
'open' => 'খোলা',
@@ -163,8 +163,8 @@ $translations = array(
'Schedule' => 'সময়সূচি',
'Start' => 'শুরু',
'End' => 'সমাপ্তি',
'Status' => 'স্ট্যাটাস',
'On completion preserve' => 'সমাপ্ত হওয়ার পর সংরক্ষন কর',
'Status' => 'অবস্থা',
'On completion preserve' => 'সমাপ্ত হওয়ার পর সংরক্ষন করুন',
'Tables and views' => 'টেবিল এবং ভিউ সমূহ',
'Data Length' => 'ডাটার দৈর্ঘ্য',
'Index Length' => 'ইনডেক্স এর দৈর্ঘ্য',
@@ -175,29 +175,29 @@ $translations = array(
'Check' => 'পরীক্ষা',
'Repair' => 'মেরামত',
'Truncate' => 'ছাঁটাই',
'Tables have been truncated.' => 'টেবিল ছাঁটাই করা হয়েছে',
'Rows' => 'সারি',
'Tables have been truncated.' => 'টেবিল ছাঁটাই করা হয়েছে',
'Rows' => 'সারিসমূহ',
',' => ',',
'0123456789' => '০১২৩৪৫৬৭৮৯',
'Tables have been moved.' => 'টেবিল স্থানান্তর করা হয়েছে।',
'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর কর',
'Move' => 'স্থানান্তর কর',
'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর করুন',
'Move' => 'স্থানান্তর করুন',
'Engine' => 'ইঞ্জিন',
'Save and continue edit' => 'সংরক্ষণ কর এবং সম্পাদনা চালিয়ে যা',
'Save and continue edit' => 'সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যা',
'original' => 'প্রকৃত',
'Tables have been dropped.' => 'টেবিলসমূহ মুছে ফেলা হয়েছে।',
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
'whole result' => 'সম্পূর্ণ ফলাফল',
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
'Whole result' => 'সম্পূর্ণ ফলাফল',
'Clone' => 'ক্লোন',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
'Partition by' => 'পার্টিশন যার মাধ্যমে',
'Partitions' => 'পার্টিশন',
'Partition name' => 'পার্টিশনের নাম',
'Values' => 'মানসমূহ',
'%d row(s) have been imported.' => array('%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।', '%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।'),
'%d row(s) have been imported.' => array('%d টি সারি(সমূহ) ইমপোর্ট করা হয়েছে।', '%d টি সারি(সমূহ) ইমপোর্ট করা হয়েছে।'),
'anywhere' => 'যে কোন স্থানে',
'Import' => 'ইমপোর্ট',
'Stop on error' => 'ত্রুটি পেলে থেমে যা',
'Stop on error' => 'ত্রুটি পেলে থেমে যা',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 't.m.[jjjj]',
@@ -207,24 +207,19 @@ $translations = array(
'Relations' => 'সম্পর্ক',
'Run file' => 'ফাইল চালাও',
'Clear' => 'সাফ করো',
'Maximum allowed file size is %sB.' => 'সর্বাধিক অনুমোদিত ফাইল সাইজ %sB.',
'Maximum allowed file size is %sB.' => 'সর্বাধিক অনুমোদিত ফাইল সাইজ %sB',
'Numbers' => 'সংখ্যা',
'Date and time' => 'তারিখ এবং সময়',
'Strings' => 'স্ট্রিং',
'Binary' => 'বাইনারি',
'Lists' => 'তালিকা',
'Editor' => 'সম্পাদক',
'E-mail' => '​​ই-মেইল',
'From' => 'থেকে',
'Subject' => 'বিষয়',
'Send' => 'পাঠাও',
'%d e-mail(s) have been sent.' => array('%d ইমেইল (গুলি) পাঠানো হয়েছে।', '%d ইমেইল (গুলি) পাঠানো হয়েছে।'),
'Webserver file %s' => 'ওয়েবসার্ভার ফাইল %s',
'File does not exist.' => 'ফাইলর কোন অস্তিত্ব নেই।',
'File does not exist.' => 'ফাইলটির কোন অস্তিত্ব নেই।',
'%d in total' => 'সর্বমোটঃ %d টি',
'Permanent login' => 'স্থায়ী লগইন',
'Databases have been dropped.' => 'ডাটাবেজসমূহ মুছে ফেলা হয়েছে।',
'Search data in tables' => 'টেবিলে খোঁজ করো',
'Search data in tables' => 'টেবিলে তথ্য খুঁজুন',
'Schema' => 'স্কিমা',
'Alter schema' => 'স্কিমা পরিবর্তন করো',
'Create schema' => 'স্কিমা তৈরী করো',
@@ -237,32 +232,83 @@ $translations = array(
'Sequence has been dropped.' => 'অনুক্রম মুছে ফেলা হয়েছে।',
'Sequence has been created.' => 'অনুক্রম তৈরি করা হয়েছে।',
'Sequence has been altered.' => 'অনুক্রম সম্পাদনা করা হয়েছে।',
'User types' => 'ইউজারের টাইপ',
'Create type' => 'টাইপ তৈরী কর',
'Alter type' => 'টাইপ পরিবর্তন কর',
'Type has been dropped.' => 'টাইপ মুছে ফেলা হয়েছে।',
'Type has been created.' => 'টাইপ তৈরি করা হয়েছে।',
'Use edit link to modify this value.' => 'এই মান পরিবর্তনের জন্য সম্পাদনা লিঙ্ক ব্যবহার কর।',
'User types' => 'ব্যবহারকারির ধরণ',
'Create type' => 'ধরণ তৈরী করুন',
'Alter type' => 'ধরণ পরিবর্তন করুন',
'Type has been dropped.' => 'ধরণ মুছে ফেলা হয়েছে।',
'Type has been created.' => 'ধরণ তৈরি করা হয়েছে।',
'Use edit link to modify this value.' => 'এই মানটি পরিবর্তনের জন্য সম্পাদনা লিঙ্ক ব্যবহার করুন।',
'last' => 'সর্বশেষ',
'From server' => 'সার্ভার থেকে',
'System' => 'সিস্টেম',
'Select data' => 'তথ্য নির্বাচন করো',
'Show structure' => 'গঠন দেখা',
'Show structure' => 'গঠন দেখা',
'empty' => 'খালি',
'Network' => 'নেটওয়ার্ক',
'Geometry' => 'জ্যামিতি',
'File exists.' => 'ফাইল রয়েছে।',
'Attachments' => 'সংযুক্তি',
'%d query(s) executed OK.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
'Show only errors' => 'শুধুমাত্র ত্রুটি দেখাও',
'%d query(s) executed OK.' => array('SQL-অনুসন্ধান সফলভাবে সম্পন্ন হয়েছে।', '%d SQL-অনুসন্ধানসমূহ সফলভাবে সম্পন্ন হয়েছে।'),
'Show only errors' => 'শুধুমাত্র ত্রুটিগুলো দেখান',
'Refresh' => 'রিফ্রেশ',
'Invalid schema.' => 'অবৈধ স্কিমা।',
'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার কর।',
'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার করুন।',
'now' => 'এখন',
'ltr' => 'ltr',
'Tables have been copied.' => 'টেবিল কপি করা হয়েছে।',
'Tables have been copied.' => 'টেবিলগুলো কপি করা হয়েছে।',
'Copy' => 'কপি',
'Permanent link' => 'স্থায়ী লিংক',
'Edit all' => 'সকল সম্পাদনা কর',
'Edit all' => 'সবগুলো সম্পাদনা করুন',
'HH:MM:SS' => 'HH:MM:SS',
'Check has been dropped.' => 'চেক ড্রপ করা হয়েছে।',
'Check has been altered.' => 'চেক পরিবর্তন করা হয়েছে।',
'Check has been created.' => 'চেক তৈরি করা হয়েছে।',
'Alter check' => 'চেক পরিবর্তন করুন',
'Create check' => 'চেক তৈরি করুন',
'Drop %s?' => '%s ড্রপ করবেন?',
'Tables have been optimized.' => 'টেবিলগুলি অপ্টিমাইজ করা হয়েছে।',
'Materialized view' => 'মেটেরিয়ালাইজড ভিউ',
'Vacuum' => 'ভ্যাকুয়াম',
'Selected' => 'নির্বাচিত',
'overwrite' => 'ওভাররাইট',
'DB' => 'ডিবি',
'Algorithm' => 'অ্যালগরিদম',
'Columns' => 'কলাম',
'Ctrl+click on a value to modify it.' => 'একটি মান পরিবর্তন করতে Ctrl+ক্লিক করুন।',
'File must be in UTF-8 encoding.' => 'ফাইলটি UTF-8 এনকোডিংয়ে হতে হবে।',
'Modify' => 'পরিবর্তন করুন',
'Load more data' => 'আরও ডেটা লোড করুন',
'Loading' => 'লোড হচ্ছে',
'ATTACH queries are not supported.' => 'ATTACH কোয়েরি সমর্থিত নয়।',
'Warnings' => 'সতর্কতা',
'%d / ' => array('%d / '),
'Limit rows' => 'সারি সীমিত করুন',
'Inherits from' => 'থেকে উত্তরাধিকারসূত্রে প্রাপ্ত',
'Checks' => 'চেকস',
'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>।',
'Default value' => 'ডিফল্ট মান',
'Full table scan' => 'সম্পূর্ণ টেবিল স্ক্যান',
'Too many unsuccessful logins, try again in %d minute(s).' => array('অনেকগুলি ব্যর্থ লগইন প্রচেষ্টা, %d মিনিট পরে আবার চেষ্টা করুন।'),
'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> কথা বিবেচনা করুন।',
'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 মেথড।',
'The action will be performed after successful login with the same credentials.' => 'একই ক্রেডেনশিয়ালস দিয়ে সফলভাবে লগইন করার পরে এই কর্মটি সম্পাদন করা হবে।',
'Connecting to privileged ports is not allowed.' => 'প্রিভিলেজড পোর্টে সংযোগ করা অনুমোদিত নয়।',
'There is a space in the input password which might be the cause.' => 'ইনপুট পাসওয়ার্ডে একটি স্পেস রয়েছে যা এর কারণ হতে পারে।',
'If you did not send this request from Adminer then close this page.' => 'আপনি যদি Adminer থেকে এই অনুরোধ না করে থাকেন তবে এই পৃষ্ঠাটি বন্ধ করুন।',
'You can upload a big SQL file via FTP and import it from server.' => 'আপনি FTP এর মাধ্যমে একটি বড় SQL ফাইল আপলোড করতে পারেন এবং সার্ভার থেকে এটি ইম্পোর্ট করতে পারেন।',
'Size' => 'আকার',
'Compute' => 'কম্পিউট',
'Loaded plugins' => 'লোড করা প্লাগইনগুলি',
'screenshot' => 'স্ক্রিনশট',
'You are offline.' => 'আপনি অফলাইনে আছেন।',
'You have no privileges to update this table.' => 'এই টেবিল আপডেট করার জন্য আপনার কোন অনুমতি নেই।',
'Saving' => 'সংরক্ষণ করা হচ্ছে',
'Unknown error.' => 'অজানা ত্রুটি।',
'%s must <a%s>return an array</a>.' => '%s অবশ্যই <a%s>একটি অ্যারে রিটার্ন করতে হবে</a>।',
'<a%s>Configure</a> %s in %s.' => '<a%s>কনফিগার করুন</a> %s এ %s।',
'Disable %s or enable %s or %s extensions.' => '%s নিষ্ক্রিয় করুন অথবা %s বা %s এক্সটেনশন সক্রিয় করুন।',
'Database does not support password.' => 'ডাটাবেস পাসওয়ার্ড সমর্থন করে না।',
'yes' => 'হ্যাঁ',
'no' => 'না',
);
// run `php ../../lang.php bn` to update this file

317
adminer/lang/bs.inc.php Normal file
View File

@@ -0,0 +1,317 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Server',
'Username' => 'Korisničko ime',
'Password' => 'Lozinka',
'Permanent login' => 'Trajna prijava',
'Login' => 'Prijava',
'Logout' => 'Odjava',
'Logged as: %s' => 'Prijavi se kao: %s',
'Logout successful.' => 'Uspešna odjava.',
'Invalid credentials.' => 'Nevažeće dozvole.',
'Language' => 'Jezik',
'Invalid CSRF token. Send the form again.' => 'Nevažeći CSRF kod. Proslijedite ponovo formu.',
'No extension' => 'Bez dodataka',
'None of the supported PHP extensions (%s) are available.' => 'Nijedan od podržanih PHP dodataka (%s) nije dostupan.',
'Session support must be enabled.' => 'Morate omogućiti podršku za sesije.',
'Session expired, please login again.' => 'Vaša sesija je istekla, prijavite se ponovo.',
'%s version: %s through PHP extension %s' => '%s verzija: %s pomoću PHP dodatka je %s',
'Refresh' => 'Osveži',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Dozvole',
'Create user' => 'Novi korisnik',
'User has been dropped.' => 'Korisnik je izbrisan.',
'User has been altered.' => 'Korisnik je izmijenjen.',
'User has been created.' => 'korisnik je spašen.',
'Hashed' => 'Heširano',
'Column' => 'kolumna',
'Routine' => 'Rutina',
'Grant' => 'Dozvoli',
'Revoke' => 'Opozovi',
'Process list' => 'Spisak procesa',
'%d process(es) have been killed.' => array('%d proces je ukinut.', '%d procesa su ukinuta.', '%d procesa je ukinuto.'),
'Kill' => 'Ubij',
'Variables' => 'Promijenljive',
'Status' => 'Status',
'SQL command' => 'SQL komanda',
'%d query(s) executed OK.' => array('%d upit je uspiješno izvršen.', '%d upita su uspiješno izvršena.', '%d upita je uspiješno izvršeno.'),
'Query executed OK, %d row(s) affected.' => array('Upit je uspiješno izvršen, %d red je ažuriran.', 'Upit je uspiješno izvršen, %d reda su ažurirana.', 'Upit je uspiješno izvršen, %d redova je ažurirano.'),
'No commands to execute.' => 'Bez komandi za izvršavanje.',
'Error in query' => 'Greška u upitu',
'Execute' => 'Izvrši',
'Stop on error' => 'Zaustavi prilikom greške',
'Show only errors' => 'Prikazuj samo greške',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historijat',
'Clear' => 'Očisti',
'Edit all' => 'Izmijeni sve',
'File upload' => 'Slanje datoteka',
'From server' => 'Sa servera',
'Webserver file %s' => 'Datoteka %s sa veb servera',
'Run file' => 'Pokreni datoteku',
'File does not exist.' => 'Datoteka ne postoji.',
'File uploads are disabled.' => 'Onemogućeno je slanje datoteka.',
'Unable to upload a file.' => 'Slanje datoteke nije uspelo.',
'Maximum allowed file size is %sB.' => 'Najveća dozvoljena veličina datoteke je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliki POST podatak. Morate da smanjite podatak ili povećajte vrijednost konfiguracione direktive %s.',
'Export' => 'Izvoz',
'Output' => 'Ispis',
'open' => 'otvori',
'save' => 'spasi',
'Format' => 'Format',
'Data' => 'Podaci',
'Database' => 'Baza podataka',
'Use' => 'Koristi',
'Select database' => 'Izaberite 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 spašena.',
'Database has been renamed.' => 'Baza podataka je preimenovana.',
'Database has been altered.' => 'Baza podataka je izmijenjena.',
'Alter database' => 'Ažuriraj bazu podataka',
'Create database' => 'Formiraj bazu podataka',
'Database schema' => 'Šema baze podataka',
// link to current database schema layout
'Permanent link' => 'Trajna veza',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Stroj',
'Collation' => 'Sravnjivanje',
'Data Length' => 'Dužina podataka',
'Index Length' => 'Dužina indeksa',
'Data Free' => 'Slobodno podataka',
'Rows' => 'Redova',
'%d in total' => 'ukupno %d',
'Analyze' => 'Analiziraj',
'Optimize' => 'Optimizuj',
'Check' => 'Provjeri',
'Repair' => 'Popravi',
'Truncate' => 'Isprazni',
'Tables have been truncated.' => 'Tabele su ispražnjene.',
'Move to other database' => 'Premijesti u drugu bazu podataka',
'Move' => 'Premijesti',
'Tables have been moved.' => 'Tabele su premješćene.',
'Copy' => 'Umnoži',
'Tables have been copied.' => 'Tabele su umnožene.',
'Routines' => 'Rutine',
'Routine has been called, %d row(s) affected.' => array('Pozvana je rutina, %d red je ažuriran.', 'Pozvana je rutina, %d reda su ažurirani.', 'Pozvana je rutina, %d redova je ažurirano.'),
'Call' => 'Pozovi',
'Parameter name' => 'Naziv parametra',
'Create procedure' => 'Formiraj proceduru',
'Create function' => 'Formiraj funkciju',
'Routine has been dropped.' => 'Rutina je izbrisana.',
'Routine has been altered.' => 'Rutina je izmijenjena.',
'Routine has been created.' => 'Rutina je spašena.',
'Alter function' => 'Ažuriraj funkciju',
'Alter procedure' => 'Ažuriraj proceduru',
'Return type' => 'Povratni tip',
'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 spašen.',
'Alter event' => 'Ažuriraj događaj',
'Create event' => 'Napravi događaj',
'At given time' => 'U zadato vrijeme',
'Every' => 'Svaki',
'Schedule' => 'Raspored',
'Start' => 'Početak',
'End' => 'Kraj',
'On completion preserve' => 'Zadrži po završetku',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele i pogledi',
'Table' => 'Tabela',
'No tables.' => 'Bez tabela.',
'Alter table' => 'Ažuriraj tabelu',
'Create table' => 'Napravi tabelu',
'Table has been dropped.' => 'Tabela je izbrisana.',
'Tables have been dropped.' => 'Tabele su izbrisane.',
'Tables have been optimized.' => 'Tabele su optimizovane.',
'Table has been altered.' => 'Tabela je izmijenjena.',
'Table has been created.' => 'Tabela je spašena.',
'Table name' => 'Naziv tabele',
'Show structure' => 'Prikaži strukturu',
'engine' => 'stroj',
'collation' => 'Sravnjivanje',
'Column name' => 'Naziv kolumne',
'Type' => 'Tip',
'Length' => 'Dužina',
'Auto Increment' => 'Auto-priraštaj',
'Options' => 'Opcije',
'Comment' => 'Komentar',
'Default values' => 'Podrazumijevane vrijednosti',
'Drop' => 'Izbriši',
'Are you sure?' => 'Da li ste sigurni?',
'Move up' => 'Pomijeri na gore',
'Move down' => 'Pomijeri na dole',
'Remove' => 'Ukloni',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Premašen je maksimalni broj dozvoljenih polja. Molim uvećajte %s.',
'Partition by' => 'Podijeli po',
'Partitions' => 'Podijele',
'Partition name' => 'Ime podijele',
'Values' => 'Vrijednosti',
'View' => 'Pogled',
'View has been dropped.' => 'Pogled je izbrisan.',
'View has been altered.' => 'Pogled je izmijenjen.',
'View has been created.' => 'Pogled je spašen.',
'Alter view' => 'Ažuriraj pogled',
'Create view' => 'Napravi pogled',
'Indexes' => 'Indeksi',
'Indexes have been altered.' => 'Indeksi su izmijenjeni.',
'Alter indexes' => 'Ažuriraj indekse',
'Add next' => 'Dodaj slijedeći',
'Index Type' => 'Tip indeksa',
'length' => 'dužina',
'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 spašen.',
'Target table' => 'Ciljna tabela',
'Change' => 'izmijeni',
'Source' => 'Izvor',
'Target' => 'Cilj',
'Add column' => 'Dodaj kolumnu',
'Alter' => 'Ažuriraj',
'Add foreign key' => 'Dodaj strani ključ',
'ON DELETE' => 'ON DELETE (prilikom brisanja)',
'ON UPDATE' => 'ON UPDATE (prilikom osvežavanja)',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorne i ciljne kolumne moraju biti istog tipa, ciljna kolumna mora biti indeksirana i izvorna tabela mora sadržati podatke iz ciljne.',
'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 spašen.',
'Alter trigger' => 'Ažuriraj okidač',
'Create trigger' => 'Formiraj okidač',
'Time' => 'Vrijeme',
'Event' => 'Događaj',
'Name' => 'Ime',
'select' => 'izaberi',
'Select' => 'Izaberi',
'Selected' => 'Izabrano',
'Select data' => 'Izaberi podatke',
'Functions' => 'Funkcije',
'Aggregation' => 'Sakupljanje',
'Search' => 'Pretraga',
'anywhere' => 'bilo gdje',
'Search data in tables' => 'Pretraži podatke u tabelama',
'Sort' => 'Poređaj',
'descending' => 'opadajuće',
'Limit' => 'Granica',
'Text length' => 'Dužina teksta',
'Action' => 'Akcija',
'Full table scan' => 'Skreniranje kompletne tabele',
'Unable to select the table' => 'Ne mogu da izaberem tabelu',
'No rows.' => 'Bez redova.',
'%d row(s)' => array('%d red', '%d reda', '%d redova'),
'Page' => 'Strana',
'last' => 'poslijednja',
'Loading' => 'Učitavam',
'Load more data' => 'Učitavam još podataka',
'Whole result' => 'Ceo rezultat',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajtova'),
'Import' => 'Uvoz',
'%d row(s) have been imported.' => array('%d red je uvežen.', '%d reda su uvežena.', '%d redova je uveženo.'),
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrijednost za izmijenu.',
'Use edit link to modify this value.' => 'Koristi vezu za izmijenu ove vrijednosti.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Stavka %s je spašena.',
'Item has been deleted.' => 'Stavka je izbrisana.',
'Item has been updated.' => 'Stavka je izmijenjena.',
'%d item(s) have been affected.' => array('%d stavka je ažurirana.', '%d stavke su ažurirane.', '%d stavki je ažurirano.'),
'New item' => 'Nova stavka',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'prazno',
'edit' => 'izmijeni',
'Edit' => 'Izmijeni',
'Insert' => 'Umetni',
'Save' => 'Sačuvaj',
'Save and continue edit' => 'Sačuvaj i nastavi uređenje',
'Save and insert next' => 'Sačuvaj i umijetni slijedeće',
'Clone' => 'Dupliraj',
'Delete' => 'Izbriši',
'Modify' => 'Izmjene',
// data type descriptions
'Numbers' => 'Broj',
'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' => 'sad',
'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.' => 'Molim koristite jedan od nastavaka %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ažuriraj šemu',
'Create schema' => 'Formiraj šemu',
'Schema has been dropped.' => 'Šema je izbrisana.',
'Schema has been created.' => 'Šema je spašena.',
'Schema has been altered.' => 'Šema je izmijenjena.',
'Schema' => 'Šema',
'Invalid schema.' => 'Šema nije ispravna.',
// PostgreSQL sequences support
'Sequences' => 'Nizovi',
'Create sequence' => 'Napravi niz',
'Sequence has been dropped.' => 'Niz je izbrisan.',
'Sequence has been created.' => 'Niz je formiran.',
'Sequence has been altered.' => 'Niz je izmijenjen.',
'Alter sequence' => 'Ažuriraj niz',
// PostgreSQL user types support
'User types' => 'Korisnički tipovi',
'Create type' => 'Definiši tip',
'Type has been dropped.' => 'Tip je izbrisan.',
'Type has been created.' => 'tip je spašen.',
'Alter type' => 'Ažuriraj tip',
);
// run `php ../../lang.php bs` to update this file

View File

@@ -1,14 +1,15 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Inicia la sessió',
'Logout successful.' => 'Desconnexió correcta.',
'Invalid credentials.' => 'Credencials invàlids.',
'Invalid credentials.' => 'Credencials invàlides.',
'Server' => 'Servidor',
'Username' => 'Nom d\'usuari',
'Password' => 'Contrasenya',
'Select database' => 'Selecciona base de dades',
'Invalid database.' => 'Base de dades invàlida.',
'Create new database' => 'Crea una nova base de dades',
'Table has been dropped.' => 'S\'ha suprimit la taula.',
'Table has been altered.' => 'S\'ha modificat la taula.',
'Table has been created.' => 'S\'ha creat la taula.',
@@ -32,11 +33,10 @@ $translations = array(
'Create database' => 'Crea una base de dades',
'SQL command' => 'Ordre SQL',
'Logout' => 'Desconnecta',
'database' => 'base de dades',
'Use' => 'Utilitza',
'No tables.' => 'No hi ha cap taula.',
'select' => 'registres',
'Item has been deleted.' => 'S\'ha suprmit l\'element.',
'Item has been deleted.' => 'S\'ha suprimit l\'element.',
'Item has been updated.' => 'S\'ha actualitzat l\'element.',
'Item%s has been inserted.' => 'S\'ha insertat l\'element%s.',
'Edit' => 'Edita',
@@ -45,9 +45,9 @@ $translations = array(
'Delete' => 'Suprimeix',
'Database' => 'Base de dades',
'Routines' => 'Rutines',
'Indexes have been altered.' => 'S\'han modificat els índexs.',
'Indexes have been altered.' => 'S\'han modificat els índex.',
'Indexes' => 'Índexs',
'Alter indexes' => 'Modifica els índexs',
'Alter indexes' => 'Modifica els índex',
'Add next' => 'Afegeix el següent',
'Language' => 'Idioma',
'Select' => 'Selecciona',
@@ -75,11 +75,11 @@ $translations = array(
'No commands to execute.' => 'Cap comanda per executar.',
'Unable to upload a file.' => 'Impossible adjuntar el fitxer.',
'File upload' => 'Adjunta un fitxer',
'File uploads are disabled.' => 'L\'ddjunció de fitxers està desactivada.',
'File uploads are disabled.' => 'La pujada de fitxers està desactivada.',
'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d registre modificat.', 'S\'ha cridat la rutina, %d registres modificats.'),
'Call' => 'Crida',
'No extension' => 'Cap extensió',
'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.',
'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP suportades (%s) disponible.',
'Session support must be enabled.' => 'Cal que estigui permès l\'us de sessions.',
'Session expired, please login again.' => 'La sessió ha expirat, torna a iniciar-ne una.',
'Text length' => 'Longitud del text',
@@ -87,7 +87,7 @@ $translations = array(
'Foreign key has been altered.' => 'S\'ha modificat la clau forana.',
'Foreign key has been created.' => 'S\'ha creat la clau forana.',
'Foreign key' => 'Clau forana',
'Target table' => 'Taula de destí',
'Target table' => 'Taula de destinació',
'Change' => 'Canvi',
'Source' => 'Font',
'Target' => 'Destí',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipus d\'índex',
'Column (length)' => 'Columna (longitud)',
'length' => 'longitud',
'View has been dropped.' => 'S\'ha suprimit la vista.',
'View has been altered.' => 'S\'ha modificat la vista.',
'View has been created.' => 'S\'ha creat la vista.',
@@ -140,7 +140,7 @@ $translations = array(
'Grant' => 'Grant',
'Revoke' => 'Revoke',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Les dades POST són massa grans. Redueix les dades o incrementa la directiva de configuració %s.',
'Logged as: %s' => 'Connectat com: %s',
'Logged as: %s' => 'Connectat com a: %s',
'Move up' => 'Mou a dalt',
'Move down' => 'Mou a baix',
'Functions' => 'Funcions',
@@ -186,7 +186,7 @@ $translations = array(
'Save and continue edit' => 'Desa i segueix editant',
'original' => 'original',
'%d item(s) have been affected.' => array('S\'ha modificat %d element.', 'S\'han modificat %d elements.'),
'whole result' => 'tots els resultats',
'Whole result' => 'Tots els resultats',
'Tables have been dropped.' => 'S\'han suprimit les taules.',
'Clone' => 'Clona',
'Partition by' => 'Fes particions segons',
@@ -205,12 +205,7 @@ $translations = array(
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Història',
'Variables' => 'Variables',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes origen i destí han de ser del mateix tipus, la columna destí ha d\'estar indexada i les dades referenciades han d\'existir.',
'E-mail' => 'Correu electrònic',
'From' => 'De',
'Subject' => 'Assumpte',
'Send' => 'Envia',
'%d e-mail(s) have been sent.' => array('S\'ha enviat %d correu electrònic.', 'S\'han enviat %d correus electrònics.'),
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Les columnes d\'origen i de destinació han de ser del mateix tipus, la columna de destinació ha d\'estar indexada i les dades referenciades han d\'existir.',
'Run file' => 'Executa el fitxer',
'Numbers' => 'Nombres',
'Date and time' => 'Data i hora',
@@ -225,7 +220,6 @@ $translations = array(
'File does not exist.' => 'El fitxer no existeix.',
'Permanent login' => 'Sessió permanent',
'%d in total' => '%d en total',
'Attachments' => 'Adjuncions',
'System' => 'Sistema',
'last' => 'darrera',
'Network' => 'Xarxa',
@@ -267,3 +261,5 @@ $translations = array(
'Edit all' => 'Edita-ho tot',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php ca` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Systém',
'Server' => 'Server',
@@ -10,22 +12,29 @@ $translations = array(
'Logout' => 'Odhlásit',
'Logged as: %s' => 'Přihlášen jako: %s',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Díky za použití Admineru, <a href="https://www.adminer.org/cs/donation/">přispějte</a> na vývoj.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'There is a space in the input password which might be the cause.' => 'Problém může být, že je v zadaném hesle mezera.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
'Database does not support password.' => 'Databáze nepodporuje heslo.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="http://www.adminer.org/cs/extension/" target="_blank">Implementujte</a> metodu %s, aby platilo stále.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="https://www.adminer.org/cs/extension/"%s>Implementujte</a> metodu %s, aby platilo stále.',
'Language' => 'Jazyk',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
'If you did not send this request from Adminer then close this page.' => 'Pokud jste tento požadavek neposlali z Adminera, tak tuto stránku zavřete.',
'No extension' => 'Žádné rozšíření',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
'Connecting to privileged ports is not allowed.' => 'Připojování k privilegovaným portům není povoleno.',
'Disable %s or enable %s or %s extensions.' => 'Zakažte %s nebo povolte rozšíření %s nebo %s.',
'Session support must be enabled.' => 'Session proměnné musí být povolené.',
'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.',
'Session expired, please login again.' => 'Session vypršela, přihlaste se prosím znovu.',
'The action will be performed after successful login with the same credentials.' => 'Akce bude provedena po úspěšném přihlášení se stejnými přihlašovacími údaji.',
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
'Refresh' => 'Obnovit',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Oprávnění',
'Create user' => 'Vytvořit uživatele',
'User has been dropped.' => 'Uživatel byl odstraněn.',
@@ -33,22 +42,26 @@ $translations = array(
'User has been created.' => 'Uživatel byl vytvořen.',
'Hashed' => 'Zahašované',
'Column' => 'Sloupec',
'Columns' => 'Sloupce',
'Routine' => 'Procedura',
'Grant' => 'Povolit',
'Revoke' => 'Zakázat',
'Process list' => 'Seznam procesů',
'%d process(es) have been killed.' => array('Byl ukončen %d proces.', 'Byly ukončeny %d procesy.', 'Bylo ukončeno %d procesů.'),
'Kill' => 'Ukončit',
'Variables' => 'Proměnné',
'Status' => 'Stav',
'SQL command' => 'SQL příkaz',
'%d query(s) executed OK.' => array('%d příkaz proběhl v pořádku.', '%d příkazy proběhly v pořádku.', '%d příkazů proběhlo v pořádku.'),
'Query executed OK, %d row(s) affected.' => array('Příkaz proběhl v pořádku, byl změněn %d záznam.', 'Příkaz proběhl v pořádku, byly změněny %d záznamy.', 'Příkaz proběhl v pořádku, bylo změněno %d záznamů.'),
'No commands to execute.' => 'Žádné příkazy k vykonání.',
'Error in query' => 'Chyba v dotazu',
'Unknown error.' => 'Neznámá chyba.',
'Warnings' => 'Varování',
'ATTACH queries are not supported.' => 'Dotazy ATTACH nejsou podporované.',
'Execute' => 'Provést',
'Stop on error' => 'Zastavit při chybě',
'Show only errors' => 'Zobrazit pouze chyby',
@@ -57,32 +70,32 @@ $translations = array(
'History' => 'Historie',
'Clear' => 'Vyčistit',
'Edit all' => 'Upravit vše',
'File upload' => 'Nahrání souboru',
'From server' => 'Ze serveru',
'Webserver file %s' => 'Soubor %s na webovém serveru',
'Run file' => 'Spustit soubor',
'File does not exist.' => 'Soubor neexistuje.',
'Increase %s.' => 'Zvyšte %s.',
'File uploads are disabled.' => 'Nahrávání souborů není povoleno.',
'Unable to upload a file.' => 'Nepodařilo se nahrát soubor.',
'Maximum allowed file size is %sB.' => 'Maximální povolená velikost souboru je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Příliš velká POST data. Zmenšete data nebo zvyšte hodnotu konfigurační direktivy %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Velký SQL soubor můžete nahrát pomocí FTP a importovat ho ze serveru.',
'You are offline.' => 'Jste offline.',
'Export' => 'Export',
'Output' => 'Výstup',
'open' => 'otevřít',
'save' => 'uložit',
'Format' => 'Formát',
'Data' => 'Data',
'Database' => 'Databáze',
'database' => 'databáze',
'DB' => 'DB',
'Use' => 'Vybrat',
'Select database' => 'Vybrat databázi',
'Invalid database.' => 'Nesprávná databáze.',
'Create new database' => 'Vytvořit novou databázi',
'Database has been dropped.' => 'Databáze byla odstraněna.',
'Databases have been dropped.' => 'Databáze byly odstraněny.',
'Database has been created.' => 'Databáze byla vytvořena.',
@@ -91,10 +104,10 @@ $translations = array(
'Alter database' => 'Pozměnit databázi',
'Create database' => 'Vytvořit databázi',
'Database schema' => 'Schéma databáze',
// link to current database schema layout
'Permanent link' => 'Trvalý odkaz',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
@@ -117,7 +130,8 @@ $translations = array(
'Tables have been moved.' => 'Tabulky byly přesunuty.',
'Copy' => 'Zkopírovat',
'Tables have been copied.' => 'Tabulky byly zkopírovány.',
'overwrite' => 'přepsat',
'Routines' => 'Procedury a funkce',
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
'Call' => 'Zavolat',
@@ -130,7 +144,7 @@ $translations = array(
'Alter function' => 'Změnit funkci',
'Alter procedure' => 'Změnit proceduru',
'Return type' => 'Návratový typ',
'Events' => 'Události',
'Event has been dropped.' => 'Událost byla odstraněna.',
'Event has been altered.' => 'Událost byla změněna.',
@@ -143,7 +157,7 @@ $translations = array(
'Start' => 'Začátek',
'End' => 'Konec',
'On completion preserve' => 'Po dokončení zachovat',
'Tables' => 'Tabulky',
'Tables and views' => 'Tabulky a pohledy',
'Table' => 'Tabulka',
@@ -168,6 +182,7 @@ $translations = array(
'Default value' => 'Výchozí hodnota',
'Default values' => 'Výchozí hodnoty',
'Drop' => 'Odstranit',
'Drop %s?' => 'Odstranit %s?',
'Are you sure?' => 'Opravdu?',
'Size' => 'Velikost',
'Compute' => 'Spočítat',
@@ -175,28 +190,31 @@ $translations = array(
'Move down' => 'Přesunout dolů',
'Remove' => 'Odebrat',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s.',
'Partition by' => 'Rozdělit podle',
'Partitions' => 'Oddíly',
'Partition name' => 'Název oddílu',
'Values' => 'Hodnoty',
'Inherits from' => 'Zděděná z',
'Inherited by' => 'Zděděné',
'View' => 'Pohled',
'Materialized View' => 'Materializovaný pohled',
'Materialized view' => 'Materializovaný pohled',
'View has been dropped.' => 'Pohled byl odstraněn.',
'View has been altered.' => 'Pohled byl změněn.',
'View has been created.' => 'Pohled byl vytvořen.',
'Alter view' => 'Pozměnit pohled',
'Create view' => 'Vytvořit pohled',
'Create materialized view' => 'Vytvořit materializovaný pohled',
'Indexes' => 'Indexy',
'Indexes have been altered.' => 'Indexy byly změněny.',
'Alter indexes' => 'Pozměnit indexy',
'Add next' => 'Přidat další',
'Index Type' => 'Typ indexu',
'Column (length)' => 'Sloupec (délka)',
'length' => 'délka',
'Algorithm' => 'Algoritmus',
'Condition' => 'Podmínka',
'Foreign keys' => 'Cizí klíče',
'Foreign key' => 'Cizí klíč',
'Foreign key has been dropped.' => 'Cizí klíč byl odstraněn.',
@@ -212,7 +230,7 @@ $translations = array(
'ON DELETE' => 'Při smazání',
'ON UPDATE' => 'Při změně',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cílové sloupce musí mít stejný datový typ, nad cílovými sloupci musí být definován index a odkazovaná data musí existovat.',
'Triggers' => 'Triggery',
'Add trigger' => 'Přidat trigger',
'Trigger has been dropped.' => 'Trigger byl odstraněn.',
@@ -223,7 +241,7 @@ $translations = array(
'Time' => 'Čas',
'Event' => 'Událost',
'Name' => 'Název',
'select' => 'vypsat',
'Select' => 'Vypsat',
'Select data' => 'Vypsat data',
@@ -245,20 +263,20 @@ $translations = array(
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
'Page' => 'Stránka',
'last' => 'poslední',
'Load more data' => 'Nahrát další data',
'Loading' => 'Nahrává se',
'whole result' => 'celý výsledek',
'Load more data' => 'Načíst další data',
'Loading' => 'Načítá se',
'Whole result' => 'Celý výsledek',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtů'),
'Import' => 'Import',
'%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'),
'File must be in UTF-8 encoding.' => 'Soubor musí být v kódování UTF-8.',
// in-place editing in select
'Modify' => 'Změnit',
'Ctrl+click on a value to modify it.' => 'Ctrl+klikněte na políčko, které chcete změnit.',
'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Položka%s byla vložena.',
'Item has been deleted.' => 'Položka byla smazána.',
@@ -279,14 +297,7 @@ $translations = array(
'Clone' => 'Klonovat',
'Delete' => 'Smazat',
'You have no privileges to update this table.' => 'Nemáte oprávnění editovat tuto tabulku.',
'E-mail' => 'E-mail',
'From' => 'Odesílatel',
'Subject' => 'Předmět',
'Attachments' => 'Přílohy',
'Send' => 'Odeslat',
'%d e-mail(s) have been sent.' => array('Byl odeslán %d e-mail.', 'Byly odeslány %d e-maily.', 'Bylo odesláno %d e-mailů.'),
// data type descriptions
'Numbers' => 'Čísla',
'Date and time' => 'Datum a čas',
@@ -296,7 +307,7 @@ $translations = array(
'Network' => 'Síť',
'Geometry' => 'Geometrie',
'Relations' => 'Vztahy',
'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
@@ -307,11 +318,11 @@ $translations = array(
'now' => 'teď',
'yes' => 'ano',
'no' => 'ne',
// general SQLite error in create, drop or rename database
'File exists.' => 'Soubor existuje.',
'Please use one of the extensions %s.' => 'Prosím použijte jednu z koncovek %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Pozměnit schéma',
'Create schema' => 'Vytvořit schéma',
@@ -320,7 +331,7 @@ $translations = array(
'Schema has been altered.' => 'Schéma bylo změněno.',
'Schema' => 'Schéma',
'Invalid schema.' => 'Nesprávné schéma.',
// PostgreSQL sequences support
'Sequences' => 'Sekvence',
'Create sequence' => 'Vytvořit sekvenci',
@@ -328,11 +339,26 @@ $translations = array(
'Sequence has been created.' => 'Sekvence byla vytvořena.',
'Sequence has been altered.' => 'Sekvence byla změněna.',
'Alter sequence' => 'Pozměnit sekvenci',
// PostgreSQL user types support
'User types' => 'Uživatelské typy',
'Create type' => 'Vytvořit typ',
'Type has been dropped.' => 'Typ byl odstraněn.',
'Type has been created.' => 'Typ byl vytvořen.',
'Alter type' => 'Pozměnit typ',
// Table check constraints
'Checks' => 'Kontroly',
'Create check' => 'Vytvořit kontrolu',
'Alter check' => 'Změnit kontrolu',
'Check has been created.' => 'Kontrola byla vytvořena.',
'Check has been altered.' => 'Kontrola byla změněna.',
'Check has been dropped.' => 'Kontrola byla odstraněna.',
'Loaded plugins' => 'Nahrané pluginy',
'%s must <a%s>return an array</a>.' => '%s musí <a%s>vracet pole</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Nakonfigurujte</a> %s v %s.',
'screenshot' => 'obrázek',
);
// run `php ../../lang.php cs` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'System' => 'System',
'Server' => 'Server',
'Username' => 'Brugernavn',
@@ -10,7 +12,7 @@ $translations = array(
'Logged as: %s' => 'Logget ind som: %s',
'Logout successful.' => 'Log af vellykket.',
'Invalid credentials.' => 'Ugyldige log ind oplysninger.',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Master-kodeordet er udløbet. <a href="http://www.adminer.org/en/extension/" target="_blank">Implementer</a> en metode for %s for at gøre det permanent.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-kodeordet er udløbet. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for at gøre det permanent.',
'Language' => 'Sprog',
'Invalid CSRF token. Send the form again.' => 'Ugyldigt CSRF-token - Genindsend formen.',
'No extension' => 'Ingen udvidelse',
@@ -64,11 +66,9 @@ $translations = array(
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Database',
'database' => 'database',
'Use' => 'Brug',
'Select database' => 'Vælg database',
'Invalid database.' => 'Ugyldig database.',
'Create new database' => 'Opret ny database',
'Database has been dropped.' => 'Databasen er blevet slettet.',
'Databases have been dropped.' => 'Databasene er blevet slettet.',
'Database has been created.' => 'Databasen er oprettet.',
@@ -166,7 +166,7 @@ $translations = array(
'Alter indexes' => 'Ændre indekser',
'Add next' => 'Læg til næste',
'Index Type' => 'Indekstype',
'Column (length)' => 'Kolonne (længde)',
'length' => 'længde',
'Foreign keys' => 'Fremmednøgler',
'Foreign key' => 'Fremmednøgle',
'Foreign key has been dropped.' => 'Fremmednøglen er slettet.',
@@ -213,7 +213,7 @@ $translations = array(
'last' => 'sidste',
'Load more data' => 'Indlæs mere data',
'Loading' => 'Indlæser',
'whole result' => 'hele resultatet',
'Whole result' => 'Hele resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importer',
'%d row(s) have been imported.' => array('%d række er importeret.', '%d rækker er importeret.'),
@@ -238,12 +238,6 @@ $translations = array(
'Clone' => 'Klon',
'Delete' => 'Slet',
'You have no privileges to update this table.' => 'Du mangler rettigheder til at ændre denne tabellen.',
'E-mail' => 'E-mail',
'From' => 'Fra',
'Subject' => 'Titel',
'Attachments' => 'Vedhæft',
'Send' => 'Send',
'%d e-mail(s) have been sent.' => array('%d email sendt.', '%d emails sendt.'),
'Numbers' => 'Nummer',
'Date and time' => 'Dato og tid',
'Strings' => 'Strenge',
@@ -281,3 +275,5 @@ $translations = array(
'Alter type' => 'Ændre type',
'Saving' => 'Gemmer',
);
// run `php ../../lang.php da` to update this file

View File

@@ -1,14 +1,16 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Abmeldung erfolgreich.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Danke, dass Sie Adminer genutzt haben. <a href="https://www.adminer.org/de/donation/">Spenden willkommen!</a>.',
'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
'Server' => 'Server',
'Username' => 'Benutzer',
'Password' => 'Passwort',
'Select database' => 'Datenbank auswählen',
'Invalid database.' => 'Datenbank ungültig.',
'Create new database' => 'Datenbank erstellen',
'Table has been dropped.' => 'Tabelle wurde entfernt.',
'Table has been altered.' => 'Tabelle wurde geändert.',
'Table has been created.' => 'Tabelle wurde erstellt.',
@@ -32,8 +34,7 @@ $translations = array(
'Create database' => 'Datenbank erstellen',
'SQL command' => 'SQL-Kommando',
'Logout' => 'Abmelden',
'database' => 'Datenbank',
'Use' => 'Benutzung',
'Use' => 'Auswählen',
'No tables.' => 'Keine Tabellen.',
'select' => 'zeigen',
'Item has been deleted.' => 'Datensatz wurde gelöscht.',
@@ -97,7 +98,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Index-Typ',
'Column (length)' => 'Spalte (Länge)',
'length' => 'Länge',
'View has been dropped.' => 'View wurde entfernt.',
'View has been altered.' => 'View wurde geändert.',
'View has been created.' => 'View wurde erstellt.',
@@ -136,6 +137,7 @@ $translations = array(
'User has been created.' => 'Benutzer wurde erstellt.',
'Hashed' => 'Hashed',
'Column' => 'Spalte',
'Columns' => 'Spalten',
'Routine' => 'Routine',
'Grant' => 'Erlauben',
'Revoke' => 'Widerrufen',
@@ -187,7 +189,7 @@ $translations = array(
'original' => 'Original',
'Tables have been dropped.' => 'Tabellen wurden entfernt (drop).',
'%d item(s) have been affected.' => '%d Artikel betroffen.',
'whole result' => 'Gesamtergebnis',
'Whole result' => 'Gesamtergebnis',
'Clone' => 'Klonen',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s erhöhen.',
'Partition by' => 'Partitionieren um',
@@ -214,11 +216,6 @@ $translations = array(
'Binary' => 'Binär',
'Lists' => 'Listen',
'Editor' => 'Editor',
'E-mail' => 'E-Mail',
'From' => 'Von',
'Subject' => 'Betreff',
'Send' => 'Abschicken',
'%d e-mail(s) have been sent.' => array('%d E-Mail abgeschickt.', '%d E-Mails abgeschickt.'),
'Webserver file %s' => 'Webserver Datei %s',
'File does not exist.' => 'Datei existiert nicht.',
'%d in total' => '%d insgesamt',
@@ -253,7 +250,6 @@ $translations = array(
'Network' => 'Netzwerk',
'Geometry' => 'Geometrie',
'File exists.' => 'Datei existiert schon.',
'Attachments' => 'Anhänge',
'%d query(s) executed OK.' => array('SQL-Abfrage erfolgreich ausgeführt.', '%d SQL-Abfragen erfolgreich ausgeführt.'),
'Show only errors' => 'Nur Fehler anzeigen',
'Refresh' => 'Aktualisieren',
@@ -280,10 +276,37 @@ $translations = array(
'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
'You are offline.' => 'Sie sind offline.',
'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.' ,
'You have no privileges to update this table.' => 'Sie haben keine Rechte, diese Tabelle zu aktualisieren.',
'Saving' => 'Speichere',
'yes' => 'ja',
'no' => 'nein',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Das Master-Passwort ist abgelaufen. <a href="http://www.adminer.org/de/extension/" target="_blank">Implementieren</a> Sie die %s Methode, um es permanent zu machen.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Das Master-Passwort ist abgelaufen. <a href="https://www.adminer.org/de/extension/"%s>Implementieren</a> Sie die %s Methode, um es permanent zu machen.',
'%d / ' => '%d / ',
'Drop %s?' => '%s entfernen?',
'Materialized view' => 'Strukturierte Ansicht',
'Vacuum' => 'Vacuum',
'overwrite' => 'überschreiben',
'DB' => 'DB',
'ATTACH queries are not supported.' => 'ATTACH Abfragen werden nicht unterstützt.',
'Warnings' => 'Warnungen',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer unterstützt den Zugriff auf eine Datenbank ohne Passwort nicht, <a href="https://www.adminer.org/de/password/"%s>mehr Informationen</a>.',
'Full table scan' => 'Vollständige Überprüfung der Tabelle',
'The action will be performed after successful login with the same credentials.' => 'Die Aktion wird nach erfolgreicher Anmeldung mit denselben Anmeldedaten ausgeführt.',
'Connecting to privileged ports is not allowed.' => 'Die Verbindung zu privilegierten Ports ist nicht erlaubt.',
'There is a space in the input password which might be the cause.' => 'Es gibt ein Leerzeichen im Eingabepasswort, das die Ursache sein könnte.',
'Unknown error.' => 'Unbekannter Fehler.',
'Database does not support password.' => 'Die Datenbank unterstützt kein Passwort.',
'Disable %s or enable %s or %s extensions.' => 'Deaktivieren Sie %s oder aktivieren Sie die Erweiterungen %s oder %s.',
'Check has been dropped.' => 'Check wurde abgebrochen.',
'Check has been altered.' => 'Check wurde geändert.',
'Check has been created.' => 'Check wurde erstellt.',
'Alter check' => 'Check ändern',
'Create check' => 'Check erstellen',
'Checks' => 'Checks',
'Loaded plugins' => 'Geladene Plugins',
'%s must <a%s>return an array</a>.' => '%s muss <a%s>ein Array zurückgeben</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Konfigure</a> %s mit %s.',
'screenshot' => 'Screenshot',
);
// run `php ../../lang.php de` to update this file

332
adminer/lang/el.inc.php Normal file
View File

@@ -0,0 +1,332 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Σύστημα',
'Server' => 'Διακομιστής',
'Username' => 'Όνομα Χρήστη',
'Password' => 'Κωδικός',
'Permanent login' => 'Μόνιμη Σύνδεση',
'Login' => 'Σύνδεση',
'Logout' => 'Αποσύνδεση',
'Logged as: %s' => 'Συνδεθήκατε ως %s',
'Logout successful.' => 'Αποσυνδεθήκατε με επιτυχία.',
'Invalid credentials.' => 'Εσφαλμένα Διαπιστευτήρια.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Επανειλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτό.', 'Επανειλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτά.'),
'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 για να τον κάνετε μόνιμο.',
'Language' => 'Γλώσσα',
'Invalid CSRF token. Send the form again.' => 'Άκυρο κουπόνι CSRF. Στείλτε τη φόρμα ξανά.',
'If you did not send this request from Adminer then close this page.' => 'Αν δε στείλατε αυτό το αίτημα από το Adminer, τότε κλείστε αυτή τη σελίδα.',
'No extension' => 'Καμία Επέκταση',
'None of the supported PHP extensions (%s) are available.' => 'Καμία από τις υποστηριζόμενες επεκτάσεις PHP (%s) δεν είναι διαθέσιμη.',
'Session support must be enabled.' => 'Πρέπει να είναι ενεργοποιημένη η υποστήριξη συνεδριών.',
'Session expired, please login again.' => 'Η συνεδρία έληξε, παρακαλώ συνδεθείτε ξανά.',
'%s version: %s through PHP extension %s' => '%s έκδοση: %s μέσω επέκτασης PHP %s',
'Refresh' => 'Ανανέωση',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Δικαιώματα',
'Create user' => 'Δημιουργία Χρήστη',
'User has been dropped.' => 'Ο Χρήστης διαγράφηκε.',
'User has been altered.' => 'Ο Χρήστης τροποποιήθηκε.',
'User has been created.' => 'Ο Χρήστης δημιουργήθηκε.',
'Hashed' => 'Κωδικοποιήθηκε',
'Column' => 'Στήλη',
'Routine' => 'Ρουτίνα',
'Grant' => 'Παραχώρηση',
'Revoke' => 'Ανάκληση',
'Process list' => 'Λίστα διεργασιών',
'%d process(es) have been killed.' => array('Τερματίστηκε %d διεργασία.', 'Τερματίστηκαν %d διεργασίες.'),
'Kill' => 'Τερματισμός',
'Variables' => 'Μεταβλητές',
'Status' => 'Κατάσταση',
'SQL command' => 'Εντολή SQL',
'%d query(s) executed OK.' => array('Το ερώτημα %d εκτελέστηκε ΟΚ.', 'Τα ερώτηματα %d εκτελέστηκαν ΟΚ.'),
'Query executed OK, %d row(s) affected.' => array('Το ερώτημα εκτελέστηκε ΟΚ, επηρεάστηκε %d σειρά.', 'Το ερώτημα εκτελέστηκε ΟΚ, επηρεάστηκαν %d σειρές.'),
'No commands to execute.' => 'Δεν υπάρχουν εντολές να εκτελεστούν.',
'Error in query' => 'Σφάλμα στο ερώτημα',
'Execute' => 'Εκτέλεση',
'Stop on error' => 'Διακοπή όταν υπάρχει σφάλμα',
'Show only errors' => 'Να εμφανίζονται μόνο τα σφάλματα',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Ιστορικό',
'Clear' => 'Καθαρισμός',
'Edit all' => 'Επεξεργασία όλων',
'File upload' => 'Μεταφόρτωση αρχείου',
'From server' => 'Από διακομιστή',
'Webserver file %s' => 'Αρχείο %s από διακομιστή web',
'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.' => 'Μπορείτε να μεταφορτώσετε ένα μεγάλο αρχείο SQL μέσω FTP και να το εισάγετε από το διακομιστή.',
'You are offline.' => 'Βρίσκεστε εκτός σύνδεσης.',
'Export' => 'Εξαγωγή',
'Output' => 'Αποτέλεσμα',
'open' => 'άνοιγμα',
'save' => 'αποθήκευση',
'Saving' => 'Γίνεται Αποθήκευση',
'Format' => 'Μορφή',
'Data' => 'Δεδομένα',
'Database' => 'Β. Δεδομένων',
'Use' => 'χρήση',
'Select database' => 'Επιλέξτε Β.Δ.',
'Invalid database.' => 'Λανθασμένη Β.Δ.',
'Database has been dropped.' => 'Η Β.Δ. διαγράφηκε.',
'Databases have been dropped.' => 'Οι Β.Δ. διαγράφηκαν.',
'Database has been created.' => 'Η Β.Δ. δημιουργήθηκε.',
'Database has been renamed.' => 'Η. Β.Δ. μετονομάστηκε.',
'Database has been altered.' => 'Η Β.Δ. τροποποιήθηκε.',
'Alter database' => 'Τροποποίηση Β.Δ.',
'Create database' => 'Δημιουργία Β.Δ.',
'Database schema' => 'Σχήμα Β.Δ.',
// link to current database schema layout
'Permanent link' => 'Μόνιμος Σύνδεσμος',
// thousands separator - must contain single byte
',' => '.',
'0123456789' => '0123456789',
'Engine' => 'Μηχανή',
'Collation' => 'Collation',
'Data Length' => 'Μήκος Δεδομένων',
'Index Length' => 'Μήκος Δείκτη',
'Data Free' => 'Δεδομένα Ελεύθερα',
'Rows' => 'Σειρές',
'%d in total' => '%d συνολικά',
'Analyze' => 'Ανάλυση',
'Optimize' => 'Βελτιστοποίηση',
'Vacuum' => 'Καθαρισμός',
'Check' => 'Έλεγχος',
'Repair' => 'Επιδιόρθωση',
'Truncate' => 'Περικοπή',
'Tables have been truncated.' => 'Οι πίνακες περικόπηκαν.',
'Move to other database' => 'Μεταφορά σε άλλη Β.Δ.',
'Move' => 'Μεταφορά',
'Tables have been moved.' => 'Οι πίνακες μεταφέρθηκαν.',
'Copy' => 'Αντιγραφή',
'Tables have been copied.' => 'Οι πίνακες αντιγράφηκαν.',
'Routines' => 'Ρουτίνες',
'Routine has been called, %d row(s) affected.' => array('Η ρουτίνα εκτελέστηκε, επηρεάστηκε %d σειρά.', 'Η ρουτίνα εκτελέστηκε, επηρεάστηκαν %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 optimized.' => 'Οι πίνακες βελτιστοποιήθηκαν.',
'Table has been altered.' => 'Ο πίνακας τροποποιήθηκε.',
'Table has been created.' => 'Ο πίνακας δημιουργήθηκε.',
'Table name' => 'Όνομα πίνακα',
'Show structure' => 'Προβολή δομής',
'engine' => 'μηχανή',
'collation' => 'collation',
'Column name' => 'Όνομα στήλης',
'Type' => 'Τύπος',
'Length' => 'Μήκος',
'Auto Increment' => 'Αυτόματη αρίθμηση',
'Options' => 'Επιλογές',
'Comment' => 'Σχόλιο',
'Default value' => 'Προεπιλεγμένη τιμή',
'Default values' => 'Προεπιλεγμένες τιμές',
'Drop' => 'Διαγραφή',
'Are you sure?' => 'Είστε σίγουρος;',
'Size' => 'Μέγεθος',
'Compute' => 'Υπολογισμός',
'Move up' => 'Μετακίνηση προς τα επάνω',
'Move down' => 'Μετακίνηση προς τα κάτω',
'Remove' => 'Αφαίρεση',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Υπέρβαση μέγιστου επιτρεπόμενου αριθμού πεδίων. Παρακαλώ αυξήστε %s.',
'Partition by' => 'Τμηματοποίηση ανά',
'Partitions' => 'Τμήματα',
'Partition name' => 'Όνομα Τμήματος',
'Values' => 'Τιμές',
'View' => 'Προβολή',
'Materialized view' => 'Υλοποιημένη προβολή',
'View has been dropped.' => 'Η προβολή διαγράφηκε.',
'View has been altered.' => 'Η προβολή τροποποιήθηκε.',
'View has been created.' => 'Η προβολή δημιουργήθηκε.',
'Alter view' => 'Τροποποίηση προβολής',
'Create view' => 'Δημιουργία προβολής',
'Indexes' => 'Δείκτες',
'Indexes have been altered.' => 'Οι δείκτες τροποποιήθηκαν.',
'Alter indexes' => 'Τροποποίηση δεικτών',
'Add next' => 'Προσθήκη επόμενου',
'Index Type' => 'Τύπος δείκτη',
'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 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.' => 'Οι στήλες στην πηγή και το στόχο πρέπει να έχουν τον ίδιο τύπο, πρέπει να υπάρχει δείκτης στη στήλη στόχο και να υπάρχουν εξαρτημένα δεδομένα.',
'Triggers' => 'Εναύσματα',
'Add trigger' => 'Προσθήκη εναύσματος',
'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)' => array('%d σειρά', '%d σειρές'),
'Page' => 'Σελίδα',
'last' => 'τελευταία',
'Load more data' => 'Φόρτωση κι άλλων δεδομένων',
'Loading' => 'Φορτώνει',
'Whole result' => 'Όλο το αποτέλεσμα',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Εισαγωγή',
'%d row(s) have been imported.' => array('$d σειρά εισήχθη.', '%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+click σε μια τιμή για να την τροποποιήσετε.',
'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.' => array('Επηρεάστηκε %d εγγραφή.', 'Επηρεάστηκαν %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.' => 'Δεν έχετε δικαίωμα να τροποποιήσετε αυτό τον πίνακα.',
// data type descriptions
'Numbers' => 'Αριθμοί',
'Date and time' => 'Ημερομηνία και ώρα',
'Strings' => 'Κείμενο',
'Binary' => 'Δυαδικό',
'Lists' => 'Λίστες',
'Network' => 'Δίκτυο',
'Geometry' => 'Γεωμετρία',
'Relations' => 'Συσχετήσεις',
'Editor' => 'Επεξεργαστής',
// 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' => 'ηη/μμ/[εεεε]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'ΩΩ:ΛΛ:ΔΔ',
'now' => 'τώρα',
'yes' => 'ναι',
'no' => 'όχι',
// general SQLite error in create, drop or rename database
'File exists.' => 'Το αρχείο υπάρχει.',
'Please use one of the extensions %s.' => 'Παρακαλώ χρησιμοποιείστε μια από τις επεκτάσεις %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Τροποποίηση σχήματος',
'Create schema' => 'Δημιουργία σχήματος',
'Schema has been dropped.' => 'Το σχήμα διαγράφηκε.',
'Schema has been created.' => 'Το σχήμα δημιουργήθηκε.',
'Schema has been altered.' => 'Το σχήμα τροποποιήθηκε.',
'Schema' => 'Σχήμα',
'Invalid schema.' => 'Άκυρο σχήμα.',
// PostgreSQL sequences support
'Sequences' => 'Αλληλουχία',
'Create sequence' => 'Δημιουργία αλληλουχίας',
'Sequence has been dropped.' => 'Η αλληλουχία διαγράφηκε.',
'Sequence has been created.' => 'Η αλληλουχία δημιουργήθηκε.',
'Sequence has been altered.' => 'Η αλληλουχία τροποποιήθηκε.',
'Alter sequence' => 'Τροποποίηση αλληλουχίας',
// PostgreSQL user types support
'User types' => 'Τύποι χρήστη',
'Create type' => 'Δημιουργία τύπου',
'Type has been dropped.' => 'Ο τύπος διαγράφηκε.',
'Type has been created.' => 'Ο τύπος δημιουργήθηκε.',
'Alter type' => 'Τροποποίηση τύπου',
);
// run `php ../../lang.php el` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Too many unsuccessful logins, try again in %d minute(s).' => array('Too many unsuccessful logins, try again in %d minute.', 'Too many unsuccessful logins, try again in %d minutes.'),
'Query executed OK, %d row(s) affected.' => array('Query executed OK, %d row affected.', 'Query executed OK, %d rows affected.'),
'%d byte(s)' => array('%d byte', '%d bytes'),
@@ -9,7 +11,8 @@ $translations = array(
'%d row(s)' => array('%d row', '%d rows'),
'%d item(s) have been affected.' => array('%d item has been affected.', '%d items have been affected.'),
'%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'),
'%d e-mail(s) have been sent.' => array('%d e-mail has been sent.', '%d e-mails have been sent.'),
'%d in total' => '%d in total',
'%d query(s) executed OK.' => array('%d query executed OK.', '%d queries executed OK.'),
);
// run `php ../../lang.php en` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Sesión finalizada con éxito.',
'Invalid credentials.' => 'Usuario y/o clave de acceso incorrecta.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Contraseña',
'Select database' => 'Seleccionar Base de datos',
'Invalid database.' => 'Base de datos incorrecta.',
'Create new database' => 'Crear nueva base de datos',
'Table has been dropped.' => 'Tabla eliminada.',
'Table has been altered.' => 'Tabla modificada.',
'Table has been created.' => 'Tabla creada.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Crear Base de datos',
'SQL command' => 'Comando SQL',
'Logout' => 'Cerrar sesión',
'database' => 'base de datos',
'Use' => 'Usar',
'No tables.' => 'No existen tablas.',
'select' => 'registros',
@@ -44,10 +44,11 @@ $translations = array(
'Save and insert next' => 'Guardar e insertar siguiente',
'Delete' => 'Eliminar',
'Database' => 'Base de datos',
'DB' => 'BD',
'Routines' => 'Procedimientos',
'Indexes have been altered.' => 'Indices actualizados.',
'Indexes' => 'Indices',
'Alter indexes' => 'Modificar indices',
'Indexes have been altered.' => 'Índices actualizados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar índices',
'Add next' => 'Agregar',
'Language' => 'Idioma',
'Select' => 'Mostrar',
@@ -62,30 +63,34 @@ $translations = array(
'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Error in query' => 'Error al ejecutar consulta',
'Unknown error.' => 'Error desconocido.',
'Warnings' => 'Advertencias',
'ATTACH queries are not supported.' => 'Consultas tipo ATTACH no soportadas.',
'Execute' => 'Ejecutar',
'Table' => 'Tabla',
'Foreign keys' => 'Claves externas',
'Triggers' => 'Disparadores',
'View' => 'Vista',
'Materialized view' => 'Vista materializada',
'Unable to select the table' => 'No es posible seleccionar la tabla',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Vuelva a enviar los datos del formulario.',
'Comment' => 'Comentario',
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'No es posible ejecutar ningún comando.',
'Unable to upload a file.' => 'No es posible importar el archivo.',
'No commands to execute.' => 'Ningún comando para ejecutar.',
'Unable to upload a file.' => 'No es posible cargar el archivo.',
'File upload' => 'Importar archivo',
'File uploads are disabled.' => 'Importación de archivos deshablilitada.',
'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Call' => 'Llamar',
'No extension' => 'No hay extension',
'No extension' => 'No hay extensión',
'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.',
'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.',
'Session expired, please login again.' => 'Sesión caducada, por favor escriba su clave de nuevo.',
'Text length' => 'Longitud de texto',
'Foreign key has been dropped.' => 'Clave externa eliminada.',
'Foreign key has been altered.' => 'Clave externa modificada.',
'Foreign key has been created.' => 'Clave externa creada.',
'Foreign key has been dropped.' => 'Clave foranea eliminada.',
'Foreign key has been altered.' => 'Clave foranea modificada.',
'Foreign key has been created.' => 'Clave foranea creada.',
'Foreign key' => 'Clave externa',
'Target table' => 'Tabla de destino',
'Change' => 'Modificar',
@@ -97,7 +102,7 @@ $translations = array(
'ON DELETE' => 'AL BORRAR',
'ON UPDATE' => 'AL ACTUALIZAR',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Columna (longitud)',
'length' => 'longitud',
'View has been dropped.' => 'Vista eliminada.',
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista creada.',
@@ -114,7 +119,7 @@ $translations = array(
'Routine has been dropped.' => 'Procedimiento eliminado.',
'Routine has been altered.' => 'Procedimiento modificado.',
'Routine has been created.' => 'Procedimiento creado.',
'Alter function' => 'Modificar Función',
'Alter function' => 'Modificar función',
'Alter procedure' => 'Modificar procedimiento',
'Return type' => 'Tipo de valor de vuelta',
'Add trigger' => 'Agregar disparador',
@@ -128,7 +133,7 @@ $translations = array(
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través de la extensión de PHP %s',
'%d row(s)' => array('%d registro', '%d registros'),
'Remove' => 'Eliminar',
'Are you sure?' => 'Está seguro?',
'Are you sure?' => '¿Está seguro?',
'Privileges' => 'Privilegios',
'Create user' => 'Crear Usuario',
'User has been dropped.' => 'Usuario eliminado.',
@@ -140,15 +145,17 @@ $translations = array(
'Grant' => 'Conceder',
'Revoke' => 'Impedir',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduzca el tamaño o aumente la directiva de configuración %s.',
'Logged as: %s' => 'Logeado como: %s',
'You can upload a big SQL file via FTP and import it from server.' => 'Usted puede cargar un SQL grande mediante FTP e importarlo desde el servidor.',
'You are offline.' => 'Usted no esta en linea.',
'Logged as: %s' => 'Logueado como: %s',
'Move up' => 'Mover arriba',
'Move down' => 'Mover abajo',
'Functions' => 'Funciones',
'Aggregation' => 'Agregados',
'Export' => 'Exportar',
'Output' => 'Salida',
'open' => 'mostrar',
'save' => 'archivo',
'open' => 'abrir',
'save' => 'guardar',
'Format' => 'Formato',
'Tables' => 'Tablas',
'Data' => 'Datos',
@@ -187,14 +194,15 @@ $translations = array(
'original' => 'original',
'Tables have been dropped.' => 'Tablas eliminadas.',
'%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
'whole result' => 'resultado completo',
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Particiones',
'Partition name' => 'Nombre de Partición',
'Partition name' => 'Nombre de partición',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
'File must be in UTF-8 encoding.' => 'El archivo tiene que ser codificacion UTF-8.',
'anywhere' => 'donde sea',
'Import' => 'Importar',
'Stop on error' => 'Parar en caso de error',
@@ -214,11 +222,6 @@ $translations = array(
'Binary' => 'Binario',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'Email',
'From' => 'De',
'Subject' => 'Asunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Archivo de servidor web %s',
'File does not exist.' => 'Ese archivo no existe.',
'%d in total' => '%d en total',
@@ -249,16 +252,15 @@ $translations = array(
'System' => 'Motor de base de datos',
'Select data' => 'Visualizar contenido',
'Show structure' => 'Mostrar estructura',
'empty' => 'ningúno',
'empty' => 'ninguno',
'Network' => 'Red',
'Geometry' => 'Geometría',
'File exists.' => 'Ese archivo ya existe.',
'Attachments' => 'Adjuntos',
'%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
'%d query(s) executed OK.' => array('%d sentencia SQL ejecutada correctamente.', '%d sentencias SQL ejecutadas correctamente.'),
'Show only errors' => 'Mostrar solamente errores',
'Refresh' => 'Refrescar',
'Refresh' => 'Actualizar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
'Please use one of the extensions %s.' => 'Por favor, use una de las extensiones %s.',
'now' => 'ahora',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tablas copiadas.',
@@ -266,4 +268,28 @@ $translations = array(
'Permanent link' => 'Enlace permanente',
'Edit all' => 'Editar todos',
'HH:MM:SS' => 'HH:MM:SS',
'Loaded plugins' => 'Plugins cargados',
'%s must <a%s>return an array</a>.' => '%s tiene que <a%s>retornar un arreglo</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Configurar</a> %s en %s.',
'There is a space in the input password which might be the cause.' => 'Hay un espacio en el password, lo cual puede ser la causa.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer no soporta accesar una base de datos sin clave, <a href="https://www.adminer.org/en/password/"%s>Ver detalles</a>.',
'Database does not support password.' => 'La base de datos no soporta password.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Muchos intentos de acceso Intente en %d minutos.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Password maestro expirado. <a href="https://www.adminer.org/en/extension/"%s>Implemente</a> %s metodo para hacerlo permanente.',
'If you did not send this request from Adminer then close this page.' => 'Si no puede enviar la solicitud por Adminer entonces cierre esta pagina.',
'Connecting to privileged ports is not allowed.' => 'Conexiones a puertos privilegiados no son permitidas.',
'Disable %s or enable %s or %s extensions.' => 'Desactivar %s o activar %s o %s extensiones.',
'The action will be performed after successful login with the same credentials.' => 'La operacion sera ejecutada despues de ingresar nuevamente con las mismas credenciales.',
'You have no privileges to update this table.' => 'Usted no tiene privilegios para actualizar esta tabla.',
// Table check constraints
'Checks' => 'Chequeos',
'Create check' => 'Crear chequeo',
'Alter check' => 'Cambiar chequeo',
'Check has been created.' => 'Chequeo creado.',
'Check has been altered.' => 'Chequeo cambiado.',
'Check has been dropped.' => 'Chequeo eliminado.',
);
// run `php ../../lang.php es` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Logi sisse',
'Logout successful.' => 'Väljalogimine õnnestus.',
'Invalid credentials.' => 'Ebakorrektsed andmed.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Parool',
'Select database' => 'Vali andmebaas',
'Invalid database.' => 'Tundmatu andmebaas.',
'Create new database' => 'Loo uus andmebaas',
'Table has been dropped.' => 'Tabel on edukalt kustutatud.',
'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.',
'Table has been created.' => 'Tabel on edukalt loodud.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Loo uus andmebaas',
'SQL command' => 'SQL-Päring',
'Logout' => 'Logi välja',
'database' => 'andmebaas',
'Use' => 'Kasuta',
'No tables.' => 'Tabeleid ei leitud.',
'select' => 'kuva',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Indeksi tüüp',
'Column (length)' => 'Veerg (pikkus)',
'length' => 'pikkus',
'View has been dropped.' => 'Vaade (VIEW) on edukalt kustutatud.',
'View has been altered.' => 'Vaade (VIEW) on edukalt muudetud.',
'View has been created.' => 'Vaade (VIEW) on edukalt loodud.',
@@ -187,7 +187,7 @@ $translations = array(
'Move to other database' => 'Liiguta teise andmebaasi',
'Move' => 'Liiguta',
'%d item(s) have been affected.' => 'Mõjutatud kirjeid: %d.',
'whole result' => 'Täielikud tulemused',
'Whole result' => 'Täielikud tulemused',
'Clone' => 'Kloon',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s.',
'Partition by' => 'Partitsiooni',
@@ -214,11 +214,6 @@ $translations = array(
'Binary' => 'Binaar',
'Lists' => 'Listid',
'Editor' => 'Redaktor',
'E-mail' => 'E-post',
'From' => 'Kellelt',
'Subject' => 'Pealkiri',
'Send' => 'Saada',
'%d e-mail(s) have been sent.' => 'Saadetud kirju: %d.',
'Webserver file %s' => 'Fail serveris: %s',
'File does not exist.' => 'Faili ei leitud.',
'%d in total' => 'Kokku: %d',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Võrk (network)',
'Geometry' => 'Geomeetria',
'File exists.' => 'Fail juba eksisteerib.',
'Attachments' => 'Manused',
'%d query(s) executed OK.' => array('%d päring edukalt käivitatud.', '%d päringut edukalt käivitatud.'),
'Show only errors' => 'Kuva vaid veateateid',
'Refresh' => 'Uuenda',
@@ -267,3 +261,5 @@ $translations = array(
'Edit all' => 'Muuda kõiki',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php et` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'سیستم',
'Server' => 'سرور',
@@ -12,7 +14,7 @@ $translations = array(
'Logout successful.' => 'با موفقیت خارج شدید.',
'Invalid credentials.' => 'اعتبار سنجی نامعتبر.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.', 'ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.'),
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="http://www.adminer.org/en/extension/" target="_blank">پیاده سازی</a> کرده تا آن را دائمی سازید.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="https://www.adminer.org/en/extension/"%s>پیاده سازی</a> کرده تا آن را دائمی سازید.',
'Language' => 'زبان',
'Invalid CSRF token. Send the form again.' => 'CSRF token نامعتبر است. دوباره سعی کنید.',
'No extension' => 'پسوند نامعتبر',
@@ -21,10 +23,10 @@ $translations = array(
'Session expired, please login again.' => 'نشست پایان یافته، لطفا دوباره وارد شوید.',
'%s version: %s through PHP extension %s' => 'نسخه %s : %s توسعه پی اچ پی %s',
'Refresh' => 'بازیابی',
// text direction - 'ltr' or 'rtl'
'ltr' => 'rtl',
'Privileges' => 'امتیازات',
'Create user' => 'ایجاد کاربر',
'User has been dropped.' => 'کاربر حذف شد.',
@@ -35,14 +37,14 @@ $translations = array(
'Routine' => 'روتین',
'Grant' => 'اعطا',
'Revoke' => 'لغو کردن',
'Process list' => 'لیست فرآیند',
'%d process(es) have been killed.' => '%d فرآیند متوقف شد.',
'Kill' => 'حذف فرآیند',
'Variables' => 'متغیرها',
'Status' => 'وضعیت',
'SQL command' => 'دستور SQL',
'%d query(s) executed OK.' => '%d کوئری اجرا شد.',
'Query executed OK, %d row(s) affected.' => 'کوئری اجرا شد. %d سطر تغیر کرد.',
@@ -56,7 +58,7 @@ $translations = array(
'History' => 'تاریخ',
'Clear' => 'پاک کردن',
'Edit all' => 'ویرایش همه',
'File upload' => 'بارگذاری فایل',
'From server' => 'از سرور',
'Webserver file %s' => '%s فایل وب سرور',
@@ -75,13 +77,11 @@ $translations = array(
'save' => 'ذخیره',
'Format' => 'حذف',
'Data' => 'داده',
'Database' => 'پایگاه داده',
'database' => 'پایگاه داده',
'Use' => 'استفاده',
'Select database' => 'انتخاب پایگاه داده',
'Invalid database.' => 'پایگاه داده نامعتبر.',
'Create new database' => 'ایجاد پایگاه داده جدید',
'Database has been dropped.' => 'پایگاه داده حذف شد.',
'Databases have been dropped.' => 'پایگاه های داده حذف شدند.',
'Database has been created.' => 'پایگاه داده ایجاد شد.',
@@ -90,10 +90,10 @@ $translations = array(
'Alter database' => 'ویرایش پایگاه داده',
'Create database' => 'ایجاد پایگاه داده',
'Database schema' => 'ساختار پایگاه داده',
// link to current database schema layout
'Permanent link' => 'ارتباط دائم',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '۰۱۲۳۴۵۶۷۸۹',
@@ -116,7 +116,7 @@ $translations = array(
'Tables have been moved.' => 'جدولها انتقال داده شدند.',
'Copy' => 'کپی کردن',
'Tables have been copied.' => 'جدولها کپی شدند.',
'Routines' => 'روالها',
'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد.', 'روال فراخوانی شد %d سطر متاثر شد.'),
'Call' => 'صدا زدن',
@@ -129,7 +129,7 @@ $translations = array(
'Alter function' => 'ویرایش تابع',
'Alter procedure' => 'ویرایش زیربرنامه',
'Return type' => 'برگرداندن نوع',
'Events' => 'رویدادها',
'Event has been dropped.' => 'رویداد حذف شد.',
'Event has been altered.' => 'رویداد ویرایش شد.',
@@ -142,11 +142,11 @@ $translations = array(
'Start' => 'آغاز',
'End' => 'پایان',
'On completion preserve' => 'تکمیل حفاظت فعال است',
'Tables' => 'جدولها',
'Tables and views' => 'جدولها و نمایه ها',
'Table' => 'جدول',
'No tables.' => 'جدولی وجود ندارد',
'No tables.' => 'جدولی وجود ندارد.',
'Alter table' => 'ویرایش جدول',
'Create table' => 'ایجاد جدول',
'Table has been dropped.' => 'جدول حذف شد.',
@@ -174,28 +174,27 @@ $translations = array(
'Move down' => 'انتقال به پایین',
'Remove' => 'حذف',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر تعداد فیلدهای مجاز اشباع شد. لطفا %s را افزایش دهید.',
'Partition by' => 'بخشبندی توسط',
'Partitions' => 'بخشبندیها',
'Partition name' => 'نام بخش',
'Values' => 'مقادیر',
'View' => 'نمایش',
'Materialized View' => 'نمایه مادی',
'Materialized view' => 'نمایه مادی',
'View has been dropped.' => 'نمایش حذف شد.',
'View has been altered.' => 'نمایش ویرایش شد.',
'View has been created.' => 'نمایش ایجاد شد.',
'Alter view' => 'حذف نمایش',
'Create view' => 'ایجاد نمایش',
'Create materialized view' => 'ایجاد نمایه مادی',
'Indexes' => 'ایندکسها',
'Indexes have been altered.' => 'ایندکسها ویرایش شدند.',
'Alter indexes' => 'ویرایش ایندکسها',
'Add next' => 'افرودن بعدی',
'Index Type' => 'نوع ایندکس',
'Column (length)' => 'ستون (طول)',
'length' => 'طول',
'Foreign keys' => 'کلیدهای خارجی',
'Foreign key' => 'کلید خارجی',
'Foreign key has been dropped.' => 'کلید خارجی حذف شد.',
@@ -211,7 +210,7 @@ $translations = array(
'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.' => 'داده مبدا و مقصد ستونها بایستی شبیه هم باشند.',
'Triggers' => 'تریگرها',
'Add trigger' => 'افزودن تریگر',
'Trigger has been dropped.' => 'تریگر حذف شد.',
@@ -222,7 +221,7 @@ $translations = array(
'Time' => 'زمان',
'Event' => 'رویداد',
'Name' => 'نام',
'select' => 'انتخاب',
'Select' => 'انتخاب',
'Select data' => 'انتخاب داده',
@@ -239,25 +238,25 @@ $translations = array(
'Action' => 'عملیات',
'Full table scan' => 'اسکن کامل جدول',
'Unable to select the table' => 'قادر به انتخاب جدول نیستید',
'No rows.' => 'سطری وجود ندارد',
'No rows.' => 'سطری وجود ندارد.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d سطر', '%d سطر'),
'Page' => 'صفحه',
'last' => 'آخری',
'Load more data' => 'بارگزاری اطلاعات بیشتر',
'Loading' => 'در حال بارگزاری',
'whole result' => 'همه نتایج',
'Whole result' => 'همه نتایج',
'%d byte(s)' => array('%d بایت', '%d بایت'),
'Import' => 'وارد کردن',
'%d row(s) have been imported.' => array('%d سطر وارد شد.', '%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+click کنید.',
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید.',
// %s can contain auto-increment value
'Item%s has been inserted.' => '%s آیتم درج شد.',
'Item has been deleted.' => 'آیتم حذف شد.',
@@ -277,14 +276,7 @@ $translations = array(
'Clone' => 'تکثیر',
'Delete' => 'حذف',
'You have no privileges to update this table.' => 'شما اختیار ویرایش این جدول را ندارید.',
'E-mail' => 'پست الکترونیک',
'From' => 'فرستنده',
'Subject' => 'موضوع',
'Attachments' => 'پیوست ها',
'Send' => 'ارسال',
'%d e-mail(s) have been sent.' => array('%d ایمیل ارسال شد.', '%d ایمیل ارسال شد.'),
// data type descriptions
'Numbers' => 'اعداد',
'Date and time' => 'تاریخ و زمان',
@@ -294,7 +286,7 @@ $translations = array(
'Network' => 'شبکه',
'Geometry' => 'هندسه',
'Relations' => 'رابطه ها',
'Editor' => 'ویرایشگر',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
@@ -309,7 +301,7 @@ $translations = array(
// general SQLite error in create, drop or rename database
'File exists.' => 'فایل موجود است.',
'Please use one of the extensions %s.' => 'لطفا یکی از پسوندها را انتخاب نمائید %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'ویرایش ساختار',
'Create schema' => 'ایجاد ساختار',
@@ -318,7 +310,7 @@ $translations = array(
'Schema has been altered.' => 'ساختار ویرایش شد.',
'Schema' => 'ساختار',
'Invalid schema.' => 'ساختار نامعتبر.',
// PostgreSQL sequences support
'Sequences' => 'صف ها',
'Create sequence' => 'ایجاد صف',
@@ -326,7 +318,7 @@ $translations = array(
'Sequence has been created.' => 'صف ایجاد شد.',
'Sequence has been altered.' => 'صف ویرایش شد.',
'Alter sequence' => 'ویرایش صف',
// PostgreSQL user types support
'User types' => 'انواع کاربر',
'Create type' => 'ایجاد نوع',
@@ -334,3 +326,5 @@ $translations = array(
'Type has been created.' => 'نوع ایجاد شد.',
'Alter type' => 'ویرایش نوع',
);
// run `php ../../lang.php fa` to update this file

346
adminer/lang/fi.inc.php Normal file
View File

@@ -0,0 +1,346 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Järjestelmä',
'Server' => 'Palvelin',
'Username' => 'Käyttäjänimi',
'Password' => 'Salasana',
'Permanent login' => 'Haluan pysyä kirjautuneena',
'Login' => 'Kirjaudu',
'Logout' => 'Kirjaudu ulos',
'Logged as: %s' => 'Olet kirjautunut käyttäjänä: %s',
'Logout successful.' => 'Uloskirjautuminen onnistui.',
'Invalid credentials.' => 'Virheelliset kirjautumistiedot.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.', 'Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-salasana ei ole enää voimassa. <a href="https://www.adminer.org/en/extension/"%s>Toteuta</a> %s-metodi sen tekemiseksi pysyväksi.',
'Language' => 'Kieli',
'Invalid CSRF token. Send the form again.' => 'Virheellinen CSRF-vastamerkki. Lähetä lomake uudelleen.',
'If you did not send this request from Adminer then close this page.' => 'Jollet lähettänyt tämä pyyntö Adminerista, sulje tämä sivu.',
'No extension' => 'Ei laajennusta',
'None of the supported PHP extensions (%s) are available.' => 'Mitään tuetuista PHP-laajennuksista (%s) ei ole käytettävissä.',
'Session support must be enabled.' => 'Istuntotuki on oltava päällä.',
'Session expired, please login again.' => 'Istunto vanhentunut, kirjaudu uudelleen.',
'%s version: %s through PHP extension %s' => '%s versio: %s PHP-laajennuksella %s',
'Refresh' => 'Virkistä',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Oikeudet',
'Create user' => 'Luo käyttäjä',
'User has been dropped.' => 'Käyttäjä poistettiin.',
'User has been altered.' => 'Käyttäjää muutettiin.',
'User has been created.' => 'Käyttäjä luotiin.',
'Hashed' => 'Hashed',
'Column' => 'Sarake',
'Routine' => 'Rutiini',
'Grant' => 'Myönnä',
'Revoke' => 'Kiellä',
'Process list' => 'Prosessilista',
'%d process(es) have been killed.' => array('%d prosessi lopetettu.', '%d prosessia lopetettu..'),
'Kill' => 'Lopeta',
'Variables' => 'Muuttujat',
'Status' => 'Tila',
'SQL command' => 'SQL-komento',
'%d query(s) executed OK.' => array('%d kysely onnistui.', '%d kyselyä onnistui.'),
'Query executed OK, %d row(s) affected.' => array('Kysely onnistui, kohdistui %d riviin.', 'Kysely onnistui, kohdistui %d riviin.'),
'No commands to execute.' => 'Ei komentoja suoritettavana.',
'Error in query' => 'Virhe kyselyssä',
'Execute' => 'Suorita',
'Stop on error' => 'Pysähdy virheeseen',
'Show only errors' => 'Näytä vain virheet',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historia',
'Clear' => 'Tyhjennä',
'Edit all' => 'Muokkaa kaikkia',
'File upload' => 'Tiedoston lataus palvelimelle',
'From server' => 'Verkkopalvelimella Adminer-kansiossa oleva tiedosto',
'Webserver file %s' => 'Verkkopalvelintiedosto %s',
'Run file' => 'Suorita tämä',
'File does not exist.' => 'Tiedostoa ei ole.',
'File uploads are disabled.' => 'Tiedostojen lataaminen palvelimelle on estetty.',
'Unable to upload a file.' => 'Tiedostoa ei voida ladata palvelimelle.',
'Maximum allowed file size is %sB.' => 'Suurin sallittu tiedostokoko on %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Liian suuri POST-datamäärä. Pienennä dataa tai kasvata arvoa %s konfigurointitiedostossa.',
'You can upload a big SQL file via FTP and import it from server.' => 'Voit ladata suuren SQL-tiedoston FTP:n kautta ja tuoda sen sitten palvelimelta.',
'You are offline.' => 'Olet offline-tilassa.',
'Export' => 'Vienti',
'Output' => 'Tulos',
'open' => 'avaa',
'save' => 'tallenna',
'Saving' => 'Tallennetaan',
'Format' => 'Muoto',
'Data' => 'Data',
'Database' => 'Tietokanta',
'Use' => 'Käytä',
'Select database' => 'Valitse tietokanta',
'Invalid database.' => 'Tietokanta ei kelpaa.',
'Database has been dropped.' => 'Tietokanta on poistettu.',
'Databases have been dropped.' => 'Tietokannat on poistettu.',
'Database has been created.' => 'Tietokanta on luotu.',
'Database has been renamed.' => 'Tietokanta on nimetty uudelleen.',
'Database has been altered.' => 'Tietokantaa on muutettu.',
'Alter database' => 'Muuta tietokantaa',
'Create database' => 'Luo tietokanta',
'Database schema' => 'Tietokantakaava',
// link to current database schema layout
'Permanent link' => 'Pysyvä linkki',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Moottori',
'Collation' => 'Kollaatio',
'Data Length' => 'Datan pituus',
'Index Length' => 'Indeksin pituus',
'Data Free' => 'Vapaa tila',
'Rows' => 'Riviä',
'%d in total' => '%d kaikkiaan',
'Analyze' => 'Analysoi',
'Optimize' => 'Optimoi',
'Vacuum' => 'Siivoa',
'Check' => 'Tarkista',
'Repair' => 'Korjaa',
'Truncate' => 'Tyhjennä',
'Tables have been truncated.' => 'Taulujen sisältö on tyhjennetty.',
'Move to other database' => 'Siirrä toiseen tietokantaan',
'Move' => 'Siirrä',
'Tables have been moved.' => 'Taulut on siirretty.',
'Copy' => 'Kopioi',
'Tables have been copied.' => 'Taulut on kopioitu.',
'Routines' => 'Rutiinit',
'Routine has been called, %d row(s) affected.' => array('Rutiini kutsuttu, kohdistui %d riviin.', 'Rutiini kutsuttu, kohdistui %d riviin.'),
'Call' => 'Kutsua',
'Parameter name' => 'Parametrin nimi',
'Create procedure' => 'Luo proseduuri',
'Create function' => 'Luo funktio',
'Routine has been dropped.' => 'Rutiini on poistettu.',
'Routine has been altered.' => 'Rutiinia on muutettu.',
'Routine has been created.' => 'Rutiini on luotu.',
'Alter function' => 'Muuta funktiota',
'Alter procedure' => 'Muuta proseduuria',
'Return type' => 'Palautustyyppi',
'Events' => 'Tapahtumat',
'Event has been dropped.' => 'Tapahtuma on poistettu.',
'Event has been altered.' => 'Tapahtumaa on muutettu.',
'Event has been created.' => 'Tapahtuma on luotu.',
'Alter event' => 'Muuta tapahtumaa',
'Create event' => 'Luo tapahtuma',
'At given time' => 'Tiettynä aikana',
'Every' => 'Joka',
'Schedule' => 'Aikataulu',
'Start' => 'Aloitus',
'End' => 'Lopetus',
'On completion preserve' => 'Säilytä, kun valmis',
'Tables' => 'Taulut',
'Tables and views' => 'Taulut ja näkymät',
'Table' => 'Taulu',
'No tables.' => 'Ei tauluja.',
'Alter table' => 'Muuta taulua',
'Create table' => 'Luo taulu',
'Table has been dropped.' => 'Taulu on poistettu.',
'Tables have been dropped.' => 'Tauluja on poistettu.',
'Tables have been optimized.' => 'Taulut on optimoitu.',
'Table has been altered.' => 'Taulua on muutettu.',
'Table has been created.' => 'Taulu on luotu.',
'Table name' => 'Taulun nimi',
'Show structure' => 'Näytä rakenne',
'engine' => 'moottori',
'collation' => 'kollaatio',
'Column name' => 'Sarakkeen nimi',
'Type' => 'Tyyppi',
'Length' => 'Pituus',
'Auto Increment' => 'Automaattinen lisäys',
'Options' => 'Asetukset',
'Comment' => 'Kommentit',
'Default value' => 'Oletusarvo',
'Default values' => 'Oletusarvot',
'Drop' => 'Poista',
'Are you sure?' => 'Oletko varma?',
'Size' => 'Koko',
'Compute' => 'Laske',
'Move up' => 'Siirrä ylös',
'Move down' => 'Siirrä alas',
'Remove' => 'Poista',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Kenttien sallittu enimmäismäärä ylitetty. Kasvata arvoa %s.',
'Partition by' => 'Osioi arvolla',
'Partitions' => 'Osiot',
'Partition name' => 'Osion nimi',
'Values' => 'Arvot',
'View' => 'Näkymä',
'Materialized view' => 'Materialisoitunut näkymä',
'View has been dropped.' => 'Näkymä on poistettu.',
'View has been altered.' => 'Näkymää on muutettu.',
'View has been created.' => 'Näkymä on luotu.',
'Alter view' => 'Muuta näkymää',
'Create view' => 'Luo näkymä',
'Indexes' => 'Indeksit',
'Indexes have been altered.' => 'Indeksejä on muutettu.',
'Alter indexes' => 'Muuta indeksejä',
'Add next' => 'Lisää seuraava',
'Index Type' => 'Indeksityyppi',
'length' => 'pituus',
'Foreign keys' => 'Vieraat avaimet',
'Foreign key' => 'Vieras avain',
'Foreign key has been dropped.' => 'Vieras avain on poistettu.',
'Foreign key has been altered.' => 'Vierasta avainta on muutettu.',
'Foreign key has been created.' => 'Vieras avain on luotu.',
'Target table' => 'Kohdetaulu',
'Change' => 'Muuta',
'Source' => 'Lähde',
'Target' => 'Kohde',
'Add column' => 'Lisää sarake',
'Alter' => 'Muuta',
'Add foreign key' => 'Lisää vieras avain',
'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.' => 'Lähde- ja kohdesarakkeiden tulee olla samaa tietotyyppiä, kohdesarakkeisiin tulee olla indeksi ja dataa, johon viitataan, täytyy olla.',
'Triggers' => 'Liipaisimet',
'Add trigger' => 'Lisää liipaisin',
'Trigger has been dropped.' => 'Liipaisin on poistettu.',
'Trigger has been altered.' => 'Liipaisinta on muutettu.',
'Trigger has been created.' => 'Liipaisin on luotu.',
'Alter trigger' => 'Muuta liipaisinta',
'Create trigger' => 'Luo liipaisin',
'Time' => 'Aika',
'Event' => 'Tapahtuma',
'Name' => 'Nimi',
'select' => 'valitse',
'Select' => 'Valitse',
'Select data' => 'Valitse data',
'Functions' => 'Funktiot',
'Aggregation' => 'Aggregaatiot',
'Search' => 'Hae',
'anywhere' => 'kaikkialta',
'Search data in tables' => 'Hae dataa tauluista',
'Sort' => 'Lajittele',
'descending' => 'alenevasti',
'Limit' => 'Raja',
'Limit rows' => 'Rajoita rivimäärää',
'Text length' => 'Tekstin pituus',
'Action' => 'Toimenpide',
'Full table scan' => 'Koko taulun läpikäynti',
'Unable to select the table' => 'Taulua ei voitu valita',
'No rows.' => 'Ei rivejä.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rivi', '%d riviä'),
'Page' => 'Sivu',
'last' => 'viimeinen',
'Load more data' => 'Lataa lisää dataa',
'Loading' => 'Ladataan',
'Whole result' => 'Koko tulos',
'%d byte(s)' => array('%d tavu', '%d tavua'),
'Import' => 'Tuonti',
'%d row(s) have been imported.' => array('%d rivi tuotiin.', '%d riviä tuotiin.'),
'File must be in UTF-8 encoding.' => 'Tiedoston täytyy olla UTF-8-muodossa.',
// in-place editing in select
'Modify' => 'Muuta',
'Ctrl+click on a value to modify it.' => 'Ctrl+napsauta arvoa muuttaaksesi.',
'Use edit link to modify this value.' => 'Käytä muokkaa-linkkiä muuttaaksesi tätä arvoa.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Tietue%s lisättiin.',
'Item has been deleted.' => 'Tietue poistettiin.',
'Item has been updated.' => 'Tietue päivitettiin.',
'%d item(s) have been affected.' => array('Kohdistui %d tietueeseen.', 'Kohdistui %d tietueeseen.'),
'New item' => 'Uusi tietue',
'original' => 'alkuperäinen',
// label for value '' in enum data type
'empty' => 'tyhjä',
'edit' => 'muokkaa',
'Edit' => 'Muokkaa',
'Insert' => 'Lisää',
'Save' => 'Tallenna',
'Save and continue edit' => 'Tallenna ja jatka muokkaamista',
'Save and insert next' => 'Tallenna ja lisää seuraava',
'Selected' => 'Valitut',
'Clone' => 'Kloonaa',
'Delete' => 'Poista',
'You have no privileges to update this table.' => 'Sinulla ei ole oikeutta päivittää tätä taulua.',
// data type descriptions
'Numbers' => 'Numerot',
'Date and time' => 'Päiväys ja aika',
'Strings' => 'Merkkijonot',
'Binary' => 'Binäärinen',
'Lists' => 'Luettelot',
'Network' => 'Verkko',
'Geometry' => 'Geometria',
'Relations' => 'Suhteet',
'Editor' => 'Editori',
// 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' => 'pp.kk.[vvvv]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nyt',
'yes' => 'kyllä',
'no' => 'ei',
// general SQLite error in create, drop or rename database
'File exists.' => 'Tiedosto on olemassa.',
'Please use one of the extensions %s.' => 'Käytä jotain %s-laajennuksista.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Muuta kaavaa',
'Create schema' => 'Luo kaava',
'Schema has been dropped.' => 'Kaava poistettiin.',
'Schema has been created.' => 'Kaava luotiin.',
'Schema has been altered.' => 'Kaavaa muutettiin.',
'Schema' => 'Kaava',
'Invalid schema.' => 'Kaava ei kelpaa.',
// PostgreSQL sequences support
'Sequences' => 'Sekvenssit',
'Create sequence' => 'Luo sekvenssi',
'Sequence has been dropped.' => 'Sekvenssi on poistettu.',
'Sequence has been created.' => 'Sekvenssi on luotu.',
'Sequence has been altered.' => 'Sekvenssiä on muutettu.',
'Alter sequence' => 'Muuta sekvenssiä',
// PostgreSQL user types support
'User types' => 'Käyttäjän tyypit',
'Create type' => 'Luo tyyppi',
'Type has been dropped.' => 'Tyyppi poistettiin.',
'Type has been created.' => 'Tyyppi luotiin.',
'Alter type' => 'Muuta tyyppiä',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Kiitos, kun käytät Admineriä, voit <a href="https://www.adminer.org/en/donation/">tehdä lahjoituksen tästä</a>.',
'Drop %s?' => 'Poistetaanko %s?',
'overwrite' => 'kirjoittaen päälle',
'DB' => 'TK',
'ATTACH queries are not supported.' => 'ATTACH-komennolla tehtyjä kyselyjä ei tueta.',
'Warnings' => 'Varoitukset',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer ei tue pääsyä tietokantaan ilman salasanaa, katso tarkemmin <a href="https://www.adminer.org/en/password/"%s>täältä</a>.',
'The action will be performed after successful login with the same credentials.' => 'Toiminto suoritetaan sen jälkeen, kun on onnistuttu kirjautumaan samoilla käyttäjätunnuksilla uudestaan.',
'Connecting to privileged ports is not allowed.' => 'Yhteydet etuoikeutettuihin portteihin eivät ole sallittuja.',
'There is a space in the input password which might be the cause.' => 'Syynä voi olla syötetyssä salasanassa oleva välilyönti.',
'Unknown error.' => 'Tuntematon virhe.',
'Database does not support password.' => 'Tietokanta ei tue salasanaa.',
'Disable %s or enable %s or %s extensions.' => 'Poista käytöstä %s tai ota käyttöön laajennus %s tai %s.',
);
// run `php ../../lang.php fi` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Authentification',
'Logout successful.' => 'Au revoir !',
'Invalid credentials.' => 'Authentification échouée.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Mot de passe',
'Select database' => 'Sélectionner la base de données',
'Invalid database.' => 'Base de données invalide.',
'Create new database' => 'Créer une base de données',
'Table has been dropped.' => 'La table a été effacée.',
'Table has been altered.' => 'La table a été modifiée.',
'Table has been created.' => 'La table a été créée.',
@@ -31,7 +32,6 @@ $translations = array(
'Create database' => 'Créer une base de données',
'SQL command' => 'Requête SQL',
'Logout' => 'Déconnexion',
'database' => 'base de données',
'Use' => 'Utiliser',
'No tables.' => 'Aucune table.',
'select' => 'select',
@@ -95,7 +95,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Type d\'index',
'Column (length)' => 'Colonne (longueur)',
'length' => 'longueur',
'View has been dropped.' => 'La vue a été effacée.',
'View has been altered.' => 'La vue a été modifiée.',
'View has been created.' => 'La vue a été créée.',
@@ -185,7 +185,7 @@ $translations = array(
'Move to other database' => 'Déplacer vers une autre base de données',
'Move' => 'Déplacer',
'%d item(s) have been affected.' => array('%d élément a été modifié.', '%d éléments ont été modifiés.'),
'whole result' => 'résultat entier',
'Whole result' => 'Résultat entier',
'Clone' => 'Cloner',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s.',
'Partition by' => 'Partitionner par',
@@ -212,11 +212,6 @@ $translations = array(
'Binary' => 'Binaires',
'Lists' => 'Listes',
'Editor' => 'Éditeur',
'E-mail' => 'Courriel',
'From' => 'De',
'Subject' => 'Sujet',
'Send' => 'Envoyer',
'%d e-mail(s) have been sent.' => array('%d message a été envoyé.', '%d messages ont été envoyés.'),
'Webserver file %s' => 'Fichier %s du serveur Web',
'File does not exist.' => 'Le fichier est introuvable.',
'%d in total' => '%d au total',
@@ -242,7 +237,7 @@ $translations = array(
'Type has been dropped.' => 'Le type a été supprimé.',
'Type has been created.' => 'Le type a été créé.',
'Ctrl+click on a value to modify it.' => 'Ctrl+cliquez sur une valeur pour la modifier.',
'Use edit link to modify this value.' => 'Utilisez le lien "modifier" pour modifier cette valeur.',
'Use edit link to modify this value.' => 'Utilisez le lien \'modifier\' pour modifier cette valeur.',
'last' => 'dernière',
'From server' => 'Depuis le serveur',
'System' => 'Système',
@@ -252,7 +247,6 @@ $translations = array(
'Network' => 'Réseau',
'Geometry' => 'Géométrie',
'File exists.' => 'Le fichier existe.',
'Attachments' => 'Pièces jointes',
'Item%s has been inserted.' => 'L\'élément%s a été inséré.',
'now' => 'maintenant',
'%d query(s) executed OK.' => array('%d requête exécutée avec succès.', '%d requêtes exécutées avec succès.'),
@@ -275,7 +269,7 @@ $translations = array(
'File must be in UTF-8 encoding.' => 'Les fichiers doivent être encodés en UTF-8.',
'Full table scan' => 'Scan de toute la table',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Trop de connexions échouées, essayez à nouveau dans %d minute.', 'Trop de connexions échouées, essayez à nouveau dans %d minutes.'),
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Le mot de passe a expiré. <a href="http://www.adminer.org/en/extension/" target="_blank">Implémentez</a> la méthode %s afin de le rendre permanent.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Le mot de passe a expiré. <a href="https://www.adminer.org/en/extension/"%s>Implémentez</a> la méthode %s afin de le rendre permanent.',
'You can upload a big SQL file via FTP and import it from server.' => 'Vous pouvez uploader un gros fichier SQL par FTP et ensuite l\'importer depuis le serveur.',
'Size' => 'Taille',
'Compute' => 'Calcul',
@@ -283,11 +277,24 @@ $translations = array(
'Saving' => 'Enregistrement',
'yes' => 'oui',
'no' => 'non',
'Materialized View' => 'Vue matérialisée',
'Create materialized view' => 'Créer une vue matérialisée',
'Materialized view' => 'Vue matérialisée',
'%d / ' => '%d / ',
'Limit rows' => 'Limiter les lignes',
'Default value' => 'Valeur par défaut',
'If you did not send this request from Adminer then close this page.' => 'Si vous n\'avez pas envoyé cette requête depuis Adminer, alors fermez cette page.',
'You are offline.' => 'Vous êtes hors ligne.',
'Drop %s?' => 'Supprimer %s?',
'overwrite' => 'écraser',
'DB' => 'BD',
'ATTACH queries are not supported.' => 'Requêtes ATTACH ne sont pas supportées.',
'Warnings' => 'Avertissements',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer ne supporte pas l\'accès aux bases de données sans mot de passe, <a href="https://www.adminer.org/en/password/"%s>plus d\'information</a>.',
'The action will be performed after successful login with the same credentials.' => 'Cette action sera exécutée après s\'être connecté avec les mêmes données de connexion.',
'Connecting to privileged ports is not allowed.' => 'La connexion aux ports privilégiés n\'est pas autorisée.',
'There is a space in the input password which might be the cause.' => 'Il y a un espace dans le mot de passe entré qui pourrait en être la cause.',
'Unknown error.' => 'Erreur inconnue.',
'Database does not support password.' => 'La base de données ne support pas les mots de passe.',
'Disable %s or enable %s or %s extensions.' => 'Désactiver %s ou activer %s or %s extensions.',
);
// run `php ../../lang.php fr` to update this file

288
adminer/lang/gl.inc.php Normal file
View File

@@ -0,0 +1,288 @@
<?php
namespace Adminer;
Lang::$translations = array(
'Login' => 'Conectar',
'Logout successful.' => 'Pechouse a sesión con éxito.',
'Invalid credentials.' => 'Credenciais (usuario e/ou contrasinal) inválidos.',
'Server' => 'Servidor',
'Username' => 'Usuario',
'Password' => 'Contrasinal',
'Select database' => 'Seleccionar Base de datos',
'Invalid database.' => 'Base de datos incorrecta.',
'Table has been dropped.' => 'Eliminouse a táboa.',
'Table has been altered.' => 'Modificouse a táboa.',
'Table has been created.' => 'Creouse a táboa.',
'Alter table' => 'Modificar táboa',
'Create table' => 'Crear táboa',
'Table name' => 'Nome da táboa',
'engine' => 'motor',
'collation' => 'xogo de caracteres (collation)',
'Column name' => 'Nome da columna',
'Type' => 'Tipo',
'Length' => 'Lonxitude',
'Auto Increment' => 'Incremento automático',
'Options' => 'Opcións',
'Save' => 'Gardar',
'Drop' => 'Eliminar',
'Database has been dropped.' => 'Eliminouse a base de datos.',
'Database has been created.' => 'Creouse a base de datos.',
'Database has been renamed.' => 'Renomeouse a base de datos.',
'Database has been altered.' => 'Modificouse a base de datos.',
'Alter database' => 'Modificar Base de datos',
'Create database' => 'Crear Base de datos',
'SQL command' => 'Comando SQL',
'Logout' => 'Pechar sesión',
'Use' => 'Usar',
'No tables.' => 'Nengunha táboa.',
'select' => 'selecciona',
'Item has been deleted.' => 'Eliminouse o elemento.',
'Item has been updated.' => 'Modificouse o elemento.',
'Item%s has been inserted.' => 'Inseríuse o elemento%s.',
'Edit' => 'Editar',
'Insert' => 'Inserir',
'Save and insert next' => 'Guardar e inserir seguinte',
'Delete' => 'Borrar',
'Database' => 'Base de datos',
'Routines' => 'Rutinas',
'Indexes have been altered.' => 'Alteráronse os índices.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar índices',
'Add next' => 'Engadir seguinte',
'Language' => 'Lingua',
'Select' => 'Seleccionar',
'New item' => 'Novo elemento',
'Search' => 'Buscar',
'Sort' => 'Ordenar',
'descending' => 'descendente',
'Limit' => 'Límite',
'No rows.' => 'Nengún resultado.',
'Action' => 'Acción',
'edit' => 'editar',
'Page' => 'Páxina',
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d fila afectada.', 'Consulta executada, %d filas afectadas.'),
'Error in query' => 'Erro na consulta',
'Execute' => 'Executar',
'Table' => 'Táboa',
'Foreign keys' => 'Chaves externas',
'Triggers' => 'Disparadores',
'View' => 'Vista',
'Unable to select the table' => 'No é posible seleccionar a táboa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Envíe de novo os datos do formulario.',
'Comment' => 'Comentario',
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Non hai comandos para executar.',
'Unable to upload a file.' => 'Non é posible importar o ficheiro.',
'File upload' => 'Importar ficheiro',
'File uploads are disabled.' => 'Importación de ficheiros deshablilitada.',
'Routine has been called, %d row(s) affected.' => array('Chamouse á rutina, %d fila afectada.', 'Chamouse á rutina, %d filas afectadas.'),
'Call' => 'Chamar',
'No extension' => 'Non ten extensión',
'None of the supported PHP extensions (%s) are available.' => 'Ningunha das extensións PHP soportadas (%s) está dispoñible.',
'Session support must be enabled.' => 'As sesións deben estar habilitadas.',
'Session expired, please login again.' => 'Caducou a sesión, por favor acceda de novo.',
'Text length' => 'Lonxitud do texto',
'Foreign key has been dropped.' => 'Eliminouse a chave externa.',
'Foreign key has been altered.' => 'Modificouse a chave externa.',
'Foreign key has been created.' => 'Creouse a chave externa.',
'Foreign key' => 'Chave externa',
'Target table' => 'táboa de destino',
'Change' => 'Cambiar',
'Source' => 'Orixe',
'Target' => 'Destino',
'Add column' => 'Engadir columna',
'Alter' => 'Modificar',
'Add foreign key' => 'Engadir chave externa',
'ON DELETE' => 'AO BORRAR (ON DELETE)',
'ON UPDATE' => 'AO ACTUALIZAR (ON UPDATE)',
'Index Type' => 'Tipo de índice',
'length' => 'lonxitude',
'View has been dropped.' => 'Eliminouse a vista.',
'View has been altered.' => 'Modificouse a vista.',
'View has been created.' => 'Creouse a vista.',
'Alter view' => 'Modificar vista',
'Create view' => 'Crear vista',
'Name' => 'Nome',
'Process list' => 'Lista de procesos',
'%d process(es) have been killed.' => array('%d proceso foi detido.', '%d procesos foron detidos.'),
'Kill' => 'Deter',
'Parameter name' => 'Nome de Parámetro',
'Database schema' => 'Esquema de base de datos',
'Create procedure' => 'Crear procedemento',
'Create function' => 'Crear función',
'Routine has been dropped.' => 'Eliminouse o procedemento.',
'Routine has been altered.' => 'Alterouse o procedemento.',
'Routine has been created.' => 'Creouse o procedemento.',
'Alter function' => 'Modificar Función',
'Alter procedure' => 'Modificar procedemento',
'Return type' => 'Tipo de valor devolto',
'Add trigger' => 'Engadir disparador',
'Trigger has been dropped.' => 'Eliminouse o disparador.',
'Trigger has been altered.' => 'Modificouse o disparador.',
'Trigger has been created.' => 'Creouse o disparador.',
'Alter trigger' => 'Modificar Disparador',
'Create trigger' => 'Crear Disparador',
'Time' => 'Tempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través da extensión de PHP %s',
'%d row(s)' => array('%d fila', '%d filas'),
'Remove' => 'Eliminar',
'Are you sure?' => 'Está seguro?',
'Privileges' => 'Privilexios',
'Create user' => 'Crear Usuario',
'User has been dropped.' => 'Eliminouse o usuario.',
'User has been altered.' => 'Modificouse o usuario.',
'User has been created.' => 'Creouse o usuario.',
'Hashed' => 'Hashed',
'Column' => 'Columna',
'Routine' => 'Rutina',
'Grant' => 'Conceder',
'Revoke' => 'Revocar',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Datos POST demasiado grandes. Reduza os datos ou aumente a directiva de configuración %s.',
'Logged as: %s' => 'Conectado como: %s',
'Move up' => 'Mover arriba',
'Move down' => 'Mover abaixo',
'Functions' => 'Funcións',
'Aggregation' => 'Agregados',
'Export' => 'Exportar',
'Output' => 'Salida',
'open' => 'abrir',
'save' => 'gardar',
'Format' => 'Formato',
'Tables' => 'Táboas',
'Data' => 'Datos',
'Event has been dropped.' => 'Eliminouse o evento.',
'Event has been altered.' => 'Modificouse o evento.',
'Event has been created.' => 'Creouse o evento.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Crear Evento',
'At given time' => 'No tempo indicado',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Axenda',
'Start' => 'Inicio',
'End' => 'Fin',
'Status' => 'Estado',
'On completion preserve' => 'Ao completar manter',
'Tables and views' => 'táboas e vistas',
'Data Length' => 'Lonxitude de datos',
'Index Length' => 'Lonxitude de índice',
'Data Free' => 'Espazo dispoñible',
'Collation' => 'Xogo de caracteres (collation)',
'Analyze' => 'Analizar',
'Optimize' => 'Optimizar',
'Check' => 'Comprobar',
'Repair' => 'Reparar',
'Truncate' => 'Baleirar',
'Tables have been truncated.' => 'Baleiráronse as táboas.',
'Rows' => 'Filas',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Movéronse as táboas.',
'Move to other database' => 'Mover a outra base de datos',
'Move' => 'Mover',
'Engine' => 'Motor',
'Save and continue edit' => 'Gardar se seguir editando',
'original' => 'orixinal',
'Tables have been dropped.' => 'Elimináronse as táboas.',
'%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida o número máximo de campos permitidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Particións',
'Partition name' => 'Nome da Partición',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d fila importada.', '%d filas importadas.'),
'anywhere' => 'onde sexa',
'Import' => 'Importar',
'Stop on error' => 'Parar en caso de erro',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Histórico',
'Variables' => 'Variables',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As columnas de orixe e destino deben ser do mesmo tipo, debe existir un índice nas columnas de destino e os datos referenciados deben existir.',
'Relations' => 'Relacins',
'Run file' => 'Executar ficheiro',
'Clear' => 'Baleirar',
'Maximum allowed file size is %sB.' => 'O tamaño máximo de ficheiro permitido é de %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadea',
'Binary' => 'Binario',
'Lists' => 'Listas',
'Editor' => 'Editor',
'Webserver file %s' => 'Ficheiro de servidor web %s',
'File does not exist.' => 'O ficheiro non existe.',
'%d in total' => '%d en total',
'Permanent login' => 'Permanecer conectado',
'Databases have been dropped.' => 'Elimináronse as bases de datos.',
'Search data in tables' => 'Buscar datos en táboas',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Crear esquema',
'Schema has been dropped.' => 'Eliminouse o esquema.',
'Schema has been created.' => 'Creouse o esquema.',
'Schema has been altered.' => 'Modificouse o esquema.',
'Sequences' => 'Secuencias',
'Create sequence' => 'Crear secuencias',
'Alter sequence' => 'Modificar secuencia',
'Sequence has been dropped.' => 'Eliminouse a secuencia.',
'Sequence has been created.' => 'Creouse a secuencia.',
'Sequence has been altered.' => 'Modificaouse a secuencia.',
'User types' => 'Tipos definidos polo usuario',
'Create type' => 'Crear tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Eliminouse o tipo.',
'Type has been created.' => 'Creouse o tipo.',
'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre o valor para editalo.',
'Use edit link to modify this value.' => 'Use a ligazón de edición para modificar este valor.',
'last' => 'último',
'From server' => 'Desde o servidor',
'System' => 'Sistema',
'Select data' => 'Seleccionar datos',
'Show structure' => 'Amosar estructura',
'empty' => 'baleiro',
'Network' => 'Rede',
'Geometry' => 'Xeometría',
'File exists.' => 'O ficheiro xa existe.',
'%d query(s) executed OK.' => array('%d consulta executada correctamente.', '%d consultas executadas correctamente.'),
'Show only errors' => 'Amosar só erros',
'Refresh' => 'Refrescar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use unha das extensións %s.',
'now' => 'agora',
'ltr' => 'ltr',
'Tables have been copied.' => 'Copiáronse as táboas.',
'Copy' => 'Copiar',
'Permanent link' => 'Ligazón permanente',
'Edit all' => 'Editar todo',
'HH:MM:SS' => 'HH:MM:SS',
'Tables have been optimized.' => 'Optimizáronse as táboas.',
'Materialized view' => 'Vista materializada',
'Vacuum' => 'Baleirar',
'Selected' => 'Selección',
'File must be in UTF-8 encoding.' => 'O ficheiro ten que estar codificado con UTF-8.',
'Modify' => 'Modificar',
'Loading' => 'Cargando',
'Load more data' => 'Cargar máis datos',
'%d / ' => array('%d / ','%d / '),
'Limit rows' => 'Limitar filas',
'Default value' => 'Valor por defecto',
'Full table scan' => 'Escaneo completo da táboa',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Demasiados intentos de conexión, intentao de novo en %d minuto.', 'Demasiados intentos de conexión, intentao de novo en %d minutos.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'O contrasinal principal caducou. <a href="https://www.adminer.org/en/extension/"%s>Implementa</a> o método %s para facelo permanente.',
'If you did not send this request from Adminer then close this page.' => 'Se non enviaches esta petición dende o Adminer entón pecha esta páxina.',
'You can upload a big SQL file via FTP and import it from server.' => 'Podes subir un ficheiro SQL de gran tamaño vía FTP e importalo dende o servidor.',
'Size' => 'Tamaño',
'Compute' => 'Calcular',
'You are offline.' => 'Non tes conexión.',
'You have no privileges to update this table.' => 'Non tes privilexios para actualizar esta táboa.',
'Saving' => 'Gardando',
'yes' => 'si',
'no' => 'non',
);
// run `php ../../lang.php gl` to update this file

290
adminer/lang/he.inc.php Normal file
View File

@@ -0,0 +1,290 @@
<?php
namespace Adminer;
Lang::$translations = array(
'Login' => 'התחברות',
'Logout successful.' => 'ההתחברות הצליחה',
'Invalid credentials.' => 'פרטי התחברות שגויים',
'Server' => 'שרת',
'Username' => 'שם משתמש',
'Password' => 'סיסמה',
'Select database' => 'בחר מסד נתונים',
'Invalid database.' => 'מסד נתונים שגוי',
'Table has been dropped.' => 'הטבלה הושלכה',
'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 created.' => 'מסד הנתונים נוצר',
'Database has been renamed.' => 'שם מסד הנתונים שונה',
'Database has been altered.' => 'מסד הנתונים שונה',
'Alter database' => 'שנה מסד נתונים',
'Create database' => 'צור מסד נתונים',
'SQL command' => 'שאילתת SQL',
'Logout' => 'התנתק',
'Use' => 'השתמש',
'No tables.' => 'אין טבלאות',
'select' => 'בחר',
'Item has been deleted.' => 'הפריט נמחק',
'Item has been updated.' => 'הפריט עודכן',
'Edit' => 'ערוך',
'Insert' => 'הכנס',
'Save and insert next' => 'שמור והמשך להכניס',
'Delete' => 'מחק',
'Database' => 'מסד נתונים',
'Routines' => 'רוטינות',
'Indexes have been altered.' => 'האינדקסים שונו',
'Indexes' => 'אינדקסים',
'Alter indexes' => 'שנה אינדקסים',
'Add next' => 'הוסף הבא',
'Language' => 'שפה',
'Select' => 'בחר',
'New item' => 'פריט חדש',
'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.' => 'כשל באבטחת נתונים, שלח טופס שוב',
'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' => 'אין תוסף',
'None of the supported PHP extensions (%s) are available.' => 'שום תוסף PHP (%s) זמין',
'Session support must be enabled.' => 'חובה להפעיל תמיכה בסשן',
'Session expired, please login again.' => 'תם זמן ההפעלה, אנא התחבר שוב',
'Text length' => 'אורך הטקסט',
'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 UPDATE' => 'בעת עידכון',
'Index Type' => 'סוג אינדקס',
'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' => 'אירוע',
'%d row(s)' => '%d שורות',
'Remove' => 'הסר',
'Are you sure?' => 'האם אתה בטוח?',
'Privileges' => 'פריווילגיות',
'Create user' => 'צור משתמש',
'User has been dropped.' => 'המשתמש הושלך',
'User has been altered.' => 'המשתמש שונה',
'User has been created.' => 'המשתמש נוצר',
'Hashed' => 'הצפנה',
'Column' => 'עמודה',
'Routine' => 'רוטינה',
'Grant' => 'הענק',
'Revoke' => 'שלול',
'%s version: %s through PHP extension %s' => '%s גרסה: %s דרך תוסף PHP %s',
'Logged as: %s' => 'מחובר כ: %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'מידע גדול מידי נשלח ב-POST. הקטן את את המידע הוא הגדלת את הגדרות ה-%s',
'Move up' => 'הזז למעלה',
'Move down' => 'הזז למטה',
'Export' => 'יצא',
'Tables' => 'טבלאות',
'Data' => 'נתונים',
'Output' => 'פלט',
'open' => 'פתח',
'save' => 'שמור',
'Format' => 'פורמט',
'Functions' => 'פונקציות',
'Aggregation' => 'צבירה',
'Event has been dropped.' => 'האירוע הושלך',
'Event has been altered.' => 'האירוע שונה',
'Event has been created.' => 'האירוע נוצר',
'Alter event' => 'שנה אירוע',
'Create event' => 'צור אירוע',
'Start' => 'התחלה',
'End' => 'סיום',
'Every' => 'כל',
'Status' => 'סטטוס',
'On completion preserve' => 'בעת סיום שמור',
'Events' => 'אירועים',
'Schedule' => 'תזמן',
'At given time' => 'לפי זמן נתון',
'Save and continue edit' => 'שמור והמשך לערוך',
'original' => 'מקורי',
'Tables have been truncated.' => 'הטבלה קוצרה',
'Tables have been moved.' => 'הטבלה הועברה',
'Tables have been dropped.' => 'הטבלה הושלכה',
'Tables and views' => 'טבלאות ותצוגות',
'Engine' => 'מנוע',
'Collation' => 'קולקציה',
'Data Length' => 'אורך נתונים',
'Index Length' => 'אורך אינדקס',
'Data Free' => 'נתונים משוחררים',
'Rows' => 'שורות',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'נתח',
'Optimize' => 'יעל',
'Check' => 'בדוק',
'Repair' => 'תקן',
'Truncate' => 'קצר',
'Move to other database' => 'העבר למסד נתונים אחר',
'Move' => 'העבר',
'%d item(s) have been affected.' => '%d פריטים הושפעו',
'Whole result' => 'כל התוצאות',
'Clone' => 'שכפל',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'הגעת למספר השדות המרבי. בבקשה הגדל את %s',
'Partition by' => 'מחיצות ע"י',
'Partitions' => 'מחיצות',
'Partition name' => 'שם מחיצה',
'Values' => 'ערכים',
'%d row(s) have been imported.' => '%d שורות יובאו',
'anywhere' => 'בכל מקום',
'Import' => 'יבא',
'Stop on error' => 'עצור בעת שגיאה',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$1-$3-$5',
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
'History' => 'היסטוריה',
'Variables' => 'משתנים',
'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' => 'הרץ קובץ',
'Clear' => 'נקה',
'Maximum allowed file size is %sB.' => 'גודל מקסימלאי להעלאה: %sB',
'Numbers' => 'מספרים',
'Date and time' => 'תאריך ושעה',
'Strings' => 'מחרוזות',
'Binary' => 'בינארי',
'Lists' => 'רשימות',
'Editor' => 'עורך',
'Webserver file %s' => 'קובץ השרת %s',
'File does not exist.' => 'הקובץ אינו קיים',
'%d in total' => '%d בסך הכל',
'Permanent login' => 'התחבר לצמיתות',
'Databases have been dropped.' => 'מסד הנתונים הושלך',
'Database has been dropped.' => 'מסד הנתונים הושלך',
'Search data in tables' => 'חפש מידע בטבלאות',
'Schema' => 'סכמה',
'Alter schema' => 'שנה סכמה',
'Create schema' => 'צור סכמה',
'Schema has been dropped.' => 'הסכמה הושלכה',
'Schema has been created.' => 'הסכמה נוצרה',
'Schema has been altered.' => 'הסכמה שונתה',
'Sequences' => 'סדרות',
'Create sequence' => 'צור סדרה',
'Alter sequence' => 'שנה סדרה',
'Sequence has been dropped.' => 'הסדרה הושלכה',
'Sequence has been created.' => 'הסדרה נוצרה',
'Sequence has been altered.' => 'הסדרה שונתה',
'User types' => 'סוגי משתמשים',
'Create type' => 'צור סוג',
'Alter type' => 'שנה סוג',
'Type has been dropped.' => 'הסוג הושלך',
'Type has been created.' => 'הסוג נוצר',
'Use edit link to modify this value.' => 'השתמש בקישור העריכה בשביל לשנות את הערך',
'last' => 'אחרון',
'From server' => 'משרת',
'System' => 'מערכת',
'Select data' => 'בחר נתונים',
'Show structure' => 'הראה מבנה',
'empty' => 'ריק',
'Network' => 'רשת',
'Geometry' => 'גיאומטריה',
'File exists.' => 'קובץ קיים',
'Item%s has been inserted.' => 'הפריט %s הוזן בהצלחה',
'now' => 'כעת',
'%d query(s) executed OK.' => '%d שאילתות בוצעו בהצלחה',
'Show only errors' => 'הראה שגיאות בלבד',
'Refresh' => 'רענן',
'Invalid schema.' => 'סכמה שגויה',
'Please use one of the extensions %s.' => 'בבקשה השתמש באחד מהתוספים %s',
'ltr' => 'rtl',
'Tables have been copied.' => 'הטבלה הועתקה',
'Copy' => 'העתק',
'Permanent link' => 'קישור סופי',
'Edit all' => 'ערוך הכל',
'HH:MM:SS' => 'HH:MM:SS',
'Tables have been optimized.' => 'הטבלאות עברו אופטימיזציה',
'Materialized view' => 'תצוגת מימוש ',
'Vacuum' => 'וואקום',
'Selected' => 'נבחרים',
'Ctrl+click on a value to modify it.' => 'לחץ ctrl + לחיצת עכבר לערוך ערך זה',
'File must be in UTF-8 encoding.' => 'על הקובץ להיות בקידוד utf-8',
'Modify' => 'ערוך',
'Loading' => 'טוען',
'Load more data' => 'טען נתונים נוספים',
'ATTACH queries are not supported.' => 'שאילתת ATTACH אינה נתמכת',
'%d / ' => '%d / ',
'Limit rows' => 'הגבל שורות',
'Default value' => 'ערך ברירת מחדל',
'Full table scan' => 'סריקה טבלה מלאה',
'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
'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>',
'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> על מנת להפוך את זה לתמידי',
'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',
'Size' => 'גודל',
'Compute' => 'חישוב',
'You are offline.' => 'הינך לא מקוון',
'You have no privileges to update this table.' => 'אין לך ההרשאות המתאימות לעדכן טבלה זו',
'Saving' => 'שומר',
'yes' => 'כן',
'no' => 'לא',
);
// run `php ../../lang.php he` to update this file

314
adminer/lang/hi.inc.php Normal file
View File

@@ -0,0 +1,314 @@
<?php
namespace Adminer;
Lang::$translations = array(
'Login' => 'लॉगिन',
'Logout successful.' => 'सफलतापूर्वक लॉगआउट हो गया।',
'Invalid credentials.' => 'गलत पासवर्ड।',
'Server' => 'सर्वर',
'Username' => 'उपयोगकर्ता नाम',
'Password' => 'पासवर्ड',
'Select database' => 'डेटाबेस चुनें',
'Invalid database.' => 'अमान्य डेटाबेस।',
'Table has been dropped.' => 'टेबल हटा दिया गया है।',
'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' => 'लॉगआउट',
'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' => 'भाषा',
'Select' => 'चुनें',
'New item' => 'नया आइटम',
'Search' => 'खोजें',
'Sort' => 'क्रमबद्ध करें',
'descending' => 'अवरोही',
'Limit' => 'सीमा',
'No rows.' => 'कोई पंक्ति नहीं।',
'Action' => 'कार्रवाई',
'edit' => 'संपादित करें',
'Page' => 'पृष्ठ',
'Query executed OK, %d row(s) affected.' => array('क्वेरी सफलतापूर्वक निष्पादित, %d पंक्ति प्रभावित।', 'क्वेरी सफलतापूर्वक निष्पादित, %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)' => array('%d बाइट', '%d बाइट्स'),
'No commands to execute.' => 'निष्पादित करने के लिए कोई कमांड नहीं।',
'Unable to upload a file.' => 'फाइल अपलोड करने में असमर्थ।',
'File upload' => 'फाइल अपलोड',
'File uploads are disabled.' => 'फाइल अपलोड अक्षम हैं।',
'Routine has been called, %d row(s) affected.' => array('रूटीन कॉल किया गया, %d पंक्ति प्रभावित।', 'रूटीन कॉल किया गया, %d पंक्तियां प्रभावित।'),
'Call' => 'कॉल',
'No extension' => 'कोई एक्सटेंशन नहीं',
'None of the supported PHP extensions (%s) are available.' => 'कोई समर्थित PHP एक्सटेंशन (%s) उपलब्ध नहीं है।',
'Session support must be enabled.' => 'सेशन सपोर्ट सक्षम होना चाहिए।',
'Session expired, please login again.' => 'सेशन समाप्त, कृपया फिर से लॉगिन करें।',
'Text length' => 'टेक्स्ट लंबाई',
'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 UPDATE' => 'ऑन अपडेट',
'Index Type' => 'इंडेक्स प्रकार',
'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.' => array('%d प्रक्रिया समाप्त की गई है।', '%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 के माध्यम से',
'%d row(s)' => array('%d पंक्ति', '%d पंक्तियां'),
'Remove' => 'हटाएं',
'Are you sure?' => 'क्या आप सुनिश्चित हैं?',
'Privileges' => 'विशेषाधिकार',
'Create user' => 'उपयोगकर्ता बनाएं',
'User has been dropped.' => 'उपयोगकर्ता हटा दिया गया है।',
'User has been altered.' => 'उपयोगकर्ता बदल दिया गया है।',
'User has been created.' => 'उपयोगकर्ता बनाया गया है।',
'Hashed' => 'हैश्ड',
'Column' => 'कॉलम',
'Routine' => 'रूटीन',
'Grant' => 'अनुदान',
'Revoke' => 'रद्द करें',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'बहुत बड़ा POST डेटा। डेटा कम करें या %s कॉन्फ़िगरेशन निर्देश बढ़ाएं।',
'Logged as: %s' => '%s के रूप में लॉगिन',
'Move up' => 'ऊपर ले जाएं',
'Move down' => 'नीचे ले जाएं',
'Functions' => 'फंक्शन्स',
'Aggregation' => 'एग्रीगेशन',
'Export' => 'निर्यात',
'Output' => 'आउटपुट',
'open' => 'खोलें',
'save' => 'सहेजें',
'Format' => 'प्रारूप',
'Tables' => 'टेबल्स',
'Data' => 'डेटा',
'Event has been dropped.' => 'घटना हटा दी गई है।',
'Event has been altered.' => 'घटना बदल दी गई है।',
'Event has been created.' => 'घटना बनाई गई है।',
'Alter event' => 'घटना बदलें',
'Create event' => 'घटना बनाएं',
'At given time' => 'निर्धारित समय पर',
'Every' => 'हर',
'Events' => 'घटनाएं',
'Schedule' => 'अनुसूची',
'Start' => 'शुरू',
'End' => 'समाप्त',
'Status' => 'स्थिति',
'On completion preserve' => 'पूरा होने पर संरक्षित करें',
'Tables and views' => 'टेबल्स और व्यूज',
'Data Length' => 'डेटा लंबाई',
'Index Length' => 'इंडेक्स लंबाई',
'Data Free' => 'डेटा मुक्त',
'Collation' => 'कॉलेशन',
'Analyze' => 'विश्लेषण',
'Optimize' => 'अनुकूलित',
'Check' => 'जांच',
'Repair' => 'मरम्मत',
'Truncate' => 'ट्रंकेट',
'Tables have been truncated.' => 'टेबल्स ट्रंकेट कर दिए गए हैं।',
'Rows' => 'पंक्तियां',
',' => ',',
'0123456789' => '०१२३४५६७८९',
'Tables have been moved.' => 'टेबल्स स्थानांतरित कर दिए गए हैं।',
'Move to other database' => 'अन्य डेटाबेस में स्थानांतरित करें',
'Move' => 'स्थानांतरित करें',
'Engine' => 'इंजन',
'Save and continue edit' => 'सहेजें और संपादन जारी रखें',
'original' => 'मूल',
'Tables have been dropped.' => 'टेबल्स हटा दिए गए हैं।',
'%d item(s) have been affected.' => '%d आइटम प्रभावित हुए हैं।',
'Whole result' => 'पूरा परिणाम',
'Clone' => 'क्लोन',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'अनुमत फील्ड्स की अधिकतम संख्या पार हो गई। कृपया %s बढ़ाएं।',
'Partition by' => 'द्वारा विभाजन',
'Partitions' => 'पार्टीशन्स',
'Partition name' => 'पार्टीशन नाम',
'Values' => 'मान',
'%d row(s) have been imported.' => array('%d पंक्ति आयात की गई है।', '%d पंक्तियां आयात की गई हैं।'),
'anywhere' => 'कहीं भी',
'Import' => 'आयात',
'Stop on error' => 'त्रुटि पर रुकें',
'%.3f s' => '%.3f सेकंड',
'$1-$3-$5' => '$1-$3-$5',
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
'History' => 'इतिहास',
'Variables' => 'चर',
'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' => 'फाइल चलाएं',
'Clear' => 'साफ़ करें',
'Maximum allowed file size is %sB.' => 'अधिकतम अनुमत फाइल आकार %sB है।',
'Numbers' => 'संख्याएं',
'Date and time' => 'तिथि और समय',
'Strings' => 'स्ट्रिंग्स',
'Binary' => 'बाइनरी',
'Lists' => 'सूचियां',
'Editor' => 'संपादक',
'Webserver file %s' => 'वेबसर्वर फाइल %s',
'File does not exist.' => 'फाइल मौजूद नहीं है।',
'%d in total' => 'कुल %d',
'Permanent login' => 'स्थायी लॉगिन',
'Databases have been dropped.' => 'डेटाबेस हटा दिए गए हैं।',
'Search data in tables' => 'टेबल्स में डेटा खोजें',
'Schema' => 'स्कीमा',
'Alter schema' => 'स्कीमा बदलें',
'Create schema' => 'स्कीमा बनाएं',
'Schema has been dropped.' => 'स्कीमा हटा दी गई है।',
'Schema has been created.' => 'स्कीमा बनाई गई है।',
'Schema has been altered.' => 'स्कीमा बदल दी गई है।',
'Sequences' => 'अनुक्रम',
'Create sequence' => 'अनुक्रम बनाएं',
'Alter sequence' => 'अनुक्रम बदलें',
'Sequence has been dropped.' => 'अनुक्रम हटा दिया गया है।',
'Sequence has been created.' => 'अनुक्रम बनाया गया है।',
'Sequence has been altered.' => 'अनुक्रम बदल दिया गया है।',
'User types' => 'उपयोगकर्ता प्रकार',
'Create type' => 'प्रकार बनाएं',
'Alter type' => 'प्रकार बदलें',
'Type has been dropped.' => 'प्रकार हटा दिया गया है।',
'Type has been created.' => 'प्रकार बनाया गया है।',
'Use edit link to modify this value.' => 'इस मान को संशोधित करने के लिए संपादन लिंक का उपयोग करें।',
'last' => 'अंतिम',
'From server' => 'सर्वर से',
'System' => 'सिस्टम',
'Select data' => 'डेटा चुनें',
'Show structure' => 'संरचना दिखाएं',
'empty' => 'खाली',
'Network' => 'नेटवर्क',
'Geometry' => 'ज्यामिति',
'File exists.' => 'फाइल मौजूद है।',
'%d query(s) executed OK.' => array('%d क्वेरी सफलतापूर्वक निष्पादित।', '%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',
'Check has been dropped.' => 'चेक हटा दिया गया है।',
'Check has been altered.' => 'चेक को बदल दिया गया है।',
'Check has been created.' => 'चेक बनाया गया है।',
'Alter check' => 'चेक बदलें',
'Create check' => 'चेक बनाएँ',
'Drop %s?' => '%s हटाएँ?',
'Tables have been optimized.' => 'टेबल्स को ऑप्टिमाइज़ कर दिया गया है।',
'Materialized view' => 'मटेरियलाइज़्ड व्यू',
'Vacuum' => 'वैक्यूम',
'Selected' => 'चयनित',
'overwrite' => 'ओवरराइट',
'DB' => 'डेटाबेस',
'Algorithm' => 'एल्गोरिदम',
'Columns' => 'कॉलम',
'Ctrl+click on a value to modify it.' => 'किसी मान को संशोधित करने के लिए Ctrl+क्लिक करें।',
'File must be in UTF-8 encoding.' => 'फ़ाइल UTF-8 एन्कोडिंग में होनी चाहिए।',
'Modify' => 'संशोधित करें',
'Load more data' => 'और डेटा लोड करें',
'Loading' => 'लोड हो रहा है',
'ATTACH queries are not supported.' => 'संलग्न क्वेरीज़ समर्थित नहीं हैं।',
'Warnings' => 'चेतावनियाँ',
'%d / ' => '%d / ',
'Limit rows' => 'पंक्तियाँ सीमित करें',
'Inherits from' => 'इनहेरिट करता है',
'Checks' => 'चेक्स',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'एडमिनर बिना पासवर्ड के डेटाबेस एक्सेस करने का समर्थन नहीं करता, <a href="https://www.adminer.org/en/password/"%s>अधिक जानकारी</a>।',
'Default value' => 'डिफ़ॉल्ट मान',
'Full table scan' => 'पूरी टेबल स्कैन',
'Too many unsuccessful logins, try again in %d minute(s).' => 'बहुत अधिक असफल लॉगिन प्रयास, %d मिनट बाद पुनः प्रयास करें।',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'एडमिनर उपयोग करने के लिए धन्यवाद, <a href="https://www.adminer.org/en/donation/">दान</a> करने पर विचार करें।',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'मास्टर पासवर्ड समाप्त हो गया। इसे स्थायी बनाने के लिए %s मेथड <a href="https://www.adminer.org/en/extension/"%s>इम्प्लीमेंट</a> करें।',
'The action will be performed after successful login with the same credentials.' => 'यह क्रिया उसी क्रेडेंशियल्स से सफल लॉगिन के बाद की जाएगी।',
'Connecting to privileged ports is not allowed.' => 'प्रिविलेज्ड पोर्ट्स से कनेक्ट करने की अनुमति नहीं है।',
'There is a space in the input password which might be the cause.' => 'इनपुट पासवर्ड में एक स्पेस है जो कारण हो सकता है।',
'If you did not send this request from Adminer then close this page.' => 'अगर आपने यह अनुरोध एडमिनर से नहीं भेजा है तो इस पेज को बंद करें।',
'You can upload a big SQL file via FTP and import it from server.' => 'आप एक बड़ी SQL फ़ाइल FTP के माध्यम से अपलोड कर सकते हैं और सर्वर से इम्पोर्ट कर सकते हैं।',
'Size' => 'आकार',
'Compute' => 'कम्प्यूट',
'Loaded plugins' => 'लोडेड प्लगइन्स',
'screenshot' => 'स्क्रीनशॉट',
'You are offline.' => 'आप ऑफ़लाइन हैं।',
'You have no privileges to update this table.' => 'आपके पास इस टेबल को अपडेट करने की अनुमति नहीं है।',
'Saving' => 'सेव हो रहा है',
'Unknown error.' => 'अज्ञात त्रुटि।',
'%s must <a%s>return an array</a>.' => '%s को <a%s>एक ऐरे रिटर्न</a> करना चाहिए।',
'<a%s>Configure</a> %s in %s.' => '<a%s>कॉन्फ़िगर</a> %s में %s।',
'Disable %s or enable %s or %s extensions.' => '%s को डिसेबल करें या %s या %s एक्सटेंशन्स को एनेबल करें।',
'Database does not support password.' => 'डेटाबेस पासवर्ड का समर्थन नहीं करता।',
'yes' => 'हाँ',
'no' => 'नहीं',
);
// run `php ../../lang.php hi` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Belépés',
'Logout successful.' => 'Sikeres kilépés.',
'Invalid credentials.' => 'Érvénytelen adatok.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Jelszó',
'Select database' => 'Adatbázis kiválasztása',
'Invalid database.' => 'Érvénytelen adatbázis.',
'Create new database' => 'Új adatbázis',
'Table has been dropped.' => 'A tábla eldobva.',
'Table has been altered.' => 'A tábla módosult.',
'Table has been created.' => 'A tábla létrejött.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Adatbázis létrehozása',
'SQL command' => 'SQL parancs',
'Logout' => 'Kilépés',
'database' => 'adatbázis',
'Use' => 'Használ',
'No tables.' => 'Nincs tábla.',
'select' => 'kiválasztás',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'törléskor',
'ON UPDATE' => 'frissítéskor',
'Index Type' => 'Index típusa',
'Column (length)' => 'Oszop (méret)',
'length' => 'méret',
'View has been dropped.' => 'A nézet eldobva.',
'View has been altered.' => 'A nézet módosult.',
'View has been created.' => 'A nézet létrejött.',
@@ -176,7 +176,7 @@ $translations = array(
'Repair' => 'Javít',
'Truncate' => 'Felszabadít',
'Tables have been truncated.' => 'A tábla felszabadítva.',
'Rows' => 'Oszlop',
'Rows' => 'Sorok',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Táblák áthelyezve.',
@@ -186,7 +186,7 @@ $translations = array(
'Save and continue edit' => 'Mentés és szerkesztés folytatása',
'original' => 'eredeti',
'%d item(s) have been affected.' => array('%d tétel érintett.', '%d tétel érintett.', '%d tétel érintett.'),
'whole result' => 'összes eredményt mutatása',
'Whole result' => 'Összes eredményt mutatása',
'Tables have been dropped.' => 'Táblák eldobva.',
'Clone' => 'Klónoz',
'Partition by' => 'Particionálás ezzel',
@@ -206,11 +206,6 @@ $translations = array(
'History' => 'Történet',
'Variables' => 'Változók',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'A forrás és cél oszlopoknak azonos típusúak legyenek, a cél oszlopok indexeltek legyenek, és a hivatkozott adatnak léteznie kell.',
'E-mail' => 'E-mail',
'From' => 'Feladó',
'Subject' => 'Tárgy',
'Send' => 'Küldés',
'%d e-mail(s) have been sent.' => array('%d e-mail elküldve.', '%d e-mail elküldve.', '%d e-mail elküldve.'),
'Run file' => 'Fájl futtatása',
'Numbers' => 'Szám',
'Date and time' => 'Dátum és idő',
@@ -225,7 +220,6 @@ $translations = array(
'File does not exist.' => 'A fájl nem létezik.',
'Permanent login' => 'Emlékezz rám',
'%d in total' => 'összesen %d',
'Attachments' => 'Csatolmány',
'System' => 'Adatbázis',
'last' => 'utolsó',
'Network' => 'Hálózat',
@@ -266,3 +260,5 @@ $translations = array(
'Edit all' => 'Összes szerkesztése',
'HH:MM:SS' => 'óó:pp:mm',
);
// run `php ../../lang.php hu` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Server',
@@ -10,11 +12,11 @@ $translations = array(
'Logout' => 'Keluar',
'Logged as: %s' => 'Masuk sebagai: %s',
'Logout successful.' => 'Berhasil keluar.',
'Invalid credentials.' => 'Akses invalid.',
'Invalid credentials.' => 'Akses tidak sah.',
'Language' => 'Bahasa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalid. Kirim ulang formulir.',
'No extension' => 'Ekstensi tidak tersedia',
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak tersedia.',
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Kirim ulang formulir.',
'No extension' => 'Ekstensi tidak ada',
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak ada.',
'Session support must be enabled.' => 'Dukungan sesi harus aktif.',
'Session expired, please login again.' => 'Sesi habis, silakan masuk lagi.',
'%s version: %s through PHP extension %s' => 'Versi %s: %s dengan ekstensi PHP %s',
@@ -44,26 +46,26 @@ $translations = array(
'SQL command' => 'Perintah SQL',
'%d query(s) executed OK.' => '%d kueri berhasil dijalankan.',
'Query executed OK, %d row(s) affected.' => 'Kueri berhasil, %d baris terpengaruh.',
'No commands to execute.' => 'Tiada perintah untuk dijalankan.',
'Error in query' => 'Kesalahan dalam kueri',
'No commands to execute.' => 'Tidak ada perintah untuk dijalankan.',
'Error in query' => 'Galat dalam kueri',
'Execute' => 'Jalankan',
'Stop on error' => 'Hentikan pada kesalahan',
'Show only errors' => 'Hanya tampilkan kesalahan',
'Stop on error' => 'Hentikan jika galat',
'Show only errors' => 'Hanya tampilkan galat',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Riwayat',
'Clear' => 'Bersihkan',
'Edit all' => 'Edit semua',
'Edit all' => 'Sunting semua',
'File upload' => 'Unggah berkas',
'From server' => 'Dari server',
'Webserver file %s' => 'Berkas server web %s',
'Run file' => 'Jalankan berkas',
'File does not exist.' => 'Berkas tidak ditemukan.',
'File does not exist.' => 'Berkas tidak ada.',
'File uploads are disabled.' => 'Pengunggahan berkas dimatikan.',
'Unable to upload a file.' => 'Tidak dapat mengunggah berkas.',
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %s bita.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar pengarah konfigurasi %s.',
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar direktif konfigurasi %s.',
'Export' => 'Ekspor',
'Output' => 'Hasil',
@@ -73,22 +75,20 @@ $translations = array(
'Data' => 'Data',
'Database' => 'Basis data',
'database' => 'basis data',
'Use' => 'Gunakan',
'Select database' => 'Pilih basis data',
'Invalid database.' => 'Basis data invalid.',
'Create new database' => 'Buat basis data baru',
'Invalid database.' => 'Basis data tidak sah.',
'Database has been dropped.' => 'Basis data berhasil dihapus.',
'Databases have been dropped.' => 'Basis data berhasil dihapus.',
'Database has been created.' => 'Basis data berhasil dibuat.',
'Database has been renamed.' => 'Basis data berhasil diganti nama.',
'Database has been renamed.' => 'Basis data berhasil diganti namanya.',
'Database has been altered.' => 'Basis data berhasil diubah.',
'Alter database' => 'Ubah basis data',
'Create database' => 'Buat basis data',
'Database schema' => 'Skema basis data',
// link to current database schema layout
'Permanent link' => 'Tautan permanen',
'Permanent link' => 'Pranala permanen',
// thousands separator - must contain single byte
',' => '.',
@@ -113,9 +113,9 @@ $translations = array(
'Tables have been copied.' => 'Tabel berhasil disalin.',
'Routines' => 'Rutin',
'Routine has been called, %d row(s) affected.' => array('Rutin telah dipanggil, %d baris terpengaruh.', 'Rutin telah dipanggil, %d baris terpengaruh'),
'Routine has been called, %d row(s) affected.' => 'Rutin telah dipanggil, %d baris terpengaruh.',
'Call' => 'Panggilan',
'Parameter name' => 'Nama paramater',
'Parameter name' => 'Nama parameter',
'Create procedure' => 'Buat prosedur',
'Create function' => 'Buat fungsi',
'Routine has been dropped.' => 'Rutin berhasil dihapus.',
@@ -123,14 +123,14 @@ $translations = array(
'Routine has been created.' => 'Rutin berhasil dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis balikan',
'Return type' => 'Jenis pengembalian',
'Events' => 'Peristiwa',
'Event has been dropped.' => 'Peristiwa berhasil dihapus.',
'Event has been altered.' => 'Peristiwa berhasil diubah.',
'Event has been created.' => 'Peristiwa berhasil dibuat.',
'Alter event' => 'Ubah peristiwa',
'Create event' => 'Buat peristiwa',
'Events' => 'Even',
'Event has been dropped.' => 'Even berhasil dihapus.',
'Event has been altered.' => 'Even berhasil diubah.',
'Event has been created.' => 'Even berhasil dibuat.',
'Alter event' => 'Ubah even',
'Create event' => 'Buat even',
'At given time' => 'Pada waktu tertentu',
'Every' => 'Setiap',
'Schedule' => 'Jadwal',
@@ -141,7 +141,7 @@ $translations = array(
'Tables' => 'Tabel',
'Tables and views' => 'Tabel dan tampilan',
'Table' => 'Tabel',
'No tables.' => 'Tiada tabel.',
'No tables.' => 'Tidak ada tabel.',
'Alter table' => 'Ubah tabel',
'Create table' => 'Buat tabel',
'Table has been dropped.' => 'Tabel berhasil dihapus.',
@@ -156,16 +156,16 @@ $translations = array(
'Column name' => 'Nama kolom',
'Type' => 'Jenis',
'Length' => 'Panjang',
'Auto Increment' => 'Kenaikan Otomatis',
'Auto Increment' => 'Inkrementasi Otomatis',
'Options' => 'Opsi',
'Comment' => 'Komentar',
'Default values' => 'Nilai bawaan',
'Drop' => 'Hapus',
'Are you sure?' => 'Anda yakin',
'Are you sure?' => 'Anda yakin?',
'Move up' => 'Naik',
'Move down' => 'Turun',
'Remove' => 'Hapus',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Sudah lebih dumlah ruas maksimum yang diizinkan. Harap naikkan %s.',
'Partition by' => 'Partisi menurut',
'Partitions' => 'Partisi',
@@ -184,7 +184,7 @@ $translations = array(
'Alter indexes' => 'Ubah indeks',
'Add next' => 'Tambah setelahnya',
'Index Type' => 'Jenis Indeks',
'Column (length)' => 'Kolom (panjang)',
'length' => 'panjang',
'Foreign keys' => 'Kunci asing',
'Foreign key' => 'Kunci asing',
@@ -202,15 +202,15 @@ $translations = array(
'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.' => 'Kolom sumber dan sasaran harus memiliki jenis data yang sama. Kolom sasaran harus memiliki indeks dan data rujukan harus ada.',
'Triggers' => 'Picu',
'Add trigger' => 'Tambah picu',
'Trigger has been dropped.' => 'Picu berhasil dihapus.',
'Trigger has been altered.' => 'Picu berhasil diubah.',
'Trigger has been created.' => 'Picu berhasil dibuat.',
'Alter trigger' => 'Ubah picu',
'Create trigger' => 'Buat picu',
'Triggers' => 'Pemicu',
'Add trigger' => 'Tambah pemicu',
'Trigger has been dropped.' => 'Pemicu berhasil dihapus.',
'Trigger has been altered.' => 'Pemicu berhasil diubah.',
'Trigger has been created.' => 'Pemicu berhasil dibuat.',
'Alter trigger' => 'Ubah pemicu',
'Create trigger' => 'Buat pemicu',
'Time' => 'Waktu',
'Event' => 'Peristiwa',
'Event' => 'Even',
'Name' => 'Nama',
'select' => 'pilih',
@@ -221,25 +221,25 @@ $translations = array(
'Search' => 'Cari',
'anywhere' => 'di mana pun',
'Search data in tables' => 'Cari data dalam tabel',
'Sort' => 'Urutan',
'Sort' => 'Urutkan',
'descending' => 'menurun',
'Limit' => 'Limit',
'Limit' => 'Batas',
'Text length' => 'Panjang teks',
'Action' => 'Tindakan',
'Full table scan' => 'Pindai tabel lengkap',
'Unable to select the table' => 'Gagal memilih tabel',
'No rows.' => 'Tiada baris.',
'No rows.' => 'Tidak ada baris.',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'terakhir',
'whole result' => 'Seluruh hasil',
'Whole result' => 'Seluruh hasil',
'%d byte(s)' => '%d bita',
'Import' => 'Impor',
'%d row(s) have been imported.' => '%d baris berhasil diimpor.',
// in-place editing in select
'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
'Use edit link to modify this value.' => 'Gunakan pranala suntingan untuk mengubah nilai ini.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
@@ -247,30 +247,23 @@ $translations = array(
'Item has been updated.' => 'Entri berhasil diperbarui.',
'%d item(s) have been affected.' => '%d entri terpengaruh.',
'New item' => 'Entri baru',
'original' => 'orisinal',
'original' => 'asli',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'edit',
'Edit' => 'Edit',
'edit' => 'sunting',
'Edit' => 'Sunting',
'Insert' => 'Sisipkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan terus mengedit',
'Save and insert next' => 'Simpan dan sisipkan yang lain',
'Save and continue edit' => 'Simpan dan lanjut menyunting',
'Save and insert next' => 'Simpan dan sisipkan berikutnya',
'Clone' => 'Gandakan',
'Delete' => 'Hapus',
'E-mail' => 'Surel',
'From' => 'Dari',
'Subject' => 'Subjek',
'Attachments' => 'Lampiran',
'Send' => 'Kirim',
'%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
// data type descriptions
'Numbers' => 'Angka',
'Date and time' => 'Tanggal dan waktu',
'Strings' => 'String',
'Binary' => 'Biner',
'Binary' => 'Binari',
'Lists' => 'Daftar',
'Network' => 'Jaringan',
'Geometry' => 'Geometri',
@@ -298,7 +291,7 @@ $translations = array(
'Schema has been created.' => 'Skema berhasil dibuat.',
'Schema has been altered.' => 'Skema berhasil diubah.',
'Schema' => 'Skema',
'Invalid schema.' => 'Skema invalid.',
'Invalid schema.' => 'Skema tidak sah.',
// PostgreSQL sequences support
'Sequences' => 'Deret',
@@ -315,3 +308,5 @@ $translations = array(
'Type has been created.' => 'Jenis berhasil dibuat.',
'Alter type' => 'Ubah jenis',
);
// run `php ../../lang.php id` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Autenticazione',
'Logout successful.' => 'Uscita effettuata con successo.',
'Invalid credentials.' => 'Credenziali non valide.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Password',
'Select database' => 'Seleziona database',
'Invalid database.' => 'Database non valido.',
'Create new database' => 'Crea nuovo database',
'Table has been dropped.' => 'Tabella eliminata.',
'Table has been altered.' => 'Tabella modificata.',
'Table has been created.' => 'Tabella creata.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Crea database',
'SQL command' => 'Comando SQL',
'Logout' => 'Esci',
'database' => 'database',
'Use' => 'Usa',
'No tables.' => 'No tabelle.',
'select' => 'seleziona',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo indice',
'Column (length)' => 'Colonna (lunghezza)',
'length' => 'lunghezza',
'View has been dropped.' => 'Vista eliminata.',
'View has been altered.' => 'Vista modificata.',
'View has been created.' => 'Vista creata.',
@@ -187,7 +187,7 @@ $translations = array(
'Move to other database' => 'Sposta in altro database',
'Move' => 'Sposta',
'%d item(s) have been affected.' => array('Il risultato consiste in %d elemento.', 'Il risultato consiste in %d elementi.'),
'whole result' => 'intero risultato',
'Whole result' => 'Intero risultato',
'Clone' => 'Clona',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Troppi campi. Per favore aumentare %s.',
'Partition by' => 'Partiziona per',
@@ -214,11 +214,6 @@ $translations = array(
'Binary' => 'Binari',
'Lists' => 'Liste',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'From' => 'Da',
'Subject' => 'Oggetto',
'Send' => 'Invia',
'%d e-mail(s) have been sent.' => array('%d e-mail inviata.', '%d e-mail inviate.'),
'Webserver file %s' => 'Webserver file %s',
'File does not exist.' => 'Il file non esiste.',
'%d in total' => '%d in totale',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Rete',
'Geometry' => 'Geometria',
'File exists.' => 'Il file esiste già.',
'Attachments' => 'Allegati',
'%d query(s) executed OK.' => array('%d query eseguita con successo.', '%d query eseguite con successo.'),
'Show only errors' => 'Mostra solo gli errori',
'Refresh' => 'Aggiorna',
@@ -266,4 +260,41 @@ $translations = array(
'Permanent link' => 'Link permanente',
'Edit all' => 'Modifica tutto',
'HH:MM:SS' => 'HH:MM:SS',
'Drop %s?' => 'Scartare %s?',
'Tables have been optimized.' => 'Le tabelle sono state ottimizzate.',
'Materialized view' => 'Vista materializzata',
'Vacuum' => 'Aspira',
'Selected' => 'Selezionato',
'overwrite' => 'sovrascrivi',
'DB' => 'DB',
'File must be in UTF-8 encoding.' => 'Il file deve avere codifica UTF-8.',
'Modify' => 'Modifica',
'Load more data' => 'Carica piú dati',
'Loading' => 'Caricamento',
'ATTACH queries are not supported.' => 'ATTACH queries non sono supportate.',
'Warnings' => 'Attenzione',
'%d / ' => '%d / ',
'Limit rows' => 'Limite righe',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer non supporta accesso a databse senza password, <a href="https://www.adminer.org/it/password/"%s>piú informazioni</a>.',
'Default value' => 'Valore predefinito',
'Full table scan' => 'Analizza intera tabella',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Troppi tentativi infruttuosi di login, si prega di riprovare in %d minuto.', 'Troppi tentativi infruttuosi di login, si prega di riprovare in %d minuti.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'La password principale é scaduta. <a href="https://www.adminer.org/it/extension/"%s>Implementare</a> %s come metodo per renderla permanente.',
'The action will be performed after successful login with the same credentials.' => 'La azione verrá eseguita dopo un login valido con le stesse credenziali.',
'Connecting to privileged ports is not allowed.' => 'LA connessione a porte privilegiate non é permessa.',
'There is a space in the input password which might be the cause.' => 'Esiste uno spazio nella passoword inserita che potrebbe essere la causa.',
'If you did not send this request from Adminer then close this page.' => 'Se non hai inviato tu la richiesta tramite Adminer puoi chiudere la pagina.',
'You can upload a big SQL file via FTP and import it from server.' => 'Puoi caricare un grande file SQL tramite FTP ed impirtarlo dal server.',
'Size' => 'Taglia',
'Compute' => 'Elabora',
'You are offline.' => 'Sei disconnesso.',
'You have no privileges to update this table.' => 'Non hai i privilegi per aggiornare questa tabella.',
'Saving' => 'Salvataggio',
'Unknown error.' => 'Errore sconosciuto.',
'Database does not support password.' => 'Il database non supporta password.',
'Disable %s or enable %s or %s extensions.' => 'Disabilita %s o abilita %s oppure %s estensioni.',
'yes' => 'si',
'no' => 'no',
);
// run `php ../../lang.php it` to update this file

View File

@@ -1,161 +1,187 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'ログイン',
'Logout successful.' => 'ログアウト',
'Invalid credentials.' => '不正なログイン',
'Server' => 'サーバ',
'Username' => 'ユーザ名',
'Logout successful.' => 'ログアウトしました。',
'Invalid credentials.' => '不正なログインです。',
'Server' => 'サーバ',
'Username' => 'ユーザ名',
'Password' => 'パスワード',
'Loaded plugins' => '読込済プラグイン',
'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>)',
'%s must <a%s>return an array</a>.' => '%s は<a%s>配列を返す</a>必要があります。',
'<a%s>Configure</a> %s in %s.' => '%2$s の %1$s を<a%s>設定</a>してください。',
'There is a space in the input password which might be the cause.' => '入力されたパスワードに空白が含まれているので、それが原因かもしれません。',
'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>)',
'Database does not support password.' => 'データベースがパスワードに対応していません。',
'Too many unsuccessful logins, try again in %d minute(s).' => 'ログインの失敗数が多すぎます。%d分後に再試行してください。',
'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 関数を用います。',
'Select database' => 'データベースを選択してください',
'Invalid database.' => '不正なデータベース',
'Create new database' => '新規にデータベースを作成',
'Table has been dropped.' => 'テーブルを削除しました',
'Table has been altered.' => 'テーブルを変更しました',
'Table has been created.' => 'テーブルを作成しました',
'Alter table' => 'テーブルの変更',
'Invalid database.' => '不正なデータベースです。',
'Table has been dropped.' => 'テーブルを削除しました。',
'Table has been altered.' => 'テーブルの設定を変更しました',
'Table has been created.' => 'テーブルを作成しました',
'Alter table' => 'テーブルの設定を変更',
'Create table' => 'テーブルを作成',
'Table name' => 'テーブル名',
'engine' => 'エンジン',
'collation' => '照合順序',
'Column name' => '名',
'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' => 'データベースを変更',
'Drop %s?' => '%s を削除しますか?',
'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 has been deleted.' => 'レコードを削除しました',
'Item has been updated.' => 'レコードを更新しました',
'Edit' => '編集',
'Insert' => '挿入',
'Save and insert next' => '保存/追加',
'Delete' => '削除',
'You have no privileges to update this table.' => 'このテーブルを更新する権限がありません。',
'Database' => 'データベース',
'DB' => 'DB',
'Routines' => 'ルーチン',
'Indexes have been altered.' => '索引を変更しました',
'Indexes' => '索引',
'Alter indexes' => '索引の変更',
'Indexes have been altered.' => 'インデックスを変更しました',
'Indexes' => 'インデックス',
'Alter indexes' => 'インデックスを変更',
'Add next' => '追加',
'Language' => '言語',
'Select' => '選択',
'New item' => '項目の作成',
'New item' => '新規レコードを挿入',
'Search' => '検索',
'Sort' => 'ソート',
'descending' => '降順',
'Limit' => '制約',
'No rows.' => '行がありません',
'Limit rows' => '表示行数を制限',
'No rows.' => '行がありません。',
'Action' => '動作',
'edit' => '編集',
'Page' => 'ページ',
'Query executed OK, %d row(s) affected.' => 'クエリーを実行しました。%d 行を変更しました',
'Query executed OK, %d row(s) affected.' => 'クエリーを実行しました。%d 行を変更しました',
'Error in query' => 'クエリーのエラー',
'Unknown error.' => '不明なエラーです。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => 'ATTACH クエリーは対応していません。',
'Execute' => '実行',
'Table' => 'テーブル',
'Foreign keys' => '外部キー',
'Triggers' => 'トリガー',
'View' => 'ビュー',
'Materialized view' => 'マテリアライズドビュー',
'Full table scan' => 'テーブルを全スキャン',
'Unable to select the table' => 'テーブルを選択できません',
'Invalid CSRF token. Send the form again.' => '不正なCSRFトークン再送信してください',
'Invalid CSRF token. Send the form again.' => '不正なCSRFトークンです。フォームを再送信してください',
'If you did not send this request from Adminer then close this page.' => 'Adminerからのリクエストでない場合はこのページを閉じてください。',
'Comment' => 'コメント',
'Default values' => '定値',
'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 行を変更しました',
'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' => '拡張機能がありません',
'None of the supported PHP extensions (%s) are available.' => 'PHPの拡張機能%sがセットアップされていません',
'Session support must be enabled.' => 'セッションを有効にしてください',
'Session expired, please login again.' => 'セッションの期限切れ。ログインし直してください',
'Text length' => '文字列の長さ',
'Foreign key has been dropped.' => '外部キーを削除しました',
'Foreign key has been altered.' => '外部キーを変更しました',
'Foreign key has been created.' => '外部キーを作成しました',
'Foreign key' => '外キー',
'Target table' => 'テーブル',
'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 expired, please login again.' => 'セッションの期限切れ。ログインし直してください。',
'The action will be performed after successful login with the same credentials.' => '同じアカウントで正しくログインすると作業を実行します。',
'Text length' => '文字数を丸める',
'Foreign key has been dropped.' => '外キーを削除しました。',
'Foreign key has been altered.' => '外部キーを変更しました。',
'Foreign key has been created.' => '外部キーを作成しました。',
'Foreign key' => '外部キー',
'Target table' => '対象テーブル',
'Change' => '変更',
'Source' => 'ソース',
'Target' => 'ターゲット',
'Add column' => 'を追加',
'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.' => 'ビューを作成しました',
'Index Type' => 'インデックスの型',
'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' => 'プロシージャ変更',
'%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' => '時間',
'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',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Remove' => '除外',
'Are you sure?' => '実行しますか?',
'Privileges' => '権限',
'Create user' => 'ユーザを作成',
'User has been dropped.' => 'ユーザを削除',
'User has been altered.' => 'ユーザを変更',
'User has been created.' => 'ユーザを作成',
'User has been dropped.' => 'ユーザを削除しました。',
'User has been altered.' => 'ユーザを変更しました。',
'User has been created.' => 'ユーザを作成しました。',
'Hashed' => 'Hashed',
'Column' => '',
'Column' => 'カラム',
'Columns' => 'カラム',
'Routine' => 'ルーチン',
'Grant' => '権限付与',
'Revoke' => '権限の取消し',
'Grant' => '権限付与',
'Revoke' => '権限を取り消す',
'Logged as: %s' => 'ログ:%s',
'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 設定を大きくしてください',
'You can upload a big SQL file via FTP and import it from server.' => '大きなSQLファイルは、FTP経由でアップロードしてサーバからインポートしてください。',
'You are offline.' => 'オフライン状態です。',
'Move up' => '上',
'Move down' => '下',
'Export' => 'エクスポート',
'Tables' => 'テーブル',
'Data' => 'データ',
'Output' => '出力',
'open' => '開く',
'open' => 'ブラウザに表示',
'save' => '保存',
'Format' => '形式',
'Functions' => '関数',
'Aggregation' => '集',
'Event has been dropped.' => '削除しました',
'Event has been altered.' => '変更しました',
'Event has been created.' => '作成しました',
'Alter event' => '変更',
'Create event' => '作成',
'Aggregation' => '集約関数',
'Event has been dropped.' => 'イベントを削除しました',
'Event has been altered.' => 'イベントを変更しました',
'Event has been created.' => 'イベントを作成しました',
'Alter event' => 'イベントを変更',
'Create event' => 'イベントを作成',
'Start' => '開始',
'End' => '終了',
'Every' => '毎回',
@@ -164,105 +190,127 @@ $translations = array(
'Events' => 'イベント',
'Schedule' => 'スケジュール',
'At given time' => '指定時刻',
'Tables have been truncated.' => 'テーブルをtruncateしました',
'Tables have been moved.' => 'テーブルを移動しました',
'Tables have been truncated.' => 'テーブルを空にしました',
'Tables have been moved.' => 'テーブルを移動しました',
'Tables and views' => 'テーブルとビュー',
'Engine' => 'エンジン',
'Collation' => '照合順序',
'Collation' => 'コレーション',
'Data Length' => 'データ長',
'Index Length' => '索引長',
'Index Length' => 'インデックス長',
'Data Free' => '空き',
'Rows' => '行数',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '分析',
'Optimize' => '最適化',
'Check' => 'チェック',
'Vacuum' => '不要領域を回収(Vacuum)',
'Check' => '検査',
'Repair' => '修復',
'Truncate' => 'Truncate',
'Move to other database' => 'のデータベースへ移動',
'Truncate' => '空にする',
'Move to other database' => 'のデータベースへ移動',
'Move' => '移動',
'Save and continue edit' => '保存して継続',
'original' => '元',
'%d item(s) have been affected.' => '%d を更新しました',
'whole result' => '全結果',
'Tables have been dropped.' => 'テーブルを削除しました',
'%d item(s) have been affected.' => '%d レコードを更新しました',
'Whole result' => '全結果',
'Tables have been dropped.' => 'テーブルを削除しました',
'Tables have been optimized.' => 'テーブルを最適化しました。',
'Clone' => 'クローン',
'Maximum number of allowed fields exceeded. Please increase %s.' => '定義可能な最大フィールド数を越えました。%s を増やしてください。',
'Partition by' => 'パーティション',
'Partitions' => 'パーティション',
'Partition name' => 'パーティション名',
'Values' => '値',
'%d row(s) have been imported.' => '%d 行をインポートしました',
'Show structure' => '構造',
'%d row(s) have been imported.' => '%d 行をインポートしました',
'File must be in UTF-8 encoding.' => 'ファイルをUTF-8で保存してください。',
'Show structure' => 'スキーマ',
'anywhere' => '任意',
'Import' => 'インポート',
'Stop on error' => 'エラーの場合は停止',
'Select data' => 'データ',
'%.3f s' => '%.3f 秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'$1-$3-$5' => '$1/$3/$5',
'[yyyy]-mm-dd' => '[yyyy]/mm/dd',
'History' => '履歴',
'Variables' => '変数',
'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' => 'ファイルを実行',
'Run file' => '実行',
'Clear' => '消去',
'Maximum allowed file size is %sB.' => '最大ファイルサイズ %sB',
'Maximum allowed file size is %sB.' => '最大ファイルサイズ %sB です。',
'Numbers' => '数字',
'Date and time' => '日時',
'Strings' => '文字列',
'Binary' => 'バイナリ',
'Lists' => 'リスト',
'Editor' => 'エディタ',
'E-mail' => 'メール',
'From' => '差出人',
'Subject' => '題名',
'Send' => '送信',
'%d e-mail(s) have been sent.' => '%d メールを送信しました',
'Webserver file %s' => 'Webサーバファイル %s',
'File does not exist.' => 'ファイルは存在しません',
'Webserver file %s' => 'ファイル名 %s',
'File does not exist.' => 'ファイルは存在しません。',
'%d in total' => '合計 %d',
'Permanent login' => '永続的にログイン',
'Databases have been dropped.' => 'データベースを削除しました',
'Databases have been dropped.' => 'データベースを削除しました',
'Search data in tables' => 'データを検索する',
'Schema' => 'スキーマ',
'Alter schema' => 'スキーマ変更',
'Create schema' => 'スキーマ追加',
'Schema has been dropped.' => 'スキーマを削除しました',
'Schema has been created.' => 'スキーマを追加しました',
'Schema has been altered.' => 'スキーマを変更しました',
'Schema has been dropped.' => 'スキーマを削除しました',
'Schema has been created.' => 'スキーマを追加しました',
'Schema has been altered.' => 'スキーマを変更しました',
'Sequences' => 'シーケンス',
'Create sequence' => 'シーケンス作成',
'Alter sequence' => 'シーケンス変更',
'Sequence has been dropped.' => 'シーケンスを削除しました',
'Sequence has been created.' => 'シーケンスを追加しました',
'Sequence has been altered.' => 'シーケンスを変更しました',
'Sequence has been dropped.' => 'シーケンスを削除しました',
'Sequence has been created.' => 'シーケンスを追加しました',
'Sequence has been altered.' => 'シーケンスを変更しました',
'User types' => 'ユーザー定義型',
'Create type' => 'ユーザー定義型作成',
'Alter type' => 'ユーザー定義型変更',
'Type has been dropped.' => 'ユーザー定義型を削除しました',
'Type has been created.' => 'ユーザー定義型を追加しました',
'Use edit link to modify this value.' => 'リンクを編集する',
'Type has been dropped.' => 'ユーザー定義型を削除しました',
'Type has been created.' => 'ユーザー定義型を追加しました',
'Ctrl+click on a value to modify it.' => 'Ctrl+クリックで値を修正します。',
'Use edit link to modify this value.' => 'この値を修正するにはリンクを使用してください。',
'last' => '最終',
'From server' => 'サーバーから実行',
'From server' => 'サーバー上のファイル',
'System' => 'データベース種類',
'empty' => '空',
'Network' => 'ネットワーク型',
'Geometry' => 'ジオメトリ型',
'File exists.' => 'ファイルが既に存在します',
'Attachments' => '添付ファイル',
'Item%s has been inserted.' => '%s項目を挿入しました',
'File exists.' => 'ファイルが既に存在します',
'Item%s has been inserted.' => '%sレコードを挿入しました。',
'now' => '現在の日時',
'%d query(s) executed OK.' => '%d クエリーを実行しました',
'%d query(s) executed OK.' => '%d クエリーを実行しました',
'Show only errors' => 'エラーのみ表示',
'Refresh' => 'リフレッシュ',
'Invalid schema.' => '無効なスキーマ',
'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s',
'Invalid schema.' => '無効なスキーマです。',
'Please use one of the extensions %s.' => '%s のいずれかの拡張機能を使ってください',
'ltr' => 'ltr',
'Tables have been copied.' => 'テーブルをコピーしました',
'Tables have been copied.' => 'テーブルをコピーしました',
'Copy' => 'コピー',
'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集',
'overwrite' => '上書き',
'Permanent link' => '固定リンク',
'Edit all' => '一括編集',
'Selected' => '選択中',
'Modify' => '編集',
'Load more data' => 'さらにデータを表示',
'Compute' => '再計算',
'Saving' => '保存しています...',
'Checks' => 'CHECK制約',
'Create check' => 'CHECK制約を追加',
'Alter check' => 'CHECK制約を編集',
'Check has been created.' => 'CHECK制約を追加しました。',
'Check has been altered.' => 'CHECK制約を編集しました。',
'Check has been dropped.' => 'CHECK制約を削除しました。',
'screenshot' => 'スクリーンショット',
'Algorithm' => 'アルゴリズム',
'Condition' => '条件',
'Inherits from' => '継承元',
'HH:MM:SS' => '時:分:秒',
'Loading' => '読み込み中',
'Size' => 'サイズ',
'yes' => 'はい',
'no' => 'いいえ',
'Default value' => '既定値',
);
// run `php ../../lang.php ja` to update this file

300
adminer/lang/ka.inc.php Normal file
View File

@@ -0,0 +1,300 @@
<?php
namespace Adminer;
Lang::$translations = array(
'Login' => 'შესვლა',
'Logout successful.' => 'გამოხვედით სისტემიდან.',
'Invalid credentials.' => 'არასწორი მომხმარებელი ან პაროლი.',
'Server' => 'სერვერი',
'Username' => 'მომხმარებელი',
'Password' => 'პაროლი',
'Select database' => 'ბაზა',
'Invalid database.' => 'არასწორი ბაზა.',
'Table has been dropped.' => 'ცხრილი წაიშალა.',
'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' => 'გასვლა',
'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' => 'ბაზა',
'Indexes have been altered.' => 'შეიცვალა ინდექსები.',
'Indexes' => 'ინდექსები',
'Alter indexes' => 'ინდექსის შეცვლა',
'Add next' => 'კიდევ დამატება',
'Language' => 'ენა',
'Select' => 'არჩევა',
'New item' => 'ახალი ჩანაწერი',
'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' => 'გაფართოება არაა',
'None of the supported PHP extensions (%s) are available.' => 'არც ერთი მხარდაჭერილი გაფართოება არ მოიძებნა (%s).',
'Session support must be enabled.' => 'ჩართული უნდა იყოს სესია.',
'Session expired, please login again.' => 'სესიის მოქმედების დრო ამოიწურა, გაიარეთ ხელახალი ავტორიზაცია.',
'Text length' => 'ტექსტის სიგრძე',
'Foreign key has been dropped.' => 'გარე გასაღები წაიშალა.',
'Foreign key has been altered.' => 'გარე გასაღები შეიცვალა.',
'Foreign key has been created.' => 'გარე გასაღები შეიქმნა.',
'Foreign key' => 'გარე გასაღები',
'Change' => 'შეცვლა',
'Source' => 'წყარო',
'Target' => 'სამიზნე',
'Add column' => 'ველის დამატება',
'Alter' => 'შეცვლა',
'Add foreign key' => 'გარე გასაღები დამატება',
'ON DELETE' => 'წაშლისას',
'ON UPDATE' => 'განახლებისას',
'Index Type' => 'ინდექსის სახეობა',
'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',
'%d row(s)' => '%d რიგი',
'Remove' => 'წაშლა',
'Are you sure?' => 'ნამდვილად?',
'Privileges' => 'უფლებამოსილება',
'Create user' => 'მომხმარებლის შექმან',
'User has been dropped.' => 'მომხმარებელი წაიშალა.',
'User has been altered.' => 'მომხმარებელი შეიცვალა.',
'User has been created.' => 'მომხმარებელი შეიქმნა.',
'Hashed' => 'ჰეშირებული',
'Column' => 'ველი',
'Routine' => 'პროცედურა',
'Grant' => 'დაშვება',
'Revoke' => 'შეზღუდვა',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST ინფორმაცია ძალიან დიდია. შეამცირეთ ზომა ან გაზარდეს POST ინფორმაციის ზომა პარამეტრებიდან %s.',
'Logged as: %s' => 'შესული ხართ როგორც: %s',
'Move up' => 'ზემოთ ატანა',
'Move down' => 'ქვემოთ ჩატანა',
'Functions' => 'ფუნქციები',
'Aggregation' => 'აგრეგაცია',
'Export' => 'ექსპორტი',
'Output' => 'გამომავალი ინფორმაცია',
'open' => 'გახსნა',
'save' => 'შენახვა',
'Format' => 'ფორმატი',
'Tables' => 'ცხრილები',
'Data' => 'ინფორმაცია',
'Event has been dropped.' => 'ღონისძიება წაიშალა.',
'Event has been altered.' => 'ღონისძიება შეიცვალა.',
'Event has been created.' => 'ღონისძიება შეიქმნა.',
'Alter event' => 'ღონისძიების შეცვლა',
'Create event' => 'ღონისძიების შექმნა',
'At given time' => 'მოცემულ დროში',
'Every' => 'ყოველ',
'Events' => 'ღონისძიება',
'Schedule' => 'განრიგი',
'Start' => 'დასაწყისი',
'End' => 'დასასრული',
'Status' => 'მდგომარეობა',
'On completion preserve' => 'შენახვა დასრულებისას',
'Tables and views' => 'ცხრილები და წარმოდგენები',
'Data Length' => 'ინფორმაციის მოცულობა',
'Index Length' => 'ინდექსების მოცულობა',
'Data Free' => 'თავისუფალი სივრცე',
'Collation' => 'კოდირება',
'Analyze' => 'ანალიზი',
'Optimize' => 'ოპტიმიზაცია',
'Check' => 'შემოწმება',
'Repair' => 'გასწორება',
'Truncate' => 'გასუფთავება',
'Tables have been truncated.' => 'ცხრილი გასუფთავდა.',
'Rows' => 'რიგი',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'ცხრილი გადაადგილდა.',
'Move to other database' => 'გადატანა სხვა ბაზაში',
'Move' => 'გადატანა',
'Engine' => 'ძრავი',
'Save and continue edit' => 'შენახვა და ცვლილების გაგრძელება',
'original' => 'საწყისი',
'%d item(s) have been affected.' => 'შეიცვალა %d ჩანაწერი.',
'Whole result' => 'სრული შედეგი',
'Tables have been dropped.' => 'ცხრილები წაიშალა.',
'Clone' => 'კლონირება',
'Partition by' => 'დაყოფა',
'Partitions' => 'დანაყოფები',
'Partition name' => 'დანაყოფის სახელი',
'Values' => 'პარამეტრები',
'%d row(s) have been imported.' => 'დაიმპორტდა %d რიგი.',
'Import' => 'იმპორტი',
'Stop on error' => 'გაჩერება შეცდომისას',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'მიღწეულია დაშვებული ველების მაქსიმალური რაოდენობა, გაზარდეთ %s.',
'anywhere' => 'ნებისმიერ ადგილას',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'დდ.თთ.[წწწწ]',
'History' => 'ისტორია',
'Variables' => 'ცვლადები',
'Relations' => 'ურთიერთობა',
'Run file' => 'ფაილის გაშვება',
'Clear' => 'გასუფთავება',
'Maximum allowed file size is %sB.' => 'ფაილის მაქსიმალური ზომა - %sB.',
'Numbers' => 'ციფრები',
'Date and time' => 'დრო და თარიღი',
'Binary' => 'ორობითი',
'Lists' => 'სია',
'Editor' => 'რედაქტორი',
'Webserver file %s' => 'ფაილი %s ვებსერვერზე',
'File does not exist.' => 'ასეთი ფაილი არ არსებობს.',
'%d in total' => 'სულ %d',
'Permanent login' => 'სისტემაში დარჩენა',
'Databases have been dropped.' => 'ბაზა წაიშალა.',
'Search data in tables' => 'ცხრილებში ძებნა',
'Schema' => 'სქემა',
'Alter schema' => 'სქემის შეცვლა',
'Create schema' => 'ახალი სქემა',
'Schema has been dropped.' => 'სქემა წაიშალა.',
'Schema has been created.' => 'შეიქმნა ახალი სქემა.',
'Schema has been altered.' => 'სქემა შეიცვალა.',
'Sequences' => 'მიმდევრობა',
'Create sequence' => 'მიმდევრობის შექმნა',
'Alter sequence' => 'მიმდევრობის შეცვლა',
'Sequence has been dropped.' => 'მიმდევრობა წაიშალა.',
'Sequence has been created.' => 'მიმდევრობა შეიქმნა.',
'Sequence has been altered.' => 'მიმდევრობა შეიცვალა.',
'User types' => 'მომხმარებლის სახეობა',
'Create type' => 'სახეობის შექმნა',
'Alter type' => 'სახეობის შეცვლა',
'Type has been dropped.' => 'სახეობა წაიშალა.',
'Type has been created.' => 'სახეობა შეიქმნა.',
'Ctrl+click on a value to modify it.' => 'შესაცვლელად გამოიყენეთ Ctrl+თაგვის ღილაკი.',
'Use edit link to modify this value.' => 'ამ მნიშვნელობის შესაცვლელად გამოიყენეთ ბმული «შეცვლა».',
'last' => 'ბოლო',
'From server' => 'სერვერიდან',
'System' => 'სისტემა',
'Select data' => 'არჩევა',
'Show structure' => 'სტრუქტურის ჩვენება',
'empty' => 'ცარიელი',
'Network' => 'ქსელი',
'Geometry' => 'გეომეტრია',
'File exists.' => 'ფაილი უკვე არსებობს.',
'%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' => 'სთ:წთ:წმ',
'Tables have been optimized.' => 'ცხრილებს გაუკეთდა ოპტიმიზაცია.',
'Materialized view' => 'მატერიალური ხედი',
'Vacuum' => 'ვაკუუმი',
'Selected' => 'არჩეული',
'File must be in UTF-8 encoding.' => 'ფაილი უნდა იყოს კოდირებაში UTF-8.',
'Modify' => 'შეცვლა',
'Loading' => 'ჩატვირთვა',
'Load more data' => 'მეტი ინფორმაციის ჩატვირთვა',
'ATTACH queries are not supported.' => 'ATTACH-მოთხოვნები არაა მხარდაჭერილი.',
'%d / ' => '%d / ',
'Limit rows' => 'რიგების შეზღუდვა',
'Default value' => 'სტანდარტული მნიშვნელობა',
'Full table scan' => 'სრული ცხრილის ანალიზი',
'Too many unsuccessful logins, try again in %d minute(s).' => 'ძალიან ბევრჯერ შეგეშალათ მომხმარებელი და პაროლი. სცადეთ %d წუთში.',
'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, რათა ის მუდმივი გახადოთ.',
'If you did not send this request from Adminer then close this page.' => 'ეს მოთხოვნა თქვენ თუ არ გაგიგზავნაით Adminer-იდან, დახურეთ ეს ფანჯარა..',
'You can upload a big SQL file via FTP and import it from server.' => 'დიდი ფაილი უნდა ატვირტოთ FTP-თი და შემდეგ გაუკეთოთ იმპორტი სერვერიდან.',
'Size' => 'ზომა',
'Compute' => 'გამოთვლა',
'You are offline.' => 'არ გაგივლიათ ავტორიზაცია.',
'You have no privileges to update this table.' => 'ამ ცხრილის განახლების უფლება არ გაქვთ.',
'Saving' => 'შენახვა',
'yes' => 'კი',
'no' => 'არა',
'Routines' => 'რუტინები',
'Target table' => 'მიზნობრივი ცხრილი',
'Strings' => 'ველები',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'საწყისი და მიზნობრივი ველები უნდა იყოს ერთიდაიგივე სახეობის, მიზნობრივ ველზე უნდა იყოს ინდექსი და უნდა არსებობდეს შესაბამისი ინფორმაცია.',
'Drop %s?' => 'წაიშალოს %s?',
'Warnings' => 'გაფრთხილება',
'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>.',
'DB' => 'ბაზა',
'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>.',
'The action will be performed after successful login with the same credentials.' => 'მოქმედება შესრულდება იგივე მომხმარებლით წარმატებული ავტორიზაციის შემდეგ.',
'Connecting to privileged ports is not allowed.' => 'პრივილეგირებულ პორტთან წვდომა დაუშვებელია.',
'There is a space in the input password which might be the cause.' => 'პაროლში არის გამოტოვება, შეიძლება ეს ქმნის პრობლემას.',
'Unknown error.' => 'უცნობი შეცდომა.',
'Database does not support password.' => 'ბაზაში არაა მხარდაჭერილი პაროლი.',
'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
);
// run `php ../../lang.php ka` to update this file

View File

@@ -1,268 +1,277 @@
<?php
$translations = array(
'Login' => '로그인',
'Logout successful.' => '로그아웃',
'Invalid credentials.' => '잘못된 로그인',
'Server' => '서버',
'Username' => '사용자이름',
'Password' => '비밀번호',
'Select database' => '데이터베이스를 선택하십시오.',
'Invalid database.' => '잘못된 데이터베이스입니다.',
'Create new database' => '새 데이터베이스 만들기',
'Table has been dropped.' => '테이블을 삭제했습니다.',
'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' => '로그아웃',
'database' => '데이터베이스',
'Use' => '사용',
'No tables.' => '테이블이 없습니다.',
'select' => '선택',
'Item has been deleted.' => '항목을 삭제했습니다.',
'Item has been updated.' => '항목을 갱신했습니다.',
'Edit' => '편집',
'Insert' => '삽입',
'Save and insert next' => '저장하고 다음에 추가',
'Delete' => '삭제',
'Database' => '데이터베이스',
'Routines' => '루틴',
'Indexes have been altered.' => '인덱스를 변경했습니다.',
'Indexes' => '색인',
'Alter indexes' => '인덱스 변경',
'Add next' => '추가',
'Language' => '언어',
'Select' => '선택',
'New item' => '항목 만들기',
'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' => '기본값',
namespace Adminer;
Lang::$translations = array(
'$1-$3-$5' => '$1-$3-$5',
'%.3f s' => '%.3f 초',
'%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' => '확장 기능이 없습니다.',
'None of the supported PHP extensions (%s) are available.' => 'PHP 확장 (%s)가 설치되어 있지 않습니다.',
'Session support must be enabled.' => '세션을 사용하십시오.',
'Session expired, please login again.' => '세션 만료. 다시 로그인하십시오.',
'Text length' => '문자열의 길이',
'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 프로세스를 강제 종료되었습니다.',
'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' => '이벤트',
'%d in total' => '총 %d개',
'%d item(s) have been affected.' => '%d개 항목을 갱신했습니다.',
'%d process(es) have been killed.' => '%d개 프로세스를 강제 종료하였습니다.',
'%d query(s) executed OK.' => '%d개 쿼리를 잘 실행했습니다.',
'%d row(s) have been imported.' => '%d 행을 가져 왔습니다.',
'%d row(s)' => '%d개 행',
'%s version: %s through PHP extension %s' => '%s 버전 %s, PHP 확장 %s',
'%d row(s)' => '%d 행',
'Remove' => '제외',
'Are you sure?' => '실행 하시겠습니까?',
'Privileges' => '권한',
'Create user' => '사용자 만들기',
'User has been dropped.' => '사용자 삭제',
'User has been altered.' => '사용자 변경',
'User has been created.' => '사용자 만들기',
'Hashed' => 'Hashed',
'Column' => '열',
'Routine' => '루틴',
'Grant' => '권한 부여',
'Revoke' => '권한 취소',
'Logged as: %s' => '로그 : %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
'Move up' => '상',
'Move down' => '아래',
'Export' => '내보내기',
'Tables' => '테이블',
'Data' => '데이터',
'Output' => '출력',
'open' => '열',
'save' => '저장',
'Format' => '형식',
'Functions' => '함수',
'Aggregation' => '집합',
'Event has been dropped.' => '삭제했습니다.',
'Event has been altered.' => '변경했습니다.',
'Event has been created.' => '만들었습니다.',
'Alter event' => '변경',
'Create event' => '만들기',
'Start' => '시작',
'End' => '종료',
'Every' => '매번',
'Status' => '상태',
'On completion preserve' => '완성 후 저장',
'Events' => '이벤트',
'Schedule' => '일정',
'At given time' => '지정 시간',
'Tables have been truncated.' => '테이블을 truncate했습니다.',
'Tables have been moved.' => '테이블을 옮겼습니다.',
'Tables and views' => '테이블과 뷰',
'Engine' => '엔진',
'Collation' => '정렬',
'Data Length' => '데이터 길이',
'Index Length' => '인덱스 길이',
'Data Free' => '여유',
'Rows' => '행',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '분석',
'Optimize' => '최적화',
'Check' => '확인',
'Repair' => '복구',
'Truncate' => 'Truncate',
'Move to other database' => '다른 데이터베이스로 이동',
'Move' => '이동',
'Save and continue edit' => '저장하고 계속',
'original' => '원래',
'%d item(s) have been affected.' => '%d를 갱신했습니다.',
'whole result' => '모든 결과',
'Tables have been dropped.' => '테이블을 삭제했습니다.',
'Clone' => '복제',
'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s를 늘리십시오.',
'Partition by' => '파티션',
'Partitions' => '파티션',
'Partition name' => '파티션 이름',
'Values' => '값',
'%d row(s) have been imported.' => '%d 행을 가져 왔습니다.',
'Show structure' => '구조',
'anywhere' => '모든',
'Import' => '가져 오기',
'Stop on error' => '오류의 경우 중지',
'Select data' => '데이터',
'%.3f s' => '%.3f 초',
'$1-$3-$5' => '$1-$3-$5',
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
'History' => '역사',
'Variables' => '변수',
'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' => '파일을 실행',
'Clear' => '삭제',
'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB',
'Numbers' => '숫자',
'Date and time' => '시간',
'Strings' => '문자열',
'Binary' => '이진',
'Lists' => '목록',
'Editor' => '에디터',
'E-mail' => '메일',
'From' => '보낸 사람',
'Subject' => '제목',
'Send' => '보내기',
'%d e-mail(s) have been sent.' => '%d 메일을 보냈습니다.',
'Webserver file %s' => 'Web 서버 파일 %s',
'File does not exist.' => '파일이 존재하지 않습니다.',
'%d in total' => '총 %d',
'Permanent login' => '영구적으로 로그인',
'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
'Search data in tables' => '데이터 검색',
'Schema' => '스키마',
'Action' => '실행',
'Add column' => '열 추가',
'Add foreign key' => '외부 키를 추가',
'Add next' => '다음 추가',
'Add trigger' => '트리거 추가',
'Aggregation' => '집합',
'Alter database' => '데이터베이스 변경',
'Alter event' => '이벤트 변경',
'Alter function' => '함수 변경',
'Alter indexes' => '색인 변경',
'Alter procedure' => '시저 변경',
'Alter schema' => '스키마 변경',
'Create schema' => '스키마 추가',
'Schema has been dropped.' => '스키마를 삭제했습니다.',
'Schema has been created.' => '스키마를 추가했습니다.',
'Schema has been altered.' => '스키마를 변경했습니다.',
'Sequences' => '시퀀스',
'Create sequence' => '시퀀스 만들기',
'Alter sequence' => '순서 변경',
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
'Sequence has been created.' => '시퀀스를 추가했습니다.',
'Sequence has been altered.' => '순서를 변경했습니다.',
'User types' => '사용자 정의 형',
'Create type' => '사용자 정의 형식 만들기',
'Alter type' => '사용자 정의 형식 변경',
'Type has been dropped.' => '사용자 정의 형식을 삭제했습니다.',
'Type has been created.' => '사용자 정의 형식을 추가했습니다.',
'Use edit link to modify this value.' => '링크 편집',
'last' => '마지막',
'From server' => '서버에서 실행',
'System' => '데이터베이스 형식',
'empty' => '하늘',
'Network' => '네트워크 형',
'Geometry' => '기하 형',
'File exists.' => '파일이 이미 있습니다.',
'Attachments' => '첨부 파일',
'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
'now' => '현재 시간',
'%d query(s) executed OK.' => '%d 쿼리를 실행했습니다.',
'Show only errors' => '오류 만 표시',
'Refresh' => '새로 고침',
'Invalid schema.' => '잘못된 스키마',
'Please use one of the extensions %s.' => '하나의 확장 기능을 사용하십시오 %s',
'ltr' => 'ltr',
'Tables have been copied.' => '테이블을 복사했습니다',
'Alter table' => '테이블 변경',
'Alter trigger' => '트리거 변경',
'Alter type' => '형 변경',
'Alter view' => '보기 변경',
'Alter' => '변경',
'Analyze' => '분석',
'anywhere' => '모든',
'Are you sure?' => '실행 하시겠습니까?',
'At given time' => '지정 시간',
'Auto Increment' => '자동 증가',
'Binary' => '이진',
'Call' => '호출',
'Change' => '변경',
'Check' => '확인',
'Clear' => '삭제',
'Clone' => '복제',
'collation' => '정렬',
'Collation' => '정렬',
'length' => '길이',
'Column name' => '열 이름',
'Column' => '',
'Comment' => '주석',
'Compute' => '계산하기',
'Copy' => '복사',
'Permanent link' => '영구 링크',
'Edit all' => '모든 편집',
'Create database' => '데이터베이스 만들기',
'Create event' => '만들기',
'Create function' => '함수 만들기',
'Create procedure' => '시저 만들기',
'Create schema' => '스키마 추가',
'Create sequence' => '시퀀스 만들기',
'Create table' => '테이블 만들기',
'Create trigger' => '트리거 만들기',
'Create type' => '사용자 정의 형식 만들기',
'Create user' => '사용자 만들기',
'Create view' => '뷰 만들기',
'Data Free' => '데이터 여유',
'Data Length' => '데이터 길이',
'Data' => '데이터',
'Database has been altered.' => '데이터베이스를 변경했습니다.',
'Database has been created.' => '데이터베이스를 만들었습니다.',
'Database has been dropped.' => '데이터베이스를 삭제했습니다.',
'Database has been renamed.' => '데이터베이스의 이름을 바꾸었습니다.',
'Database schema' => '데이터베이스 구조',
'Database' => '데이터베이스',
'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
'Date and time' => '시간',
'Default values' => '기본값',
'Delete' => '삭제',
'descending' => '역순',
'Drop' => '삭제',
'Edit all' => '모두 편집',
'Edit' => '편집',
'edit' => '편집',
'Editor' => '에디터',
'empty' => '비어있음',
'End' => '종료',
'engine' => '엔진',
'Engine' => '엔진',
'Error in query' => '쿼리의 오류',
'Event has been altered.' => '변경했습니다.',
'Event has been created.' => '만들었습니다.',
'Event has been dropped.' => '삭제했습니다.',
'Event' => '이벤트',
'Events' => '이벤트',
'Every' => '매 번',
'Execute' => '실행',
'Export' => '내보내기',
'File does not exist.' => '파일이 존재하지 않습니다.',
'File exists.' => '파일이 이미 있습니다.',
'File upload' => '파일 올리기',
'File uploads are disabled.' => '파일 업로드가 잘못되었습니다.',
'Foreign key has been altered.' => '외부 키를 변경했습니다.',
'Foreign key has been created.' => '외부 키를 만들었습니다.',
'Foreign key has been dropped.' => '외부 키를 제거했습니다.',
'Foreign key' => '외부 키',
'Foreign keys' => '외부 키',
'Format' => '형식',
'From server' => '서버에서 실행',
'Functions' => '함수',
'Geometry' => '기하 형',
'Grant' => '권한 부여',
'Hashed' => 'Hashed',
'HH:MM:SS' => '시:분:초',
'History' => '이력',
'Import' => '가져 오기',
'Index Length' => '색인 길이',
'Index Type' => '색인 형',
'Indexes have been altered.' => '색인을 변경했습니다.',
'Indexes' => '색인',
'Insert' => '삽입',
'Invalid credentials.' => '잘못된 로그인.',
'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰입니다. 다시 보내주십시오.',
'Invalid database.' => '잘못된 데이터베이스입니다.',
'Invalid schema.' => '잘못된 스키마입니다.',
'Item has been deleted.' => '항목을 삭제했습니다.',
'Item has been updated.' => '항목을 갱신했습니다.',
'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
'Kill' => '강제 종료',
'Language' => '언어',
'last' => '마지막',
'Length' => '길이',
'Limit rows' => '행 제약',
'Limit' => '제약',
'Lists' => '목록',
'Load more data' => '더 많은 데이터 부르기',
'Loading' => '부르는 중',
'Logged as: %s' => '다음으로 로그인했습니다: %s',
'Login' => '로그인',
'Logout successful.' => '로그아웃을 성공했습니다.',
'Logout' => '로그아웃',
'ltr' => 'ltr',
'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB.',
'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s(을)를 늘리십시오.',
'Modify' => '수정',
'Move down' => '아래로',
'Move to other database' => '다른 데이터베이스로 이동',
'Move up' => '위로',
'Move' => '이동',
'Name' => '이름',
'Network' => '네트워크 형',
'New item' => '항목 만들기',
'No commands to execute.' => '실행할 수 있는 명령이 없습니다.',
'No extension' => '확장이 없습니다',
'No rows.' => '행이 없습니다.',
'No tables.' => '테이블이 없습니다.',
'None of the supported PHP extensions (%s) are available.' => 'PHP 확장(%s)이 설치되어 있지 않습니다.',
'now' => '현재 시간',
'Numbers' => '숫자',
'On completion preserve' => '완성 후 저장',
'ON DELETE' => '지울 때',
'ON UPDATE' => '업데이트할 때',
'open' => '열',
'Optimize' => '최적화',
'Options' => '설정',
'original' => '원본',
'Output' => '출력',
'overwrite' => '덮어쓰기',
'Page' => '페이지',
'Parameter name' => '매개변수 이름',
'Partition by' => '파티션',
'Partition name' => '파티션 이름',
'Partitions' => '파티션',
'Password' => '비밀번호',
'Permanent link' => '영구적으로 링크',
'Permanent login' => '영구적으로 로그인',
'Please use one of the extensions %s.' => '확장 %s 중 하나를 사용하십시오.',
'Privileges' => '권한',
'Process list' => '프로세스 목록',
'Query executed OK, %d row(s) affected.' => '쿼리를 잘 실행했습니다. %d행을 변경했습니다.',
'Refresh' => '새로 고침',
'Relations' => '관계',
'Remove' => '제거',
'Repair' => '복구',
'Return type' => '반환 형식',
'Revoke' => '권한 취소',
'Routine has been altered.' => '루틴을 변경했습니다.',
'Routine has been called, %d row(s) affected.' => '루틴을 호출했습니다. %d 행을 변경했습니다.',
'Routine has been created.' => '루틴을 추가했습니다.',
'Routine has been dropped.' => '루틴을 제거했습니다.',
'Routine' => '루틴',
'Routines' => '루틴',
'Rows' => '행',
'Run file' => '파일을 실행',
'Save and continue edit' => '저장하고 계속 편집하기',
'Save and insert next' => '저장하고 다음에 추가',
'Save' => '저장',
'save' => '저장',
'Schedule' => '예약',
'Schema has been altered.' => '스키마를 변경했습니다.',
'Schema has been created.' => '스키마를 추가했습니다.',
'Schema has been dropped.' => '스키마를 삭제했습니다.',
'Schema' => '스키마',
'Search data in tables' => '테이블 내 데이터 검색',
'Search' => '검색',
'Select data' => '데이터를 선택하십시오',
'Select database' => '데이터베이스를 선택하십시오',
'Select' => '선택',
'select' => '선택',
'Selected' => '선택됨',
'Sequence has been altered.' => '시퀀스를 변경했습니다.',
'Sequence has been created.' => '시퀀스를 추가했습니다.',
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
'Sequences' => '시퀀스',
'Server' => '서버',
'Session expired, please login again.' => '세션이 만료되었습니다. 다시 로그인하십시오.',
'Session support must be enabled.' => '세션 지원을 사용해야만 합니다.',
'Show only errors' => '오류 만 표시',
'Show structure' => '구조 표시',
'Size' => '크기',
'Sort' => '정렬',
'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' => '소스',
'SQL command' => 'SQL 명령',
'Start' => '시작',
'Status' => '상태',
'Stop on error' => '오류의 경우 중지',
'Strings' => '문자열',
'System' => '데이터베이스 형식',
'Table has been altered.' => '테이블을 변경했습니다.',
'Table has been created.' => '테이블을 만들었습니다.',
'Table has been dropped.' => '테이블을 삭제했습니다.',
'Table name' => '테이블 이름',
'Table' => '테이블',
'Tables and views' => '테이블과 뷰',
'Tables have been copied.' => '테이블을 복사했습니다.',
'Tables have been dropped.' => '테이블을 삭제했습니다.',
'Tables have been moved.' => '테이블을 옮겼습니다.',
'Tables have been truncated.' => '테이블의 데이터 내용만 지웠습니다.',
'Tables' => '테이블',
'Target table' => '테이블',
'Target' => '타겟',
'Text length' => '문자열의 길이',
'Time' => '시간',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
'Trigger has been altered.' => '트리거를 변경했습니다.',
'Trigger has been created.' => '트리거를 추가했습니다.',
'Trigger has been dropped.' => '트리거를 제거했습니다.',
'Triggers' => '트리거',
'Truncate' => '데이터 내용만 지우기',
'Type has been created.' => '유형을 추가했습니다.',
'Type has been dropped.' => '유형을 삭제했습니다.',
'Type' => '형',
'Unable to select the table' => '테이블을 선택할 수 없습니다',
'Unable to upload a file.' => '파일을 업로드 할 수 없습니다.',
'Use edit link to modify this value.' => '이 값을 수정하려면 편집 링크를 사용하십시오.',
'Use' => '사용',
'User has been altered.' => '사용자를 변경했습니다.',
'User has been created.' => '사용자를 만들었습니다.',
'User has been dropped.' => '사용자를 제거했습니다.',
'Username' => '사용자이름',
'Vacuum' => '청소',
'Values' => '값',
'Variables' => '변수',
'View has been altered.' => '보기를 변경했습니다.',
'View has been created.' => '보기를 만들었습니다.',
'View has been dropped.' => '보기를 삭제했습니다.',
'View' => '보기',
'Warnings' => '경고',
'Webserver file %s' => '웹서버 파일 %s',
'Whole result' => '모든 결과',
'yes' => '네',
'You are offline.' => '오프라인입니다.',
'You can upload a big SQL file via FTP and import it from server.' => '큰 SQL 파일은 FTP를 통하여 업로드하여 서버에서 가져올 수 있습니다.',
'You have no privileges to update this table.' => '이 테이블을 업데이트할 권한이 없습니다.',
);
// run `php ../../lang.php ko` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistema',
'Server' => 'Serveris',
@@ -19,10 +21,10 @@ $translations = array(
'Session expired, please login again.' => 'Sesijos galiojimas baigėsi. Prisijunkite iš naujo.',
'%s version: %s through PHP extension %s' => '%s versija: %s per PHP plėtinį %s',
'Refresh' => 'Atnaujinti',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilegijos',
'Create user' => 'Sukurti vartotoją',
'User has been dropped.' => 'Vartotojas ištrintas.',
@@ -33,14 +35,14 @@ $translations = array(
'Routine' => 'Procedūra',
'Grant' => 'Suteikti',
'Revoke' => 'Atšaukti',
'Process list' => 'Procesų sąrašas',
'%d process(es) have been killed.' => array('%d procesas nutrauktas.', '%d procesai nutraukti.', '%d procesų nutraukta.'),
'Kill' => 'Nutraukti',
'Variables' => 'Kintamieji',
'Status' => 'Būsena',
'SQL command' => 'SQL užklausa',
'%d query(s) executed OK.' => array('%d užklausa įvykdyta.', '%d užklausos įvykdytos.', '%d užklausų įvykdyta.'),
'Query executed OK, %d row(s) affected.' => array('Užklausa įvykdyta. Pakeistas %d įrašas.', 'Užklausa įvykdyta. Pakeisti %d įrašai.', 'Užklausa įvykdyta. Pakeista %d įrašų.'),
@@ -54,7 +56,7 @@ $translations = array(
'History' => 'Istorija',
'Clear' => 'Išvalyti',
'Edit all' => 'Redaguoti visus',
'File upload' => 'Failo įkėlimas',
'From server' => 'Iš serverio',
'Webserver file %s' => 'Failas %s iš serverio',
@@ -64,20 +66,18 @@ $translations = array(
'Unable to upload a file.' => 'Nepavyko įkelti failo.',
'Maximum allowed file size is %sB.' => 'Maksimalus failo dydis - %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Per daug POST duomenų. Sumažinkite duomenų kiekį arba padidinkite konfigūracijos nustatymą %s.',
'Export' => 'Eksportas',
'Output' => 'Išvestis',
'open' => 'atidaryti',
'save' => 'išsaugoti',
'Format' => 'Formatas',
'Data' => 'Duomenys',
'Database' => 'Duomenų bazė',
'database' => 'duomenų bazė',
'Use' => 'Naudoti',
'Select database' => 'Pasirinkti duomenų bazę',
'Invalid database.' => 'Neteisinga duomenų bazė.',
'Create new database' => 'Sukurti naują duomenų bazę',
'Database has been dropped.' => 'Duomenų bazė panaikinta.',
'Databases have been dropped.' => 'Duomenų bazės panaikintos.',
'Database has been created.' => 'Duomenų bazė sukurta.',
@@ -86,10 +86,10 @@ $translations = array(
'Alter database' => 'Redaguoti duomenų bazę',
'Create database' => 'Sukurti duomenų bazę',
'Database schema' => 'Duomenų bazės schema',
// link to current database schema layout
'Permanent link' => 'Pastovi nuoroda',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
@@ -111,7 +111,7 @@ $translations = array(
'Tables have been moved.' => 'Lentelės perkeltos.',
'Copy' => 'Kopijuoti',
'Tables have been copied.' => 'Lentelės nukopijuotos.',
'Routines' => 'Procedūros',
'Routine has been called, %d row(s) affected.' => array('Procedūra įvykdyta. %d įrašas pakeistas.', 'Procedūra įvykdyta. %d įrašai pakeisti.', 'Procedūra įvykdyta. %d įrašų pakeista.'),
'Call' => 'Vykdyti',
@@ -124,7 +124,7 @@ $translations = array(
'Alter function' => 'Keisti funkciją',
'Alter procedure' => 'Keiskti procedūrą',
'Return type' => 'Grąžinimo tipas',
'Events' => 'Įvykiai',
'Event has been dropped.' => 'Įvykis pašalintas.',
'Event has been altered.' => 'Įvykis pakeistas.',
@@ -137,7 +137,7 @@ $translations = array(
'Start' => 'Pradžia',
'End' => 'Pabaiga',
'On completion preserve' => 'Įvykdžius išsaugoti',
'Tables' => 'Lentelės',
'Tables and views' => 'Lentelės ir vaizdai',
'Table' => 'Lentelė',
@@ -165,26 +165,26 @@ $translations = array(
'Move down' => 'Perkelti žemyn',
'Remove' => 'Pašalinti',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
'Partition by' => 'Skirstyti pagal',
'Partitions' => 'Skirsniai',
'Partition name' => 'Skirsnio pavadinimas',
'Values' => 'Reikšmės',
'View' => 'Vaizdas',
'View has been dropped.' => 'Vaizdas pašalintas.',
'View has been altered.' => 'Vaizdas pakeistas.',
'View has been created.' => 'Vaizdas sukurtas.',
'Alter view' => 'Redaguoti vaizdą',
'Create view' => 'Sukurti vaizdą',
'Indexes' => 'Indeksai',
'Indexes have been altered.' => 'Indeksai pakeisti.',
'Alter indexes' => 'Redaguoti indeksus',
'Add next' => 'Pridėti kitą',
'Index Type' => 'Indekso tipas',
'Column (length)' => 'Stulpelis (ilgis)',
'length' => 'ilgis',
'Foreign keys' => 'Išoriniai raktai',
'Foreign key' => 'Išorinis raktas',
'Foreign key has been dropped.' => 'Išorinis raktas pašalintas.',
@@ -200,7 +200,7 @@ $translations = array(
'ON DELETE' => 'Ištrinant',
'ON UPDATE' => 'Atnaujinant',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Šaltinio ir tikslinis stulpelis turi būti to paties tipo, tiksliniame stulpelyje turi būti naudojamas indeksas ir duomenys turi egzistuoti.',
'Triggers' => 'Trigeriai',
'Add trigger' => 'Pridėti trigerį',
'Trigger has been dropped.' => 'Trigeris pašalintas.',
@@ -211,7 +211,7 @@ $translations = array(
'Time' => 'Laikas',
'Event' => 'Įvykis',
'Name' => 'Pavadinimas',
'select' => 'atrinkti',
'Select' => 'Atrinkti',
'Select data' => 'Atrinkti duomenis',
@@ -230,15 +230,15 @@ $translations = array(
'%d row(s)' => array('%d įrašas', '%d įrašai', '%d įrašų'),
'Page' => 'Puslapis',
'last' => 'paskutinis',
'whole result' => 'visas rezultatas',
'Whole result' => 'Visas rezultatas',
'%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
'Import' => 'Importas',
'%d row(s) have been imported.' => array('%d įrašas įkelta.', '%d įrašai įkelti.', '%d įrašų įkelta.'),
// in-place editing in select
'Use edit link to modify this value.' => 'Norėdami redaguoti reikšmę naudokite redagavimo nuorodą.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Įrašas%s sukurtas.',
'Item has been deleted.' => 'Įrašas ištrintas.',
@@ -256,14 +256,7 @@ $translations = array(
'Save and insert next' => 'Išsaugoti ir įrašyti kitą',
'Clone' => 'Klonuoti',
'Delete' => 'Trinti',
'E-mail' => 'El. paštas',
'From' => 'Nuo',
'Subject' => 'Antraštė',
'Attachments' => 'Priedai',
'Send' => 'Siųsti',
'%d e-mail(s) have been sent.' => array('Išsiųstas %d laiškas.', 'Išsiųsti %d laiškai.', 'Išsiųsta %d laiškų.'),
// data type descriptions
'Numbers' => 'Skaičiai',
'Date and time' => 'Data ir laikas',
@@ -273,7 +266,7 @@ $translations = array(
'Network' => 'Tinklas',
'Geometry' => 'Geometrija',
'Relations' => 'Ryšiai',
'Editor' => 'Redaktorius',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
@@ -282,11 +275,11 @@ $translations = array(
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'dabar',
// general SQLite error in create, drop or rename database
'File exists.' => 'Failas egzistuoja.',
'Please use one of the extensions %s.' => 'Naudokite vieną iš plėtinių %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Keisti schemą',
'Create schema' => 'Sukurti schemą',
@@ -295,7 +288,7 @@ $translations = array(
'Schema has been altered.' => 'Schema pakeista.',
'Schema' => 'Schema',
'Invalid schema.' => 'Neteisinga schema.',
// PostgreSQL sequences support
'Sequences' => 'Sekos',
'Create sequence' => 'Sukurti seką',
@@ -303,7 +296,7 @@ $translations = array(
'Sequence has been created.' => 'Seka sukurta.',
'Sequence has been altered.' => 'Seka pakeista.',
'Alter sequence' => 'Keisti seką',
// PostgreSQL user types support
'User types' => 'Vartotojų tipai',
'Create type' => 'Sukurti tipą',
@@ -311,3 +304,5 @@ $translations = array(
'Type has been created.' => 'Tipas sukurtas.',
'Alter type' => 'Keisti tipą',
);
// run `php ../../lang.php lt` to update this file

300
adminer/lang/lv.inc.php Normal file
View File

@@ -0,0 +1,300 @@
<?php
namespace Adminer;
Lang::$translations = array(
'Login' => 'Ieiet',
'Logout successful.' => 'Jūs veiksmīgi izgājāt no sistēmas.',
'Invalid credentials.' => 'Nepareizs lietotāja vārds vai parole.',
'Server' => 'Serveris',
'Username' => 'Lietotājs',
'Password' => 'Parole',
'Select database' => 'Izvēlēties datubāzi',
'Invalid database.' => 'Nederīga datubāze.',
'Table has been dropped.' => 'Tabula dzēsta.',
'Table has been altered.' => 'Tabula mainīta.',
'Table has been created.' => 'Tabula izveidota.',
'Alter table' => 'Mainīt tabulu',
'Create table' => 'Izveidot tabulu',
'Table name' => 'Tabulas nosaukums',
'engine' => 'Tabulas tips',
'collation' => 'Kolācija',
'Column name' => 'Lauka nosaukums',
'Type' => 'Tips',
'Length' => 'Garums',
'Auto Increment' => 'Auto inkrements',
'Options' => 'Opcijas',
'Save' => 'Saglabāt',
'Drop' => 'Dzēst',
'Database has been dropped.' => 'Datubāze tika nodzēsta.',
'Database has been created.' => 'Datubāze tika izveidota.',
'Database has been renamed.' => 'Datubāze tika pārsaukta.',
'Database has been altered.' => 'Datubāze tika mainīta.',
'Alter database' => 'Mainīt datubāzi',
'Create database' => 'Izveidot datubāzi',
'SQL command' => 'SQL pieprasījums',
'Logout' => 'Iziet',
'Use' => 'Lietot',
'No tables.' => 'Datubāzē nav tabulu.',
'select' => 'izvēlēties',
'Item has been deleted.' => 'Ieraksts dzests.',
'Item has been updated.' => 'Ieraksts atjaunots.',
'Item%s has been inserted.' => 'Ieraksti%s tika ievietoti.',
'Edit' => 'Rediģēt',
'Insert' => 'Ievietot',
'Save and insert next' => 'Saglabāt un ievietot nākamo',
'Delete' => 'Dzēst',
'Database' => 'Datubāze',
'Routines' => 'Procedūras un funkcijas',
'Indexes have been altered.' => 'Indeksi mainīti.',
'Indexes' => 'Indeksi',
'Alter indexes' => 'Izmainīt indeksus',
'Add next' => 'Pievienot vēl',
'Language' => 'Valoda',
'Select' => 'Izvēlēties',
'New item' => 'Jauns ieraksts',
'Search' => 'Meklēšana',
'Sort' => 'Kārtošana',
'descending' => 'dilstoši',
'Limit' => 'Limits',
'No rows.' => 'Nav rindu.',
'Action' => 'Darbība',
'edit' => 'rediģēt',
'Page' => 'Lapa',
'Query executed OK, %d row(s) affected.' => array('Pieprasījums pabeigts, izmainīts %d ieraksts.', 'Pieprasījums pabeigts, izmainīti %d ieraksti.', 'Pieprasījums pabeigts, izmainīti %d ieraksti.'),
'Error in query' => 'Kļūda pieprasījumā',
'Execute' => 'Izpidīt',
'Table' => 'Tabula',
'Foreign keys' => 'Ārejā atslēgas',
'Triggers' => 'Trigeri',
'View' => 'Skats',
'Unable to select the table' => 'Tabula nav pieejama',
'Invalid CSRF token. Send the form again.' => 'Nederīgs CSRF žetons. Nosūtiet formu vēl vienu reizi.',
'Comment' => 'Komentārs',
'Default values' => 'Noklusētā vērtība',
'%d byte(s)' => array('%d baits', '%d baiti', '%d baiti'),
'No commands to execute.' => 'Nav izpildāmu komandu.',
'Unable to upload a file.' => 'Neizdevās ielādēt failu uz servera.',
'File upload' => 'Augšupielāde',
'File uploads are disabled.' => 'Augšupielādes aizliegtas.',
'Routine has been called, %d row(s) affected.' => array('Procedūra izsaukta, izmainīts %d ieraksts.', 'Procedūra izsaukta, izmainīti %d ieraksti.', 'Procedūra izsaukta, izmainīti %d ieraksti.'),
'Call' => 'Izsaukt',
'No extension' => 'Nav paplašinājuma',
'None of the supported PHP extensions (%s) are available.' => 'Neviens PHP no atbalstītajiem paplašinājumiem (%s) nav pieejams.',
'Session support must be enabled.' => 'Sesiju atbalstam jābūt ieslēgtam.',
'Session expired, please login again.' => 'Sesijas laiks ir beidzies, piesakies no jauna sistēmā.',
'Text length' => 'Teksta garums',
'Foreign key has been dropped.' => 'Ārejā atslēga dzēsta.',
'Foreign key has been altered.' => 'Ārejā atslēga izmainīta.',
'Foreign key has been created.' => 'Ārejā atslēga izveidota.',
'Foreign key' => 'Ārejā atslēga',
'Target table' => 'Mērķa tabula',
'Change' => 'Mainīt',
'Source' => 'Avots',
'Target' => 'Mērķis',
'Add column' => 'Pievienot lauku',
'Alter' => 'Izmainīt',
'Add foreign key' => 'Pievienot ārējo atslēgu',
'ON DELETE' => 'Pie dzēšanas',
'ON UPDATE' => 'Pie atjaunošanas',
'Index Type' => 'Indeksa tips',
'length' => 'garums',
'View has been dropped.' => 'Skats dzēsts.',
'View has been altered.' => 'Skats izmainīts.',
'View has been created.' => 'Skats izveidots.',
'Alter view' => 'Izmainīt skatu',
'Create view' => 'Izveidot skatu',
'Name' => 'Nosaukums',
'Process list' => 'Procesu saraksts',
'%d process(es) have been killed.' => array('Pabeigts %d process.', 'Pabeigti %d procesi.', 'Pabeigti %d procesi.'),
'Kill' => 'Nobeigt',
'Parameter name' => 'Parametra nosaukums',
'Database schema' => 'Datubāzes shēma',
'Create procedure' => 'Izveidot procedūru',
'Create function' => 'Izveidot funkciju',
'Routine has been dropped.' => 'Procedūru dzēsta.',
'Routine has been altered.' => 'Procedūru izmainīta.',
'Routine has been created.' => 'Procedūru izveidota.',
'Alter function' => 'Mainīt funkciju',
'Alter procedure' => 'Mainīt procedūru',
'Return type' => 'Atgriezt tips',
'Add trigger' => 'Pievienot trigeri',
'Trigger has been dropped.' => 'Trigeris dzēsts.',
'Trigger has been altered.' => 'Trigeris izmainīts.',
'Trigger has been created.' => 'Trigeris izveidots.',
'Alter trigger' => 'Izmainīt trigeri',
'Create trigger' => 'Izveidot trigeri',
'Time' => 'Laiks',
'Event' => 'Notikums',
'%s version: %s through PHP extension %s' => 'Versija %s: %s ar PHP paplašinājumu %s',
'%d row(s)' => array('%d rinda', '%d rindas', '%d rindu'),
'Remove' => 'Noņemt',
'Are you sure?' => 'Vai Tu esi pārliecināts?',
'Privileges' => 'Tiesības',
'Create user' => 'Izveidot lietotāju',
'User has been dropped.' => 'Lietotājs dzests.',
'User has been altered.' => 'Lietotājs izmainīts.',
'User has been created.' => 'Lietotājs izveidots.',
'Hashed' => 'Sajaukts',
'Column' => 'Lauks',
'Routine' => 'Procedūra',
'Grant' => 'Atļaut',
'Revoke' => 'Aizliegt',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST metodes pieprasījums apjoms par lielu. Atsūtiet mazāka apjoma pieprasījumu kā konfigurācijas %s.',
'Logged as: %s' => 'Ielogojies kā: %s',
'Move up' => 'Pārvietot uz augšu',
'Move down' => 'Pārvietot uz leju',
'Functions' => 'Funkcijas',
'Aggregation' => 'Agregācija',
'Export' => 'Eksports',
'Output' => 'Izejas dati',
'open' => 'atvērt',
'save' => 'saglabāt',
'Format' => 'Formāts',
'Tables' => 'Tabulas',
'Data' => 'Dati',
'Event has been dropped.' => 'Notikums dzēsts.',
'Event has been altered.' => 'Notikums izmainīts.',
'Event has been created.' => 'Notikums izveidots.',
'Alter event' => 'Izmainīt notikumu',
'Create event' => 'Izveidot notikumu',
'At given time' => 'Norāditā laikā',
'Every' => 'Katru',
'Events' => 'Notikumi',
'Schedule' => 'Grafiks',
'Start' => 'Sākums',
'End' => 'Beigas',
'Status' => 'Statuss',
'On completion preserve' => 'Beigās saglabāt',
'Tables and views' => 'Tabulas un skati',
'Data Length' => 'Datu apjoms',
'Index Length' => 'Indeksu izmērs',
'Data Free' => 'Brīvā vieta',
'Collation' => 'Kolācija',
'Analyze' => 'Analizēt',
'Optimize' => 'Optimizēt',
'Check' => 'Pārbaudīt',
'Repair' => 'Salabot',
'Truncate' => 'Iztīrīt',
'Tables have been truncated.' => 'Tabulas iztīrītas.',
'Rows' => 'Rindas',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Tabulas pārvietotas.',
'Move to other database' => 'Pārvietot uz citu datubāzi',
'Move' => 'Pārvietot',
'Engine' => 'Dzinējs',
'Save and continue edit' => 'Saglabāt un turpināt rediģēt',
'original' => 'oriģināls',
'%d item(s) have been affected.' => array('Izmainīts %d ieraksts.', 'Izmainīti %d ieraksti.', 'Izmainīti %d ieraksti.'),
'Whole result' => 'Viss rezultāts',
'Tables have been dropped.' => 'Tabulas dzēstas.',
'Clone' => 'Klonēt',
'Partition by' => 'Sadalīt pēc',
'Partitions' => 'Partīcijas',
'Partition name' => 'Partīcijas nosaukums',
'Values' => 'Vērtības',
'%d row(s) have been imported.' => array('Importēta %d rinda.', 'Importētas %d rindas.', 'Importētas %d rindas.'),
'Import' => 'Imports',
'Stop on error' => 'Astāties kļūdas gadījumā',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Sasniegts maksimālais lauku skaita ierobežojums. Palieliniet %s.',
'anywhere' => 'jebkurā vietā',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'dd.mm.[gggg]',
'History' => 'Vēsture',
'Variables' => 'Mainīgie',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Lauku tipiem jābūt vienādiem, rezultējošā laukā jābut indeksa datiem.',
'Relations' => 'Relācijas',
'Run file' => 'Izpildīt failu',
'Clear' => 'Notīrīt',
'Maximum allowed file size is %sB.' => 'Faila maksimālais izmērs — %sB.',
'Numbers' => 'Skaitļi',
'Date and time' => 'Datums un laiks',
'Strings' => 'Virknes',
'Binary' => 'Binārie',
'Lists' => 'Saraksti',
'Editor' => 'Redaktors',
'Webserver file %s' => 'Fails %s uz servera',
'File does not exist.' => 'Fails neeksistē.',
'%d in total' => 'Kopā %d',
'Permanent login' => 'Atcerēties mani',
'Databases have been dropped.' => 'Datubāzes dzēstas.',
'Search data in tables' => 'Meklēt tabulās',
'Schema' => 'Shēma',
'Alter schema' => 'Izmainīt shēmu',
'Create schema' => 'Jauna shēma',
'Schema has been dropped.' => 'Shēma dzēsta.',
'Schema has been created.' => 'Izveidota jauna shēma.',
'Schema has been altered.' => 'Shēma izmainīta.',
'Sequences' => 'Virknes',
'Create sequence' => 'Izveidot virkni',
'Alter sequence' => 'Izmainīt virkni',
'Sequence has been dropped.' => 'Virkne dzēsta.',
'Sequence has been created.' => 'Izveidota virkne.',
'Sequence has been altered.' => 'Virkne izmainīta.',
'User types' => 'Lietotāju tipi',
'Create type' => 'Izveidot tipu',
'Alter type' => 'Izmainīt tipu',
'Type has been dropped.' => 'Tips dzēsts.',
'Type has been created.' => 'Tips izveidots.',
'Ctrl+click on a value to modify it.' => 'Lai izmainītu vērtību, izmanto Ctrl + peles klikšķi.',
'Use edit link to modify this value.' => 'Izmainīt vērtību var tikai ar saiti \'Izmainīt\'.',
'last' => 'pēdējā',
'From server' => 'No servera',
'System' => 'Sistēma',
'Select data' => 'Izvēlēties datus',
'Show structure' => 'Parādīt struktūru',
'empty' => 'tukšs',
'Network' => 'Tīkls',
'Geometry' => 'Ģeometrija',
'File exists.' => 'Fails eksistē.',
'%d query(s) executed OK.' => array('%d pieprasījums veiksmīgs.', '%d pieprasījumi veiksmīgi.', '%d pieprasījumi veiksmīgi.'),
'Show only errors' => 'Rādīt tikai kļūdas',
'Refresh' => 'Atjaunot',
'Invalid schema.' => 'Nederīga shēma.',
'Please use one of the extensions %s.' => 'Izmainojiet kādu no paplašinājumiem %s.',
'now' => 'tagad',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabulas nokopētas.',
'Copy' => 'kopēt',
'Permanent link' => 'Pastāvīga saite',
'Edit all' => 'Rediģēt visus',
'HH:MM:SS' => 'HH:MM:SS',
'Tables have been optimized.' => 'Tabulas optimizētas.',
'Materialized view' => 'Matrializēts skats',
'Vacuum' => 'Vakums',
'Selected' => 'Izvēlētie',
'File must be in UTF-8 encoding.' => 'Failam jābūt UTF-8 kodējumam.',
'Modify' => 'Izmainīt',
'Loading' => 'Ielāde',
'Load more data' => 'Ielādēt vēl datus',
'ATTACH queries are not supported.' => 'ATTACH-pieprasījumi nav atbalstīti.',
'%d / ' => '%d / ',
'Limit rows' => 'Rindu limits',
'Default value' => 'Noklusētā vērtība',
'Full table scan' => 'Pilna tabulas analīze',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Pieteikšanās mēģinājumu skaits par lielu. Mēginiet pēc %d minūtes.', 'Pieteikšanās mēģinājumu skaits par lielu. Mēginiet pēc %d minūtēm.', 'Pieteikšanās mēģinājumu skaits par lielu. Mēginiet pēc %d minūtēm.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-parole nav derīga. <a href="https://www.adminer.org/en/extension/"%s>Implementējiet</a> metodi %s, lai padarīgu šo par ierastu metodi.',
'If you did not send this request from Adminer then close this page.' => 'Ja nesūtījāt šo pieprasījumu no Adminer, tad aizveriet pārlūka logu.',
'You can upload a big SQL file via FTP and import it from server.' => 'Varat ielādēt lielu SQL failu uz servera un tad importēt to.',
'Size' => 'Izmērs',
'Compute' => 'Izskaitļot',
'You are offline.' => 'Jūs est bezsasaistē.',
'You have no privileges to update this table.' => 'jums nav pieejas labot šo tabulu.',
'Saving' => 'Saglabāšana',
'yes' => 'Jā',
'no' => 'Nē',
'Drop %s?' => 'Dzēst %s?',
'overwrite' => 'pārrakstīt',
'DB' => 'DB',
'Warnings' => 'Brīdinājumi',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer neatbalsta pieeju bez paroles, <a href="https://www.adminer.org/en/password/"%s>vairāk informācijas šeit</a>.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Paldies, ka izmantoji Adminer, vai vēlies veikt <a href="https://www.adminer.org/en/donation/">ziedojumu</a>.',
'The action will be performed after successful login with the same credentials.' => 'Darbība tiks pabeigta pēc derīgas pieteikšanās sistēmā.',
'Connecting to privileged ports is not allowed.' => 'Pieeja priviliģētiem portiem nav atļauta.',
'There is a space in the input password which might be the cause.' => 'Parole satur atstarpi, kas varētu būt lieka.',
'Unknown error.' => 'Nezināma kļūda.',
'Database does not support password.' => 'Datubāze neatbalsta paroli.',
);
// run `php ../../lang.php lv` to update this file

336
adminer/lang/ms.inc.php Normal file
View File

@@ -0,0 +1,336 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Pelayan',
'Username' => 'Nama pengguna',
'Password' => 'Kata laluan',
'Permanent login' => 'Log masuk kekal',
'Login' => 'Log masuk',
'Logout' => 'Log keluar',
'Logged as: %s' => 'Log masuk sebagai: %s',
'Logout successful.' => 'Log keluar berjaya.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="https://www.adminer.org/en/donation/">menderma</a>.',
'Invalid credentials.' => 'Akses tidak sah.',
'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',
'Language' => 'Bahasa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Sila hantar borang sekali lagi.',
'If you did not send this request from Adminer then close this page.' => 'Jika anda tidak menghantar permintaan ini dari Adminer sila tutup halaman ini.',
'No extension' => 'Tiada sambungan',
'None of the supported PHP extensions (%s) are available.' => 'Sambungan PHP yang (%s) disokong tidak wujud.',
'Connecting to privileged ports is not allowed.' => 'Penyambungan ke port yang istimewa tidak dibenarkan.',
'Session support must be enabled.' => 'Sokongan sesi perlu diaktifkan.',
'Session expired, please login again.' => 'Sesi telah luput, sila log masuk kembali.',
'%s version: %s through PHP extension %s' => 'Versi %s: %s melalui sambungan PHP %s',
'Refresh' => 'Segar kembali',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Keistimewaan',
'Create user' => 'Bina pengguna',
'User has been dropped.' => 'Pengguna telah dijatuhkan.',
'User has been altered.' => 'Pengguna telah diubah.',
'User has been created.' => 'Pengguna telah dibuat.',
'Hashed' => 'Hashed',
'Column' => 'Kolum',
'Routine' => 'Rutin',
'Grant' => 'Beri',
'Revoke' => 'Batal',
'Process list' => 'Senarai proses',
'%d process(es) have been killed.' => '%d proses telah dihentikan.',
'Kill' => 'Henti',
'Variables' => 'Pembolehubah',
'Status' => 'Status',
'SQL command' => 'Arahan SQL',
'%d query(s) executed OK.' => '%d query berjaya dilaksanakan.',
'Query executed OK, %d row(s) affected.' => 'Query berjaya dilaksanakan, %d baris terjejas.',
'No commands to execute.' => 'Tiada arahan untuk dilaksanakan.',
'Error in query' => 'Ralat pada query',
'ATTACH queries are not supported.' => 'Query berikut tidak disokong.',
'Execute' => 'Laksana',
'Stop on error' => 'Berhenti jika ralat',
'Show only errors' => 'Paparkan jika ralat',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Sejarah',
'Clear' => 'Bersih',
'Edit all' => 'Ubah semua',
'File upload' => 'Muat naik fail',
'From server' => 'Dari pelayan',
'Webserver file %s' => 'Fail pelayan sesawang %s',
'Run file' => 'Jalankan fail',
'File does not exist.' => 'Fail tidak wujud.',
'File uploads are disabled.' => 'Muat naik fail dihalang.',
'Unable to upload a file.' => 'Muat naik fail gagal.',
'Maximum allowed file size is %sB.' => 'Saiz fail maksimum yang dibenarkan adalah %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kecilkan data atau tingkatkan tetapan %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Anda boleh muat naik fail SQL yang besar melalui FTP dan import melalui pelayan.',
'You are offline.' => 'Anda sedang offline.',
'Export' => 'Eksport',
'Output' => 'Pengeluaran',
'open' => 'buka',
'save' => 'simpan',
'Saving' => 'Menyimpan',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Pangkalan data',
'Use' => 'Guna',
'Select database' => 'Pilih pangkalan data',
'Invalid database.' => 'Pangkalan data tidak sah.',
'Database has been dropped.' => 'Pangkalan data telah dijatuhkan.',
'Databases have been dropped.' => 'Pangkalan data telah dijatuhkan.',
'Database has been created.' => 'Pangkalan data telah dibuat.',
'Database has been renamed.' => 'Pangkalan data telah ditukar nama.',
'Database has been altered.' => 'Pangkalan data telah diubah.',
'Alter database' => 'Ubah pangkalan data',
'Create database' => 'Bina pangkalan data',
'Database schema' => 'Skema pangkalan data',
// link to current database schema layout
'Permanent link' => 'Pautan kekal',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Enjin',
'Collation' => 'Collation',
'Data Length' => 'Panjang Data',
'Index Length' => 'Panjang Indeks',
'Data Free' => 'Data Free',
'Rows' => 'Baris',
'%d in total' => '%d secara keseluruhan',
'Analyze' => 'Menganalisis',
'Optimize' => 'Mengoptimum',
'Vacuum' => 'Vacuum',
'Check' => 'Periksa',
'Repair' => 'Baiki',
'Truncate' => 'Memangkas',
'Tables have been truncated.' => 'Jadual telah dimangkaskan.',
'Move to other database' => 'Pindahkan ke pangkalan data yang lain',
'Move' => 'Pindah',
'Tables have been moved.' => 'Jadual telah dipindahkan.',
'Copy' => 'Salin',
'Tables have been copied.' => 'Jadual telah disalin.',
'Routines' => 'Rutin',
'Routine has been called, %d row(s) affected.' => 'Rutin telah dipanggil, %d baris terjejas.',
'Call' => 'Panggil',
'Parameter name' => 'Nama pembolehubah',
'Create procedure' => 'Bina prosedur',
'Create function' => 'Bina fungsi',
'Routine has been dropped.' => 'Rutin telah dijatuhkan.',
'Routine has been altered.' => 'Rutin telah diubah.',
'Routine has been created.' => 'Rutin telah dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis Return',
'Events' => 'Peristiwa',
'Event has been dropped.' => 'Peristiwa telah dijatuhkan.',
'Event has been altered.' => 'Peristiwa telah diubah.',
'Event has been created.' => 'Peristiwa telah dibuat.',
'Alter event' => 'Ubah peristiwa',
'Create event' => 'Bina peristiwa',
'At given time' => 'Pada masa tersebut',
'Every' => 'Setiap',
'Schedule' => 'Jadual',
'Start' => 'Mula',
'End' => 'Habis',
'On completion preserve' => 'Dalam melestarikan penyelesaian',
'Tables' => 'Jadual',
'Tables and views' => 'Jadual dan pandangan',
'Table' => 'Jadual',
'No tables.' => 'Tiada jadual.',
'Alter table' => 'Ubah jadual',
'Create table' => 'Bina jadual',
'Table has been dropped.' => 'Jadual telah dijatuhkan.',
'Tables have been dropped.' => 'Jadual telah dijatuhkan.',
'Tables have been optimized.' => 'Jadual telah dioptimumkan.',
'Table has been altered.' => 'Jadual telah diubah.',
'Table has been created.' => 'Jadual telah dibuat.',
'Table name' => 'Nama jadual',
'Show structure' => 'Paparkan struktur',
'engine' => 'enjin',
'collation' => 'collation',
'Column name' => 'Nama kolum',
'Type' => 'Jenis',
'Length' => 'Kepanjangan',
'Auto Increment' => 'Kenaikan Auto',
'Options' => 'Pilihan',
'Comment' => 'Komen',
'Default value' => 'Nilai lalai',
'Default values' => 'Nilai lalai',
'Drop' => 'Jatuh',
'Drop %s?' => 'Jatuhkan %s?',
'Are you sure?' => 'Anda pasti?',
'Size' => 'Saiz',
'Compute' => 'Kira',
'Move up' => 'Gerak ke atas',
'Move down' => 'Gerak ke bawah',
'Remove' => 'Buang',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bilangan medan telah melebihi had yang dibenarkan. Sila tingkatkan %s.',
'Partition by' => 'Partition mengikut',
'Partitions' => 'Partition',
'Partition name' => 'Nama partition',
'Values' => 'Nilai',
'View' => 'Papar',
'Materialized view' => 'Paparan yang menjadi kenyataan',
'View has been dropped.' => 'Paparan telah dijatuhkan.',
'View has been altered.' => 'Paparan telah diubah.',
'View has been created.' => 'Paparan telah dibuat.',
'Alter view' => 'Ubah paparan',
'Create view' => 'Bina paparan',
'Indexes' => 'Indeks',
'Indexes have been altered.' => 'Indeks telah diubah.',
'Alter indexes' => 'Ubah indeks',
'Add next' => 'Tambah yang seterusnya',
'Index Type' => 'Jenis Indeks',
'length' => 'kepanjangan',
'Foreign keys' => 'Kunci asing',
'Foreign key' => 'Kunci asing',
'Foreign key has been dropped.' => 'Kunci asing telah dijatuhkan.',
'Foreign key has been altered.' => 'Kunci asing telah diubah.',
'Foreign key has been created.' => 'Kunci asing telah dibuat.',
'Target table' => 'Jadual sasaran',
'Change' => 'Tukar',
'Source' => 'Sumber',
'Target' => 'Sasaran',
'Add column' => 'Tambah kolum',
'Alter' => 'Ubah',
'Add foreign key' => 'Tambah kunci asing',
'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.' => 'Kolum sumber dan sasaran perlu mempunyai jenis data yang sama, indeks diperlukan pada kolum sasaran dan data yang dirujuk wujud.',
'Triggers' => ' Pencetus',
'Add trigger' => 'Tambah pencetus',
'Trigger has been dropped.' => 'Pencetus telah dijatuhkan.',
'Trigger has been altered.' => 'Pencetus telah diubah.',
'Trigger has been created.' => 'Pencetus telah dibuat.',
'Alter trigger' => 'Ubah pencetus',
'Create trigger' => 'Buat pencetus',
'Time' => 'Masa',
'Event' => 'Peristiwa',
'Name' => 'Nama',
'select' => 'pilih',
'Select' => 'Pilih',
'Select data' => 'Pilih data',
'Functions' => 'Fungsi',
'Aggregation' => 'Pengagregatan',
'Search' => 'Cari',
'anywhere' => 'di mana-mana',
'Search data in tables' => 'Cari data dalam jadual',
'Sort' => 'Susun',
'descending' => 'menurun',
'Limit' => 'Had',
'Limit rows' => 'Had baris',
'Text length' => 'Kepanjangan teks',
'Action' => 'Aksi',
'Full table scan' => 'Imbasan penuh jadual',
'Unable to select the table' => 'Pemilihan jadual tidak berjaya',
'No rows.' => 'Tiada baris.',
'%d / ' => '%d / ',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'akhir',
'Load more data' => 'Load lebih data',
'Loading' => 'Loading',
'Whole result' => 'Keputusan keseluruhan',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Import',
'%d row(s) have been imported.' => '%d baris telah diimport.',
'File must be in UTF-8 encoding.' => 'Fail mesti dalam pengekodan UTF-8.',
// in-place editing in select
'Modify' => 'Pinda',
'Ctrl+click on a value to modify it.' => 'Ctrl+click pada nilai untuk meminda.',
'Use edit link to modify this value.' => 'Guna pautan ubah untuk meminda nilai ini.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Item%s telah dimasukkan.',
'Item has been deleted.' => 'Item telah dipadamkan.',
'Item has been updated.' => 'Item telah dikemaskini.',
'%d item(s) have been affected.' => '%d item telah terjejas.',
'New item' => 'Item baru',
'original' => 'asli',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'ubah',
'Edit' => 'Ubah',
'Insert' => 'Masukkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan sambung ubah',
'Save and insert next' => 'Simpan dan masukkan seterusnya',
'Selected' => 'Terpilih',
'Clone' => 'Klon',
'Delete' => 'Padam',
'You have no privileges to update this table.' => 'Anda tidak mempunyai keistimewaan untuk mengemaskini jadual ini.',
// data type descriptions
'Numbers' => 'Nombor',
'Date and time' => 'Tarikh dan masa',
'Strings' => 'String',
'Binary' => 'Binari',
'Lists' => 'Senarai',
'Network' => 'Rangkaian',
'Geometry' => 'Geometri',
'Relations' => 'Hubungan',
'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'sekarang',
'yes' => 'ya',
'no' => 'tidak',
// general SQLite error in create, drop or rename database
'File exists.' => 'Fail wujud.',
'Please use one of the extensions %s.' => 'Sila guna salah satu sambungan %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ubah skema',
'Create schema' => 'Buat skema',
'Schema has been dropped.' => 'Skema telah dijatuhkan.',
'Schema has been created.' => 'Skema telah dibuat.',
'Schema has been altered.' => 'Skema telah diubah.',
'Schema' => 'Skema',
'Invalid schema.' => 'Skema tidak sah.',
// PostgreSQL sequences support
'Sequences' => 'Turutan',
'Create sequence' => 'Buat turutan',
'Sequence has been dropped.' => 'Turutan telah dijatuhkan.',
'Sequence has been created.' => 'Turutan telah dibuat.',
'Sequence has been altered.' => 'Turutan telah diubah.',
'Alter sequence' => 'Ubah turutan',
// PostgreSQL user types support
'User types' => 'Jenis pengguna',
'Create type' => 'Buat jenis',
'Type has been dropped.' => 'Jenis telah dijatuhkan.',
'Type has been created.' => 'Jenis telah dibuat.',
'Alter type' => 'Ubah jenis',
);
// run `php ../../lang.php ms` to update this file

View File

@@ -1,14 +1,15 @@
<?php
$translations = array(
'Login' => 'Inloggen',
'Logout successful.' => 'Uitloggen geslaagd.',
'Invalid credentials.' => 'Ongeldige logingegevens.',
namespace Adminer;
Lang::$translations = array(
'Login' => 'Aanmelden',
'Logout successful.' => 'Successvol afgemeld.',
'Invalid credentials.' => 'Ongeldige gebruikersgegevens.',
'Server' => 'Server',
'Username' => 'Gebruikersnaam',
'Password' => 'Wachtwoord',
'Select database' => 'Database selecteren',
'Invalid database.' => 'Ongeldige database.',
'Create new database' => 'Nieuwe database',
'Table has been dropped.' => 'Tabel verwijderd.',
'Table has been altered.' => 'Tabel aangepast.',
'Table has been created.' => 'Tabel aangemaakt.',
@@ -32,8 +33,7 @@ $translations = array(
'Alter database' => 'Database aanpassen',
'Create database' => 'Database aanmaken',
'SQL command' => 'SQL opdracht',
'Logout' => 'Uitloggen',
'database' => 'database',
'Logout' => 'Afmelden',
'Use' => 'Gebruik',
'No tables.' => 'Geen tabellen.',
'select' => 'kies',
@@ -42,7 +42,7 @@ $translations = array(
'Item%s has been inserted.' => 'Item%s toegevoegd.',
'Edit' => 'Bewerk',
'Insert' => 'Toevoegen',
'Save and insert next' => 'Opslaan, daarna toevoegen',
'Save and insert next' => 'Opslaan en volgende toevoegen',
'Delete' => 'Verwijderen',
'Database' => 'Database',
'Routines' => 'Procedures',
@@ -61,7 +61,7 @@ $translations = array(
'Action' => 'Acties',
'edit' => 'bewerk',
'Page' => 'Pagina',
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen geraakt.'),
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij aangepast.', 'Query uitgevoerd, %d rijen aangepast.'),
'Error in query' => 'Fout in query',
'Execute' => 'Uitvoeren',
'Table' => 'Tabel',
@@ -82,7 +82,7 @@ $translations = array(
'No extension' => 'Geen extensie',
'None of the supported PHP extensions (%s) are available.' => 'Geen geldige PHP extensies beschikbaar (%s).',
'Session support must be enabled.' => 'Sessies moeten geactiveerd zijn.',
'Session expired, please login again.' => 'Uw sessie is verlopen. Gelieve opnieuw in te loggen.',
'Session expired, please login again.' => 'Uw sessie is verlopen. Gelieve opnieuw aan te melden.',
'Text length' => 'Tekst lengte',
'Foreign key has been dropped.' => 'Foreign key verwijderd.',
'Foreign key has been altered.' => 'Foreign key aangepast.',
@@ -98,7 +98,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Index type',
'Column (length)' => 'Kolom (lengte)',
'length' => 'lengte',
'View has been dropped.' => 'View verwijderd.',
'View has been altered.' => 'View aangepast.',
'View has been created.' => 'View aangemaakt.',
@@ -188,7 +188,7 @@ $translations = array(
'Move to other database' => 'Verplaats naar andere database',
'Move' => 'Verplaats',
'%d item(s) have been affected.' => array('%d item aangepast.', '%d items aangepast.'),
'whole result' => 'volledig resultaat',
'Whole result' => 'Volledig resultaat',
'Clone' => 'Dupliceer',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maximum aantal velden bereikt. Verhoog %s.',
'Partition by' => 'Partitioneren op',
@@ -215,11 +215,6 @@ $translations = array(
'Binary' => 'Binaire gegevens',
'Lists' => 'Lijsten',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'From' => 'Van',
'Subject' => 'Onderwerp',
'Send' => 'Verzenden',
'%d e-mail(s) have been sent.' => array('%d e-mail verzonden.', '%d e-mails verzonden.'),
'Webserver file %s' => 'Webserver bestand %s',
'File does not exist.' => 'Bestand niet gevonden.',
'%d in total' => '%d in totaal',
@@ -243,7 +238,7 @@ $translations = array(
'Type has been dropped.' => 'Type verwijderd.',
'Type has been created.' => 'Type aangemaakt.',
'Ctrl+click on a value to modify it.' => 'Ctrl+klik op een waarde om deze te bewerken.',
'Use edit link to modify this value.' => 'Gebruik de link "bewerk" om deze waarde te wijzigen.',
'Use edit link to modify this value.' => 'Gebruik de link \'bewerk\' om deze waarde te wijzigen.',
'last' => 'laatste',
'From server' => 'Van server',
'System' => 'Databasesysteem',
@@ -253,8 +248,7 @@ $translations = array(
'Network' => 'Netwerk',
'Geometry' => 'Geometrie',
'File exists.' => 'Bestand bestaat reeds.',
'Attachments' => 'Bijlagen',
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd'),
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd.'),
'Show only errors' => 'Enkel fouten tonen',
'Refresh' => 'Vernieuwen',
'Invalid schema.' => 'Ongeldig schema.',
@@ -266,4 +260,41 @@ $translations = array(
'Permanent link' => 'Permanente link',
'Edit all' => 'Alles bewerken',
'HH:MM:SS' => 'HH:MM:SS',
'Drop %s?' => 'Verwijder %s?',
'Tables have been optimized.' => 'Tabellen zijn geoptimaliseerd.',
'Materialized view' => 'Materialized view',
'Vacuum' => 'Vacuum',
'Selected' => 'Geselecteerd',
'overwrite' => 'overschrijven',
'DB' => 'DB',
'File must be in UTF-8 encoding.' => 'Het bestand moet met UTF-8 encodering zijn opgeslagen.',
'Modify' => 'Aanpassen',
'Load more data' => 'Meer data inladen',
'Loading' => 'Aan het laden',
'ATTACH queries are not supported.' => 'ATTACH queries worden niet ondersteund.',
'Warnings' => 'Waarschuwingen',
'%d / ' => '%d / ',
'Limit rows' => 'Rijen beperken',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer ondersteunt geen toegang tot databases zonder wachtwoord, <a href="https://www.adminer.org/en/password/"%s>meer informatie</a>.',
'Default value' => 'Standaardwaarde',
'Full table scan' => 'Full table scan',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Teveel foutieve aanmeldpogingen, probeer opnieuw binnen %d minuut.', 'Teveel foutieve aanmeldpogingen, probeer opnieuw binnen %d minuten.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master wachtwoord verlopen. <a href="https://www.adminer.org/en/extension/"%s>Implementeer</a> de %s methode om het permanent te maken.',
'The action will be performed after successful login with the same credentials.' => 'Deze actie zal uitgevoerd worden na het succesvol aanmelden met dezelfde gebruikersgegevens.',
'Connecting to privileged ports is not allowed.' => 'Verbindingen naar geprivilegieerde poorten is niet toegestaan.',
'There is a space in the input password which might be the cause.' => 'Er staat een spatie in het wachtwoord, wat misschien de oorzaak is.',
'If you did not send this request from Adminer then close this page.' => 'Als u deze actie niet via Adminer hebt gedaan, gelieve deze pagina dan te sluiten.',
'You can upload a big SQL file via FTP and import it from server.' => 'U kan een groot SQL-bestand uploaden via FTP en het importeren via de server.',
'Size' => 'Grootte',
'Compute' => 'Bereken',
'You are offline.' => 'U bent offline.',
'You have no privileges to update this table.' => 'U bent niet gemachtigd om deze tabel aan te passen.',
'Saving' => 'Opslaan',
'Unknown error.' => 'Onbekende fout.',
'Database does not support password.' => 'Database ondersteunt het wachtwoord niet.',
'Disable %s or enable %s or %s extensions.' => 'Schakel %s uit or schakel extensies %s of %s in.',
'yes' => 'ja',
'no' => 'neen',
);
// run `php ../../lang.php nl` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'System' => 'System',
'Server' => 'Server',
'Username' => 'Brukernavn',
@@ -10,7 +12,7 @@ $translations = array(
'Logged as: %s' => 'Logget inn som: %s',
'Logout successful.' => 'Utlogging vellykket.',
'Invalid credentials.' => 'Ugylding innloggingsinformasjon.',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Master-passord er utløpt. <a href="http://www.adminer.org/en/extension/" target="_blank">Implementer</a> en metode for %s for å gjøre det permanent.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-passord er utløpt. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for å gjøre det permanent.',
'Language' => 'Språk',
'Invalid CSRF token. Send the form again.' => 'Ugylding CSRF-token - Send inn skjemaet igjen.',
'No extension' => 'Ingen utvidelse',
@@ -64,11 +66,9 @@ $translations = array(
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Database',
'database' => 'database',
'Use' => 'Bruk',
'Select database' => 'Velg database',
'Invalid database.' => 'Ugyldig database.',
'Create new database' => 'Lag ny database',
'Database has been dropped.' => 'Databasen har blitt slettet.',
'Databases have been dropped.' => 'Databasene har blitt slettet.',
'Database has been created.' => 'Databasen er opprettet.',
@@ -166,7 +166,7 @@ $translations = array(
'Alter indexes' => 'Endre indekser',
'Add next' => 'Legg til neste',
'Index Type' => 'Indekstype',
'Column (length)' => 'Kolonne (lengde)',
'length' => 'lengde',
'Foreign keys' => 'Fremmednøkler',
'Foreign key' => 'Fremmednøkkel',
'Foreign key has been dropped.' => 'Fremmednøkkelen er slettet.',
@@ -213,7 +213,7 @@ $translations = array(
'last' => 'siste',
'Load more data' => 'Last mer data',
'Loading' => 'Laster',
'whole result' => 'hele resultatet',
'Whole result' => 'Hele resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importer',
'%d row(s) have been imported.' => array('%d rad er importert.', '%d rader er importert.'),
@@ -238,12 +238,6 @@ $translations = array(
'Clone' => 'Klon',
'Delete' => 'Slett',
'You have no privileges to update this table.' => 'Du mangler rettighetene som trengs for å endre denne tabellen.',
'E-mail' => 'E-post',
'From' => 'Fra',
'Subject' => 'Tittel',
'Attachments' => 'Vedlegg',
'Send' => 'Send',
'%d e-mail(s) have been sent.' => array('%d epost sendt.', '%d eposter sendt.'),
'Numbers' => 'Nummer',
'Date and time' => 'Dato og tid',
'Strings' => 'Strenger',
@@ -281,3 +275,5 @@ $translations = array(
'Alter type' => 'Endre type',
'Saving' => 'Lagrer',
);
// run `php ../../lang.php no` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Rodzaj bazy',
'Server' => 'Serwer',
@@ -7,19 +9,26 @@ $translations = array(
'Password' => 'Hasło',
'Permanent login' => 'Zapamiętaj sesję',
'Login' => 'Zaloguj się',
'Logout' => 'Wyloguj',
'Logout' => 'Wyloguj się',
'Logged as: %s' => 'Zalogowany jako: %s',
'Logout successful.' => 'Wylogowano pomyślnie.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ <a href="https://www.adminer.org/pl/donation/">dotację</a>.',
'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
'There is a space in the input password which might be the cause.' => 'W haśle wejściowym znajduje się spacja, która może być przyczyną.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nie obsługuje dostępu do bazy danych bez hasła, <a href="https://www.adminer.org/pl/password/"%s>więcej informacji</a>.',
'Database does not support password.' => 'Baza danych nie obsługuje hasła.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="http://www.adminer.org/pl/extension/" target="_blank">Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
'Language' => 'Język',
'Invalid CSRF token. Send the form again.' => 'Nieprawidłowy token CSRF. Spróbuj wysłać formularz ponownie.',
'If you did not send this request from Adminer then close this page.' => 'Jeżeli nie wywołałeś tej strony z Adminera, zamknij to okno.',
'No extension' => 'Brak rozszerzenia',
'None of the supported PHP extensions (%s) are available.' => 'Żadne z rozszerzeń PHP umożliwiających połączenie się z bazą danych (%s) nie jest dostępne.',
'Connecting to privileged ports is not allowed.' => 'Łączenie do portów uprzywilejowanych jest niedozwolone.',
'Disable %s or enable %s or %s extensions.' => 'Wyłącz %s lub włącz rozszerzenia %s lub %s.',
'Session support must be enabled.' => 'Wymagana jest obsługa sesji w PHP.',
'Session expired, please login again.' => 'Sesja wygasła, zaloguj się ponownie.',
'The action will be performed after successful login with the same credentials.' => 'Czynność zostanie wykonana po pomyślnym zalogowaniu przy użyciu tych samych danych logowania.',
'%s version: %s through PHP extension %s' => 'Wersja %s: %s za pomocą %s',
'Refresh' => 'Odśwież',
@@ -33,6 +42,7 @@ $translations = array(
'User has been created.' => 'Użytkownik został dodany.',
'Hashed' => 'Zahashowane',
'Column' => 'Kolumna',
'Columns' => 'Kolumny',
'Routine' => 'Procedura',
'Grant' => 'Uprawnienia',
'Revoke' => 'Usuń uprawnienia',
@@ -40,15 +50,18 @@ $translations = array(
'Process list' => 'Lista procesów',
'%d process(es) have been killed.' => array('Przerwano %d wątek.', 'Przerwano %d wątki.', 'Przerwano %d wątków.'),
'Kill' => 'Przerwij wykonywanie',
'Variables' => 'Zmienne',
'Status' => 'Status',
'SQL command' => 'Zapytanie SQL',
'%d query(s) executed OK.' => array('Pomyślnie wykonano %d zapytanie.', 'Pomyślnie wykonano %d zapytania.', 'Pomyślnie wykonano %d zapytań.'),
'Query executed OK, %d row(s) affected.' => array('Zapytanie wykonane pomyślnie, zmieniono %d rekord.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordy.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordów.'),
'No commands to execute.' => 'Nic do wykonania.',
'Error in query' => 'Błąd w zapytaniu',
'Unknown error.' => 'Nieznany błąd.',
'Warnings' => 'Ostrzeżenia',
'ATTACH queries are not supported.' => 'Zapytania ATTACH są niewspierane.',
'Execute' => 'Wykonaj',
'Stop on error' => 'Zatrzymaj w przypadku błędu',
'Show only errors' => 'Pokaż tylko błędy',
@@ -57,32 +70,33 @@ $translations = array(
'History' => 'Historia',
'Clear' => 'Wyczyść',
'Edit all' => 'Edytuj wszystkie',
'File upload' => 'Wgranie pliku',
'From server' => 'Z serwera',
'Webserver file %s' => 'Plik %s na serwerze',
'Run file' => 'Uruchom z pliku',
'File does not exist.' => 'Plik nie istnieje.',
'Increase %s.' => 'Zwiększ %s.',
'File uploads are disabled.' => 'Wgrywanie plików jest wyłączone.',
'Unable to upload a file.' => 'Wgranie pliku było niemożliwe.',
'Maximum allowed file size is %sB.' => 'Maksymalna wielkość pliku to %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Przesłano zbyt dużo danych. Zmniejsz objętość danych lub zwiększ zmienną konfiguracyjną %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Większe pliki SQL możesz wgrać na serwer poprzez FTP przed zaimportowaniem.',
'You are offline.' => 'Jesteś offline.',
'Export' => 'Eksport',
'Export' => 'Eksportuj',
'Output' => 'Rezultat',
'open' => 'otwórz',
'save' => 'zapisz',
'Saving' => 'Zapisywanie',
'Format' => 'Format',
'Data' => 'Dane',
'Database' => 'Baza danych',
'database' => 'baza danych',
'DB' => 'BD',
'Use' => 'Wybierz',
'Select database' => 'Wybierz bazę danych',
'Invalid database.' => 'Nie znaleziono bazy danych.',
'Create new database' => 'Utwórz nową bazę danych',
'Database has been dropped.' => 'Baza danych została usunięta.',
'Databases have been dropped.' => 'Bazy danych zostały usunięte.',
'Database has been created.' => 'Baza danych została utworzona.',
@@ -91,10 +105,10 @@ $translations = array(
'Alter database' => 'Zmień bazę danych',
'Create database' => 'Utwórz bazę danych',
'Database schema' => 'Schemat bazy danych',
// link to current database schema layout
'Permanent link' => 'Trwały link',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
@@ -117,7 +131,8 @@ $translations = array(
'Tables have been moved.' => 'Tabele zostały przeniesione.',
'Copy' => 'Kopiuj',
'Tables have been copied.' => 'Tabele zostały skopiowane.',
'overwrite' => 'nadpisz',
'Routines' => 'Procedury i funkcje',
'Routine has been called, %d row(s) affected.' => array('Procedura została uruchomiona, zmieniono %d rekord.', 'Procedura została uruchomiona, zmieniono %d rekordy.', 'Procedura została uruchomiona, zmieniono %d rekordów.'),
'Call' => 'Uruchom',
@@ -130,7 +145,7 @@ $translations = array(
'Alter function' => 'Zmień funkcję',
'Alter procedure' => 'Zmień procedurę',
'Return type' => 'Zwracany typ',
'Events' => 'Wydarzenia',
'Event has been dropped.' => 'Wydarzenie zostało usunięte.',
'Event has been altered.' => 'Wydarzenie zostało zmienione.',
@@ -143,7 +158,7 @@ $translations = array(
'Start' => 'Początek',
'End' => 'Koniec',
'On completion preserve' => 'Nie kasuj wydarzenia po przeterminowaniu',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele i perspektywy',
'Table' => 'Tabela',
@@ -162,41 +177,45 @@ $translations = array(
'Column name' => 'Nazwa kolumny',
'Type' => 'Typ',
'Length' => 'Długość',
'Auto Increment' => 'Auto Increment',
'Auto Increment' => 'Automatyczny przyrost',
'Options' => 'Opcje',
'Comment' => 'Komentarz',
'Default value' => 'Wartość domyślna',
'Default values' => 'Wartości domyślne',
'Drop' => 'Usuń',
'Are you sure?' => 'Czy jesteś pewien?',
'Size' => 'Wielkość',
'Drop %s?' => 'Usunąć %s?',
'Are you sure?' => 'Czy na pewno?',
'Size' => 'Rozmiar',
'Compute' => 'Oblicz',
'Move up' => 'Przesuń w górę',
'Move down' => 'Przesuń w dół',
'Remove' => 'Usuń',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
'Partition by' => 'Partycjonowanie',
'Partitions' => 'Partycje',
'Partition name' => 'Nazwa partycji',
'Values' => 'Wartości',
'Inherits from' => 'Dziedziczy po',
'Inherited by' => 'Odziedziczone przez',
'View' => 'Perspektywa',
'Materialized View' => 'Zmaterializowana perspektywa',
'Materialized view' => 'Zmaterializowana perspektywa',
'View has been dropped.' => 'Perspektywa została usunięta.',
'View has been altered.' => 'Perspektywa została zmieniona.',
'View has been created.' => 'Perspektywa została utworzona.',
'Alter view' => 'Zmień perspektywę',
'Create view' => 'Utwórz perspektywę',
'Create materialized view' => 'Utwórz zmaterializowaną perspektywę',
'Indexes' => 'Indeksy',
'Indexes have been altered.' => 'Indeksy zostały zmienione.',
'Alter indexes' => 'Zmień indeksy',
'Add next' => 'Dodaj następny',
'Index Type' => 'Typ indeksu',
'Column (length)' => 'Kolumna (długość)',
'length' => 'długość',
'Algorithm' => 'Algorytm',
'Condition' => 'Warunek',
'Foreign keys' => 'Klucze obce',
'Foreign key' => 'Klucz obcy',
'Foreign key has been dropped.' => 'Klucz obcy został usunięty.',
@@ -212,7 +231,7 @@ $translations = array(
'ON DELETE' => 'W przypadku usunięcia',
'ON UPDATE' => 'W przypadku zmiany',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Źródłowa i docelowa kolumna muszą być tego samego typu, powinien istnieć indeks na docelowej kolumnie oraz muszą istnieć dane referencyjne.',
'Triggers' => 'Wyzwalacze',
'Add trigger' => 'Dodaj wyzwalacz',
'Trigger has been dropped.' => 'Wyzwalacz został usunięty.',
@@ -223,7 +242,7 @@ $translations = array(
'Time' => 'Czas',
'Event' => 'Wydarzenie',
'Name' => 'Nazwa',
'select' => 'przeglądaj',
'Select' => 'pokaż',
'Select data' => 'Pokaż dane',
@@ -235,28 +254,30 @@ $translations = array(
'Sort' => 'Sortuj',
'descending' => 'malejąco',
'Limit' => 'Limit',
'Limit rows' => 'Limit rekordów',
'Text length' => 'Długość tekstu',
'Action' => 'Czynność',
'Full table scan' => 'Wymaga pełnego przeskanowania tabeli',
'Unable to select the table' => 'Nie udało się pobrać danych z tabeli',
'No rows.' => 'Brak rekordów.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rekord', '%d rekordy', '%d rekordów'),
'Page' => 'Strona',
'last' => 'ostatni',
'Load more data' => 'Wczytaj więcej danych',
'Loading' => 'Wczytywanie',
'whole result' => 'wybierz wszystkie',
'Whole result' => 'Wybierz wszystkie',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtów'),
'Import' => 'Import',
'Import' => 'Importuj',
'%d row(s) have been imported.' => array('%d rekord został zaimportowany.', '%d rekordy zostały zaimportowane.', '%d rekordów zostało zaimportowanych.'),
'File must be in UTF-8 encoding.' => 'Kodowanie pliku musi być ustawione na UTF-8.',
// in-place editing in select
'Modify' => 'Zmień',
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknij wartość, aby ją edytować.',
'Use edit link to modify this value.' => 'Użyj linku edycji aby zmienić tę wartość.',
'Use edit link to modify this value.' => 'Użyj linku edycji, aby zmienić tę wartość.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Rekord%s został dodany.',
'Item has been deleted.' => 'Rekord został usunięty.',
@@ -270,21 +291,13 @@ $translations = array(
'Edit' => 'Edytuj',
'Insert' => 'Dodaj',
'Save' => 'Zapisz zmiany',
'Saving' => 'Zapisywanie',
'Save and continue edit' => 'Zapisz i kontynuuj edycję',
'Save and insert next' => 'Zapisz i dodaj następny',
'Selected' => 'Zaznaczone',
'Clone' => 'Duplikuj',
'Delete' => 'Usuń',
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
'E-mail' => 'E-mail',
'From' => 'Nadawca',
'Subject' => 'Temat',
'Attachments' => 'Załączniki',
'Send' => 'Wyślij',
'%d e-mail(s) have been sent.' => array('Wysłano %d e-mail.', 'Wysłano %d e-maile.', 'Wysłano %d e-maili.'),
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli.',
// data type descriptions
'Numbers' => 'Numeryczne',
'Date and time' => 'Data i czas',
@@ -294,7 +307,7 @@ $translations = array(
'Network' => 'Sieć',
'Geometry' => 'Geometria',
'Relations' => 'Relacje',
'Editor' => 'Edytor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
@@ -305,11 +318,11 @@ $translations = array(
'now' => 'teraz',
'yes' => 'tak',
'no' => 'nie',
// general SQLite error in create, drop or rename database
'File exists.' => 'Plik już istnieje.',
'Please use one of the extensions %s.' => 'Proszę użyć jednego z rozszerzeń: %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Zmień schemat',
'Create schema' => 'Utwórz schemat',
@@ -318,7 +331,7 @@ $translations = array(
'Schema has been altered.' => 'Schemat został zmieniony.',
'Schema' => 'Schemat',
'Invalid schema.' => 'Nieprawidłowy schemat.',
// PostgreSQL sequences support
'Sequences' => 'Sekwencje',
'Create sequence' => 'Utwórz sekwencję',
@@ -326,11 +339,26 @@ $translations = array(
'Sequence has been created.' => 'Sekwencja została utworzona.',
'Sequence has been altered.' => 'Sekwencja została zmieniona.',
'Alter sequence' => 'Zmień sekwencję',
// PostgreSQL user types support
'User types' => 'Typy użytkownika',
'Create type' => 'Utwórz typ',
'Type has been dropped.' => 'Typ został usunięty.',
'Type has been created.' => 'Typ został utworzony.',
'Alter type' => 'Zmień typ',
// Table check constraints
'Checks' => 'Kontrole',
'Create check' => 'Utwórz kontrolę',
'Alter check' => 'Zmień kontrolę',
'Check has been created.' => 'Kontrola została utworzona.',
'Check has been altered.' => 'Kontrola została zmieniona.',
'Check has been dropped.' => 'Kontrola została usunięta.',
'Loaded plugins' => 'Wczytane wtyczki',
'%s must <a%s>return an array</a>.' => '%s musi <a%s>zwrócić tablicę</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Skonfiguruj</a> %s w %s.',
'screenshot' => 'zrzut ekranu',
);
// run `php ../../lang.php pl` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Saída bem sucedida.',
'Invalid credentials.' => 'Identificação inválida.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Senha',
'Select database' => 'Selecionar Base de dados',
'Invalid database.' => 'Base de dados inválida.',
'Create new database' => 'Criar nova base de dados',
'Table has been dropped.' => 'A Tabela foi eliminada.',
'Table has been altered.' => 'A Tabela foi alterada.',
'Table has been created.' => 'A Tabela foi criada.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Logout' => 'Sair',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'select' => 'selecionar',
@@ -48,7 +48,7 @@ $translations = array(
'Indexes have been altered.' => 'Os Índices foram alterados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Alterar índices',
'Add next' => 'Adicionar proximo',
'Add next' => 'Adicionar próximo',
'Language' => 'Idioma',
'Select' => 'Selecionar',
'New item' => 'Novo Registro',
@@ -67,19 +67,19 @@ $translations = array(
'Foreign keys' => 'Chaves estrangeiras',
'Triggers' => 'Triggers',
'View' => 'Visão',
'Unable to select the table' => 'Não é possivel selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
'Unable to select the table' => 'Não é possível selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulário novamente.',
'Comment' => 'Comentário',
'Default values' => 'Valores padrões',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Nenhum comando para executar.',
'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
'File upload' => 'Importar arquivo',
'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
'File uploads are disabled.' => 'Importação de arquivos desabilitada.',
'Routine has been called, %d row(s) affected.' => array('Rotina executada, %d registro afetado.', 'Rotina executada, %d registros afetados.'),
'Call' => 'Chamar',
'No extension' => 'Não há extension',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponível.',
'Session support must be enabled.' => 'Suporte a sessões deve estar habilitado.',
'Session expired, please login again.' => 'Sessão expirada, por favor logue-se novamente.',
'Text length' => 'Tamanho de texto',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Coluna (tamanho)',
'length' => 'tamanho',
'View has been dropped.' => 'A Visão foi apagada.',
'View has been altered.' => 'A Visão foi alterada.',
'View has been created.' => 'A Visão foi criada.',
@@ -170,7 +170,7 @@ $translations = array(
'Index Length' => 'Tamanho de índice',
'Data Free' => 'Espaço Livre',
'Collation' => 'Colação',
'Analyze' => 'Analizar',
'Analyze' => 'Analisar',
'Optimize' => 'Otimizar',
'Check' => 'Verificar',
'Repair' => 'Reparar',
@@ -187,7 +187,7 @@ $translations = array(
'original' => 'original',
'Tables have been dropped.' => 'As Tabelas foram eliminadas.',
'%d item(s) have been affected.' => array('%d item foi afetado.', '%d itens foram afetados.'),
'whole result' => 'resultado completo',
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
@@ -210,15 +210,10 @@ $translations = array(
'Maximum allowed file size is %sB.' => 'Tamanho máximo do arquivo permitido é %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadena',
'Strings' => 'Strings',
'Binary' => 'Binário',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'From' => 'De',
'Subject' => 'Assunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email foi enviado.', '%d emails foram enviados.'),
'Webserver file %s' => 'Arquivo do servidor web %s',
'File does not exist.' => 'Arquivo não existe.',
'%d in total' => '%d no total',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Rede',
'Geometry' => 'Geometria',
'File exists.' => 'Arquivo já existe.',
'Attachments' => 'Anexos',
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
'Show only errors' => 'Mostrar somente erros',
'Refresh' => 'Atualizar',
@@ -262,3 +256,5 @@ $translations = array(
'now' => 'agora',
'ltr' => 'ltr',
);
// run `php ../../lang.php pt-br` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Sessão terminada com sucesso.',
'Invalid credentials.' => 'Identificação inválida.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Senha',
'Select database' => 'Selecionar Base de dados',
'Invalid database.' => 'Base de dados inválida.',
'Create new database' => 'Criar nova base de dados',
'Table has been dropped.' => 'Tabela eliminada.',
'Table has been altered.' => 'Tabela modificada.',
'Table has been created.' => 'Tabela criada.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Logout' => 'Terminar sessão',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'select' => 'registos',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'coluna (tamanho)',
'length' => 'tamanho',
'View has been dropped.' => 'Vista eliminada.',
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista criada.',
@@ -187,7 +187,7 @@ $translations = array(
'original' => 'original',
'Tables have been dropped.' => 'As tabelas foram eliminadas.',
'%d item(s) have been affected.' => array('%d item afetado.', '%d itens afetados.'),
'whole result' => 'resultado completo',
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
@@ -214,11 +214,6 @@ $translations = array(
'Binary' => 'Binário',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'From' => 'De',
'Subject' => 'Assunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Ficheiro do servidor web %s',
'File does not exist.' => 'Ficheiro não existe.',
'%d in total' => '%d no total',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Rede',
'Geometry' => 'Geometria',
'File exists.' => 'Ficheiro já existe.',
'Attachments' => 'Anexos',
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
'Show only errors' => 'Mostrar somente erros',
'Refresh' => 'Atualizar',
@@ -262,3 +256,5 @@ $translations = array(
'now' => 'agora',
'ltr' => 'ltr',
);
// run `php ../../lang.php pt` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Intră',
'Logout successful.' => 'Ați ieșit cu succes.',
'Invalid credentials.' => 'Numele de utilizator sau parola este greșită.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Parola',
'Select database' => 'Alege baza de date',
'Invalid database.' => 'Bază de deate invalidă.',
'Create new database' => 'Crează o bază de date nouă',
'Table has been dropped.' => 'Tabelul a fost șters.',
'Table has been altered.' => 'Tabelul a fost modificat.',
'Table has been created.' => 'Tabelul a fost creat.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'Crează baza de date',
'SQL command' => 'SQL query',
'Logout' => 'Ieșire',
'database' => 'baza de date',
'Use' => 'Alege',
'No tables.' => 'În baza de date nu sunt tabele.',
'select' => 'selectează',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'La ștergere',
'ON UPDATE' => 'La modificare',
'Index Type' => 'Tipul indexului',
'Column (length)' => 'Coloană (lungimea)',
'length' => 'lungimea',
'View has been dropped.' => 'Reprezentarea a fost ștearsă.',
'View has been altered.' => 'Reprezentarea a fost modificată.',
'View has been created.' => 'Reprezentarea a fost creată.',
@@ -186,7 +186,7 @@ $translations = array(
'Save and continue edit' => 'Salvează și continuă editarea',
'original' => 'original',
'%d item(s) have been affected.' => array('A fost modificată %d înscriere.', 'Au fost modificate %d înscrieri.'),
'whole result' => 'tot rezultatul',
'Whole result' => 'Tot rezultatul',
'Tables have been dropped.' => 'Tabelele au fost șterse.',
'Clone' => 'Clonează',
'Partition by' => 'Împarte',
@@ -214,11 +214,6 @@ $translations = array(
'Binary' => 'Tip binar',
'Lists' => 'Liste',
'Editor' => 'Editor',
'E-mail' => 'Poșta electronică',
'From' => 'De la',
'Subject' => 'Pentru',
'Send' => 'Trimite',
'%d e-mail(s) have been sent.' => array('A fost trimis %d mail.', 'Au fost trimise %d mail-uri.'),
'Webserver file %s' => 'Fișierul %s pe server',
'File does not exist.' => 'Acest fișier nu există.',
'%d in total' => 'În total %d',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Rețea',
'Geometry' => 'Geometrie',
'File exists.' => 'Fișierul există deja.',
'Attachments' => 'Fișiere atașate',
'%d query(s) executed OK.' => array('%d query executat.', '%d query-uri executate cu succes.'),
'Show only errors' => 'Arată doar greșeli',
'Refresh' => 'Împrospătează',
@@ -261,9 +255,11 @@ $translations = array(
'Please use one of the extensions %s.' => 'Folosiți una din următoarele extensii %s.',
'now' => 'acum',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabelele au fost copiate',
'Tables have been copied.' => 'Tabelele au fost copiate.',
'Copy' => 'Copiază',
'Permanent link' => 'Adresă permanentă',
'Edit all' => 'Editează tot',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php ro` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Войти',
'Logout successful.' => 'Вы успешно покинули систему.',
'Invalid credentials.' => 'Неправильное имя пользователя или пароль.',
@@ -7,15 +9,14 @@ $translations = array(
'Username' => 'Имя пользователя',
'Password' => 'Пароль',
'Select database' => 'Выбрать базу данных',
'Invalid database.' => 'Плохая база данных.',
'Create new database' => 'Создать новую базу данных',
'Invalid database.' => 'Неверная база данных.',
'Table has been dropped.' => 'Таблица была удалена.',
'Table has been altered.' => 'Таблица была изменена.',
'Table has been created.' => 'Таблица была создана.',
'Alter table' => 'Изменить таблицу',
'Create table' => 'Создать таблицу',
'Table name' => 'Название таблицы',
'engine' => 'тип',
'engine' => 'Тип таблицы',
'collation' => 'режим сопоставления',
'Column name' => 'Название поля',
'Type' => 'Тип',
@@ -30,9 +31,8 @@ $translations = array(
'Database has been altered.' => 'База данных была изменена.',
'Alter database' => 'Изменить базу данных',
'Create database' => 'Создать базу данных',
'SQL command' => 'SQL запрос',
'SQL command' => 'SQL-запрос',
'Logout' => 'Выйти',
'database' => 'база данных',
'Use' => 'Выбрать',
'No tables.' => 'В базе данных нет таблиц.',
'select' => 'выбрать',
@@ -68,7 +68,7 @@ $translations = array(
'Triggers' => 'Триггеры',
'View' => 'Представление',
'Unable to select the table' => 'Не удалось получить данные из таблицы',
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF токен. Отправите форму ещё раз.',
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF-токен. Отправите форму ещё раз.',
'Comment' => 'Комментарий',
'Default values' => 'Значения по умолчанию',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
@@ -91,13 +91,13 @@ $translations = array(
'Change' => 'Изменить',
'Source' => 'Источник',
'Target' => 'Цель',
'Add column' => 'Добавить колонку',
'Add column' => 'Добавить поле',
'Alter' => 'Изменить',
'Add foreign key' => 'Добавить внешний ключ',
'ON DELETE' => 'При стирании',
'ON UPDATE' => 'При обновлении',
'Index Type' => 'Тип индекса',
'Column (length)' => 'Колонка (длина)',
'length' => 'длина',
'View has been dropped.' => 'Представление было удалено.',
'View has been altered.' => 'Представление было изменено.',
'View has been created.' => 'Представление было создано.',
@@ -135,11 +135,11 @@ $translations = array(
'User has been altered.' => 'Пользователь был изменён.',
'User has been created.' => 'Пользователь был создан.',
'Hashed' => 'Хешировано',
'Column' => 'Колонка',
'Column' => 'поле',
'Routine' => 'Процедура',
'Grant' => 'Позволить',
'Revoke' => 'Запретить',
'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.',
'Logged as: %s' => 'Вы вошли как: %s',
'Move up' => 'Переместить вверх',
'Move down' => 'Переместить вниз',
@@ -182,11 +182,11 @@ $translations = array(
'Tables have been moved.' => 'Таблицы были перемещены.',
'Move to other database' => 'Переместить в другую базу данных',
'Move' => 'Переместить',
'Engine' => 'Тип',
'Engine' => 'Тип таблиц',
'Save and continue edit' => 'Сохранить и продолжить редактирование',
'original' => 'исходный',
'%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
'whole result' => 'весь результат',
'Whole result' => 'Весь результат',
'Tables have been dropped.' => 'Таблицы были удалены.',
'Clone' => 'Клонировать',
'Partition by' => 'Разделить по',
@@ -203,22 +203,17 @@ $translations = array(
'[yyyy]-mm-dd' => 'дд.мм.[гггг]',
'History' => 'История',
'Variables' => 'Переменные',
'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' => 'Реляции',
'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' => 'Запустить файл',
'Clear' => 'Очистить',
'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла - %sB.',
'Numbers' => 'Число',
'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла %sB.',
'Numbers' => 'Числа',
'Date and time' => 'Дата и время',
'Strings' => 'Строки',
'Binary' => 'Двоичный тип',
'Lists' => 'Списки',
'Editor' => 'Редактор',
'E-mail' => 'Электропочта',
'From' => 'От',
'Subject' => 'Кому',
'Send' => 'Послать',
'%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
'Webserver file %s' => 'Файл %s на вебсервере',
'File does not exist.' => 'Такого файла не существует.',
'%d in total' => 'Всего %d',
@@ -242,7 +237,7 @@ $translations = array(
'Alter type' => 'Изменить тип',
'Type has been dropped.' => 'Тип удален.',
'Type has been created.' => 'Создан новый тип.',
'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
'Ctrl+click on a value to modify it.' => 'Выполните Ctrl+Щелчок мышью по значению, чтобы его изменить.',
'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
'last' => 'последняя',
'From server' => 'С сервера',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Сеть',
'Geometry' => 'Геометрия',
'File exists.' => 'Файл уже существует.',
'Attachments' => 'Прикреплённые файлы',
'%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%d запросов выполнено успешно.'),
'Show only errors' => 'Только ошибки',
'Refresh' => 'Обновить',
@@ -266,4 +260,51 @@ $translations = array(
'Permanent link' => 'Постоянная ссылка',
'Edit all' => 'Редактировать всё',
'HH:MM:SS' => 'ЧЧ:ММ:СС',
'Tables have been optimized.' => 'Таблицы оптимизированы.',
'Materialized view' => 'Материализованное представление',
'Vacuum' => 'Вакуум',
'Selected' => 'Выбранные',
'File must be in UTF-8 encoding.' => 'Файл должен быть в кодировке UTF-8.',
'Modify' => 'Изменить',
'Loading' => 'Загрузка',
'Load more data' => 'Загрузить ещё данные',
'ATTACH queries are not supported.' => 'ATTACH-запросы не поддерживаются.',
'%d / ' => '%d / ',
'Limit rows' => 'Лимит строк',
'Default value' => 'Значение по умолчанию',
'Full table scan' => 'Анализ полной таблицы',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Слишком много неудачных попыток входа. Попробуйте снова через %d минуту.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минуты.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минут.'),
'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, чтобы сделать его постоянным.',
'If you did not send this request from Adminer then close this page.' => 'Если вы не посылали этот запрос из Adminer, закройте эту страницу.',
'You can upload a big SQL file via FTP and import it from server.' => 'Вы можете закачать большой SQL-файл по FTP и затем импортировать его с сервера.',
'Size' => 'Размер',
'Compute' => 'Вычислить',
'You are offline.' => 'Вы не выполнили вход.',
'You have no privileges to update this table.' => 'У вас нет прав на обновление этой таблицы.',
'Saving' => 'Сохранение',
'yes' => 'Да',
'no' => 'Нет',
'Drop %s?' => 'Удалить %s?',
'overwrite' => 'перезаписать',
'DB' => 'DB',
'Warnings' => 'Предупреждения',
'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>.',
'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>.',
'The action will be performed after successful login with the same credentials.' => 'Действие будет выполнено после успешного входа в систему с теми же учетными данными.',
'Connecting to privileged ports is not allowed.' => 'Подключение к привилегированным портам не допускается.',
'There is a space in the input password which might be the cause.' => 'В введеном пароле есть пробел, это может быть причиною.',
'Unknown error.' => 'Неизвестная ошибка.',
'Database does not support password.' => 'База данных не поддерживает пароль.',
'Disable %s or enable %s or %s extensions.' => 'Отключите %s или включите расширения %s или %s.',
'Check has been dropped.' => 'Проверка удалена.',
'Check has been altered.' => 'Проверка изменена.',
'Check has been created.' => 'Проверка создана.',
'Alter check' => 'Изменить проверку',
'Create check' => 'Создать проверку',
'Checks' => 'Проверки',
'Loaded plugins' => 'Загруженные плагины',
'%s must <a%s>return an array</a>.' => '%s должна <a%s>вернуть массив</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Настроить</a> %s в %s.',
);
// run `php ../../lang.php ru` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'Prihlásiť sa',
'Logout successful.' => 'Odhlásenie prebehlo v poriadku.',
'Invalid credentials.' => 'Neplatné prihlasovacie údaje.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'Heslo',
'Select database' => 'Vybrať databázu',
'Invalid database.' => 'Nesprávna databáza.',
'Create new database' => 'Vytvoriť novú databázu',
'Table has been dropped.' => 'Tabuľka bola odstránená.',
'Table has been altered.' => 'Tabuľka bola zmenená.',
'Table has been created.' => 'Tabuľka bola vytvorená.',
@@ -33,7 +34,6 @@ $translations = array(
'Create database' => 'Vytvoriť databázu',
'SQL command' => 'SQL príkaz',
'Logout' => 'Odhlásiť',
'database' => 'databáza',
'Use' => 'Vybrať',
'No tables.' => 'Žiadne tabuľky.',
'select' => 'vypísať',
@@ -71,7 +71,7 @@ $translations = array(
'Unable to select the table' => 'Tabuľku sa nepodarilo vypísať',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odošlite formulár znova.',
'Comment' => 'Komentár',
'Default values' => 'Východzie hodnoty',
'Default values' => 'Predvolené hodnoty',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtov'),
'No commands to execute.' => 'Žiadne príkazy na vykonanie.',
'Unable to upload a file.' => 'Súbor sa nepodarilo nahrať.',
@@ -95,10 +95,10 @@ $translations = array(
'Add column' => 'Pridať stĺpec',
'Alter' => 'Zmeniť',
'Add foreign key' => 'Pridať cudzí kľúč',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'ON DELETE' => 'Pri zmazaní',
'ON UPDATE' => 'Pri aktualizácii',
'Index Type' => 'Typ indexu',
'Column (length)' => 'Stĺpec (dĺžka)',
'length' => 'dĺžka',
'View has been dropped.' => 'Pohľad bol odstránený.',
'View has been altered.' => 'Pohľad bol zmenený.',
'View has been created.' => 'Pohľad bol vytvorený.',
@@ -188,7 +188,7 @@ $translations = array(
'Move to other database' => 'Presunúť do inej databázy',
'Move' => 'Presunúť',
'%d item(s) have been affected.' => '%d položiek bolo ovplyvnených.',
'whole result' => 'celý výsledok',
'Whole result' => 'Celý výsledok',
'Clone' => 'Klonovať',
'Partition by' => 'Rozdeliť podľa',
'Partitions' => 'Oddiely',
@@ -205,11 +205,6 @@ $translations = array(
'History' => 'História',
'Variables' => 'Premenné',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cieľové stĺpce musia mať rovnaký datový typ, nad cieľovými stĺpcami musí byť definovaný index a odkazované dáta musia existovať.',
'E-mail' => 'E-mail',
'From' => 'Odosielateľ',
'Subject' => 'Predmet',
'Send' => 'Odoslať',
'%d e-mail(s) have been sent.' => array('Bol odoslaný %d e-mail.', 'Boli odoslané %d e-maily.', 'Bolo odoslaných %d e-mailov.'),
'Run file' => 'Spustiť súbor',
'Numbers' => 'Čísla',
'Date and time' => 'Dátum a čas',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'Sieť',
'Geometry' => 'Geometria',
'File exists.' => 'Súbor existuje.',
'Attachments' => 'Prílohy',
'%d query(s) executed OK.' => array('Bol vykonaný %d dotaz.', 'Boli vykonané %d dotazy.', 'Bolo vykonaných %d dotazov.'),
'Show only errors' => 'Zobraziť iba chyby',
'Refresh' => 'Obnoviť',
@@ -266,4 +260,48 @@ $translations = array(
'Permanent link' => 'Permanentný odkaz',
'Edit all' => 'Upraviť všetko',
'HH:MM:SS' => 'HH:MM:SS',
'Drop %s?' => 'Odstrániť %s?',
'Tables have been optimized.' => 'Tabuľky boli optimalizované.',
'Materialized view' => 'Materializovaný pohľad',
'Vacuum' => 'Vyčistiť',
'Selected' => 'Označené',
'overwrite' => 'prepísať',
'DB' => 'DB',
'File must be in UTF-8 encoding.' => 'Súbor musí byť v kódovaní UTF-8.',
'Modify' => 'Zmeniť',
'Load more data' => 'Načítať ďalšie dáta',
'Loading' => 'Načítava sa',
'ATTACH queries are not supported.' => 'Dotazy ATTACH nie sú podporované.',
'Warnings' => 'Varovania',
'%d / ' => '%d / ',
'Limit rows' => 'Limit riadkov',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje prístup k databáze bez hesla, <a href="https://www.adminer.org/sk/password/"%s>viac informácií</a>.',
'Default value' => 'Predvolená hodnota',
'Full table scan' => 'Prechod celej tabuľky',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Príliš veľa pokusov o prihlásenie, skúste to znova za %d minutu.', 'Príliš veľa pokusov o prihlásenie, skúste to znova za %d minuty.', 'Príliš veľa pokusov o prihlásenie, skúste to znova za %d minút.'),
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Vďaka za používanie Admineru, <a href="https://www.adminer.org/sk/donation/">prispejte</a> na vývoj.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Platnosť hlavného hesla vypršala. <a href="https://www.adminer.org/cs/extension/"%s>Implementujte</a> metodu %s, aby platilo natrvalo.',
'The action will be performed after successful login with the same credentials.' => 'Akcia sa vykoná po úspešnom prihlásení s rovnakými prihlasovacími údajmi.',
'Connecting to privileged ports is not allowed.' => 'Pripojenie k privilegovaným portom nie je povolené.',
'There is a space in the input password which might be the cause.' => 'V zadanom hesle je medzera, ktorá môže byť príčinou.',
'If you did not send this request from Adminer then close this page.' => 'Pokiaľ ste tento požiadavok neodoslali z Adminera, zatvorte túto stránku.',
'You can upload a big SQL file via FTP and import it from server.' => 'Veľký SQL soubor môžete nahrať pomocou FTP a importovať ho zo servera.',
'Size' => 'Veľkosť',
'Compute' => 'Spočítať',
'You are offline.' => 'Ste offline.',
'You have no privileges to update this table.' => 'Nemáte oprávnenie na aktualizáciu tejto tabuľky.',
'Saving' => 'Ukladá sa',
'Unknown error.' => 'Neznáma chyba.',
'Database does not support password.' => 'Databáza nepodporuje heslo.',
'Disable %s or enable %s or %s extensions.' => 'Zakážte %s alebo povoľte rozšírenie %s alebo %s.',
'yes' => 'áno',
'no' => 'nie',
'Checks' => 'Kontroly',
'Create check' => 'Vytvoriť kontrolu',
'Alter check' => 'Zmeniť kontrolu',
'Check has been created.' => 'Kontrola bola vytvorená.',
'Check has been altered.' => 'Kontrola bola zmenená.',
'Check has been dropped.' => 'Kontrola bola odstránená.',
);
// run `php ../../lang.php sk` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Strežnik',
@@ -19,10 +21,10 @@ $translations = array(
'Session expired, please login again.' => 'Seja je potekla. Prosimo, ponovno se prijavite.',
'%s version: %s through PHP extension %s' => 'Verzija %s: %s preko dodatka za PHP %s',
'Refresh' => 'Osveži',
// text direction
'ltr' => 'ltr',
'Privileges' => 'Pravice',
'Create user' => 'Ustvari uporabnika',
'User has been dropped.' => 'Uporabnik je odstranjen.',
@@ -33,14 +35,14 @@ $translations = array(
'Routine' => 'Postopek',
'Grant' => 'Dovoli',
'Revoke' => 'Odvzemi',
'Process list' => 'Seznam procesov',
'%d process(es) have been killed.' => array('Končan je %d proces.', 'Končana sta %d procesa.', 'Končani so %d procesi.', 'Končanih je %d procesov.'),
'Kill' => 'Končaj',
'Variables' => 'Spremenljivke',
'Status' => 'Stanje',
'SQL command' => 'Ukaz SQL',
'%d query(s) executed OK.' => array('Uspešno se je končala %d poizvedba.', 'Uspešno sta se končali %d poizvedbi.', 'Uspešno so se končale %d poizvedbe.', 'Uspešno se je končalo %d poizvedb.'),
'Query executed OK, %d row(s) affected.' => array('Poizvedba se je uspešno izvedla, spremenjena je %d vrstica.', 'Poizvedba se je uspešno izvedla, spremenjeni sta %d vrstici.', 'Poizvedba se je uspešno izvedla, spremenjene so %d vrstice.', 'Poizvedba se je uspešno izvedla, spremenjenih je %d vrstic.'),
@@ -53,7 +55,7 @@ $translations = array(
'%.3f s' => '%.3f s',
'History' => 'Zgodovina',
'Clear' => 'Počisti',
'File upload' => 'Naloži datoteko',
'From server' => 'z strežnika',
'Webserver file %s' => 'Datoteka na spletnem strežniku %s',
@@ -63,20 +65,18 @@ $translations = array(
'Unable to upload a file.' => 'Ne morem naložiti datoteke.',
'Maximum allowed file size is %sB.' => 'Največja velikost datoteke je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliko podatkov za POST. Zmanjšajte število podatkov ali povečajte nastavitev za %s.',
'Export' => 'Izvozi',
'Output' => 'Izhod rezultata',
'open' => 'odpri',
'save' => 'shrani',
'Format' => 'Format',
'Data' => 'Podatki',
'Database' => 'Baza',
'database' => 'baza',
'Use' => 'Uporabi',
'Select database' => 'Izberi bazo',
'Invalid database.' => 'Neveljavna baza.',
'Create new database' => 'Ustvari novo bazo',
'Database has been dropped.' => 'Baza je zavržena.',
'Databases have been dropped.' => 'Baze so zavržene.',
'Database has been created.' => 'Baza je ustvarjena.',
@@ -85,7 +85,7 @@ $translations = array(
'Alter database' => 'Spremeni bazo',
'Create database' => 'Ustvari bazo',
'Database schema' => 'Shema baze',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
@@ -107,7 +107,7 @@ $translations = array(
'Tables have been moved.' => 'Tabele so premaknjene.',
'Copy' => 'Kopiraj',
'Tables have been copied.' => 'Tabele so kopirane.',
'Routines' => 'Postopki',
'Routine has been called, %d row(s) affected.' => array('Klican je bil postopek, spremenjena je %d vrstica.', 'Klican je bil postopek, spremenjeni sta %d vrstici.', 'Klican je bil postopek, spremenjene so %d vrstice.', 'Klican je bil postopek, spremenjenih je %d vrstic.'),
'Call' => 'Pokliči',
@@ -120,7 +120,7 @@ $translations = array(
'Alter function' => 'Spremeni funkcijo',
'Alter procedure' => 'Spremeni postopek',
'Return type' => 'Vračalni tip',
'Events' => 'Dogodki',
'Event has been dropped.' => 'Dogodek je zavržen.',
'Event has been altered.' => 'Dogodek je spremenjen.',
@@ -133,7 +133,7 @@ $translations = array(
'Start' => 'Začetek',
'End' => 'Konec',
'On completion preserve' => 'Po zaključku ohrani',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele in pogledi',
'Table' => 'Tabela',
@@ -161,26 +161,26 @@ $translations = array(
'Move down' => 'Premakni dol',
'Remove' => 'Odstrani',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s.',
'Partition by' => 'Porazdeli po',
'Partitions' => 'Porazdelitve',
'Partition name' => 'Ime porazdelitve',
'Values' => 'Vrednosti',
'View' => 'Pogledi',
'View has been dropped.' => 'Pogled je zavržen.',
'View has been altered.' => 'Pogled je spremenjen.',
'View has been created.' => 'Pogled je ustvarjen.',
'Alter view' => 'Spremeni pogled',
'Create view' => 'Ustvari pogled',
'Indexes' => 'Indeksi',
'Indexes have been altered.' => 'Indeksi so spremenjeni.',
'Alter indexes' => 'Spremeni indekse',
'Add next' => 'Dodaj naslednjega',
'Index Type' => 'Tip indeksa',
'Column (length)' => 'Stolpec (dolžina)',
'length' => 'dolžina',
'Foreign keys' => 'Tuji ključi',
'Foreign key' => 'Tuj ključ',
'Foreign key has been dropped.' => 'Tuj ključ je zavržen.',
@@ -196,7 +196,7 @@ $translations = array(
'ON DELETE' => 'pri brisanju',
'ON UPDATE' => 'pri posodabljanju',
'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 in ciljni stolpec mora imeti isti podatkovni tip. Obstajati mora indeks na ciljnih stolpcih in obstajati morajo referenčni podatki.',
'Triggers' => 'Sprožilniki',
'Add trigger' => 'Dodaj sprožilnik',
'Trigger has been dropped.' => 'Sprožilnik je odstranjen.',
@@ -207,7 +207,7 @@ $translations = array(
'Time' => 'Čas',
'Event' => 'Dogodek',
'Name' => 'Naziv',
'select' => 'izberi',
'Select' => 'Izberi',
'Select data' => 'Izberi podatke',
@@ -226,16 +226,16 @@ $translations = array(
'%d row(s)' => array('%d vrstica', '%d vrstici', '%d vrstice', '%d vrstic'),
'Page' => 'Stran',
'last' => 'Zadnja',
'whole result' => 'cel razultat',
'Whole result' => 'Cel razultat',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
'Import' => 'Uvozi',
'%d row(s) have been imported.' => array('Uvožena je %d vrstica.', 'Uvoženi sta %d vrstici.', 'Uvožene so %d vrstice.', 'Uvoženih je %d vrstic.'),
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrednost za urejanje.',
'Use edit link to modify this value.' => 'Uporabite urejanje povezave za spreminjanje te vrednosti.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Predmet%s je vstavljen.',
'Item has been deleted.' => 'Predmet je izbrisan.',
@@ -253,14 +253,7 @@ $translations = array(
'Save and insert next' => 'Shrani in vstavi tekst',
'Clone' => 'Kloniraj',
'Delete' => 'Izbriši',
'E-mail' => 'E-mail',
'From' => 'Od',
'Subject' => 'Zadeva',
'Attachments' => 'Priponke',
'Send' => 'Pošlji',
'%d e-mail(s) have been sent.' => array('Poslan je %d e-mail.', 'Poslana sta %d e-maila.', 'Poslani so %d e-maili.', 'Poslanih je %d e-mailov.'),
// data type descriptions
'Numbers' => 'Števila',
'Date and time' => 'Datum in čas',
@@ -270,18 +263,18 @@ $translations = array(
'Network' => 'Mrežni',
'Geometry' => 'Geometrčni',
'Relations' => 'Relacijski',
'Editor' => 'Urejevalnik',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
'now' => 'zdaj',
// general SQLite error in create, drop or rename database
'File exists.' => 'Datoteka obstaja.',
'Please use one of the extensions %s.' => 'Prosim, uporabite enega od dodatkov %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Spremeni shemo',
'Create schema' => 'Ustvari shemo',
@@ -290,7 +283,7 @@ $translations = array(
'Schema has been altered.' => 'Shema je spremenjena.',
'Schema' => 'Shema',
'Invalid schema.' => 'Neveljavna shema.',
// PostgreSQL sequences support
'Sequences' => 'Sekvence',
'Create sequence' => 'Ustvari sekvenco',
@@ -298,7 +291,7 @@ $translations = array(
'Sequence has been created.' => 'Sekvence je ustvarjena.',
'Sequence has been altered.' => 'Sekvence je spremenjena.',
'Alter sequence' => 'Spremni sekvenco',
// PostgreSQL user types support
'User types' => 'Uporabniški tipi',
'Create type' => 'Ustvari tip',
@@ -306,3 +299,5 @@ $translations = array(
'Type has been created.' => 'Tip je ustvarjen.',
'Alter type' => 'Spremeni tip',
);
// run `php ../../lang.php sl` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Систем',
'Server' => 'Сервер',
@@ -14,7 +16,7 @@ $translations = array(
'Language' => 'Језик',
'Invalid CSRF token. Send the form again.' => 'Неважећи CSRF код. Проследите поново форму.',
'No extension' => 'Без додатака',
'None of the supported PHP extensions (%s) are available.' => 'Ниједан од подржаних PHP додатака није доступан.',
'None of the supported PHP extensions (%s) are available.' => 'Ниједан од подржаних PHP додатака (%s) није доступан.',
'Session support must be enabled.' => 'Морате омогућити подршку за сесије.',
'Session expired, please login again.' => 'Ваша сесија је истекла, пријавите се поново.',
'%s version: %s through PHP extension %s' => '%s верзија: %s помоћу PHP додатка је %s',
@@ -73,11 +75,9 @@ $translations = array(
'Data' => 'Податци',
'Database' => 'База података',
'database' => 'база података',
'Use' => 'Користи',
'Select database' => 'Изаберите базу',
'Invalid database.' => 'Неисправна база података.',
'Create new database' => 'Направи нову базу података',
'Database has been dropped.' => 'База података је избрисана.',
'Databases have been dropped.' => 'Базњ података су избрисане.',
'Database has been created.' => 'База података је креирана.',
@@ -184,7 +184,7 @@ $translations = array(
'Alter indexes' => 'Уреди индексе',
'Add next' => 'Додај следећи',
'Index Type' => 'Тип индекса',
'Column (length)' => 'Колона (дужина)',
'length' => 'дужина',
'Foreign keys' => 'Страни кључеви',
'Foreign key' => 'Страни кључ',
@@ -232,9 +232,9 @@ $translations = array(
'%d row(s)' => array('%d ред', '%d реда', '%d редова'),
'Page' => 'Страна',
'last' => 'последња',
'Loading' => 'Учитавам',
'Load more data' => 'Учитавам још података',
'whole result' => 'цео резултат',
'Loading' => 'Учитавам',
'Load more data' => 'Учитавам још података',
'Whole result' => 'Цео резултат',
'%d byte(s)' => array('%d бајт', '%d бајта', '%d бајтова'),
'Import' => 'Увоз',
@@ -262,13 +262,6 @@ $translations = array(
'Clone' => 'Дуплирај',
'Delete' => 'Избриши',
'E-mail' => 'Ел. пошта',
'From' => 'Од',
'Subject' => 'Наслов',
'Attachments' => 'Прилози',
'Send' => 'Пошаљи',
'%d e-mail(s) have been sent.' => array('%d порука ел. поште је послата.', '%d поруке ел. поште су послате.', '%d порука ел. поште је послато.'),
// data type descriptions
'Numbers' => 'Број',
'Date and time' => 'Датум и време',
@@ -318,3 +311,5 @@ $translations = array(
'Type has been created.' => 'тип је креиран.',
'Alter type' => 'Уреди тип',
);
// run `php ../../lang.php sr` to update this file

345
adminer/lang/sv.inc.php Normal file
View File

@@ -0,0 +1,345 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'System',
'Server' => 'Server',
'Username' => 'Användarnamn',
'Password' => 'Lösenord',
'Permanent login' => 'Permanent inloggning',
'Login' => 'Logga in',
'Logout' => 'Logga ut',
'Logged as: %s' => 'Inloggad som: %s',
'Logout successful.' => 'Du är nu utloggad.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Tack för att du använder Adminer, vänligen fundera över att <a href="https://www.adminer.org/en/donation/">donera</a>.',
'Invalid credentials.' => 'Ogiltiga inloggningsuppgifter.',
'There is a space in the input password which might be the cause.' => 'Det finns ett mellanslag i lösenordet, vilket kan vara anledningen.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer tillåter inte att ansluta till en databas utan lösenord. <a href="https://www.adminer.org/en/password/"%s>Mer information</a>.',
'Database does not support password.' => 'Databasen stödjer inte lösenord.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('För många misslyckade inloggningar, försök igen om %d minut.', 'För många misslyckade inloggningar, försök igen om %d minuter.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Huvudlösenordet har löpt ut. <a href="https://www.adminer.org/en/extension/"%s>Implementera</a> %s en metod för att göra det permanent.',
'Language' => 'Språk',
'Invalid CSRF token. Send the form again.' => 'Ogiltig CSRF-token. Skicka formuläret igen.',
'If you did not send this request from Adminer then close this page.' => 'Om du inte skickade en förfrågan från Adminer så kan du stänga den här sidan.',
'No extension' => 'Inget tillägg',
'None of the supported PHP extensions (%s) are available.' => 'Inga av de PHP-tilläggen som stöds (%s) är tillgängliga.',
'Connecting to privileged ports is not allowed.' => 'Anslutning till privilegierade portar är inte tillåtet.',
'Disable %s or enable %s or %s extensions.' => 'Stäng av %s eller sätt på %s eller %s tilläggen.',
'Session support must be enabled.' => 'Support för sessioner måste vara på.',
'Session expired, please login again.' => 'Session har löpt ut, vänligen logga in igen.',
'The action will be performed after successful login with the same credentials.' => 'Åtgärden kommer att utföras efter en lyckad inloggning med samma inloggningsuppgifter.',
'%s version: %s through PHP extension %s' => '%s version: %s genom PHP-tillägg %s',
'Refresh' => 'Ladda om',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilegier',
'Create user' => 'Skapa användare',
'User has been dropped.' => 'Användare har blivit borttagen.',
'User has been altered.' => 'Användare har blivit ändrad.',
'User has been created.' => 'Användare har blivit skapad.',
'Hashed' => 'Hashad',
'Column' => 'Kolumn',
'Routine' => 'Rutin',
'Grant' => 'Tillåt',
'Revoke' => 'Neka',
'Process list' => 'Processlista',
'%d process(es) have been killed.' => array('%d process har avslutats.', '%d processer har avslutats.'),
'Kill' => 'Avsluta',
'Variables' => 'Variabler',
'Status' => 'Status',
'SQL command' => 'SQL-kommando',
'%d query(s) executed OK.' => array('%d förfrågan lyckades.', '%d förfrågor lyckades.'),
'Query executed OK, %d row(s) affected.' => array('Förfrågan lyckades, %d rad påverkades.', 'Förfrågan lyckades, %d rader påverkades.'),
'No commands to execute.' => 'Inga kommandon att köra.',
'Error in query' => 'Fel i förfrågan',
'Unknown error.' => 'Okänt fel.',
'Warnings' => 'Varningar',
'ATTACH queries are not supported.' => 'ATTACH-förfrågor stöds inte.',
'Execute' => 'Kör',
'Stop on error' => 'Stanna på fel',
'Show only errors' => 'Visa bara fel',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historia',
'Clear' => 'Rensa',
'Edit all' => 'Redigera alla',
'File upload' => 'Ladda upp fil',
'From server' => 'Från server',
'Webserver file %s' => 'Serverfil %s',
'Run file' => 'Kör fil',
'File does not exist.' => 'Filen finns inte.',
'File uploads are disabled.' => 'Filuppladdningar är avstängda.',
'Unable to upload a file.' => 'Det går inte add ladda upp filen.',
'Maximum allowed file size is %sB.' => 'Högsta tillåtna storlek är %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-datan är för stor. Minska det eller höj %s-direktivet.',
'You can upload a big SQL file via FTP and import it from server.' => 'Du kan ladda upp en stor SQL-fil via FTP och importera det från servern.',
'You are offline.' => 'Du är offline.',
'Export' => 'Exportera',
'Output' => 'Utmatning',
'open' => 'Öppna',
'save' => 'Spara',
'Saving' => 'Sparar',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Databas',
'DB' => 'DB',
'Use' => 'Använd',
'Select database' => 'Välj databas',
'Invalid database.' => 'Ogiltig databas.',
'Database has been dropped.' => 'Databasen har tagits bort.',
'Databases have been dropped.' => 'Databaserna har tagits bort.',
'Database has been created.' => 'Databasen har skapats.',
'Database has been renamed.' => 'Databasen har fått sitt namn ändrat.',
'Database has been altered.' => 'Databasen har ändrats.',
'Alter database' => 'Ändra databas',
'Create database' => 'Skapa databas',
'Database schema' => 'Databasschema',
// link to current database schema layout
'Permanent link' => 'Permanent länk',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Kollationering',
'Data Length' => 'Datalängd',
'Index Length' => 'Indexlängd',
'Data Free' => 'Ledig data',
'Rows' => 'Rader',
'%d in total' => 'totalt %d',
'Analyze' => 'Analysera',
'Optimize' => 'Optimera',
'Vacuum' => 'Städa',
'Check' => 'Kolla',
'Repair' => 'Reparera',
'Truncate' => 'Avkorta',
'Tables have been truncated.' => 'Tabeller har blivit avkortade.',
'Move to other database' => 'Flytta till en annan databas',
'Move' => 'Flytta',
'Tables have been moved.' => 'Tabeller har flyttats.',
'Copy' => 'Kopiera',
'Tables have been copied.' => 'Tabeller har kopierats.',
'overwrite' => 'Skriv över',
'Routines' => 'Rutiner',
'Routine has been called, %d row(s) affected.' => array('Rutin har kallats, %d rad påverkades.', 'Rutin har kallats, %d rader påverkades.'),
'Call' => 'Kalla',
'Parameter name' => 'Namn på parameter',
'Create procedure' => 'Skapa procedur',
'Create function' => 'Skapa funktion',
'Routine has been dropped.' => 'Rutin har tagits bort.',
'Routine has been altered.' => 'Rutin har ändrats.',
'Routine has been created.' => 'Rutin har skapats.',
'Alter function' => 'Ändra funktion',
'Alter procedure' => 'Ändra procedur',
'Return type' => 'Återvändningstyp',
'Events' => 'Event',
'Event has been dropped.' => 'Event har tagits bort.',
'Event has been altered.' => 'Event har ändrats.',
'Event has been created.' => 'Event har skapats.',
'Alter event' => 'Ändra event',
'Create event' => 'Skapa event',
'At given time' => 'Vid en tid',
'Every' => 'Varje',
'Schedule' => 'Schemalägga',
'Start' => 'Start',
'End' => 'Slut',
'On completion preserve' => 'Bibehåll vid slutet',
'Tables' => 'Tabeller',
'Tables and views' => 'Tabeller och vyer',
'Table' => 'Tabell',
'No tables.' => 'Inga tabeller.',
'Alter table' => 'Ändra tabell',
'Create table' => 'Skapa tabell',
'Table has been dropped.' => 'Tabell har tagits bort.',
'Tables have been dropped.' => 'Tabeller har tagits bort.',
'Tables have been optimized.' => 'Tabeller har optimerats.',
'Table has been altered.' => 'Tabell har ändrats.',
'Table has been created.' => 'Tabell har skapats.',
'Table name' => 'Tabellnamn',
'Show structure' => 'Visa struktur',
'engine' => 'motor',
'collation' => 'kollationering',
'Column name' => 'Kolumnnamn',
'Type' => 'Typ',
'Length' => 'Längd',
'Auto Increment' => 'Automatisk uppräkning',
'Options' => 'Inställningar',
'Comment' => 'Kommentar',
'Default value' => 'Standardvärde',
'Default values' => 'Standardvärden',
'Drop' => 'Ta bort',
'Drop %s?' => 'Ta bort %s?',
'Are you sure?' => 'Är du säker?',
'Size' => 'Storlek',
'Compute' => 'Beräkna',
'Move up' => 'Flytta upp',
'Move down' => 'Flytta ner',
'Remove' => 'Ta bort',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Högsta nummer tillåtna fält är överskridet. Vänligen höj %s.',
'Partition by' => 'Partitionera om',
'Partitions' => 'Partitioner',
'Partition name' => 'Partition',
'Values' => 'Värden',
'View' => 'Vy',
'Materialized view' => 'Materialiserad vy',
'View has been dropped.' => 'Vy har tagits bort.',
'View has been altered.' => 'Vy har ändrats.',
'View has been created.' => 'Vy har skapats.',
'Alter view' => 'Ändra vy',
'Create view' => 'Skapa vy',
'Indexes' => 'Index',
'Indexes have been altered.' => 'Index har ändrats.',
'Alter indexes' => 'Ändra index',
'Add next' => 'Lägg till nästa',
'Index Type' => 'Indextyp',
'length' => 'längd',
'Foreign keys' => 'Främmande nycklar',
'Foreign key' => 'Främmande nyckel',
'Foreign key has been dropped.' => 'Främmande nyckel har tagits bort.',
'Foreign key has been altered.' => 'Främmande nyckel har ändrats.',
'Foreign key has been created.' => 'Främmande nyckel har skapats.',
'Target table' => 'Måltabell',
'Change' => 'Ändra',
'Source' => 'Källa',
'Target' => 'Mål',
'Add column' => 'Lägg till kolumn',
'Alter' => 'Ändra',
'Add foreign key' => 'Lägg till främmande nyckel',
'ON DELETE' => 'VID BORTTAGNING',
'ON UPDATE' => 'VID UPPDATERING',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Käll- och mål-tabellen måste ha samma datatyp, ett index på målkolumnerna och refererad data måste finnas.',
'Triggers' => 'Avtryckare',
'Add trigger' => 'Lägg till avtryckare',
'Trigger has been dropped.' => 'Avtryckare har tagits bort.',
'Trigger has been altered.' => 'Avtryckare har ändrats.',
'Trigger has been created.' => 'Avtryckare har skapats.',
'Alter trigger' => 'Ändra avtryckare',
'Create trigger' => 'Skapa avtryckare',
'Time' => 'Tid',
'Event' => 'Event',
'Name' => 'Namn',
'select' => 'välj',
'Select' => 'Välj',
'Select data' => 'Välj data',
'Functions' => 'Funktioner',
'Aggregation' => 'Aggregation',
'Search' => 'Sök',
'anywhere' => 'överallt',
'Search data in tables' => 'Sök data i tabeller',
'Sort' => 'Sortera',
'descending' => 'Fallande',
'Limit' => 'Begränsning',
'Limit rows' => 'Begränsa rader',
'Text length' => 'Textlängd',
'Action' => 'Åtgärd',
'Full table scan' => 'Full tabellskanning',
'Unable to select the table' => 'Kunde inte välja tabellen',
'No rows.' => 'Inga rader.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rad', '%d rader'),
'Page' => 'Sida',
'last' => 'sist',
'Load more data' => 'Ladda mer data',
'Loading' => 'Laddar',
'Whole result' => 'Hela resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importera',
'%d row(s) have been imported.' => array('%d rad har importerats.', '%d rader har importerats.'),
'File must be in UTF-8 encoding.' => 'Filer måste vara i UTF-8-format.',
// in-place editing in select
'Modify' => 'Ändra',
'Ctrl+click on a value to modify it.' => 'Ctrl+klicka på ett värde för att ändra det.',
'Use edit link to modify this value.' => 'Använd redigeringslänken för att ändra värdet.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Sak%s har skapats.',
'Item has been deleted.' => 'En sak har tagits bort.',
'Item has been updated.' => 'En sak har ändrats.',
'%d item(s) have been affected.' => array('%d sak har blivit förändrad.', '%d saker har blivit förändrade.'),
'New item' => 'Ny sak',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'tom',
'edit' => 'redigera',
'Edit' => 'Redigera',
'Insert' => 'Infoga',
'Save' => 'Spara',
'Save and continue edit' => 'Spara och fortsätt att redigera',
'Save and insert next' => 'Spara och infoga nästa',
'Selected' => 'Vald',
'Clone' => 'Klona',
'Delete' => 'Ta bort',
'You have no privileges to update this table.' => 'Du har inga privilegier för att uppdatera den här tabellen.',
// data type descriptions
'Numbers' => 'Nummer',
'Date and time' => 'Datum och tid',
'Strings' => 'Strängar',
'Binary' => 'Binärt',
'Lists' => 'Listor',
'Network' => 'Nätverk',
'Geometry' => 'Geometri',
'Relations' => 'Relationer',
'Editor' => 'Redigerare',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'yyyy-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nu',
'yes' => 'ja',
'no' => 'nej',
// general SQLite error in create, drop or rename database
'File exists.' => 'Filen finns redan.',
'Please use one of the extensions %s.' => 'Vänligen använd en av filändelserna %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Redigera schema',
'Create schema' => 'Skapa schema',
'Schema has been dropped.' => 'Schema har tagits bort.',
'Schema has been created.' => 'Schema har skapats.',
'Schema has been altered.' => 'Schema har ändrats.',
'Schema' => 'Schema',
'Invalid schema.' => 'Ogiltigt schema.',
// PostgreSQL sequences support
'Sequences' => 'Sekvenser',
'Create sequence' => 'Skapa sekvens',
'Sequence has been dropped.' => 'Sekvens har tagits bort.',
'Sequence has been created.' => 'Sekvens har skapats.',
'Sequence has been altered.' => 'Sekvens har ändrats.',
'Alter sequence' => 'Ändra sekvens',
// PostgreSQL user types support
'User types' => 'Användartyper',
'Create type' => 'Skapa typ',
'Type has been dropped.' => 'Typ har, typ, tagits bort.',
'Type has been created.' => 'Typ har skapats.',
'Alter type' => 'Ändra typ',
);
// run `php ../../lang.php sv` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'நுழை',
'Logout successful.' => 'வெற்றிக‌ர‌மாய் வெளியேறியாயிற்று.',
'Invalid credentials.' => 'ச‌ரியான‌ விப‌ர‌ங்க‌ள் இல்லை.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'க‌ட‌வுச்சொல்',
'Select database' => 'த‌க‌வ‌ல்த‌ள‌த்தை தேர்வு செய்',
'Invalid database.' => 'த‌க‌வ‌ல்த‌ள‌ம் ச‌ரியானதல்ல‌.',
'Create new database' => 'புதிய‌ த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
'Table has been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
'Table has been altered.' => 'அட்ட‌வணை மாற்ற‌ப்ப‌ட்ட‌து.',
'Table has been created.' => 'அட்ட‌வ‌ணை உருவாக்க‌ப்ப‌ட்ட‌து.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
'SQL command' => 'SQL க‌ட்ட‌ளை',
'Logout' => 'வெளியேறு',
'database' => 'த‌க‌வ‌ல்த‌ள‌ம்',
'Use' => 'உப‌யோகி',
'No tables.' => 'அட்ட‌வ‌ணை இல்லை.',
'select' => 'தேர்வு செய்',
@@ -95,7 +95,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'அக‌வ‌ரிசை வ‌கை (Index Type)',
'Column (length)' => 'நெடுவ‌ரிசை (நீள‌ம்)',
'length' => 'நீள‌ம்',
'View has been dropped.' => 'தோற்ற‌ம் நீக்க‌ப்ப‌ட்ட‌து.',
'View has been altered.' => 'தோற்றம் மாற்றப்ப‌ட்ட‌து.',
'View has been created.' => 'தோற்ற‌ம் உருவாக்க‌ப்ப‌ட்ட‌து.',
@@ -184,7 +184,7 @@ $translations = array(
'original' => 'அச‌ல்',
'Tables have been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
'%d item(s) have been affected.' => array('%d உருப்ப‌டி மாற்ற‌ம‌டைந்தது.', '%d உருப்ப‌டிக‌ள் மாற்ற‌ம‌டைந்த‌ன‌.'),
'whole result' => 'முழுமையான‌ முடிவு',
'Whole result' => 'முழுமையான‌ முடிவு',
'Clone' => 'ந‌க‌லி (Clone)',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'அனும‌திக்க‌ப்ப‌ட்ட‌ அதிக‌ப‌ட்ச‌ கோப்புக‌ளின் எண்ணிக்கை மீற‌ப்ப‌ட்ட‌து. த‌ய‌வு செய்து %s ம‌ற்றும் %s யை அதிக‌ரிக்க‌வும்.',
'Partition by' => 'பிரித்த‌து',
@@ -212,11 +212,6 @@ $translations = array(
'Binary' => 'பைன‌ரி',
'Lists' => 'ப‌ட்டிய‌ல்',
'Editor' => 'தொகுப்பாளர்',
'E-mail' => 'மின்ன‌ஞ்ச‌ல்',
'From' => 'அனுப்புனர்',
'Subject' => 'பொருள்',
'Send' => 'அனுப்பு',
'%d e-mail(s) have been sent.' => array('%d மின்ன‌ஞ்ச‌ல் அனுப்ப‌ப‌ட்ட‌து.', '%d மின்ன‌ஞ்ச‌ல்க‌ள் அனுப்ப‌ப்ப‌ட்ட‌ன‌.'),
'Webserver file %s' => 'வெப் ச‌ர்வ‌ர் கோப்பு %s',
'File does not exist.' => 'கோப்பு இல்லை.',
'%d in total' => 'மொத்தம் %d ',
@@ -229,7 +224,7 @@ $translations = array(
'Create sequence' => 'வ‌ரிசைமுறையை உருவாக்கு',
'User types' => 'ப‌ய‌னாள‌ர் வ‌கைக‌ள்',
'Create type' => 'வ‌கையை உருவாக்கு',
'Item%s has been inserted.' => 'உருப்ப‌டி (Item) சேர்க்க‌ப்ப‌ட்ட‌து.',
'Item%s has been inserted.' => 'உருப்ப‌டி (Item%s) சேர்க்க‌ப்ப‌ட்ட‌து.',
'Schema has been dropped.' => 'அமைப்புமுறை நீக்க‌ப்ப‌ட்ட‌து.',
'Schema has been created.' => 'அமைப்புமுறை உருவாக்க‌ப்ப‌ட்ட‌து.',
'Schema has been altered.' => 'அமைப்புமுறை மாற்ற‌ப்ப‌ட்ட‌து.',
@@ -252,7 +247,6 @@ $translations = array(
'Network' => 'நெட்வொர்க்',
'Geometry' => 'வ‌டிவ‌விய‌ல் (Geometry)',
'File exists.' => 'கோப்பு உள்ள‌து.',
'Attachments' => 'இணைப்புக‌ள்',
'now' => 'இப்பொழுது',
'%d query(s) executed OK.' => array('%d வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து.', '%d வின‌வ‌ல்க‌ள் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌ன‌.'),
'Show only errors' => 'பிழைக‌ளை ம‌ட்டும் காண்பிக்க‌வும்',
@@ -266,3 +260,5 @@ $translations = array(
'Edit all' => 'அனைத்தையும் தொகு',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php ta` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
'Login' => 'เข้าสู่ระบบ',
'Logout successful.' => 'ออกจากระบบเรียบร้อยแล้ว.',
'Invalid credentials.' => 'ข้อมูลไม่ถูกต้อง.',
@@ -8,7 +10,6 @@ $translations = array(
'Password' => 'รหัสผ่าน',
'Select database' => 'เลือกฐานข้อมูล',
'Invalid database.' => 'ฐานข้อมูลไม่ถูกต้อง.',
'Create new database' => 'สร้างฐานข้อมูลใหม่',
'Table has been dropped.' => 'ลบตารางแล้ว.',
'Table has been altered.' => 'แก้ไขตารางแล้ว.',
'Table has been created.' => 'สร้างตารางใหม่แล้ว.',
@@ -32,7 +33,6 @@ $translations = array(
'Create database' => 'สร้างฐานข้อมูล',
'SQL command' => 'คำสั่ง SQL',
'Logout' => 'ออกจากระบบ',
'database' => 'ฐานข้อมูล',
'Use' => 'ใช้งาน',
'No tables.' => 'ไม่พบตาราง.',
'select' => 'เลือก',
@@ -97,7 +97,7 @@ $translations = array(
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'ชนิดของดัชนี',
'Column (length)' => 'คอลัมน์ (ความยาว)',
'length' => 'ความยาว',
'View has been dropped.' => 'วิวถูกลบแล้ว.',
'View has been altered.' => 'วิวถูกเปลี่ยนแปลงแล้ว.',
'View has been created.' => 'วิวถูกสร้างแล้ว.',
@@ -187,7 +187,7 @@ $translations = array(
'original' => 'ต้นฉบับ',
'Tables have been dropped.' => 'ตารางถูกลบแล้ว.',
'%d item(s) have been affected.' => 'มี %d รายการถูกดำเนินการแล้ว.',
'whole result' => 'รวมผล',
'Whole result' => 'รวมผล',
'Clone' => 'ทำซ้ำ',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'จำนวนสูงสุดของฟิลด์อนุญาตให้เกิน กรุณาเพิ่มอีก %s.',
'Partition by' => 'พาร์ทิชันโดย',
@@ -214,11 +214,6 @@ $translations = array(
'Binary' => 'เลขฐานสอง',
'Lists' => 'รายการ',
'Editor' => 'ผู้แก้ไข',
'E-mail' => 'อีเมล์',
'From' => 'จาก',
'Subject' => 'หัวข้อ',
'Send' => 'ส่ง',
'%d e-mail(s) have been sent.' => 'มี %d อีเมล์ ถูกส่งออกแล้ว.',
'Webserver file %s' => 'Webserver file %s',
'File does not exist.' => 'ไม่มีไฟล์.',
'%d in total' => '%d ของทั้งหมด',
@@ -253,7 +248,6 @@ $translations = array(
'Network' => 'เครื่องข่าย',
'Geometry' => 'เรขาคณิต',
'File exists.' => 'มีไฟล์นี้อยู่แล้ว.',
'Attachments' => 'ไฟล์แนบ',
'%d query(s) executed OK.' => '%d คำสั่งถูกดำเนินการแล้ว.',
'Show only errors' => 'แสดงเฉพาะเออเรอ',
'Refresh' => 'โหลดใหม่',
@@ -267,3 +261,5 @@ $translations = array(
'Edit all' => 'แก้ไขทั้งหมด',
'HH:MM:SS' => 'HH:MM:SS',
);
// run `php ../../lang.php th` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Sunucu',
@@ -9,14 +11,20 @@ $translations = array(
'Login' => 'Giriş',
'Logout' => ıkış',
'Logged as: %s' => '%s olarak giriş yapıldı.',
'Logout successful.' => 'Başarıyla çıkış yapıldı.',
'Invalid credentials.' => 'Geçersiz kimlik.',
'Logout successful.' => 'Oturum başarıyla sonlandı.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="https://www.adminer.org/en/donation/">bağış yapmayı düşünün</a>.',
'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',
'Language' => 'Dil',
'Invalid CSRF token. Send the form again.' => 'Geçersiz (CSRF) jetonu. Formu tekrar yolla.',
'If you did not send this request from Adminer then close this page.' => 'Bu isteği Adminer\'den göndermediyseniz bu sayfayı kapatın.',
'No extension' => 'Uzantı yok',
'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP eklentilerinden (%s) hiçbiri mevcut değil.',
'Connecting to privileged ports is not allowed.' => 'Ayrıcalıklı bağlantı noktalarına bağlanmaya izin verilmiyor.',
'Session support must be enabled.' => 'Oturum desteği etkin olmalıdır.',
'Session expired, please login again.' => 'Oturum süresi doldu, lütfen tekrar giriş yapın.',
'The action will be performed after successful login with the same credentials.' => 'İşlem, aynı kimlik bilgileriyle başarıyla oturum açıldıktan sonra gerçekleştirilecektir.',
'%s version: %s through PHP extension %s' => '%s sürüm: %s, %s PHP eklentisi ile',
'Refresh' => 'Tazele',
@@ -46,9 +54,11 @@ $translations = array(
'Query executed OK, %d row(s) affected.' => array('Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.', 'Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.'),
'No commands to execute.' => 'Çalıştırılacak komut yok.',
'Error in query' => 'Sorguda hata',
'Warnings' => 'Uyarılar',
'ATTACH queries are not supported.' => 'ATTACH sorguları desteklenmiyor.',
'Execute' => 'Çalıştır',
'Stop on error' => 'Hata oluşursa dur',
'Show only errors' => 'Sadece hataları göster.',
'Show only errors' => 'Sadece hataları göster',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Geçmiş',
@@ -64,20 +74,22 @@ $translations = array(
'Unable to upload a file.' => 'Dosya gönderilemiyor.',
'Maximum allowed file size is %sB.' => 'İzin verilen dosya boyutu sınırı %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Çok büyük POST verisi, veriyi azaltın ya da %s ayar yönergesini uygun olarak yapılandırın.',
'You can upload a big SQL file via FTP and import it from server.' => 'FTP yoluyla büyük bir SQL dosyası yükleyebilir ve sunucudan içe aktarabilirsiniz.',
'You are offline.' => 'Çevrimdışısınız.',
'Export' => 'Dışarı Aktar',
'Output' => ıktı',
'open' => 'aç',
'save' => 'kaydet',
'Saving' => 'Saydediliyor',
'Format' => 'Biçim',
'Data' => 'Veri',
'Database' => 'Veri Tabanı',
'database' => 'veri tabanı',
'DB' => 'DB',
'Use' => 'Kullan',
'Select database' => 'Veri tabanı seç',
'Invalid database.' => 'Geçersiz veri tabanı.',
'Create new database' => 'Yeni veri tabanı oluştur',
'Database has been dropped.' => 'Veri tabanı silindi.',
'Databases have been dropped.' => 'Veritabanları silindi.',
'Database has been created.' => 'Veri tabanı oluşturuldu.',
@@ -96,12 +108,13 @@ $translations = array(
'Engine' => 'Motor',
'Collation' => 'Karşılaştırma',
'Data Length' => 'Veri Uzunluğu',
'Index Length' => 'Dizin Uzunluğu',
'Index Length' => 'İndex Uzunluğu',
'Data Free' => 'Boş Veri',
'Rows' => 'Kayıtlar',
'%d in total' => 'toplam %d',
'Analyze' => 'Çözümle',
'Optimize' => 'En uygun hale getir',
'Optimize' => 'Optimize Et',
'Vacuum' => 'Vakumla',
'Check' => 'Denetle',
'Repair' => 'Tamir Et',
'Truncate' => 'Boşalt',
@@ -159,9 +172,13 @@ $translations = array(
'Auto Increment' => 'Otomatik Artır',
'Options' => 'Seçenekler',
'Comment' => 'Yorum',
'Default value' => 'Varsayılan değer',
'Default values' => 'Varsayılan değerler',
'Drop' => 'Sil',
'Drop %s?' => 'Sil %s?',
'Are you sure?' => 'Emin misiniz?',
'Size' => 'Boyut',
'Compute' => 'Hesapla',
'Move up' => 'Yukarı taşı',
'Move down' => 'Aşağı taşı',
'Remove' => 'Sil',
@@ -173,18 +190,19 @@ $translations = array(
'Values' => 'Değerler',
'View' => 'Görünüm',
'Materialized view' => 'Materialized Görünüm',
'View has been dropped.' => 'Görünüm silindi.',
'View has been altered.' => 'Görünüm değiştirildi.',
'View has been created.' => 'Görünüm oluşturuldu.',
'Alter view' => 'Görünümü değiştir',
'Create view' => 'Görünüm oluştur',
'Indexes' => 'Dizinler',
'Indexes have been altered.' => 'Dizinler değiştirildi.',
'Alter indexes' => 'Dizinleri değiştir',
'Indexes' => 'İndeksler',
'Indexes have been altered.' => 'İndeksler değiştirildi.',
'Alter indexes' => 'İndeksleri değiştir',
'Add next' => 'Bundan sonra ekle',
'Index Type' => 'Dizin Türü',
'Column (length)' => 'Kolon (uzunluğu)',
'Index Type' => 'İndex Türü',
'length' => 'uzunluğu',
'Foreign keys' => 'Dış anahtarlar',
'Foreign key' => 'Dış anahtar',
@@ -207,7 +225,7 @@ $translations = array(
'Trigger has been dropped.' => 'Tetik silindi.',
'Trigger has been altered.' => 'Tetik değiştirildi.',
'Trigger has been created.' => 'Tetik oluşturuldu.',
'Alter trigger' => 'Tetiği değiştir.',
'Alter trigger' => 'Tetiği değiştir',
'Create trigger' => 'Tetik oluştur',
'Time' => 'Zaman',
'Event' => 'Olay',
@@ -222,25 +240,29 @@ $translations = array(
'anywhere' => 'hiçbir yerde',
'Search data in tables' => 'Tablolarda veri ara',
'Sort' => 'Sırala',
'descending' => 'azalan',
'Limit' => 'sınır',
'Text length' => 'Yazı uzunluğu',
'Action' => 'Eylem',
'Full table scan' => 'Tam tablo tarama',
'descending' => 'Azalan',
'Limit' => 'Limit',
'Limit rows' => 'Satır Limiti',
'Text length' => 'Metin Boyutu',
'Action' => 'İşlem',
'Full table scan' => 'Tam tablo taraması',
'Unable to select the table' => 'Tablo seçilemedi',
'No rows.' => 'Kayıt yok.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d kayıt', '%d adet kayıt'),
'Page' => 'Sayfa',
'last' => 'son',
'Load more data' => 'Daha fazla veri yükle',
'Loading' => 'Yükleniyor',
'whole result' => 'tüm sonuç',
'Whole result' => 'Tüm sonuç',
'%d byte(s)' => array('%d bayt', '%d bayt'),
'Import' => 'İçeri Aktar',
'%d row(s) have been imported.' => array('%d kayıt içeri aktarıldı.', '%d adet kayıt içeri aktarıldı.'),
'File must be in UTF-8 encoding.' => 'Dosya UTF-8 kodlamasında olmalıdır.',
// in-place editing in select
'Modify' => 'Düzenle',
'Ctrl+click on a value to modify it.' => 'Bir değeri değiştirmek için üzerine Ctrl+tıklayın.',
'Use edit link to modify this value.' => 'Değeri değiştirmek için düzenleme bağlantısını kullanın.',
@@ -259,15 +281,10 @@ $translations = array(
'Save' => 'Kaydet',
'Save and continue edit' => 'Kaydet ve düzenlemeye devam et',
'Save and insert next' => 'Kaydet ve sonrakini ekle',
'Selected' => 'Seçildi',
'Clone' => 'Kopyala',
'Delete' => 'Sil',
'E-mail' => 'E-posta',
'From' => 'Gönderen',
'Subject' => 'Konu',
'Attachments' => 'Ekler',
'Send' => 'Gönder',
'%d e-mail(s) have been sent.' => array('%d e-posta gönderildi.', '%d adet e-posta gönderildi.'),
'You have no privileges to update this table.' => 'Bu tabloyu güncellemek için yetkiniz yok.',
// data type descriptions
'Numbers' => 'Sayılar',
@@ -283,7 +300,7 @@ $translations = array(
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-aa-gg',
'[yyyy]-mm-dd' => 'g.a.[yyyy]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'SS:DD:ss',
'now' => 'şimdi',
@@ -318,3 +335,5 @@ $translations = array(
'Type has been created.' => 'Tür oluşturuldu.',
'Alter type' => 'Türü değiştir',
);
// run `php ../../lang.php tr` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Система Бази Даних',
'Server' => 'Сервер',
@@ -19,10 +21,10 @@ $translations = array(
'Session expired, please login again.' => 'Сесія закінчилась, будь ласка, увійдіть в систему знову.',
'%s version: %s through PHP extension %s' => 'Версія %s: %s з PHP-розширенням %s',
'Refresh' => 'Оновити',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Привілеї',
'Create user' => 'Створити користувача',
'User has been dropped.' => 'Користувача було видалено.',
@@ -33,14 +35,14 @@ $translations = array(
'Routine' => 'Процедура',
'Grant' => 'Дозволити',
'Revoke' => 'Заборонити',
'Process list' => 'Перелік процесів',
'%d process(es) have been killed.' => array('Було завершено %d процес.', 'Було завершено %d процеси.', 'Було завершёно %d процесів.'),
'Kill' => 'Завершити процес',
'Variables' => 'Змінні',
'Status' => 'Статус',
'SQL command' => 'SQL запит',
'%d query(s) executed OK.' => array('%d запит виконано успішно.', '%d запити виконано успішно.', '%d запитів виконано успішно.'),
'Query executed OK, %d row(s) affected.' => array('Запит виконано успішно, змінено %d рядок.', 'Запит виконано успішно, змінено %d рядки.', 'Запит виконано успішно, змінено %d рядків.'),
@@ -54,7 +56,7 @@ $translations = array(
'History' => 'Історія',
'Clear' => 'Очистити',
'Edit all' => 'Редагувати все',
'File upload' => 'Завантажити файл',
'From server' => 'З сервера',
'Webserver file %s' => 'Файл %s на вебсервері',
@@ -64,20 +66,18 @@ $translations = array(
'Unable to upload a file.' => 'Неможливо завантажити файл.',
'Maximum allowed file size is %sB.' => 'Максимально допустимий розмір файлу %sБ.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
'Export' => 'Експорт',
'Output' => 'Вихідні дані',
'open' => 'відкрити',
'save' => 'зберегти',
'Format' => 'Формат',
'Data' => 'Дані',
'Database' => 'База даних',
'database' => 'база даних',
'Use' => 'Обрати',
'Select database' => 'Обрати базу даних',
'Invalid database.' => 'Погана база даних.',
'Create new database' => 'Створити нову базу даних',
'Database has been dropped.' => 'Базу даних було видалено.',
'Databases have been dropped.' => 'Бази даних були видалені.',
'Database has been created.' => 'Базу даних було створено.',
@@ -86,10 +86,10 @@ $translations = array(
'Alter database' => 'Змінити базу даних',
'Create database' => 'Створити базу даних',
'Database schema' => 'Схема бази даних',
// link to current database schema layout
'Permanent link' => 'Постійне посилання',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
@@ -111,7 +111,7 @@ $translations = array(
'Tables have been moved.' => 'Таблиці було перенесено.',
'Copy' => 'копіювати',
'Tables have been copied.' => 'Таблиці було зкопійовано.',
'Routines' => 'Збережені процедури',
'Routine has been called, %d row(s) affected.' => array('Була викликана процедура, %d запис було змінено.', 'Була викликана процедура, %d записи було змінено.', 'Була викликана процедура, %d записів було змінено.'),
'Call' => 'Викликати',
@@ -124,7 +124,7 @@ $translations = array(
'Alter function' => 'Змінити функцію',
'Alter procedure' => 'Змінити процедуру',
'Return type' => 'Тип, що повернеться',
'Events' => 'Події',
'Event has been dropped.' => 'Подію було видалено.',
'Event has been altered.' => 'Подію було змінено.',
@@ -137,7 +137,7 @@ $translations = array(
'Start' => 'Початок',
'End' => 'Кінець',
'On completion preserve' => 'Після завершення зберегти',
'Tables' => 'Таблиці',
'Tables and views' => 'Таблиці і вигляди',
'Table' => 'Таблиця',
@@ -166,26 +166,26 @@ $translations = array(
'Move down' => 'Пересунути вниз',
'Remove' => 'Видалити',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
'Partition by' => 'Розділити по',
'Partitions' => 'Розділи',
'Partition name' => 'Назва розділу',
'Values' => 'Значення',
'View' => 'Вигляд',
'View has been dropped.' => 'Вигляд було видалено.',
'View has been altered.' => 'Вигляд було змінено.',
'View has been created.' => 'Вигляд було створено.',
'Alter view' => 'Змінити вигляд',
'Create view' => 'Створити вигляд',
'Indexes' => 'Індекси',
'Indexes have been altered.' => 'Індексування було змінено.',
'Alter indexes' => 'Змінити індексування',
'Add next' => 'Додати ще',
'Index Type' => 'Тип індексу',
'Column (length)' => 'Стовпець (довжина)',
'length' => 'довжина',
'Foreign keys' => 'Зовнішні ключі',
'Foreign key' => 'Зовнішній ключ',
'Foreign key has been dropped.' => 'Зовнішній ключ було видалено.',
@@ -201,7 +201,7 @@ $translations = array(
'ON DELETE' => 'ПРИ ВИДАЛЕННІ',
'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.' => 'Стовпці повинні мати той самий тип даних, цільові стовпці повинні бути проіндексовані і дані, на які посилаються повинні існувати.',
'Triggers' => 'Тригери',
'Add trigger' => 'Додати тригер',
'Trigger has been dropped.' => 'Тригер було видалено.',
@@ -212,7 +212,7 @@ $translations = array(
'Time' => 'Час',
'Event' => 'Подія',
'Name' => 'Назва',
'select' => 'вибрати',
'Select' => 'Вибрати',
'Select data' => 'Вибрати дані',
@@ -231,16 +231,16 @@ $translations = array(
'%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
'Page' => 'Сторінка',
'last' => 'остання',
'whole result' => 'весь результат',
'Whole result' => 'Весь результат',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
'Import' => 'Імпортувати',
'%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
// in-place editing in select
'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.' => 'Запис було видалено.',
@@ -258,24 +258,17 @@ $translations = array(
'Save and insert next' => 'Зберегти і вставити знову',
'Clone' => 'Клонувати',
'Delete' => 'Видалити',
'E-mail' => 'E-mail',
'From' => 'Від',
'Subject' => 'Заголовок',
'Attachments' => 'Додатки',
'Send' => 'Надіслати',
'%d e-mail(s) have been sent.' => array('Було надіслано %d повідомлення.', 'Було надіслано %d повідомлення.', 'Було надіслано %d повідомлень.'),
// data type descriptions
'Numbers' => 'Числа',
'Date and time' => 'Дата і час',
'Strings' => 'Радки',
'Strings' => 'Рядки',
'Binary' => 'Двійкові',
'Lists' => 'Списки',
'Network' => 'Мережа',
'Geometry' => 'Геометрія',
'Relations' => 'Зв\'язки',
'Editor' => 'Редактор',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5.$3.$1',
@@ -286,11 +279,11 @@ $translations = array(
'now' => 'зараз',
'yes' => 'так',
'no' => 'ні',
// general SQLite error in create, drop or rename database
'File exists.' => 'Файл існує.',
'Please use one of the extensions %s.' => 'Будь ласка, використовуйте одне з розширень %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Змінити схему',
'Create schema' => 'Створити схему',
@@ -299,7 +292,7 @@ $translations = array(
'Schema has been altered.' => 'Схему було змінено.',
'Schema' => 'Схема',
'Invalid schema.' => 'Невірна схема.',
// PostgreSQL sequences support
'Sequences' => 'Послідовності',
'Create sequence' => 'Створити послідовність',
@@ -307,11 +300,55 @@ $translations = array(
'Sequence has been created.' => 'Послідовність було створено.',
'Sequence has been altered.' => 'Послідовність було змінено.',
'Alter sequence' => 'Змінити послідовність',
// PostgreSQL user types support
'User types' => 'Типи користувачів',
'Create type' => 'Створити тип',
'Type has been dropped.' => 'Тип було видалено.',
'Type has been created.' => 'Тип було створено.',
'Alter type' => 'Змінити тип',
'Drop %s?' => 'Вилучити %s?',
'Materialized view' => 'Матеріалізований вигляд',
'Selected' => 'Вибрані',
'overwrite' => 'перезаписати',
'DB' => 'DB',
'File must be in UTF-8 encoding.' => 'Файл повинен бути в кодуванні UTF-8.',
'Modify' => 'Змінити',
'Load more data' => 'Завантажити ще дані',
'Loading' => 'Завантаження',
'ATTACH queries are not supported.' => 'ATTACH-запити не підтримуються.',
'Warnings' => 'Попередження',
'Limit rows' => 'Обмеження рядків',
'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>.',
'Default value' => 'Значення за замовчуванням',
'Full table scan' => 'Повне сканування таблиці',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилину.', 'Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилини.', 'Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилин.'),
'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>.',
'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, щоб зробити його постійним.',
'The action will be performed after successful login with the same credentials.' => 'Дія буде виконуватися після успішного входу в систему з тими ж обліковими даними.',
'Connecting to privileged ports is not allowed.' => 'Підключення до привілейованих портів заборонено.',
'There is a space in the input password which might be the cause.' => 'У вхідному паролі є пробіл, який може бути причиною.',
'If you did not send this request from Adminer then close this page.' => 'Якщо ви не посилали цей запит з Adminer, закрийте цю сторінку.',
'You can upload a big SQL file via FTP and import it from server.' => 'Ви можете завантажити великий файл SQL через FTP та імпортувати його з сервера.',
'Size' => 'Розмір',
'Compute' => 'Обчислити',
'You are offline.' => 'Ви офлайн.',
'You have no privileges to update this table.' => 'Ви не маєте привілеїв для оновлення цієї таблиці.',
'Saving' => 'Збереження',
'Unknown error.' => 'Невідома помилка.',
'Database does not support password.' => 'База даних не підтримує пароль.',
'Disable %s or enable %s or %s extensions.' => 'Вимкніть %s або увімкніть розширення %s або %s.',
'Check has been dropped.' => 'Перевірку видалено.',
'Check has been altered.' => 'Перевірка змінена.',
'Check has been created.' => 'Перевірку створено.',
'Alter check' => 'Змінити перевірку',
'Create check' => 'Створити перевірку',
'Vacuum' => 'Вакуум',
'%d / ' => '%d / ',
'Checks' => 'Перевірки',
'Loaded plugins' => 'Завантажені плагіни',
'%s must <a%s>return an array</a>.' => '%s має <a%s>повернути масив</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Налаштувати</a> %s у %s.',
);
// run `php ../../lang.php uk` to update this file

358
adminer/lang/uz.inc.php Normal file
View File

@@ -0,0 +1,358 @@
<?php
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Tizim',
'Server' => 'Server',
'Username' => 'Foydalanuvchi nomi',
'Password' => 'Parol',
'Permanent login' => 'Doimiy kirish',
'Login' => 'Kirish',
'Logout' => 'Chiqish',
'Logged as: %s' => 'Siz kirgansiz: %s',
'Logout successful.' => 'Muvaffaqiyatli chiqdingiz.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer dasturidan foydalanganingiz uchun rahmat, <a href="https://www.adminer.org/en/donation/">xayriya qilishni</a> o\'ylab ko\'ring.',
'Loaded plugins' => 'Yuklangan plaginlar',
'%s must <a%s>return an array</a>.' => '%s <a%s>massiv qaytarishi</a> kerak.',
'<a%s>Configure</a> %s in %s.' => '%s ni %s ichida <a%s>sozlang</a>.',
'Invalid credentials.' => 'Noto\'g\'ri ma\'lumotlar.',
'There is a space in the input password which might be the cause.' => 'Kiritilgan parolda bo\'sh joy bor, bu sabab bo\'lishi mumkin.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer parolsiz ma\'lumotlar bazasiga kirishni qo\'llab-quvvatlamaydi, <a href="https://www.adminer.org/en/password/"%s>ko\'proq ma\'lumot</a>.',
'Database does not support password.' => 'Ma\'lumotlar bazasi parolni qo\'llab-quvvatlamaydi.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Juda ko\'p muvaffaqiyatsiz urinishlar, %d daqiqadan so\'ng qayta urining.', 'Juda ko\'p muvaffaqiyatsiz urinishlar, %d daqiqadan so\'ng qayta urining.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Asosiy parol muddati tugadi. Uni doimiy qilish uchun %s usulini <a href="https://www.adminer.org/en/extension/"%s>amalga oshiring</a>.',
'Language' => 'Til',
'Invalid CSRF token. Send the form again.' => 'Noto\'g\'ri CSRF belgisi. Shaklni qayta yuboring.',
'If you did not send this request from Adminer then close this page.' => 'Agar bu so\'rovni Adminerdan yuborgan bo\'lmasangiz, ushbu sahifani yoping.',
'No extension' => 'Kengaytma yo\'q',
// %s contains the list of the extensions, e.g. 'mysqli, PDO_MySQL'
'None of the supported PHP extensions (%s) are available.' => 'Qo\'llab-quvvatlanadigan PHP kengaytmalarining (%s) hech biri mavjud emas.',
'Connecting to privileged ports is not allowed.' => 'Imtiyozli portlarga ulanishga ruxsat berilmagan.',
'Disable %s or enable %s or %s extensions.' => '%s ni o\'chiring yoki %s yoki %s kengaytmalarini yoqing.',
'Session support must be enabled.' => 'Sessiya qo\'llab-quvvatlashi yoqilgan bo\'lishi kerak.',
'Session expired, please login again.' => 'Sessiya muddati tugadi, iltimos, qayta kiring.',
'The action will be performed after successful login with the same credentials.' => 'Amal bir xil ma\'lumotlar bilan muvaffaqiyatli kirishdan so\'ng amalga oshiriladi.',
'%s version: %s through PHP extension %s' => '%s versiyasi: %s PHP kengaytmasi %s orqali',
'Refresh' => 'Yangilash',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Imtiyozlar',
'Create user' => 'Foydalanuvchi yaratish',
'User has been dropped.' => 'Foydalanuvchi o\'chirildi.',
'User has been altered.' => 'Foydalanuvchi o\'zgartirildi.',
'User has been created.' => 'Foydalanuvchi yaratildi.',
'Hashed' => 'Xeshlangan',
'Column' => 'Ustun',
'Routine' => 'Protsedura',
'Grant' => 'Berish',
'Revoke' => 'Bekor qilish',
'Process list' => 'Jarayonlar ro\'yxati',
'%d process(es) have been killed.' => array('%d jarayon to\'xtatildi.', '%d jarayonlar to\'xtatildi.'),
'Kill' => 'To\'xtatish',
'Variables' => 'O\'zgaruvchilar',
'Status' => 'Holat',
'SQL command' => 'SQL buyrug\'i',
'%d query(s) executed OK.' => array('%d so\'rov muvaffaqiyatli bajarildi.', '%d so\'rovlar muvaffaqiyatli bajarildi.'),
'Query executed OK, %d row(s) affected.' => array('So\'rov muvaffaqiyatli bajarildi, %d qator o\'zgartirildi.', 'So\'rov muvaffaqiyatli bajarildi, %d qatorlar o\'zgartirildi.'),
'No commands to execute.' => 'Bajariladigan buyruqlar yo\'q.',
'Error in query' => 'So\'rovda xatolik',
'Unknown error.' => 'Noma\'lum xatolik.',
'Warnings' => 'Ogohlantirishlar',
'ATTACH queries are not supported.' => 'ATTACH so\'rovlari qo\'llab-quvvatlanmaydi.',
'Execute' => 'Bajarish',
'Stop on error' => 'Xatoda to\'xtash',
'Show only errors' => 'Faqat xatolarni ko\'rsatish',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Tarix',
'Clear' => 'Tozalash',
'Edit all' => 'Hammasini tahrirlash',
'File upload' => 'Fayl yuklash',
'From server' => 'Serverdan',
'Webserver file %s' => 'Veb-server fayli %s',
'Run file' => 'Faylni ishga tushirish',
'File does not exist.' => 'Fayl mavjud emas.',
'File uploads are disabled.' => 'Fayl yuklash o\'chirilgan.',
'Unable to upload a file.' => 'Faylni yuklab bo\'lmadi.',
'Maximum allowed file size is %sB.' => 'Maksimal ruxsat etilgan fayl hajmi %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Juda katta POST ma\'lumotlari. Ma\'lumotlarni kamaytiring yoki %s konfiguratsiya direktivasini oshiring.',
'You can upload a big SQL file via FTP and import it from server.' => 'Katta SQL faylini FTP orqali yuklab, uni serverdan import qilishingiz mumkin.',
'You are offline.' => 'Siz oflayndasiz.',
'Export' => 'Eksport',
'Output' => 'Natija',
'open' => 'ochish',
'save' => 'saqlash',
'Saving' => 'Saqlanmoqda',
'Format' => 'Format',
'Data' => 'Ma\'lumotlar',
'Database' => 'Ma\'lumotlar bazasi',
'DB' => 'MB',
'Use' => 'Foydalanish',
'Select database' => 'Ma\'lumotlar bazasini tanlash',
'Invalid database.' => 'Noto\'g\'ri ma\'lumotlar bazasi.',
'Database has been dropped.' => 'Ma\'lumotlar bazasi o\'chirildi.',
'Databases have been dropped.' => 'Ma\'lumotlar bazalari o\'chirildi.',
'Database has been created.' => 'Ma\'lumotlar bazasi yaratildi.',
'Database has been renamed.' => 'Ma\'lumotlar bazasi qayta nomlandi.',
'Database has been altered.' => 'Ma\'lumotlar bazasi o\'zgartirildi.',
'Alter database' => 'Ma\'lumotlar bazasini o\'zgartirish',
'Create database' => 'Ma\'lumotlar bazasini yaratish',
'Database schema' => 'Ma\'lumotlar bazasi sxemasi',
// link to current database schema layout
'Permanent link' => 'Doimiy havola',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Dvigatel',
'Collation' => 'Kodlash',
'Data Length' => 'Ma\'lumotlar hajmi',
'Index Length' => 'Indeks hajmi',
'Data Free' => 'Bo\'sh ma\'lumotlar',
'Rows' => 'Qatorlar',
'%d in total' => 'Jami %d',
'Analyze' => 'Tahlil qilish',
'Optimize' => 'Optimallash',
'Vacuum' => 'Tozalash',
'Check' => 'Tekshirish',
'Repair' => 'Ta\'mirlash',
'Truncate' => 'Bo\'shatish',
'Tables have been truncated.' => 'Jadvallar bo\'shatildi.',
'Move to other database' => 'Boshqa ma\'lumotlar bazasiga ko\'chirish',
'Move' => 'Ko\'chirish',
'Tables have been moved.' => 'Jadvallar ko\'chirildi.',
'Copy' => 'Nusxalash',
'Tables have been copied.' => 'Jadvallar nusxalandi.',
'overwrite' => 'qayta yozish',
'Routines' => 'Protseduralar',
'Routine has been called, %d row(s) affected.' => array('Protsedura chaqirildi, %d qator o\'zgartirildi.', 'Protsedura chaqirildi, %d qatorlar o\'zgartirildi.'),
'Call' => 'Chaqirish',
'Parameter name' => 'Parametr nomi',
'Create procedure' => 'Protsedura yaratish',
'Create function' => 'Funksiya yaratish',
'Routine has been dropped.' => 'Protsedura o\'chirildi.',
'Routine has been altered.' => 'Protsedura o\'zgartirildi.',
'Routine has been created.' => 'Protsedura yaratildi.',
'Alter function' => 'Funksiyani o\'zgartirish',
'Alter procedure' => 'Protseduranni o\'zgartirish',
'Return type' => 'Qaytarish turi',
'Events' => 'Hodisalar',
'Event has been dropped.' => 'Hodisa o\'chirildi.',
'Event has been altered.' => 'Hodisa o\'zgartirildi.',
'Event has been created.' => 'Hodisa yaratildi.',
'Alter event' => 'Hodisani o\'zgartirish',
'Create event' => 'Hodisa yaratish',
'At given time' => 'Belgilangan vaqtda',
'Every' => 'Har bir',
'Schedule' => 'Jadval',
'Start' => 'Boshlash',
'End' => 'Tugatish',
'On completion preserve' => 'Yakunlangandan so\'ng saqlash',
'Tables' => 'Jadvallar',
'Tables and views' => 'Jadvallar va ko\'rinishlar',
'Table' => 'Jadval',
'No tables.' => 'Jadvallar yo\'q.',
'Alter table' => 'Jadvalni o\'zgartirish',
'Create table' => 'Jadval yaratish',
'Table has been dropped.' => 'Jadval o\'chirildi.',
'Tables have been dropped.' => 'Jadvallar o\'chirildi.',
'Tables have been optimized.' => 'Jadvallar optimallashtirildi.',
'Table has been altered.' => 'Jadval o\'zgartirildi.',
'Table has been created.' => 'Jadval yaratildi.',
'Table name' => 'Jadval nomi',
'Show structure' => 'Tuzilishni ko\'rsatish',
'engine' => 'dvigatel',
'collation' => 'kodlash',
'Column name' => 'Ustun nomi',
'Type' => 'Tur',
'Length' => 'Uzunlik',
'Auto Increment' => 'Avto ko\'payish',
'Options' => 'Variantlar',
'Comment' => 'Izoh',
'Default value' => 'Standart qiymat',
'Default values' => 'Standart qiymatlar',
'Drop' => 'O\'chirish',
'Drop %s?' => '%s ni o\'chirasizmi?',
'Are you sure?' => 'Ishonchingiz komilmi?',
'Size' => 'Hajm',
'Compute' => 'Hisoblash',
'Move up' => 'Yuqoriga ko\'chirish',
'Move down' => 'Pastga ko\'chirish',
'Remove' => 'Olib tashlash',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Ruxsat etilgan maydonlar soni oshib ketdi. Iltimos, %s ni oshiring.',
'Partition by' => 'Bo\'lish mezon',
'Partitions' => 'Bo\'limlar',
'Partition name' => 'Bo\'lim nomi',
'Values' => 'Qiymatlar',
'View' => 'Ko\'rinish',
'Materialized view' => 'Moddiy ko\'rinish',
'View has been dropped.' => 'Ko\'rinish o\'chirildi.',
'View has been altered.' => 'Ko\'rinish o\'zgartirildi.',
'View has been created.' => 'Ko\'rinish yaratildi.',
'Alter view' => 'Ko\'rinishni o\'zgartirish',
'Create view' => 'Ko\'rinish yaratish',
'Indexes' => 'Indekslar',
'Indexes have been altered.' => 'Indekslar o\'zgartirildi.',
'Alter indexes' => 'Indekslarni o\'zgartirish',
'Add next' => 'Keyingisini qo\'shish',
'Index Type' => 'Indeks turi',
'length' => 'uzunlik',
'Foreign keys' => 'Tashqi kalitlar',
'Foreign key' => 'Tashqi kalit',
'Foreign key has been dropped.' => 'Tashqi kalit o\'chirildi.',
'Foreign key has been altered.' => 'Tashqi kalit o\'zgartirildi.',
'Foreign key has been created.' => 'Tashqi kalit yaratildi.',
'Target table' => 'Maqsad jadvali',
'Change' => 'O\'zgartirish',
'Source' => 'Manba',
'Target' => 'Maqsad',
'Add column' => 'Ustun qo\'shish',
'Alter' => 'O\'zgartirish',
'Add foreign key' => 'Tashqi kalit qo\'shish',
'ON DELETE' => 'O\'CHIRILGANDA',
'ON UPDATE' => 'YANGILANGANDA',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Manba va maqsad ustunlari bir xil ma\'lumot turiga ega bo\'lishi kerak, maqsad ustunlarda indeks bo\'lishi kerak va havolalar qilingan ma\'lumotlar mavjud bo\'lishi kerak.',
'Triggers' => 'Triggerlar',
'Add trigger' => 'Trigger qo\'shish',
'Trigger has been dropped.' => 'Trigger o\'chirildi.',
'Trigger has been altered.' => 'Trigger o\'zgartirildi.',
'Trigger has been created.' => 'Trigger yaratildi.',
'Alter trigger' => 'Triggerni o\'zgartirish',
'Create trigger' => 'Trigger yaratish',
'Time' => 'Vaqt',
'Event' => 'Hodisa',
'Name' => 'Nomi',
'select' => 'tanlash',
'Select' => 'Tanlash',
'Select data' => 'Ma\'lumotlarni tanlash',
'Functions' => 'Funksiyalar',
'Aggregation' => 'Agregatsiya',
'Search' => 'Qidirish',
'anywhere' => 'hamma joyda',
'Search data in tables' => 'Jadvallarda ma\'lumotlarni qidirish',
'Sort' => 'Saralash',
'descending' => 'kamayish bo\'yicha',
'Limit' => 'Cheklov',
'Limit rows' => 'Qatorlarni cheklash',
'Text length' => 'Matn uzunligi',
'Action' => 'Amal',
'Full table scan' => 'To\'liq jadval skanerlash',
'Unable to select the table' => 'Jadvalni tanlab bo\'lmadi',
'No rows.' => 'Qatorlar yo\'q.',
// used in SQL query limit and it is followed by another number, e.g. '10 / 50 rows' meaning 10 of 50 rows
'%d / ' => '%d / ',
'%d row(s)' => array('%d qator', '%d qatorlar'),
'Page' => 'Sahifa',
'last' => 'oxirgi',
'Load more data' => 'Ko\'proq ma\'lumot yuklash',
'Loading' => 'Yuklanmoqda',
'Whole result' => 'Butun natija',
'%d byte(s)' => array('%d bayt', '%d baytlar'),
'Import' => 'Import',
'%d row(s) have been imported.' => array('%d qator import qilindi.', '%d qatorlar import qilindi.'),
'File must be in UTF-8 encoding.' => 'Fayl UTF-8 kodlashda bo\'lishi kerak.',
// in-place editing in select
'Modify' => 'O\'zgartirish',
'Ctrl+click on a value to modify it.' => 'Qiymatni o\'zgartirish uchun Ctrl+bosing.',
'Use edit link to modify this value.' => 'Bu qiymatni o\'zgartirish uchun tahrir havolasidan foydalaning.',
// %s can contain auto-increment value, e.g. ' 123'
'Item%s has been inserted.' => 'Element%s kiritildi.',
'Item has been deleted.' => 'Element o\'chirildi.',
'Item has been updated.' => 'Element yangilandi.',
'%d item(s) have been affected.' => array('%d element o\'zgartirildi.', '%d elementlar o\'zgartirildi.'),
'New item' => 'Yangi element',
'original' => 'asl',
// label for value '' in enum data type
'empty' => 'bo\'sh',
'edit' => 'tahrirlash',
'Edit' => 'Tahrirlash',
'Insert' => 'Kiritish',
'Save' => 'Saqlash',
'Save and continue edit' => 'Saqlash va tahrirlashni davom ettirish',
'Save and insert next' => 'Saqlash va keyingisini kiritish',
'Selected' => 'Tanlangan',
'Clone' => 'Klonlash',
'Delete' => 'O\'chirish',
'You have no privileges to update this table.' => 'Bu jadvalni yangilash uchun sizda huquqlar yo\'q.',
// data type descriptions
'Numbers' => 'Raqamlar',
'Date and time' => 'Sana va vaqt',
'Strings' => 'Matnlar',
'Binary' => 'Ikkilik',
'Lists' => 'Ro\'yxatlar',
'Network' => 'Tarmoq',
'Geometry' => 'Geometriya',
'Relations' => 'Munosabatlar',
'Editor' => 'Muharrir',
// 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' => 'SS:MM:SS',
'now' => 'hozir',
'yes' => 'ha',
'no' => 'yo\'q',
// general SQLite error in create, drop or rename database
'File exists.' => 'Fayl mavjud.',
'Please use one of the extensions %s.' => 'Iltimos, kengaytmalardan birini %s foydalaning.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Sxemani o\'zgartirish',
'Create schema' => 'Sxema yaratish',
'Schema has been dropped.' => 'Sxema o\'chirildi.',
'Schema has been created.' => 'Sxema yaratildi.',
'Schema has been altered.' => 'Sxema o\'zgartirildi.',
'Schema' => 'Sxema',
'Invalid schema.' => 'Noto\'g\'ri sxema.',
// PostgreSQL sequences support
'Sequences' => 'Ketma-ketliklar',
'Create sequence' => 'Ketma-ketlik yaratish',
'Sequence has been dropped.' => 'Ketma-ketlik o\'chirildi.',
'Sequence has been created.' => 'Ketma-ketlik yaratildi.',
'Sequence has been altered.' => 'Ketma-ketlik o\'zgartirildi.',
'Alter sequence' => 'Ketma-ketlikni o\'zgartirish',
// PostgreSQL user types support
'User types' => 'Foydalanuvchi turlari',
'Create type' => 'Tur yaratish',
'Type has been dropped.' => 'Tur o\'chirildi.',
'Type has been created.' => 'Tur yaratildi.',
'Alter type' => 'Turni o\'zgartirish',
// Table check constraints
'Checks' => 'Tekshirishlar',
'Create check' => 'Tekshirish yaratish',
'Alter check' => 'Tekshirishni o\'zgartirish',
'Check has been created.' => 'Tekshirish yaratildi.',
'Check has been altered.' => 'Tekshirish o\'zgartirildi.',
'Check has been dropped.' => 'Tekshirish o\'chirildi.',
);
// run `php ../../lang.php uz` to update this file

View File

@@ -1,5 +1,7 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Hệ thống',
'Server' => 'Máy chủ',
@@ -12,7 +14,7 @@ $translations = array(
'Logout successful.' => 'Đã thoát xong.',
'Invalid credentials.' => 'Tài khoản sai.',
'Too many unsuccessful logins, try again in %d minute(s).' => 'Bạn gõ sai tài khoản quá nhiều lần, hãy thử lại sau %d phút nữa.',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Mật khẩu đã hết hạn. <a href="http://www.adminer.org/en/extension/" target="_blank">Thử cách làm</a> để giữ cố định.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Mật khẩu đã hết hạn. <a href="https://www.adminer.org/en/extension/"%s>Thử cách làm</a> để giữ cố định.',
'Language' => 'Ngôn ngữ',
'Invalid CSRF token. Send the form again.' => 'Mã kiểm tra CSRF sai, hãy nhập lại biểu mẫu.',
'No extension' => 'Không có phần mở rộng',
@@ -21,10 +23,10 @@ $translations = array(
'Session expired, please login again.' => 'Phiên làm việc đã hết, hãy đăng nhập lại.',
'%s version: %s through PHP extension %s' => 'Phiên bản %s: %s (PHP extension: %s)',
'Refresh' => 'Làm mới',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Quyền truy cập',
'Create user' => 'Tạo người dùng',
'User has been dropped.' => 'Đã xoá người dùng.',
@@ -35,14 +37,14 @@ $translations = array(
'Routine' => 'Hàm tích hợp',
'Grant' => 'Cấp quyền',
'Revoke' => 'Tước quyền',
'Process list' => 'Danh sách tiến trình',
'%d process(es) have been killed.' => '%d tiến trình đã dừng.',
'Kill' => 'Dừng',
'Variables' => 'Biến',
'Status' => 'Trạng thái',
'SQL command' => 'Câu lệnh SQL',
'%d query(s) executed OK.' => '%d câu lệnh đã chạy thành công.',
'Query executed OK, %d row(s) affected.' => 'Đã thực hiện xong, ảnh hưởng đến %d dòng.',
@@ -56,10 +58,10 @@ $translations = array(
'History' => 'Lịch sử',
'Clear' => 'Xoá',
'Edit all' => 'Sửa tất cả',
'File upload' => 'Tải tệp lên',
'From server' => 'Dùng tệp trên máy chủ',
'Webserver file %s' => 'Tệp trên máy chủ',
'Webserver file %s' => 'Tệp trên máy chủ %s',
'Run file' => 'Chạy tệp',
'File does not exist.' => 'Tệp không tồn tại.',
'File uploads are disabled.' => 'Chức năng tải tệp lên đã bị cấm.',
@@ -67,20 +69,18 @@ $translations = array(
'Maximum allowed file size is %sB.' => 'Kích thước tệp tối đa là %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Dữ liệu tải lên/POST quá lớn. Hãy giảm kích thước tệp hoặc tăng cấu hình (hiện tại %s).',
'You can upload a big SQL file via FTP and import it from server.' => 'Bạn có thể tải tệp lên dùng FTP và nhập vào cơ sở dữ liệu.',
'Export' => 'Xuất',
'Output' => 'Kết quả',
'open' => 'xem',
'save' => 'lưu',
'Format' => 'Định dạng',
'Data' => 'Dữ liệu',
'Database' => 'Cơ sở dữ liệu',
'database' => 'cơ sở dữ liệu',
'Use' => 'Sử dụng',
'Select database' => 'Chọn CSDL',
'Invalid database.' => 'CSDL sai.',
'Create new database' => 'Tạo CSDL',
'Database has been dropped.' => 'CSDL đã bị xoá.',
'Databases have been dropped.' => 'Các CSDL đã bị xoá.',
'Database has been created.' => 'Đã tạo CSDL.',
@@ -89,10 +89,10 @@ $translations = array(
'Alter database' => 'Thay đổi CSDL',
'Create database' => 'Tạo CSDL',
'Database schema' => 'Cấu trúc CSDL',
// link to current database schema layout
'Permanent link' => 'Liên kết cố định',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
@@ -115,7 +115,7 @@ $translations = array(
'Tables have been moved.' => 'Bảng.',
'Copy' => 'Sao chép',
'Tables have been copied.' => 'Bảng đã được sao chép.',
'Routines' => 'Routines',
'Routine has been called, %d row(s) affected.' => 'Đã chạy routine, thay đổi %d dòng.',
'Call' => 'Gọi',
@@ -140,7 +140,7 @@ $translations = array(
'Start' => 'Bắt đầu',
'End' => 'Kết thúc',
'On completion preserve' => 'Khi kết thúc, duy trì',
'Tables' => 'Các bảng',
'Tables and views' => 'Bảng và khung nhìn',
'Table' => 'Bảng',
@@ -171,26 +171,26 @@ $translations = array(
'Move down' => 'Chuyển xuống dưới',
'Remove' => 'Xoá',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Thiết lập %s cần tăng thêm. (Đã vượt giới hạnố trường tối đa cho phép trong một biểu mẫu).',
'Partition by' => 'Phân chia bằng',
'Partitions' => 'Phân hoạch',
'Partition name' => 'Tên phân hoạch',
'Values' => 'Giá trị',
'View' => 'Khung nhìn',
'View has been dropped.' => 'Khung nhìn đã bị xoá.',
'View has been altered.' => 'Khung nhìn đã được sửa.',
'View has been created.' => 'Khung nhìn đã được tạo.',
'Alter view' => 'Sửa khung nhìn',
'Create view' => 'Tạo khung nhìn',
'Indexes' => 'Chỉ mục',
'Indexes have been altered.' => 'Chỉ mục đã được sửa.',
'Alter indexes' => 'Sửa chỉ mục',
'Add next' => 'Thêm tiếp',
'Index Type' => 'Loại chỉ mục',
'Column (length)' => 'Cột (độ dài)',
'length' => 'độ dài',
'Foreign keys' => 'Các khoá ngoại',
'Foreign key' => 'Khoá ngoại',
'Foreign key has been dropped.' => 'Khoá ngoại đã bị xoá.',
@@ -206,9 +206,9 @@ $translations = array(
'ON DELETE' => 'Khi xoá',
'ON UPDATE' => 'Khi cập nhật',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
'Triggers' => 'xx',
'Add trigger' => 'xx',
'Triggers' => 'Phản xạ',
'Add trigger' => 'Thêm phản xạ',
'Trigger has been dropped.' => 'Đã xoá phản xạ.',
'Trigger has been altered.' => 'Đã sửa phản xạ.',
'Trigger has been created.' => 'Đã tạo phản xạ.',
@@ -217,7 +217,7 @@ $translations = array(
'Time' => 'Thời gian',
'Event' => 'Sự kiện',
'Name' => 'Tên',
'select' => 'xem',
'Select' => 'Xem',
'Select data' => 'Xem dữ liệu',
@@ -239,18 +239,18 @@ $translations = array(
'last' => 'cuối',
'Load more data' => 'Xem thêm dữ liệu',
'Loading' => 'Đang nạp',
'whole result' => 'toàn bộ kết quả',
'Whole result' => 'Toàn bộ kết quả',
'%d byte(s)' => '%d byte(s)',
'Import' => 'Nhập khẩu',
'%d row(s) have been imported.' => 'Đã nhập % dòng dữ liệu.',
'File must be in UTF-8 encoding.' => 'Tệp phải mã hoá bằng chuẩn UTF-8.',
// in-place editing in select
'Modify' => 'Sửa',
'Ctrl+click on a value to modify it.' => 'Nhấn Ctrl và bấm vào giá trị để sửa.',
'Use edit link to modify this value.' => 'Dùng nút sửa để thay đổi giá trị này.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Đã thêm%s.',
'Item has been deleted.' => 'Đã xoá.',
@@ -270,14 +270,7 @@ $translations = array(
'Clone' => 'Sao chép',
'Delete' => 'Xoá',
'You have no privileges to update this table.' => 'Bạn không có quyền sửa bảng này.',
'E-mail' => 'Địa chỉ email',
'From' => 'Người gửi',
'Subject' => 'Chủ đề',
'Attachments' => 'Đính kèm',
'Send' => 'Gửi',
'%d e-mail(s) have been sent.' => '%d thư đã gửi.',
// data type descriptions
'Numbers' => 'Số',
'Date and time' => 'Ngày giờ',
@@ -287,7 +280,7 @@ $translations = array(
'Network' => 'Mạng',
'Geometry' => 'Toạ độ',
'Relations' => 'Quan hệ',
'Editor' => 'Biên tập',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
@@ -298,28 +291,28 @@ $translations = array(
'now' => 'hiện tại',
'yes' => 'có',
'no' => 'không',
// general SQLite error in create, drop or rename database
'File exists.' => 'Tệp đã có rồi.',
'Please use one of the extensions %s.' => 'Cần phải dùng một trong các phần mở rộng sau: %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Thay đổi schema',
'Create schema' => 'Tạo schema',
'Schema has been dropped.' => 'Đã xoá schema.',
'Schema has been created.' => 'Đã tạo schema.',
'Schema has been altered.' => 'Đã thay đổi schema.',
'Schema' => 'schema',
'Invalid schema.' => 'Schema khong hợp lệ.',
'Schema' => 'Schema',
'Invalid schema.' => 'Schema không hợp lệ.',
// PostgreSQL sequences support
'Sequences' => 'Dãy số',
'Create sequence' => 'Tạo đãy số',
'Create sequence' => 'Tạo dãy số',
'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
'Sequence has been created.' => 'Đã tạo dãy số.',
'Sequence has been altered.' => 'Đã sửa dãy số.',
'Alter sequence' => 'Thay đổi dãy số',
// PostgreSQL user types support
'User types' => 'Kiểu tự định nghĩa',
'Create type' => 'Tạo kiểu',
@@ -327,3 +320,5 @@ $translations = array(
'Type has been created.' => 'Đã tạo kiểu.',
'Alter type' => 'Sửa kiểu dữ liệu',
);
// run `php ../../lang.php vi` to update this file

View File

@@ -1,336 +1,366 @@
<?php
$translations = array(
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'xx',
'Server' => 'xx',
'Username' => 'xx',
'Password' => 'xx',
'Permanent login' => 'xx',
'Login' => 'xx',
'Logout' => 'xx',
'Logged as: %s' => 'xx',
'Logout successful.' => 'xx',
'Invalid credentials.' => 'xx',
'Too many unsuccessful logins, try again in %d minute(s).' => array('xx', 'xx'),
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'xx',
'Language' => 'xx',
'Invalid CSRF token. Send the form again.' => 'xx',
'No extension' => 'xx',
'None of the supported PHP extensions (%s) are available.' => 'xx',
'Session support must be enabled.' => 'xx',
'Session expired, please login again.' => 'xx',
'%s version: %s through PHP extension %s' => 'xx',
'Refresh' => 'xx',
'System' => 'Xx',
'Server' => 'Xx',
'Username' => 'Xx',
'Password' => 'Xx',
'Permanent login' => 'Xx',
'Login' => 'Xx',
'Logout' => 'Xx',
'Logged as: %s' => 'Xx: %s',
'Logout successful.' => 'Xx.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Xx <a href="https://www.adminer.org/en/donation/">xx</a>.',
'Invalid credentials.' => 'Xx.',
'There is a space in the input password which might be the cause.' => 'Xx.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
'Database does not support password.' => 'Xx.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Xx. <a href="https://www.adminer.org/en/extension/"%s>Xx</a> %s xx.',
'Language' => 'Xx',
'Invalid CSRF token. Send the form again.' => 'Xx.',
'If you did not send this request from Adminer then close this page.' => 'Xx.',
'No extension' => 'Xx',
// %s contains the list of the extensions, e.g. 'mysqli, PDO_MySQL'
'None of the supported PHP extensions (%s) are available.' => 'Xx (%s).',
'Connecting to privileged ports is not allowed.' => 'Xx.',
'Disable %s or enable %s or %s extensions.' => 'Xx %s xx %s xx %s xx.',
'Session support must be enabled.' => 'Xx.',
'Session expired, please login again.' => 'Xx.',
'The action will be performed after successful login with the same credentials.' => 'Xx.',
'%s version: %s through PHP extension %s' => '%s xx: %s xx %s',
'Refresh' => 'Xx',
// text direction - 'ltr' or 'rtl'
'ltr' => 'xx',
'Privileges' => 'xx',
'Create user' => 'xx',
'User has been dropped.' => 'xx',
'User has been altered.' => 'xx',
'User has been created.' => 'xx',
'Hashed' => 'xx',
'Column' => 'xx',
'Routine' => 'xx',
'Grant' => 'xx',
'Revoke' => 'xx',
'Process list' => 'xx',
'%d process(es) have been killed.' => array('xx', 'xx'),
'Kill' => 'xx',
'Variables' => 'xx',
'Status' => 'xx',
'SQL command' => 'xx',
'%d query(s) executed OK.' => array('xx', 'xx'),
'Query executed OK, %d row(s) affected.' => array('xx', 'xx'),
'No commands to execute.' => 'xx',
'Error in query' => 'xx',
'Execute' => 'xx',
'Stop on error' => 'xx',
'Show only errors' => 'xx',
'ltr' => 'ltr',
'Privileges' => 'Xx',
'Create user' => 'Xx',
'User has been dropped.' => 'Xx.',
'User has been altered.' => 'Xx.',
'User has been created.' => 'Xx.',
'Hashed' => 'Xx',
'Column' => 'Xx',
'Columns' => 'Xx',
'Routine' => 'Xx',
'Grant' => 'Xx',
'Revoke' => 'Xx',
'Process list' => 'Xx',
'%d process(es) have been killed.' => array('%d xx.', '%d xx.'),
'Kill' => 'Xx',
'Variables' => 'Xx',
'Status' => 'Xx',
'SQL command' => 'Xx',
'%d query(s) executed OK.' => array('%d xx.', '%d xx.'),
'Query executed OK, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
'No commands to execute.' => 'Xx.',
'Error in query' => 'Xx',
'Unknown error.' => 'Xx.',
'Warnings' => 'Xx',
'ATTACH queries are not supported.' => 'Xx.',
'Execute' => 'Xx',
'Stop on error' => 'Xx',
'Show only errors' => 'Xx',
// sprintf() format for time of the command
'%.3f s' => 'xx',
'History' => 'xx',
'Clear' => 'xx',
'Edit all' => 'xx',
'File upload' => 'xx',
'From server' => 'xx',
'Webserver file %s' => 'xx',
'Run file' => 'xx',
'File does not exist.' => 'xx',
'File uploads are disabled.' => 'xx',
'Unable to upload a file.' => 'xx',
'Maximum allowed file size is %sB.' => 'xx',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'xx',
'You can upload a big SQL file via FTP and import it from server.' => 'xx',
'You are offline.' => 'xx',
'Export' => 'xx',
'Output' => 'xx',
'%.3f s' => '%.3f xx',
'History' => 'Xx',
'Clear' => 'Xx',
'Edit all' => 'Xx',
'File upload' => 'Xx',
'From server' => 'Xx',
'Webserver file %s' => 'Xx %s',
'Run file' => 'Xx',
'File does not exist.' => 'Xx.',
'Increase %s.' => 'Xx %s.',
'File uploads are disabled.' => 'Xx.',
'Unable to upload a file.' => 'Xx.',
'Maximum allowed file size is %sB.' => 'Xx %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Xx %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Xx.',
'You are offline.' => 'Xx.',
'Export' => 'Xx',
'Output' => 'Xx',
'open' => 'xx',
'save' => 'xx',
'Format' => 'xx',
'Data' => 'xx',
'Database' => 'xx',
'database' => 'xx',
'Use' => 'xx',
'Select database' => 'xx',
'Invalid database.' => 'xx',
'Create new database' => 'xx',
'Database has been dropped.' => 'xx',
'Databases have been dropped.' => 'xx',
'Database has been created.' => 'xx',
'Database has been renamed.' => 'xx',
'Database has been altered.' => 'xx',
'Alter database' => 'xx',
'Create database' => 'xx',
'Database schema' => 'xx',
'Saving' => 'Xx',
'Format' => 'Xx',
'Data' => 'Xx',
'Database' => 'Xx',
'DB' => 'XX',
'Use' => 'Xx',
'Select database' => 'Xx',
'Invalid database.' => 'Xx.',
'Database has been dropped.' => 'Xx.',
'Databases have been dropped.' => 'Xx.',
'Database has been created.' => 'Xx.',
'Database has been renamed.' => 'Xx.',
'Database has been altered.' => 'Xx.',
'Alter database' => 'Xx',
'Create database' => 'Xx',
'Database schema' => 'Xx',
// link to current database schema layout
'Permanent link' => 'xx',
'Permanent link' => 'Xx',
// thousands separator - must contain single byte
',' => 'x',
'0123456789' => 'xxxxxxxxxx',
'Engine' => 'xx',
'Collation' => 'xx',
'Data Length' => 'xx',
'Index Length' => 'xx',
'Data Free' => 'xx',
'Rows' => 'xx',
'%d in total' => 'xx',
'Analyze' => 'xx',
'Optimize' => 'xx',
'Vacuum' => 'xx',
'Check' => 'xx',
'Repair' => 'xx',
'Truncate' => 'xx',
'Tables have been truncated.' => 'xx',
'Move to other database' => 'xx',
'Move' => 'xx',
'Tables have been moved.' => 'xx',
'Copy' => 'xx',
'Tables have been copied.' => 'xx',
'Routines' => 'xx',
'Routine has been called, %d row(s) affected.' => array('xx', 'xx'),
'Call' => 'xx',
'Parameter name' => 'xx',
'Create procedure' => 'xx',
'Create function' => 'xx',
'Routine has been dropped.' => 'xx',
'Routine has been altered.' => 'xx',
'Routine has been created.' => 'xx',
'Alter function' => 'xx',
'Alter procedure' => 'xx',
'Return type' => 'xx',
'Events' => 'xx',
'Event has been dropped.' => 'xx',
'Event has been altered.' => 'xx',
'Event has been created.' => 'xx',
'Alter event' => 'xx',
'Create event' => 'xx',
'At given time' => 'xx',
'Every' => 'xx',
'Schedule' => 'xx',
'Start' => 'xx',
'End' => 'xx',
'On completion preserve' => 'xx',
'Tables' => 'xx',
'Tables and views' => 'xx',
'Table' => 'xx',
'No tables.' => 'xx',
'Alter table' => 'xx',
'Create table' => 'xx',
'Table has been dropped.' => 'xx',
'Tables have been dropped.' => 'xx',
'Tables have been optimized.' => 'xx',
'Table has been altered.' => 'xx',
'Table has been created.' => 'xx',
'Table name' => 'xx',
'Show structure' => 'xx',
'Engine' => 'Xx',
'Collation' => 'Xx',
'Data Length' => 'Xx',
'Index Length' => 'Xx',
'Data Free' => 'Xx',
'Rows' => 'Xx',
'%d in total' => '%d xx',
'Analyze' => 'Xx',
'Optimize' => 'Xx',
'Vacuum' => 'Xx',
'Check' => 'Xx',
'Repair' => 'Xx',
'Truncate' => 'Xx',
'Tables have been truncated.' => 'Xx.',
'Move to other database' => 'Xx',
'Move' => 'Xx',
'Tables have been moved.' => 'Xx.',
'Copy' => 'Xx',
'Tables have been copied.' => 'Xx.',
'overwrite' => 'xx',
'Routines' => 'Xx',
'Routine has been called, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
'Call' => 'Xx',
'Parameter name' => 'Xx',
'Create procedure' => 'Xx',
'Create function' => 'Xx',
'Routine has been dropped.' => 'Xx.',
'Routine has been altered.' => 'Xx.',
'Routine has been created.' => 'Xx.',
'Alter function' => 'Xx',
'Alter procedure' => 'Xx',
'Return type' => 'Xx',
'Events' => 'Xx',
'Event has been dropped.' => 'Xx.',
'Event has been altered.' => 'Xx.',
'Event has been created.' => 'Xx.',
'Alter event' => 'Xx',
'Create event' => 'Xx',
'At given time' => 'Xx',
'Every' => 'Xx',
'Schedule' => 'Xx',
'Start' => 'Xx',
'End' => 'Xx',
'On completion preserve' => 'Xx',
'Tables' => 'Xx',
'Tables and views' => 'Xx',
'Table' => 'Xx',
'No tables.' => 'Xx.',
'Alter table' => 'Xx',
'Create table' => 'Xx',
'Table has been dropped.' => 'Xx.',
'Tables have been dropped.' => 'Xx.',
'Tables have been optimized.' => 'Xx.',
'Table has been altered.' => 'Xx.',
'Table has been created.' => 'Xx.',
'Table name' => 'Xx',
'Show structure' => 'Xx',
'engine' => 'xx',
'collation' => 'xx',
'Column name' => 'xx',
'Type' => 'xx',
'Length' => 'xx',
'Auto Increment' => 'xx',
'Options' => 'xx',
'Comment' => 'xx',
'Default value' => 'xx',
'Default values' => 'xx',
'Drop' => 'xx',
'Are you sure?' => 'xx',
'Size' => 'xx',
'Compute' => 'xx',
'Move up' => 'xx',
'Move down' => 'xx',
'Remove' => 'xx',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'xx',
'Partition by' => 'xx',
'Partitions' => 'xx',
'Partition name' => 'xx',
'Values' => 'xx',
'View' => 'xx',
'Materialized View' => 'xx',
'View has been dropped.' => 'xx',
'View has been altered.' => 'xx',
'View has been created.' => 'xx',
'Alter view' => 'xx',
'Create view' => 'xx',
'Create materialized view' => 'xx',
'Indexes' => 'xx',
'Indexes have been altered.' => 'xx',
'Alter indexes' => 'xx',
'Add next' => 'xx',
'Index Type' => 'xx',
'Column (length)' => 'xx',
'Foreign keys' => 'xx',
'Foreign key' => 'xx',
'Foreign key has been dropped.' => 'xx',
'Foreign key has been altered.' => 'xx',
'Foreign key has been created.' => 'xx',
'Target table' => 'xx',
'Change' => 'xx',
'Source' => 'xx',
'Target' => 'xx',
'Add column' => 'xx',
'Alter' => 'xx',
'Add foreign key' => 'xx',
'ON DELETE' => 'xx',
'ON UPDATE' => 'xx',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'xx',
'Triggers' => 'xx',
'Add trigger' => 'xx',
'Trigger has been dropped.' => 'xx',
'Trigger has been altered.' => 'xx',
'Trigger has been created.' => 'xx',
'Alter trigger' => 'xx',
'Create trigger' => 'xx',
'Time' => 'xx',
'Event' => 'xx',
'Name' => 'xx',
'Column name' => 'Xx',
'Type' => 'Xx',
'Length' => 'Xx',
'Auto Increment' => 'Xx',
'Options' => 'Xx',
'Comment' => 'Xx',
'Default value' => 'Xx',
'Default values' => 'Xx',
'Drop' => 'Xx',
'Drop %s?' => 'Xx %s?',
'Are you sure?' => 'Xx?',
'Size' => 'Xx',
'Compute' => 'Xx',
'Move up' => 'Xx',
'Move down' => 'Xx',
'Remove' => 'Xx',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Xx %s.',
'Partition by' => 'Xx',
'Partitions' => 'Xx',
'Partition name' => 'Xx',
'Values' => 'Xx',
'Inherits from' => 'Xx',
'Inherited by' => 'Xx',
'View' => 'Xx',
'Materialized view' => 'Xx',
'View has been dropped.' => 'Xx.',
'View has been altered.' => 'Xx.',
'View has been created.' => 'Xx.',
'Alter view' => 'Xx',
'Create view' => 'Xx',
'Indexes' => 'Xx',
'Indexes have been altered.' => 'Xx.',
'Alter indexes' => 'Xx',
'Add next' => 'Xx',
'Index Type' => 'Xx',
'length' => 'xx',
'Algorithm' => 'Xx',
'Condition' => 'Xx',
'Foreign keys' => 'Xx',
'Foreign key' => 'Xx',
'Foreign key has been dropped.' => 'Xx.',
'Foreign key has been altered.' => 'Xx.',
'Foreign key has been created.' => 'Xx.',
'Target table' => 'Xx',
'Change' => 'Xx',
'Source' => 'Xx',
'Target' => 'Xx',
'Add column' => 'Xx',
'Alter' => 'Xx',
'Add foreign key' => 'Xx',
'ON DELETE' => 'Xx',
'ON UPDATE' => 'Xx',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Xx.',
'Triggers' => 'Xx',
'Add trigger' => 'Xx',
'Trigger has been dropped.' => 'Xx.',
'Trigger has been altered.' => 'Xx.',
'Trigger has been created.' => 'Xx.',
'Alter trigger' => 'Xx',
'Create trigger' => 'Xx',
'Time' => 'Xx',
'Event' => 'Xx',
'Name' => 'Xx',
'select' => 'xx',
'Select' => 'xx',
'Select data' => 'xx',
'Functions' => 'xx',
'Aggregation' => 'xx',
'Search' => 'xx',
'Select' => 'Xx',
'Select data' => 'Xx',
'Functions' => 'Xx',
'Aggregation' => 'Xx',
'Search' => 'Xx',
'anywhere' => 'xx',
'Search data in tables' => 'xx',
'Sort' => 'xx',
'Search data in tables' => 'Xx',
'Sort' => 'Xx',
'descending' => 'xx',
'Limit' => 'xx',
'Limit rows' => 'xx',
'Text length' => 'xx',
'Action' => 'xx',
'Full table scan' => 'xx',
'Unable to select the table' => 'xx',
'No rows.' => 'xx',
'%d / ' => 'xx',
'%d row(s)' => array('xx', 'xx'),
'Page' => 'xx',
'Limit' => 'Xx',
'Limit rows' => 'Xx',
'Text length' => 'Xx',
'Action' => 'Xx',
'Full table scan' => 'Xx',
'Unable to select the table' => 'Xx',
'No rows.' => 'Xx.',
// used in SQL query limit and it is followed by another number, e.g. '10 / 50 rows' meaning 10 of 50 rows
'%d / ' => '%d / ',
'%d row(s)' => array('%d xx', '%d xx'),
'Page' => 'Xx',
'last' => 'xx',
'Load more data' => 'xx',
'Loading' => 'xx',
'whole result' => 'xx',
'%d byte(s)' => array('xx', 'xx'),
'Import' => 'xx',
'%d row(s) have been imported.' => array('xx', 'xx'),
'File must be in UTF-8 encoding.' => 'xx',
'Load more data' => 'Xx',
'Loading' => 'Xx',
'Whole result' => 'Xx',
'%d byte(s)' => array('%d xx', '%d xx'),
'Import' => 'Xx',
'%d row(s) have been imported.' => array('%d xx.', '%d xx.'),
'File must be in UTF-8 encoding.' => 'Xx.',
// in-place editing in select
'Modify' => 'xx',
'Ctrl+click on a value to modify it.' => 'xx',
'Use edit link to modify this value.' => 'xx',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'xx',
'Item has been deleted.' => 'xx',
'Item has been updated.' => 'xx',
'%d item(s) have been affected.' => array('xx', 'xx'),
'New item' => 'xx',
'Modify' => 'Xx',
'Ctrl+click on a value to modify it.' => 'Xx.',
'Use edit link to modify this value.' => 'Xx.',
// %s can contain auto-increment value, e.g. ' 123'
'Item%s has been inserted.' => 'Xx%s.',
'Item has been deleted.' => 'Xx.',
'Item has been updated.' => 'Xx.',
'%d item(s) have been affected.' => array('%d xx.', '%d xx.'),
'New item' => 'Xx',
'original' => 'xx',
// label for value '' in enum data type
'empty' => 'xx',
'edit' => 'xx',
'Edit' => 'xx',
'Insert' => 'xx',
'Save' => 'xx',
'Save and continue edit' => 'xx',
'Save and insert next' => 'xx',
'Selected' => 'xx',
'Clone' => 'xx',
'Delete' => 'xx',
'You have no privileges to update this table.' => 'xx',
'E-mail' => 'xx',
'From' => 'xx',
'Subject' => 'xx',
'Attachments' => 'xx',
'Send' => 'xx',
'%d e-mail(s) have been sent.' => array('xx', 'xx'),
'Edit' => 'Xx',
'Insert' => 'Xx',
'Save' => 'Xx',
'Save and continue edit' => 'Xx',
'Save and insert next' => 'Xx',
'Selected' => 'Xx',
'Clone' => 'Xx',
'Delete' => 'Xx',
'You have no privileges to update this table.' => 'Xx.',
// data type descriptions
'Numbers' => 'xx',
'Date and time' => 'xx',
'Strings' => 'xx',
'Binary' => 'xx',
'Lists' => 'xx',
'Network' => 'xx',
'Geometry' => 'xx',
'Relations' => 'xx',
'Editor' => 'xx',
'Numbers' => 'Xx',
'Date and time' => 'Xx',
'Strings' => 'Xx',
'Binary' => 'Xx',
'Lists' => 'Xx',
'Network' => 'Xx',
'Geometry' => 'Xx',
'Relations' => 'Xx',
'Editor' => 'Xx',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => 'xx',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'xx',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'xx',
'HH:MM:SS' => 'Xx',
'now' => 'xx',
'yes' => 'xx',
'no' => 'xx',
// general SQLite error in create, drop or rename database
'File exists.' => 'xx',
'Please use one of the extensions %s.' => 'xx',
'File exists.' => 'Xx.',
'Please use one of the extensions %s.' => 'Xx %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'xx',
'Create schema' => 'xx',
'Schema has been dropped.' => 'xx',
'Schema has been created.' => 'xx',
'Schema has been altered.' => 'xx',
'Schema' => 'xx',
'Invalid schema.' => 'xx',
'Alter schema' => 'Xx',
'Create schema' => 'Xx',
'Schema has been dropped.' => 'Xx.',
'Schema has been created.' => 'Xx.',
'Schema has been altered.' => 'Xx.',
'Schema' => 'Xx',
'Invalid schema.' => 'Xx.',
// PostgreSQL sequences support
'Sequences' => 'xx',
'Create sequence' => 'xx',
'Sequence has been dropped.' => 'xx',
'Sequence has been created.' => 'xx',
'Sequence has been altered.' => 'xx',
'Alter sequence' => 'xx',
'Sequences' => 'Xx',
'Create sequence' => 'Xx',
'Sequence has been dropped.' => 'Xx.',
'Sequence has been created.' => 'Xx.',
'Sequence has been altered.' => 'Xx.',
'Alter sequence' => 'Xx',
// PostgreSQL user types support
'User types' => 'xx',
'Create type' => 'xx',
'Type has been dropped.' => 'xx',
'Type has been created.' => 'xx',
'Alter type' => 'xx',
'User types' => 'Xx',
'Create type' => 'Xx',
'Type has been dropped.' => 'Xx.',
'Type has been created.' => 'Xx.',
'Alter type' => 'Xx',
// Table check constraints
'Checks' => 'Xx',
'Create check' => 'Xx',
'Alter check' => 'Xx',
'Check has been created.' => 'Xx.',
'Check has been altered.' => 'Xx.',
'Check has been dropped.' => 'Xx.',
'Loaded plugins' => 'Xx',
'%s must <a%s>return an array</a>.' => '%s xx <a%s>xx</a>.',
'<a%s>Configure</a> %s in %s.' => '<a%s>Xx</a> %s xx %s.',
'screenshot' => 'xx',
);
// run `php ../../lang.php xx` to update this file

View File

@@ -1,120 +1,232 @@
<?php
$translations = array(
'Login' => '登入',
'Logout successful.' => '成功登出。',
'Invalid credentials.' => '無效的憑證。',
namespace Adminer;
Lang::$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => '資料庫系統',
'Server' => '伺服器',
'Username' => '帳號',
'Password' => '密碼',
'Permanent login' => '永久登入',
'Login' => '登入',
'Logout' => '登出',
'Logged as: %s' => '登錄為: %s',
'Logout successful.' => '成功登出。',
'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>。',
'Invalid credentials.' => '無效的憑證。',
'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
'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>。',
'Database does not support password.' => '資料庫不支援密碼。',
'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
'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 方法讓它永久化。',
'Language' => '語言',
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求請關閉此頁面。',
'No extension' => '無擴充模組',
'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 expired, please login again.' => 'Session 已過期,請重新登入。',
'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
'Refresh' => '重新載入',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '權限',
'Create user' => '建立使用者',
'User has been dropped.' => '已刪除使用者。',
'User has been altered.' => '已修改使用者。',
'User has been created.' => '已建立使用者。',
'Hashed' => 'Hashed',
'Column' => '欄位',
'Routine' => '程序',
'Grant' => '授權',
'Revoke' => '廢除',
'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 的設定值。',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
'You are offline.' => '您離線了。',
'Export' => '匯出',
'Output' => '輸出',
'open' => '打開',
'save' => '儲存',
'Saving' => '保存中',
'Format' => '格式',
'Data' => '資料',
'Database' => '資料庫',
'DB' => '資料庫',
'Use' => '使用',
'Select database' => '選擇資料庫',
'Invalid database.' => '無效的資料庫。',
'Create new database' => '建立新資料庫',
'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.' => '資料庫已刪除。',
'Databases have 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 updated.' => '已更新項目。',
'Item%s has been inserted.' => '已新增項目%s。',
'Edit' => '編輯',
'Insert' => '新增',
'Save and insert next' => '儲存並新增下一筆',
'Delete' => '刪除',
'Database' => '資料',
'Database schema' => '資料庫結構',
// link to current database schema layout
'Permanent link' => '永久連結',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎',
'Collation' => '校對',
'Data Length' => '資料長度',
'Index Length' => '索引長度',
'Data Free' => '資料空閒',
'Rows' => '行數',
'%d in total' => '總共 %d 個',
'Analyze' => '分析',
'Optimize' => '最佳化',
'Vacuum' => '整理Vacuum',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Tables have been truncated.' => '已清空資料表。',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Tables have been moved.' => '已轉移資料表。',
'Copy' => '複製',
'Tables have been copied.' => '資料表已經複製。',
'overwrite' => '覆蓋',
'Routines' => '程序',
'Indexes have been altered.' => '已修改索引。',
'Indexes' => '索引',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'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。請重新發送表單。',
'Comment' => '註解',
'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行被影響',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響。',
'Call' => '呼叫',
'No extension' => '無擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的PHP擴充模組%s',
'Session support must be enabled.' => 'Session 必須被啟用。',
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
'Text length' => 'Text 長度',
'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)' => '列(長度)',
'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 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。',
'Partition by' => '分區類型',
'Partitions' => '分區',
'Partition name' => '分區名稱',
'Values' => '值',
'View' => '檢視表',
'Materialized view' => '物化視圖',
'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' => '回傳類型',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Index Type' => '索引類型',
'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.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
'Triggers' => '觸發器',
'Add trigger' => '建立觸發器',
'Trigger has been dropped.' => '已刪除觸發器。',
'Trigger has been altered.' => '已修改觸發器。',
@@ -123,146 +235,111 @@ $translations = array(
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s版本%s 透過PHP擴充模組 %s',
'%d row(s)' => '%d行',
'Remove' => '移除',
'Are you sure?' => '你確定嗎?',
'Privileges' => '權限',
'Create user' => '建立使用者',
'User has been dropped.' => '已刪除使用者。',
'User has been altered.' => '已修改使用者。',
'User has been created.' => '已建立使用者。',
'Hashed' => 'Hashed',
'Column' => '列',
'Routine' => '程序',
'Grant' => '授權',
'Revoke' => '廢除',
'Logged as: %s' => '登錄為:%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
'Move up' => '上移',
'Move down' => '下移',
'Export' => '匯出',
'Tables' => '資料表',
'Data' => '資料',
'Output' => '輸出',
'open' => '打開',
'save' => '儲存',
'Format' => '格式',
'Functions' => '函數',
'Name' => '名稱',
'select' => '選擇',
'Select' => '選擇',
'Select data' => '選擇資料',
'Functions' => '函式',
'Aggregation' => '集合',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '修改事件',
'Create event' => '建立事件',
'Start' => '開始',
'End' => '結束',
'Every' => '每',
'Status' => '狀態',
'On completion preserve' => '在完成後儲存',
'Events' => '事件',
'Schedule' => '排程',
'At given time' => '在指定時間',
'Tables have been truncated.' => '已清空資料表。',
'Tables have been moved.' => '已轉移資料表。',
'Tables and views' => '資料表和檢視表',
'Engine' => '引擎',
'Collation' => '校對',
'Data Length' => '資料長度',
'Index Length' => '索引長度',
'Data Free' => '資料空閒',
'Rows' => '行數',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '分析',
'Optimize' => '最佳化',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Save and continue edit' => '儲存並繼續編輯',
'original' => '原始',
'%d item(s) have been affected.' => '%d個項目受到影響。',
'whole result' => '所有結果',
'Tables have been dropped.' => '已經將資料表刪除。',
'Clone' => '複製',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加%s。',
'Partition by' => '分區類型',
'Partitions' => '分區',
'Partition name' => '分區名稱',
'Values' => '值',
'%d row(s) have been imported.' => '已匯入%d行。',
'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' => '匯入',
'Stop on error' => '出錯時停止',
'%.3f s' => '%.3f秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '紀錄',
'Variables' => '變數',
'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' => '執行檔案',
'Clear' => '清除',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為%sB',
'%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.' => '您沒有許可權更新這個資料表。',
// data type descriptions
'Numbers' => '數字',
'Date and time' => '日期時間',
'Strings' => '字串',
'Binary' => '二進位',
'Lists' => '列表',
'Network' => '網路',
'Geometry' => '幾何',
'Relations' => '關聯',
'Editor' => '編輯器',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主旨',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
'Webserver file %s' => '網頁伺服器檔案 %s',
'File does not exist.' => '檔案不存在',
'Item has been deleted.' => '該項目已被刪除',
'%d in total' => '總共 %d 個',
'Permanent login' => '永久登入',
'Table has been dropped.' => '已經刪除資料表。',
'Databases have been dropped.' => '資料庫已刪除。',
'Search data in tables' => '在資料庫搜尋',
'Schema' => '資料表結構',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1.$3.$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => '在',
'yes' => '',
'no' => '',
// general SQLite error in create, drop or rename database
'File exists.' => '檔案已存在。',
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改資料表結構',
'Create schema' => '建立資料表結構',
'Schema has been dropped.' => '已刪除資料表結構。',
'Schema has been created.' => '已建立資料表結構。',
'Schema has been altered.' => '已修改資料表結構。',
'Schema' => '資料表結構',
'Invalid schema.' => '無效的資料表結構。',
// PostgreSQL sequences support
'Sequences' => '序列',
'Create sequence' => '建立序列',
'Alter sequence' => '修改序列',
'Sequence has been dropped.' => '已刪除序列。',
'Sequence has been created.' => '已建立序列。',
'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '使用者類型',
'Create type' => '建立類型',
'Alter type' => '修改類型',
'Type has been dropped.' => '已刪除類型。',
'Type has been created.' => '已建立類型。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
'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',
'Alter type' => '修改類型',
);
// run `php ../../lang.php zh-tw` to update this file

Some files were not shown because too many files have changed in this diff Show More