From 2152c00edb111a55c5cfc5b23fcdf348b34e0d59 Mon Sep 17 00:00:00 2001 From: Tim Fischer Date: Mon, 24 Jul 2023 15:01:57 +0200 Subject: [PATCH 001/125] Fix #13920: Fixed erroneous validation for specific cases --- framework/CHANGELOG.md | 1 + framework/assets/yii.activeForm.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index dc620a07486..5933bc3fa43 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.49 under development ------------------------ +- Bug #13920: Fixed erroneous validation for specific cases - Bug #19899: Fixed `GridView` in some cases calling `Model::generateAttributeLabel()` to generate label values that are never used (PowerGamer1) - Bug #9899: Fix caching a MSSQL query with BLOB data type (terabytesoftw) - Bug #16208: Fix `yii\log\FileTarget` to not export empty messages (terabytesoftw) diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index b12f812c37d..5b9ce4aaec2 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -395,9 +395,11 @@ data: $form.serialize() + extData, dataType: data.settings.ajaxDataType, complete: function (jqXHR, textStatus) { + currentAjaxRequest = null; $form.trigger(events.ajaxComplete, [jqXHR, textStatus]); }, beforeSend: function (jqXHR, settings) { + currentAjaxRequest = jqXHR; $form.trigger(events.ajaxBeforeSend, [jqXHR, settings]); }, success: function (msgs) { @@ -563,6 +565,9 @@ return; } + if (currentAjaxRequest !== null) { + currentAjaxRequest.abort(); + } if (data.settings.timer !== undefined) { clearTimeout(data.settings.timer); } @@ -929,4 +934,7 @@ $form.find(attribute.input).attr('aria-invalid', hasError ? 'true' : 'false'); } } + + var currentAjaxRequest = null; + })(window.jQuery); From dcc0290b200f35c2fdec4fd8290f411cf88e219f Mon Sep 17 00:00:00 2001 From: Tim Fischer Date: Mon, 24 Jul 2023 15:49:42 +0200 Subject: [PATCH 002/125] Fix #13920: Added my name to CHANGELOG.md --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 5933bc3fa43..811813e7e86 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,7 +4,7 @@ Yii Framework 2 Change Log 2.0.49 under development ------------------------ -- Bug #13920: Fixed erroneous validation for specific cases +- Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19899: Fixed `GridView` in some cases calling `Model::generateAttributeLabel()` to generate label values that are never used (PowerGamer1) - Bug #9899: Fix caching a MSSQL query with BLOB data type (terabytesoftw) - Bug #16208: Fix `yii\log\FileTarget` to not export empty messages (terabytesoftw) From 9aac121d01348a2c41aa11a7f5c539d618cf93da Mon Sep 17 00:00:00 2001 From: Tim Fischer Date: Wed, 20 Sep 2023 15:12:38 +0200 Subject: [PATCH 003/125] Fix #13920: Add unit test --- tests/js/data/yii.activeForm.html | 12 +++++ tests/js/tests/yii.activeForm.test.js | 69 +++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/tests/js/data/yii.activeForm.html b/tests/js/data/yii.activeForm.html index d44c9f1282b..d278be5b8b8 100644 --- a/tests/js/data/yii.activeForm.html +++ b/tests/js/data/yii.activeForm.html @@ -48,3 +48,15 @@
+
+
+ + +
+
+
+ + +
+
+
diff --git a/tests/js/tests/yii.activeForm.test.js b/tests/js/tests/yii.activeForm.test.js index 16671239ea3..f79599b0747 100644 --- a/tests/js/tests/yii.activeForm.test.js +++ b/tests/js/tests/yii.activeForm.test.js @@ -27,6 +27,21 @@ describe('yii.activeForm', function () { var script = new vm.Script(code); var context = new vm.createContext({window: window, document: window.document, yii: yii}); script.runInContext(context); + /** This is a workaround for a jsdom issue, that prevents :hidden and :visible from working as expected. + * @see https://github.com/jsdom/jsdom/issues/1048 */ + context.window.Element.prototype.getClientRects = function () { + var node = this; + while(node) { + if(node === document) { + break; + } + if (!node.style || node.style.display === 'none' || node.style.visibility === 'hidden') { + return []; + } + node = node.parentNode; + } + return [{width: 100, height: 100}]; + }; } var activeFormHtml = fs.readFileSync('tests/js/data/yii.activeForm.html', 'utf-8'); @@ -117,6 +132,60 @@ describe('yii.activeForm', function () { assert.isFalse($activeForm.data('yiiActiveForm').validated); }); }); + + describe('with ajax validation', function () { + describe('with rapid validation of multiple fields', function () { + it('should cancel overlapping ajax requests and not display outdated validation results', function () { + $activeForm = $('#w3'); + $activeForm.yiiActiveForm([{ + id: 'test-text2', + input: '#test-text2', + container: '.field-test-text2', + enableAjaxValidation: true + }, { + id: 'test-text3', + input: '#test-text3', + container: '.field-test-text3', + enableAjaxValidation: true + }], { + validationUrl: '' + }); + + let requests = []; + function fakeAjax(object) { + const request = { + jqXHR: { + abort: function () { + request.aborted = true; + } + }, + aborted: false, + respond: function (response) { + if (this.aborted) { + return; + } + object.success(response); + object.complete(this.jqXHR, ''); + } + }; + requests.push(request); + object.beforeSend(request.jqXHR, ''); + } + + const ajaxStub = sinon.stub($, 'ajax', fakeAjax); + $activeForm.yiiActiveForm('validateAttribute', 'test-text2'); + assert.isTrue(requests.length === 1); + $activeForm.yiiActiveForm('validateAttribute', 'test-text3'); + // When validateAttribute was called on text2, its value was valid. + // The value of text3 wasn't. + requests[0].respond({'test-text3': ['Field cannot be empty']}); + // When validateAttribute was called on text3, its value was valid. + requests[1].respond([]); + assert.isTrue($activeForm.find('.field-test-text3').hasClass('has-success')); + ajaxStub.restore(); + }); + }); + }) }); describe('resetForm method', function () { From 764926a877f6c407cb85daefcf3324253d137f43 Mon Sep 17 00:00:00 2001 From: lubosdz Date: Thu, 28 Sep 2023 22:34:58 +0200 Subject: [PATCH 004/125] Do not duplicate log messages in memory --- framework/CHANGELOG.md | 1 + framework/log/FileTarget.php | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 0158d4bab33..189d30967f6 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #19984: Do not duplicate log messages in memory (lubosdz) - Bug #19925: Improved PHP version check when handling MIME types (schmunk42) - Bug #19940: File Log writer without newline (terabytesoftw) - Bug #19951: Removed unneeded MIME file tests (schmunk42) diff --git a/framework/log/FileTarget.php b/framework/log/FileTarget.php index d816f73a8db..f80b154aaf9 100644 --- a/framework/log/FileTarget.php +++ b/framework/log/FileTarget.php @@ -107,9 +107,8 @@ public function init() public function export() { $text = implode("\n", array_map([$this, 'formatMessage'], $this->messages)) . "\n"; - $trimmedText = trim($text); - if (empty($trimmedText)) { + if (!trim($text)) { return; // No messages to export, so we exit the function early } From 7f3397a5cce51b378bd1557f2b8a1162f7a34c89 Mon Sep 17 00:00:00 2001 From: lubosdz Date: Sun, 1 Oct 2023 23:31:10 +0200 Subject: [PATCH 005/125] Update framework/log/FileTarget.php Co-authored-by: Bizley --- framework/log/FileTarget.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/log/FileTarget.php b/framework/log/FileTarget.php index f80b154aaf9..d4c267e2ed1 100644 --- a/framework/log/FileTarget.php +++ b/framework/log/FileTarget.php @@ -108,7 +108,7 @@ public function export() { $text = implode("\n", array_map([$this, 'formatMessage'], $this->messages)) . "\n"; - if (!trim($text)) { + if (trim($text) === '') { return; // No messages to export, so we exit the function early } From aec836620fc74f918978924b08648277769b08ac Mon Sep 17 00:00:00 2001 From: Yuriy Bachevskiy Date: Wed, 4 Oct 2023 15:43:18 +0700 Subject: [PATCH 006/125] Update concept-di-container.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сслка "Конфигурация приложения" была не верной, она вела на страницу "Service-locator'a" --- docs/guide-ru/concept-di-container.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/concept-di-container.md b/docs/guide-ru/concept-di-container.md index 80c2c723d86..2812d4bd8fc 100644 --- a/docs/guide-ru/concept-di-container.md +++ b/docs/guide-ru/concept-di-container.md @@ -498,7 +498,7 @@ class HotelController extends Controller как можно раньше. Ниже приведены рекомендуемые практики: * Если вы разработчик приложения, то вы можете зарегистрировать зависимости в конфигурации вашего приложения. - Как это сделать описано в подразделе [Конфигурация приложения](concept-service-locator.md#application-configurations) + Как это сделать описано в подразделе [Конфигурация приложения](concept-configurations.md#application-configurations) раздела [Конфигурации](concept-configurations.md). * Если вы разработчик распространяемого [расширения](structure-extensions.md), то вы можете зарегистрировать зависимости в загрузочном классе расширения. From 48d754cac227418e60dd9ef3be453201345a13a7 Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 5 Oct 2023 18:00:59 +0200 Subject: [PATCH 007/125] Update CHANGELOG.md --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 189d30967f6..887cc9c8c9b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,7 +1,7 @@ Yii Framework 2 Change Log ========================== -2.0.50 under development +2.0.49.1 under development ------------------------ - Bug #19984: Do not duplicate log messages in memory (lubosdz) From 4a1f2c6b9bc90427e91da73f5e8c8fa33d3c53c1 Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 5 Oct 2023 18:12:27 +0200 Subject: [PATCH 008/125] release version 2.0.49.1 --- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 9 +++++---- framework/helpers/mimeTypes.php | 3 +-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/BaseYii.php b/framework/BaseYii.php index 496f6aa121a..061bfe35f59 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.50-dev'; + return '2.0.49.1'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 887cc9c8c9b..06b79df5563 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,16 +1,17 @@ Yii Framework 2 Change Log ========================== -2.0.49.1 under development ------------------------- +2.0.49.1 October 05, 2023 +------------------------- -- Bug #19984: Do not duplicate log messages in memory (lubosdz) - Bug #19925: Improved PHP version check when handling MIME types (schmunk42) - Bug #19940: File Log writer without newline (terabytesoftw) -- Bug #19951: Removed unneeded MIME file tests (schmunk42) - Bug #19950: Fix `Query::groupBy(null)` causes error for PHP 8.1: `trim(): Passing null to parameter #1 ($string) of type string is deprecated` (uaoleg) +- Bug #19951: Removed unneeded MIME file tests (schmunk42) +- Bug #19984: Do not duplicate log messages in memory (lubosdz) - Enh #19780: added pcntl to requirements check (schmunk42) + 2.0.49 August 29, 2023 ---------------------- diff --git a/framework/helpers/mimeTypes.php b/framework/helpers/mimeTypes.php index e91f80f95f8..707bdc7717e 100644 --- a/framework/helpers/mimeTypes.php +++ b/framework/helpers/mimeTypes.php @@ -1003,8 +1003,7 @@ 'zmm' => 'application/vnd.handheld-entertainment+xml', ]; -# fix for bundled libmagic bug, see also https://github.com/yiisoft/yii2/issues/19925 -if ((PHP_VERSION_ID >= 80100 && PHP_VERSION_ID < 80122) || (PHP_VERSION_ID >= 80200 && PHP_VERSION_ID < 80209)) { +if (PHP_VERSION_ID >= 80100) { $mimeTypes = array_replace($mimeTypes, array('xz' => 'application/octet-stream')); } From 290e03cddc04a6568ad82bb1279c4834025bd573 Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 5 Oct 2023 18:12:47 +0200 Subject: [PATCH 009/125] prepare for next release --- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/BaseYii.php b/framework/BaseYii.php index 061bfe35f59..496f6aa121a 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.49.1'; + return '2.0.50-dev'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 06b79df5563..8c3d204757c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,6 +1,12 @@ Yii Framework 2 Change Log ========================== +2.0.50 under development +------------------------ + +- no changes in this release. + + 2.0.49.1 October 05, 2023 ------------------------- From 9f51fe3b4b84a35e84f0bb5e9378d57eecbcbfae Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Fri, 6 Oct 2023 10:02:32 +0200 Subject: [PATCH 010/125] Revert changes in `mimeTypes.php` from 4a1f2c6b9bc90427e91da73f5e8c8fa33d3c53c1 restores https://github.com/yiisoft/yii2/pull/19936 --- framework/CHANGELOG.md | 3 +-- framework/helpers/mimeTypes.php | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 8c3d204757c..35e8ebde9b7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,13 +4,12 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ -- no changes in this release. +- Bug #19925: Improved PHP version check when handling MIME types (schmunk42) 2.0.49.1 October 05, 2023 ------------------------- -- Bug #19925: Improved PHP version check when handling MIME types (schmunk42) - Bug #19940: File Log writer without newline (terabytesoftw) - Bug #19950: Fix `Query::groupBy(null)` causes error for PHP 8.1: `trim(): Passing null to parameter #1 ($string) of type string is deprecated` (uaoleg) - Bug #19951: Removed unneeded MIME file tests (schmunk42) diff --git a/framework/helpers/mimeTypes.php b/framework/helpers/mimeTypes.php index 707bdc7717e..e91f80f95f8 100644 --- a/framework/helpers/mimeTypes.php +++ b/framework/helpers/mimeTypes.php @@ -1003,7 +1003,8 @@ 'zmm' => 'application/vnd.handheld-entertainment+xml', ]; -if (PHP_VERSION_ID >= 80100) { +# fix for bundled libmagic bug, see also https://github.com/yiisoft/yii2/issues/19925 +if ((PHP_VERSION_ID >= 80100 && PHP_VERSION_ID < 80122) || (PHP_VERSION_ID >= 80200 && PHP_VERSION_ID < 80209)) { $mimeTypes = array_replace($mimeTypes, array('xz' => 'application/octet-stream')); } From 7665e562163495bd88ea4849d10c800175db5d85 Mon Sep 17 00:00:00 2001 From: salehhashemi1992 <81674631+salehhashemi1992@users.noreply.github.com> Date: Sat, 7 Oct 2023 22:34:56 +0330 Subject: [PATCH 011/125] update actions/checkout to v4 --- .github/workflows/build.yml | 2 +- .github/workflows/ci-mssql.yml | 2 +- .github/workflows/ci-mysql.yml | 2 +- .github/workflows/ci-node.yml | 2 +- .github/workflows/ci-oracle.yml | 2 +- .github/workflows/ci-pgsql.yml | 2 +- .github/workflows/ci-sqlite.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30b988edb4f..6c3b0dcc341 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,7 +71,7 @@ jobs: run: sudo locale-gen fr_FR.UTF-8 - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install PHP. uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index 94255d93ebe..777f91fd306 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -43,7 +43,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create MS SQL Database run: docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index a948a9e4cae..a1c201b07c9 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -44,7 +44,7 @@ jobs: steps: - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install PHP with extensions. uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/ci-node.yml b/.github/workflows/ci-node.yml index 0d937733554..3f49942b84a 100644 --- a/.github/workflows/ci-node.yml +++ b/.github/workflows/ci-node.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install dependencies. run: composer update $DEFAULT_COMPOSER_FLAGS diff --git a/.github/workflows/ci-oracle.yml b/.github/workflows/ci-oracle.yml index 21520a1045b..be139ff540c 100644 --- a/.github/workflows/ci-oracle.yml +++ b/.github/workflows/ci-oracle.yml @@ -35,7 +35,7 @@ jobs: steps: - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install PHP with extensions. uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index edaf4a5df5d..8c623c283be 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -48,7 +48,7 @@ jobs: steps: - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install PHP with extensions uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index b82d187ef9a..e163da11004 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout. - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install PHP with extensions. uses: shivammathur/setup-php@v2 From 4addf02c262c203f482690288027b0be30cd679b Mon Sep 17 00:00:00 2001 From: Bizley Date: Sun, 8 Oct 2023 13:03:48 +0200 Subject: [PATCH 012/125] Fix mime type generator --- build/controllers/MimeTypeController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/controllers/MimeTypeController.php b/build/controllers/MimeTypeController.php index 9da23f67fcd..fd0275579ff 100644 --- a/build/controllers/MimeTypeController.php +++ b/build/controllers/MimeTypeController.php @@ -124,7 +124,8 @@ private function generateMimeTypesFile($outFile, $content) */ \$mimeTypes = $array; -if (PHP_VERSION_ID >= 80100) { +# fix for bundled libmagic bug, see also https://github.com/yiisoft/yii2/issues/19925 +if ((PHP_VERSION_ID >= 80100 && PHP_VERSION_ID < 80122) || (PHP_VERSION_ID >= 80200 && PHP_VERSION_ID < 80209)) { \$mimeTypes = array_replace(\$mimeTypes, array('xz' => 'application/octet-stream')); } From 0726714e55bee5d502233cd00cfee0e08b7463d6 Mon Sep 17 00:00:00 2001 From: Bizley Date: Sun, 8 Oct 2023 13:20:43 +0200 Subject: [PATCH 013/125] Added note --- build/controllers/MimeTypeController.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build/controllers/MimeTypeController.php b/build/controllers/MimeTypeController.php index fd0275579ff..7986dd56cc8 100644 --- a/build/controllers/MimeTypeController.php +++ b/build/controllers/MimeTypeController.php @@ -121,6 +121,9 @@ private function generateMimeTypesFile($outFile, $content) * Its content is generated from the apache http mime.types file. * https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=markup * This file has been placed in the public domain for unlimited redistribution. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ \$mimeTypes = $array; @@ -149,6 +152,9 @@ private function generateMimeAliasesFile($outFile) * MIME aliases. * * This file contains aliases for MIME types. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ return $array; @@ -210,6 +216,9 @@ private function generateMimeExtensionsFile($outFile, $content) * Its content is generated from the apache http mime.types file. * https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=markup * This file has been placed in the public domain for unlimited redistribution. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ return $array; From 049e37c0a55fd4d1ba6af1b48a4dfeb3019c4613 Mon Sep 17 00:00:00 2001 From: Yuriy Bachevskiy Date: Thu, 12 Oct 2023 21:11:11 +0700 Subject: [PATCH 014/125] Update structure-controllers.md (#20003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit добавил пропущенное слово "как" --- docs/guide-ru/structure-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/structure-controllers.md b/docs/guide-ru/structure-controllers.md index c55a8cf1517..5765f26c16a 100644 --- a/docs/guide-ru/structure-controllers.md +++ b/docs/guide-ru/structure-controllers.md @@ -310,7 +310,7 @@ class HelloWorldAction extends Action [[yii\console\Response::exitStatus|статус выхода]] исполнения команды. В вышеприведенных примерах, все результаты действий являются строками, которые будут использованы в качестве тела ответа, -высланного пользователю. Следующий пример, показывает действие может перенаправить браузер пользователя на новый URL, с помощью +высланного пользователю. Следующий пример, показывает как действие может перенаправить браузер пользователя на новый URL, с помощью возврата response объекта (т. к. [[yii\web\Controller::redirect()|redirect()]] метод возвращает response объект): ```php From 33254d5dad03009ecb64fe754bb52e6a247e21b6 Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 12 Oct 2023 17:43:55 +0200 Subject: [PATCH 015/125] Update CHANGELOG.md 2.0.49.2 changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 35e8ebde9b7..e7a09902e16 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,7 +1,7 @@ Yii Framework 2 Change Log ========================== -2.0.50 under development +2.0.49.2 under development ------------------------ - Bug #19925: Improved PHP version check when handling MIME types (schmunk42) From 4f1735995ad1dfe5b8c51807d1e07ac1ee54a04d Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 12 Oct 2023 17:46:26 +0200 Subject: [PATCH 016/125] release version 2.0.49.2 --- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 4 ++-- framework/helpers/mimeAliases.php | 3 +++ framework/helpers/mimeExtensions.php | 3 +++ framework/helpers/mimeTypes.php | 3 +++ 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/framework/BaseYii.php b/framework/BaseYii.php index 496f6aa121a..fe2301b0fdb 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.50-dev'; + return '2.0.49.2'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e7a09902e16..ecf64bb49a6 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,8 +1,8 @@ Yii Framework 2 Change Log ========================== -2.0.49.2 under development ------------------------- +2.0.49.2 October 12, 2023 +------------------------- - Bug #19925: Improved PHP version check when handling MIME types (schmunk42) diff --git a/framework/helpers/mimeAliases.php b/framework/helpers/mimeAliases.php index 4cd89888a77..a9e677adcbd 100644 --- a/framework/helpers/mimeAliases.php +++ b/framework/helpers/mimeAliases.php @@ -3,6 +3,9 @@ * MIME aliases. * * This file contains aliases for MIME types. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ return [ 'text/rtf' => 'application/rtf', diff --git a/framework/helpers/mimeExtensions.php b/framework/helpers/mimeExtensions.php index 946d61cd0c5..e4936030fd8 100644 --- a/framework/helpers/mimeExtensions.php +++ b/framework/helpers/mimeExtensions.php @@ -8,6 +8,9 @@ * Its content is generated from the apache http mime.types file. * https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=markup * This file has been placed in the public domain for unlimited redistribution. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ return [ 'application/andrew-inset' => 'ez', diff --git a/framework/helpers/mimeTypes.php b/framework/helpers/mimeTypes.php index e91f80f95f8..f895e8d0728 100644 --- a/framework/helpers/mimeTypes.php +++ b/framework/helpers/mimeTypes.php @@ -7,6 +7,9 @@ * Its content is generated from the apache http mime.types file. * https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=markup * This file has been placed in the public domain for unlimited redistribution. + * + * All extra changes made to this file must be comitted to /build/controllers/MimeTypeController.php + * otherwise they will be lost on next build. */ $mimeTypes = [ 123 => 'application/vnd.lotus-1-2-3', From 505fd5a2f827f99e34351045ace542676674fb77 Mon Sep 17 00:00:00 2001 From: Bizley Date: Thu, 12 Oct 2023 17:46:49 +0200 Subject: [PATCH 017/125] prepare for next release --- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/BaseYii.php b/framework/BaseYii.php index fe2301b0fdb..496f6aa121a 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.49.2'; + return '2.0.50-dev'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ecf64bb49a6..a2540e5d7f1 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,6 +1,12 @@ Yii Framework 2 Change Log ========================== +2.0.50 under development +------------------------ + +- no changes in this release. + + 2.0.49.2 October 12, 2023 ------------------------- From 02ed8080564339c95e9e2f489344c6551ee25758 Mon Sep 17 00:00:00 2001 From: PowerGamer1 Date: Thu, 13 Jul 2023 15:36:16 +0300 Subject: [PATCH 018/125] New methods: BaseActiveRecord::loadRelations() and BaseActiveRecord::loadRelationsFor(). --- framework/CHANGELOG.md | 2 +- framework/db/BaseActiveRecord.php | 53 +++++++++++++++++++++++++ tests/framework/db/ActiveRecordTest.php | 47 ++++++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a2540e5d7f1..a0269390530 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,7 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ -- no changes in this release. +- Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 61cf3774094..ab5414416c5 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -1787,4 +1787,57 @@ private function isValueDifferent($newValue, $oldValue) return $newValue !== $oldValue; } + + /** + * Eager loads related models for the already loaded primary models. + * + * Helps to reduce the number of queries performed against database if some related models are only used + * when a specific condition is met. For example: + * + * ```php + * $customers = Customer::find()->where(['country_id' => 123])->all(); + * if (Yii:app()->getUser()->getIdentity()->canAccessOrders()) { + * Customer::loadRelationsFor($customers, 'orders.items'); + * } + * ``` + * + * @param array|ActiveRecordInterface[] $models array of primary models. Each model should have the same type and can be: + * - an active record instance; + * - active record instance represented by array (i.e. active record was loaded using [[ActiveQuery::asArray()]]). + * @param string|array $relationNames the names of the relations of primary models to be loaded from database. See [[ActiveQueryInterface::with()]] on how to specify this argument. + * @param bool $asArray whether to load each related model as an array or an object (if the relation itself does not specify that). + * @since 2.0.49 + */ + public static function loadRelationsFor(&$models, $relationNames, $asArray = false) + { + // ActiveQueryTrait::findWith() called below assumes $models array is non-empty. + if (empty($models)) { + return; + } + + static::find()->asArray($asArray)->findWith((array)$relationNames, $models); + } + + /** + * Eager loads related models for the already loaded primary model. + * + * Helps to reduce the number of queries performed against database if some related models are only used + * when a specific condition is met. For example: + * + * ```php + * $customer = Customer::find()->where(['id' => 123])->one(); + * if (Yii:app()->getUser()->getIdentity()->canAccessOrders()) { + * $customer->loadRelations('orders.items'); + * } + * ``` + * + * @param string|array $relationNames the names of the relations of this model to be loaded from database. See [[ActiveQueryInterface::with()]] on how to specify this argument. + * @param bool $asArray whether to load each relation as an array or an object (if the relation itself does not specify that). + * @since 2.0.49 + */ + public function loadRelations($relationNames, $asArray = false) + { + $models = [$this]; + static::loadRelationsFor($models, $relationNames, $asArray); + } } diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index b74803b94dd..e50cca3e024 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -2225,6 +2225,53 @@ public function testGetAttributeLabel($model) $attr = 'model2.doesNotExist.attr1'; $this->assertEquals($model->generateAttributeLabel($attr), $model->getAttributeLabel($attr)); } + + public function testLoadRelations() + { + // Test eager loading relations for multiple primary models using loadRelationsFor(). + /** @var Customer[] $customers */ + $customers = Customer::find()->all(); + Customer::loadRelationsFor($customers, ['orders.items']); + foreach ($customers as $customer) { + $this->assertTrue($customer->isRelationPopulated('orders')); + foreach ($customer->orders as $order) { + $this->assertTrue($order->isRelationPopulated('items')); + } + } + + // Test eager loading relations as arrays. + /** @var array $customers */ + $customers = Customer::find()->asArray(true)->all(); + Customer::loadRelationsFor($customers, ['orders.items' => function ($query) { $query->asArray(false); }], true); + foreach ($customers as $customer) { + $this->assertTrue(isset($customer['orders'])); + $this->assertTrue(is_array($customer['orders'])); + foreach ($customer['orders'] as $order) { + $this->assertTrue(is_array($order)); + $this->assertTrue(isset($order['items'])); + $this->assertTrue(is_array($order['items'])); + foreach ($order['items'] as $item) { + $this->assertFalse(is_array($item)); + } + } + } + + // Test eager loading relations for a single primary model using loadRelations(). + /** @var Customer $customer */ + $customer = Customer::find()->where(['id' => 1])->one(); + $customer->loadRelations('orders.items'); + $this->assertTrue($customer->isRelationPopulated('orders')); + foreach ($customer->orders as $order) { + $this->assertTrue($order->isRelationPopulated('items')); + } + + // Test eager loading previously loaded relation (relation value should be replaced with a new value loaded from database). + /** @var Customer $customer */ + $customer = Customer::find()->where(['id' => 2])->with(['orders' => function ($query) { $query->orderBy(['id' => SORT_ASC]); }])->one(); + $this->assertTrue($customer->orders[0]->id < $customer->orders[1]->id, 'Related models should be sorted by ID in ascending order.'); + $customer->loadRelations(['orders' => function ($query) { $query->orderBy(['id' => SORT_DESC]); }]); + $this->assertTrue($customer->orders[0]->id > $customer->orders[1]->id, 'Related models should be sorted by ID in descending order.'); + } } class LabelTestModel1 extends \yii\db\ActiveRecord From 9875ae6445b61bc117ae319bf00564f276c06663 Mon Sep 17 00:00:00 2001 From: Brad Bell Date: Fri, 13 Oct 2023 10:26:42 -0700 Subject: [PATCH 019/125] Fixed a bug where the yii serve command would break if a custom router was supplied and it had a space in the path --- framework/console/controllers/ServeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/console/controllers/ServeController.php b/framework/console/controllers/ServeController.php index 68a7e50c286..d02c982042e 100644 --- a/framework/console/controllers/ServeController.php +++ b/framework/console/controllers/ServeController.php @@ -80,7 +80,7 @@ public function actionIndex($address = 'localhost') } $this->stdout("Quit the server with CTRL-C or COMMAND-C.\n"); - passthru('"' . PHP_BINARY . '"' . " -S {$address} -t \"{$documentRoot}\" $router"); + passthru('"' . PHP_BINARY . '"' . " -S {$address} -t \"{$documentRoot}\" \"$router\""); } /** From 3014fa22e55dee30099475506370f87cec404eb2 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Sat, 14 Oct 2023 12:28:22 +0800 Subject: [PATCH 020/125] fix: #20002 optimize head request on serializeDataProvider --- framework/rest/Serializer.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/rest/Serializer.php b/framework/rest/Serializer.php index edc689e94e8..eedd96c2cc6 100644 --- a/framework/rest/Serializer.php +++ b/framework/rest/Serializer.php @@ -188,6 +188,12 @@ protected function getRequestedFields() */ protected function serializeDataProvider($dataProvider) { + if (($pagination = $dataProvider->getPagination()) !== false) { + $this->addPaginationHeaders($pagination); + } + if ($this->request->getIsHead()) { + return null; + } if ($this->preserveKeys) { $models = $dataProvider->getModels(); } else { @@ -195,13 +201,7 @@ protected function serializeDataProvider($dataProvider) } $models = $this->serializeModels($models); - if (($pagination = $dataProvider->getPagination()) !== false) { - $this->addPaginationHeaders($pagination); - } - - if ($this->request->getIsHead()) { - return null; - } elseif ($this->collectionEnvelope === null) { + if ($this->collectionEnvelope === null) { return $models; } From 6ceb6f65f4345b46d74f8383346c1b2c117369df Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Sun, 15 Oct 2023 06:28:12 -0300 Subject: [PATCH 021/125] Fix `MaskedInputAsset::class`. --- composer.json | 4 ++-- framework/composer.json | 4 ++-- framework/widgets/MaskedInputAsset.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index ed19e7cce4c..ef5d068f59d 100644 --- a/composer.json +++ b/composer.json @@ -76,8 +76,8 @@ "ezyang/htmlpurifier": "^4.6", "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", - "bower-asset/inputmask": "~3.2.2 | ~3.3.5 | ~5.0.8 ", - "bower-asset/punycode": "1.3.* | 2.2.*", + "bower-asset/inputmask": "^5.0.8 ", + "bower-asset/punycode": "^2.2", "bower-asset/yii2-pjax": "~2.0.1", "paragonie/random_compat": ">=1" }, diff --git a/framework/composer.json b/framework/composer.json index 951679faec9..ff36473707c 100644 --- a/framework/composer.json +++ b/framework/composer.json @@ -71,8 +71,8 @@ "ezyang/htmlpurifier": "^4.6", "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", - "bower-asset/inputmask": "~3.2.2 | ~3.3.5 | ~5.0.8 ", - "bower-asset/punycode": "1.3.* | 2.2.*", + "bower-asset/inputmask": "^5.0.8 ", + "bower-asset/punycode": "^2.2", "bower-asset/yii2-pjax": "~2.0.1", "paragonie/random_compat": ">=1" }, diff --git a/framework/widgets/MaskedInputAsset.php b/framework/widgets/MaskedInputAsset.php index 57748be86f8..473f4315ffa 100644 --- a/framework/widgets/MaskedInputAsset.php +++ b/framework/widgets/MaskedInputAsset.php @@ -21,7 +21,7 @@ class MaskedInputAsset extends AssetBundle { public $sourcePath = '@bower/inputmask/dist'; public $js = [ - 'jquery.inputmask.bundle.js', + 'jquery.inputmask.js', ]; public $depends = [ 'yii\web\YiiAsset', From 961a952f82ac7bb26045f741c323632ed9deaaea Mon Sep 17 00:00:00 2001 From: Alexandru Trandafir Catalin Date: Mon, 16 Oct 2023 10:17:02 +0300 Subject: [PATCH 022/125] Fix #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages --- framework/CHANGELOG.md | 1 + .../console/controllers/MessageController.php | 161 +++++++++++------- 2 files changed, 97 insertions(+), 65 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a0269390530..2ec245ea228 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index e1a73576903..6d5a7d6448f 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -353,17 +353,7 @@ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messag foreach ($rows as $row) { $currentMessages[$row['category']][$row['id']] = $row['message']; } - - $currentLanguages = []; - $rows = (new Query())->select(['language'])->from($messageTable)->groupBy('language')->all($db); - foreach ($rows as $row) { - $currentLanguages[] = $row['language']; - } - $missingLanguages = []; - if (!empty($currentLanguages)) { - $missingLanguages = array_diff($languages, $currentLanguages); - } - + $new = []; $obsolete = []; @@ -372,89 +362,130 @@ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messag if (isset($currentMessages[$category])) { $new[$category] = array_diff($msgs, $currentMessages[$category]); + // obsolete messages per category $obsolete += array_diff($currentMessages[$category], $msgs); } else { $new[$category] = $msgs; } } - + + // obsolete categories foreach (array_diff(array_keys($currentMessages), array_keys($messages)) as $category) { $obsolete += $currentMessages[$category]; } if (!$removeUnused) { foreach ($obsolete as $pk => $msg) { + // skip already marked unused if (strncmp($msg, '@@', 2) === 0 && substr($msg, -2) === '@@') { unset($obsolete[$pk]); } } - } - - $obsolete = array_keys($obsolete); + } + $this->stdout('Inserting new messages...'); - $savedFlag = false; + $insertCount = 0; foreach ($new as $category => $msgs) { foreach ($msgs as $msg) { - $savedFlag = true; - $lastPk = $db->schema->insert($sourceMessageTable, ['category' => $category, 'message' => $msg]); - foreach ($languages as $language) { - $db->createCommand() - ->insert($messageTable, ['id' => $lastPk['id'], 'language' => $language]) - ->execute(); - } - } - } - - if (!empty($missingLanguages)) { - $updatedMessages = []; - $rows = (new Query())->select(['id', 'category', 'message'])->from($sourceMessageTable)->all($db); - foreach ($rows as $row) { - $updatedMessages[$row['category']][$row['id']] = $row['message']; - } - foreach ($updatedMessages as $category => $msgs) { - foreach ($msgs as $id => $msg) { - $savedFlag = true; - foreach ($missingLanguages as $language) { - $db->createCommand() - ->insert($messageTable, ['id' => $id, 'language' => $language]) - ->execute(); - } - } + $insertCount++; + $db->schema->insert($sourceMessageTable, ['category' => $category, 'message' => $msg]); } } - - $this->stdout($savedFlag ? "saved.\n" : "Nothing to save.\n"); + + $this->stdout($insertCount ? "{$insertCount} saved.\n" : "Nothing to save.\n"); + $this->stdout($removeUnused ? 'Deleting obsoleted messages...' : 'Updating obsoleted messages...'); if (empty($obsolete)) { $this->stdout("Nothing obsoleted...skipped.\n"); - return; } - if ($removeUnused) { - $db->createCommand() - ->delete($sourceMessageTable, ['in', 'id', $obsolete]) - ->execute(); - $this->stdout("deleted.\n"); - } elseif ($markUnused) { - $rows = (new Query()) - ->select(['id', 'message']) - ->from($sourceMessageTable) - ->where(['in', 'id', $obsolete]) - ->all($db); - - foreach ($rows as $row) { - $db->createCommand()->update( - $sourceMessageTable, - ['message' => '@@' . $row['message'] . '@@'], - ['id' => $row['id']] - )->execute(); + if ($obsolete) { + if ($removeUnused) { + $affected = $db->createCommand() + ->delete($sourceMessageTable, ['in', 'id', array_keys($obsolete)]) + ->execute(); + $this->stdout("{$affected} deleted.\n"); + } elseif ($markUnused) { + $marked=0; + $rows = (new Query()) + ->select(['id', 'message']) + ->from($sourceMessageTable) + ->where(['in', 'id', array_keys($obsolete)]) + ->all($db); + + foreach ($rows as $row) { + $marked++; + $db->createCommand()->update( + $sourceMessageTable, + ['message' => '@@' . $row['message'] . '@@'], + ['id' => $row['id']] + )->execute(); + } + $this->stdout("{$marked} updated.\n"); + } else { + $this->stdout("kept untouched.\n"); } - $this->stdout("updated.\n"); - } else { - $this->stdout("kept untouched.\n"); } + + // get fresh message id list + $freshMessagesIds = []; + $rows = (new Query())->select(['id'])->from($sourceMessageTable)->all($db); + foreach ($rows as $row) { + $freshMessagesIds[] = $row['id']; + } + + $this->stdout("Generating missing rows..."); + $generatedMissingRows = []; + + foreach ($languages as $language) { + $count = 0; + + // get list of ids of translations for this language + $msgRowsIds = []; + $msgRows = (new Query())->select(['id'])->from($messageTable)->where([ + 'language'=>$language, + ])->all($db); + foreach ($msgRows as $row) { + $msgRowsIds[] = $row['id']; + } + + // insert missing + foreach ($freshMessagesIds as $id) { + if (!in_array($id, $msgRowsIds)) { + $db->createCommand() + ->insert($messageTable, ['id' => $id, 'language' => $language]) + ->execute(); + $count++; + } + } + if ($count) { + $generatedMissingRows[] = "{$count} for {$language}"; + } + } + + $this->stdout($generatedMissingRows ? implode(", ", $generatedMissingRows).".\n" : "Nothing to do.\n"); + + $this->stdout("Dropping unused languages..."); + $droppedLanguages=[]; + + $currentLanguages = []; + $rows = (new Query())->select(['language'])->from($messageTable)->groupBy('language')->all($db); + foreach ($rows as $row) { + $currentLanguages[] = $row['language']; + } + + foreach ($currentLanguages as $currentLanguage) { + if (!in_array($currentLanguage, $languages)) { + $deleted=$db->createCommand()->delete($messageTable, "language=:language", [ + 'language'=>$currentLanguage, + ])->execute(); + $droppedLanguages[] = "removed {$deleted} rows for $currentLanguage"; + } + } + + $this->stdout($droppedLanguages ? implode(", ", $droppedLanguages).".\n" : "Nothing to do.\n"); } /** From b9a30a8df2cb2ca1ebfba959af1fb109973d4e12 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 15:56:32 +0800 Subject: [PATCH 023/125] feat: add HEAD unit test serializer --- tests/framework/rest/SerializerTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 361aba38a91..48627eeeca8 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -9,7 +9,9 @@ use yii\base\Model; use yii\data\ArrayDataProvider; +use yii\data\DataProviderInterface; use yii\rest\Serializer; +use yii\web\Request; use yiiunit\TestCase; /** @@ -413,6 +415,16 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $serializer->preserveKeys = $saveKeys; $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + + $_SERVER['REQUEST_METHOD'] = 'HEAD'; + $request = new Request(); + $_POST[$request->methodParam] = 'HEAD'; + $serializer = new Serializer([ + 'request' => $request + ]); + $serializer->preserveKeys = $saveKeys; + $this->assertEmpty($serializer->serialize($dataProvider)); + unset($_POST[$request->methodParam], $_SERVER['REQUEST_METHOD']); } /** From 5d8a96ee0d0ba0971e48c0390490888417773d83 Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Wed, 18 Oct 2023 11:31:40 +0330 Subject: [PATCH 024/125] Added 'zh' into 'framework/messages/config.php' (#19995) --- framework/messages/config.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/messages/config.php b/framework/messages/config.php index 93845f2e0a9..6028328f315 100644 --- a/framework/messages/config.php +++ b/framework/messages/config.php @@ -15,8 +15,7 @@ 'languages' => [ 'af', 'ar', 'az', 'be', 'bg', 'bs', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa', 'fi', 'fr', 'he', 'hi', 'pt-BR', 'ro', 'hr', 'hu', 'hy', 'id', 'it', 'ja', 'ka', 'kk', 'ko', 'kz', 'lt', 'lv', 'ms', 'nb-NO', 'nl', - 'pl', 'pt', 'ru', 'sk', 'sl', 'sr', 'sr-Latn', 'sv', 'tg', 'th', 'tr', 'uk', 'uz', 'uz-Cy', 'vi', 'zh-CN', - 'zh-TW' + 'pl', 'pt', 'ru', 'sk', 'sl', 'sr', 'sr-Latn', 'sv', 'tg', 'th', 'tr', 'uk', 'uz', 'uz-Cy', 'vi', 'zh', 'zh-TW' ], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be From c314febd95ee5f114075549e64089075ef48d677 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:02:48 +0800 Subject: [PATCH 025/125] core: add changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 64e997ee82e..ee2a23a65d8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,7 +7,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - +- Bug #20002: fixed superfluous query on HEAD request in serializer 2.0.49.2 October 12, 2023 ------------------------- From e11819ddbe741bfc6b9d808cdc14aea32ceb2380 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:16:42 +0800 Subject: [PATCH 026/125] fix: changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ee2a23a65d8..e08d38fe4e5 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,8 +6,8 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Bug #20002: fixed superfluous query on HEAD request in serializer +- Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 ------------------------- From b4697641d398a5ccf5f2691dd5be43949ad93c3c Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:18:29 +0800 Subject: [PATCH 027/125] fix: changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e08d38fe4e5..22503c8dde8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Bug #20002: fixed superfluous query on HEAD request in serializer +- Bug #20002: fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 From 344b0aecf35acb79417de3b812de00a01941222c Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:36:43 +0800 Subject: [PATCH 028/125] core: add collectionEnvelope unit test --- tests/framework/rest/SerializerTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 48627eeeca8..e057a1446b4 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -416,6 +416,12 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + $serializer = new Serializer(); + $serializer->preserveKeys = $saveKeys; + $serializer->collectionEnvelope = 'data'; + + $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)['data']); + $_SERVER['REQUEST_METHOD'] = 'HEAD'; $request = new Request(); $_POST[$request->methodParam] = 'HEAD'; From fd241defd04c35f67b52efc6719bf0e76542b202 Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Thu, 19 Oct 2023 18:45:54 +0330 Subject: [PATCH 029/125] Update the Persian translation file (#20016) Signed-off-by: Nabi --- framework/messages/fa/yii.php | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/framework/messages/fa/yii.php b/framework/messages/fa/yii.php index ec97c548788..5e342948063 100644 --- a/framework/messages/fa/yii.php +++ b/framework/messages/fa/yii.php @@ -45,8 +45,8 @@ 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'نمایش {begin, number} تا {end, number} مورد از کل {totalCount, number} مورد.', 'The combination {values} of {attributes} has already been taken.' => 'مقدار {values} از {attributes} قبلاً گرفته شده است.', 'The file "{file}" is not an image.' => 'فایل "{file}" یک تصویر نیست.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'حجم فایل "{file}" بسیار بیشتر می باشد. حجم آن نمی تواند از {formattedLimit} بیشتر باشد.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'حجم فایل "{file}" بسیار کم می باشد. حجم آن نمی تواند از {formattedLimit} کمتر باشد.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'حجم فایل "{file}" بسیار بیشتر می‌باشد. حجم آن نمی‌تواند از {formattedLimit} بیشتر باشد.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'حجم فایل "{file}" بسیار کم می‌باشد. حجم آن‌نمی تواند از {formattedLimit} کمتر باشد.', 'The format of {attribute} is invalid.' => 'قالب {attribute} نامعتبر است.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی بزرگ است. ارتفاع نمی‌تواند بزرگتر از {limit, number} پیکسل باشد.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی بزرگ است. عرض نمی‌تواند بزرگتر از {limit, number} پیکسل باشد.', @@ -71,9 +71,9 @@ 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta} ساعت دیگر', 'just now' => 'هم اکنون', 'the input value' => 'مقدار ورودی', - '{attribute} "{value}" has already been taken.' => '{attribute} با مقدار "{value}" در حال حاضر گرفته‌شده است.', + '{attribute} "{value}" has already been taken.' => '{attribute} در حال حاضر با مقدار "{value}" گرفته شده است.', '{attribute} cannot be blank.' => '{attribute} نمی‌تواند خالی باشد.', - '{attribute} contains wrong subnet mask.' => '{attribute} شامل فرمت زیرشبکه اشتباه است.', + '{attribute} contains wrong subnet mask.' => '{attribute} شامل فرمت پوشش زیرشبکه (subnet mask) اشتباه است.', '{attribute} is invalid.' => '{attribute} معتبر نیست.', '{attribute} is not a valid URL.' => '{attribute} یک URL معتبر نیست.', '{attribute} is not a valid email address.' => '{attribute} یک آدرس ایمیل معتبر نیست.', @@ -82,17 +82,17 @@ '{attribute} must be a number.' => '{attribute} باید یک عدد باشد.', '{attribute} must be a string.' => '{attribute} باید یک رشته باشد.', '{attribute} must be a valid IP address.' => '{attribute} باید یک آدرس IP معتبر باشد.', - '{attribute} must be an IP address with specified subnet.' => '{attribute} باید یک IP آدرس با زیرشبکه بخصوص باشد.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} باید یک آدرس IP با زیرشبکه (subnet) مشخص شده باشد.', '{attribute} must be an integer.' => '{attribute} باید یک عدد صحیح باشد.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} باید "{true}" و یا "{false}" باشد.', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} باید با "{compareValueOrAttribute}" برابر باشد.', - '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} باید بزرگتر از "{compareValueOrAttribute}" باشد.', - '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} باید بزرگتر یا برابر با "{compareValueOrAttribute}" باشد.', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} باید بیشتر از "{compareValueOrAttribute}" باشد.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} باید بیشتر یا برابر با "{compareValueOrAttribute}" باشد.', '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} باید کمتر از "{compareValueOrAttribute}" باشد.', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} باید کمتر یا برابر با "{compareValueOrAttribute}" باشد.', '{attribute} must be no greater than {max}.' => '{attribute} نباید بیشتر از "{max}" باشد.', '{attribute} must be no less than {min}.' => '{attribute} نباید کمتر از "{min}" باشد.', - '{attribute} must not be a subnet.' => '{attribute} نباید یک زیرشبکه باشد.', + '{attribute} must not be a subnet.' => '{attribute} نباید یک زیرشبکه (subnet) باشد.', '{attribute} must not be an IPv4 address.' => '{attribute} نباید آدرس IPv4 باشد.', '{attribute} must not be an IPv6 address.' => '{attribute} نباید آدرس IPv6 باشد.', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} نباید برابر با "{compareValueOrAttribute}" باشد.', @@ -114,7 +114,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -122,6 +121,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} بایت', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} گیبی‌بایت', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} گیگابایت', @@ -133,4 +133,15 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} پتابایت', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} تبی‌بایت', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} ترابایت', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" از عملگر "{operator}" پشتیبانی نمی‌کند.', + 'Action not found.' => 'عمل یافت نشد.', + 'Aliases available: {aliases}' => 'نام مستعارهای موجود: {aliases}', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'شرط برای "{attribute}" باید یک مقدار یا مشخصه‌ی عملگر معتبر باشد.', + 'Operator "{operator}" must be used with a search attribute.' => 'عملگر "{operator}" باید با یک ویژگی جستجو استفاده شود.', + 'Operator "{operator}" requires multiple operands.' => 'عملگر "{operator}" به چند عملوند نیاز دارد.', + 'Options available: {options}' => 'گزینه‌های موجود: {options}', + 'The format of {filter} is invalid.' => 'قالب {filter} نامعتبر است.', + 'Unknown filter attribute "{attribute}"' => 'ویژگی "{attribute}" فیلتر ناشناخته', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'شما باید حداقل {limit, number} فایل آپلود کنید.', + '{compareAttribute} is invalid.' => '{compareAttribute} نامعتبر است.', ]; From e0299884fee00122ea8ad3bb52c7ab7d892192f7 Mon Sep 17 00:00:00 2001 From: Saleh Hashemi <81674631+salehhashemi1992@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:57:52 +0330 Subject: [PATCH 030/125] Introduce createFormatter Static Method for Formatter Logic (#20014) --- framework/helpers/BaseFormatConverter.php | 54 ++++++++++++++--------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/framework/helpers/BaseFormatConverter.php b/framework/helpers/BaseFormatConverter.php index 1f2aeb4d673..00f37395ec7 100644 --- a/framework/helpers/BaseFormatConverter.php +++ b/framework/helpers/BaseFormatConverter.php @@ -97,22 +97,13 @@ class BaseFormatConverter * @param string|null $locale the locale to use for converting ICU short patterns `short`, `medium`, `long` and `full`. * If not given, `Yii::$app->language` will be used. * @return string The converted date format pattern. + * @throws \Exception */ public static function convertDateIcuToPhp($pattern, $type = 'date', $locale = null) { if (isset(self::$_icuShortFormats[$pattern])) { if (extension_loaded('intl')) { - if ($locale === null) { - $locale = Yii::$app->language; - } - if ($type === 'date') { - $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], IntlDateFormatter::NONE); - } elseif ($type === 'time') { - $formatter = new IntlDateFormatter($locale, IntlDateFormatter::NONE, self::$_icuShortFormats[$pattern]); - } else { - $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], self::$_icuShortFormats[$pattern]); - } - $pattern = $formatter->getPattern(); + $pattern = static::createFormatter($locale, $type, $pattern); } else { return static::$phpFallbackDatePatterns[$pattern][$type]; } @@ -350,22 +341,13 @@ public static function convertDatePhpToIcu($pattern) * @param string|null $locale the locale to use for converting ICU short patterns `short`, `medium`, `long` and `full`. * If not given, `Yii::$app->language` will be used. * @return string The converted date format pattern. + * @throws \Exception */ public static function convertDateIcuToJui($pattern, $type = 'date', $locale = null) { if (isset(self::$_icuShortFormats[$pattern])) { if (extension_loaded('intl')) { - if ($locale === null) { - $locale = Yii::$app->language; - } - if ($type === 'date') { - $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], IntlDateFormatter::NONE); - } elseif ($type === 'time') { - $formatter = new IntlDateFormatter($locale, IntlDateFormatter::NONE, self::$_icuShortFormats[$pattern]); - } else { - $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], self::$_icuShortFormats[$pattern]); - } - $pattern = $formatter->getPattern(); + $pattern = static::createFormatter($locale, $type, $pattern); } else { return static::$juiFallbackDatePatterns[$pattern][$type]; } @@ -545,4 +527,32 @@ public static function convertDatePhpToJui($pattern) 'U' => '@', // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) ]); } + + /** + * Creates a date/time formatter based on the given parameters. + * + * @param string|null $locale The locale to be used. If null, the application's current language will be used. + * @param string $type The type of formatter ('date', 'time', etc.) + * @param string $pattern The pattern for the IntlDateFormatter. + * + * @return string The resulting pattern after formatter creation. + * + * @throws \Exception If the 'intl' extension is not loaded. + */ + private static function createFormatter($locale, $type, $pattern) + { + if ($locale === null) { + $locale = Yii::$app->language; + } + + if ($type === 'date') { + $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], IntlDateFormatter::NONE); + } elseif ($type === 'time') { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::NONE, self::$_icuShortFormats[$pattern]); + } else { + $formatter = new IntlDateFormatter($locale, self::$_icuShortFormats[$pattern], self::$_icuShortFormats[$pattern]); + } + + return $formatter->getPattern(); + } } From f28386835d21616e323bd88ee2fdc75abf77215f Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 19 Oct 2023 20:35:59 +0300 Subject: [PATCH 031/125] Update framework/CHANGELOG.md --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 22503c8dde8..f039bec955b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Bug #20002: fixed superfluous query on HEAD request in serializer (xicond) +- Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 From febbe0f20e7af5e0fa4caa479526574af806cfa3 Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Thu, 19 Oct 2023 21:33:43 +0200 Subject: [PATCH 032/125] Use `self` to access private method in BaseFormatConverter --- framework/helpers/BaseFormatConverter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/helpers/BaseFormatConverter.php b/framework/helpers/BaseFormatConverter.php index 00f37395ec7..3cea9c95017 100644 --- a/framework/helpers/BaseFormatConverter.php +++ b/framework/helpers/BaseFormatConverter.php @@ -103,7 +103,7 @@ public static function convertDateIcuToPhp($pattern, $type = 'date', $locale = n { if (isset(self::$_icuShortFormats[$pattern])) { if (extension_loaded('intl')) { - $pattern = static::createFormatter($locale, $type, $pattern); + $pattern = self::createFormatter($locale, $type, $pattern); } else { return static::$phpFallbackDatePatterns[$pattern][$type]; } @@ -347,7 +347,7 @@ public static function convertDateIcuToJui($pattern, $type = 'date', $locale = n { if (isset(self::$_icuShortFormats[$pattern])) { if (extension_loaded('intl')) { - $pattern = static::createFormatter($locale, $type, $pattern); + $pattern = self::createFormatter($locale, $type, $pattern); } else { return static::$juiFallbackDatePatterns[$pattern][$type]; } From ace4a5b888c4594e11fe6e65705730b6bddb9031 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Fri, 20 Oct 2023 10:47:17 +0800 Subject: [PATCH 033/125] fix: separate test Head Serialize DataProvider --- tests/framework/rest/SerializerTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index e057a1446b4..07ca6c4f7f0 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -402,6 +402,11 @@ public function dataProviderSerializeDataProvider() ]; } + public function dataProviderHeadSerializeDataProvider() + { + return $this->dataProviderSerializeDataProvider(); + } + /** * @dataProvider dataProviderSerializeDataProvider * @@ -415,7 +420,17 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $serializer->preserveKeys = $saveKeys; $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + } + /** + * @dataProvider dataProviderHeadSerializeDataProvider + * + * @param \yii\data\DataProviderInterface $dataProvider + * @param array $expectedResult + * @param bool $saveKeys + */ + public function testHeadSerializeDataProvider($dataProvider, $expectedResult, $saveKeys = false) + { $serializer = new Serializer(); $serializer->preserveKeys = $saveKeys; $serializer->collectionEnvelope = 'data'; From ce13f0f35ab648fd39880b4a6e5cd8b5395d793a Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Fri, 20 Oct 2023 16:22:19 +0800 Subject: [PATCH 034/125] refactor: cleanup SerializerTest --- tests/framework/rest/SerializerTest.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 07ca6c4f7f0..217d7fbf7a9 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -9,7 +9,6 @@ use yii\base\Model; use yii\data\ArrayDataProvider; -use yii\data\DataProviderInterface; use yii\rest\Serializer; use yii\web\Request; use yiiunit\TestCase; @@ -402,11 +401,6 @@ public function dataProviderSerializeDataProvider() ]; } - public function dataProviderHeadSerializeDataProvider() - { - return $this->dataProviderSerializeDataProvider(); - } - /** * @dataProvider dataProviderSerializeDataProvider * @@ -423,7 +417,7 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK } /** - * @dataProvider dataProviderHeadSerializeDataProvider + * @dataProvider dataProviderSerializeDataProvider * * @param \yii\data\DataProviderInterface $dataProvider * @param array $expectedResult From a4b5856f4c73f772aed968af76cdffaa723c301f Mon Sep 17 00:00:00 2001 From: Yuriy Bachevskiy Date: Fri, 20 Oct 2023 20:43:13 +0700 Subject: [PATCH 035/125] Fix typo in runtime-logging.md (#20019) --- docs/guide-ru/runtime-logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/runtime-logging.md b/docs/guide-ru/runtime-logging.md index cc42a8c1872..2f45900e2ca 100644 --- a/docs/guide-ru/runtime-logging.md +++ b/docs/guide-ru/runtime-logging.md @@ -146,7 +146,7 @@ return [ Временная метка [IP-адрес][ID пользователя][ID сессии][Уровень важности][Категория] Текст сообщения ``` -Этот формат может быть изменен при помощи свойства [[yii\log\Target::prefix]], которое получает анонимную функцию, возвращающую нужный префикс сообщения. Например, следующий код позволяет настроить вывод идентификатор текущего пользователя в качестве префикса для всех сообщений. +Этот формат может быть изменен при помощи свойства [[yii\log\Target::prefix]], которое получает анонимную функцию, возвращающую нужный префикс сообщения. Например, следующий код позволяет настроить вывод идентификатора текущего пользователя в качестве префикса для всех сообщений. ```php [ From 70a7282fec5e75d7adb04d399d0ff348fc5ad6f6 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 20 Oct 2023 10:45:21 -0300 Subject: [PATCH 036/125] Fix `yii server` and add tests. --- .../console/controllers/ServeController.php | 8 +- .../controllers/ServeControllerTest.php | 101 ++++++++++++++++++ .../console/controllers/stub/index.php | 3 + 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 tests/framework/console/controllers/ServeControllerTest.php create mode 100644 tests/framework/console/controllers/stub/index.php diff --git a/framework/console/controllers/ServeController.php b/framework/console/controllers/ServeController.php index d02c982042e..4ba39240f62 100644 --- a/framework/console/controllers/ServeController.php +++ b/framework/console/controllers/ServeController.php @@ -80,7 +80,13 @@ public function actionIndex($address = 'localhost') } $this->stdout("Quit the server with CTRL-C or COMMAND-C.\n"); - passthru('"' . PHP_BINARY . '"' . " -S {$address} -t \"{$documentRoot}\" \"$router\""); + $command = '"' . PHP_BINARY . '"' . " -S {$address} -t \"{$documentRoot}\""; + + if ($this->router !== null && $router !== '') { + $command .= " -r \"{$router}\""; + } + + passthru($command); } /** diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php new file mode 100644 index 00000000000..af8af4eaafe --- /dev/null +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -0,0 +1,101 @@ +mockApplication(); + } + + public function testActionIndex() + { + if (!\function_exists('pcntl_fork')) { + $this->markTestSkipped('pcntl_fork() is not available'); + } + + if (!\function_exists('posix_kill')) { + $this->markTestSkipped('posix_kill() is not available'); + } + + if (!\function_exists('pcntl_waitpid')) { + $this->markTestSkipped('pcntl_waitpid() is not available'); + } + + $controller = new ServeController('serve', Yii::$app); + $controller->docroot = __DIR__ . '/stub'; + $controller->port = 8080; + + $pid = \pcntl_fork(); + + if ($pid == 0) { + \ob_start(); + $controller->actionIndex('localhost'); + \ob_get_clean(); + exit(); + } + + \sleep(1); + + $response = \file_get_contents('http://localhost:8080'); + + $this->assertEquals('Hello!', $response); + + \posix_kill($pid, \SIGTERM); + \pcntl_waitpid($pid, $status); + } + + public function testActionIndexWithRouter() + { + if (!\function_exists('pcntl_fork')) { + $this->markTestSkipped('pcntl_fork() is not available'); + } + + if (!\function_exists('posix_kill')) { + $this->markTestSkipped('posix_kill() is not available'); + } + + if (!\function_exists('pcntl_waitpid')) { + $this->markTestSkipped('pcntl_waitpid() is not available'); + } + + $controller = new ServeController('serve', Yii::$app); + $controller->docroot = __DIR__ . '/stub'; + $controller->port = 8081; + $controller->router = __DIR__ . '/stub/index.php'; + + $pid = \pcntl_fork(); + + if ($pid == 0) { + \ob_start(); + $controller->actionIndex('localhost'); + \ob_get_clean(); + exit(); + } + + \sleep(1); + + $response = \file_get_contents('http://localhost:8081'); + + $this->assertEquals('Hello!', $response); + + \posix_kill($pid, \SIGTERM); + \pcntl_waitpid($pid, $status); + } +} diff --git a/tests/framework/console/controllers/stub/index.php b/tests/framework/console/controllers/stub/index.php new file mode 100644 index 00000000000..8b57cd3113e --- /dev/null +++ b/tests/framework/console/controllers/stub/index.php @@ -0,0 +1,3 @@ + Date: Fri, 20 Oct 2023 16:49:25 +0300 Subject: [PATCH 037/125] Fix #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` --- framework/CHANGELOG.md | 1 + framework/widgets/Menu.php | 6 +- tests/framework/widgets/MenuTest.php | 181 ++++++++++++++++++++++++++- 3 files changed, 183 insertions(+), 5 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index f039bec955b..28f29d95e2b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) diff --git a/framework/widgets/Menu.php b/framework/widgets/Menu.php index a70ad1f3e1a..025379796f1 100644 --- a/framework/widgets/Menu.php +++ b/framework/widgets/Menu.php @@ -283,7 +283,11 @@ protected function normalizeItems($items, &$active) $items[$i]['active'] = false; } } elseif ($item['active'] instanceof Closure) { - $active = $items[$i]['active'] = call_user_func($item['active'], $item, $hasActiveChild, $this->isItemActive($item), $this); + if (call_user_func($item['active'], $item, $hasActiveChild, $this->isItemActive($item), $this)) { + $active = $items[$i]['active'] = true; + } else { + $items[$i]['active'] = false; + } } elseif ($item['active']) { $active = true; } diff --git a/tests/framework/widgets/MenuTest.php b/tests/framework/widgets/MenuTest.php index 192bb44131f..3de5f5efd83 100644 --- a/tests/framework/widgets/MenuTest.php +++ b/tests/framework/widgets/MenuTest.php @@ -18,7 +18,14 @@ class MenuTest extends \yiiunit\TestCase protected function setUp() { parent::setUp(); - $this->mockApplication(); + $this->mockWebApplication([ + 'components'=>[ + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + ], + ], + ]); } public function testEncodeLabel() @@ -201,6 +208,149 @@ public function testActiveItemClosure() $this->assertEqualsWithoutLE($expected, $output); } + public function testActiveItemClosureWithLogic() + { + $output = Menu::widget([ + 'route' => 'test/logic', + 'params' => [], + 'linkTemplate' => '', + 'labelTemplate' => '', + 'items' => [ + [ + 'label' => 'logic item', + 'url' => 'test/logic', + 'template' => 'label: {label}; url: {url}', + 'active' => function ($item, $hasActiveChild, $isItemActive, $widget) { + return $widget->route === 'test/logic'; + }, + ], + [ + 'label' => 'another item', + 'url' => 'test/another', + 'template' => 'label: {label}; url: {url}', + ] + ], + ]); + + $expected = <<<'HTML' +
  • label: logic item; url: test/logic
  • +
  • label: another item; url: test/another
+HTML; + + $this->assertEqualsWithoutLE($expected, $output); + } + + public function testActiveItemClosureWithLogicParent() + { + $output = Menu::widget([ + 'route' => 'test/logic', + 'params' => [], + 'linkTemplate' => '', + 'labelTemplate' => '', + 'activateParents' => true, + 'items' => [ + [ + 'label' => 'Home', + 'url' => 'test/home', + 'template' => 'label: {label}; url: {url}', + ], + [ + 'label' => 'About', + 'url' => 'test/about', + 'template' => 'label: {label}; url: {url}', + ], + [ + 'label' => 'Parent', + 'items' => [ + [ + 'label' => 'logic item', + 'url' => 'test/logic', + 'template' => 'label: {label}; url: {url}', + 'active' => function ($item, $hasActiveChild, $isItemActive, $widget) { + return $widget->route === 'test/logic'; + }, + ], + [ + 'label' => 'another item', + 'url' => 'test/another', + 'template' => 'label: {label}; url: {url}', + ] + ], + ], + ], + ]); + + $expected = <<<'HTML' +
  • label: Home; url: test/home
  • +
  • label: About; url: test/about
  • +
  • +
      +
    • label: logic item; url: test/logic
    • +
    • label: another item; url: test/another
    • +
    +
+HTML; + + $this->assertEqualsWithoutLE($expected, $output); + } + + public function testActiveItemClosureParentAnotherItem() + { + /** @see https://github.com/yiisoft/yii2/issues/19060 */ + $output = Menu::widget([ + 'route' => 'test/another', + 'params' => [], + 'linkTemplate' => '', + 'labelTemplate' => '', + 'activateParents' => true, + 'items' => [ + [ + 'label' => 'Home', + 'url' => 'test/home', + 'template' => 'label: {label}; url: {url}', + ], + [ + 'label' => 'About', + 'url' => 'test/about', + 'template' => 'label: {label}; url: {url}', + ], + [ + 'label' => 'Parent', + 'items' => [ + [ + 'label' => 'another item', + // use non relative route to avoid error in BaseUrl::normalizeRoute (missing controller) + 'url' => ['/test/another'], + 'template' => 'label: {label}; url: {url}', + ], + [ + 'label' => 'logic item', + 'url' => 'test/logic', + 'template' => 'label: {label}; url: {url}', + 'active' => function ($item, $hasActiveChild, $isItemActive, $widget) { + return $widget->route === 'test/logic'; + }, + ], + + ], + ], + ], + ]); + + $expected = <<<'HTML' +
  • label: Home; url: test/home
  • +
  • label: About; url: test/about
  • +
  • +
      +
    • label: another item; url: /test/another
    • +
    • label: logic item; url: test/logic
    • +
    +
+HTML; + + $this->assertEqualsWithoutLE($expected, $output); + } + public function testItemClassAsArray() { $output = Menu::widget([ @@ -302,8 +452,31 @@ public function testItemClassAsString() $this->assertEqualsWithoutLE($expected, $output); } - /*public function testIsItemActive() + public function testIsItemActive() { - // TODO: implement test of protected method isItemActive() - }*/ + $output = Menu::widget([ + 'route' => 'test/item2', + 'params' => [ + 'page'=>'5', + ], + 'items' => [ + [ + 'label' => 'item1', + 'url' => ['/test/item1'] + ], + [ + 'label' => 'item2', + // use non relative route to avoid error in BaseUrl::normalizeRoute (missing controller) + 'url' => ['/test/item2','page'=>'5'] + ], + + ], + ]); + + $expected = <<<'HTML' + +HTML; + $this->assertEqualsWithoutLE($expected, $output); + } } From ecc6c6121e59b71da7f974b15bd9a27d9e57d1df Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 20 Oct 2023 12:42:19 -0300 Subject: [PATCH 038/125] Use `Mock` tests, after checking the real test. --- .../console/controllers/ServeController.php | 4 + .../controllers/ServeControllerTest.php | 135 +++++++++++------- 2 files changed, 88 insertions(+), 51 deletions(-) diff --git a/framework/console/controllers/ServeController.php b/framework/console/controllers/ServeController.php index 4ba39240f62..924e47a448b 100644 --- a/framework/console/controllers/ServeController.php +++ b/framework/console/controllers/ServeController.php @@ -86,6 +86,10 @@ public function actionIndex($address = 'localhost') $command .= " -r \"{$router}\""; } + if (YII_ENV === 'test') { + return true; + } + passthru($command); } diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index af8af4eaafe..463251e33b2 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -24,78 +24,111 @@ public function setUp() $this->mockApplication(); } - public function testActionIndex() + public function testAddressTaken() { - if (!\function_exists('pcntl_fork')) { - $this->markTestSkipped('pcntl_fork() is not available'); - } + $docroot = __DIR__ . '/stub'; - if (!\function_exists('posix_kill')) { - $this->markTestSkipped('posix_kill() is not available'); - } + /** @var ServeController $serveController */ + $serveController = $this->getMockBuilder(ServeControllerMock::class) + ->setConstructorArgs(['serve', Yii::$app]) + ->setMethods(['isAddressTaken']) + ->getMock(); - if (!\function_exists('pcntl_waitpid')) { - $this->markTestSkipped('pcntl_waitpid() is not available'); - } + $serveController->expects($this->once())->method('isAddressTaken')->willReturn(true); - $controller = new ServeController('serve', Yii::$app); - $controller->docroot = __DIR__ . '/stub'; - $controller->port = 8080; + $serveController->docroot = $docroot; + $serveController->port = 8080; - $pid = \pcntl_fork(); + ob_start(); + $serveController->actionIndex('localhost:8080'); + ob_end_clean(); - if ($pid == 0) { - \ob_start(); - $controller->actionIndex('localhost'); - \ob_get_clean(); - exit(); - } + $result = $serveController->flushStdOutBuffer(); - \sleep(1); + $this->assertContains('http://localhost:8080 is taken by another process.', $result); + } + + public function testDefautlValues() + { + $docroot = __DIR__ . '/stub'; + + $serveController = new ServeControllerMock('serve', Yii::$app); + $serveController->docroot = $docroot; + $serveController->port = 8080; + + ob_start(); + $serveController->actionIndex(); + ob_end_clean(); + + $result = $serveController->flushStdOutBuffer(); + + $this->assertContains('Server started on http://localhost:8080', $result); + $this->assertContains("Document root is \"{$docroot}\"", $result); + $this->assertContains('Quit the server with CTRL-C or COMMAND-C.', $result); + } + + public function testDoocRootWithNoExistValue() + { + $docroot = '/not/exist/path'; + + $serveController = new ServeControllerMock('serve', Yii::$app); + $serveController->docroot = $docroot; - $response = \file_get_contents('http://localhost:8080'); + ob_start(); + $serveController->actionIndex(); + ob_end_clean(); - $this->assertEquals('Hello!', $response); + $result = $serveController->flushStdOutBuffer(); - \posix_kill($pid, \SIGTERM); - \pcntl_waitpid($pid, $status); + $this->assertContains("Document root \"{$docroot}\" does not exist.", $result); } - public function testActionIndexWithRouter() + public function testWithRouterNoExistValue() { - if (!\function_exists('pcntl_fork')) { - $this->markTestSkipped('pcntl_fork() is not available'); - } + $docroot = __DIR__ . '/stub'; + $router = '/not/exist/path'; - if (!\function_exists('posix_kill')) { - $this->markTestSkipped('posix_kill() is not available'); - } + $serveController = new ServeControllerMock('serve', Yii::$app); + $serveController->docroot = $docroot; + $serveController->port = 8081; + $serveController->router = $router; - if (!\function_exists('pcntl_waitpid')) { - $this->markTestSkipped('pcntl_waitpid() is not available'); - } + ob_start(); + $serveController->actionIndex(); + ob_end_clean(); - $controller = new ServeController('serve', Yii::$app); - $controller->docroot = __DIR__ . '/stub'; - $controller->port = 8081; - $controller->router = __DIR__ . '/stub/index.php'; + $result = $serveController->flushStdOutBuffer(); - $pid = \pcntl_fork(); + $this->assertContains("Routing file \"$router\" does not exist.", $result); + } - if ($pid == 0) { - \ob_start(); - $controller->actionIndex('localhost'); - \ob_get_clean(); - exit(); - } + public function testWithRouterValue() + { + $docroot = __DIR__ . '/stub'; + $router = __DIR__ . '/stub/index.php'; - \sleep(1); + $serveController = new ServeControllerMock('serve', Yii::$app); + $serveController->docroot = $docroot; + $serveController->port = 8081; + $serveController->router = $router; - $response = \file_get_contents('http://localhost:8081'); + ob_start(); + $serveController->actionIndex(); + ob_end_clean(); - $this->assertEquals('Hello!', $response); + $result = $serveController->flushStdOutBuffer(); - \posix_kill($pid, \SIGTERM); - \pcntl_waitpid($pid, $status); + $this->assertContains('Server started on http://localhost:8081', $result); + $this->assertContains("Document root is \"{$docroot}\"", $result); + $this->assertContains("Routing file is \"{$router}\"", $result); + $this->assertContains('Quit the server with CTRL-C or COMMAND-C.', $result); } } + +/** + * Mock class for [[\yii\console\controllers\ServeController]]. + */ +class ServeControllerMock extends ServeController +{ + use StdOutBufferControllerTrait; +} From e726284a48b9d49ea3d62d9a5adaf73eb8b986aa Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 20 Oct 2023 12:45:51 -0300 Subject: [PATCH 039/125] Fix php 5. --- tests/framework/console/controllers/ServeControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index 463251e33b2..cbf95e392cf 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -29,7 +29,7 @@ public function testAddressTaken() $docroot = __DIR__ . '/stub'; /** @var ServeController $serveController */ - $serveController = $this->getMockBuilder(ServeControllerMock::class) + $serveController = $this->getMockBuilder('yii\console\controllers\ServeController') ->setConstructorArgs(['serve', Yii::$app]) ->setMethods(['isAddressTaken']) ->getMock(); From c56bccd913fdf1ce63416ebbfcd3cdb46052434a Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 20 Oct 2023 12:50:20 -0300 Subject: [PATCH 040/125] Fix error typo. --- tests/framework/console/controllers/ServeControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index cbf95e392cf..afc13a646fc 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -29,7 +29,7 @@ public function testAddressTaken() $docroot = __DIR__ . '/stub'; /** @var ServeController $serveController */ - $serveController = $this->getMockBuilder('yii\console\controllers\ServeController') + $serveController = $this->getMockBuilder('yii\console\controllers\ServeControllerMock') ->setConstructorArgs(['serve', Yii::$app]) ->setMethods(['isAddressTaken']) ->getMock(); From f8b49ce5111fa888a80bff9e7e7be980d2cea2ee Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 20 Oct 2023 12:59:20 -0300 Subject: [PATCH 041/125] Fix `getMockbuilder className()`. --- tests/framework/console/controllers/ServeControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index afc13a646fc..e59df5d6652 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -29,7 +29,7 @@ public function testAddressTaken() $docroot = __DIR__ . '/stub'; /** @var ServeController $serveController */ - $serveController = $this->getMockBuilder('yii\console\controllers\ServeControllerMock') + $serveController = $this->getMockBuilder(ServeControllerMocK::className()) ->setConstructorArgs(['serve', Yii::$app]) ->setMethods(['isAddressTaken']) ->getMock(); From f58eb362caf650be9cc430fa6ce39380d5ad2eb5 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Sat, 21 Oct 2023 08:53:15 -0300 Subject: [PATCH 042/125] Remove `YII_ENV`. --- .../console/controllers/ServeController.php | 11 ++--- .../controllers/ServeControllerTest.php | 41 ++++++++++++++++--- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/framework/console/controllers/ServeController.php b/framework/console/controllers/ServeController.php index 924e47a448b..b806f67d55b 100644 --- a/framework/console/controllers/ServeController.php +++ b/framework/console/controllers/ServeController.php @@ -86,11 +86,7 @@ public function actionIndex($address = 'localhost') $command .= " -r \"{$router}\""; } - if (YII_ENV === 'test') { - return true; - } - - passthru($command); + $this->runCommand($command); } /** @@ -132,4 +128,9 @@ protected function isAddressTaken($address) fclose($fp); return true; } + + protected function runCommand($command) + { + passthru($command); + } } diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index e59df5d6652..35a5db6d075 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -31,10 +31,11 @@ public function testAddressTaken() /** @var ServeController $serveController */ $serveController = $this->getMockBuilder(ServeControllerMocK::className()) ->setConstructorArgs(['serve', Yii::$app]) - ->setMethods(['isAddressTaken']) + ->setMethods(['isAddressTaken', 'runCommand']) ->getMock(); $serveController->expects($this->once())->method('isAddressTaken')->willReturn(true); + $serveController->expects($this->never())->method('runCommand'); $serveController->docroot = $docroot; $serveController->port = 8080; @@ -48,14 +49,21 @@ public function testAddressTaken() $this->assertContains('http://localhost:8080 is taken by another process.', $result); } - public function testDefautlValues() + public function testDefaultValues() { $docroot = __DIR__ . '/stub'; - $serveController = new ServeControllerMock('serve', Yii::$app); + /** @var ServeController $serveController */ + $serveController = $this->getMockBuilder(ServeControllerMock::className()) + ->setConstructorArgs(['serve', Yii::$app]) + ->setMethods(['runCommand']) + ->getMock(); + $serveController->docroot = $docroot; $serveController->port = 8080; + $serveController->expects($this->once())->method('runCommand')->willReturn(true); + ob_start(); $serveController->actionIndex(); ob_end_clean(); @@ -71,9 +79,16 @@ public function testDoocRootWithNoExistValue() { $docroot = '/not/exist/path'; - $serveController = new ServeControllerMock('serve', Yii::$app); + /** @var ServeController $serveController */ + $serveController = $this->getMockBuilder(ServeControllerMock::className()) + ->setConstructorArgs(['serve', Yii::$app]) + ->setMethods(['runCommand']) + ->getMock(); + $serveController->docroot = $docroot; + $serveController->expects($this->any())->method('runCommand')->willReturn(true); + ob_start(); $serveController->actionIndex(); ob_end_clean(); @@ -88,11 +103,18 @@ public function testWithRouterNoExistValue() $docroot = __DIR__ . '/stub'; $router = '/not/exist/path'; - $serveController = new ServeControllerMock('serve', Yii::$app); + /** @var ServeController $serveController */ + $serveController = $this->getMockBuilder(ServeControllerMock::className()) + ->setConstructorArgs(['serve', Yii::$app]) + ->setMethods(['runCommand']) + ->getMock(); + $serveController->docroot = $docroot; $serveController->port = 8081; $serveController->router = $router; + $serveController->expects($this->any())->method('runCommand')->willReturn(true); + ob_start(); $serveController->actionIndex(); ob_end_clean(); @@ -107,11 +129,18 @@ public function testWithRouterValue() $docroot = __DIR__ . '/stub'; $router = __DIR__ . '/stub/index.php'; - $serveController = new ServeControllerMock('serve', Yii::$app); + /** @var ServeController $serveController */ + $serveController = $this->getMockBuilder(ServeControllerMock::className()) + ->setConstructorArgs(['serve', Yii::$app]) + ->setMethods(['runCommand']) + ->getMock(); + $serveController->docroot = $docroot; $serveController->port = 8081; $serveController->router = $router; + $serveController->expects($this->once())->method('runCommand')->willReturn(true); + ob_start(); $serveController->actionIndex(); ob_end_clean(); From bee7f7206f9eae800cf8630f6bb71e553dfed40c Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Sat, 21 Oct 2023 09:03:20 -0300 Subject: [PATCH 043/125] Add changelog line. --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 28f29d95e2b..469a23773da 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) From 5f3d36ea21dfc7b39d1c438e85971f03bf43f193 Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Sat, 21 Oct 2023 18:22:41 +0200 Subject: [PATCH 044/125] Extract messages (#20022) * {attribute} must not be equal to "{compareValue}"" * update config * {attribute} must be greater than "{compareValueOrAttribute}". {attribute} must be greater than or equal to "{compareValueOrAttribute}". {attribute} must be less than "{compareValueOrAttribute}". {attribute} must be less than or equal to "{compareValueOrAttribute}". * {nFormatted} B {nFormatted} GB {nFormatted} kB {nFormatted} MB {nFormatted} PB {nFormatted} TB * {nFormatted} {n, plural, =1{byte} other{bytes}} {nFormatted} {n, plural, =1{gigabyte} other{gigabytes}} {nFormatted} {n, plural, =1{kilobyte} other{kilobytes}} {nFormatted} {n, plural, =1{megabyte} other{megabytes}} {nFormatted} {n, plural, =1{petabyte} other{petabytes}} {nFormatted} {n, plural, =1{terabyte} other{terabytes}} * Extract messages. --- framework/messages/af/yii.php | 8 +- framework/messages/ar/yii.php | 57 ++++-- framework/messages/az/yii.php | 90 +++++++--- framework/messages/be/yii.php | 8 +- framework/messages/bg/yii.php | 8 +- framework/messages/bs/yii.php | 41 ++++- framework/messages/ca/yii.php | 78 ++++++--- framework/messages/config.php | 4 +- framework/messages/cs/yii.php | 77 +++++---- framework/messages/da/yii.php | 207 +++++++++++++--------- framework/messages/de/yii.php | 23 +-- framework/messages/el/yii.php | 1 + framework/messages/es/yii.php | 17 +- framework/messages/et/yii.php | 58 ++++--- framework/messages/fa/yii.php | 22 +-- framework/messages/fi/yii.php | 30 +++- framework/messages/fr/yii.php | 10 +- framework/messages/he/yii.php | 79 ++++++++- framework/messages/hi/yii.php | 15 +- framework/messages/hr/yii.php | 80 ++++++--- framework/messages/hu/yii.php | 209 ++++++++++++---------- framework/messages/hy/yii.php | 24 +-- framework/messages/id/yii.php | 79 ++++++--- framework/messages/it/yii.php | 61 ++++--- framework/messages/ja/yii.php | 12 +- framework/messages/ka/yii.php | 41 ++++- framework/messages/kk/yii.php | 79 ++++++++- framework/messages/ko/yii.php | 84 +++++++-- framework/messages/kz/yii.php | 100 +++++++---- framework/messages/lt/yii.php | 85 +++++---- framework/messages/lv/yii.php | 103 ++++++----- framework/messages/ms/yii.php | 41 ++++- framework/messages/nb-NO/yii.php | 61 +++++-- framework/messages/nl/yii.php | 37 +++- framework/messages/pl/yii.php | 32 ++-- framework/messages/pt-BR/yii.php | 22 +-- framework/messages/pt/yii.php | 106 ++++++------ framework/messages/ro/yii.php | 80 ++++++++- framework/messages/ru/yii.php | 10 +- framework/messages/sk/yii.php | 9 +- framework/messages/sl/yii.php | 46 +++-- framework/messages/sr-Latn/yii.php | 106 ++++++++---- framework/messages/sr/yii.php | 106 ++++++++---- framework/messages/sv/yii.php | 41 ++++- framework/messages/tg/yii.php | 19 +- framework/messages/th/yii.php | 67 ++++++-- framework/messages/tr/yii.php | 16 +- framework/messages/uk/yii.php | 28 ++- framework/messages/uz-Cy/yii.php | 268 ++++++++++++++++------------- framework/messages/uz/yii.php | 85 +++++---- framework/messages/vi/yii.php | 76 +++++--- framework/messages/zh-TW/yii.php | 55 +++--- framework/messages/zh/yii.php | 8 +- 53 files changed, 2074 insertions(+), 1035 deletions(-) diff --git a/framework/messages/af/yii.php b/framework/messages/af/yii.php index b4a10bdf664..18be9560231 100644 --- a/framework/messages/af/yii.php +++ b/framework/messages/af/yii.php @@ -26,6 +26,8 @@ ' and ' => ' en ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ondersteun nie operateur "{operator}" nie.', '(not set)' => '(nie gestel nie)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '\'n Interne bediener fout het plaasgevind.', 'Are you sure you want to delete this item?' => 'Is jy seker jy wil hierdie item skrap?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Voorwaarde vir "{attribute}" moet óf \'n waarde, óf \'n geldige operateurspesifikasie wees.', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Slegs hierdie soort lêers word toegelaat: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Operateur "{operator}" moet gebruik word met \'n soekkenmerk.', 'Operator "{operator}" requires multiple operands.' => 'Operateur "{operator}" vereis veelvuldige operande.', + 'Options available: {options}' => '', 'Page not found.' => 'Bladsy nie gevind nie.', 'Please fix the following errors:' => 'Maak asseblief die volgende foute reg:', 'Please upload a file.' => 'Laai asseblief \'n lêer op.', - 'Powered by {yii}' => 'Aangedryf deur {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '', 'The combination {values} of {attributes} has already been taken.' => 'Die kombinasie {values} van {attributes} is reeds geneem.', 'The file "{file}" is not an image.' => 'Die lêer "{file}" is nie \'n prent nie.', @@ -68,7 +70,6 @@ 'Update' => 'Opdateer', 'View' => 'Beskou', 'Yes' => 'Ja', - 'Yii Framework' => 'Yii Raamwerk', 'You are not allowed to perform this action.' => 'Jy mag nie hierdie aksie uitvoer nie.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Jy kan \'n maksimum van {limit, number} {limit, plural, one{lêer} other{lêers}} oplaai.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Jy moet ten minste {limit, number} {limit, plural, one{lêer} other{lêers}} oplaai.', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} moet ten minste {min, number} {min, plural, one{karakter} other{karakters}} bevat.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} moet hoogstens {max, number} {max, plural, one{karakter} other{karakters}} bevat.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} moet {length, number} {length, plural, one{karakter} other{karakters}} bevat.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dag} other{# dae}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} uur', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuut} other{# minute}}', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{greep} other{grepe}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibigreep} other{gibigrepe}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigagreep} other{gigagrepe}}', diff --git a/framework/messages/ar/yii.php b/framework/messages/ar/yii.php index f300954a31c..a2b19347e06 100644 --- a/framework/messages/ar/yii.php +++ b/framework/messages/ar/yii.php @@ -23,8 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(لم يحدد)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '.حدث خطأ داخلي في الخادم', + 'Are you sure you want to delete this item?' => '', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'حذف', 'Error' => 'خطأ', 'File upload failed.' => '.فشل في تحميل الملف', @@ -34,65 +40,91 @@ 'Missing required arguments: {params}' => 'البيانات المطلوبة ضرورية: {params}', 'Missing required parameters: {params}' => 'البيانات المطلوبة ضرورية: {params}', 'No' => 'لا', - 'No help for unknown command "{command}".' => 'ليس هناك مساعدة لأمر غير معروف "{command}".', - 'No help for unknown sub-command "{command}".' => 'ليس هناك مساعدة لأمر فرعي غير معروف "{command}".', 'No results found.' => 'لم يتم العثور على نتائج', - 'Only files with these extensions are allowed: {extensions}.' => 'فقط الملفات التي تحمل هذه الصيغ مسموح بها: {extensions}.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'فقط الملفات من هذه الأنواع مسموح بها: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'فقط الملفات التي تحمل هذه الصيغ مسموح بها: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'لم يتم العثور على الصفحة', 'Please fix the following errors:' => 'الرجاء تصحيح الأخطاء التالية:', 'Please upload a file.' => 'الرجاء تحميل ملف.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'عرض {begin, number}-{end, number} من أصل {totalCount, number} {totalCount, plural, one{مُدخل} few{مُدخلات} many{مُدخل} other{مُدخلات}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'الملف "{file}" ليس صورة.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'الملف "{file}" كبير الحجم. حجمه لا يجب أن يتخطى {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'الملف "{file}" صغير جداً. حجمه لا يجب أن يكون أصغر من {formattedLimit}.', 'The format of {attribute} is invalid.' => 'شكل {attribute} غير صالح', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'الصورة "{file}" كبيرة جداً. ارتفاعها لا يمكن أن يتخطى {limit, number} {limit, plural, other{بكسل}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'الصورة "{file}" كبيرة جداً. عرضها لا يمكن أن يتخطى {limit, number} {limit, plural, other{بكسل}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'الصورة "{file}" صغيرة جداً. ارتفاعها لا يمكن أن يقل عن {limit, number} {limit, plural, other{بكسل}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'الصورة "{file}" كبيرة جداً. عرضها لا يمكن أن يقل عن {limit, number} {limit, plural, other{بكسل}}.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'رمز التحقق غير صحيح', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'مجموع {count, number} {count, plural, one{مُدخل} few{مُدخلات} many{مُدخل}}.', 'Unable to verify your data submission.' => 'لم نستطع التأكد من البيانات المقدمة.', - 'Unknown command "{command}".' => 'أمر غير معروف. "{command}"', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'خيار غير معروف: --{name}', 'Update' => 'تحديث', 'View' => 'عرض', 'Yes' => 'نعم', 'You are not allowed to perform this action.' => 'غير مصرح لك القيام بهذا العمل', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'تستطيع كأقصى حد تحميل {limit, number} {limit, plural, one{ملف} few{ملفات} many{ملف} other{ملفات}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => 'قيمة المُدخل', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" سبق استعماله', '{attribute} cannot be blank.' => '{attribute} لا يمكن تركه فارغًا.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} غير صالح.', '{attribute} is not a valid URL.' => '{attribute} ليس بعنوان صحيح.', '{attribute} is not a valid email address.' => '{attribute} ليس ببريد إلكتروني صحيح.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} يجب أن يكون "{requiredValue}".', '{attribute} must be a number.' => '{attribute} يجب أن يكون رقمًا', '{attribute} must be a string.' => '{attribute} يجب أن يكون كلمات', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} يجب أن يكون رقمًا صحيحًا', '{attribute} must be either "{true}" or "{false}".' => '{attribute} يجب أن يكن إما "{true}" أو "{false}".', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} يجب أن يساوي "{compareValueOrAttribute}".', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} يجب أن لا يساوي "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} يجب أن يكون أكبر من "{compareValueOrAttribute}".', '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} يجب أن يكون أكبر من أو يساوي "{compareValueOrAttribute}".', '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} يجب أن يكون أصغر من "{compareValueOrAttribute}".', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} يجب أن يكون أصغر من أو يساوي "{compareValueOrAttribute}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} يجب أن يكون أكبر من "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} يجب أن يكون أكبر من أو يساوي "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} يجب أن يكون أصغر من "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} يجب أن يكون أصغر من أو يساوي "{compareValue}".', '{attribute} must be no greater than {max}.' => '{attribute} يجب أن لا يكون أكبر من "{max}".', '{attribute} must be no less than {min}.' => '{attribute} يجب أن لا يكون أصغر من "{min}".', - '{attribute} must be repeated exactly.' => '{attribute} يجب أن يكون متطابق.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} يجب ان لا يساوي "{compareValue}"', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} يجب أن لا يساوي "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} يجب أن يحتوي على أكثر من {min, number} {min, plural, one{حرف} few{حروف} other{حرف}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} يجب أن لا يحتوي على أكثر من {max, number} {max, plural, one{حرف} few{حروف} other{حرف}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} يجب أن يحتوي على {length, number} {length, plural, one{حرف} few{حروف} other{حرف}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', '{nFormatted} B' => '{nFormatted} بايت', '{nFormatted} GB' => '{nFormatted} جيجابايت', '{nFormatted} GiB' => '{nFormatted} جيبيبايت', - '{nFormatted} kB' => '{nFormatted} كيلوبايت', '{nFormatted} KiB' => '{nFormatted} كيبيبايت', '{nFormatted} MB' => '{nFormatted} ميجابايت', '{nFormatted} MiB' => '{nFormatted} ميبيبايت', @@ -100,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} بيبيبايت', '{nFormatted} TB' => '{nFormatted} تيرابايت', '{nFormatted} TiB' => '{nFormatted} تيبيبايت', + '{nFormatted} kB' => '{nFormatted} كيلوبايت', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} بايت', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} جيبيبايت', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} جيجابايت', diff --git a/framework/messages/az/yii.php b/framework/messages/az/yii.php index 797dc804327..a283d5501e4 100644 --- a/framework/messages/az/yii.php +++ b/framework/messages/az/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(məlumat yoxdur)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Daxili server xətası meydana gəldi.', 'Are you sure you want to delete this item?' => 'Bu elementi silmək istədiyinizə əminsinizmi?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Sil', 'Error' => 'Xəta', 'File upload failed.' => 'Fayl yüklənmədi.', @@ -35,65 +40,108 @@ 'Missing required arguments: {params}' => 'Tələb olunan arqumentlər tapılmadı: {params}', 'Missing required parameters: {params}' => 'Tələb olunan parametrlər tapılmadı: {params}', 'No' => 'Xeyr', - 'No help for unknown command "{command}".' => 'Qeyri-müəyyən "{command}" əmri üçün kömək yoxdur.', - 'No help for unknown sub-command "{command}".' => 'Qeyri-müəyyən "{command}" sub-əmri üçün kömək yoxdur.', 'No results found.' => 'Heç bir nəticə tapılmadı', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Ancaq bu MIME tipli fayllara icazə verilib: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Genişlənmələri ancaq bu tipdə olan fayllara icazə verilib: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Səhifə tapılmadı.', 'Please fix the following errors:' => 'Xahiş olunur xətaları düzəldin: ', 'Please upload a file.' => 'Xahiş olunur bir fayl yükləyin.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} {totalCount, plural, one{elementdən} other{elementdən}} {begin, number}-{end, number} arası göstərilir.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '"{file}" təsvir faylı deyil.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '"{file}" faylı çox böyükdür. Həcmi {formattedLimit} qiymətindən böyük ola bilməz.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '"{file}" faylı çox kiçikdir. Həcmi {formattedLimit} qiymətindən kiçik ola bilməz.', 'The format of {attribute} is invalid.' => '{attribute} formatı düzgün deyil.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox böyükdür. Uzunluq {limit, plural, one{pixel} other{pixels}} qiymətindən böyük ola bilməz.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox böyükdür. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən böyük ola bilməz.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən kiçik ola bilməz.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixels}} qiymətindən kiçik ola bilməz.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'Təsdiqləmə kodu səhvdir.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Toplam {count, number} {count, plural, one{element} other{element}}.', 'Unable to verify your data submission.' => 'Təqdim etdiyiniz məlumat təsdiqlənmədi.', - 'Unknown command "{command}".' => 'Qeyri-müəyyən əmr "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Qeyri-müəyyən seçim: --{name}', 'Update' => 'Yenilə', 'View' => 'Bax', 'Yes' => 'Bəli', 'You are not allowed to perform this action.' => 'Bu əməliyyatı yerinə yetirmək üçün icazəniz yoxdur.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Ancaq {limit, number} {limit, plural, one{fayl} other{fayl}} yükləyə bilərsiniz.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => 'daxil olunmuş qiymət', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" artıq istifadə olunub.', '{attribute} cannot be blank.' => '{attribute} boş qoyula bilməz.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} düzgün deyil.', '{attribute} is not a valid URL.' => '{attribute} düzgün URL deyil.', '{attribute} is not a valid email address.' => '{attribute} düzgün e-mail deyil.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} {requiredValue} olmalıdır.', '{attribute} must be a number.' => '{attribute} ədəd olmalıdır.', '{attribute} must be a string.' => '{attribute} simvol tipli olmalıdır.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} tam ədəd olmalıdır.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} ya {true} ya da {false} ola bilər.', - '{attribute} must be greater than "{compareValue}".' => '{attribute}, "{compareValue}" dən böyük olmalıdır.', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən böyük və ya bərabər olmalıdır.', - '{attribute} must be less than "{compareValue}".' => '{attribute}, "{compareValue}" dən kiçik olmalıdır.', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən kiçik və ya bərabər olmalıdır.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute}, "{compareValueOrAttribute}" dən böyük olmalıdır.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute}, "{compareValueOrAttribute}"dən böyük və ya bərabər olmalıdır.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute}, "{compareValueOrAttribute}" dən kiçik olmalıdır.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute}, "{compareValueOrAttribute}"dən kiçik və ya bərabər olmalıdır.', '{attribute} must be no greater than {max}.' => '{attribute} {max} dən böyük olmamalıdır.', '{attribute} must be no less than {min}.' => '{attribute} {min} dən kiçik olmamalıdır.', - '{attribute} must be repeated exactly.' => '{attribute} dəqiqliklə təkrar olunmalıdir.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute}, "{compareValue}" ilə eyni olmamalıdır', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute}, "{compareValueOrAttribute}" ilə eyni olmamalıdır', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} ən az {min, number} simvol olmalıdır.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} ən çox {max, number} simvol olmalıdır.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} {length, number} simvol olmalıdır.', - '{n, plural, =1{# byte} other{# bytes}}' => '{n} Bayt', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n} Giqabayt', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n} Kilobayt', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n} Meqabayt', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n} Petabayt', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n} Terabayt', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} Bayt', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} Giqabayt', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} Kilobayt', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} Meqabayt', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} Petabayt', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} Terabayt', ]; diff --git a/framework/messages/be/yii.php b/framework/messages/be/yii.php index f2ed384a925..c2771f47385 100644 --- a/framework/messages/be/yii.php +++ b/framework/messages/be/yii.php @@ -26,6 +26,8 @@ ' and ' => ' і ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" не падтрымлівае аператар "{operator}".', '(not set)' => '(не зададзена)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Узнікла ўнутраная памылка сервера.', 'Are you sure you want to delete this item?' => 'Вы ўпэўнены, што жадаеце выдаліць гэты элемент?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Умова для "{attribute}" павінна быць ці значэннем, ці дакладнай спецыфікацыяй аператара.', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Дазволена загрузка файлаў толькі з наступнымі пашырэннямі: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Аператар "{operator}" павінен выкарыстоўвацца праз атрыбут пошуку.', 'Operator "{operator}" requires multiple operands.' => 'Аператар "{operator}" патрабуе некалькі аперандаў.', + 'Options available: {options}' => '', 'Page not found.' => 'Старонка не знойдзена.', 'Please fix the following errors:' => 'Выпраўце наступныя памылкі:', 'Please upload a file.' => 'Загрузіце файл.', - 'Powered by {yii}' => 'Працуе на {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Паказаны запісы {begin, number}-{end, number} з {totalCount, number}.', 'The combination {values} of {attributes} has already been taken.' => 'Камбінацыя {values} параметраў {attributes} ужо існуе.', 'The file "{file}" is not an image.' => 'Файл «{file}» не зьяўляецца малюнкам.', @@ -68,7 +70,6 @@ 'Update' => 'Рэдагаваць', 'View' => 'Прагляд', 'Yes' => 'Так', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'You are not allowed to perform this action.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Вы не можаце загружаць больш за {limit, number} {limit, plural, one{файл} few{файлы} many{файлаў} other{файла}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Вы павінны загрузіць мінімум {limit, number} {limit, plural, one{файл} few{файлы} many{файлаў} other{файла}}', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Значэнне «{attribute}» павінна ўтрымліваць мінімум {min, number} {min, plural, one{сімвал} few{сімвала} many{сімвалаў} other{сімвала}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Значэнне «{attribute}» павінна ўтрымліваць максімум {max, number} {max, plural, one{сімвал} few{сімвала} many{сімвалаў} other{сімвала}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Значэнне «{attribute}» павінна ўтрымліваць {length, number} {length, plural, one{сімвал} few{сімвала} many{сімвалаў} other{сімвала}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, one{# дзень} few{# дні} many{# дзён} other{# дні}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# гадзіна} few{# гадзіны} many{# гадзін} other{# гадзіны}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, one{# хвіліна} few{# хвіліны} many{# хвілін} other{# хвіліны}}', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} Б', '{nFormatted} GB' => '{nFormatted} ГБ', '{nFormatted} GiB' => '{nFormatted} ГіБ', - '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} KiB' => '{nFormatted} КіБ', '{nFormatted} MB' => '{nFormatted} МБ', '{nFormatted} MiB' => '{nFormatted} МіБ', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} ПіБ', '{nFormatted} TB' => '{nFormatted} ТБ', '{nFormatted} TiB' => '{nFormatted} ЦіБ', + '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байта} many{байтаў} other{байта}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гібібайт} few{гібібайта} many{гібібайтаў} other{гібібайта}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гігабайт} few{гігабайта} many{гігабайтаў} other{гігабайта}}', diff --git a/framework/messages/bg/yii.php b/framework/messages/bg/yii.php index eb87f3bf120..d12f3e03169 100644 --- a/framework/messages/bg/yii.php +++ b/framework/messages/bg/yii.php @@ -26,6 +26,8 @@ ' and ' => ' и ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" не поддържа оператор "{operator}".', '(not set)' => '(не е попълнено)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Възникна вътрешна грешка в сървъра.', 'Are you sure you want to delete this item?' => 'Сигурни ли сте, че искате да изтриете записа?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Условието за "{attribute}" трябва да е валидна стойност или оператор.', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Допускат се файлове със следните разширения: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Операторът "{operator}" трябва да се използва с атрибут за търсене.', 'Operator "{operator}" requires multiple operands.' => 'Операторът "{operator}" изисква множество елементи.', + 'Options available: {options}' => '', 'Page not found.' => 'Страницата не беше намерена.', 'Please fix the following errors:' => 'Моля, коригирайте следните грешки:', 'Please upload a file.' => 'Моля, прикачете файл.', - 'Powered by {yii}' => 'Задвижвано от {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Показване на {begin, number}-{end, number} от {totalCount, number} {totalCount, plural, one{запис} other{записа}}.', 'The combination {values} of {attributes} has already been taken.' => 'Комбинацията от {values} от {attributes} е вече заета.', 'The file "{file}" is not an image.' => 'Файлът "{file}" не е изображение.', @@ -68,7 +70,6 @@ 'Update' => 'Обнови', 'View' => 'Виж', 'Yes' => 'Да', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Нямате права да изпълните тази операция.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Може да прикачите най-много {limit, number} {limit, plural, one{файл} other{файла}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Трябва да качите поне {limit, number} {limit, plural, one{файл} other{файлове}}.', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Полето {attribute} трябва да съдържа поне {min, number} {min, plural, one{символ} other{символа}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Полето "{attribute}" трябва да съдържа най-много {max, number} {max, plural, one{символ} other{символа}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Полето "{attribute}" трябва да съдържа точно {length, number} {length, plural, one{символ} other{символа}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 ден} other{# дни}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 час} other{# часа}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 минута} other{# минути}}', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{байта} other{байта}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{гибибайт} other{гибибайта}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{гигабайт} other{гигабайта}}', diff --git a/framework/messages/bs/yii.php b/framework/messages/bs/yii.php index 968d93aa442..c4013f58cf1 100644 --- a/framework/messages/bs/yii.php +++ b/framework/messages/bs/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(bez vrijednosti)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Došlo je do interne greške na serveru.', 'Are you sure you want to delete this item?' => 'Jeste li sigurni da želite obrisati ovu stavku?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Obriši', 'Error' => 'Greška', 'File upload failed.' => 'Slanje datoteke nije uspjelo.', @@ -38,14 +43,19 @@ 'No results found.' => 'Nema rezultata.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Samo datoteke sa sljedećim MIME tipovima su dozvoljeni: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Samo datoteke sa sljedećim ekstenzijama su dozvoljeni: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Stranica nije pronađena.', 'Please fix the following errors:' => 'Molimo ispravite sljedeće greške:', 'Please upload a file.' => 'Molimo da pošaljete datoteku.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Prikazano {begin, number}-{end, number} od {totalCount, number} {totalCount, plural, one{stavke} other{stavki}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Datoteka "{file}" nije slika.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Datoteka "{file}" je prevelika. Veličina ne smije biti veća od {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Datoteka "{file}" је premala. Veličina ne smije biti manja od {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format atributa "{attribute}" je neispravan.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Visina ne smije biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina ne smije biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premala. Visina ne smije biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'Potvrdni kod nije ispravan.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Ukupno {count, number} {count, plural, one{stavka} other{stavki}}.', 'Unable to verify your data submission.' => 'Nije moguće provjeriti poslane podatke.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Nepoznata opcija: --{name}', 'Update' => 'Ažurirati', 'View' => 'Pregled', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Nemate prava da izvršite ovu akciju.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Možete poslati najviše {limit, number} {limit, plural, one{datoteku} other{datoteka}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{mjesec} one{# mjesec} few{# mjeseci} many{# mjeseci} other{# mjeseci}}', @@ -70,25 +83,39 @@ 'the input value' => 'ulazna vrijednost', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" je već zauzet.', '{attribute} cannot be blank.' => '{attribute} ne smije biti prazan.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} je neispravan.', '{attribute} is not a valid URL.' => '{attribute} ne sadrži ispravan URL.', '{attribute} is not a valid email address.' => '{attribute} ne sadrži ispravnu email adresu.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} mora biti "{requiredValue}".', '{attribute} must be a number.' => '{attribute} mora biti broj.', '{attribute} must be a string.' => '{attribute} mora biti tekst.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} mora biti cijeli broj.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} mora biti "{true}" ili "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} mora biti veći od "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} mora biti veći ili jednak od "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} mora biti manji od "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} mora biti manji ili jednak od "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} mora biti veći od "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti veći ili jednak od "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} mora biti manji od "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti manji ili jednak od "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} ne smije biti veći od "{max}"', '{attribute} must be no less than {min}.' => '{attribute} ne smije biti manji od {min}.', - '{attribute} must be repeated exactly.' => '{attribute} mora biti ponovljen ispravno.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} ne smije biti jednak"{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ne smije biti jednak"{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} treba sadržavati najmanje {min, number} {min, plural, one{znak} other{znakova}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} treba sadržavati najviše {max, number} {max, plural, one{znak} other{znakova}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} treba sadržavati {length, number} {length, plural, one{znak} other{znakova}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => 'prije {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'prije {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', '{delta, plural, =1{a month} other{# months}} ago' => 'prije {delta, plural, =1{mjesec} one{# mjesec} few{# mjeseci} many{# mjeseci} other{# mjeseci}}', @@ -98,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -106,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{bajt} other{bajtova}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibajt} other{gibibajta}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabajt} other{gigabajta}}', diff --git a/framework/messages/ca/yii.php b/framework/messages/ca/yii.php index f404ab6411d..9e359a0dd5d 100644 --- a/framework/messages/ca/yii.php +++ b/framework/messages/ca/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(no establert)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'S\'ha produït un error intern al servidor.', 'Are you sure you want to delete this item?' => 'Estas segur que vols eliminar aquest element?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Eliminar', 'Error' => 'Error', 'File upload failed.' => 'Ha fallat la pujada del fitxer.', @@ -35,77 +40,108 @@ 'Missing required arguments: {params}' => 'Falten arguments requerits: {params}', 'Missing required parameters: {params}' => 'Falten paràmetres requerits: {params}', 'No' => 'No', - 'No help for unknown command "{command}".' => 'No hi ha ajuda per l\'ordre desconeguda "{command}"', - 'No help for unknown sub-command "{command}".' => 'No hi ha ajuda per la sub-ordre desconeguda "{command}"', 'No results found.' => 'No s\'han trobat resultats.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Només s\'accepten arxius amb els següents tipus MIME: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Només s\'accepten arxius amb les seguents extensions: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'No s\'ha trobat la pàgina.', 'Please fix the following errors:' => 'Si us plau corregeix els següents errors:', 'Please upload a file.' => 'Si us plau puja un arxiu.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Mostrant {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{element} other{elements}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'L\'arxiu "{file}" no és una imatge.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'L\'arxiu "{file}" és massa gran. El seu tamany no pot excedir {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'L\'arxiu "{file}" és massa petit. El seu tamany no pot ser menor que {formattedLimit}.', 'The format of {attribute} is invalid.' => 'El format de {attribute} és invalid.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imatge "{file}" és massa gran. L\'altura no pot ser major que {limit, number} {limit, plural, one{píxel} other{píxels}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imatge "{file}" és massa gran. L\'amplada no pot ser major que {limit, number} {limit, plural, one{píxel} other{píxels}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imatge "{file}" és massa petita. L\'altura no pot ser menor que {limit, number} {limit, plural, one{píxel} other{píxels}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imatge "{file}" és massa petita. L\'amplada no pot ser menor que {limit, number} {limit, plural, one{píxel} other{píxels}}.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'El codi de verificació és incorrecte.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{element} other{elements}}.', 'Unable to verify your data submission.' => 'No s\'ha pogut verificar les dades enviades.', - 'Unknown command "{command}".' => 'Ordre desconeguda "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Opció desconeguda: --{name}', 'Update' => 'Actualitzar', 'View' => 'Veure', 'Yes' => 'Sí', 'You are not allowed to perform this action.' => 'No tems permís per executar aquesta acció.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Pots pujar com a màxim {limit, number} {limit, plural, one{arxiu} other{arxius}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'en {delta, plural, =1{un dia} other{# dies}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'en {delta, plural, =1{un minut} other{# minuts}}', 'in {delta, plural, =1{a month} other{# months}}' => 'en {delta, plural, =1{un mes} other{# mesos}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'en {delta, plural, =1{un segon} other{# segons}}', 'in {delta, plural, =1{a year} other{# years}}' => 'en {delta, plural, =1{un any} other{# anys}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'en {delta, plural, =1{una hora} other{# hores}}', + 'just now' => '', 'the input value' => 'el valor d\'entrada', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" ja ha sigut utilitzat.', '{attribute} cannot be blank.' => '{attribute} no pot estar buit.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} és invalid.', '{attribute} is not a valid URL.' => '{attribute} no és una URL valida.', '{attribute} is not a valid email address.' => '{attribute} no es una direcció de correu valida.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} ha de ser "{requiredValue}".', '{attribute} must be a number.' => '{attribute} ha de ser un nombre.', '{attribute} must be a string.' => '{attribute} ha de ser una cadena de caràcters.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} ha de ser un nombre enter.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} ha de ser "{true}" o "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} ha de ser major que "{compareValue}', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} ha de ser major o igual que "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} ha de ser menor que "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} ha de ser menor o igual que "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} ha de ser major que "{compareValueOrAttribute}', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} ha de ser major o igual que "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} ha de ser menor que "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} ha de ser menor o igual que "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} no pot ser major que {max}.', '{attribute} must be no less than {min}.' => '{attribute} no pot ser menor que {min}.', - '{attribute} must be repeated exactly.' => '{attribute} ha de ser repetit exactament igual.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} no pot ser igual que "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} no pot ser igual que "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} hauria de contenir com a mínim {min, number} {min, plural, one{lletra} other{lletres}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} hauria de contenir com a màxim {max, number} {max, plural, one{lletra} other{lletres}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} hauria contenir {length, number} {length, plural, one{lletra} other{lletres}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => 'hace {delta, plural, =1{un dia} other{# dies}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'fa {delta, plural, =1{un minut} other{# minuts}}', '{delta, plural, =1{a month} other{# months}} ago' => 'fa {delta, plural, =1{un mes} other{# mesos}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'fa {delta, plural, =1{un segon} other{# segons}}', '{delta, plural, =1{a year} other{# years}} ago' => 'fa {delta, plural, =1{un any} other{# anys}}', '{delta, plural, =1{an hour} other{# hours}} ago' => 'fa {delta, plural, =1{una hora} other{# hores}}', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# byte} other{# bytes}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabyte} other{# gigabytes}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobyte} other{# kilobytes}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabyte} other{# megabytes}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabyte} other{# petabytes}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# terabyte} other{# terabytes}}', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', ]; diff --git a/framework/messages/config.php b/framework/messages/config.php index 6028328f315..21ba4310a5c 100644 --- a/framework/messages/config.php +++ b/framework/messages/config.php @@ -25,12 +25,12 @@ // boolean, whether to sort messages by keys when merging new messages // with the existing ones. Defaults to false, which means the new (untranslated) // messages will be separated from the old (translated) ones. - 'sort' => false, + 'sort' => true, // boolean, whether the message file should be overwritten with the merged messages 'overwrite' => true, // boolean, whether to remove messages that no longer appear in the source code. // Defaults to false, which means each of these messages will be enclosed with a pair of '@@' marks. - 'removeUnused' => false, + 'removeUnused' => true, // boolean, whether to mark messages that no longer appear in the source code. // Defaults to true, which means each of these messages will be enclosed with a pair of '@@' marks. 'markUnused' => true, diff --git a/framework/messages/cs/yii.php b/framework/messages/cs/yii.php index d5c8232f1ba..5520301c14b 100644 --- a/framework/messages/cs/yii.php +++ b/framework/messages/cs/yii.php @@ -24,43 +24,13 @@ */ return [ ' and ' => ' a ', - 'Powered by {yii}' => 'Běží na {yii}', - 'The combination {values} of {attributes} has already been taken.' => 'Kombinace {values} pro {attributes} je již použitá.', - 'Unknown alias: -{name}' => 'Neznámý alias: -{name}', - 'Yii Framework' => 'Yii Framework', - '{attribute} contains wrong subnet mask.' => '{attribute} obsahuje neplatnou masku podsítě.', - '{attribute} is not in the allowed range.' => '{attribute} není v povoleném rozsahu.', - '{attribute} must be a valid IP address.' => '{attribute} musí být platná IP adresa.', - '{attribute} must be an IP address with specified subnet.' => '{attribute} musí být IP adresa se zadanou podsítí.', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} se musí rovnat "{compareValueOrAttribute}".', - '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} musí být větší než "{compareValueOrAttribute}".', - '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} musí být větší nebo roven "{compareValueOrAttribute}".', - '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} musí být menší než "{compareValueOrAttribute}".', - '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} musí být menší nebo roven "{compareValueOrAttribute}".', - '{attribute} must not be a subnet.' => '{attribute} nesmí být podsíť.', - '{attribute} must not be an IPv4 address.' => '{attribute} nesmí být IPv4 adresa.', - '{attribute} must not be an IPv6 address.' => '{attribute} nesmí být IPv6 adresa.', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} se nesmí rovnat "{compareValueOrAttribute}".', - '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 den} few{# dny} other{# dní}}', - '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hodina} few{# hodiny} other{# hodin}}', - '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuta} few{# minuty} other{# minut}}', - '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 měsíc} few{# měsíce} other{# měsíců}}', - '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 sekunda} few{# sekundy} other{# sekund}}', - '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 rok} few{# roky} other{# let}}', - '{nFormatted} B' => '{nFormatted} B', - '{nFormatted} GB' => '{nFormatted} GB', - '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', - '{nFormatted} KiB' => '{nFormatted} KiB', - '{nFormatted} MB' => '{nFormatted} MB', - '{nFormatted} MiB' => '{nFormatted} MiB', - '{nFormatted} PB' => '{nFormatted} PB', - '{nFormatted} PiB' => '{nFormatted} PiB', - '{nFormatted} TB' => '{nFormatted} TB', - '{nFormatted} TiB' => '{nFormatted} TiB', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(není zadáno)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Vyskytla se vnitřní chyba serveru.', 'Are you sure you want to delete this item?' => 'Opravdu chcete smazat tuto položku?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Smazat', 'Error' => 'Chyba', 'File upload failed.' => 'Nepodařilo se nahrát soubor.', @@ -73,14 +43,19 @@ 'No results found.' => 'Nenalezeny žádné záznamy.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Povolené jsou pouze soubory následujících MIME typů: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Povolené jsou pouze soubory s následujícími příponami: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Stránka nenalezena.', 'Please fix the following errors:' => 'Opravte prosím následující chyby:', 'Please upload a file.' => 'Nahrajte prosím soubor.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, plural, one{Zobrazen} few{Zobrazeny} other{Zobrazeno}} {totalCount, plural, one{{begin, number}} other{{begin, number}-{end, number}}} z {totalCount, number} {totalCount, plural, one{záznamu} other{záznamů}}.', + 'The combination {values} of {attributes} has already been taken.' => 'Kombinace {values} pro {attributes} je již použitá.', 'The file "{file}" is not an image.' => 'Soubor "{file}" není obrázek.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Soubor "{file}" je příliš velký. Velikost souboru nesmí přesáhnout {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Soubor "{file}" je příliš malý. Velikost souboru nesmí být méně než {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Formát údaje {attribute} je neplatný.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obrázek "{file}" je příliš velký. Výška nesmí přesáhnout {limit, number} {limit, plural, one{pixel} few{pixely} other{pixelů}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obrázek "{file}" je příliš velký. Šířka nesmí přesáhnout {limit, number} {limit, plural, one{pixel} few{pixely} other{pixelů}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obrázek "{file}" je příliš malý. Výška nesmí být méně než {limit, number} {limit, plural, one{pixel} few{pixely} other{pixelů}}.', @@ -89,12 +64,15 @@ 'The verification code is incorrect.' => 'Nesprávný ověřovací kód.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Celkem {count, number} {count, plural, one{záznam} few{záznamy} other{záznamů}}.', 'Unable to verify your data submission.' => 'Nebylo možné ověřit odeslané údaje.', + 'Unknown alias: -{name}' => 'Neznámý alias: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Neznámá volba: --{name}', 'Update' => 'Upravit', 'View' => 'Náhled', 'Yes' => 'Ano', 'You are not allowed to perform this action.' => 'Nemáte oprávnění pro požadovanou akci.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Nahrát můžete nanejvýš {limit, number} {limit, plural, one{soubor} few{soubory} other{souborů}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{den} few{# dny} other{# dnů}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minutu} few{# minuty} other{# minut}}', 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{měsíc} few{# měsíce} other{# měsíců}}', @@ -105,25 +83,56 @@ 'the input value' => 'vstupní hodnota', '{attribute} "{value}" has already been taken.' => 'Hodnota "{value}" pro údaj {attribute} již byla dříve použita.', '{attribute} cannot be blank.' => 'Je zapotřebí vyplnit {attribute}.', + '{attribute} contains wrong subnet mask.' => '{attribute} obsahuje neplatnou masku podsítě.', '{attribute} is invalid.' => 'Neplatná hodnota pro {attribute}.', '{attribute} is not a valid URL.' => '{attribute} není platná URL.', '{attribute} is not a valid email address.' => 'Pro {attribute} nebyla použita platná emailová adresa.', + '{attribute} is not in the allowed range.' => '{attribute} není v povoleném rozsahu.', '{attribute} must be "{requiredValue}".' => '{attribute} musí být "{requiredValue}".', '{attribute} must be a number.' => '{attribute} musí být číslo.', '{attribute} must be a string.' => '{attribute} musí být řetězec.', + '{attribute} must be a valid IP address.' => '{attribute} musí být platná IP adresa.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} musí být IP adresa se zadanou podsítí.', '{attribute} must be an integer.' => '{attribute} musí být celé číslo.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} musí být buď "{true}" nebo "{false}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} se musí rovnat "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} musí být větší než "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} musí být větší nebo roven "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} musí být menší než "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} musí být menší nebo roven "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} nesmí být větší než {max}.', '{attribute} must be no less than {min}.' => '{attribute} nesmí být menší než {min}.', + '{attribute} must not be a subnet.' => '{attribute} nesmí být podsíť.', + '{attribute} must not be an IPv4 address.' => '{attribute} nesmí být IPv4 adresa.', + '{attribute} must not be an IPv6 address.' => '{attribute} nesmí být IPv6 adresa.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} se nesmí rovnat "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} musí obsahovat alespoň {min, number} {min, plural, one{znak} few{znaky} other{znaků}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} může obsahovat nanejvýš {max, number} {max, plural, one{znak} few{znaky} other{znaků}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} musí obsahovat {length, number} {length, plural, one{znak} few{znaky} other{znaků}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 den} few{# dny} other{# dní}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hodina} few{# hodiny} other{# hodin}}', + '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuta} few{# minuty} other{# minut}}', + '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 měsíc} few{# měsíce} other{# měsíců}}', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 sekunda} few{# sekundy} other{# sekund}}', + '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 rok} few{# roky} other{# let}}', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{včera} other{před # dny}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'před {delta, plural, =1{minutou} other{# minutami}}', '{delta, plural, =1{a month} other{# months}} ago' => 'před {delta, plural, =1{měsícem} other{# měsíci}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'před {delta, plural, =1{sekundou} other{# sekundami}}', '{delta, plural, =1{a year} other{# years}} ago' => 'před {delta, plural, =1{rokem} other{# lety}}', '{delta, plural, =1{an hour} other{# hours}} ago' => 'před {delta, plural, =1{hodinou} other{# hodinami}}', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} few{byty} other{bytů}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} few{gibibyty} other{gibibytů}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} few{gigabyty} other{gigabytů}}', diff --git a/framework/messages/da/yii.php b/framework/messages/da/yii.php index d7e27d265e3..6f074dd60be 100644 --- a/framework/messages/da/yii.php +++ b/framework/messages/da/yii.php @@ -23,90 +23,125 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '(not set)' => '(ikke defineret)', - 'An internal server error occurred.' => 'Der opstod en intern server fejl.', - 'Are you sure you want to delete this item?' => 'Er du sikker på, at du vil slette dette element?', - 'Delete' => 'Slet', - 'Error' => 'Fejl', - 'File upload failed.' => 'Upload af fil fejlede.', - 'Home' => 'Start', - 'Invalid data received for parameter "{param}".' => 'Ugyldig data modtaget for parameteren "{param}".', - 'Login Required' => 'Login Påkrævet', - 'Missing required arguments: {params}' => 'Påkrævede argumenter mangler: {params}', - 'Missing required parameters: {params}' => 'Påkrævede parametre mangler: {params}', - 'No' => 'Nej', - 'No help for unknown command "{command}".' => 'Ingen hjælp til ukendt kommando "{command}".', - 'No help for unknown sub-command "{command}".' => 'Ingen hjælp til ukendt under-kommando "{command}".', - 'No results found.' => 'Ingen resultater fundet.', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Kun filer med følgende MIME-typer er tilladte: {mimeTypes}.', - 'Only files with these extensions are allowed: {extensions}.' => 'Kun filer med følgende filtyper er tilladte: {extensions}.', - 'Page not found.' => 'Siden blev ikke fundet.', - 'Please fix the following errors:' => 'Ret venligst følgende fejl:', - 'Please upload a file.' => 'Venligst upload en fil.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Viser {begin, number}-{end, number} af {totalCount, number} {totalCount, plural, one{element} other{elementer}}.', - 'The file "{file}" is not an image.' => 'Filen "{file}" er ikke et billede.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Filen "{file}" er for stor. Størrelsen må ikke overstige {formattedLimit}.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Filen "{file}" er for lille. Størrelsen må ikke være mindre end {formattedLimit}.', - 'The format of {attribute} is invalid.' => 'Formatet af {attribute} er ugyldigt.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for stort. Højden må ikke være større end {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for stort. Bredden må ikke være større end {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for lille. Højden må ikke være mindre end {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for lille. Bredden må ikke være mindre end {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The requested view "{name}" was not found.' => 'Den ønskede visning "{name}" blev ikke fundet.', - 'The verification code is incorrect.' => 'Verifikationskoden er ikke korrekt.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{element} other{elementer}}.', - 'Unable to verify your data submission.' => 'Kunne ikke verificere din data indsendelse.', - 'Unknown command "{command}".' => 'Ukendt kommando "{command}".', - 'Unknown option: --{name}' => 'Ukendt option: --{name}', - 'Update' => 'Opdatér', - 'View' => 'Vis', - 'Yes' => 'Ja', - 'You are not allowed to perform this action.' => 'Du har ikke tilladelse til at udføre denne handling.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Du kan højst uploade {limit, number} {limit, plural, one{fil} other{filer}}.', - 'in {delta, plural, =1{a day} other{# days}}' => 'om {delta, plural, =1{en dag} other{# dage}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'om {delta, plural, =1{et minut} other{# minutter}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'om {delta, plural, =1{en måned} other{# måneder}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'om {delta, plural, =1{et sekund} other{# sekunder}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'om {delta, plural, =1{et år} other{# år}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'om {delta, plural, =1{en time} other{# timer}}', - 'the input value' => 'inputværdien', - '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" er allerede i brug.', - '{attribute} cannot be blank.' => '{attribute} må ikke være tom.', - '{attribute} is invalid.' => '{attribute} er ugyldig.', - '{attribute} is not a valid URL.' => '{attribute} er ikke en gyldig URL.', - '{attribute} is not a valid email address.' => '{attribute} er ikke en gyldig emailadresse.', - '{attribute} must be "{requiredValue}".' => '{attribute} skal være "{requiredValue}".', - '{attribute} must be a number.' => '{attribute} skal være et nummer.', - '{attribute} must be a string.' => '{attribute} skal være en tekst-streng.', - '{attribute} must be an integer.' => '{attribute} skal være et heltal.', - '{attribute} must be either "{true}" or "{false}".' => '{attribute} skal være enten "{true}" eller "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} skal være større end "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} skal være større end eller lig med "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} skal være mindre end "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} skal være mindre end eller lig med "{compareValue}".', - '{attribute} must be no greater than {max}.' => '{attribute} må ikke være større end {max}.', - '{attribute} must be no less than {min}.' => '{attribute} må ikke være mindre end {min}.', - '{attribute} must be repeated exactly.' => '{attribute} skal være gentaget præcist.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} må ikke være lig med "{compareValue}".', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} skal mindst indeholde {min, number} {min, plural, one{tegn} other{tegn}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} skal højst indeholde {max, number} {max, plural, one{tegn} other{tegn}}.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} skal indeholde {length, number} {length, plural, one{tegn} other{tegn}}.', - '{delta, plural, =1{a day} other{# days}} ago' => 'for {delta, plural, =1{en dag} other{# dage}} siden', - '{delta, plural, =1{a minute} other{# minutes}} ago' => 'for {delta, plural, =1{et minut} other{# minutter}} siden', - '{delta, plural, =1{a month} other{# months}} ago' => 'for {delta, plural, =1{en måned} other{# måneder}} siden', - '{delta, plural, =1{a second} other{# seconds}} ago' => 'for {delta, plural, =1{et sekund} other{# sekunder}} siden', - '{delta, plural, =1{a year} other{# years}} ago' => 'for {delta, plural, =1{et år} other{# år}} siden', - '{delta, plural, =1{an hour} other{# hours}} ago' => 'for {delta, plural, =1{en time} other{# timer}} siden', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# byte} other{# bytes}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabyte} other{# gigabytes}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobyte} other{# kilobytes}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabyte} other{# megabytes}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabyte} other{# petabytes}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# terabyte} other{# terabytes}}', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', + '(not set)' => '(ikke defineret)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', + 'An internal server error occurred.' => 'Der opstod en intern server fejl.', + 'Are you sure you want to delete this item?' => 'Er du sikker på, at du vil slette dette element?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', + 'Delete' => 'Slet', + 'Error' => 'Fejl', + 'File upload failed.' => 'Upload af fil fejlede.', + 'Home' => 'Start', + 'Invalid data received for parameter "{param}".' => 'Ugyldig data modtaget for parameteren "{param}".', + 'Login Required' => 'Login Påkrævet', + 'Missing required arguments: {params}' => 'Påkrævede argumenter mangler: {params}', + 'Missing required parameters: {params}' => 'Påkrævede parametre mangler: {params}', + 'No' => 'Nej', + 'No results found.' => 'Ingen resultater fundet.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Kun filer med følgende MIME-typer er tilladte: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Kun filer med følgende filtyper er tilladte: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', + 'Page not found.' => 'Siden blev ikke fundet.', + 'Please fix the following errors:' => 'Ret venligst følgende fejl:', + 'Please upload a file.' => 'Venligst upload en fil.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Viser {begin, number}-{end, number} af {totalCount, number} {totalCount, plural, one{element} other{elementer}}.', + 'The combination {values} of {attributes} has already been taken.' => '', + 'The file "{file}" is not an image.' => 'Filen "{file}" er ikke et billede.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Filen "{file}" er for stor. Størrelsen må ikke overstige {formattedLimit}.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Filen "{file}" er for lille. Størrelsen må ikke være mindre end {formattedLimit}.', + 'The format of {attribute} is invalid.' => 'Formatet af {attribute} er ugyldigt.', + 'The format of {filter} is invalid.' => '', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for stort. Højden må ikke være større end {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for stort. Bredden må ikke være større end {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for lille. Højden må ikke være mindre end {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Billedet "{file}" er for lille. Bredden må ikke være mindre end {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The requested view "{name}" was not found.' => 'Den ønskede visning "{name}" blev ikke fundet.', + 'The verification code is incorrect.' => 'Verifikationskoden er ikke korrekt.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{element} other{elementer}}.', + 'Unable to verify your data submission.' => 'Kunne ikke verificere din data indsendelse.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', + 'Unknown option: --{name}' => 'Ukendt option: --{name}', + 'Update' => 'Opdatér', + 'View' => 'Vis', + 'Yes' => 'Ja', + 'You are not allowed to perform this action.' => 'Du har ikke tilladelse til at udføre denne handling.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Du kan højst uploade {limit, number} {limit, plural, one{fil} other{filer}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => 'om {delta, plural, =1{en dag} other{# dage}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'om {delta, plural, =1{et minut} other{# minutter}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'om {delta, plural, =1{en måned} other{# måneder}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'om {delta, plural, =1{et sekund} other{# sekunder}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'om {delta, plural, =1{et år} other{# år}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'om {delta, plural, =1{en time} other{# timer}}', + 'just now' => '', + 'the input value' => 'inputværdien', + '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" er allerede i brug.', + '{attribute} cannot be blank.' => '{attribute} må ikke være tom.', + '{attribute} contains wrong subnet mask.' => '', + '{attribute} is invalid.' => '{attribute} er ugyldig.', + '{attribute} is not a valid URL.' => '{attribute} er ikke en gyldig URL.', + '{attribute} is not a valid email address.' => '{attribute} er ikke en gyldig emailadresse.', + '{attribute} is not in the allowed range.' => '', + '{attribute} must be "{requiredValue}".' => '{attribute} skal være "{requiredValue}".', + '{attribute} must be a number.' => '{attribute} skal være et nummer.', + '{attribute} must be a string.' => '{attribute} skal være en tekst-streng.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', + '{attribute} must be an integer.' => '{attribute} skal være et heltal.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} skal være enten "{true}" eller "{false}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} skal være større end "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} skal være større end eller lig med "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} skal være mindre end "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} skal være mindre end eller lig med "{compareValueOrAttribute}".', + '{attribute} must be no greater than {max}.' => '{attribute} må ikke være større end {max}.', + '{attribute} must be no less than {min}.' => '{attribute} må ikke være mindre end {min}.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} må ikke være lig med "{compareValueOrAttribute}".', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} skal mindst indeholde {min, number} {min, plural, one{tegn} other{tegn}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} skal højst indeholde {max, number} {max, plural, one{tegn} other{tegn}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} skal indeholde {length, number} {length, plural, one{tegn} other{tegn}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => 'for {delta, plural, =1{en dag} other{# dage}} siden', + '{delta, plural, =1{a minute} other{# minutes}} ago' => 'for {delta, plural, =1{et minut} other{# minutter}} siden', + '{delta, plural, =1{a month} other{# months}} ago' => 'for {delta, plural, =1{en måned} other{# måneder}} siden', + '{delta, plural, =1{a second} other{# seconds}} ago' => 'for {delta, plural, =1{et sekund} other{# sekunder}} siden', + '{delta, plural, =1{a year} other{# years}} ago' => 'for {delta, plural, =1{et år} other{# år}} siden', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'for {delta, plural, =1{en time} other{# timer}} siden', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', ]; diff --git a/framework/messages/de/yii.php b/framework/messages/de/yii.php index 51ede9951a1..96f36ac4374 100644 --- a/framework/messages/de/yii.php +++ b/framework/messages/de/yii.php @@ -24,9 +24,13 @@ */ return [ ' and ' => ' und ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" unterstützt den Operator "{operator}" nicht.', '(not set)' => '(nicht gesetzt)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Es ist ein interner Serverfehler aufgetreten.', 'Are you sure you want to delete this item?' => 'Wollen Sie diesen Eintrag wirklich löschen?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Die Bedingung für "{attribute}" muss entweder ein Wert oder ein gültiger Operator sein.', 'Delete' => 'Löschen', 'Error' => 'Fehler', 'File upload failed.' => 'Das Hochladen der Datei ist fehlgeschlagen.', @@ -39,16 +43,19 @@ 'No results found.' => 'Keine Ergebnisse gefunden', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Es sind nur Dateien mit folgenden MIME-Typen erlaubt: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Es sind nur Dateien mit folgenden Dateierweiterungen erlaubt: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'Der Operator "{operator}" muss zusammen mit einem Such-Attribut verwendet werden.', + 'Operator "{operator}" requires multiple operands.' => 'Der Operator "{operator}" erwartet mehrere Operanden.', + 'Options available: {options}' => '', 'Page not found.' => 'Seite nicht gefunden.', 'Please fix the following errors:' => 'Bitte korrigieren Sie die folgenden Fehler:', 'Please upload a file.' => 'Bitte laden Sie eine Datei hoch.', - 'Powered by {yii}' => 'Basiert auf {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Zeige {begin, number}-{end, number} von {totalCount, number} {totalCount, plural, one{Eintrag} other{Einträgen}}.', 'The combination {values} of {attributes} has already been taken.' => 'Die Kombination {values} für {attributes} wird bereits verwendet.', 'The file "{file}" is not an image.' => 'Die Datei "{file}" ist kein Bild.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Die Datei "{file}" ist zu groß. Es sind maximal {formattedLimit} erlaubt.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Die Datei "{file}" ist zu klein. Es sind mindestens {formattedLimit} erforderlich.', 'The format of {attribute} is invalid.' => 'Das Format von {attribute} ist ungültig.', + 'The format of {filter} is invalid.' => 'Das Format von {filter} ist ungültig.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Das Bild "{file}" ist zu groß. Es darf maximal {limit, number} Pixel hoch sein.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Das Bild "{file}" ist zu groß. Es darf maximal {limit, number} Pixel breit sein.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Das Bild "{file}" ist zu klein. Es muss mindestens {limit, number} Pixel hoch sein.', @@ -58,13 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Insgesamt {count, number} {count, plural, one{Eintrag} other{Einträge}}.', 'Unable to verify your data submission.' => 'Ihre Dateneingabe konnte nicht überprüft werden oder ist ungültig.', 'Unknown alias: -{name}' => 'Unbekannter Alias: -{name}', + 'Unknown filter attribute "{attribute}"' => 'Unbekanntes Filter-Attribut "{attribute}"', 'Unknown option: --{name}' => 'Unbekannte Option: --{name}', 'Update' => 'Bearbeiten', 'View' => 'Anzeigen', 'Yes' => 'Ja', - 'Yii Framework' => 'Yii Framework', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Sie können maximal {limit, plural, one{eine Datei} other{# Dateien}} hochladen.', 'You are not allowed to perform this action.' => 'Sie dürfen diese Aktion nicht durchführen.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Sie können maximal {limit, plural, one{eine Datei} other{# Dateien}} hochladen.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'in {delta, plural, =1{einem Tag} other{# Tagen}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'in {delta, plural, =1{einer Minute} other{# Minuten}}', 'in {delta, plural, =1{a month} other{# months}}' => 'in {delta, plural, =1{einem Monat} other{# Monaten}}', @@ -101,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} muss mindestens {min, number} Zeichen enthalten.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} darf maximal {max, number} Zeichen enthalten.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} muss aus genau {length, number} Zeichen bestehen.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 Tag} other{# Tage}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 Stunde} other{# Stunden}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 Minute} other{# Minuten}}', @@ -116,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -124,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} Byte', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} GibiByte', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} Gigabyte', @@ -135,10 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} Petabyte', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} TebiByte', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} Terabyte', - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" unterstützt den Operator "{operator}" nicht.', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Die Bedingung für "{attribute}" muss entweder ein Wert oder ein gültiger Operator sein.', - 'Operator "{operator}" must be used with a search attribute.' => 'Der Operator "{operator}" muss zusammen mit einem Such-Attribut verwendet werden.', - 'Operator "{operator}" requires multiple operands.' => 'Der Operator "{operator}" erwartet mehrere Operanden.', - 'The format of {filter} is invalid.' => 'Das Format von {filter} ist ungültig.', - 'Unknown filter attribute "{attribute}"' => 'Unbekanntes Filter-Attribut "{attribute}"', ]; diff --git a/framework/messages/el/yii.php b/framework/messages/el/yii.php index 2c4cfa79fd9..fddd64d8212 100644 --- a/framework/messages/el/yii.php +++ b/framework/messages/el/yii.php @@ -109,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Το «{attribute}» πρέπει να περιέχει τουλάχιστον {min, number} {min, plural, one{χαρακτήρα} few{χαρακτήρες} many{χαρακτήρες} other{χαρακτήρες}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Το «{attribute}» πρέπει να περιέχει το πολύ {max, number} {max, plural, one{χαρακτήρα} few{χαρακτήρες} many{χαρακτήρες} other{χαρακτήρες}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Το «{attribute}» πρέπει να περιέχει {length, number} {length, plural, one{χαρακτήρα} few{χαρακτήρες} many{χαρακτήρες} other{χαρακτήρες}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 ημέρα} other{# ημέρες}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 ώρα} other{# ώρες}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 λεπτό} other{# λεπτά}}', diff --git a/framework/messages/es/yii.php b/framework/messages/es/yii.php index 6d65a3233c8..af60f0767ed 100644 --- a/framework/messages/es/yii.php +++ b/framework/messages/es/yii.php @@ -24,10 +24,13 @@ */ return [ ' and ' => ' y ', - 'The combination {values} of {attributes} has already been taken.' => 'La combinación de {values} de {attributes} ya ha sido utilizada.', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(no definido)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Hubo un error interno del servidor.', 'Are you sure you want to delete this item?' => '¿Está seguro de eliminar este elemento?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Eliminar', 'Error' => 'Error', 'File upload failed.' => 'Falló la subida del archivo.', @@ -40,15 +43,19 @@ 'No results found.' => 'No se encontraron resultados.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Sólo se aceptan archivos con los siguientes tipos MIME: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Sólo se aceptan archivos con las siguientes extensiones: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Página no encontrada.', 'Please fix the following errors:' => 'Por favor corrija los siguientes errores:', 'Please upload a file.' => 'Por favor suba un archivo.', - 'Powered by {yii}' => 'Desarrollado con {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Mostrando {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{elemento} other{elementos}}.', + 'The combination {values} of {attributes} has already been taken.' => 'La combinación de {values} de {attributes} ya ha sido utilizada.', 'The file "{file}" is not an image.' => 'El archivo "{file}" no es una imagen.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'El archivo "{file}" es demasiado grande. Su tamaño no puede exceder {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'El archivo "{file}" es demasiado pequeño. Su tamaño no puede ser menor a {formattedLimit}.', 'The format of {attribute} is invalid.' => 'El formato de {attribute} es inválido.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imagen "{file}" es demasiado grande. La altura no puede ser mayor a {limit, number} {limit, plural, one{píxel} other{píxeles}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imagen "{file}" es demasiado grande. La anchura no puede ser mayor a {limit, number} {limit, plural, one{píxel} other{píxeles}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'La imagen "{file}" es demasiado pequeña. La altura no puede ser menor a {limit, number} {limit, plural, one{píxel} other{píxeles}}.', @@ -58,13 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{elemento} other{elementos}}.', 'Unable to verify your data submission.' => 'Incapaz de verificar los datos enviados.', 'Unknown alias: -{name}' => 'Alias desconocido: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Opción desconocida: --{name}', 'Update' => 'Actualizar', 'View' => 'Ver', 'Yes' => 'Sí', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'No tiene permitido ejecutar esta acción.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Puedes subir como máximo {limit, number} {limit, plural, one{archivo} other{archivos}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'en {delta, plural, =1{un día} other{# días}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'en {delta, plural, =1{un minuto} other{# minutos}}', 'in {delta, plural, =1{a month} other{# months}}' => 'en {delta, plural, =1{un mes} other{# meses}}', @@ -101,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} debería contener al menos {min, number} {min, plural, one{letra} other{letras}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} debería contener como máximo {max, number} {max, plural, one{letra} other{letras}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} debería contener {length, number} {length, plural, one{letra} other{letras}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 día} other{# días}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hora} other{# horas}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minutos}}', @@ -116,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -124,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', diff --git a/framework/messages/et/yii.php b/framework/messages/et/yii.php index 337d7fc1506..950274fa961 100644 --- a/framework/messages/et/yii.php +++ b/framework/messages/et/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => ' ja ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ei toeta tehtemärki "{operator}".', '(not set)' => '(määramata)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Ilmnes serveri sisemine viga.', 'Are you sure you want to delete this item?' => 'Kas olete kindel, et soovite selle üksuse kustutada?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Atribuudi "{attribute}" tingimus peaks olema kas väärtus või korrektne tehtemärgi spetsifikatsioon.', 'Delete' => 'Kustuta', 'Error' => 'Viga', 'File upload failed.' => 'Faili üleslaadimine ebaõnnestus.', @@ -38,14 +43,19 @@ 'No results found.' => 'Ei leitud ühtegi tulemust.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Lubatud on ainult nende MIME tüüpidega failid: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Lubatud on ainult nende faililaienditega failid: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'Tehtemärki "{operator}" peab kasutama koos otsinguatribuudiga.', + 'Operator "{operator}" requires multiple operands.' => 'Tehtemärk "{operator}" nõuab mitut operandi.', + 'Options available: {options}' => '', 'Page not found.' => 'Lehekülge ei leitud.', 'Please fix the following errors:' => 'Palun parandage järgnevad vead:', 'Please upload a file.' => 'Palun laadige fail üles.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Näitan {totalCount, number} {totalCount, plural, one{üksusest} other{üksusest}} {begin, number}-{end, number}.', + 'The combination {values} of {attributes} has already been taken.' => 'Atribuutide {attributes} väärtuste kombinatsioon {values} on juba võetud.', 'The file "{file}" is not an image.' => 'See fail "{file}" ei ole pilt.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'See fail "{file}" on liiga suur. Suurus ei tohi ületada {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'See fail "{file}" on liiga väike. Suurus ei tohi olla väiksem kui {formattedLimit}.', 'The format of {attribute} is invalid.' => '{attribute} on sobimatus vormingus.', + 'The format of {filter} is invalid.' => 'Filtri {filter} formaat on sobimatu.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Pilt "{file}" on liiga suur. Kõrgus ei tohi olla suurem kui {limit, number} {limit, plural, one{piksel} other{pikslit}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Pilt "{file}" on liiga suur. Laius ei tohi olla suurem kui {limit, number} {limit, plural, one{piksel} other{pikslit}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Pilt "{file}" on liiga väike. Kõrgus ei tohi olla väiksem kui {limit, number} {limit, plural, one{piksel} other{pikslit}}.', @@ -54,72 +64,64 @@ 'The verification code is incorrect.' => 'Kontrollkood on vale.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Kokku {count, number} {count, plural, one{üksus} other{üksust}}.', 'Unable to verify your data submission.' => 'Ei suuda edastatud andmete õigsuses veenduda.', + 'Unknown alias: -{name}' => 'Tundmatu alias: -{name}', + 'Unknown filter attribute "{attribute}"' => 'Tundmatu filtri atribuut "{attribute}"', 'Unknown option: --{name}' => 'Tundmatu valik: --{name}', 'Update' => 'Muuda', 'View' => 'Vaata', 'Yes' => 'Jah', 'You are not allowed to perform this action.' => 'Teil pole õigust seda toimingut sooritada.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Saate üles laadida kõige rohkem {limit, number} {limit, plural, one{faili} other{faili}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Peaksid üles laadima vähemalt {limit, number} {limit, plural, one{faili} other{faili}}.', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{ühe päeva} other{# päeva}} pärast', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{ühe minuti} other{# minuti}} pärast', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{ühe kuu} other{# kuu}} pärast', 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta, plural, =1{ühe sekundi} other{# sekundi}} pärast', 'in {delta, plural, =1{a year} other{# years}}' => '{delta, plural, =1{ühe aasta} other{# aasta}} pärast', 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta, plural, =1{ühe tunni} other{# tunni}} pärast', + 'just now' => 'just nüüd', 'the input value' => 'sisendväärtus', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" on juba kasutuses.', '{attribute} cannot be blank.' => '{attribute} ei tohi olla tühi.', + '{attribute} contains wrong subnet mask.' => '{attribute} sisaldab valet alamvõrgumaski.', '{attribute} is invalid.' => '{attribute} on sobimatu.', '{attribute} is not a valid URL.' => '{attribute} ei ole korrektne URL.', '{attribute} is not a valid email address.' => '{attribute} ei ole korrektne e-posti aadress.', + '{attribute} is not in the allowed range.' => '{attribute} ei ole lubatud vahemikus.', '{attribute} must be "{requiredValue}".' => '{attribute} peab olema "{requiredValue}".', '{attribute} must be a number.' => '{attribute} peab olema number.', '{attribute} must be a string.' => '{attribute} peab olema tekst.', - '{attribute} must be an integer.' => '{attribute} peab olema täisarv.', - '{attribute} must be either "{true}" or "{false}".' => '{attribute} peab olema kas "{true}" või "{false}".', - '{attribute} must be no greater than {max}.' => '{attribute} ei tohi olla suurem kui {max}.', - '{attribute} must be no less than {min}.' => '{attribute} ei tohi olla väiksem kui {min}.', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} peab sisaldama vähemalt {min, number} {min, plural, one{tähemärki} other{tähemärki}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} tohib sisaldada maksimaalselt {max, number} {max, plural, one{tähemärki} other{tähemärki}}.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} peab sisaldama {length, number} {length, plural, one{tähemärki} other{tähemärki}}.', - '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{1 päev} other{# päeva}} tagasi', - '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{1 minut} other{# minutit}} tagasi', - '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{kuu aega} other{# kuud}} tagasi', - '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{1 sekund} other{# sekundit}} tagasi', - '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{aasta} other{# aastat}} tagasi', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{tund aega} other{# tundi}} tagasi', - ' and ' => ' ja ', - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ei toeta tehtemärki "{operator}".', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Atribuudi "{attribute}" tingimus peaks olema kas väärtus või korrektne tehtemärgi spetsifikatsioon.', - 'Operator "{operator}" must be used with a search attribute.' => 'Tehtemärki "{operator}" peab kasutama koos otsinguatribuudiga.', - 'Operator "{operator}" requires multiple operands.' => 'Tehtemärk "{operator}" nõuab mitut operandi.', - 'Powered by {yii}' => '', - 'The combination {values} of {attributes} has already been taken.' => 'Atribuutide {attributes} väärtuste kombinatsioon {values} on juba võetud.', - 'The format of {filter} is invalid.' => 'Filtri {filter} formaat on sobimatu.', - 'Unknown alias: -{name}' => 'Tundmatu alias: -{name}', - 'Unknown filter attribute "{attribute}"' => 'Tundmatu filtri atribuut "{attribute}"', - 'Yii Framework' => 'Yii raamistik', - 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Peaksid üles laadima vähemalt {limit, number} {limit, plural, one{faili} other{faili}}.', - 'just now' => 'just nüüd', - '{attribute} contains wrong subnet mask.' => '{attribute} sisaldab valet alamvõrgumaski.', - '{attribute} is not in the allowed range.' => '{attribute} ei ole lubatud vahemikus.', '{attribute} must be a valid IP address.' => '{attribute} peab olema õige IP-aadress', '{attribute} must be an IP address with specified subnet.' => '{attribute} peab olema võrgumaskiga IP-aadress.', + '{attribute} must be an integer.' => '{attribute} peab olema täisarv.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} peab olema kas "{true}" või "{false}".', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} peab olema "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} peab olema suurem kui "{compareValueOrAttribute}".', '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} peab olema suurem või võrdne "{compareValueOrAttribute}".', '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} peab olema väiksem kui "{compareValueOrAttribute}".', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} peab olema väiksem või võrdne "{compareValueOrAttribute}".', + '{attribute} must be no greater than {max}.' => '{attribute} ei tohi olla suurem kui {max}.', + '{attribute} must be no less than {min}.' => '{attribute} ei tohi olla väiksem kui {min}.', '{attribute} must not be a subnet.' => '{attribute} ei tohi olla alamvõrk.', '{attribute} must not be an IPv4 address.' => '{attribute} ei tohi olla IPv4 aadress.', '{attribute} must not be an IPv6 address.' => '{attribute} ei tohi olla IPv6 aadress.', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ei tohi olla "{compareValueOrAttribute}".', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} peab sisaldama vähemalt {min, number} {min, plural, one{tähemärki} other{tähemärki}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} tohib sisaldada maksimaalselt {max, number} {max, plural, one{tähemärki} other{tähemärki}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} peab sisaldama {length, number} {length, plural, one{tähemärki} other{tähemärki}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 päev} other{# päeva}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 tund} other{# tundi}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minut} other{# minutit}}', '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 kuu} other{# kuud}}', '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 sekund} other{# sekundit}}', '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 aasta} other{# aastat}}', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{1 päev} other{# päeva}} tagasi', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{1 minut} other{# minutit}} tagasi', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{kuu aega} other{# kuud}} tagasi', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{1 sekund} other{# sekundit}} tagasi', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{aasta} other{# aastat}} tagasi', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{tund aega} other{# tundi}} tagasi', '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', diff --git a/framework/messages/fa/yii.php b/framework/messages/fa/yii.php index 5e342948063..86d08922ca8 100644 --- a/framework/messages/fa/yii.php +++ b/framework/messages/fa/yii.php @@ -24,9 +24,13 @@ */ return [ ' and ' => ' و ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" از عملگر "{operator}" پشتیبانی نمی‌کند.', '(not set)' => '(تنظیم نشده)', + 'Action not found.' => 'عمل یافت نشد.', + 'Aliases available: {aliases}' => 'نام مستعارهای موجود: {aliases}', 'An internal server error occurred.' => 'خطای داخلی سرور رخ داده است.', 'Are you sure you want to delete this item?' => 'آیا اطمینان به حذف این مورد دارید؟', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'شرط برای "{attribute}" باید یک مقدار یا مشخصه‌ی عملگر معتبر باشد.', 'Delete' => 'حذف', 'Error' => 'خطا', 'File upload failed.' => 'آپلود فایل ناموفق بود.', @@ -39,6 +43,9 @@ 'No results found.' => 'نتیجه‌ای یافت نشد.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'فقط این نوع فایل‌ها مجاز می‌باشند: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'فقط فایل‌های با این پسوندها مجاز هستند: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'عملگر "{operator}" باید با یک ویژگی جستجو استفاده شود.', + 'Operator "{operator}" requires multiple operands.' => 'عملگر "{operator}" به چند عملوند نیاز دارد.', + 'Options available: {options}' => 'گزینه‌های موجود: {options}', 'Page not found.' => 'صفحه‌ای یافت نشد.', 'Please fix the following errors:' => 'لطفاً خطاهای زیر را رفع نمائید:', 'Please upload a file.' => 'لطفاً یک فایل آپلود کنید.', @@ -48,6 +55,7 @@ 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'حجم فایل "{file}" بسیار بیشتر می‌باشد. حجم آن نمی‌تواند از {formattedLimit} بیشتر باشد.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'حجم فایل "{file}" بسیار کم می‌باشد. حجم آن‌نمی تواند از {formattedLimit} کمتر باشد.', 'The format of {attribute} is invalid.' => 'قالب {attribute} نامعتبر است.', + 'The format of {filter} is invalid.' => 'قالب {filter} نامعتبر است.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی بزرگ است. ارتفاع نمی‌تواند بزرگتر از {limit, number} پیکسل باشد.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی بزرگ است. عرض نمی‌تواند بزرگتر از {limit, number} پیکسل باشد.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی کوچک است. ارتفاع نمی‌تواند کوچکتر از {limit, number} پیکسل باشد.', @@ -57,12 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'مجموع {count, number} مورد.', 'Unable to verify your data submission.' => 'قادر به تأیید اطلاعات ارسالی شما نمی‌باشد.', 'Unknown alias: -{name}' => 'نام مستعار ناشناخته: -{name}', + 'Unknown filter attribute "{attribute}"' => 'ویژگی "{attribute}" فیلتر ناشناخته', 'Unknown option: --{name}' => 'گزینه ناشناخته: --{name}', 'Update' => 'بروزرسانی', 'View' => 'نما', 'Yes' => 'بله', 'You are not allowed to perform this action.' => 'شما برای انجام این عملیات، دسترسی ندارید.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'شما حداکثر {limit, number} فایل را می‌توانید آپلود کنید.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'شما باید حداقل {limit, number} فایل آپلود کنید.', 'in {delta, plural, =1{a day} other{# days}}' => '{delta} روز دیگر', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta} دقیقه دیگر', 'in {delta, plural, =1{a month} other{# months}}' => '{delta} ماه دیگر', @@ -99,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} حداقل باید شامل {min, number} کارکتر باشد.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} حداکثر باید شامل {max, number} کارکتر باشد.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} باید شامل {length, number} کارکتر باشد.', + '{compareAttribute} is invalid.' => '{compareAttribute} نامعتبر است.', '{delta, plural, =1{1 day} other{# days}}' => '{delta} روز', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} ساعت', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} دقیقه', @@ -133,15 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} پتابایت', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} تبی‌بایت', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} ترابایت', - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" از عملگر "{operator}" پشتیبانی نمی‌کند.', - 'Action not found.' => 'عمل یافت نشد.', - 'Aliases available: {aliases}' => 'نام مستعارهای موجود: {aliases}', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'شرط برای "{attribute}" باید یک مقدار یا مشخصه‌ی عملگر معتبر باشد.', - 'Operator "{operator}" must be used with a search attribute.' => 'عملگر "{operator}" باید با یک ویژگی جستجو استفاده شود.', - 'Operator "{operator}" requires multiple operands.' => 'عملگر "{operator}" به چند عملوند نیاز دارد.', - 'Options available: {options}' => 'گزینه‌های موجود: {options}', - 'The format of {filter} is invalid.' => 'قالب {filter} نامعتبر است.', - 'Unknown filter attribute "{attribute}"' => 'ویژگی "{attribute}" فیلتر ناشناخته', - 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'شما باید حداقل {limit, number} فایل آپلود کنید.', - '{compareAttribute} is invalid.' => '{compareAttribute} نامعتبر است.', ]; diff --git a/framework/messages/fi/yii.php b/framework/messages/fi/yii.php index 938fd62d97c..531a44214e7 100644 --- a/framework/messages/fi/yii.php +++ b/framework/messages/fi/yii.php @@ -23,17 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'Powered by {yii}' => 'Powered by {yii}', - 'Yii Framework' => 'Yii Framework', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla yhtä suuri kuin "{compareValueOrAttribute}".', - '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} täytyy olla suurempi kuin "{compareValueOrAttribute}".', - '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla suurempi tai yhtä suuri kuin "{compareValueOrAttribute}".', - '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} täytyy olla pienempi kuin "{compareValueOrAttribute}".', - '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla pienempi tai yhtä suuri kuin "{compareValueOrAttribute}".', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ei saa olla yhtä suuri kuin "{compareValueOrAttribute}".', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(ei asetettu)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Sisäinen palvelinvirhe.', 'Are you sure you want to delete this item?' => 'Haluatko varmasti poistaa tämän?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Poista', 'Error' => 'Virhe', 'File upload failed.' => 'Tiedoston lähetys epäonnistui.', @@ -46,14 +43,19 @@ 'No results found.' => 'Ei tuloksia.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Sallittuja ovat vain tiedostot, joiden MIME-tyyppi on: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Sallittuja ovat vain tiedostot, joiden tiedostopääte on: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Sivua ei löytynyt.', 'Please fix the following errors:' => 'Korjaa seuraavat virheet:', 'Please upload a file.' => 'Lähetä tiedosto.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Näytetään {begin, number}-{end, number} kaikkiaan {totalCount, number} {totalCount, plural, one{tuloksesta} other{tuloksesta}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Tiedosto "{file}" ei ole kuva.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Tiedosto "{file}" on liian iso. Sen koko ei voi olla suurempi kuin {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Tiedosto "{file}" on liian pieni. Sen koko ei voi olla pienempi kuin {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Attribuutin {attribute} formaatti on virheellinen.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Kuva "{file}" on liian suuri. Korkeus ei voi olla suurempi kuin {limit, number} {limit, plural, one{pikseli} other{pikseliä}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Kuva "{file}" on liian suuri. Leveys ei voi olla suurempi kuin {limit, number} {limit, plural, one{pikseli} other{pikseliä}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Kuva "{file}" on liian pieni. Korkeus ei voi olla pienempi kuin {limit, number} {limit, plural, one{pikseli} other{pikseliä}}.', @@ -62,12 +64,15 @@ 'The verification code is incorrect.' => 'Vahvistuskoodi on virheellinen.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Yhteensä {count, number} {count, plural, one{tulos} other{tulosta}}.', 'Unable to verify your data submission.' => 'Tietojen lähetystä ei voida varmistaa.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Tuntematon valinta: --{name}', 'Update' => 'Päivitä', 'View' => 'Näytä', 'Yes' => 'Kyllä', 'You are not allowed to perform this action.' => 'Sinulla ei ole tarvittavia oikeuksia toiminnon suorittamiseen.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Voit lähettää enintään {limit, number} {limit, plural, one{tiedoston} other{tiedostoa}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{päivässä} other{# päivässä}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{minuutissa} other{# minuutissa}}', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{kuukaudessa} other{# kuukaudessa}}', @@ -90,14 +95,21 @@ '{attribute} must be an IP address with specified subnet.' => '{attribute} täytyy olla määritetyllä aliverkolla oleva IP-osoite.', '{attribute} must be an integer.' => '{attribute} täytyy olla kokonaisluku.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} täytyy olla joko {true} tai {false}.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla yhtä suuri kuin "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} täytyy olla suurempi kuin "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla suurempi tai yhtä suuri kuin "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} täytyy olla pienempi kuin "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} täytyy olla pienempi tai yhtä suuri kuin "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} ei saa olla suurempi kuin "{max}".', '{attribute} must be no less than {min}.' => '{attribute} ei saa olla pienempi kuin "{min}".', '{attribute} must not be a subnet.' => '{attribute} ei saa olla aliverkko.', '{attribute} must not be an IPv4 address.' => '{attribute} ei saa olla IPv4-osoite.', '{attribute} must not be an IPv6 address.' => '{attribute} ei saa olla IPv6-osoite.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ei saa olla yhtä suuri kuin "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} tulisi sisältää vähintään {min, number} {min, plural, one{merkki} other{merkkiä}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} tulisi sisältää enintään {max, number} {max, plural, one{merkki} other{merkkiä}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} tulisi sisältää {length, number} {length, plural, one{merkki} other{merkkiä}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 päivä} other{# päivää}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 tunti} other{# tuntia}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuutti} other{# minuuttia}}', @@ -113,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} t', '{nFormatted} GB' => '{nFormatted} Gt', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kt', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} Mt', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -121,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} Tt', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kt', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{tavu} other{tavua}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibitavu} other{gibitavua}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigatavu} other{gigatavua}}', diff --git a/framework/messages/fr/yii.php b/framework/messages/fr/yii.php index 458d7e738e7..8e1bfda3cd4 100644 --- a/framework/messages/fr/yii.php +++ b/framework/messages/fr/yii.php @@ -24,7 +24,10 @@ */ return [ ' and ' => ' et ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ne supporte pas l\'opérateur "{operator}".', '(not set)' => '(non défini)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Une erreur de serveur interne s\'est produite.', 'Are you sure you want to delete this item?' => 'Êtes-vous sûr de vouloir supprimer cet élément ?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'La condition pour "{atttribute}" doit être soit une valeur, soit une spécification d\'opérateur valide.', @@ -42,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Les extensions de fichiers autorisées sont : {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'L\'opérateur "{operator}" doit être utilisé avec un attribut de recherche.', 'Operator "{operator}" requires multiple operands.' => 'L\'opérateur "{operator}" requière plusieurs opérandes.', + 'Options available: {options}' => '', 'Page not found.' => 'Page non trouvée.', 'Please fix the following errors:' => 'Veuillez vérifier les erreurs suivantes :', 'Please upload a file.' => 'Veuillez télécharger un fichier.', - 'Powered by {yii}' => 'Propulsé par {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Affichage de {begin, number}-{end, number} sur {totalCount, number} {totalCount, plural, one{élément} other{éléments}}.', 'The combination {values} of {attributes} has already been taken.' => 'La combinaison {values} de {attributes} est déjà utilisée.', 'The file "{file}" is not an image.' => 'Le fichier « {file} » n\'est pas une image.', @@ -67,7 +70,6 @@ 'Update' => 'Modifier', 'View' => 'Voir', 'Yes' => 'Oui', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Vous n\'êtes pas autorisé à effectuer cette action.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Vous pouvez télécharger au maximum {limit, number} {limit, plural, one{fichier} other{fichiers}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Vous devez télécharger au moins {limit, number} {limit, plural, one{fichier} other{fichiers}}.', @@ -107,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} doit comporter au moins {min, number} {min, plural, one{caractère} other{caractères}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} doit comporter au plus {max, number} {max, plural, one{caractère} other{caractères}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} doit comporter {length, number} {length, plural, one{caractère} other{caractères}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 jour} other{# jours}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 heure} other{# heures}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minute} other{# minutes}}', @@ -122,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} o', '{nFormatted} GB' => '{nFormatted} Go', '{nFormatted} GiB' => '{nFormatted} Gio', - '{nFormatted} kB' => '{nFormatted} Ko', '{nFormatted} KiB' => '{nFormatted} Kio', '{nFormatted} MB' => '{nFormatted} Mo', '{nFormatted} MiB' => '{nFormatted} Mio', @@ -130,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} Pio', '{nFormatted} TB' => '{nFormatted} To', '{nFormatted} TiB' => '{nFormatted} Tio', + '{nFormatted} kB' => '{nFormatted} Ko', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{octet} other{octets}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{# gigaoctet} other{# gigaoctets}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gibioctet} other{gibioctets}}', @@ -141,5 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{# petaoctet} other{# petaoctets}}', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{# teraoctet} other{# teraoctets}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{# teraoctet} other{# teraoctets}}', - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ne supporte pas l\'opérateur "{operator}".', ]; diff --git a/framework/messages/he/yii.php b/framework/messages/he/yii.php index 4613b419139..b3eef1b535c 100644 --- a/framework/messages/he/yii.php +++ b/framework/messages/he/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(לא הוגדר)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'שגיאת שרת פנימית', 'Are you sure you want to delete this item?' => 'האם אתה בטוח שברצונך למחוק פריט זה?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'מחק', 'Error' => 'שגיאה', 'File upload failed.' => 'העלאת קובץ נכשלה', @@ -35,52 +40,108 @@ 'Missing required arguments: {params}' => 'חסרים ארגומנטים נדרשים: {params}', 'Missing required parameters: {params}' => 'חסרים פרמטרים נדרשים: {params}', 'No' => 'לא', - 'No help for unknown command "{command}".' => 'פקודה "{command}" לא מוכרת ואין לה עזרה', - 'No help for unknown sub-command "{command}".' => 'תת-פקודה "{command}" לא מוכרת ואין לה עזרה', 'No results found.' => 'לא נמצאו תוצאות', + 'Only files with these MIME types are allowed: {mimeTypes}.' => '', 'Only files with these extensions are allowed: {extensions}.' => 'רק קבצים עם ההרחבות הבאות מותרים: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'דף לא נמצא', 'Please fix the following errors:' => 'בבקשה, תקן את השגיאות הבאות: ', 'Please upload a file.' => 'נא העלה קובץ.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'מציג {begin, number}-{end, number} מתוך {totalCount, number} {totalCount, plural, one{רשומה} other{רשומות}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'הקובץ "{file}" אינו קובץ תמונה.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'הקובץ "{file}" גדול מדי. גודל זה אינו מצליח {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'הקובץ "{file}" קטן מדי. הקובץ אינו יכול להיות קטן מ {formattedLimit}.', 'The format of {attribute} is invalid.' => 'הפורמט של {attribute} אינו חוקי.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" גדולה מדי. הגובה לא יכול להיות גדול מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" גדולה מדי. הרוחב לא יכול להיות גדול מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" קטנה מדי. הגובה לא יכול להיות קטן מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" קטנה מדי. הרוחב לא יכול להיות קטן מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'קוד האימות אינו תקין.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'סך הכל {count, number} {count, plural, one{אייטם} other{אייטמים}}.', 'Unable to verify your data submission.' => 'אין אפשרות לאמת את המידע שהתקבל.', - 'Unknown command "{command}".' => 'Unknown command "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Unknown option: --{name}', 'Update' => 'עדכון', 'View' => 'תצוגה', 'Yes' => 'כן', 'You are not allowed to perform this action.' => 'אינך מורשה לבצע את הפעולה הזו.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'אתה יכול להעלות לכל היותר {limit, number} {limit, plural, one{קובץ} other{קבצים}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => 'הערך המוכנס', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" כבר בשימוש', '{attribute} cannot be blank.' => '{attribute} לא יכול להיות ריק.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} לא חוקי.', '{attribute} is not a valid URL.' => '{attribute} איננו כתובת אינטרנט חוקית.', '{attribute} is not a valid email address.' => '{attribute} לא כתובת מייל חוקית.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} חייב להיות "{requiredValue}".', '{attribute} must be a number.' => '{attribute} חייב להיות מספר', '{attribute} must be a string.' => '{attribute} חייב להיות מחרוזת טקסט', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} חייב להיות מספר שלם', '{attribute} must be either "{true}" or "{false}".' => '{attribute} חייב להיות "{true}" או "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} חייב להיות גדול מ "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} חייב להיות גדול מ או שווה "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} חייב להיות פחות מ "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} חייב להיות פחות מ או שווה "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} חייב להיות גדול מ "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} חייב להיות גדול מ או שווה "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} חייב להיות פחות מ "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} חייב להיות פחות מ או שווה "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} חייב להיות לא יותר מ "{max}".', '{attribute} must be no less than {min}.' => '{attribute} חייב להיות לא פחות מ "{min}".', - '{attribute} must be repeated exactly.' => '{attribute} חייב להיות מוחזר בדיוק.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} חייב להיות שווה ל "{compareValue}"', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} חייב להיות שווה ל "{compareValueOrAttribute}"', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} אמור לכלול לפחות {min, number} {min, plural, one{תו} other{תוים}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} אמור לא לכלול יותר מ{max, number} {max, plural, one{תו} other{תוים}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} אמור לכלול {length, number} {length, plural, one{תו} other{תוים}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', + '{nFormatted} B' => '', + '{nFormatted} GB' => '', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/hi/yii.php b/framework/messages/hi/yii.php index 6c79f0c2620..0276c2d8728 100644 --- a/framework/messages/hi/yii.php +++ b/framework/messages/hi/yii.php @@ -24,9 +24,13 @@ */ return [ ' and ' => ' और ', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(स्थापित नहीं)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'सर्वर में एक आंतरिक दोष उत्पन्न हुआ है।', 'Are you sure you want to delete this item?' => 'क्या आप सुनिश्चित रूप से इस आइटम को मिटाना चाहते हैं?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'मिटाएँ', 'Error' => 'खामी', 'File upload failed.' => 'फ़ाइल अपलोड असफल रहा।', @@ -39,16 +43,19 @@ 'No results found.' => 'कोई परिणाम नहीं मिला।', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'केवल इन MIME प्रकारों वाली फ़ाइलों की अनुमति है: {mimeTypes}।', 'Only files with these extensions are allowed: {extensions}.' => 'केवल इन एक्सटेंशन वाली फाइलों की अनुमति है: {extensions}।', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'पृष्ठ नहीं मिला।', 'Please fix the following errors:' => 'कृपया निम्नलिखित खामीयां सुधारें:', 'Please upload a file.' => 'कृपया एक फ़ाइल अपलोड करें।', - 'Powered by {yii}' => '{yii} द्वारा संचालित', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'दिखाया गया है {totalCount, number} {totalCount, plural, one{चीज} other{चीज़े}} में से {begin, number}-{end, number} ।', 'The combination {values} of {attributes} has already been taken.' => '{attributes} और {values} का संयोजन पहले से ही लिया जा चुका है।', 'The file "{file}" is not an image.' => 'यह फ़ाइल "{file}" एक चित्र नहीं है।', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'यह फ़ाइल "{file}" बहुत बड़ी है। इसका आकार {formattedLimit} से अधिक नहीं हो सकता है।', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'यह फ़ाइल "{file}" बहुत छोटी है। इसका आकार {formattedLimit} से छोटा नहीं हो सकता।', 'The format of {attribute} is invalid.' => '{attribute} का प्रारूप गलत है।', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'यह चित्र "{file}" बहुत बड़ी है। ऊंचाई {limit, number} {limit, plural, one{पिक्सेल} other{पिक्सेल}} से बड़ी नहीं हो सकती।', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'यह चित्र "{file}" बहुत बड़ी है। चौड़ाई {limit, number} {limit, plural, one{पिक्सेल} other{पिक्सेल}} से बड़ी नहीं हो सकती।', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'यह चित्र "{file}" बहुत छोटी है। ऊंचाई {limit, number} {limit, plural, one{पिक्सेल} other{पिक्सेल}} से छोटी नहीं हो सकती।', @@ -58,13 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'कुल {count, number} {count, plural, one{चीज} other{चीज़े}}।', 'Unable to verify your data submission.' => 'आपके डेटा सबमिशन को सत्यापित करने में असमर्थ।', 'Unknown alias: -{name}' => 'अज्ञात उपनाम: - {name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'अज्ञात विकल्प: - {name}', 'Update' => 'अपडेट करें', 'View' => 'देखें', 'Yes' => 'हाँ', - 'Yii Framework' => 'Yii फ़्रेमवर्क', 'You are not allowed to perform this action.' => 'आपको यह करने की अनुमति नहीं है।', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'आप अधिकतम {limit, number} {limit, plural, one{फ़ाइल} other{फाइलें}} अपलोड कर सकते हैं।', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{एक दिन} other{# दिनों}} में', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{एक मिनट} other{# मिनटों}} में', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{एक महीना} other{# महीनों}} में', @@ -101,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} में कम से कम {min, number} {min, plural, one{अक्षर} other{अक्षर}} होना चाहिए।', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} में अधिकतम {max, number} {max, plural, one{अक्षर} other{अक्षर}} होना चाहिए।', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} में {length, number} {length, plural, one{अक्षर} other{अक्षर}} शामिल होना चाहिए।', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 दिन} other{# दिन}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 घंटा} other{# घंटे}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 मिनट} other{# मिनिटे}}', @@ -116,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -124,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} KB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{बाइट} other{बाइट्स}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{गिबिबाइट} other{गिबिबाइटस}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{गीगाबाइट} other{गीगाबाइटस}}', diff --git a/framework/messages/hr/yii.php b/framework/messages/hr/yii.php index ac445e0908c..73e5c656fb0 100644 --- a/framework/messages/hr/yii.php +++ b/framework/messages/hr/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(nije postavljeno)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Došlo je do interne pogreške servera.', - 'Are you sure you want to delete this item' => 'Želiš li to obrisati?', + 'Are you sure you want to delete this item?' => '', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Obrisati', 'Error' => 'Pogreška', 'File upload failed.' => 'Upload datoteke nije uspio.', @@ -35,77 +40,108 @@ 'Missing required arguments: {params}' => 'Nedostaju potrebni argunenti: {params}', 'Missing required parameters: {params}' => 'Nedostaju potrebni parametri: {params}', 'No' => 'Ne', - 'No help for unknown command "{command}".' => 'Nema pomoći za nepoznatu naredbu "{command}"', - 'No help for unknown sub-command "{command}".' => 'Nema pomoći za nepoznatu pod-naredbu "{command}"', 'No results found.' => 'Nema rezultata.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Samo datoteke s ovim MIME vrstama su dopuštene: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Samo datoteke s ovim ekstenzijama su dopuštene: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Stranica nije pronađena.', 'Please fix the following errors:' => 'Molimo vas ispravite pogreške:', 'Please upload a file.' => 'Molimo vas da uploadate datoteku.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Prikazuj {begin, number}-{end, number} od {totalCount, number} {totalCount, plural, one{stavka} few{stavke} many{stavki} other{stavki}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Datoteka "{file}" nije slika.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Datoteka "{file}" je prevelika. Ne smije biti veća od {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Datoteka "{file}" je premalena. Ne smije biti manja od {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format od {attribute} je nevažeći.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Visina slike ne smije biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina slike ne smije biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premalena. Visina slike ne smije biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premalena. Širina slike ne smije biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'Kod za provjeru nije točan.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Ukupno {count, number} {count, plural, =1{stavka} one{# stavka} few{# stavke} many{# stavki} other{# stavki}}.', 'Unable to verify your data submission.' => 'Nije moguće provjeriti poslane podatke.', - 'Unknown command "{command}".' => 'Nepoznata naredba "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Nepoznata opcija: --{name}', 'Update' => 'Uredi', 'View' => 'Pregled', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Nije vam dopušteno obavljati tu radnju.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Najviše možete uploadat {limit, number} {limit, plural, one{datoteku} few{datoteke} other{datoteka}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'u {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'u {delta, plural, =1{minuta} one{# minuta} few{# minute} many{# minuta} other{# minuta}}', 'in {delta, plural, =1{a month} other{# months}}' => 'u {delta, plural, =1{mjesec} one{# mjesec} few{# mjeseca} many{# mjeseci} other{# mjeseci}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'u {delta, plural, =1{sekunda} one{# sekunda} few{# sekunde} many{# sekundi} other{# sekundi}}', 'in {delta, plural, =1{a year} other{# years}}' => 'u {delta, plural, =1{godina} one{# godine} few{# godine} many{# godina} other{# godina}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'u {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', + 'just now' => '', 'the input value' => 'ulazna vrijednost', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" već se koristi.', '{attribute} cannot be blank.' => '{attribute} ne smije biti prazan.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => 'Atribut "{attribute}" je neispravan.', '{attribute} is not a valid URL.' => '{attribute} nije valjan URL.', '{attribute} is not a valid email address.' => '{attribute} nije valjana email adresa.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} mora biti "{requiredValue}".', '{attribute} must be a number.' => '{attribute} mora biti broj.', '{attribute} must be a string.' => '{attribute} mora biti string(riječ,tekst).', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} mora biti cijeli broj.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} mora biti "{true}" ili "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} mora biti veći od "{compareValue}', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} mora biti veći ili jednak "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} mora biti manji od "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} mora biti jednak "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} mora biti veći od "{compareValueOrAttribute}', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti veći ili jednak "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} mora biti manji od "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti jednak "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} ne smije biti veći od {max}.', '{attribute} must be no less than {min}.' => '{attribute} ne smije biti manji od {min}.', - '{attribute} must be repeated exactly.' => '{attribute} mora biti točno ponovljeno.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} ne smije biti jednak "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ne smije biti jednak "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} mora najmanje sadržavati {min, number} {min, plural, =1{znak} one{znak} few{znaka} many{znakova} other{znakova}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} moze sadržavati najviše do {max, number} {max, plural, =1{znak} one{znak} few{znaka} many{znakova} other{znakova}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} mora sadržavati {length, number} {length, plural, =1{znak} one{znak} few{znaka} many{znakova} other{znakova}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{minuta} one{# minuta} few{# minute} many{# minuta} other{# minuta}}', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{mjesec} one{# mjesec} few{# mjeseca} many{# mjeseci} other{# mjeseci}}', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{sekunda} one{# sekunda} few{# sekunde} many{# sekundi} other{# sekundi}}', '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{godina} one{# godine} few{# godine} many{# godina} other{# godina}}', '{delta, plural, =1{an hour} other{# hours}} ago' => ' {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# bajt} other{# bajta}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabajt} other{# gigabajta}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobajt} other{# kilobajta}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabajt} other{# megabajta}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabajt} other{# petabajta}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# terabajt} other{# terabajta}}', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{bajt} other{bajta}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabajt} other{gigabajta}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobajt} other{kilobajta}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabajt} other{megabajta}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabajt} other{petabajta}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabajt} other{terabajta}}', ]; diff --git a/framework/messages/hu/yii.php b/framework/messages/hu/yii.php index 88575242bd3..db42e0f2926 100644 --- a/framework/messages/hu/yii.php +++ b/framework/messages/hu/yii.php @@ -23,92 +23,125 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '(not set)' => '(nincs beállítva)', - 'An internal server error occurred.' => 'Egy belső szerver hiba történt.', - 'Are you sure you want to delete this item?' => 'Biztos benne, hogy törli ezt az elemet?', - 'Delete' => 'Törlés', - 'Error' => 'Hiba', - 'File upload failed.' => 'A fájlfeltöltés nem sikerült.', - 'Home' => 'Főoldal', - 'Invalid data received for parameter "{param}".' => 'Érvénytelen paraméter: {param}.', - 'Login Required' => 'Bejelentkezés szükséges', - 'Missing required arguments: {params}' => 'Hiányzó argumentumok: {params}', - 'Missing required parameters: {params}' => 'Hiányzó paraméterek: {params}', - 'No' => 'Nem', - 'No help for unknown command "{command}".' => 'Nincs súgó az ismeretlen {command} parancshoz.', - 'No help for unknown sub-command "{command}".' => 'Nincs súgó az ismeretlen {command} alparancshoz.', - 'No results found.' => 'Nincs találat.', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Csak a következő MIME típusú fájlok engedélyezettek: {mimeTypes}.', - 'Only files with these extensions are allowed: {extensions}.' => 'Csak a következő kiterjesztésű fájlok engedélyezettek: {extensions}.', - 'Page not found.' => 'Az oldal nem található.', - 'Please fix the following errors:' => 'Kérjük javítsa a következő hibákat:', - 'Please upload a file.' => 'Kérjük töltsön fel egy fájlt.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{begin, number}-{end, number} megjelenítése a(z) {totalCount, number} elemből.', - 'The file "{file}" is not an image.' => '"{file}" nem egy kép.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '"{file}" túl nagy. A mérete nem lehet nagyobb {formattedLimit}.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '"{file}" túl kicsi. A mérete nem lehet kisebb {formattedLimit}.', - 'The format of {attribute} is invalid.' => 'A(z) {attribute} formátuma érvénytelen.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl nagy. A magassága nem lehet nagyobb {limit, number} pixelnél.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl nagy. A szélessége nem lehet nagyobb {limit, number} pixelnél.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl kicsi. A magassága nem lehet kisebb {limit, number} pixelnél.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl kicsi. A szélessége nem lehet kisebb {limit, number} pixelnél.', - 'The requested view "{name}" was not found.' => 'A kért "{name}" nézet nem található.', - 'The verification code is incorrect.' => 'A megerősítő kód helytelen.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Összesen {count, number} elem.', - 'Unable to verify your data submission.' => 'Nem sikerült ellenőrizni az adatokat.', - 'Unknown command "{command}".' => 'Ismeretlen parancs: "{command}".', - 'Unknown option: --{name}' => 'Ismeretlen kapcsoló: --{name}', - 'Update' => 'Szerkesztés', - 'View' => 'Megtekintés', - 'just now' => 'éppen most', - 'Yes' => 'Igen', - 'You are not allowed to perform this action.' => 'Nincs jogosultsága a művelet végrehajtásához.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Legfeljebb {limit, number} fájlt tölthet fel.', - 'in {delta, plural, =1{a day} other{# days}}' => '{delta} napon belül', - 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta} percen belül', - 'in {delta, plural, =1{a month} other{# months}}' => '{delta} hónapon belül', - 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta} másodpercen belül', - 'in {delta, plural, =1{a year} other{# years}}' => '{delta} éven belül', - 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta} órán belül', - 'the input value' => 'a beviteli érték', - '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" már használatban van.', - '{attribute} cannot be blank.' => '{attribute} nem lehet üres.', - '{attribute} is invalid.' => '{attribute} érvénytelen.', - '{attribute} is not a valid URL.' => '{attribute} nem valódi URL.', - '{attribute} is not a valid email address.' => '{attribute} nem valódi e-mail cím.', - '{attribute} must be "{requiredValue}".' => '{attribute} értéke "{requiredValue}" kell, hogy legyen.', - '{attribute} must be a number.' => '{attribute} csak szám lehet.', - '{attribute} must be a string.' => '{attribute} csak szöveg lehet.', - '{attribute} must be an integer.' => '{attribute} csak egész szám lehet.', - '{attribute} must be either "{true}" or "{false}".' => '{attribute} csak "{true}" vagy "{false}" lehet.', - '{attribute} must be greater than "{compareValue}".' => '{attribute} nagyobbnak kell lennie, mint "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} nagyobb vagy egyenlő kell legyen, mint "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} kisebbnek kell lennie, mint "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} kisebb vagy egyenlő kell legyen, mint "{compareValue}".', - '{attribute} must be no greater than {max}.' => '{attribute} nem lehet nagyobb, mint {max}.', - '{attribute} must be no less than {min}.' => '{attribute} nem lehet kisebb, mint {min}.', - '{attribute} must be repeated exactly.' => 'Ismételje meg pontosan a(z) {attribute} mezőbe írtakat.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} nem lehet egyenlő ezzel: "{compareValue}".', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '"{attribute}" mezőnek azonosnak kell lennie a "{compareValueOrAttribute}" mezőbe írtakkal.', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} minimum {min, number} karakter kell, hogy legyen.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} maximum {max, number} karakter lehet.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} pontosan {length, number} kell, hogy legyen.', - '{delta, plural, =1{a day} other{# days}} ago' => '{delta} nappal ezelőtt', - '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} perccel ezelőtt', - '{delta, plural, =1{a month} other{# months}} ago' => '{delta} hónappal ezelőtt', - '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} másodperccel ezelőtt', - '{delta, plural, =1{a year} other{# years}} ago' => '{delta} évvel ezelőtt', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} órával ezelőtt', - '{n, plural, =1{# byte} other{# bytes}}' => '{n} bájt', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n} gigabájt', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n} kilobájt', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n} megabájt', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n} petabájt', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n} terabájt', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', + '(not set)' => '(nincs beállítva)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', + 'An internal server error occurred.' => 'Egy belső szerver hiba történt.', + 'Are you sure you want to delete this item?' => 'Biztos benne, hogy törli ezt az elemet?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', + 'Delete' => 'Törlés', + 'Error' => 'Hiba', + 'File upload failed.' => 'A fájlfeltöltés nem sikerült.', + 'Home' => 'Főoldal', + 'Invalid data received for parameter "{param}".' => 'Érvénytelen paraméter: {param}.', + 'Login Required' => 'Bejelentkezés szükséges', + 'Missing required arguments: {params}' => 'Hiányzó argumentumok: {params}', + 'Missing required parameters: {params}' => 'Hiányzó paraméterek: {params}', + 'No' => 'Nem', + 'No results found.' => 'Nincs találat.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Csak a következő MIME típusú fájlok engedélyezettek: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Csak a következő kiterjesztésű fájlok engedélyezettek: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', + 'Page not found.' => 'Az oldal nem található.', + 'Please fix the following errors:' => 'Kérjük javítsa a következő hibákat:', + 'Please upload a file.' => 'Kérjük töltsön fel egy fájlt.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{begin, number}-{end, number} megjelenítése a(z) {totalCount, number} elemből.', + 'The combination {values} of {attributes} has already been taken.' => '', + 'The file "{file}" is not an image.' => '"{file}" nem egy kép.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '"{file}" túl nagy. A mérete nem lehet nagyobb {formattedLimit}.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '"{file}" túl kicsi. A mérete nem lehet kisebb {formattedLimit}.', + 'The format of {attribute} is invalid.' => 'A(z) {attribute} formátuma érvénytelen.', + 'The format of {filter} is invalid.' => '', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl nagy. A magassága nem lehet nagyobb {limit, number} pixelnél.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl nagy. A szélessége nem lehet nagyobb {limit, number} pixelnél.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl kicsi. A magassága nem lehet kisebb {limit, number} pixelnél.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'A(z) "{file}" kép túl kicsi. A szélessége nem lehet kisebb {limit, number} pixelnél.', + 'The requested view "{name}" was not found.' => 'A kért "{name}" nézet nem található.', + 'The verification code is incorrect.' => 'A megerősítő kód helytelen.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Összesen {count, number} elem.', + 'Unable to verify your data submission.' => 'Nem sikerült ellenőrizni az adatokat.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', + 'Unknown option: --{name}' => 'Ismeretlen kapcsoló: --{name}', + 'Update' => 'Szerkesztés', + 'View' => 'Megtekintés', + 'Yes' => 'Igen', + 'You are not allowed to perform this action.' => 'Nincs jogosultsága a művelet végrehajtásához.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Legfeljebb {limit, number} fájlt tölthet fel.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '{delta} napon belül', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta} percen belül', + 'in {delta, plural, =1{a month} other{# months}}' => '{delta} hónapon belül', + 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta} másodpercen belül', + 'in {delta, plural, =1{a year} other{# years}}' => '{delta} éven belül', + 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta} órán belül', + 'just now' => 'éppen most', + 'the input value' => 'a beviteli érték', + '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" már használatban van.', + '{attribute} cannot be blank.' => '{attribute} nem lehet üres.', + '{attribute} contains wrong subnet mask.' => '', + '{attribute} is invalid.' => '{attribute} érvénytelen.', + '{attribute} is not a valid URL.' => '{attribute} nem valódi URL.', + '{attribute} is not a valid email address.' => '{attribute} nem valódi e-mail cím.', + '{attribute} is not in the allowed range.' => '', + '{attribute} must be "{requiredValue}".' => '{attribute} értéke "{requiredValue}" kell, hogy legyen.', + '{attribute} must be a number.' => '{attribute} csak szám lehet.', + '{attribute} must be a string.' => '{attribute} csak szöveg lehet.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', + '{attribute} must be an integer.' => '{attribute} csak egész szám lehet.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} csak "{true}" vagy "{false}" lehet.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '"{attribute}" mezőnek azonosnak kell lennie a "{compareValueOrAttribute}" mezőbe írtakkal.', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} nagyobbnak kell lennie, mint "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} nagyobb vagy egyenlő kell legyen, mint "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} kisebbnek kell lennie, mint "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} kisebb vagy egyenlő kell legyen, mint "{compareValueOrAttribute}".', + '{attribute} must be no greater than {max}.' => '{attribute} nem lehet nagyobb, mint {max}.', + '{attribute} must be no less than {min}.' => '{attribute} nem lehet kisebb, mint {min}.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} nem lehet egyenlő ezzel: "{compareValueOrAttribute}".', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} minimum {min, number} karakter kell, hogy legyen.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} maximum {max, number} karakter lehet.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} pontosan {length, number} kell, hogy legyen.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta} nappal ezelőtt', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} perccel ezelőtt', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta} hónappal ezelőtt', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} másodperccel ezelőtt', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta} évvel ezelőtt', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} órával ezelőtt', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} bájt', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} gigabájt', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilobájt', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} megabájt', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} petabájt', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} terabájt', ]; diff --git a/framework/messages/hy/yii.php b/framework/messages/hy/yii.php index 8e2cb584548..b62094573e1 100644 --- a/framework/messages/hy/yii.php +++ b/framework/messages/hy/yii.php @@ -6,8 +6,7 @@ */ /** - * Message translations for Armenian (հայերեն) language. - * @author Gevorg Mansuryan + * Message translations. * * This file is automatically generated by 'yii message/extract' command. * It contains the localizable messages extracted from source code. @@ -25,9 +24,13 @@ */ return [ ' and ' => ' և ', + '"{attribute}" does not support operator "{operator}".' => '«{attribute}»-ը չի սպասարկում «{operator}» օպերատորը։', '(not set)' => '(չի նշված)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Սերվերի ներքին սխալ է տեղի ունեցել։', 'Are you sure you want to delete this item?' => 'Վստա՞հ եք, որ ցանկանում եք ջնջել այս տարրը:', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '«{attribute}»-ի համար պետք է լինի արժեք կամ գործող օպերատորի հստակեցում:', 'Delete' => 'Ջնջել', 'Error' => 'Սխալ', 'File upload failed.' => 'Ֆայլի վերբեռնումը ձախողվեց։', @@ -40,16 +43,19 @@ 'No results found.' => 'Ոչ մի արդյունք չի գտնվել։', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Թույլատրվում են միայն {mimeTypes} MIME տեսակի ֆայլերը։', 'Only files with these extensions are allowed: {extensions}.' => 'Թույլատրվում են միայն {extensions} վերջավորությամբ ֆայլերը։', + 'Operator "{operator}" must be used with a search attribute.' => '«{operator}» օպերատորը պետք է օգտագործվի որոնման ատրիբուտի հետ միասին:', + 'Operator "{operator}" requires multiple operands.' => '«{operator}» օպերատորը պահանջում բազմակի օպերանդներ։', + 'Options available: {options}' => '', 'Page not found.' => 'Էջը չի գտնվել։', 'Please fix the following errors:' => 'Խնդրում ենք ուղղել հետևյալ սխալները՝', 'Please upload a file.' => 'Խնդրում ենք վերբեռնել ֆայլ:', - 'Powered by {yii}' => 'Աշխատում է {yii}ով։', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Ցուցադրված են {begin, number}-ից {end, number}-ը ընդհանուր {totalCount, number}-ից։', 'The combination {values} of {attributes} has already been taken.' => '{attributes}-ի {values} արժեքների կոմբինացիան արդեն զբաղված է։', 'The file "{file}" is not an image.' => '«{file}» ֆայլը վավեր նկար չէ։', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '«{file}» ֆայլը շատ մեծ է։ Նրա չափը չի կարող գերազանցել {formattedLimit}-ը։', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '«{file}» ֆայլը շատ փոքր է։ Նրա չափը չի կարող լինել {formattedLimit}-ից փոքր։', 'The format of {attribute} is invalid.' => '{attribute}-ի ֆորմատը անվավեր է։', + 'The format of {filter} is invalid.' => '{filter}-ի ֆորմատը անվավեր է։', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» նկարը շատ մեծ է։ Նրա բարձրությունը չի կարող գերազանցել {limit, number} {limit, plural, one{պիքսել} few{պիքսել} many{պիքսել} other{պիքսել}}ը։', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» նկարը շատ մեծ է։ Նրա երկարությունը չի կարող գերազանցել {limit, number} {limit, plural, one{պիքսել} few{պիքսել} many{պիքսել} other{պիքսել}}ը։', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» նկարը շատ փոքր է։ Նրա բարձրությունը չի կարող լինել {limit, number} {limit, plural, one{պիքսել} few{պիքսել} many{պիքսել} other{պիքսել}}ից փոքր։', @@ -59,13 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Ընդհանուր {count, number} {count, plural, one{տարր} other{տարր}}։', 'Unable to verify your data submission.' => 'Հնարավոր չէ ստուգել ձեր տվյալների ներկայացումը:', 'Unknown alias: -{name}' => 'Անհայտ այլանուն՝ «{name}»։', + 'Unknown filter attribute "{attribute}"' => 'Անհայտ ֆիլտրի ատրիբուտ՝ «{attribute}»։', 'Unknown option: --{name}' => 'Անհայտ տարբերակ՝ «{name}»։', 'Update' => 'Թարմացնել', 'View' => 'Դիտել', 'Yes' => 'Այո', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Ձեզ չի թույլատրվում կատարել այս գործողությունը:', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Դուք կարող եք վերբեռնել առավելագույնը {limit, number} {limit, plural, one{ֆայլ} few{ֆայլ} many{ֆայլ} other{ֆայլ}}։', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{օր} one{# օր} few{# օր} many{# օր} other{# օր}}ից', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{րոպե} one{# րոպե} few{# րոպե} many{# րոպե} other{# րոպե}}ից', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{ամս} one{# ամս} few{# ամս} many{# ամս} other{# ամս}}ից', @@ -102,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute}-ի արժեքը պետք է պարունակի առնվազն {min, number} {min, plural, one{նիշ} other{նիշ}}։', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute}-ի արժեքը պետք է պարունակի առավելագույնը {max, number} {max, plural, one{նիշ} other{նիշ}}։', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute}-ի արժեքը պետք է պարունակի {length, number} {length, plural, one{նիշ} other{նիշ}}։', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 օր} other{# օր}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 ժամ} other{# ժամ}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 րոպե} other{# րոպե}}', @@ -117,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} Բ', '{nFormatted} GB' => '{nFormatted} ԳԲ', '{nFormatted} GiB' => '{nFormatted} ԳիԲ', - '{nFormatted} kB' => '{nFormatted} ԿԲ', '{nFormatted} KiB' => '{nFormatted} ԿիԲ', '{nFormatted} MB' => '{nFormatted} ՄԲ', '{nFormatted} MiB' => '{nFormatted} ՄիԲ', @@ -125,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} ՊիԲ', '{nFormatted} TB' => '{nFormatted} ՏԲ', '{nFormatted} TiB' => '{nFormatted} ՏիԲ', + '{nFormatted} kB' => '{nFormatted} ԿԲ', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{բայթ} other{բայթ}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{գիգաբիթ} other{գիգաբիթ}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{գիգաբայթ} other{գիգաբայթ}}', @@ -136,10 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{պետաբայթ} other{պետաբայթ}}', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{տեբիբայթ} other{տեբիբայթ}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{տերաբայթ} other{տերաբայթ}}', - '"{attribute}" does not support operator "{operator}".' => '«{attribute}»-ը չի սպասարկում «{operator}» օպերատորը։', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => '«{attribute}»-ի համար պետք է լինի արժեք կամ գործող օպերատորի հստակեցում:', - 'Operator "{operator}" must be used with a search attribute.' => '«{operator}» օպերատորը պետք է օգտագործվի որոնման ատրիբուտի հետ միասին:', - 'Operator "{operator}" requires multiple operands.' => '«{operator}» օպերատորը պահանջում բազմակի օպերանդներ։', - 'The format of {filter} is invalid.' => '{filter}-ի ֆորմատը անվավեր է։', - 'Unknown filter attribute "{attribute}"' => 'Անհայտ ֆիլտրի ատրիբուտ՝ «{attribute}»։', ]; diff --git a/framework/messages/id/yii.php b/framework/messages/id/yii.php index b8a08f73f52..785f29f43b2 100644 --- a/framework/messages/id/yii.php +++ b/framework/messages/id/yii.php @@ -23,11 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'The requested view "{name}" was not found.' => 'View "{name}" yang diminta tidak ditemukan.', - 'You are requesting with an invalid access token.' => 'Anda melakukan permintaan dengan akses token yang tidak valid.', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(belum diset)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Terjadi kesalahan internal server.', 'Are you sure you want to delete this item?' => 'Apakah Anda yakin ingin menghapus item ini?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Hapus', 'Error' => 'Kesalahan', 'File upload failed.' => 'Mengunggah berkas gagal.', @@ -37,11 +40,12 @@ 'Missing required arguments: {params}' => 'Argumen yang diperlukan tidak ada: {params}', 'Missing required parameters: {params}' => 'Parameter yang diperlukan tidak ada: {params}', 'No' => 'Tidak', - 'No help for unknown command "{command}".' => 'Tidak ada bantuan untuk perintah yang tidak diketahui "{command}".', - 'No help for unknown sub-command "{command}".' => 'Tidak ada bantuan untuk sub perintah yang tidak diketahui "{command}".', 'No results found.' => 'Tidak ada data yang ditemukan.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Hanya berkas dengan tipe MIME ini yang diperbolehkan: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Hanya berkas dengan ekstensi ini yang diperbolehkan: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Halaman tidak ditemukan.', 'Please fix the following errors:' => 'Silahkan perbaiki kesalahan berikut:', 'Please upload a file.' => 'Silahkan mengunggah berkas.', @@ -51,64 +55,93 @@ 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Berkas "{file}" terlalu besar. Ukurannya tidak boleh lebih besar dari {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Berkas "{file}" terlalu kecil. Ukurannya tidak boleh lebih kecil dari {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format dari {attribute} tidak valid.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Tingginya tidak boleh lebih besar dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Lebarnya tidak boleh lebih besar dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Tingginya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Lebarnya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', + 'The requested view "{name}" was not found.' => 'View "{name}" yang diminta tidak ditemukan.', 'The verification code is incorrect.' => 'Kode verifikasi tidak benar.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{item}}.', 'Unable to verify your data submission.' => 'Tidak dapat mem-verifikasi pengiriman data Anda.', - 'Unknown command "{command}".' => 'Perintah tidak dikenal "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Opsi tidak dikenal: --{name}', 'Update' => 'Ubah', 'View' => 'Lihat', 'Yes' => 'Ya', 'You are not allowed to perform this action.' => 'Anda tidak diperbolehkan untuk melakukan aksi ini.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Anda dapat mengunggah paling banyak {limit, number} {limit, plural, one{file} other{file}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'dalam {delta, plural, =1{satu hari} other{# hari}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'dalam {delta, plural, =1{satu menit} other{# menit}}', 'in {delta, plural, =1{a month} other{# months}}' => 'dalam {delta, plural, =1{satu bulan} other{# bulan}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'dalam {delta, plural, =1{satu detik} other{# detik}}', 'in {delta, plural, =1{a year} other{# years}}' => 'dalam {delta, plural, =1{satu tahun} other{# tahun}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'dalam {delta, plural, =1{satu jam} other{# jam}}', + 'just now' => '', 'the input value' => 'nilai input', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" telah dipergunakan.', '{attribute} cannot be blank.' => '{attribute} tidak boleh kosong.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} tidak valid.', '{attribute} is not a valid URL.' => '{attribute} bukan URL yang valid.', '{attribute} is not a valid email address.' => '{attribute} bukan alamat email yang valid.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} harus berupa "{requiredValue}".', '{attribute} must be a number.' => '{attribute} harus berupa angka.', '{attribute} must be a string.' => '{attribute} harus berupa string.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} harus berupa integer.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} harus berupa "{true}" atau "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} harus lebih besar dari "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} harus lebih besar dari atau sama dengan "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} harus lebih kecil dari "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} harus lebih kecil dari atau sama dengan "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} harus lebih besar dari "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} harus lebih besar dari atau sama dengan "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} harus lebih kecil dari "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} harus lebih kecil dari atau sama dengan "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} harus tidak boleh lebih besar dari {max}.', '{attribute} must be no less than {min}.' => '{attribute} harus tidak boleh lebih kecil dari {min}.', - '{attribute} must be repeated exactly.' => '{attribute} harus diulang sama persis.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} harus tidak boleh sama dengan "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} harus tidak boleh sama dengan "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling sedikit {min, number} {min, plural, one{karakter} other{karakter}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling banyak {max, number} {max, plural, one{karakter} other{karakter}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} harus memiliki {length, number} {length, plural, one{karakter} other{karakter}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{satu hari} other{# hari}} yang lalu', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{satu menit} other{# menit}} yang lalu', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{satu bulan} other{# bulan}} yang lalu', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{satu detik} other{# detik}} yang lalu', '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{satu tahun} other{# tahun}} yang lalu', '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{satu jam} other{# jam}} yang lalu', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# bita} other{# bita}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabita} other{# gigabita}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobita} other{# kilobita}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabita} other{# megabita}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabita} other{# petabita}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# petabita} other{# petabita}}', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{bita} other{bita}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabita} other{gigabita}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobita} other{kilobita}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabita} other{megabita}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabita} other{petabita}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{petabita} other{petabita}}', ]; diff --git a/framework/messages/it/yii.php b/framework/messages/it/yii.php index c16a9c18912..e2d7eff4165 100644 --- a/framework/messages/it/yii.php +++ b/framework/messages/it/yii.php @@ -23,35 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'Unknown alias: -{name}' => 'Alias sconosciuto: -{name}', - '{attribute} contains wrong subnet mask.' => '{attribute} contiene una subnet mask errata.', - '{attribute} is not in the allowed range.' => '{attribute} non rientra nell\'intervallo permesso', - '{attribute} must be a valid IP address.' => '{attribute} deve essere un indirizzo IP valido.', - '{attribute} must be an IP address with specified subnet.' => '{attribute} deve essere un indirizzo IP valido con subnet specificata.', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} deve essere uguale a "{compareValueOrAttribute}".', - '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} deve essere maggiore di "{compareValueOrAttribute}".', - '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} deve essere maggiore o uguale a "{compareValueOrAttribute}".', - '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} deve essere minore di "{compareValueOrAttribute}".', - '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} deve essere minore o uguale a "{compareValueOrAttribute}".', - '{attribute} must not be a subnet.' => '{attribute} non deve essere una subnet.', - '{attribute} must not be an IPv4 address.' => '{attribute} non deve essere un indirizzo IPv4.', - '{attribute} must not be an IPv6 address.' => '{attribute} non deve essere un indirizzo IPv6.', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} non deve essere uguale a "{compareValueOrAttribute}".', - '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 giorno} other{# giorni}}', - '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 ora} other{# ore}}', - '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minuti}}', - '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 mese} other{# mesi}}', - '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 secondo} other{# secondi}}', - '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 anno} other{# anni}}', - '{attribute} must be greater than "{compareValue}".' => '@@{attribute} deve essere maggiore di "{compareValue}".@@', - '{attribute} must be greater than or equal to "{compareValue}".' => '@@{attribute} deve essere maggiore o uguale a "{compareValue}".@@', - '{attribute} must be less than "{compareValue}".' => '@@{attribute} deve essere minore di "{compareValue}".@@', - '{attribute} must be less than or equal to "{compareValue}".' => '@@{attribute} deve essere minore o uguale a "{compareValue}".@@', - '{attribute} must be repeated exactly.' => '@@{attribute} deve essere ripetuto esattamente.@@', - '{attribute} must not be equal to "{compareValue}".' => '@@{attribute} non deve essere uguale a "{compareValue}".@@', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(nessun valore)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Si è verificato un errore interno', 'Are you sure you want to delete this item?' => 'Sei sicuro di voler eliminare questo elemento?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Elimina', 'Error' => 'Errore', 'File upload failed.' => 'Upload file fallito.', @@ -64,14 +43,19 @@ 'No results found.' => 'Nessun risultato trovato', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Solo i file con questi tipi MIME sono consentiti: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Solo i file con queste estensioni sono permessi: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Pagina non trovata.', 'Please fix the following errors:' => 'Per favore correggi i seguenti errori:', 'Please upload a file.' => 'Per favore carica un file.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Visualizzo {begin, number}-{end, number} di {totalCount, number} {totalCount, plural, one{elemento} other{elementi}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Il file "{file}" non è una immagine.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Il file "{file}" è troppo grande. La dimensione non può superare i {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Il file "{file}" è troppo piccolo. La dimensione non può essere inferiore a {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Il formato di {attribute} non è valido.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L\'immagine "{file}" è troppo grande. La sua altezza non può essere maggiore di {limit, number} {limit, plural, one{pixel} other{pixel}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L immagine "{file}" è troppo grande. La sua larghezza non può essere maggiore di {limit, number} {limit, plural, one{pixel} other{pixel}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'L immagine "{file}" è troppo piccola. La sua altezza non può essere minore di {limit, number} {limit, plural, one{pixel} other{pixel}}.', @@ -80,12 +64,15 @@ 'The verification code is incorrect.' => 'Il codice di verifica non è corretto.', 'Total {count, number} {count, plural, one{item} other{items}}.' => '{count, plural, one{Elementi} other{Elementi}} totali {count, number}.', 'Unable to verify your data submission.' => 'Impossibile verificare i dati inviati.', + 'Unknown alias: -{name}' => 'Alias sconosciuto: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Opzione Sconosciuta: --{name}', 'Update' => 'Aggiorna', 'View' => 'Visualizza', 'Yes' => 'Si', 'You are not allowed to perform this action.' => 'Non sei autorizzato ad eseguire questa operazione.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Puoi caricare al massimo {limit, number} {limit, plural, one{file} other{file}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'in {delta, plural, =1{un giorno} other{# giorni}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'in {delta, plural, =1{un minuto} other{# minuti}}', 'in {delta, plural, =1{a month} other{# months}}' => 'in {delta, plural, =1{un mese} other{# mesi}}', @@ -96,19 +83,39 @@ 'the input value' => 'il valore del campo', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" è già presente.', '{attribute} cannot be blank.' => '{attribute} non può essere vuoto.', + '{attribute} contains wrong subnet mask.' => '{attribute} contiene una subnet mask errata.', '{attribute} is invalid.' => '{attribute} non è valido.', '{attribute} is not a valid URL.' => '{attribute} non è un URL valido.', '{attribute} is not a valid email address.' => '{attribute} non è un indirizzo email valido.', + '{attribute} is not in the allowed range.' => '{attribute} non rientra nell\'intervallo permesso', '{attribute} must be "{requiredValue}".' => '{attribute} deve essere "{requiredValue}".', '{attribute} must be a number.' => '{attribute} deve essere un numero.', '{attribute} must be a string.' => '{attribute} deve essere una stringa.', + '{attribute} must be a valid IP address.' => '{attribute} deve essere un indirizzo IP valido.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} deve essere un indirizzo IP valido con subnet specificata.', '{attribute} must be an integer.' => '{attribute} deve essere un numero intero.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} deve essere "{true}" oppure "{false}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} deve essere uguale a "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} deve essere maggiore di "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} deve essere maggiore o uguale a "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} deve essere minore di "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} deve essere minore o uguale a "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} non deve essere maggiore di {max}.', '{attribute} must be no less than {min}.' => '{attribute} non deve essere minore di {min}.', + '{attribute} must not be a subnet.' => '{attribute} non deve essere una subnet.', + '{attribute} must not be an IPv4 address.' => '{attribute} non deve essere un indirizzo IPv4.', + '{attribute} must not be an IPv6 address.' => '{attribute} non deve essere un indirizzo IPv6.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} non deve essere uguale a "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} dovrebbe contenere almeno {min, number} {min, plural, one{carattere} other{caratteri}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} dovrebbe contenere al massimo {max, number} {max, plural, one{carattere} other{caratteri}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} dovrebbe contenere {length, number} {length, plural, one{carattere} other{caratteri}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 giorno} other{# giorni}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 ora} other{# ore}}', + '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minuti}}', + '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 mese} other{# mesi}}', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 secondo} other{# secondi}}', + '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 anno} other{# anni}}', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{un giorno} other{# giorni}} fa', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{un minuto} other{# minuti}} fa', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{un mese} other{# mesi}} fa', @@ -118,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -126,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{byte}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibyte}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabyte}}', diff --git a/framework/messages/ja/yii.php b/framework/messages/ja/yii.php index 42d26beba54..6fd6c3f9da5 100644 --- a/framework/messages/ja/yii.php +++ b/framework/messages/ja/yii.php @@ -1,4 +1,10 @@ ' および ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" は演算子 "{operator}" をサポートしていません。', '(not set)' => '(未設定)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '内部サーバーエラーが発生しました。', 'Are you sure you want to delete this item?' => 'このアイテムを削除したいというのは本当ですか?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => '"{attribute}" のための条件は値であるか有効な演算子の定義でなければなりません。', @@ -37,6 +45,7 @@ 'Only files with these extensions are allowed: {extensions}.' => '次の拡張子を持つファイルだけが許可されています : {extensions}', 'Operator "{operator}" must be used with a search attribute.' => '演算子 "{operator}" はサーチ属性とともに使用されなければなりません。', 'Operator "{operator}" requires multiple operands.' => '演算子 "{operator}" は複数の被演算子を要求します。', + 'Options available: {options}' => '', 'Page not found.' => 'ページが見つかりません。', 'Please fix the following errors:' => '次のエラーを修正してください :', 'Please upload a file.' => 'ファイルをアップロードしてください。', @@ -100,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} は {min} 文字以上でなければいけません。', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} は {max} 文字以下でなければいけません。', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} は {length} 文字でなければいけません。', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta} 日間', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} 時間', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} 分間', @@ -115,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -123,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} バイト', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} ギビバイト', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} ギガバイト', diff --git a/framework/messages/ka/yii.php b/framework/messages/ka/yii.php index 96eaaeb621d..c885e6bd951 100644 --- a/framework/messages/ka/yii.php +++ b/framework/messages/ka/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(არ არის მითითებული)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'წარმოიშვა სერვერის შიდა შეცდომა.', 'Are you sure you want to delete this item?' => 'დარწმუნებული ხართ, რომ გინდათ ამ ელემენტის წაშლა?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'წაშლა', 'Error' => 'შეცდომა', 'File upload failed.' => 'ფაილის ჩამოტვირთვა ვერ მოხერხდა.', @@ -38,14 +43,19 @@ 'No results found.' => 'არაფერი მოიძებნა.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'ნებადართულია ფაილების ჩამოტვირთვა მხოლოდ შემდეგი MIME-ტიპებით: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'ნებადართულია ფაილების ჩამოტვირთვა მხოლოდ შემდეგი გაფართოებებით: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'გვერდი ვერ მოიძებნა.', 'Please fix the following errors:' => 'შეასწორეთ შემდეგი შეცდომები:', 'Please upload a file.' => 'ჩამოტვირთეთ ფაილი.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'ნაჩვენებია ჩანაწერები {begin, number}-{end, number} из {totalCount, number}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'ფაილი «{file}» არ წარმოადგენს გამოსახულებას.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'ფაილი «{file}» ძალიან დიდია. ზომა არ უნდა აღემატებოდეს {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'ფაილი «{file}» ძალიან პატარაა. ზომა უნდა აღემატებოდეს {formattedLimit}.', 'The format of {attribute} is invalid.' => 'მნიშვნელობის «{attribute}» არასწორი ფორმატი.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'ფაილი «{file}» ძალიან დიდია. სიმაღლე არ უნდა აღემატებოდეს {limit, number} {limit, plural, one{პიქსელს} few{პიქსელს} many{პიქსელს} other{პიქსელს}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'ფაილი «{file}» ძალიან დიდია. სიგანე არ უნდა აღემატებოდეს {limit, number} {limit, plural, one{პიქსელს} few{პიქსელს} many{პიქსელს} other{პიქსელს}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'ფაილი «{file}» ძალიან პატარაა. სიმაღლე უნდა აღემატებოდეს {limit, number} {limit, plural, one{პიქსელს} few{პიქსელს} many{პიქსელს} other{პიქსელს}}.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'არასწორი შემამოწმებელი კოდი.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'სულ {count, number} {count, plural, one{ჩანაწერი} few{ჩანაწერი} many{ჩანაწერი}} other{ჩანაწერი}}.', 'Unable to verify your data submission.' => 'ვერ მოხერხდა გადაცემული მონაცემების შემოწმება.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'უცნობი ოფცია: --{name}', 'Update' => 'რედაქტირება', 'View' => 'ნახვა', 'Yes' => 'დიახ', 'You are not allowed to perform this action.' => 'თქვენ არ გაქვთ მოცემული ქმედების შესრულების ნებართვა.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'თქვენ არ შეგიძლიათ ჩამოტვირთოთ {limit, number}-ზე მეტი {limit, plural, one{ფაილი} few{ფაილი} many{ფაილი} other{ფაილი}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{დღის} one{# დღის} few{# დღის} many{# დღის} other{# დღის}} შემდეგ', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{წუთის} one{# წუთის} few{# წუთის} many{# წუთის} other{# წუთის}} შემდეგ', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{თვის} one{# თვის} few{# თვის} many{# თვის} other{# თვის}} შემდეგ', @@ -70,25 +83,39 @@ 'the input value' => 'შეყვანილი მნიშვნელობა', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» უკვე დაკავებულია.', '{attribute} cannot be blank.' => 'საჭიროა შევსება «{attribute}».', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => 'მნიშვნელობა «{attribute}» არასწორია.', '{attribute} is not a valid URL.' => 'მნიშვნელობა «{attribute}» არ წარმოადგენს სწორ URL-ს.', '{attribute} is not a valid email address.' => 'მნიშვნელობა «{attribute}» არ წარმოადგენს სწორ email მისამართს.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{requiredValue}-ს ტოლი».', '{attribute} must be a number.' => 'მნიშვნელობა «{attribute}» უნდა იყოს რიცხვი.', '{attribute} must be a string.' => 'მნიშვნელობა «{attribute}» უნდა იყოს სტრიქონი.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => 'მნიშვნელობა «{attribute}» უნდა იყოს მთელი რიცხვი.', '{attribute} must be either "{true}" or "{false}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{true}»-ს ან «{false}»-ს ტოლი.', - '{attribute} must be greater than "{compareValue}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValue}» მნიშვნელობაზე მეტი.', - '{attribute} must be greater than or equal to "{compareValue}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValue}» მნიშვნელობაზე მეტი ან ტოლი.', - '{attribute} must be less than "{compareValue}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValue}» მნიშვნელობაზე ნაკლები.', - '{attribute} must be less than or equal to "{compareValue}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValue}» მნიშვნელობაზე ნაკლები ან ტოლი.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValueOrAttribute}» მნიშვნელობაზე მეტი.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValueOrAttribute}» მნიშვნელობაზე მეტი ან ტოლი.', + '{attribute} must be less than "{compareValueOrAttribute}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValueOrAttribute}» მნიშვნელობაზე ნაკლები.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => 'მნიშვნელობა «{attribute}» უნდა იყოს «{compareValueOrAttribute}» მნიშვნელობაზე ნაკლები ან ტოლი.', '{attribute} must be no greater than {max}.' => 'მნიშვნელობა «{attribute}» არ უნდა აღემატებოდეს {max}.', '{attribute} must be no less than {min}.' => 'მნიშვნელობა «{attribute}» უნდა იყოს არანაკლები {min}.', - '{attribute} must be repeated exactly.' => 'მნიშვნელობა «{attribute}» უნდა განმეორდეს ზუსტად.', - '{attribute} must not be equal to "{compareValue}".' => 'მნიშვნელობა «{attribute}» არ უნდა იყოს «{compareValue}»-ს ტოლი.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => 'მნიშვნელობა «{attribute}» არ უნდა იყოს «{compareValueOrAttribute}»-ს ტოლი.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'მნიშვნელობა «{attribute}» უნდა შეიცავდეს მინიმუმ {min, number} {min, plural, one{სიმბოლს} few{სიმბოლს} many{სიმბოლს} other{სიმბოლს}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'მნიშვნელობა «{attribute}» უნდა შეიცავდეს მაქსიმუმ {max, number} {max, plural, one{სიმბოლს} few{სიმბოლს} many{სიმბოლს} other{სიმბოლს}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'მნიშვნელობა «{attribute}» უნდა შეიცავდეს {length, number} {length, plural, one{სიმბოლს} few{სიმბოლს} many{სიმბოლს} other{სიმბოლს}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{დღის} one{# დღის} few{# დღის} many{# დღის} other{# დღის}} უკან', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{წუთის} one{# წუთის} few{# წუთის} many{# წუთის} other{# წუთის}} უკან', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{თვის} one{# თვის} few{# თვის} many{# თვის} other{# თვის}} უკან', @@ -98,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} ბ', '{nFormatted} GB' => '{nFormatted} გბ', '{nFormatted} GiB' => '{nFormatted} გიბ', - '{nFormatted} kB' => '{nFormatted} კბ', '{nFormatted} KiB' => '{nFormatted} კიბ', '{nFormatted} MB' => '{nFormatted} მბ', '{nFormatted} MiB' => '{nFormatted} მიბ', @@ -106,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} პიბ', '{nFormatted} TB' => '{nFormatted} ტბ', '{nFormatted} TiB' => '{nFormatted} ტიბ', + '{nFormatted} kB' => '{nFormatted} კბ', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{ბაიტი} few{ბაიტს} many{ბაიტი} other{ბაიტს}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{გიბიბაიტი} few{გიბიბაიტს} many{გიბიბაიტი} other{გიბიბაიტს}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{გიგაბაიტი} few{გიგაბაიტს} many{გიგაბაიტი} other{გიგაბაიტს}}', diff --git a/framework/messages/kk/yii.php b/framework/messages/kk/yii.php index b33338dbab8..fb43703aa89 100644 --- a/framework/messages/kk/yii.php +++ b/framework/messages/kk/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(берілмеген)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Сервердің ішкі қатесі туды.', 'Are you sure you want to delete this item?' => 'Бұл элементті жоюға сенімдісіз бе?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Жою', 'Error' => 'Қате', 'File upload failed.' => 'Файлды жүктеу сәтті болмады', @@ -35,52 +40,108 @@ 'Missing required arguments: {params}' => 'Қажетті аргументтер жоқ: {params}', 'Missing required parameters: {params}' => 'Қажетті параметрлер жоқ: {params}', 'No' => 'Жоқ', - 'No help for unknown command "{command}".' => 'Белгісіз "{command}" командасы үшін көмек табылмады.', - 'No help for unknown sub-command "{command}".' => 'Белгісіз "{command}" ішкі командасы үшін көмек табылмады.', 'No results found.' => 'Нәтиже табылған жок.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => '', 'Only files with these extensions are allowed: {extensions}.' => 'Тек мына кеңейтімдегі файлдарға ғана рұқсат етілген: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Бет табылған жок.', 'Please fix the following errors:' => 'Өтінеміз, мына қателерді түзеңіз:', 'Please upload a file.' => 'Файлды жүктеңіз.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} жазбадан {begin, number}-{end, number} аралығы көрсетілген.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '«{file}» файлы сурет емес.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '«{file}» файлының өлшемі тым үлкен. Көлемі {formattedLimit} аспау керек.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '«{file}» файлының өлшемі тым кіші. Көлемі {formattedLimit} кем болмауы керек.', 'The format of {attribute} is invalid.' => '«{attribute}» аттрибутының форматы дұрыс емес.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» суретінің өлшемі тым үлкен. Биіктігі {limit, number} пиксельден аспауы қажет.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» суретінің өлшемі тым үлкен. Ені {limit, number} пиксельден аспауы қажет.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» суретінің өлшемі тым кіші. Биіктігі {limit, number} пиксельден кем болмауы қажет.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» суретінің өлшемі тым кіші. Ені {limit, number} пиксельден кем болмауы қажет.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'Тексеріс коды қате.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Барлығы {count, number} жазба.', 'Unable to verify your data submission.' => 'Жіберілген мәліметерді тексеру мүмкін емес.', - 'Unknown command "{command}".' => '"{command}" командасы белгісіз.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Белгісіз опция: --{name}', 'Update' => 'Жаңарту', 'View' => 'Көру', 'Yes' => 'Иә', 'You are not allowed to perform this action.' => 'Сізге бұл әрекетті жасауға рұқсат жоқ', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Сіз {limit} файлдан көп жүктей алмайсыз.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => 'енгізілген мән', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» Бұл бос емес мән.', '{attribute} cannot be blank.' => '«{attribute}» толтыруды қажет етеді.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '«{attribute}» мәні жарамсыз.', '{attribute} is not a valid URL.' => '«{attribute}» жарамды URL емес.', '{attribute} is not a valid email address.' => '«{attribute}» жарамды email адрес емес.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '«{attribute}» мәні «{requiredValue}» болу керек.', '{attribute} must be a number.' => '«{attribute}» мәні сан болуы керек.', '{attribute} must be a string.' => '«{attribute}» мәні мәтін болуы керек.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '«{attribute}» мәні бүтін сан болу керек.', '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» мәні «{true}» немесе «{false}» болуы керек.', - '{attribute} must be greater than "{compareValue}".' => '«{attribute}» мәні мынадан үлкен болуы керек: «{compareValue}».', - '{attribute} must be greater than or equal to "{compareValue}".' => '«{attribute}» мәні мынадан үлкен немесе тең болуы керек: «{compareValue}».', - '{attribute} must be less than "{compareValue}".' => '«{attribute}» мәні мынадан кіші болуы керек: «{compareValue}».', - '{attribute} must be less than or equal to "{compareValue}".' => '«{attribute}» мәні мынадан кіші немесе тең болуы керек: «{compareValue}».', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '«{attribute}» мәні мынадан үлкен болуы керек: «{compareValueOrAttribute}».', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні мынадан үлкен немесе тең болуы керек: «{compareValueOrAttribute}».', + '{attribute} must be less than "{compareValueOrAttribute}".' => '«{attribute}» мәні мынадан кіші болуы керек: «{compareValueOrAttribute}».', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні мынадан кіші немесе тең болуы керек: «{compareValueOrAttribute}».', '{attribute} must be no greater than {max}.' => '«{attribute}» мәні мынадан аспауы керек: {max}.', '{attribute} must be no less than {min}.' => '«{attribute}» мәні мынадан кем болмауы керек: {min}.', - '{attribute} must be repeated exactly.' => '«{attribute}» мәні дәлме-дәл қайталану керек.', - '{attribute} must not be equal to "{compareValue}".' => '«{attribute}» мәні мынаған тең болмауы керек: «{compareValue}».', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні мынаған тең болмауы керек: «{compareValueOrAttribute}».', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» мәні кемінде {min} таңбадан тұруы керек.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» мәні {max} таңбадан аспауы қажет.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» {length} таңбадан тұруы керек.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', + '{nFormatted} B' => '', + '{nFormatted} GB' => '', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/ko/yii.php b/framework/messages/ko/yii.php index b0ad872fe72..bf0a51babb4 100644 --- a/framework/messages/ko/yii.php +++ b/framework/messages/ko/yii.php @@ -23,8 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(설정되어있지않습니다)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '서버 오류가 발생하였습니다.', + 'Are you sure you want to delete this item?' => '', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => '삭제', 'Error' => '오류', 'File upload failed.' => '파일 업로드 실패하였습니다.', @@ -34,52 +40,108 @@ 'Missing required arguments: {params}' => '필요한 인수가 없습니다: {params}', 'Missing required parameters: {params}' => '필요한 매개변수가 없습니다: {params}', 'No' => '아니오', - 'No help for unknown command "{command}".' => '알 수 없는 명령 "{command}"에 대한 도움말이 없습니다.', - 'No help for unknown sub-command "{command}".' => '알 수 없는 하위명령 "{command}"에 대한 도움말이 없습니다.', 'No results found.' => '결과가 없습니다.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => '', 'Only files with these extensions are allowed: {extensions}.' => '다음의 확장명을 가진 파일만 허용됩니다: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => '페이지를 찾을 수 없습니다.', 'Please fix the following errors:' => '다음 오류를 수정하십시오:', 'Please upload a file.' => '파일을 업로드하십시오.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount} 중 {begin} 에서 {end} 까지 표시하고 있습니다.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '파일 "{file}"은 이미지 파일이 아닙니다.', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => '파일 "{file}"는 크기가 너무 큽니다. 파일 크기는 {limit} 바이트를 초과할 수 없습니다.', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => '파일 "{file}"는 크기가 너무 작습니다. 크기는 {limit} 바이트 보다 작을 수 없습니다.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '', 'The format of {attribute} is invalid.' => '{attribute}의 형식이 올바르지 않습니다.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '이미지 "{file}"가 너무 큽니다. 높이는 {limit} 보다 클 수 없습니다.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '이미지 "{file}"가 너무 큽니다. 넓이는 {limit} 보다 클 수 없습니다.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '이미지 "{file}"가 너무 작습니다. 높이는 {limit} 보다 작을 수 없습니다.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '이미지 "{file}"가 너무 작습니다. 넒이는 {limit} 보다 작을 수 없습니다.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => '확인코드가 올바르지않습니다.', 'Total {count, number} {count, plural, one{item} other{items}}.' => '모두 {count} 개', 'Unable to verify your data submission.' => '데이터 전송을 확인하지 못했습니다.', - 'Unknown command "{command}".' => '알 수 없는 명령 "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => '알 수 없는 옵션: --{name}', 'Update' => '갱신', 'View' => '보기', 'Yes' => '예', 'You are not allowed to perform this action.' => '이 작업의 실행을 허가받지못하였습니다.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => '최대 {limit} 개의 파일을 업로드할 수 있습니다.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => '입력 값', '{attribute} "{value}" has already been taken.' => '{attribute}에 "{value}"이 이미 사용되고 있습니다.', '{attribute} cannot be blank.' => '{attribute}는 공백일 수 없습니다.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute}가 잘못되었습니다.', '{attribute} is not a valid URL.' => '{attribute}는 올바른 URL 형식이 아닙니다.', '{attribute} is not a valid email address.' => '{attribute}는 올바른 이메일 주소 형식이 아닙니다.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute}는 {value}이어야 합니다.', '{attribute} must be a number.' => '{attribute}는 반드시 숫자이어야 합니다.', '{attribute} must be a string.' => '{attribute}는 반드시 문자이어야 합니다.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute}는 반드시 정수이어야 합니다.', '{attribute} must be either "{true}" or "{false}".' => '{attribute}는 {true} 또는 {false} 이어야 합니다.', - '{attribute} must be greater than "{compareValue}".' => '{attribute}는 "{compareValue}" 보다 커야 합니다.', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute}는 "{compareValue}" 보다 크거나 같아야 합니다.', - '{attribute} must be less than "{compareValue}".' => '{attribute}는 "{compareValue}" 보다 작아야 합니다.', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}는 "{compareValue}" 보다 작거나 같아야 합니다.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute}는 "{compareValueOrAttribute}" 보다 커야 합니다.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute}는 "{compareValueOrAttribute}" 보다 크거나 같아야 합니다.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute}는 "{compareValueOrAttribute}" 보다 작아야 합니다.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute}는 "{compareValueOrAttribute}" 보다 작거나 같아야 합니다.', '{attribute} must be no greater than {max}.' => '{attribute}는 "{max}" 보다 클 수 없습니다.', '{attribute} must be no less than {min}.' => '{attribute}는 "{min}" 보다 작을 수 없습니다.', - '{attribute} must be repeated exactly.' => '{attribute}는 정확하게 반복합니다.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute}는 "{compareValue}"와 같을 수 없습니다.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute}는 "{compareValueOrAttribute}"와 같을 수 없습니다.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute}는 최소 {min}자 이어야합니다.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute}는 최대 {max}자 이어야합니다.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute}는 {length}자 이어야합니다.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', + '{nFormatted} B' => '', + '{nFormatted} GB' => '', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/kz/yii.php b/framework/messages/kz/yii.php index d8a3cf94b5a..76c43e120c8 100644 --- a/framework/messages/kz/yii.php +++ b/framework/messages/kz/yii.php @@ -1,8 +1,14 @@ '{nFormatted} Б', - '{nFormatted} GB' => '{nFormatted} ГБ', - '{nFormatted} GiB' => '{nFormatted} ГиБ', - '{nFormatted} kB' => '{nFormatted} КБ', - '{nFormatted} KiB' => '{nFormatted} КиБ', - '{nFormatted} MB' => '{nFormatted} МБ', - '{nFormatted} MiB' => '{nFormatted} МиБ', - '{nFormatted} PB' => '{nFormatted} ПБ', - '{nFormatted} PiB' => '{nFormatted} ПиБ', - '{nFormatted} TB' => '{nFormatted} ТБ', - '{nFormatted} TiB' => '{nFormatted} ТиБ', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байттар} few{байт} many{байттар} other{байт}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайта} many{гибибайтов} other{гибибайта}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайта} many{гигабайтов} other{гигабайта}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{кибибайт} few{кибибайта} many{кибибайтов} other{кибибайта}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{килобайт} few{килобайта} many{килобайтов} other{килобайта}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{мебибайт} few{мебибайта} many{мебибайтов} other{мебибайта}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{мегабайт} few{мегабайта} many{мегабайтов} other{мегабайта}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{пебибайт} few{пебибайта} many{пебибайтов} other{пебибайта}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабайт} few{петабайта} many{петабайтов} other{петабайта}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{тебибайт} few{тебибайта} many{тебибайтов} other{тебибайта}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабайт} few{терабайта} many{терабайтов} other{терабайта}}', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(көрсетілмеген)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Ішкі сервер қатесі орын алды.', 'Are you sure you want to delete this item?' => 'Бұл элементті жою керек пе?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Жою', 'Error' => 'Қате', 'File upload failed.' => 'Файл жүктелмеді.', @@ -51,19 +40,22 @@ 'Missing required arguments: {params}' => 'Қажетті дәлелдер жоқ: {params}', 'Missing required parameters: {params}' => 'Қажетті параметрлер жоқ: {params}', 'No' => 'Жоқ', - 'No help for unknown command "{command}".' => 'Анық емес "{command}" пәрменіне көмек жоқ.', - 'No help for unknown sub-command "{command}".' => 'Анық емес субкоманда "{command}" үшін көмек жоқ.', 'No results found.' => 'Еш нәрсе табылмады.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Тек келесі MIME-түріндегі файлдарға рұқсат етіледі: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Тек келесі кеңейтілімдері бар файлдарға рұқсат етіледі: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Бет табылмады.', 'Please fix the following errors:' => 'Келесі қателерді түзетіңіз:', 'Please upload a file.' => 'Файлды жүктеп алыңыз.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Жазбаларды көрсету {begin, number}-{end, number} из {totalCount, number}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '"{file}" файлы сурет емес.', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => '«{file}» файлы тым үлкен. Өлшемі {шектеу, сан} {limit, plural, one{байттар} few{байт} many{байттар} other{байта}}.', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => '«{file}» файлы тым кішкентай. Өлшем көп болуы керек {limit, number} {limit, plural, one{байттар} few{байта} many{байт} other{байта}}.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '', 'The format of {attribute} is invalid.' => '{attribute} мәнінің пішімі дұрыс емес.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файлы тым үлкен. Биіктігі аспауы керек {limit, number} {limit, plural, other{пиксел}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файлы тым үлкен. Ені аспауы тиіс {limit, number} {limit, plural, other{пиксел}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файлы тым кішкентай. Биіктігі көп болуы керек {limit, number} {limit, plural, other{пиксел}}.', @@ -72,13 +64,15 @@ 'The verification code is incorrect.' => 'Растау коды дұрыс емес.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Барлығы {count, number} {count, plural, one{кіру} few{жазбалар} many{жазбалар} other{жазбалар}}.', 'Unable to verify your data submission.' => 'Жіберілген деректерді тексере алмадық.', - 'Unknown command "{command}".' => 'Белгісіз команда "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Белгісіз опция: --{name}', 'Update' => 'Өңдеу', 'View' => 'Ішінде қараңыз', 'Yes' => 'Ия', 'You are not allowed to perform this action.' => 'Сіз бұл әрекетті орындауға рұқсатыңыз жоқ.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Көбірек жүктей алмайсыз {limit, number} {limit, plural, one{файл} few{файлдар} many{файлдар} other{файл}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'арқылы {delta, plural, =1{күн} one{# күн} few{# күн} many{# күндер} other{# күн}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'арқылы {delta, plural, =1{минутына} one{# минутына} few{# минуттар} many{# минуттар} other{# минуттар}}', 'in {delta, plural, =1{a month} other{# months}}' => 'арқылы {delta, plural, =1{ай} one{# ай} few{# айлар} many{# айлар} other{# айлар}}', @@ -89,29 +83,65 @@ 'the input value' => 'енгізілген мән', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» қазірдің өзінде қабылданды.', '{attribute} cannot be blank.' => 'Толтырылуы керек «{attribute}».', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '«{attribute}» мәні жарамсыз.', '{attribute} is not a valid URL.' => '«{attribute}» мәні жарамды URL емес.', '{attribute} is not a valid email address.' => '«{attribute}» мәні жарамды электрондық пошта мекенжайы емес.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '«{attribute}» мәні «{requiredValue}» дегенге тең болуы керек.', '{attribute} must be a number.' => '«{attribute}» мәні сан болуы керек.', '{attribute} must be a string.' => '«{attribute}» мәні жол болуы керек.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '«{attribute}» мәні бүтін сан болуы керек.', '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» мәні «{true}» немесе «{false}» мәніне тең болуы керек.', - '{attribute} must be greater than "{compareValue}".' => '«{attribute}» мәні «{compareValue}» мәнінен үлкен болуы керек.', - '{attribute} must be greater than or equal to "{compareValue}".' => '«{attribute}» мәні «{compareValue}» мәнінен үлкен немесе тең болуы керек.', - '{attribute} must be less than "{compareValue}".' => '«{attribute}» мәні «{compareValue}» мәнінен аз болуы керек.', - '{attribute} must be less than or equal to "{compareValue}".' => '«{attribute}» мәні «{compareValue}» мәнінен аз немесе тең болуы керек.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '«{attribute}» мәні «{compareValueOrAttribute}» мәнінен үлкен болуы керек.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні «{compareValueOrAttribute}» мәнінен үлкен немесе тең болуы керек.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '«{attribute}» мәні «{compareValueOrAttribute}» мәнінен аз болуы керек.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні «{compareValueOrAttribute}» мәнінен аз немесе тең болуы керек.', '{attribute} must be no greater than {max}.' => '«{attribute}» мәні {max} аспауы керек.', '{attribute} must be no less than {min}.' => '«{attribute}» мәні кем дегенде {min} болуы керек.', - '{attribute} must be repeated exactly.' => '«{attribute}» мәні дәл қайталануы керек.', - '{attribute} must not be equal to "{compareValue}".' => '«{attribute}» мәні «{compareValue}» тең болмауы керек.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» мәні «{compareValueOrAttribute}» тең болмауы керек.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» мәні минималды {min, number} болуы керек {min, number} {min, plural, one{таңба} few{таңба} many{таңбалар} other{таңба}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» мәні ең көп {max, number} {max, plural, one{таңба} few{таңба} many{таңбалар} other{таңба}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» мәні {length, number} болуы керек {length, plural, one{таңба} few{таңба} many{таңбалар} other{таңба}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{күн} one{күн} few{# күн} many{# күндер} other{# күн}} артқа қарай', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{минутына} one{# минутына} few{# минуттар} many{# минуттар} other{# минуттар}} артқа қарай', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{ай} one{# ай} few{# айлар} many{# айлар} other{# айлар}} артқа қарай', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, other{# екіншіден}} артқа қарай', '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{жыл} one{# жыл} few{# жыл} many{# жастағы} other{# жыл}} артқа қарай', '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, other{# сағат}} артқа қарай', -]; \ No newline at end of file + '{nFormatted} B' => '{nFormatted} Б', + '{nFormatted} GB' => '{nFormatted} ГБ', + '{nFormatted} GiB' => '{nFormatted} ГиБ', + '{nFormatted} KiB' => '{nFormatted} КиБ', + '{nFormatted} MB' => '{nFormatted} МБ', + '{nFormatted} MiB' => '{nFormatted} МиБ', + '{nFormatted} PB' => '{nFormatted} ПБ', + '{nFormatted} PiB' => '{nFormatted} ПиБ', + '{nFormatted} TB' => '{nFormatted} ТБ', + '{nFormatted} TiB' => '{nFormatted} ТиБ', + '{nFormatted} kB' => '{nFormatted} КБ', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байттар} few{байт} many{байттар} other{байт}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайта} many{гибибайтов} other{гибибайта}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайта} many{гигабайтов} other{гигабайта}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{кибибайт} few{кибибайта} many{кибибайтов} other{кибибайта}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{килобайт} few{килобайта} many{килобайтов} other{килобайта}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{мебибайт} few{мебибайта} many{мебибайтов} other{мебибайта}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{мегабайт} few{мегабайта} many{мегабайтов} other{мегабайта}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{пебибайт} few{пебибайта} many{пебибайтов} other{пебибайта}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабайт} few{петабайта} many{петабайтов} other{петабайта}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{тебибайт} few{тебибайта} many{тебибайтов} other{тебибайта}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабайт} few{терабайта} many{терабайтов} other{терабайта}}', +]; diff --git a/framework/messages/lt/yii.php b/framework/messages/lt/yii.php index fce59c5471b..72d8d5b3081 100644 --- a/framework/messages/lt/yii.php +++ b/framework/messages/lt/yii.php @@ -23,32 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'just now' => 'dabar', - '{nFormatted} B' => '{nFormatted} B', - '{nFormatted} GB' => '{nFormatted} GB', - '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', - '{nFormatted} KiB' => '{nFormatted} KiB', - '{nFormatted} MB' => '{nFormatted} MB', - '{nFormatted} MiB' => '{nFormatted} MiB', - '{nFormatted} PB' => '{nFormatted} PB', - '{nFormatted} PiB' => '{nFormatted} PiB', - '{nFormatted} TB' => '{nFormatted} TB', - '{nFormatted} TiB' => '{nFormatted} TiB', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} gibi{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} giga{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} kibi{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilo{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} mebi{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} mega{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} pebi{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} peta{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} tebi{n, plural, one{baitas} few{baitai} other{baitų}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} tera{n, plural, one{baitas} few{baitai} other{baitų}}', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(nenustatyta)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Įvyko vidinė serverio klaida', 'Are you sure you want to delete this item?' => 'Ar tikrai norite ištrinti šį elementą?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Ištrinti', 'Error' => 'Klaida', 'File upload failed.' => 'Nepavyko įkelti failo.', @@ -61,14 +43,19 @@ 'No results found.' => 'Nėra užklausą atitinkančių įrašų.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Leidžiama įkelti tik šių MIME tipų failus: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Leidžiama įkelti failus tik su šiais plėtiniais: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Puslapis nerastas.', 'Please fix the following errors:' => 'Prašytume ištaisyti nurodytas klaidas:', 'Please upload a file.' => 'Prašome įkelti failą.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Rodomi rezultatai {begin, number}-{end, number}{totalCount, number}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Failas „{file}“ nėra paveikslėlis.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Failas „{file}“ yra per didelis. Dydis negali viršyti {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Failas „{file}“ yra per mažas. Dydis negali būti mažesnis už {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Atributo „{attribute}“ formatas yra netinkamas.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Paveikslėlis „{file}“ yra per didelis. Aukštis negali viršyti {limit, number} {limit, plural, one{taško} few{taškų} other{taškų}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Paveikslėlis „{file}“ yra per didelis. Plotis negali viršyti {limit, number} {limit, plural, one{taško} few{taškų} other{taškų}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Paveikslėlis „{file}“ yra per mažas. Aukštis turi viršyti {limit, number} {limit, plural, one{tašką} few{taškus} other{taškų}}.', @@ -77,44 +64,84 @@ 'The verification code is incorrect.' => 'Neteisingas patikrinimo kodas.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Iš viso {count, number} {count, plural, one{elementas} few{elementai} other{elementų}}.', 'Unable to verify your data submission.' => 'Neįmanoma patikrinti jūsų siunčiamų duomenų.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Nežinomas pasirinkimas: --{name}', 'Update' => 'Atnaujinti', 'View' => 'Peržiūrėti', 'Yes' => 'Taip', 'You are not allowed to perform this action.' => 'Jums neleidžiama atlikti šio veiksmo.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Leidžiama įkelti ne daugiau nei {limit, number} {limit, plural, one{failą} few{failus} other{failų}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'po {delta, plural, =1{dienos} one{# dienos} other{# dienų}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'po {delta, plural, =1{minutės} one{# minutės} other{# minučių}}', 'in {delta, plural, =1{a month} other{# months}}' => 'po {delta, plural, =1{mėnesio} one{# mėnesio} other{# mėnesių}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'po {delta, plural, =1{sekundės} one{# sekundės} other{# sekundžių}}', 'in {delta, plural, =1{a year} other{# years}}' => 'po {delta, plural, =1{metų} other{# metų}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'po {delta, plural, =1{valandos} one{# valandos} other{# valandų}}', + 'just now' => 'dabar', 'the input value' => 'įvesties reikšmė', '{attribute} "{value}" has already been taken.' => '{attribute} reikšmė „{value}“ jau naudojama.', '{attribute} cannot be blank.' => '„{attribute}“ negali būti tuščias.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '„{attribute}“ reikšmė netinkama.', '{attribute} is not a valid URL.' => '„{attribute}“ įvestas netinkamas URL.', '{attribute} is not a valid email address.' => '„{attribute}“ įvestas netinkamas el. pašto adresas.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '„{attribute}“ privalo būti „{requiredValue}“.', '{attribute} must be a number.' => '„{attribute}“ privalo būti skaičius.', '{attribute} must be a string.' => '„{attribute}“ privalo būti eilutė.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '„{attribute}“ privalo būti sveikas skaičius.', '{attribute} must be either "{true}" or "{false}".' => '„{attribute}“ privalo būti „{true}“ arba „{false}“.', - '{attribute} must be greater than "{compareValue}".' => 'Laukelio „{attribute}“ reikšmė privalo būti didesnė nei „{compareValue}“.', - '{attribute} must be greater than or equal to "{compareValue}".' => 'Laukelio „{attribute}“ reikšmė privalo būti didesnė arba lygi „{compareValue}“.', - '{attribute} must be less than "{compareValue}".' => 'Laukelio „{attribute}“ reikšmė privalo būti mažesnė nei „{compareValue}“.', - '{attribute} must be less than or equal to "{compareValue}".' => 'Laukelio „{attribute}“ reikšmė privalo būti mažesnė arba lygi „{compareValue}“.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => 'Laukelio „{attribute}“ reikšmė privalo būti didesnė nei „{compareValueOrAttribute}“.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => 'Laukelio „{attribute}“ reikšmė privalo būti didesnė arba lygi „{compareValueOrAttribute}“.', + '{attribute} must be less than "{compareValueOrAttribute}".' => 'Laukelio „{attribute}“ reikšmė privalo būti mažesnė nei „{compareValueOrAttribute}“.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => 'Laukelio „{attribute}“ reikšmė privalo būti mažesnė arba lygi „{compareValueOrAttribute}“.', '{attribute} must be no greater than {max}.' => 'Laukelio „{attribute}“ reikšmė privalo būti ne didesnė nei {max}.', '{attribute} must be no less than {min}.' => 'Laukelio „{attribute}“ reikšmė privalo būti ne mažesnė nei {min}.', - '{attribute} must be repeated exactly.' => 'Laukelio „{attribute}“ reikšmė privalo būti pakartota tiksliai.', - '{attribute} must not be equal to "{compareValue}".' => 'Laukelio „{attribute}“ reikšmė negali būti lygi „{compareValue}“.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => 'Laukelio „{attribute}“ reikšmė negali būti lygi „{compareValueOrAttribute}“.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Laukelio „{attribute}“ reikšmę privalo sudaryti mažiausiai {min, number} {min, plural, one{ženklas} few{ženklai} other{ženklų}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Laukelio „{attribute}“ reikšmę privalo sudaryti daugiausiai {max, number} {max, plural, one{ženklas} few{ženklai} other{ženklų}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Laukelio „{attribute}“ reikšmę privalo sudaryti {length, number} {length, plural, one{ženklas} few{ženklai} other{ženklų}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => 'prieš {delta, plural, =1{dieną} one{# dieną} few{# dienas} other{# dienų}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'prieš {delta, plural, =1{minutę} one{# minutę} few{# minutes} other{# minučių}}', '{delta, plural, =1{a month} other{# months}} ago' => 'prieš {delta, plural, =1{mėnesį} one{# mėnesį} few{# mėnesius} other{# mėnesių}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'prieš {delta, plural, =1{sekundę} one{# sekundę} few{# sekundes} other{# sekundžių}}', '{delta, plural, =1{a year} other{# years}} ago' => 'prieš {delta, plural, =1{metus} one{# metus} few{# metus} other{# metų}}', '{delta, plural, =1{an hour} other{# hours}} ago' => 'prieš {delta, plural, =1{valandą} one{# valandą} few{# valandas} other{# valandų}}', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} gibi{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} giga{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} kibi{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilo{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} mebi{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} mega{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} pebi{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} peta{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} tebi{n, plural, one{baitas} few{baitai} other{baitų}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} tera{n, plural, one{baitas} few{baitai} other{baitų}}', ]; diff --git a/framework/messages/lv/yii.php b/framework/messages/lv/yii.php index e49ca559500..d1ad194b9d4 100644 --- a/framework/messages/lv/yii.php +++ b/framework/messages/lv/yii.php @@ -23,31 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '{nFormatted} B' => '{nFormatted} B', - '{nFormatted} GB' => '{nFormatted} Gb', - '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', - '{nFormatted} KiB' => '{nFormatted} KiB', - '{nFormatted} MB' => '{nFormatted} MB', - '{nFormatted} MiB' => '{nFormatted} MiB', - '{nFormatted} PB' => '{nFormatted} PB', - '{nFormatted} PiB' => '{nFormatted} PiB', - '{nFormatted} TB' => '{nFormatted} TB', - '{nFormatted} TiB' => '{nFormatted} TiB', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} gibi{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} giga{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} kibi{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilo{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} mebi{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} mega{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} pebi{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} peta{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} tebi{n, plural, zero{baitu} one{baits} other{baiti}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} tera{n, plural, zero{baitu} one{baits} other{baiti}}', + ' and ' => ' un ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" neatbalsta operātoru "{operator}".', '(not set)' => '(nav uzstādīts)', + 'Action not found.' => 'Darbība nav atrasta', + 'Aliases available: {aliases}' => 'Pieejamie pseidonīmi: {aliases}', 'An internal server error occurred.' => 'Notika servera iekšējā kļūda.', 'Are you sure you want to delete this item?' => 'Vai jūs esat pārliecināti, ka vēlaties dzēst šo vienumu?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '"{attribute}" nosacījumam jābūt vai nu vērtībai, vai derīgai operatora specifikācijai.', 'Delete' => 'Dzēst', 'Error' => 'Kļūda', 'File upload failed.' => 'Neizdevās augšupielādēt datni.', @@ -57,23 +40,22 @@ 'Missing required arguments: {params}' => 'Trūkst nepieciešamie argumenti: {params}', 'Missing required parameters: {params}' => 'Trūkst nepieciešamie parametri: {params}', 'No' => 'Nē', - '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, zero{# dienas} one{# diena} other{# dienas}}', - '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, zero{# stundas} one{# stunda} other{# stundas}}', - '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, zero{# minūtes} one{# minūte} other{# minūtes}}', - '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, zero{# mēneši} one{# mēnesis} other{# mēneši}}', - '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, zero{# sekundes} one{# sekunde} other{# sekundes}}', - '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, zero{# gadi} one{# gads} other{# gadi}}', 'No results found.' => 'Nekas netika atrasts.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Ir atļauts augšupielādēt datnes tikai ar šādiem MIME-tipiem: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Ir atļauts augšupielādēt datnes tikai ar šādiem paplašinājumiem: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'Operātoru "{operator}" jāizmanto meklēšanas atribūtā', + 'Operator "{operator}" requires multiple operands.' => 'Operātoram "{operator}" nepieciešami vairāki operandi', + 'Options available: {options}' => 'Pieejamas opvijas: {options}', 'Page not found.' => 'Pieprasītā lapa netika atrasta.', 'Please fix the following errors:' => 'Nepieciešams izlabot šādas kļūdas:', 'Please upload a file.' => 'Lūdzu, augšupielādēt datni.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Tiek rādīti ieraksti {begin, number}-{end, number} no {totalCount, number}.', + 'The combination {values} of {attributes} has already been taken.' => 'Kombinācija {values} priekš {attributes} ir jau aizņemta.', 'The file "{file}" is not an image.' => 'Saņemtā "{file}" datne nav attēls.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Saņemtās "{file}" datnes izmērs pārsniedz pieļaujamo ierobežojumu {formattedLimit} apmērā.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Saņemtās "{file}" datnes izmērs ir pārāk maza, tai ir jābūt vismaz {formattedLimit} apmērā.', 'The format of {attribute} is invalid.' => '{attribute} vērtības formāts ir nepareizs.', + 'The format of {filter} is invalid.' => '{filter} formāts ir kļūdains', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls "{file}" ir pārāk liels. Augstumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls "{file}" ir pārāk liels. Platumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls "{file}" ir pārāk mazs. Augstumam ir jābūt lielākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', @@ -82,67 +64,84 @@ 'The verification code is incorrect.' => 'Cilvēktesta kods bija nepareizs.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Kopā {count, number} {count, plural, zero{ierakstu} one{ieraksts} other{ieraksti}}.', 'Unable to verify your data submission.' => 'Neizdevās apstiprināt saņemtos datus.', + 'Unknown alias: -{name}' => 'Neatpazīts preidonīms {name}', + 'Unknown filter attribute "{attribute}"' => 'Neatpazīts filtra attribūts "{attribute}"', 'Unknown option: --{name}' => 'Nezināma iespēja: --{name}', 'Update' => 'Labot', 'View' => 'Apskatīt', 'Yes' => 'Jā', 'You are not allowed to perform this action.' => 'Jūs neesat autorizēts veikt šo darbību.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Jūs nevarat augšupielādēt vairāk par {limit, number} {limit, plural, one{failu} other{failiem}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Jums jāaugšupielādē vismaz {limit, number} {limit, mulural, one {file} other {files}}.', 'in {delta, plural, =1{a day} other{# days}}' => 'pēc {delta, plural, =1{dienas} one{# dienas} other{# dienām}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'pēc {delta, plural, =1{minūtes} one{# minūtes} other{# minūtēm}}', 'in {delta, plural, =1{a month} other{# months}}' => 'pēc {delta, plural, =1{mēneša} one{# mēneša} other{# mēnešiem}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'pēc {delta, plural, =1{sekundes} one{# sekundes} other{# sekundēm}}', 'in {delta, plural, =1{a year} other{# years}}' => 'pēc {delta, plural, =1{gada} one{# gada} other{# gadiem}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'pēc {delta, plural, =1{stundas} one{# stundas} other{# stundām}}', + 'just now' => 'tikko', 'the input value' => 'ievadītā vērtība', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" jau ir aizņemts.', '{attribute} cannot be blank.' => 'Ir jāaizpilda {attribute}.', + '{attribute} contains wrong subnet mask.' => '{attribute} satur kļūdainu apakštīklu.', '{attribute} is invalid.' => '{attribute} vērtība ir nepareiza.', '{attribute} is not a valid URL.' => '{attribute} vērtība nav pareiza URL formātā.', '{attribute} is not a valid email address.' => '{attribute} vērtība nav pareizas e-pasta adreses formātā.', + '{attribute} is not in the allowed range.' => '{attribute} nav atļautajā diapazonā.', '{attribute} must be "{requiredValue}".' => '{attribute} vērtībai ir jābūt vienādai ar "{requiredValue}".', '{attribute} must be a number.' => '{attribute} vērtībai ir jābūt skaitlim.', '{attribute} must be a string.' => '{attribute} vērtībai ir jābūt simbolu virknei.', + '{attribute} must be a valid IP address.' => '{attribute} jābūt derīgai IP adresei.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} jābūt IP adresei ar norādīto apakštīklu.', '{attribute} must be an integer.' => '{attribute} vērtībai ir jābūt veselam skaitlim.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} vērtībai ir jābūt "{true}" vai "{false}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt vienādai ar "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt lielākai par "{compareValueOrAttribute}" vērtību.', '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt lielākai vai vienādai ar "{compareValueOrAttribute}" vērtību.', '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt mazākai par "{compareValueOrAttribute}" vērtību.', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt mazākai vai vienādai ar "{compareValueOrAttribute}" vērtību.', '{attribute} must be no greater than {max}.' => '{attribute} vērtībai ir jābūt ne lielākai par {max}.', '{attribute} must be no less than {min}.' => '{attribute} vērtībai ir jābūt ne mazākai par {min}.', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} vērtībai ir jābūt vienādai ar "{compareValueOrAttribute}".', + '{attribute} must not be a subnet.' => '{attribute} nedrīkst būt apakštīkls.', + '{attribute} must not be an IPv4 address.' => '{attribute} nedrīkst būt IPv4 adrese.', + '{attribute} must not be an IPv6 address.' => '{attribute} nedrīkst būt IPv6 adrese.', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} vērtība nedrīkst būt vienāda ar "{compareValueOrAttribute}" vērtību.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} vērtībai ir jābūt ne īsākai par {min, number} {min, plural, one{simbolu} other{simboliem}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} vērtībai ir jābūt ne garākai par {max, number} {max, plural, one{simbolu} other{simboliem}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} vērtībai ir jāsastāv no {length, number} {length, plural, one{simbola} other{simboliem}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, zero{# dienas} one{# diena} other{# dienas}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, zero{# stundas} one{# stunda} other{# stundas}}', + '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, zero{# minūtes} one{# minūte} other{# minūtes}}', + '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, zero{# mēneši} one{# mēnesis} other{# mēneši}}', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, zero{# sekundes} one{# sekunde} other{# sekundes}}', + '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, zero{# gadi} one{# gads} other{# gadi}}', '{delta, plural, =1{a day} other{# days}} ago' => 'pirms {delta, plural, =1{dienas} one{# dienas} other{# dienām}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'pirms {delta, plural, =1{minūtes} one{# minūtes} other{# minūtēm}}', '{delta, plural, =1{a month} other{# months}} ago' => 'pirms {delta, plural, =1{mēneša} one{# mēneša} other{# mēnešiem}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'pirms {delta, plural, =1{sekundes} one{# sekundes} other{# sekundēm}}', '{delta, plural, =1{a year} other{# years}} ago' => 'pirms {delta, plural, =1{gada} one{# gada} other{# gadiem}}', '{delta, plural, =1{an hour} other{# hours}} ago' => 'pirms {delta, plural, =1{stundas} one{# stundas} other{# stundām}}', - ' and ' => ' un ', - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" neatbalsta operātoru "{operator}".', - 'Action not found.' => 'Darbība nav atrasta', - 'Aliases available: {aliases}' => 'Pieejamie pseidonīmi: {aliases}', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => '"{attribute}" nosacījumam jābūt vai nu vērtībai, vai derīgai operatora specifikācijai.', - 'Operator "{operator}" must be used with a search attribute.' => 'Operātoru "{operator}" jāizmanto meklēšanas atribūtā', - 'Operator "{operator}" requires multiple operands.' => 'Operātoram "{operator}" nepieciešami vairāki operandi', - 'Options available: {options}' => 'Pieejamas opvijas: {options}', - 'Powered by {yii}' => 'Darbojas ar {yii}', - 'The combination {values} of {attributes} has already been taken.' => 'Kombinācija {values} priekš {attributes} ir jau aizņemta.', - 'The format of {filter} is invalid.' => '{filter} formāts ir kļūdains', - 'Unknown alias: -{name}' => 'Neatpazīts preidonīms {name}', - 'Unknown filter attribute "{attribute}"' => 'Neatpazīts filtra attribūts "{attribute}"', - 'Yii Framework' => 'Yii ietvars', - 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Jums jāaugšupielādē vismaz {limit, number} {limit, mulural, one {file} other {files}}.', - 'just now' => 'tikko', - '{attribute} contains wrong subnet mask.' => '{attribute} satur kļūdainu apakštīklu.', - '{attribute} is not in the allowed range.' => '{attribute} nav atļautajā diapazonā.', - '{attribute} must be a valid IP address.' => '{attribute} jābūt derīgai IP adresei.', - '{attribute} must be an IP address with specified subnet.' => '{attribute} jābūt IP adresei ar norādīto apakštīklu.', - '{attribute} must not be a subnet.' => '{attribute} nedrīkst būt apakštīkls.', - '{attribute} must not be an IPv4 address.' => '{attribute} nedrīkst būt IPv4 adrese.', - '{attribute} must not be an IPv6 address.' => '{attribute} nedrīkst būt IPv6 adrese.', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} Gb', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} gibi{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} giga{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} kibi{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilo{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} mebi{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} mega{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} pebi{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} peta{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} tebi{n, plural, zero{baitu} one{baits} other{baiti}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} tera{n, plural, zero{baitu} one{baits} other{baiti}}', ]; diff --git a/framework/messages/ms/yii.php b/framework/messages/ms/yii.php index 72212cbb3ed..3850dcaa6fe 100644 --- a/framework/messages/ms/yii.php +++ b/framework/messages/ms/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(tidak ditetapkan)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Ralat dalaman pelayan web telah berlaku', 'Are you sure you want to delete this item?' => 'Adakah anda pasti untuk menghapuskan item ini?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Padam', 'Error' => 'Ralat', 'File upload failed.' => 'Gagal memuat naik fail', @@ -38,14 +43,19 @@ 'No results found.' => 'Tiada keputusan dijumpai', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Hanya fail yang berjenis MIME dibenarkan: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Hanya fail yang mempunyai sambungan berikut dibenarkan: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Halaman tidak dijumpai.', 'Please fix the following errors:' => 'Sila betulkan ralat berikut:', 'Please upload a file.' => 'Sila muat naik fail', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Memaparkan {begin, number}-{end, number} daripada {totalCount, number} {totalCount, plural, one{item} other{items}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Fail ini "{file}" bukan berjenis gambar.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Fail ini "{file}" terlalu besar. Saiz tidak boleh lebih besar daripada {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Fail ini "{file}" terlalu kecil. Saiznya tidak boleh lebih kecil daripada {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format untuk atribut ini {attribute} tidak sah.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu panjang. Panjang gambar tidak boleh lebih besar daripada {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu lebar. Gambar tidak boleh lebih lebar daripada {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu singkat. Panjang tidak boleh lebih singkat daripada {limit, number} {limit, plural, one{pixel} other{pixels}}.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'Kod penyesah tidak tepat.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Jumlah {count, number} {count, plural, one{item} other{items}}.', 'Unable to verify your data submission.' => 'Tidak bejaya mengesahkan data yang dihantar.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Pilihan lain: --{name}', 'Update' => 'Kemaskini', 'View' => 'Paparan', 'Yes' => 'Ya', 'You are not allowed to perform this action.' => 'Anda tidak dibenarkan untuk mengunakan fungsi ini.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Anda boleh memuat naik tidak lebih daripada {limit, number} {limit, plural, one{file} other{files}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'dalam {delta, plural, =1{1 hari} other{# hari}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'dalam {delta, plural, =1{1 minit} other{# minit}}', 'in {delta, plural, =1{a month} other{# months}}' => 'dalam {delta, plural, =1{1 bulan} other{# bulan}}', @@ -70,25 +83,39 @@ 'the input value' => 'nilai input', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" telah digunakan.', '{attribute} cannot be blank.' => '{attribute} tidak boleh dibiarkan kosong.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} tidak sah.', '{attribute} is not a valid URL.' => '{attribute} alamat URL yang tidak sah.', '{attribute} is not a valid email address.' => '{attribute} adalah alamat email yang tidak sah.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} mestilah "{requiredValue}".', '{attribute} must be a number.' => '{attribute} mestilah nombor.', '{attribute} must be a string.' => '{attribute} mestilah perkataan.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} mestilah nombor tanpa titik perpuluhan.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} mestilah "{true}" atau "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} mestilah lebih besar daripada "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} mestilah lebih besar atau sama dengan "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} mestilah kurang daripada "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} mestilah kurang daripada atau sama dengan "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} mestilah lebih besar daripada "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} mestilah lebih besar atau sama dengan "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} mestilah kurang daripada "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} mestilah kurang daripada atau sama dengan "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} tidak boleh lebih besar daripada {max}.', '{attribute} must be no less than {min}.' => '{attribute} tidak boleh kurang daripada {min}.', - '{attribute} must be repeated exactly.' => '{attribute} mestilah diulang dengan tepat.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} mestilah tidak sama dengan "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} mestilah tidak sama dengan "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} mesti mengandungi sekurang-kurangnya {min, number} {min, plural, one{character} other{characters}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} mesti mengangungi paling banyak {max, number} {max, plural, one{character} other{characters}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} mesti mengandungi {length, number} {length, plural, one{character} other{characters}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{1 hari} other{# hari}} lalu', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{1 minit} other{# minit}} lalu', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{1 bulan} other{# bulan}} lalu', @@ -98,7 +125,6 @@ '{nFormatted} B' => '', '{nFormatted} GB' => '', '{nFormatted} GiB' => '', - '{nFormatted} kB' => '', '{nFormatted} KiB' => '', '{nFormatted} MB' => '', '{nFormatted} MiB' => '', @@ -106,6 +132,7 @@ '{nFormatted} PiB' => '', '{nFormatted} TB' => '', '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', diff --git a/framework/messages/nb-NO/yii.php b/framework/messages/nb-NO/yii.php index 9f9870c5e0a..7aebeffa60f 100644 --- a/framework/messages/nb-NO/yii.php +++ b/framework/messages/nb-NO/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(ikke angitt)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'En intern serverfeil oppstod.', 'Are you sure you want to delete this item?' => 'Er du sikker på at du vil slette dette elementet?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Slett', 'Error' => 'Feil', 'File upload failed.' => 'Filopplasting feilet.', @@ -38,14 +43,19 @@ 'No results found.' => 'Ingen resultater funnet.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Bare filer med disse MIME-typene er tillatt: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Bare filer med disse filendelsene er tillatt: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Siden finnes ikke.', 'Please fix the following errors:' => 'Vennligs fiks følgende feil:', 'Please upload a file.' => 'Vennligs last opp en fil.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Viser {begin, number}-{end, number} av {totalCount, number} {totalCount, plural, one{element} other{elementer}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Filen "{file}" er ikke et bilde.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Filen "{file}" er for stor. Størrelsen kan ikke overskride {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Filen "{file}" er for liten. Størrelsen kan ikke være mindre enn {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Formatet til {attribute} er ugyldig.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bildet "{file}" er for stort. Høyden kan ikke overskride {limit, number} {limit, plural, one{piksel} other{piksler}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bildet "{file}" er for stort. Bredden kan ikke overskride {limit, number} {limit, plural, one{piksel} other{piksler}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bildet "{file}" er for lite. Høyden kan ikke være mindre enn {limit, number} {limit, plural, one{piksel} other{piksler}}.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'Verifiseringskoden er feil.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Totalt {count, number} {count, plural, one{element} other{elementer}}.', 'Unable to verify your data submission.' => 'Kunne ikke verifisere innsendt data.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Ukjent alternativ: --{name}', 'Update' => 'Oppdater', 'View' => 'Vis', 'Yes' => 'Ja', 'You are not allowed to perform this action.' => 'Du har ikke tilatelse til å gjennomføre denne handlingen.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Du kan laste opp maks {limit, number} {limit, plural, one{fil} other{filer}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'om {delta, plural, =1{en dag} other{# dager}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'om {delta, plural, =1{ett minutt} other{# minutter}}', 'in {delta, plural, =1{a month} other{# months}}' => 'om {delta, plural, =1{en måned} other{# måneder}}', @@ -70,25 +83,39 @@ 'the input value' => 'inndataverdien', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" er allerede tatt i bruk.', '{attribute} cannot be blank.' => '{attribute} kan ikke være tomt.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} er ugyldig.', '{attribute} is not a valid URL.' => '{attribute} er ikke en gyldig URL.', '{attribute} is not a valid email address.' => '{attribute} er ikke en gyldig e-postadresse.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} må være "{requiredValue}".', '{attribute} must be a number.' => '{attribute} må være et nummer.', '{attribute} must be a string.' => '{attribute} må være en tekststreng.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} må være et heltall.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} må være enten "{true}" eller "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} må være større enn "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} må være større enn eller lik "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} må være mindre enn "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} må være mindre enn eller lik "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} må være større enn "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} må være større enn eller lik "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} må være mindre enn "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} må være mindre enn eller lik "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} kan ikke være større enn {max}.', '{attribute} must be no less than {min}.' => '{attribute} kan ikke være mindre enn {min}.', - '{attribute} must be repeated exactly.' => '{attribute} må gjentas nøyaktig.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} kan ikke være lik "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} kan ikke være lik "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} må inneholde minst {min, number} {min, plural, one{tegn} other{tegn}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} kan inneholde maks {max, number} {max, plural, one{tegn} other{tegn}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} må inneholde {length, number} {length, plural, one{tegn} other{tegn}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{en dag} other{# dager}} siden', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{ett minutt} other{# minutter}} siden', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{en måned} other{# måneder}} siden', @@ -98,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -106,15 +132,16 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{byte}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibyte}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibyte}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabyte}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabyte}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibyte}}' => '{nFormatted} {n, plural, =1{kibibyte} other{kibibyte}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobyte}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobyte}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibyte}}' => '{nFormatted} {n, plural, =1{mebibyte} other{mebibyte}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabyte}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabyte}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibyte}}' => '{nFormatted} {n, plural, =1{pebibyte} other{pebibyte}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabyte}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabyte}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibyte}}' => '{nFormatted} {n, plural, =1{tebibyte} other{tebibyte}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabyte}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabyte}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/nl/yii.php b/framework/messages/nl/yii.php index 24261d0520b..a647a96df31 100644 --- a/framework/messages/nl/yii.php +++ b/framework/messages/nl/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(niet ingesteld)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Er is een interne serverfout opgetreden.', 'Are you sure you want to delete this item?' => 'Weet je zeker dat je dit item wilt verwijderen?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Verwijderen', 'Error' => 'Fout', 'File upload failed.' => 'Bestand uploaden mislukt.', @@ -38,14 +43,19 @@ 'No results found.' => 'Geen resultaten gevonden', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Alleen bestanden met de volgende MIME types zijn toegestaan: {mimeTypes}', 'Only files with these extensions are allowed: {extensions}.' => 'Alleen bestanden met de volgende extensies zijn toegestaan: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Pagina niet gevonden.', 'Please fix the following errors:' => 'Corrigeer de volgende fouten:', 'Please upload a file.' => 'Upload een bestand.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Resultaat {begin, number}-{end, number} van {totalCount, number} {totalCount, plural, one{item} other{items}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Het bestand "{file}" is geen afbeelding.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Het bestand "{file}" is te groot. Het kan niet groter zijn dan {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Het bestand "{file}" is te klein. Het kan niet kleiner zijn dan {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Het formaat van {attribute} is ongeldig', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'De afbeelding "{file}" is te groot. Het mag maximaal {limit, number} {limit, plural, one{pixel} other{pixels}} hoog zijn.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'De afbeelding "{file}" is te groot. Het mag maximaal {limit, number} {limit, plural, one{pixel} other{pixels}} breed zijn.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'De afbeelding "{file}" is te klein. Het moet minimaal {limit, number} {limit, plural, one{pixel} other{pixels}} hoog zijn.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'De verificatiecode is onjuist.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Totaal {count, number} {count, plural, one{item} other{items}}.', 'Unable to verify your data submission.' => 'Het is niet mogelijk uw verstrekte gegevens te verifiëren.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Onbekende optie: --{name}', 'Update' => 'Bewerk', 'View' => 'Bekijk', 'Yes' => 'Ja', 'You are not allowed to perform this action.' => 'U bent niet gemachtigd om deze actie uit te voeren.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'U kunt maximaal {limit, number} {limit, plural, one{ander bestand} other{andere bestander}} uploaden.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'binnen {delta, plural, =1{een dag} other{# dagen}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'binnen {delta, plural, =1{een minuut} other{# minuten}}', 'in {delta, plural, =1{a month} other{# months}}' => 'binnen {delta, plural, =1{een maand} other{# maanden}}', @@ -70,31 +83,39 @@ 'the input value' => 'de invoerwaarde', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" is reeds in gebruik.', '{attribute} cannot be blank.' => '{attribute} mag niet leeg zijn.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} is ongeldig.', '{attribute} is not a valid URL.' => '{attribute} is geen geldige URL.', '{attribute} is not a valid email address.' => '{attribute} is geen geldig emailadres.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} moet "{requiredValue}" zijn.', '{attribute} must be a number.' => '{attribute} moet een getal zijn.', '{attribute} must be a string.' => '{attribute} moet een string zijn.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} moet een geheel getal zijn.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} moet "{true}" of "{false}" zijn.', - '{attribute} must be greater than "{compareValue}".' => '{attribute} moet groter zijn dan "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} moet groter dan of gelijk aan "{compareValue}" zijn.', - '{attribute} must be less than "{compareValue}".' => '{attribute} moet minder zijn dan "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} moet minder dan of gelijk aan "{compareValue}" zijn.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} moet groter zijn dan "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} moet groter dan of gelijk aan "{compareValueOrAttribute}" zijn.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} moet minder zijn dan "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} moet minder dan of gelijk aan "{compareValueOrAttribute}" zijn.', '{attribute} must be no greater than {max}.' => '{attribute} mag niet groter zijn dan {max}.', '{attribute} must be no less than {min}.' => '{attribute} mag niet kleiner zijn dan {min}.', - '{attribute} must be repeated exactly.' => '{attribute} moet exact herhaald worden.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} mag niet gelijk zijn aan "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} mag niet gelijk zijn aan "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} moet minstens {min, number} {min, plural, one{karakter} other{karakters}} bevatten.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} mag maximaal {max, number} {max, plural, one{karakter} other{karakters}} bevatten.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} moet precies {min, number} {min, plural, one{karakter} other{karakters}} bevatten.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, one{# dag} other{# dagen}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# uur} other{# uur}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, one{# minuut} other{# minuten}}', '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, one{# maand} other{# maanden}}', '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, one{# seconde} other{# seconden}}', '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, one{# jaar} other{# jaar}}', - '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# uur} other{# uur}}', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{een dag} other{# dagen}} geleden', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{een minuut} other{# minuten}} geleden', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{een maand} other{# maanden}} geleden', @@ -104,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -112,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', diff --git a/framework/messages/pl/yii.php b/framework/messages/pl/yii.php index 9bd176f5052..53d609ba0b5 100644 --- a/framework/messages/pl/yii.php +++ b/framework/messages/pl/yii.php @@ -26,6 +26,8 @@ ' and ' => ' i ', '"{attribute}" does not support operator "{operator}".' => 'Operator "{operator}" nie jest dozwolony dla "{attribute}".', '(not set)' => '(brak wartości)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Wystąpił wewnętrzny błąd serwera.', 'Are you sure you want to delete this item?' => 'Czy na pewno usunąć ten element?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Warunek dla "{attribute}" powinien mieć określoną wartość lub być operatorem o prawidłowej konstrukcji.', @@ -33,27 +35,20 @@ 'Error' => 'Błąd', 'File upload failed.' => 'Wgrywanie pliku nie powiodło się.', 'Home' => 'Strona domowa', - 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{jeden dzień} other{# dni}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minutę} few{# minuty} many{# minut} other{# minuty}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{miesiąc} few{# miesiące} many{# miesięcy} other{# miesiąca}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekundę} few{# sekundy} many{# sekund} other{# sekundy}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'za {delta, plural, =1{rok} few{# lata} many{# lat} other{# roku}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'za {delta, plural, =1{godzinę} few{# godziny} many{# godzin} other{# godziny}}', 'Invalid data received for parameter "{param}".' => 'Otrzymano nieprawidłowe dane dla parametru "{param}".', - 'just now' => 'przed chwilą', 'Login Required' => 'Wymagane zalogowanie się', 'Missing required arguments: {params}' => 'Brak wymaganych argumentów: {params}', 'Missing required parameters: {params}' => 'Brak wymaganych parametrów: {params}', - 'No results found.' => 'Brak wyników.', 'No' => 'Nie', - 'Only files with these extensions are allowed: {extensions}.' => 'Dozwolone są tylko pliki z następującymi rozszerzeniami: {extensions}.', + 'No results found.' => 'Brak wyników.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Dozwolone są tylko pliki z następującymi typami MIME: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Dozwolone są tylko pliki z następującymi rozszerzeniami: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Operator "{operator}" musi być użyty razem z atrybutem wyszukiwania.', 'Operator "{operator}" requires multiple operands.' => 'Operator "{operator}" wymaga więcej niż jednego argumentu.', + 'Options available: {options}' => '', 'Page not found.' => 'Nie odnaleziono strony.', 'Please fix the following errors:' => 'Proszę poprawić następujące błędy:', 'Please upload a file.' => 'Proszę wgrać plik.', - 'Powered by {yii}' => 'Powered by {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Wyświetlone {begin, number}-{end, number} z {totalCount, number} {totalCount, plural, one{rekordu} other{rekordów}}.', 'The combination {values} of {attributes} has already been taken.' => 'Zestawienie {values} dla {attributes} jest już w użyciu.', 'The file "{file}" is not an image.' => 'Plik "{file}" nie jest obrazem.', @@ -65,7 +60,6 @@ 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obraz "{file}" jest zbyt duży. Szerokość nie może być większa niż {limit, number} {limit, plural, one{piksela} few{pikseli} many{pikseli} other{piksela}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obraz "{file}" jest za mały. Wysokość nie może być mniejsza niż {limit, number} {limit, plural, one{piksela} few{pikseli} many{pikseli} other{piksela}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Obraz "{file}" jest za mały. Szerokość nie może być mniejsza niż {limit, number} {limit, plural, one{piksela} few{pikseli} many{pikseli} other{piksela}}.', - 'the input value' => 'wartość wejściowa', 'The requested view "{name}" was not found.' => 'Żądany widok "{name}" nie został odnaleziony.', 'The verification code is incorrect.' => 'Kod weryfikacyjny jest nieprawidłowy.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Razem {count, number} {count, plural, one{rekord} few{rekordy} many{rekordów} other{rekordu}}.', @@ -76,23 +70,30 @@ 'Update' => 'Aktualizuj', 'View' => 'Zobacz szczegóły', 'Yes' => 'Tak', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Brak upoważnienia do wykonania tej czynności.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Możliwe wgranie najwyżej {limit, number} {limit, plural, one{pliku} few{plików} many{plików} other{pliku}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Należy wgrać przynajmniej {limit, number} {limit, plural, one{plik} few{pliki} many{plików} other{pliku}}.', + 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{jeden dzień} other{# dni}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minutę} few{# minuty} many{# minut} other{# minuty}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{miesiąc} few{# miesiące} many{# miesięcy} other{# miesiąca}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekundę} few{# sekundy} many{# sekund} other{# sekundy}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'za {delta, plural, =1{rok} few{# lata} many{# lat} other{# roku}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'za {delta, plural, =1{godzinę} few{# godziny} many{# godzin} other{# godziny}}', + 'just now' => 'przed chwilą', + 'the input value' => 'wartość wejściowa', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" jest już w użyciu.', '{attribute} cannot be blank.' => '{attribute} nie może pozostać bez wartości.', '{attribute} contains wrong subnet mask.' => '{attribute} posiada złą maskę podsieci.', '{attribute} is invalid.' => '{attribute} zawiera nieprawidłową wartość.', - '{attribute} is not a valid email address.' => '{attribute} nie zawiera prawidłowego adresu email.', '{attribute} is not a valid URL.' => '{attribute} nie zawiera prawidłowego adresu URL.', + '{attribute} is not a valid email address.' => '{attribute} nie zawiera prawidłowego adresu email.', '{attribute} is not in the allowed range.' => '{attribute} nie jest w dozwolonym zakresie.', '{attribute} must be "{requiredValue}".' => '{attribute} musi mieć wartość "{requiredValue}".', '{attribute} must be a number.' => '{attribute} musi być liczbą.', '{attribute} must be a string.' => '{attribute} musi być tekstem.', '{attribute} must be a valid IP address.' => '{attribute} musi być poprawnym adresem IP.', - '{attribute} must be an integer.' => '{attribute} musi być liczbą całkowitą.', '{attribute} must be an IP address with specified subnet.' => '{attribute} musi być adresem IP w określonej podsieci.', + '{attribute} must be an integer.' => '{attribute} musi być liczbą całkowitą.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} musi mieć wartość "{true}" lub "{false}".', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} musi mieć tę samą wartość co "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} musi mieć wartość większą od "{compareValueOrAttribute}".', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} musi zawierać co najmniej {min, number} {min, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} musi zawierać nie więcej niż {max, number} {max, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} musi zawierać dokładnie {length, number} {length, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dzień} few{# dni} many{# dni} other{# dnia}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 godzina} few{# godziny} many{# godzin} other{# godziny}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuta} few{# minuty} many{# minut} other{# minuty}}', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{bajt} few{bajty} many{bajtów} other{bajta}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibajt} few{gibibajty} many{gibibajtów} other{gibibajta}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabajt} few{gigabajty} many{gigabajtów} other{gigabajta}}', diff --git a/framework/messages/pt-BR/yii.php b/framework/messages/pt-BR/yii.php index c626562c9c8..c71b5b4ac27 100644 --- a/framework/messages/pt-BR/yii.php +++ b/framework/messages/pt-BR/yii.php @@ -23,17 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '"{attribute}" does not support operator "{operator}".' => '"{attribute}" não suporta o operador "{operator}".', - 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'A condição para "{attribute}" deve ser um valor ou a especificação de um operador válido.', - 'Operator "{operator}" must be used with a search attribute.' => 'O operador "{operator}" deve ser usado com um atributo de busca.', - 'Operator "{operator}" requires multiple operands.' => 'O operador "{operator}" requer múltiplos operandos.', - 'The format of {filter} is invalid.' => 'O formato de {filter} é inválido.', - 'Unknown filter attribute "{attribute}"' => 'Atributo de filtro desconhecido "{attribute}"', - 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Você deve enviar ao menos {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', ' and ' => ' e ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" não suporta o operador "{operator}".', '(not set)' => '(não definido)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', 'Are you sure you want to delete this item?' => 'Deseja realmente excluir este item?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'A condição para "{attribute}" deve ser um valor ou a especificação de um operador válido.', 'Delete' => 'Excluir', 'Error' => 'Erro', 'File upload failed.' => 'O upload do arquivo falhou.', @@ -46,16 +43,19 @@ 'No results found.' => 'Nenhum resultado foi encontrado.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'São permitidos somente arquivos com os seguintes tipos MIME: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'São permitidos somente arquivos com as seguintes extensões: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'O operador "{operator}" deve ser usado com um atributo de busca.', + 'Operator "{operator}" requires multiple operands.' => 'O operador "{operator}" requer múltiplos operandos.', + 'Options available: {options}' => '', 'Page not found.' => 'Página não encontrada.', 'Please fix the following errors:' => 'Por favor, corrija os seguintes erros:', 'Please upload a file.' => 'Por favor, faça upload de um arquivo.', - 'Powered by {yii}' => 'Desenvolvido com {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Exibindo {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{item} other{itens}}.', 'The combination {values} of {attributes} has already been taken.' => 'A combinação {values} de {attributes} já foi utilizado.', 'The file "{file}" is not an image.' => 'O arquivo "{file}" não é uma imagem.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'O arquivo "{file}" é grande demais. Seu tamanho não pode exceder {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'O arquivo "{file}" é pequeno demais. Seu tamanho não pode ser menor que {formattedLimit}.', 'The format of {attribute} is invalid.' => 'O formato de "{attribute}" é inválido.', + 'The format of {filter} is invalid.' => 'O formato de {filter} é inválido.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A altura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A largura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é pequeno demais. A altura não pode ser menor que {limit, number} {limit, plural, one{pixel} other{pixels}}.', @@ -65,13 +65,14 @@ 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', 'Unable to verify your data submission.' => 'Não foi possível verificar o seu envio de dados.', 'Unknown alias: -{name}' => 'Alias desconhecido: -{name}', + 'Unknown filter attribute "{attribute}"' => 'Atributo de filtro desconhecido "{attribute}"', 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', 'Update' => 'Alterar', 'View' => 'Exibir', 'Yes' => 'Sim', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Você não está autorizado a realizar essa ação.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Você pode fazer o upload de, no máximo, {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Você deve enviar ao menos {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', 'in {delta, plural, =1{a day} other{# days}}' => 'em {delta, plural, =1{1 dia} other{# dias}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'em {delta, plural, =1{1 minuto} other{# minutos}}', 'in {delta, plural, =1{a month} other{# months}}' => 'em {delta, plural, =1{1 mês} other{# meses}}', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '"{attribute}" deve conter pelo menos {min, number} {min, plural, one{caractere} other{caracteres}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '"{attribute}" deve conter no máximo {max, number} {max, plural, one{caractere} other{caracteres}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '"{attribute}" deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dia} other{# dias}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hora} other{# horas}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minutos}}', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', diff --git a/framework/messages/pt/yii.php b/framework/messages/pt/yii.php index 4c83fc423c9..9cc4999d438 100644 --- a/framework/messages/pt/yii.php +++ b/framework/messages/pt/yii.php @@ -25,19 +25,53 @@ return [ ' and ' => ' e ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" não suporta o operador "{operator}".', + '(not set)' => '(não definido)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', + 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', 'Are you sure you want to delete this item?' => 'Tens a certeza que queres apagar este item?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'A condição para "{attribute}" tem de ser ou um valor ou uma especificação válida do operador.', + 'Delete' => 'Apagar', + 'Error' => 'Erro', + 'File upload failed.' => 'O upload do ficheiro falhou.', + 'Home' => 'Página Inicial', + 'Invalid data received for parameter "{param}".' => 'Dados inválidos recebidos para o parâmetro “{param}”.', + 'Login Required' => 'Login Necessário.', + 'Missing required arguments: {params}' => 'Argumentos obrigatórios em falta: {params}', + 'Missing required parameters: {params}' => 'Parâmetros obrigatórios em falta: {params}', + 'No' => 'Não', + 'No results found.' => 'Não foram encontrados resultados.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Apenas ficheiros com este tipo de MIME são permitidos: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Só são permitidos ficheiros com as seguintes extensões: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'O operador "{operator}" tem de ser usado com um atributo de pesquisa.', 'Operator "{operator}" requires multiple operands.' => 'O operador "{operator}" requer vários operandos.', - 'Powered by {yii}' => 'Distribuído por {yii}', + 'Options available: {options}' => '', + 'Page not found.' => 'Página não encontrada.', + 'Please fix the following errors:' => 'Por favor, corrija os seguintes erros:', + 'Please upload a file.' => 'Por favor faça upload de um ficheiro.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'A exibir {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{item} other{itens}}.', 'The combination {values} of {attributes} has already been taken.' => 'A combinação {values} de {attributes} já está a ser utilizada.', + 'The file "{file}" is not an image.' => 'O ficheiro “{file}” não é uma imagem.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'O ficheiro “{file}” é grande demais. O tamanho não pode exceder {formattedLimit}.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'O ficheiro “{file}” é pequeno demais. O tamanho não pode ser menor do que {formattedLimit}.', + 'The format of {attribute} is invalid.' => 'O formato de “{attribute}” é inválido.', 'The format of {filter} is invalid.' => 'O formato de {filter} é inválido.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é grande demais. A altura não pode ser maior do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é grande demais. A largura não pode ser maior do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é pequeno demais. A altura não pode ser menor do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é pequeno demais. A largura não pode ser menor do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', 'The requested view "{name}" was not found.' => 'A visualização solicitada "{name}" não foi encontrada.', + 'The verification code is incorrect.' => 'O código de verificação está incorreto.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', + 'Unable to verify your data submission.' => 'Não foi possível verificar a sua submissão de dados.', 'Unknown alias: -{name}' => 'Alias desconhecido: -{name}', 'Unknown filter attribute "{attribute}"' => 'Atributo de filtro desconhecido "{attribute}"', + 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', + 'Update' => 'Atualizar', 'View' => 'Ver', - 'Yii Framework' => 'Yii Framework', + 'Yes' => 'Sim', + 'You are not allowed to perform this action.' => 'Você não está autorizado a realizar essa ação.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Você pode fazer o upload de no máximo {limit, number} {limit, plural, one{ficheiro} other{ficheiros}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'A transferência deve ser pelo menos {limit, number} {limit, plural, one{ficheiro} other{ficheiros}}. ', 'in {delta, plural, =1{a day} other{# days}}' => 'em {delta, plural, =1{um dia} other{# dias}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'em {delta, plural, =1{um minuto} other{# minutos}}', @@ -46,19 +80,36 @@ 'in {delta, plural, =1{a year} other{# years}}' => 'em {delta, plural, =1{um ano} other{# anos}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'em {delta, plural, =1{uma hora} other{# horas}}', 'just now' => 'agora mesmo', + 'the input value' => 'o valor de entrada', + '{attribute} "{value}" has already been taken.' => '{attribute} “{value}” já foi atribuido.', + '{attribute} cannot be blank.' => '“{attribute}” não pode ficar em branco.', '{attribute} contains wrong subnet mask.' => '{attribute} contém uma máscara de sub-rede errada.', + '{attribute} is invalid.' => '“{attribute}” é inválido.', + '{attribute} is not a valid URL.' => '“{attribute}” não é uma URL válida.', + '{attribute} is not a valid email address.' => '“{attribute}” não é um endereço de e-mail válido.', '{attribute} is not in the allowed range.' => '{attribute} não está no alcance permitido.', + '{attribute} must be "{requiredValue}".' => '“{attribute}” deve ser “{requiredValue}”.', + '{attribute} must be a number.' => '“{attribute}” deve ser um número.', + '{attribute} must be a string.' => '“{attribute}” deve ser uma string.', '{attribute} must be a valid IP address.' => '{attribute} tem de ser um endereço IP válido.', '{attribute} must be an IP address with specified subnet.' => '{attribute} tem de ser um endereço IP com a sub-rede especificada.', + '{attribute} must be an integer.' => '“{attribute}” deve ser um número inteiro.', + '{attribute} must be either "{true}" or "{false}".' => '“{attribute}” deve ser “{true}” ou “{false}”.', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser igual a "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} tem de ser maior que "{compareValueOrAttribute}".', '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser maior ou igual a "{compareValueOrAttribute}".', '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} tem de ser menor que "{compareValueOrAttribute}".', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser menor ou igual a "{compareValueOrAttribute}".', + '{attribute} must be no greater than {max}.' => '“{attribute}” não pode ser maior do que {max}.', + '{attribute} must be no less than {min}.' => '“{attribute}” não pode ser menor do que {min}.', '{attribute} must not be a subnet.' => '{attribute} não pode ser uma sub-rede.', '{attribute} must not be an IPv4 address.' => '{attribute} não pode ser um endereço IPv4.', '{attribute} must not be an IPv6 address.' => '{attribute} não pode ser um endereço IPv6.', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} não pode ser igual a "{compareValueOrAttribute}".', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '“{attribute}” deve conter pelo menos {min, number} {min, plural, one{caractere} other{caracteres}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '“{attribute}” deve conter no máximo {max, number} {max, plural, one{caractere} other{caracteres}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '“{attribute}” deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dia} other{# dias}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hora} other{# horas}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minutos}}', @@ -74,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -82,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', @@ -93,53 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', - '(not set)' => '(não definido)', - 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', - 'Delete' => 'Apagar', - 'Error' => 'Erro', - 'File upload failed.' => 'O upload do ficheiro falhou.', - 'Home' => 'Página Inicial', - 'Invalid data received for parameter "{param}".' => 'Dados inválidos recebidos para o parâmetro “{param}”.', - 'Login Required' => 'Login Necessário.', - 'Missing required arguments: {params}' => 'Argumentos obrigatórios em falta: {params}', - 'Missing required parameters: {params}' => 'Parâmetros obrigatórios em falta: {params}', - 'No' => 'Não', - 'No results found.' => 'Não foram encontrados resultados.', - 'Only files with these extensions are allowed: {extensions}.' => 'Só são permitidos ficheiros com as seguintes extensões: {extensions}.', - 'Page not found.' => 'Página não encontrada.', - 'Please fix the following errors:' => 'Por favor, corrija os seguintes erros:', - 'Please upload a file.' => 'Por favor faça upload de um ficheiro.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'A exibir {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{item} other{itens}}.', - 'The file "{file}" is not an image.' => 'O ficheiro “{file}” não é uma imagem.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'O ficheiro “{file}” é grande demais. O tamanho não pode exceder {formattedLimit}.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'O ficheiro “{file}” é pequeno demais. O tamanho não pode ser menor do que {formattedLimit}.', - 'The format of {attribute} is invalid.' => 'O formato de “{attribute}” é inválido.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é grande demais. A altura não pode ser maior do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é grande demais. A largura não pode ser maior do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é pequeno demais. A altura não pode ser menor do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O ficheiro “{file}” é pequeno demais. A largura não pode ser menor do que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The verification code is incorrect.' => 'O código de verificação está incorreto.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', - 'Unable to verify your data submission.' => 'Não foi possível verificar a sua submissão de dados.', - 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', - 'Update' => 'Atualizar', - 'Yes' => 'Sim', - 'You are not allowed to perform this action.' => 'Você não está autorizado a realizar essa ação.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Você pode fazer o upload de no máximo {limit, number} {limit, plural, one{ficheiro} other{ficheiros}}.', - 'the input value' => 'o valor de entrada', - '{attribute} "{value}" has already been taken.' => '{attribute} “{value}” já foi atribuido.', - '{attribute} cannot be blank.' => '“{attribute}” não pode ficar em branco.', - '{attribute} is invalid.' => '“{attribute}” é inválido.', - '{attribute} is not a valid URL.' => '“{attribute}” não é uma URL válida.', - '{attribute} is not a valid email address.' => '“{attribute}” não é um endereço de e-mail válido.', - '{attribute} must be "{requiredValue}".' => '“{attribute}” deve ser “{requiredValue}”.', - '{attribute} must be a number.' => '“{attribute}” deve ser um número.', - '{attribute} must be a string.' => '“{attribute}” deve ser uma string.', - '{attribute} must be an integer.' => '“{attribute}” deve ser um número inteiro.', - '{attribute} must be either "{true}" or "{false}".' => '“{attribute}” deve ser “{true}” ou “{false}”.', - '{attribute} must be no greater than {max}.' => '“{attribute}” não pode ser maior do que {max}.', - '{attribute} must be no less than {min}.' => '“{attribute}” não pode ser menor do que {min}.', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '“{attribute}” deve conter pelo menos {min, number} {min, plural, one{caractere} other{caracteres}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '“{attribute}” deve conter no máximo {max, number} {max, plural, one{caractere} other{caracteres}}.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '“{attribute}” deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', ]; diff --git a/framework/messages/ro/yii.php b/framework/messages/ro/yii.php index 6042d0bd695..7d62653f784 100644 --- a/framework/messages/ro/yii.php +++ b/framework/messages/ro/yii.php @@ -23,8 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(nu este setat)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'A aparut o eroare internă de server.', + 'Are you sure you want to delete this item?' => '', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Șterge', 'Error' => 'Eroare', 'File upload failed.' => 'Încărcarea fișierului a eșuat.', @@ -34,52 +40,108 @@ 'Missing required arguments: {params}' => 'Lipsesc argumente obligatorii: {params}', 'Missing required parameters: {params}' => 'Lipsesc parametrii obligatori: {params}', 'No' => 'Nu', - 'No help for unknown command "{command}".' => 'Nu sunt referințe pentru comanda necunoscută "{command}".', - 'No help for unknown sub-command "{command}".' => 'Nu sunt referințe pentru sub-comanda necunoscută "{command}".', 'No results found.' => 'Nu a fost găsit niciun rezultat.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => '', 'Only files with these extensions are allowed: {extensions}.' => 'Se acceptă numai fișiere cu următoarele extensii: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Pagina nu a fost găsită.', 'Please fix the following errors:' => 'Vă rugăm sa corectați următoarele erori:', 'Please upload a file.' => 'Vă rugăm sa încărcați un fișier.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Sunt afișați itemii {begin, number}-{end, number} din {totalCount, number}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Fișierul «{file}» nu este o imagine.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Fișierul «{file}» este prea mare. Dimensiunea acestuia nu trebuie să fie mai mare de {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Fișierul «{file}» este prea mic. Dimensiunea acestuia nu trebuie sa fie mai mică de {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Formatul «{attribute}» nu este valid.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Imaginea «{file}» este prea mare. Înălțimea nu trebuie să fie mai mare de {limit, number} {limit, plural, one{pixel} other{pixeli}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Imaginea «{file}» este prea mare. Lățimea nu trebuie să fie mai mare de {limit, number} {limit, plural, one{pixel} other{pixeli}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Imaginea «{file}» este prea mică. Înălțimea nu trebuie să fie mai mică de {limit, number} {limit, plural, one{pixel} other{pixeli}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Imaginea «{file}» este prea mică. Lățimea nu trebuie sa fie mai mică de {limit, number} {limit, plural, one{pixel} other{pixeli}}.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'Codul de verificare este incorect.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itemi}}.', 'Unable to verify your data submission.' => 'Datele trimise nu au putut fi verificate.', - 'Unknown command "{command}".' => 'Comandă necunoscută "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Opțiune necunoscută : --{name}', 'Update' => 'Redactare', 'View' => 'Vizualizare', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Nu aveți dreptul să efectuați această acțiunea.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Puteți încărca maxim {limit, number} {limit, plural, one{fișier} other{fișiere}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '', + 'in {delta, plural, =1{a month} other{# months}}' => '', + 'in {delta, plural, =1{a second} other{# seconds}}' => '', + 'in {delta, plural, =1{a year} other{# years}}' => '', + 'in {delta, plural, =1{an hour} other{# hours}}' => '', + 'just now' => '', 'the input value' => 'valoarea introdusă', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» este deja ocupat.', '{attribute} cannot be blank.' => '«{attribute}» nu poate fi gol.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '«{attribute}» este incorect.', '{attribute} is not a valid URL.' => '«{attribute}» nu este un URL valid.', '{attribute} is not a valid email address.' => '«{attribute}» nu este o adresă de email validă.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '«{attribute}» trebuie să fie «{requiredValue}».', '{attribute} must be a number.' => '«{attribute}» trebuie să fie un număr.', '{attribute} must be a string.' => '«{attribute}» trebuie să fie un șir de caractere.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '«{attribute}» trebuie să fie un număr întreg.', '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» trebuie să fie «{true}» sau «{false}».', - '{attribute} must be greater than "{compareValue}".' => '«{attribute}» trebuie să fie mai mare ca «{compareValue}».', - '{attribute} must be greater than or equal to "{compareValue}".' => '«{attribute}» trebuie să fie mai mare sau egal cu «{compareValue}».', - '{attribute} must be less than "{compareValue}".' => '«{attribute}» trebuie să fie mai mic ca «{compareValue}».', - '{attribute} must be less than or equal to "{compareValue}".' => '«{attribute}» trebuie să fie mai mic sau egal cu «{compareValue}».', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '«{attribute}» trebuie să fie mai mare ca «{compareValueOrAttribute}».', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '«{attribute}» trebuie să fie mai mare sau egal cu «{compareValueOrAttribute}».', + '{attribute} must be less than "{compareValueOrAttribute}".' => '«{attribute}» trebuie să fie mai mic ca «{compareValueOrAttribute}».', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '«{attribute}» trebuie să fie mai mic sau egal cu «{compareValueOrAttribute}».', '{attribute} must be no greater than {max}.' => '«{attribute}» nu trebuie să fie mai mare ca {max}.', '{attribute} must be no less than {min}.' => '«{attribute}» nu trebuie să fie mai mic ca {min}.', - '{attribute} must be repeated exactly.' => '«{attribute}» trebuie să fie repetat exact.', - '{attribute} must not be equal to "{compareValue}".' => '«{attribute}» nu trebuie să fie egală cu «{compareValue}».', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» nu trebuie să fie egală cu «{compareValueOrAttribute}».', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» trebuie să conțină minim {min, number} {min, plural, one{caracter} other{caractere}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» trebuie să conțină maxim {max, number} {max, plural, one{caracter} other{caractere}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» trebuie să conțină {length, number} {length, plural, one{caracter} other{caractere}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '', + '{delta, plural, =1{a month} other{# months}} ago' => '', + '{delta, plural, =1{a second} other{# seconds}} ago' => '', + '{delta, plural, =1{a year} other{# years}} ago' => '', + '{delta, plural, =1{an hour} other{# hours}} ago' => '', + '{nFormatted} B' => '', + '{nFormatted} GB' => '', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/ru/yii.php b/framework/messages/ru/yii.php index 31b27234323..44bced6a49d 100644 --- a/framework/messages/ru/yii.php +++ b/framework/messages/ru/yii.php @@ -26,6 +26,8 @@ ' and ' => ' и ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" не поддерживает оператор "{operator}".', '(not set)' => '(не задано)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Возникла внутренняя ошибка сервера.', 'Are you sure you want to delete this item?' => 'Вы уверены, что хотите удалить этот элемент?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Условие для "{attribute}" должно быть или значением или верной спецификацией оператора.', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Разрешена загрузка файлов только со следующими расширениями: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Оператор "{operator}" должен использоваться через атрибут поиска.', 'Operator "{operator}" requires multiple operands.' => 'Оператор "{operator}" требует несколько операндов.', + 'Options available: {options}' => '', 'Page not found.' => 'Страница не найдена.', 'Please fix the following errors:' => 'Исправьте следующие ошибки:', 'Please upload a file.' => 'Загрузите файл.', - 'Powered by {yii}' => 'Работает на {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Показаны записи {begin, number}-{end, number} из {totalCount, number}.', 'The combination {values} of {attributes} has already been taken.' => 'Комбинация {values} параметров {attributes} уже существует.', 'The file "{file}" is not an image.' => 'Файл «{file}» не является изображением.', @@ -68,9 +70,9 @@ 'Update' => 'Редактировать', 'View' => 'Просмотр', 'Yes' => 'Да', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Вам не разрешено производить данное действие.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Вы не можете загружать более {limit, number} {limit, plural, one{файла} few{файлов} many{файлов} other{файла}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Вы должны загрузить как минимум {limit, number} {limit, plural, one{файл} few{файла} many{файлов} other{файла}}.', 'in {delta, plural, =1{a day} other{# days}}' => 'через {delta, plural, =1{день} one{# день} few{# дня} many{# дней} other{# дня}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'через {delta, plural, =1{минуту} one{# минуту} few{# минуты} many{# минут} other{# минуты}}', 'in {delta, plural, =1{a month} other{# months}}' => 'через {delta, plural, =1{месяц} one{# месяц} few{# месяца} many{# месяцев} other{# месяца}}', @@ -107,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Значение «{attribute}» должно содержать минимум {min, number} {min, plural, one{символ} few{символа} many{символов} other{символа}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Значение «{attribute}» должно содержать максимум {max, number} {max, plural, one{символ} few{символа} many{символов} other{символа}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Значение «{attribute}» должно содержать {length, number} {length, plural, one{символ} few{символа} many{символов} other{символа}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, one{# день} few{# дня} many{# дней} other{# дня}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# час} few{# часа} many{# часов} other{# часа}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, one{# минута} few{# минуты} many{# минут} other{# минуты}}', @@ -122,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} Б', '{nFormatted} GB' => '{nFormatted} ГБ', '{nFormatted} GiB' => '{nFormatted} ГиБ', - '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} KiB' => '{nFormatted} КиБ', '{nFormatted} MB' => '{nFormatted} МБ', '{nFormatted} MiB' => '{nFormatted} МиБ', @@ -130,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} ПиБ', '{nFormatted} TB' => '{nFormatted} ТБ', '{nFormatted} TiB' => '{nFormatted} ТиБ', + '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байта} many{байтов} other{байта}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайта} many{гибибайтов} other{гибибайта}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайта} many{гигабайтов} other{гигабайта}}', @@ -141,5 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабайт} few{петабайта} many{петабайтов} other{петабайта}}', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{тебибайт} few{тебибайта} many{тебибайтов} other{тебибайта}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабайт} few{терабайта} many{терабайтов} other{терабайта}}', - 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Вы должны загрузить как минимум {limit, number} {limit, plural, one{файл} few{файла} many{файлов} other{файла}}.', ]; diff --git a/framework/messages/sk/yii.php b/framework/messages/sk/yii.php index 28aaaa78de1..50ff8e981b2 100644 --- a/framework/messages/sk/yii.php +++ b/framework/messages/sk/yii.php @@ -26,6 +26,8 @@ ' and ' => ' a ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" nepodporuje operátor "{operator}".', '(not set)' => '(nie je nastavené)', + 'Action not found.' => 'Akcia nebola nájdená.', + 'Aliases available: {aliases}' => 'Dostupné aliasy: {aliases}', 'An internal server error occurred.' => 'Vyskytla sa interná chyba servera.', 'Are you sure you want to delete this item?' => 'Skutočne chcete odstrániť tento záznam?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Podmienkou pre "{attribute}" by mala byť hodnota alebo platná špecifikácia operátora.', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => 'Povolené sú len súbory s nasledovnými príponami: {extensions}.', 'Operator "{operator}" must be used with a search attribute.' => 'Operátor "{operator}" musí byť použitý s atribútom vyhľadávania.', 'Operator "{operator}" requires multiple operands.' => 'Operátor "{operator}" vyžaduje viac operandov.', + 'Options available: {options}' => 'Dostupné možnosti: {options}', 'Page not found.' => 'Stránka nebola nájdená.', 'Please fix the following errors:' => 'Opravte prosím nasledujúce chyby:', 'Please upload a file.' => 'Nahrajte prosím súbor.', - 'Powered by {yii}' => 'Beží na {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Zobrazujem {begin, number}-{end, number} z {totalCount, number} záznamov.', 'The combination {values} of {attributes} has already been taken.' => 'Kombinácia {values} pre {attributes} je už použitá.', 'The file "{file}" is not an image.' => 'Súbor "{file}" nie je obrázok.', @@ -68,7 +70,6 @@ 'Update' => 'Upraviť', 'View' => 'Náhľad', 'Yes' => 'Áno', - 'Yii Framework' => 'Yii Framework', 'You are not allowed to perform this action.' => 'Nemáte oprávnenie pre požadovanú akciu.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Nahrať môžete najviac {limit, number} {limit, plural, =1{súbor} =2{súbory} =3{súbory} =4{súbory} other{súborov}}.', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Je potrebné nahrať aspoň {limit, number} {limit, plural, =1{súbor} =2{súbory} =3{súbory} =4{súbory} other{súborov}}.', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} musí obsahovať aspoň {min, number} {min, plural, =1{znak} =2{znaky} =3{znaky} =4{znaky} other{znakov}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} môže obsahovať najviac {max, number} {max, plural, =1{znak} =2{znaky} =3{znaky} =4{znaky} other{znakov}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} musí obsahovať {length, number} {length, plural, =1{znak} =2{znaky} =3{znaky} =4{znaky} other{znakov}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 deň} =2{2 dni} =3{3 dni} =4{4 dni} other{# dní}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hodina} =2{2 hodiny} =3{3 hodiny} =4{4 hodiny} other{# hodín}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minúta} =2{2 minúty} =3{3 minúty} =4{4 minúty} other{# minút}}', @@ -142,7 +144,4 @@ '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabajt} =2{petabajty} =3{petabajty} =4{petabajty} other{petabajtov}}', '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebibajt} =2{tebibajty} =3{tebibajty} =4{tebibajty} other{tebibajtov}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabajt} =2{terabajty} =3{terabajty} =4{terabajty} other{terabajtov}}', - 'Action not found.' => 'Akcia nebola nájdená.', - 'Aliases available: {aliases}' => 'Dostupné aliasy: {aliases}', - 'Options available: {options}' => 'Dostupné možnosti: {options}', ]; diff --git a/framework/messages/sl/yii.php b/framework/messages/sl/yii.php index 7fa542489bb..5b15a08321c 100644 --- a/framework/messages/sl/yii.php +++ b/framework/messages/sl/yii.php @@ -23,10 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'just now' => 'ravno zdaj', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(ni nastavljeno)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Prišlo je do notranje napake na strežniku.', 'Are you sure you want to delete this item?' => 'Ste prepričani, da želite izbrisati ta element?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Izbrišite', 'Error' => 'Napaka', 'File upload failed.' => 'Nalaganje datoteke ni bilo uspešno.', @@ -36,19 +40,22 @@ 'Missing required arguments: {params}' => 'Manjkajo zahtevani argumenti: {params}', 'Missing required parameters: {params}' => 'Manjkajo zahtevani parametri: {params}', 'No' => 'Ne', - 'No help for unknown command "{command}".' => 'Pomoči za neznani ukaz "{command}" ni mogoče najti.', - 'No help for unknown sub-command "{command}".' => 'Pomoči za neznani pod-ukaz "{command}" ni mogoče najti.', 'No results found.' => 'Rezultatov ni bilo mogoče najti.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Dovoljene so samo datoteke s temi MIME tipi: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Dovoljene so samo datoteke s temi končnicami: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Strani ni mogoče najti.', 'Please fix the following errors:' => 'Prosimo, popravite sledeče napake:', 'Please upload a file.' => 'Prosimo, naložite datoteko.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Prikaz {begin, number}-{end, number} od {totalCount, number} {totalCount, plural, one{Element} two{Elementa} few{Elementi} other{Elementov}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Datoteka "{file}" ni slika.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Datoteka "{file}" je prevelika. Njena velikost {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Datoteka "{file}" je premajhna. Njena velikost ne sme biti manjša od {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format {attribute} ni veljaven.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Višina ne sme biti večja od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina ne sme biti večja od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premajhna. Višina ne sme biti manjša od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', @@ -57,41 +64,58 @@ 'The verification code is incorrect.' => 'Koda za preverjanje je napačna.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Skupaj {count, number} {count, plural, one{element} two{elementa} few{elementi} other{elementov}}.', 'Unable to verify your data submission.' => 'Preverjanje vaših poslanih podatkov ni uspelo.', - 'Unknown command "{command}".' => 'Neznani ukaz "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Neznana opcija: --{name}', 'Update' => 'Posodobitev', 'View' => 'Pogled', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Ta akcija ni dovoljena za izvajanje.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Naložite lahko največ {limit, number} {limit, plural, one{datoteko} two{datoteki} few{datoteke} other{datotek}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'v {delta, plural, one{# dnevu} other{# dneh}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'v {delta, plural, one{# minuti} other{# minutah}}', 'in {delta, plural, =1{a month} other{# months}}' => 'v {delta, plural, one{# mesecu} other{# mesecih}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'v {delta, plural, one{# sekundi} other{# sekundah}}', 'in {delta, plural, =1{a year} other{# years}}' => 'v {delta, plural, one{# letu} other{# letih}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'v {delta, plural, one{# uri} other{# urah}}', + 'just now' => 'ravno zdaj', 'the input value' => 'vhodna vrednost', '{attribute} "{value}" has already been taken.' => 'Atribut {attribute} "{value}" je že nastavljen.', '{attribute} cannot be blank.' => 'Atribut {attribute} ne more biti prazen', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => 'Atribut {attribute} je neveljaven.', '{attribute} is not a valid URL.' => 'Atribut {attribute} ni veljaven URL.', '{attribute} is not a valid email address.' => 'Atribut {attribute} ni veljaven e-poštni naslov.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} mora biti "{requiredValue}".', '{attribute} must be a number.' => '{attribute} mora biti število.', '{attribute} must be a string.' => '{attribute} mora biti niz.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} mora biti celo število.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} mora biti ali "{true}" ali "{false}".', - '{attribute} must be greater than "{compareValue}".' => 'Atribut {attribute} mora biti večji od "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => 'Atribut {attribute} mora biti večji ali enak "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => 'Atribut {attribute} mora biti manjši od "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => 'Atribut {attribute} mora biti manjši ali enak "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => 'Atribut {attribute} mora biti večji od "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => 'Atribut {attribute} mora biti večji ali enak "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => 'Atribut {attribute} mora biti manjši od "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => 'Atribut {attribute} mora biti manjši ali enak "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => 'Atribut {attribute} ne sme biti večji od {max}', '{attribute} must be no less than {min}.' => 'Atribut {attribute} ne sme biti manjši od {min}.', - '{attribute} must be repeated exactly.' => 'Atribut {attribute} mora biti točno ponovljen.', - '{attribute} must not be equal to "{compareValue}".' => 'Atribut {attribute} ne sme biti enak "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => 'Atribut {attribute} ne sme biti enak "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati vsaj {min, number} {min, plural, one{znak} two{znaka} few{znake} other{znakov}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati največ {max, number} {max, plural, one{znak} two{znaka} few{znake} other{znakov}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati {length, number} {length, plural, one{znak} two{znaka} few{znake} other{znakov}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => 'pred {delta, plural, one{# dnevom} two{# dnevoma} other{# dnevi}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'pred {delta, plural, one{# minuto} two{# minutama} other{# minutami}}', '{delta, plural, =1{a month} other{# months}} ago' => 'pred {delta, plural, one{# mesecem} two{# mesecema} other{# meseci}}', @@ -101,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -109,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{bajt} two{bajta} few{bajti} other{bajtov}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{gibibajt} two{gibibajta} few{gibibajti} other{gibibajtov}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{gigabajt} two{gigabajta} few{gigabajti} other{gigabajtov}}', diff --git a/framework/messages/sr-Latn/yii.php b/framework/messages/sr-Latn/yii.php index e4467b9a679..768dbd8eacd 100644 --- a/framework/messages/sr-Latn/yii.php +++ b/framework/messages/sr-Latn/yii.php @@ -23,36 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'just now' => 'upravo sada', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Samo sledeći MIME tipovi su dozvoljeni: {mimeTypes}.', - 'The requested view "{name}" was not found.' => 'Traženi prikaz "{name}" nije pronađen.', - 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{mesec} one{# mesec} few{# meseca} many{# meseci} other{# meseci}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekundu} one{# sekundu} few{# sekunde} many{# sekundi} other{# sekundi}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'za {delta, plural, =1{godinu} one{# godinu} few{# godine} many{# godina} other{# godina}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'za {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', - '{delta, plural, =1{a day} other{# days}} ago' => 'pre {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', - '{delta, plural, =1{a minute} other{# minutes}} ago' => 'pre {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', - '{delta, plural, =1{a month} other{# months}} ago' => 'pre {delta, plural, =1{mesec} one{# meseca} few{# meseca} many{# meseci} other{# meseci}}', - '{delta, plural, =1{a second} other{# seconds}} ago' => 'pre {delta, plural, =1{sekundu} one{# sekunde} few{# sekunde} many{# sekundi} other{# sekundi}}', - '{delta, plural, =1{a year} other{# years}} ago' => 'pre {delta, plural, =1{godinu} one{# godine} few{# godine} many{# godina} other{# godina}}', - '{delta, plural, =1{an hour} other{# hours}} ago' => 'pre {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, one{# bajt} few{# bajta} many{# bajtova} other{# bajta}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# gigabajt} few{# gigabajta} many{# gigabajta} other{# gigabajta}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# kilobajt} few{# kilobajta} many{# kilobajta} other{# kilobajta}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# megabajt} few{# megabajta} many{# megabajta} other{# megabajta}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# petabajt} few{# petabajta} many{# petabajta} other{# petabajta}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, one{# terabajt} few{# terabajta} many{# terabajta} other{# terabajta}}', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(bez vrednosti)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Došlo je do interne greške na serveru.', 'Are you sure you want to delete this item?' => 'Da li ste sigurni da želite da obrišete ovu stavku?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Obriši', 'Error' => 'Greška', 'File upload failed.' => 'Postavljanje fajla nije uspelo.', @@ -62,52 +40,108 @@ 'Missing required arguments: {params}' => 'Nedostaju obavezni argumenti: {params}', 'Missing required parameters: {params}' => 'Nedostaju obavezni parametri: {params}', 'No' => 'Ne', - 'No help for unknown command "{command}".' => 'Ne postoji pomoć za nepoznatu komandu "{command}".', - 'No help for unknown sub-command "{command}".' => 'Ne postoji pomoć za nepoznatu pod-komandu "{command}".', 'No results found.' => 'Nema rezultata.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Samo sledeći MIME tipovi su dozvoljeni: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Samo fajlovi sa sledećim ekstenzijama su dozvoljeni: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Stranica nije pronađena.', 'Please fix the following errors:' => 'Molimo vas ispravite sledeće greške:', 'Please upload a file.' => 'Molimo vas postavite fajl.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Prikazano {begin, number}-{end, number} od {totalCount, number} {totalCount, plural, =1{stavke} one{stavke} few{stavke} many{stavki} other{stavki}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Fajl "{file}" nije slika.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Fajl "{file}" je prevelik. Veličina ne može biti veća od {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Fajl "{file}" je premali. Veličina ne može biti manja od {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Format atributa "{attribute}" je neispravan.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Visina ne sme biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina ne sme biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premala. Visina ne sme biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premala. Širina ne sme biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', + 'The requested view "{name}" was not found.' => 'Traženi prikaz "{name}" nije pronađen.', 'The verification code is incorrect.' => 'Kod za potvrdu nije ispravan.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Ukupno {count, number} {count, plural, one{stavka} few{stavke} other{stavki}}.', 'Unable to verify your data submission.' => 'Nije moguće verifikovati vaše poslate podatke.', - 'Unknown command "{command}".' => 'Nepoznata komanda "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Nepoznata opcija: --{name}', 'Update' => 'Ispravi', 'View' => 'Prikaz', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Nemate prava da izvršite ovu akciju.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Možete postaviti najviše {limit, number} {limit, plural, one{fajl} few{fajla} other{fajlova}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{mesec} one{# mesec} few{# meseca} many{# meseci} other{# meseci}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekundu} one{# sekundu} few{# sekunde} many{# sekundi} other{# sekundi}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'za {delta, plural, =1{godinu} one{# godinu} few{# godine} many{# godina} other{# godina}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'za {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', + 'just now' => 'upravo sada', 'the input value' => 'ulazna vrednost', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" je već zauzet.', '{attribute} cannot be blank.' => '{attribute} ne sme biti prazan.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} je neispravan.', '{attribute} is not a valid URL.' => '{attribute} nije ispravan URL.', '{attribute} is not a valid email address.' => '{attribute} nije ispravna email adresa.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} mora biti "{requiredValue}".', '{attribute} must be a number.' => '{attribute} mora biti broj.', '{attribute} must be a string.' => '{attribute} mora biti tekst.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} mora biti celi broj.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} mora biti "{true}" ili "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} mora biti veći od "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} mora biti veći ili jednak "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} mora biti manji od "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} mora biti manji ili jednak "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} mora biti veći od "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti veći ili jednak "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} mora biti manji od "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} mora biti manji ili jednak "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} ne sme biti veći od "{max}".', '{attribute} must be no less than {min}.' => '{attribute} ne sme biti manji od {min}.', - '{attribute} must be repeated exactly.' => '{attribute} mora biti ispravno ponovljen.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} ne sme biti jednak "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} ne sme biti jednak "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži bar {min, number} {min, plural, one{karakter} other{karaktera}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži najviše {max, number} {max, plural, one{karakter} other{karaktera}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži {length, number} {length, plural, one{karakter} other{karaktera}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => 'pre {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', + '{delta, plural, =1{a minute} other{# minutes}} ago' => 'pre {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', + '{delta, plural, =1{a month} other{# months}} ago' => 'pre {delta, plural, =1{mesec} one{# meseca} few{# meseca} many{# meseci} other{# meseci}}', + '{delta, plural, =1{a second} other{# seconds}} ago' => 'pre {delta, plural, =1{sekundu} one{# sekunde} few{# sekunde} many{# sekundi} other{# sekundi}}', + '{delta, plural, =1{a year} other{# years}} ago' => 'pre {delta, plural, =1{godinu} one{# godine} few{# godine} many{# godina} other{# godina}}', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'pre {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{bajt} few{bajta} many{bajtova} other{bajta}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{gigabajt} few{gigabajta} many{gigabajta} other{gigabajta}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{kilobajt} few{kilobajta} many{kilobajta} other{kilobajta}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{megabajt} few{megabajta} many{megabajta} other{megabajta}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{petabajt} few{petabajta} many{petabajta} other{petabajta}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{terabajt} few{terabajta} many{terabajta} other{terabajta}}', ]; diff --git a/framework/messages/sr/yii.php b/framework/messages/sr/yii.php index 6e7ba378329..7262ded5773 100644 --- a/framework/messages/sr/yii.php +++ b/framework/messages/sr/yii.php @@ -23,36 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'just now' => 'управо сада', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Само следећи MIME типови су дозвољени: {mimeTypes}.', - 'The requested view "{name}" was not found.' => 'Тражени приказ "{name}" није пронађен.', - 'in {delta, plural, =1{a day} other{# days}}' => 'за {delta, plural, =1{дан} one{# дан} few{# дана} many{# дана} other{# дана}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'за {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'за {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'за {delta, plural, =1{секунду} one{# секунду} few{# секундe} many{# секунди} other{# секунди}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'за {delta, plural, =1{годину} one{# годину} few{# године} many{# година} other{# година}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'за {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', - '{delta, plural, =1{a day} other{# days}} ago' => 'пре {delta, plural, =1{дан} one{дан} few{# дана} many{# дана} other{# дана}}', - '{delta, plural, =1{a minute} other{# minutes}} ago' => 'пре {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', - '{delta, plural, =1{a month} other{# months}} ago' => 'пре {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', - '{delta, plural, =1{a second} other{# seconds}} ago' => 'пре {delta, plural, =1{секунде} one{# секунде} few{# секунде} many{# секунди} other{# секунди}}', - '{delta, plural, =1{a year} other{# years}} ago' => 'пре {delta, plural, =1{године} one{# године} few{# године} many{# година} other{# година}}', - '{delta, plural, =1{an hour} other{# hours}} ago' => 'пре {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, one{# бајт} few{# бајта} many{# бајтова} other{# бајта}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# гигабајт} few{# гигабајта} many{# гигабајта} other{# гигабајта}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# килобајт} few{# килобајта} many{# килобајта} other{# килобајта}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# мегабајт} few{# мегабајта} many{# мегабајта} other{# мегабајта}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# петабајт} few{# петабајта} many{# петабајта} other{# петабајта}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, one{# терабајт} few{# терабајта} many{# терабајта} other{# терабајта}}', - '{n} B' => '{n} Б', - '{n} GB' => '{n} ГБ', - '{n} KB' => '{n} КБ', - '{n} MB' => '{n} МБ', - '{n} PB' => '{n} ПБ', - '{n} TB' => '{n} ТБ', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(без вредности)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Дошло је до интерне грешке на серверу.', 'Are you sure you want to delete this item?' => 'Да ли сте сигурни да желите да обришете ову ставку?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Обриши', 'Error' => 'Грешка', 'File upload failed.' => 'Постављање фајла није успело.', @@ -62,52 +40,108 @@ 'Missing required arguments: {params}' => 'Недостају обавезни аргументи: {params}', 'Missing required parameters: {params}' => 'Недостају обавезни параметри: {params}', 'No' => 'Не', - 'No help for unknown command "{command}".' => 'Не постоји помоћ за непознату команду "{command}".', - 'No help for unknown sub-command "{command}".' => 'Не постоји помоћ за непознату под-команду "{command}".', 'No results found.' => 'Нема резултата.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Само следећи MIME типови су дозвољени: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Само фајлови са следећим екстензијама су дозвољени: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Страница није пронађена.', 'Please fix the following errors:' => 'Молимо вас исправите следеће грешке:', 'Please upload a file.' => 'Молимо вас поставите фајл.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Приказано {begin, number}-{end, number} од {totalCount, number} {totalCount, plural, =1{ставке} one{ставкe} few{ставке} many{ставки} other{ставки}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Фајл "{file}" није слика.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Фајл "{file}" је превелик. Величина не може бити већа од {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Фајл "{file}" је премали. Величина не може бити мања од {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Формат атрибута "{attribute}" је неисправан.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је превелика. Висина не сме бити већа од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је превелика. Ширина не сме бити већа од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је премала. Висина не сме бити мања од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је премала. Ширина не сме бити мања од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', + 'The requested view "{name}" was not found.' => 'Тражени приказ "{name}" није пронађен.', 'The verification code is incorrect.' => 'Код за потврду није исправан.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Укупно {count, number} {count, plural, one{ставка} few{ставке} other{ставки}}.', 'Unable to verify your data submission.' => 'Није могуће верификовати ваше послате податке.', - 'Unknown command "{command}".' => 'Непозната команда "{command}".', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Непозната опција: --{name}', 'Update' => 'Исправи', 'View' => 'Приказ', 'Yes' => 'Да', 'You are not allowed to perform this action.' => 'Немате права да извршите ову акцију.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Можете поставити највише {limit, number} {limit, plural, one{фајл} few{фајлa} other{фајлова}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => 'за {delta, plural, =1{дан} one{# дан} few{# дана} many{# дана} other{# дана}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'за {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'за {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'за {delta, plural, =1{секунду} one{# секунду} few{# секундe} many{# секунди} other{# секунди}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'за {delta, plural, =1{годину} one{# годину} few{# године} many{# година} other{# година}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'за {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', + 'just now' => 'управо сада', 'the input value' => 'улазна вредност', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" је већ заузет.', '{attribute} cannot be blank.' => '{attribute} не сме бити празан.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} је неисправан.', '{attribute} is not a valid URL.' => '{attribute} није исправан URL.', '{attribute} is not a valid email address.' => '{attribute} није исправна email адреса.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} мора бити "{requiredValue}".', '{attribute} must be a number.' => '{attribute} мора бити број.', '{attribute} must be a string.' => '{attribute} мора бити текст.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} мора бити цели број.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} мора бити "{true}" или "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} мора бити већи од "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} мора бити већи или једнак "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} мора бити мањи од "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} мора бити мањи или једнак "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} мора бити већи од "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} мора бити већи или једнак "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} мора бити мањи од "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} мора бити мањи или једнак "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} не сме бити већи од "{max}".', '{attribute} must be no less than {min}.' => '{attribute} не сме бити мањи од {min}.', - '{attribute} must be repeated exactly.' => '{attribute} мора бити исправно поновљен.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} не сме бити једнак "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} не сме бити једнак "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} треба да садржи барем {min, number} {min, plural, one{карактер} other{карактера}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} треба да садржи највише {max, number} {max, plural, one{карактер} other{карактера}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} треба да садржи {length, number} {length, plural, one{карактер} other{карактера}}.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => 'пре {delta, plural, =1{дан} one{дан} few{# дана} many{# дана} other{# дана}}', + '{delta, plural, =1{a minute} other{# minutes}} ago' => 'пре {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', + '{delta, plural, =1{a month} other{# months}} ago' => 'пре {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', + '{delta, plural, =1{a second} other{# seconds}} ago' => 'пре {delta, plural, =1{секунде} one{# секунде} few{# секунде} many{# секунди} other{# секунди}}', + '{delta, plural, =1{a year} other{# years}} ago' => 'пре {delta, plural, =1{године} one{# године} few{# године} many{# година} other{# година}}', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'пре {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', + '{nFormatted} B' => '{nFormatted} Б', + '{nFormatted} GB' => '{nFormatted} ГБ', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} МБ', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} ПБ', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} ТБ', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} кБ', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{бајт} few{бајта} many{бајтова} other{бајта}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабајт} few{гигабајта} many{гигабајта} other{гигабајта}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{килобајт} few{килобајта} many{килобајта} other{килобајта}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{мегабајт} few{мегабајта} many{мегабајта} other{мегабајта}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабајт} few{петабајта} many{петабајта} other{петабајта}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабајт} few{терабајта} many{терабајта} other{терабајта}}', ]; diff --git a/framework/messages/sv/yii.php b/framework/messages/sv/yii.php index b3777626b02..4be34190894 100644 --- a/framework/messages/sv/yii.php +++ b/framework/messages/sv/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(ej satt)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Ett internt serverfel har inträffat.', 'Are you sure you want to delete this item?' => 'Är du säker på att du vill radera objektet?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Radera', 'Error' => 'Error', 'File upload failed.' => 'Uppladdningen misslyckades.', @@ -38,14 +43,19 @@ 'No results found.' => 'Inga resultat hittades.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Endast filer med följande MIME-typer är tillåtna: {mimeTypes}', 'Only files with these extensions are allowed: {extensions}.' => 'Endast filer med följande filnamnstillägg är tillåtna: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Sidan hittades inte.', 'Please fix the following errors:' => 'Var god fixa följande fel:', 'Please upload a file.' => 'Var god ladda upp en fil.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Visar {begin, number}-{end, number} av {totalCount, number} objekt.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Filen "{file}" är inte en bild.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Filen "{file}" är för stor. Filstorleken får inte överskrida {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Filen "{file}" är för liten. Filstorleken måste vara minst {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Formatet för "{attribute}" är ogiltigt.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bilden "{file}" är för stor. Höjden får inte överskrida {limit, number} {limit, plural, =1{pixel} other{pixlar}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bilden "{file}" är för stor. Bredden får inte överskrida {limit, number} {limit, plural, =1{pixel} other{pixlar}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Bilden "{file}" är för liten. Bilden måste vara minst {limit, number} {limit, plural, =1{pixel} other{pixlar}} hög.', @@ -54,12 +64,15 @@ 'The verification code is incorrect.' => 'Verifieringskoden är felaktig.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Totalt {count, number} objekt.', 'Unable to verify your data submission.' => 'Det gick inte att verifiera skickad data.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Okänt alternativ: --{name}', 'Update' => 'Uppdatera', 'View' => 'Visa', 'Yes' => 'Ja', 'You are not allowed to perform this action.' => 'Du har inte behörighet att utföra den här åtgärden.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Du får inte ladda upp mer än {limit, number} {limit, plural, =1{fil} other{filer}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'under {delta, plural, =1{en dag} other{# dagar}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'under {delta, plural, =1{en minut} other{# minuter}}', 'in {delta, plural, =1{a month} other{# months}}' => 'under {delta, plural, =1{en månad} other{# månader}}', @@ -70,25 +83,39 @@ 'the input value' => 'inmatningsvärdet', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" används redan.', '{attribute} cannot be blank.' => 'Värdet för {attribute} får inte vara tomt.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => 'Värdet för {attribute} är ogiltigt.', '{attribute} is not a valid URL.' => '{attribute} är inte en giltig URL.', '{attribute} is not a valid email address.' => '{attribute} är inte en giltig emailadress.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} måste vara satt till "{requiredValue}".', '{attribute} must be a number.' => '{attribute} måste vara ett nummer.', '{attribute} must be a string.' => '{attribute} måste vara en sträng.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} måste vara ett heltal.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} måste vara satt till antingen "{true}" eller "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} måste vara större än "{compareValue}".', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} måste vara större än eller lika med "{compareValue}".', - '{attribute} must be less than "{compareValue}".' => '{attribute} måste vara mindre än "{compareValue}".', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} måste vara mindre än eller lika med "{compareValue}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} måste vara större än "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} måste vara större än eller lika med "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} måste vara mindre än "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} måste vara mindre än eller lika med "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => '{attribute} får inte överskrida {max}.', '{attribute} must be no less than {min}.' => '{attribute} får som minst vara {min}.', - '{attribute} must be repeated exactly.' => '{attribute} måste upprepas exakt.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} får inte vara satt till "{compareValue}".', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} får inte vara satt till "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} bör innehålla minst {min, number} tecken.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} bör innehålla max {max, number} tecken.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} bör innehålla {length, number} tecken.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{en dag} other{# dagar}} sedan', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{en minut} other{# minuter}} sedan', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{en månad} other{# månader}} sedan', @@ -98,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -106,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{byte}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibyte}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabyte}}', diff --git a/framework/messages/tg/yii.php b/framework/messages/tg/yii.php index 76429c5874e..7c9d9fc884e 100644 --- a/framework/messages/tg/yii.php +++ b/framework/messages/tg/yii.php @@ -23,13 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'Powered by {yii}' => 'Дар {yii} кор мекунад', - 'Unknown alias: -{name}' => 'Тахаллуси номаълум: -{name}', - 'Yii Framework' => 'Yii Framework', - '(not set)' => '(супориш дода нашуд)', ' and ' => ' ва ', + '"{attribute}" does not support operator "{operator}".' => '', + '(not set)' => '(супориш дода нашуд)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Хатои дохилии сервер рух дод.', 'Are you sure you want to delete this item?' => 'Шумо боварманд ҳастед, ки ҳамин элементро нест кардан мехоҳед?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Нест кардан', 'Error' => 'Иштибоҳ', 'File upload failed.' => 'Фарокашии файл муяссар гашт.', @@ -42,6 +43,9 @@ 'No results found.' => 'Ҳеҷ чиз ёфт нашуд.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Барои фарокашии файлҳо танҳо бо намудҳои зерини MIME иҷозат аст: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Барои фарокашии файлҳо танҳо тавассути зиёдкуни зерин иҷозат аст: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Саҳифа ёфт нашуд.', 'Please fix the following errors:' => 'Лутфан, хатогиҳои зеринро ислоҳ намоед:', 'Please upload a file.' => 'Лутфан, файлро бор кунед.', @@ -51,6 +55,7 @@ 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Ҳаҷми файли "{file}" азҳад зиёд калон аст. Андозаи он набояд аз {formattedLimit} зиёдтар бошад.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Ҳаҷми файли "{file}" аз ҳад зиёд хурд аст. Он бояд аз {formattedLimit} калонтар бошад.', 'The format of {attribute} is invalid.' => 'Формати нодурусти маънӣ {attribute}.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Ҳаҷми файли "{file}" аз ҳад зиёд калон аст. Баландияш набояд аз {limit, number} {limit, plural, one{пиксел} few{пиксел} many{пиксел} other{пиксел}} зиёд бошад.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Ҳаҷми файл "{file}" аз ҳад зиёд калон аст. Дарозияш набояд аз {limit, number} {limit, plural, one{пиксел} few{пиксел} many{пиксел} other{пиксел}} зиёд бошад.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Ҳаҷми файл "{file}" аз ҳад зиёд хурд аст. Баландияш бояд аз {limit, number} {limit, plural, one{пиксел} few{пиксел} many{пиксел} other{пиксел}} зиёд бошад.', @@ -59,12 +64,15 @@ 'The verification code is incorrect.' => 'Рамзи нодурусти санҷишӣ.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Ҳамаги {count, number} {count, plural, one{қайд} few{қайд} many{қайдҳо} other{қайд}}.', 'Unable to verify your data submission.' => 'Санҷидани маълумоти фиристодаи Шумо муяссар нагардид.', + 'Unknown alias: -{name}' => 'Тахаллуси номаълум: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Гузинаи номаълум: --{name}', 'Update' => 'Таҳрир намудан', 'View' => 'Аз назар гузарондан', 'Yes' => 'Ҳа', 'You are not allowed to perform this action.' => 'Шумо барои анҷом додани амали мазкур иҷозат надоред.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Шумо наметавонед зиёда аз {limit, number} {limit, plural,one{файлро} few{файлҳоро} many{файлро} other{файлро}} фаро бикашед.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'баъд аз {delta, plural, =1{рӯз} one{# рӯз} few{# рӯз} many{# рӯз} other{# рӯз}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'баъд аз {delta, plural, =1{дақиқа} one{# дақиқа} few{# дақиқа} many{# дақиқа} other{# дақиқа}}', 'in {delta, plural, =1{a month} other{# months}}' => 'баъд аз {delta, plural, =1{моҳ} one{# моҳ} few{# моҳ} many{# моҳ} other{# моҳ}}', @@ -101,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Ҷадвали «{attribute}» бояд хади ақал {min, number} {min, plural, one{аломат} few{аломат} many{аломат} other{аломат}} дошта бошад.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Ҷадвали «{attribute}» бояд ҳади аксар {min, number} {min, plural, one{аломат} few{аломат} many{аломат} other{аломат}} дошта бошад.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Ҷадвали «{attribute}» бояд {length, number} {length, plural, one{аломат} few{аломат} many{аломат} other{аломат}} дошта бошад.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, one{# рӯз} few{# рӯз} many{# рӯз} other{# рӯз}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# соат} few{# соат} many{# соат} other{# соат}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, one{# дақиқа} few{# дақиқа} many{# дақиқа} other{# дақиқа}}', @@ -116,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} Б', '{nFormatted} GB' => '{nFormatted} ГБ', '{nFormatted} GiB' => '{nFormatted} ГиБ', - '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} KiB' => '{nFormatted} КиБ', '{nFormatted} MB' => '{nFormatted} МБ', '{nFormatted} MiB' => '{nFormatted} МиБ', @@ -124,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} КБ', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байт} many{байт} other{байт}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайт} many{гибибайт} other{гибибайт}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайт} many{гигабайт} other{гигабайт}}', diff --git a/framework/messages/th/yii.php b/framework/messages/th/yii.php index 0b2c056ed9f..6ce740fde16 100644 --- a/framework/messages/th/yii.php +++ b/framework/messages/th/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(ไม่ได้ตั้ง)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์', 'Are you sure you want to delete this item?' => 'คุณแน่ใจหรือไม่ที่จะลบรายการนี้?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'ลบ', 'Error' => 'ผิดพลาด', 'File upload failed.' => 'อัพโหลดไฟล์ล้มเหลว', @@ -38,15 +43,19 @@ 'No results found.' => 'ไม่พบผลลัพธ์', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'เฉพาะไฟล์ที่มีชนิด MIME ต่อไปนี้ที่ได้รับการอนุญาต: {mimeTypes}', 'Only files with these extensions are allowed: {extensions}.' => 'เฉพาะไฟล์ที่มีนามสกุลต่อไปนี้ที่ได้รับอนุญาต: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'ไม่พบหน้า', 'Please fix the following errors:' => 'โปรดแก้ไขข้อผิดพลาดต่อไปนี้:', 'Please upload a file.' => 'กรุณาอัพโหลดไฟล์', - 'Powered by {yii}' => 'ขับเคลื่อนโดย {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'แสดง {begin, number} ถึง {end, number} จาก {totalCount, number} ผลลัพธ์', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'ไฟล์ "{file}" ไม่ใช่รูปภาพ', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'ไฟล์ "{file}" มีขนาดใหญ่ไป ไฟล์จะต้องมีขนาดไม่เกิน {formattedLimit}', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'ไฟล์ "{file}" มีขนาดเล็กเกินไป ไฟล์จะต้องมีขนาดมากกว่า {formattedLimit}', 'The format of {attribute} is invalid.' => 'รูปแบบ {attribute} ไม่ถูกต้อง', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'รูปภาพ "{file}" ใหญ่เกินไป ความสูงต้องน้อยกว่า {limit, number} พิกเซล', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'รูปภาพ "{file}" ใหญ่เกินไป ความกว้างต้องน้อยกว่า {limit, number} พิกเซล', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'รูปภาพ "{file}" เล็กเกินไป ความสูงต้องมากว่า {limit, number} พิกเซล', @@ -55,28 +64,35 @@ 'The verification code is incorrect.' => 'รหัสการยืนยันไม่ถูกต้อง', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'ทั้งหมด {count, number} ผลลัพธ์', 'Unable to verify your data submission.' => 'ไม่สามารถตรวจสอบการส่งข้อมูลของคุณ', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'ไม่รู้จักตัวเลือก: --{name}', 'Update' => 'ปรับปรุง', 'View' => 'ดู', 'Yes' => 'ใช่', 'You are not allowed to perform this action.' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการนี้', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'คุณสามารถอัพโหลดมากที่สุด {limit, number} ไฟล์', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'ใน {delta} วินาที', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'ใน {delta} นาที', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'ใน {delta} ชั่วโมง', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'ใน {delta} วัน', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'ใน {delta} นาที', 'in {delta, plural, =1{a month} other{# months}}' => 'ใน {delta} เดือน', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'ใน {delta} วินาที', 'in {delta, plural, =1{a year} other{# years}}' => 'ใน {delta} ปี', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'ใน {delta} ชั่วโมง', 'just now' => 'เมื่อสักครู่นี้', 'the input value' => 'ค่าป้อนที่เข้ามา', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" ถูกใช้ไปแล้ว', '{attribute} cannot be blank.' => '{attribute}ต้องไม่ว่างเปล่า', + '{attribute} contains wrong subnet mask.' => '{attribute}ไม่ใช่ซับเน็ตที่ถูกต้อง', '{attribute} is invalid.' => '{attribute}ไม่ถูกต้อง', '{attribute} is not a valid URL.' => '{attribute}ไม่ใช่รูปแบบ URL ที่ถูกต้อง', '{attribute} is not a valid email address.' => '{attribute}ไม่ใช่รูปแบบอีเมลที่ถูกต้อง', + '{attribute} is not in the allowed range.' => '{attribute}ไม่ได้อยู่ในช่วงที่ได้รับอนุญาต', '{attribute} must be "{requiredValue}".' => '{attribute}ต้องการ "{requiredValue}"', '{attribute} must be a number.' => '{attribute}ต้องเป็นตัวเลขเท่านั้น', '{attribute} must be a string.' => '{attribute}ต้องเป็นตัวอักขระเท่านั้น', + '{attribute} must be a valid IP address.' => '{attribute}ต้องเป็นที่อยู่ไอพีที่ถูกต้อง', + '{attribute} must be an IP address with specified subnet.' => '{attribute}ต้องเป็นที่อยู่ไอพีกับซับเน็ตที่ระบุ', '{attribute} must be an integer.' => '{attribute}ต้องเป็นจำนวนเต็มเท่านั้น', '{attribute} must be either "{true}" or "{false}".' => '{attribute}ต้องเป็น "{true}" หรือ "{false}"', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute}ต้องเหมือนกับ "{compareValueOrAttribute}"', @@ -86,27 +102,46 @@ '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute}ต้องน้อยกว่าหรือเท่ากับ "{compareValueOrAttribute}"', '{attribute} must be no greater than {max}.' => '{attribute}ต้องไม่มากกว่า {max}.', '{attribute} must be no less than {min}.' => '{attribute}ต้องไม่น้อยกว่า {min}', + '{attribute} must not be a subnet.' => '{attribute}ต้องไม่ใช่ซับเน็ต', + '{attribute} must not be an IPv4 address.' => '{attribute}ต้องไม่ใช่ที่อยู่ไอพีรุ่น 4', + '{attribute} must not be an IPv6 address.' => '{attribute}ต้องไม่ใช่ที่อยู่ไอพีรุ่น 6', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute}ต้องมีค่าไม่เหมือนกับ "{compareValueOrAttribute}"', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute}ควรประกอบด้วยอักขระอย่างน้อย {min, number} อักขระ', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute}ควรประกอบด้วยอักขระอย่างมาก {max, number} อักขระ', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute}ควรประกอบด้วย {length, number} อักขระ', - '{attribute} contains wrong subnet mask.' => '{attribute}ไม่ใช่ซับเน็ตที่ถูกต้อง', - '{attribute} is not in the allowed range.' => '{attribute}ไม่ได้อยู่ในช่วงที่ได้รับอนุญาต', - '{attribute} must be a valid IP address.' => '{attribute}ต้องเป็นที่อยู่ไอพีที่ถูกต้อง', - '{attribute} must be an IP address with specified subnet.' => '{attribute}ต้องเป็นที่อยู่ไอพีกับซับเน็ตที่ระบุ', - '{attribute} must not be a subnet.' => '{attribute}ต้องไม่ใช่ซับเน็ต', - '{attribute} must not be an IPv4 address.' => '{attribute}ต้องไม่ใช่ที่อยู่ไอพีรุ่น 4', - '{attribute} must not be an IPv6 address.' => '{attribute}ต้องไม่ใช่ที่อยู่ไอพีรุ่น 6', - '{delta, plural, =1{1 second} other{# seconds}}' => '{delta} วินาที', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '{delta} วัน', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} ชั่วโมง', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} นาที', - '{delta, plural, =1{1 day} other{# days}}' => '{delta} วัน', '{delta, plural, =1{1 month} other{# months}}' => '{delta} เดือน', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta} วินาที', '{delta, plural, =1{1 year} other{# years}}' => '{delta} ปี', - '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} วินาทีที่ผ่านมา', - '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} นาทีที่ผ่านมา', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} ชั่วโมงที่ผ่านมา', '{delta, plural, =1{a day} other{# days}} ago' => '{delta} วันที่ผ่านมา', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} นาทีที่ผ่านมา', '{delta, plural, =1{a month} other{# months}} ago' => '{delta} เดือนที่ผ่านมา', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} วินาทีที่ผ่านมา', '{delta, plural, =1{a year} other{# years}} ago' => '{delta} ปีที่ผ่านมา', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} ชั่วโมงที่ผ่านมา', + '{nFormatted} B' => '', + '{nFormatted} GB' => '', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '', ]; diff --git a/framework/messages/tr/yii.php b/framework/messages/tr/yii.php index b846f17d1e0..f17530b26ca 100644 --- a/framework/messages/tr/yii.php +++ b/framework/messages/tr/yii.php @@ -23,9 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(Veri Yok)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Bir sunucu hatası oluştu.', 'Are you sure you want to delete this item?' => 'Bu veriyi silmek istediğinizden emin misiniz?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Sil', 'Error' => 'Hata', 'File upload failed.' => 'Dosya yükleme başarısız.', @@ -38,28 +43,36 @@ 'No results found.' => 'Sonuç bulunamadı', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Sadece bu tip MIME türleri geçerlidir: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Sadece bu tip uzantıları olan dosyalar geçerlidir: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Sayfa bulunamadı.', 'Please fix the following errors:' => 'Lütfen hataları düzeltin:', 'Please upload a file.' => 'Lütfen bir dosya yükleyin.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} {totalCount, plural, one{öğenin} other{öğenin}} {begin, number}-{end, number} arası gösteriliyor.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '"{file}" bir resim dosyası değil.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '"{file}" dosyası çok büyük. Boyutu {formattedLimit} değerinden büyük olamaz.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '"{file}" dosyası çok küçük. Boyutu {formattedLimit} değerinden küçük olamaz.', 'The format of {attribute} is invalid.' => '{attribute} formatı geçersiz.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çok büyük. Yükseklik {limit, plural, one{pixel} other{pixels}} değerinden büyük olamaz.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çok büyük. Genişlik {limit, number} {limit, plural, one{pixel} other{pixels}} değerinden büyük olamaz.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çok küçük. Genişlik {limit, number} {limit, plural, one{pixel} other{pixels}} değerinden küçük olamaz.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çok küçük. Genişlik {limit, number} {limit, plural, one{pixel} other{pixels}} değerinden küçük olamaz.', + 'The requested view "{name}" was not found.' => '', 'The verification code is incorrect.' => 'Doğrulama kodu yanlış.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Toplam {count, number} {count, plural, one{öğe} other{öğe}}.', 'Unable to verify your data submission.' => 'İlettiğiniz veri doğrulanamadı.', 'Unknown alias: -{name}' => 'Bilinmeyen rumuz: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Bilinmeyen opsiyon: --{name}', 'Update' => 'Güncelle', 'View' => 'Görüntüle', 'Yes' => 'Evet', 'You are not allowed to perform this action.' => 'Bu işlemi yapmaya yetkiniz yok.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Sadece {limit, number} {limit, plural, one{dosya} other{# dosya}} yükleyebilirsiniz.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{bir gün} other{# gün}} içerisinde', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{bir dakika} other{# dakika}} içerisinde', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{bir ay} other{# ay}} içerisinde', @@ -96,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} en az {min, number} karakter içermeli.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} en fazla {max, number} karakter içermeli.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} {length, number} karakter içermeli.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 gün} other{# gün}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 saat} other{# saat}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 dakika} other{# dakika}}', @@ -111,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -119,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{bayt} other{bayt}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibayt} other{gibibayt}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabayt} other{gigabayt}}', diff --git a/framework/messages/uk/yii.php b/framework/messages/uk/yii.php index fb6fed9c46a..1a61ec73c2b 100644 --- a/framework/messages/uk/yii.php +++ b/framework/messages/uk/yii.php @@ -23,15 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '{attribute} must be equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути рівним "{compareValueOrAttribute}".', - '{attribute} must be greater than "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути більшим значення "{compareValueOrAttribute}".', - '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути більшим або дорівнювати значенню "{compareValueOrAttribute}".', - '{attribute} must be less than "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути меншим значення "{compareValueOrAttribute}".', - '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути меншим або дорівнювати значенню "{compareValueOrAttribute}".', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" не повинно бути рівним "{compareValueOrAttribute}".', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(не задано)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Виникла внутрішня помилка сервера.', 'Are you sure you want to delete this item?' => 'Ви впевнені, що хочете видалити цей елемент?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Видалити', 'Error' => 'Помилка', 'File upload failed.' => 'Завантаження файлу не вдалося.', @@ -44,14 +43,19 @@ 'No results found.' => 'Нічого не знайдено.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Дозволені файли лише з наступними MIME-типами: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Дозволені файли лише з наступними розширеннями: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Сторінка не знайдена.', 'Please fix the following errors:' => 'Будь ласка, виправте наступні помилки:', 'Please upload a file.' => 'Будь ласка, завантажте файл.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Показані {begin, number}-{end, number} із {totalCount, number} {totalCount, plural, one{запису} other{записів}}.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'Файл "{file}" не є зображенням.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Файл "{file}" занадто великий. Розмір не повинен перевищувати {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Файл "{file}" занадто малий. Розмір повинен бути більше, ніж {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Невірний формат значення "{attribute}".', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Зображення "{file}" занадто велике. Висота не повинна перевищувати {limit, number} {limit, plural, one{піксель} few{пікселя} many{пікселів} other{пікселя}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Зображення "{file}" занадто велике. Ширина не повинна перевищувати {limit, number} {limit, plural, one{піксель} few{пікселя} many{пікселів} other{пікселя}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Зображення "{file}" занадто мале. Висота повинна бути більше, ніж {limit, number} {limit, plural, one{піксель} few{пікселя} many{пікселів} other{пікселя}}.', @@ -60,12 +64,15 @@ 'The verification code is incorrect.' => 'Невірний код перевірки.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Всього {count, number} {count, plural, one{запис} few{записи} many{записів} other{записи}}.', 'Unable to verify your data submission.' => 'Не вдалося перевірити передані дані.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Невідома опція : --{name}', 'Update' => 'Оновити', 'View' => 'Переглянути', 'Yes' => 'Так', 'You are not allowed to perform this action.' => 'Вам не дозволено виконувати дану дію.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Ви не можете завантажувати більше {limit, number} {limit, plural, one{файла} few{файлів} many{файлів} other{файла}}.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'через {delta, plural, =1{день} one{# день} few{# дні} many{# днів} other{# дні}}', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'через {delta, plural, =1{хвилину} one{# хвилину} few{# хвилини} many{# хвилин} other{# хвилини}}', 'in {delta, plural, =1{a month} other{# months}}' => 'через {delta, plural, =1{місяць} one{# місяць} few{# місяці} many{# місяців} other{# місяці}}', @@ -88,14 +95,21 @@ '{attribute} must be an IP address with specified subnet.' => 'Значення «{attribute}» повинно бути IP адресою з підмережею.', '{attribute} must be an integer.' => 'Значення "{attribute}" має бути цілим числом.', '{attribute} must be either "{true}" or "{false}".' => 'Значення "{attribute}" має дорівнювати "{true}" або "{false}".', + '{attribute} must be equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути рівним "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути більшим значення "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути більшим або дорівнювати значенню "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути меншим значення "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" повинно бути меншим або дорівнювати значенню "{compareValueOrAttribute}".', '{attribute} must be no greater than {max}.' => 'Значення "{attribute}" не повинно перевищувати {max}.', '{attribute} must be no less than {min}.' => 'Значення "{attribute}" має бути більшим {min}.', '{attribute} must not be a subnet.' => 'Значення «{attribute}» не повинно бути підмережею.', '{attribute} must not be an IPv4 address.' => 'Значення «{attribute}» не повинно бути IPv4 адресою.', '{attribute} must not be an IPv6 address.' => 'Значення «{attribute}» не повинно бути IPv6 адресою.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => 'Значення "{attribute}" не повинно бути рівним "{compareValueOrAttribute}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Значення "{attribute}" повинно містити мінімум {min, number} {min, plural, one{символ} few{символа} many{символів} other{символа}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Значення "{attribute}" повинно містити максимум {max, number} {max, plural, one{символ} few{символа} many{символів} other{символа}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Значення "{attribute}" повинно містити {length, number} {length, plural, one{символ} few{символа} many{символів} other{символа}}.', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, one{# день} few{# дні} many{# днів} other{# днів}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, one{# година} few{# години} many{# годин} other{# годин}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, one{# хвилина} few{# хвилини} many{# хвилин} other{# хвилин}}', @@ -111,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} Б', '{nFormatted} GB' => '{nFormatted} Гб', '{nFormatted} GiB' => '{nFormatted} ГіБ', - '{nFormatted} kB' => '{nFormatted} Кб', '{nFormatted} KiB' => '{nFormatted} КіБ', '{nFormatted} MB' => '{nFormatted} Мб', '{nFormatted} MiB' => '{nFormatted} МіБ', @@ -119,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} ПіБ', '{nFormatted} TB' => '{nFormatted} Тб', '{nFormatted} TiB' => '{nFormatted} ТіБ', + '{nFormatted} kB' => '{nFormatted} Кб', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байта} many{байтів} other{байта}}', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гібібайт} few{гібібайта} many{гібібайтів} other{гібібайта}}', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гігабайт} few{гігабайта} many{гігабайтів} other{гігабайта}}', diff --git a/framework/messages/uz-Cy/yii.php b/framework/messages/uz-Cy/yii.php index f29a077b30c..c7ae1e73d88 100644 --- a/framework/messages/uz-Cy/yii.php +++ b/framework/messages/uz-Cy/yii.php @@ -1,125 +1,147 @@ '{nFormatted} Б', - '{nFormatted} GB' => '{nFormatted} ГБ', - '{nFormatted} GiB' => '{nFormatted} ГиБ', - '{nFormatted} KB' => '{nFormatted} КБ', - '{nFormatted} KiB' => '{nFormatted} КиБ', - '{nFormatted} MB' => '{nFormatted} МБ', - '{nFormatted} MiB' => '{nFormatted} МиБ', - '{nFormatted} PB' => '{nFormatted} ПБ', - '{nFormatted} PiB' => '{nFormatted} ПиБ', - '{nFormatted} TB' => '{nFormatted} ТБ', - '{nFormatted} TiB' => '{nFormatted} ТиБ', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байт} many{байтлар} other{байт}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайт} many{гибибайт} other{гибибайт}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайт} many{гигабайт} other{гигабайт}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{кибибайт} few{кибибайт} many{кибибайт} other{кибибайт}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{килобайт} few{килобайт} many{килобайт} other{килобайт}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{мебибайт} few{мебибайт} many{мебибайт} other{мебибайт}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{мегабайт} few{мегабайт} many{мегабайт} other{мегабайт}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{пебибайт} few{пебибайт} many{пебибайт} other{пебибайт}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабайт} few{петабайт} many{петабайт} other{петабайт}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{тебибайт} few{тебибайт} many{тебибайт} other{тебибайт}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабайт} few{терабайт} many{терабайт} other{терабайт}}', - '(not set)' => '(қийматланмаган)', - 'An internal server error occurred.' => 'Сервернинг ички хатолиги юз берди.', - 'Are you sure you want to delete this item?' => 'Сиз ростдан ҳам ушбу элементни ўчирмоқчимисиз?', - 'Delete' => 'Ўчириш', - 'Error' => 'Хато', - 'File upload failed.' => 'Файлни юклаб бўлмади.', - 'Home' => 'Асосий', - 'Invalid data received for parameter "{param}".' => '"{param}" параметр қиймати нотўғри.', - 'Login Required' => 'Кириш талаб қилинади.', - 'Missing required arguments: {params}' => 'Қуйидаги зарур аргументлар мавжуд эмас: {params}', - 'Missing required parameters: {params}' => 'Қуйидаги зарур параметрлар мавжуд эмас: {params}', - 'No' => 'Йўқ', - 'No help for unknown command "{command}".' => '"{command}" ноаниқ команда учун маълумотнома мавжуд эмас.', - 'No help for unknown sub-command "{command}".' => '"{command}" ноаниқ қисм команда учун маълумотнома мавжуд эмас.', - 'No results found.' => 'Хеч нима топилмади.', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Фақат MIME-туридаги файлларни юклашга рухсат берилган: {mimeTypes}.', - 'Only files with these extensions are allowed: {extensions}.' => 'Фақат қуйидаги кенгайтмали файлларни юклашга рухсат берилган: {extensions}.', - 'Page not found.' => 'Саҳифа топилмади.', - 'Please fix the following errors:' => 'Қуйидаги хатоликларни тўғриланг:', - 'Please upload a file.' => 'Файлни юкланг.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Намойиш этиляпти {begin, number}-{end, number} маълумот, жами: {totalCount, number} та', - 'The file "{file}" is not an image.' => '«{file}» расм файл эмас.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '«{file}» файл жуда катта. Ўлчам {formattedLimit} ошиши керак эмас.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '«{file}» файл жуда кичкина. Ўлчам {formattedLimit} кам бўлмаслиги керак.', - 'The format of {attribute} is invalid.' => '«{attribute}» қийматнинг формати нотўғри.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда катта. Баландлик {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} ошмаслиги керак.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда катта. Эни {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} ошмаслиги керак.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда кичкина. Баландлик {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} кам бўлмаслиги керак.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда кичкина. Эни {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} кам бўлмаслиги керак.', - 'The requested view "{name}" was not found.' => 'Сўралаётган "{name}" файли топилмади.', - 'The verification code is incorrect.' => 'Текширув коди нотўғри.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Жами {count, number} {count, plural, one{ёзув} few{ёзув} many{ёзув} other{ёзув}}.', - 'Unable to verify your data submission.' => 'Юборилган маълумотларни текшириб бўлмади.', - 'Unknown command "{command}".' => '"{command}" ноаниқ бўйриқ.', - 'Unknown option: --{name}' => 'Ноаниқ танлов: --{name}', - 'Update' => 'Таҳририлаш', - 'View' => 'Кўриш', - 'Yes' => 'Ҳа', - 'You are not allowed to perform this action.' => 'Сизга ушбу амални бажаришга руҳсат берилмаган.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Сиз {limit, number} {limit, plural, one{файлдан} few{файллардан} many{файллардан} other{файллардан}} кўпини юклаб ололмайсиз.', - 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{кундан} one{# кундан} few{# кундан} many{# кунлардан} other{# кундан}} кейин', - 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{минутдан} one{# минутдан} few{# минутлардан} many{# минутдан} other{# минутлардан}} кейин', - 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{ойдан} one{# ойдан} few{# ойдан} many{# ойлардан} other{# ойлардан}} кейин', - 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta, plural, =1{секунддан} one{# секунддан} few{# секундлардан} many{# секунддан} other{# секундлардан}} кейин', - 'in {delta, plural, =1{a year} other{# years}}' => '{delta, plural, =1{йилдан} one{# йилдан} few{# йиллардан} many{# йиллардан} other{# йиллардан}} кейин', - 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta, plural, =1{соатдан} one{# соатдан} few{# соатлардан} many{# соатлардан} other{# соатлардан}} кейин', - 'just now' => 'ҳозироқ', - 'the input value' => 'киритилган қиймат', - '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» аввалроқ банд қилинган.', - '{attribute} cannot be blank.' => '«{attribute}» тўлдириш шарт.', - '{attribute} is invalid.' => '«{attribute}» қиймати нотўғри', - '{attribute} is not a valid URL.' => '«{attribute}» тўғри URL эмас.', - '{attribute} is not a valid email address.' => '«{attribute}» тўғри электрон манзил эмас.', - '{attribute} must be "{requiredValue}".' => '«{attribute}» қиймати «{requiredValue}» га тенг бўлиши керак.', - '{attribute} must be a number.' => '«{attribute}» қиймати сон бўлиши керак.', - '{attribute} must be a string.' => '«{attribute}» қиймати матн бўлиши керак.', - '{attribute} must be an integer.' => '«{attribute}» қиймати бутун сон бўлиши керак.', - '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» қиймати «{true}» ёки «{false}» бўлиши керак.', - '{attribute} must be greater than "{compareValue}".' => '«{attribute}» қиймати «{compareValue}» дан катта бўлиши керак.', - '{attribute} must be greater than or equal to "{compareValue}".' => '«{attribute}» қиймати «{compareValue}» дан катта ёки тенг бўлиши керак.', - '{attribute} must be less than "{compareValue}".' => '«{attribute}» қиймати «{compareValue}» дан кичкина бўлиши керак.', - '{attribute} must be less than or equal to "{compareValue}".' => '«{attribute}» қиймати «{compareValue}» дан кичик ёки тенг бўлиши керак.', - '{attribute} must be no greater than {max}.' => '«{attribute}» қиймати {max} дан ошмаслиги керак.', - '{attribute} must be no less than {min}.' => '«{attribute}» қиймати {min} дан катта бўлиши керак.', - '{attribute} must be repeated exactly.' => '«{attribute}» қиймати бир хил тарзда такрорланиши керак.', - '{attribute} must not be equal to "{compareValue}".' => '«{attribute}» қиймати «{compareValue}» га тенг бўлмаслиги керак.', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» қийматига тенг бўлмаслиги лозим.', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» қиймати минимум {min, number} {min, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ташкил топиши керак.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» қиймати максимум {max, number} {max, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ошмаслиги керак.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» қиймати {length, number} {length, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ташкил топиши керак.', - '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{кун} one{кун} few{# кун} many{# кун} other{# кун}} аввал', - '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{дақиқа} one{# дақиқа} few{# дақиқа} many{# дақиқа} other{# дақиқа}} аввал', - '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{ой} one{# ой} few{# ой} many{# ой} other{# ой}} аввал', - '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{сония} one{# сония} few{# сония} many{# сония} other{# сония}} аввал', - '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{йил} one{# йил} few{# йил} many{# йил} other{# йил}} аввал', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{соат} one{# соат} few{# соат} many{# соат} other{# соат}} аввал', - ]; +/** + * @link https://www.yiiframework.com/ + * @copyright Copyright (c) 2008 Yii Software LLC + * @license https://www.yiiframework.com/license/ + */ +/** + * Message translations. + * + * This file is automatically generated by 'yii message/extract' command. + * It contains the localizable messages extracted from source code. + * You may modify this file by translating the extracted messages. + * + * Each array element represents the translation (value) of a message (key). + * If the value is empty, the message is considered as not translated. + * Messages that no longer need translation will have their translations + * enclosed between a pair of '@@' marks. + * + * Message string can be used with plural forms format. Check i18n section + * of the guide for details. + * + * NOTE: this file must be saved in UTF-8 encoding. + */ +return [ + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', + '(not set)' => '(қийматланмаган)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', + 'An internal server error occurred.' => 'Сервернинг ички хатолиги юз берди.', + 'Are you sure you want to delete this item?' => 'Сиз ростдан ҳам ушбу элементни ўчирмоқчимисиз?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', + 'Delete' => 'Ўчириш', + 'Error' => 'Хато', + 'File upload failed.' => 'Файлни юклаб бўлмади.', + 'Home' => 'Асосий', + 'Invalid data received for parameter "{param}".' => '"{param}" параметр қиймати нотўғри.', + 'Login Required' => 'Кириш талаб қилинади.', + 'Missing required arguments: {params}' => 'Қуйидаги зарур аргументлар мавжуд эмас: {params}', + 'Missing required parameters: {params}' => 'Қуйидаги зарур параметрлар мавжуд эмас: {params}', + 'No' => 'Йўқ', + 'No results found.' => 'Хеч нима топилмади.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Фақат MIME-туридаги файлларни юклашга рухсат берилган: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Фақат қуйидаги кенгайтмали файлларни юклашга рухсат берилган: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', + 'Page not found.' => 'Саҳифа топилмади.', + 'Please fix the following errors:' => 'Қуйидаги хатоликларни тўғриланг:', + 'Please upload a file.' => 'Файлни юкланг.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Намойиш этиляпти {begin, number}-{end, number} маълумот, жами: {totalCount, number} та', + 'The combination {values} of {attributes} has already been taken.' => '', + 'The file "{file}" is not an image.' => '«{file}» расм файл эмас.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '«{file}» файл жуда катта. Ўлчам {formattedLimit} ошиши керак эмас.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '«{file}» файл жуда кичкина. Ўлчам {formattedLimit} кам бўлмаслиги керак.', + 'The format of {attribute} is invalid.' => '«{attribute}» қийматнинг формати нотўғри.', + 'The format of {filter} is invalid.' => '', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда катта. Баландлик {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} ошмаслиги керак.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда катта. Эни {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} ошмаслиги керак.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда кичкина. Баландлик {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} кам бўлмаслиги керак.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» файл жуда кичкина. Эни {limit, number} {limit, plural, one{пикселдан} few{пикселдан} many{пикселдан} other{пикселдан}} кам бўлмаслиги керак.', + 'The requested view "{name}" was not found.' => 'Сўралаётган "{name}" файли топилмади.', + 'The verification code is incorrect.' => 'Текширув коди нотўғри.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Жами {count, number} {count, plural, one{ёзув} few{ёзув} many{ёзув} other{ёзув}}.', + 'Unable to verify your data submission.' => 'Юборилган маълумотларни текшириб бўлмади.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', + 'Unknown option: --{name}' => 'Ноаниқ танлов: --{name}', + 'Update' => 'Таҳририлаш', + 'View' => 'Кўриш', + 'Yes' => 'Ҳа', + 'You are not allowed to perform this action.' => 'Сизга ушбу амални бажаришга руҳсат берилмаган.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Сиз {limit, number} {limit, plural, one{файлдан} few{файллардан} many{файллардан} other{файллардан}} кўпини юклаб ололмайсиз.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{кундан} one{# кундан} few{# кундан} many{# кунлардан} other{# кундан}} кейин', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{минутдан} one{# минутдан} few{# минутлардан} many{# минутдан} other{# минутлардан}} кейин', + 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{ойдан} one{# ойдан} few{# ойдан} many{# ойлардан} other{# ойлардан}} кейин', + 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta, plural, =1{секунддан} one{# секунддан} few{# секундлардан} many{# секунддан} other{# секундлардан}} кейин', + 'in {delta, plural, =1{a year} other{# years}}' => '{delta, plural, =1{йилдан} one{# йилдан} few{# йиллардан} many{# йиллардан} other{# йиллардан}} кейин', + 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta, plural, =1{соатдан} one{# соатдан} few{# соатлардан} many{# соатлардан} other{# соатлардан}} кейин', + 'just now' => 'ҳозироқ', + 'the input value' => 'киритилган қиймат', + '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» аввалроқ банд қилинган.', + '{attribute} cannot be blank.' => '«{attribute}» тўлдириш шарт.', + '{attribute} contains wrong subnet mask.' => '', + '{attribute} is invalid.' => '«{attribute}» қиймати нотўғри', + '{attribute} is not a valid URL.' => '«{attribute}» тўғри URL эмас.', + '{attribute} is not a valid email address.' => '«{attribute}» тўғри электрон манзил эмас.', + '{attribute} is not in the allowed range.' => '', + '{attribute} must be "{requiredValue}".' => '«{attribute}» қиймати «{requiredValue}» га тенг бўлиши керак.', + '{attribute} must be a number.' => '«{attribute}» қиймати сон бўлиши керак.', + '{attribute} must be a string.' => '«{attribute}» қиймати матн бўлиши керак.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', + '{attribute} must be an integer.' => '«{attribute}» қиймати бутун сон бўлиши керак.', + '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» қиймати «{true}» ёки «{false}» бўлиши керак.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» дан катта бўлиши керак.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» дан катта ёки тенг бўлиши керак.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» дан кичкина бўлиши керак.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» дан кичик ёки тенг бўлиши керак.', + '{attribute} must be no greater than {max}.' => '«{attribute}» қиймати {max} дан ошмаслиги керак.', + '{attribute} must be no less than {min}.' => '«{attribute}» қиймати {min} дан катта бўлиши керак.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» қиймати «{compareValueOrAttribute}» қийматига тенг бўлмаслиги лозим.', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» қиймати минимум {min, number} {min, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ташкил топиши керак.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» қиймати максимум {max, number} {max, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ошмаслиги керак.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» қиймати {length, number} {length, plural, one{белгидан} few{белгидан} many{белгидан} other{белгидан}} ташкил топиши керак.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{кун} one{кун} few{# кун} many{# кун} other{# кун}} аввал', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{дақиқа} one{# дақиқа} few{# дақиқа} many{# дақиқа} other{# дақиқа}} аввал', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{ой} one{# ой} few{# ой} many{# ой} other{# ой}} аввал', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{сония} one{# сония} few{# сония} many{# сония} other{# сония}} аввал', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{йил} one{# йил} few{# йил} many{# йил} other{# йил}} аввал', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{соат} one{# соат} few{# соат} many{# соат} other{# соат}} аввал', + '{nFormatted} B' => '{nFormatted} Б', + '{nFormatted} GB' => '{nFormatted} ГБ', + '{nFormatted} GiB' => '{nFormatted} ГиБ', + '{nFormatted} KiB' => '{nFormatted} КиБ', + '{nFormatted} MB' => '{nFormatted} МБ', + '{nFormatted} MiB' => '{nFormatted} МиБ', + '{nFormatted} PB' => '{nFormatted} ПБ', + '{nFormatted} PiB' => '{nFormatted} ПиБ', + '{nFormatted} TB' => '{nFormatted} ТБ', + '{nFormatted} TiB' => '{nFormatted} ТиБ', + '{nFormatted} kB' => '', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{байт} few{байт} many{байтлар} other{байт}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{гибибайт} few{гибибайт} many{гибибайт} other{гибибайт}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{гигабайт} few{гигабайт} many{гигабайт} other{гигабайт}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{кибибайт} few{кибибайт} many{кибибайт} other{кибибайт}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{килобайт} few{килобайт} many{килобайт} other{килобайт}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{мебибайт} few{мебибайт} many{мебибайт} other{мебибайт}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{мегабайт} few{мегабайт} many{мегабайт} other{мегабайт}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{пебибайт} few{пебибайт} many{пебибайт} other{пебибайт}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{петабайт} few{петабайт} many{петабайт} other{петабайт}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{тебибайт} few{тебибайт} many{тебибайт} other{тебибайт}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{терабайт} few{терабайт} many{терабайт} other{терабайт}}', +]; diff --git a/framework/messages/uz/yii.php b/framework/messages/uz/yii.php index 306de73abcc..cf1a2f612f3 100644 --- a/framework/messages/uz/yii.php +++ b/framework/messages/uz/yii.php @@ -23,31 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - '{nFormatted} B' => '{nFormatted} B', - '{nFormatted} GB' => '{nFormatted} GB', - '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', - '{nFormatted} KiB' => '{nFormatted} KiB', - '{nFormatted} MB' => '{nFormatted} MB', - '{nFormatted} MiB' => '{nFormatted} MiB', - '{nFormatted} PB' => '{nFormatted} PB', - '{nFormatted} PiB' => '{nFormatted} PiB', - '{nFormatted} TB' => '{nFormatted} TB', - '{nFormatted} TiB' => '{nFormatted} TiB', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{bayt} few{bayt} many{baytlar} other{bayt}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{gibibayt} few{gibibayt} many{gibibayt} other{gibibayt}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{gigabayt} few{gigabayt} many{gigabayt} other{gigabayt}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{kibibayt} few{kibibayt} many{kibibayt} other{kibibayt}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{kilobayt} few{kilobayt} many{kilobayt} other{kilobayt}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{mebibayt} few{mebibayt} many{mebibayt} other{mebibayt}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{megabayt} few{megabayt} many{megabayt} other{megabayt}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{pebibayt} few{pebibayt} many{pebibayt} other{pebibayt}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{petabayt} few{petabayt} many{petabayt} other{petabayt}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{tebibayt} few{tebibayt} many{tebibayt} other{tebibayt}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{terabayt} few{terabayt} many{terabayt} other{terabayt}}', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(qiymatlanmagan)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Serverning ichki xatoligi yuz berdi.', 'Are you sure you want to delete this item?' => 'Siz rostdan ham ushbu elementni o`chirmoqchimisiz?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'O`chirish', 'Error' => 'Xato', 'File upload failed.' => 'Faylni yuklab bo`lmadi.', @@ -57,19 +40,22 @@ 'Missing required arguments: {params}' => 'Quyidagi zarur argumentlar mavjud emas: {params}', 'Missing required parameters: {params}' => 'Quyidagi zarur parametrlar mavjud emas: {params}', 'No' => 'Yo`q', - 'No help for unknown command "{command}".' => '"{command}" noaniq komanda uchun ma`lumotnoma mavjud emas.', - 'No help for unknown sub-command "{command}".' => '"{command}" noaniq qism komanda uchun ma`lumotnoma mavjud emas.', 'No results found.' => 'Hech nima topilmadi.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Faqat quyidagi MIME-turidagi fayllarni yuklashga ruhsat berilgan: {mimeTypes}.', 'Only files with these extensions are allowed: {extensions}.' => 'Faqat quyidagi kengaytmali fayllarni yuklashga ruhsat berilgan: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Sahifa topilmadi.', 'Please fix the following errors:' => 'Navbatdagi xatoliklarni to`g`rilang:', 'Please upload a file.' => 'Faylni yuklang.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Namoyish etilayabdi {begin, number}-{end, number} ta yozuv {totalCount, number} tadan.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '«{file}» fayl rasm emas.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '«{file}» fayl juda katta. O`lcham {formattedLimit} oshishi kerak emas.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '«{file}» fayl juda kichkina. O`lcham {formattedLimit} kam bo`lmasligi kerak.', 'The format of {attribute} is invalid.' => '«{attribute}» qiymatning formati noto`g`ri.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» fayl juda katta. Balandlik {limit, number} {limit, plural, one{pikseldan} few{pikseldan} many{pikseldan} other{pikseldan}} oshmasligi kerak.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» fayl juda katta. Eni {limit, number} {limit, plural, one{pikseldan} few{pikseldan} many{pikseldan} other{pikseldan}} oshmasligi kerak.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '«{file}» fayl juda kichkina. Balandlik {limit, number} {limit, plural, one{pikseldan} few{pikseldan} many{pikseldan} other{pikseldan}} kam bo`lmasligi kerak.', @@ -78,13 +64,15 @@ 'The verification code is incorrect.' => 'Tekshiruv kodi noto`g`ri.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Jami {count, number} {count, plural, one{yozuv} few{yozuv} many{yozuv} other{yozuv}}.', 'Unable to verify your data submission.' => 'Yuborilgan ma`lumotlarni tekshirib bo`lmadi.', - 'Unknown command "{command}".' => '"{command}" noaniq komanda.', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Noaniq opsiya: --{name}', 'Update' => 'Tahrirlash', 'View' => 'Ko`rish', 'Yes' => 'Ha', 'You are not allowed to perform this action.' => 'Sizga ushbu amalni bajarishga ruhsat berilmagan.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Siz {limit, number} {limit, plural, one{fayldan} few{fayllardan} many{fayllardan} other{fayllardan}} ko`pini yuklab ola olmaysiz.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => '{delta, plural, =1{kundan} one{# kundan} few{# kundan} many{# kunlardan} other{# kundan}} keyin', 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta, plural, =1{minutdan} one{# minutdan} few{# minutlardan} many{# minutdan} other{# minutlardan}} keyin', 'in {delta, plural, =1{a month} other{# months}}' => '{delta, plural, =1{oydan} one{# oydan} few{# oydan} many{# oylardan} other{# oylardan}} keyin', @@ -95,30 +83,65 @@ 'the input value' => 'kiritilgan qiymat', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» avvalroq band qilingan.', '{attribute} cannot be blank.' => '«{attribute}» to`ldirish shart.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '«{attribute}» qiymati noto`g`ri.', '{attribute} is not a valid URL.' => '«{attribute}» qiymati to`g`ri URL emas.', '{attribute} is not a valid email address.' => '«{attribute}» qiymati to`g`ri email manzil emas.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '«{attribute}» qiymati «{requiredValue}» ga teng bo`lishi kerak.', '{attribute} must be a number.' => '«{attribute}» qiymati son bo`lishi kerak.', '{attribute} must be a string.' => '«{attribute}» qiymati satr bo`lishi kerak.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '«{attribute}» qiymati butun son bo`lishi kerak.', '{attribute} must be either "{true}" or "{false}".' => '«{attribute}» qiymati «{true}» yoki «{false}» bo`lishi kerak.', - '{attribute} must be greater than "{compareValue}".' => '«{attribute}» qiymati «{compareValue}» dan katta bo`lishi kerak.', - '{attribute} must be greater than or equal to "{compareValue}".' => '«{attribute}» qiymati «{compareValue}» dan katta yoki teng bo`lishi kerak.', - '{attribute} must be less than "{compareValue}".' => '«{attribute}» qiymati «{compareValue}» dan kichkina bo`lishi kerak.', - '{attribute} must be less than or equal to "{compareValue}".' => '«{attribute}» qiymati «{compareValue}» dan kichik yoki teng bo`lishi kerak.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '«{attribute}» qiymati «{compareValueOrAttribute}» dan katta bo`lishi kerak.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '«{attribute}» qiymati «{compareValueOrAttribute}» dan katta yoki teng bo`lishi kerak.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '«{attribute}» qiymati «{compareValueOrAttribute}» dan kichkina bo`lishi kerak.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '«{attribute}» qiymati «{compareValueOrAttribute}» dan kichik yoki teng bo`lishi kerak.', '{attribute} must be no greater than {max}.' => '«{attribute}» qiymati {max} dan oshmasligi kerak.', '{attribute} must be no less than {min}.' => '«{attribute}» qiymati {min} dan kichkina bo`lmasligi kerak.', - '{attribute} must be repeated exactly.' => '«{attribute}» qiymati bir xil tarzda takrorlanishi kerak.', - '{attribute} must not be equal to "{compareValue}".' => '«{attribute}» qiymati «{compareValue}» ga teng bo`lmasligi kerak.', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '«{attribute}» qiymati «{compareValueOrAttribute}» qiymatiga teng bo`lmasligi lozim.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '«{attribute}» qiymati minimum {min, number} {min, plural, one{belgidan} few{belgidan} many{belgidan} other{belgidan}} tashkil topishi kerak.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '«{attribute}» qiymati maksimum {max, number} {max, plural, one{belgidan} few{belgidan} many{belgidan} other{belgidan}} oshmasligi kerak.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '«{attribute}» qiymati {length, number} {length, plural, one{belgidan} few{belgidan} many{belgidan} other{belgidan}} tashkil topishi kerak.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{kun} one{kun} few{# kun} many{# kun} other{# kun}} avval', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{daqiqa} one{# daqiqa} few{# daqiqa} many{# daqiqa} other{# daqiqa}} avval', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{oy} one{# oy} few{# oy} many{# oy} other{# oy}} avval', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{soniya} one{# soniya} few{# soniya} many{# soniya} other{# soniya}} avval', '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{yil} one{# yil} few{# yil} many{# yil} other{# yil}} avval', '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{soat} one{# soat} few{# soat} many{# soat} other{# soat}} avval', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{bayt} few{bayt} many{baytlar} other{bayt}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{gibibayt} few{gibibayt} many{gibibayt} other{gibibayt}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{gigabayt} few{gigabayt} many{gigabayt} other{gigabayt}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{kibibayt} few{kibibayt} many{kibibayt} other{kibibayt}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{kilobayt} few{kilobayt} many{kilobayt} other{kilobayt}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{mebibayt} few{mebibayt} many{mebibayt} other{mebibayt}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{megabayt} few{megabayt} many{megabayt} other{megabayt}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{pebibayt} few{pebibayt} many{pebibayt} other{pebibayt}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{petabayt} few{petabayt} many{petabayt} other{petabayt}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{tebibayt} few{tebibayt} many{tebibayt} other{tebibayt}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{terabayt} few{terabayt} many{terabayt} other{terabayt}}', ]; diff --git a/framework/messages/vi/yii.php b/framework/messages/vi/yii.php index 4bbc9f4896b..947442e6d21 100644 --- a/framework/messages/vi/yii.php +++ b/framework/messages/vi/yii.php @@ -24,9 +24,13 @@ */ return [ ' and ' => ' và ', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(không có)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => 'Máy chủ đã gặp sự cố nội bộ.', 'Are you sure you want to delete this item?' => 'Bạn có chắc là sẽ xóa mục này không?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => 'Xóa', 'Error' => 'Lỗi', 'File upload failed.' => 'Không tải được file lên.', @@ -36,19 +40,22 @@ 'Missing required arguments: {params}' => 'Thiếu đối số: {params}', 'Missing required parameters: {params}' => 'Thiếu tham số: {params}', 'No' => 'Không', - 'No help for unknown command "{command}".' => 'Không có trợ giúp cho lệnh không rõ "{command}"', - 'No help for unknown sub-command "{command}".' => 'Không có trợ giúp cho tiểu lệnh không rõ "{command}"', 'No results found.' => 'Không tìm thấy kết quả nào.', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Chỉ các file với kiểu MIME sau đây được phép tải lên: {mimeTypes}', 'Only files with these extensions are allowed: {extensions}.' => 'Chỉ các file với phần mở rộng sau đây được phép tải lên: {extensions}', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => 'Không tìm thấy trang.', 'Please fix the following errors:' => 'Vui lòng sửa các lỗi sau đây:', 'Please upload a file.' => 'Hãy tải file lên.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Trình bày {begin, number}-{end, number} trong số {totalCount, number} mục.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => 'File "{file}" phải là một ảnh.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'File "{file}" quá lớn. Kích cỡ tối đa được phép tải lên là {formattedLimit}.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'File "{file}" quá nhỏ. Kích cỡ tối thiểu được phép tải lên là {formattedLimit}.', 'The format of {attribute} is invalid.' => 'Định dạng của {attribute} không hợp lệ.', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'File "{file}" có kích thước quá lớn. Chiều cao tối đa được phép là {limit, number} pixel.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Ảnh "{file}" có kích thước quá lớn. Chiều rộng tối đa được phép là {limit, number} pixel.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Ảnh "{file}" quá nhỏ. Chiều cao của ảnh không được phép nhỏ hơn {limit, number} pixel.', @@ -57,13 +64,15 @@ 'The verification code is incorrect.' => 'Mã xác thực không đúng.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Tổng số {count, number} mục.', 'Unable to verify your data submission.' => 'Không kiểm tra được dữ liệu đã gửi lên.', - 'Unknown command "{command}".' => 'Lệnh không biết "{command}"', + 'Unknown alias: -{name}' => '', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Tùy chọn không biết: --{name}', 'Update' => 'Sửa', 'View' => 'Xem', 'Yes' => 'Có', 'You are not allowed to perform this action.' => 'Bạn không được phép truy cập chức năng này.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Chỉ có thể tải lên tối đa {limit, number} file.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', 'in {delta, plural, =1{a day} other{# days}}' => 'trong {delta} ngày', 'in {delta, plural, =1{a minute} other{# minutes}}' => 'trong {delta} phút', 'in {delta, plural, =1{a month} other{# months}}' => 'trong {delta} tháng', @@ -74,42 +83,65 @@ 'the input value' => 'giá trị đã nhập', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" đã bị sử dụng.', '{attribute} cannot be blank.' => '{attribute} không được để trống.', + '{attribute} contains wrong subnet mask.' => '', '{attribute} is invalid.' => '{attribute} không hợp lệ.', '{attribute} is not a valid URL.' => '{attribute} không phải là URL hợp lệ.', '{attribute} is not a valid email address.' => '{attribute} không phải là địa chỉ email hợp lệ.', + '{attribute} is not in the allowed range.' => '', '{attribute} must be "{requiredValue}".' => '{attribute} phải là "{requiredValue}"', '{attribute} must be a number.' => '{attribute} phải là số.', '{attribute} must be a string.' => '{attribute} phải là chuỗi.', + '{attribute} must be a valid IP address.' => '', + '{attribute} must be an IP address with specified subnet.' => '', '{attribute} must be an integer.' => '{attribute} phải là số nguyên.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} phải là "{true}" hoặc "{false}".', - '{attribute} must be greater than "{compareValue}".' => '{attribute} phải lớn hơn "{compareValue}"', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} phải lớn hơn hoặc bằng "{compareValue}"', - '{attribute} must be less than "{compareValue}".' => '{attribute} phải nhỏ hơn "{compareValue}"', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} phải nhỏ hơn hoặc bằng "{compareValue}"', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} phải bằng "{compareValueOrAttribute}"', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} phải lớn hơn "{compareValueOrAttribute}"', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} phải lớn hơn hoặc bằng "{compareValueOrAttribute}"', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} phải nhỏ hơn "{compareValueOrAttribute}"', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} phải nhỏ hơn hoặc bằng "{compareValueOrAttribute}"', '{attribute} must be no greater than {max}.' => '{attribute} không được lớn hơn {max}.', '{attribute} must be no less than {min}.' => '{attribute} không được nhỏ hơn {min}', - '{attribute} must be repeated exactly.' => '{attribute} phải lặp lại chính xác.', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} không được phép bằng "{compareValue}"', - '{attribute} must be equal to "{compareValue}".' => '{attribute} phải bằng "{compareValue}"', + '{attribute} must not be a subnet.' => '', + '{attribute} must not be an IPv4 address.' => '', + '{attribute} must not be an IPv6 address.' => '', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} không được phép bằng "{compareValueOrAttribute}"', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} phải chứa ít nhất {min, number} ký tự.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} phải chứa nhiều nhất {max, number} ký tự.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} phải bao gồm {length, number} ký tự.', + '{compareAttribute} is invalid.' => '', + '{delta, plural, =1{1 day} other{# days}}' => '', + '{delta, plural, =1{1 hour} other{# hours}}' => '', + '{delta, plural, =1{1 minute} other{# minutes}}' => '', + '{delta, plural, =1{1 month} other{# months}}' => '', + '{delta, plural, =1{1 second} other{# seconds}}' => '', + '{delta, plural, =1{1 year} other{# years}}' => '', '{delta, plural, =1{a day} other{# days}} ago' => '{delta} ngày trước', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} phút trước', '{delta, plural, =1{a month} other{# months}} ago' => '{delta} tháng trước', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} giây trước', '{delta, plural, =1{a year} other{# years}} ago' => '{delta} năm trước', '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} giờ trước', - '{n, plural, =1{# byte} other{# bytes}}' => '{n} byte', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n} gigabyte', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n} kilobyte', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n} megabyte', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n} petabyte', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n} terabyte', - '{n} B' => '{n} B', - '{n} GB' => '{n} GB', - '{n} KB' => '{n} KB', - '{n} MB' => '{n} MB', - '{n} PB' => '{n} PB', - '{n} TB' => '{n} TB', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '', + '{nFormatted} KiB' => '', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '', + '{nFormatted} kB' => '{nFormatted} kB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{n} byte', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} gigabyte', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} kilobyte', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} megabyte', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} petabyte', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} terabyte', ]; diff --git a/framework/messages/zh-TW/yii.php b/framework/messages/zh-TW/yii.php index 866b25d0f9b..c9bc82152c1 100644 --- a/framework/messages/zh-TW/yii.php +++ b/framework/messages/zh-TW/yii.php @@ -23,10 +23,14 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'Unknown alias: -{name}' => '未知的別名: -{name}', + ' and ' => '', + '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(未設定)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '內部系統錯誤。', 'Are you sure you want to delete this item?' => '您確定要刪除此項嗎?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => '', 'Delete' => '刪除', 'Error' => '錯誤', 'File upload failed.' => '未能上傳檔案。', @@ -36,22 +40,22 @@ 'Missing required arguments: {params}' => '參數不齊全:{params}', 'Missing required parameters: {params}' => '參數不齊全:{params}', 'No' => '否', - 'No help for unknown command "{command}".' => '子命令 "{command}" 發生未知的錯誤。', - 'No help for unknown sub-command "{command}".' => '子命令 "{command}" 發生未知的錯誤。', 'No results found.' => '沒有資料。', 'Only files with these MIME types are allowed: {mimeTypes}.' => '只允許這些MIME類型的文件: {mimeTypes}。', 'Only files with these extensions are allowed: {extensions}.' => '只可以使用以下擴充名的檔案:{extensions}。', + 'Operator "{operator}" must be used with a search attribute.' => '', + 'Operator "{operator}" requires multiple operands.' => '', + 'Options available: {options}' => '', 'Page not found.' => '找不到頁面。', 'Please fix the following errors:' => '請修正以下錯誤:', 'Please upload a file.' => '請上傳一個檔案。', - 'Powered by {yii}' => '技术支持 {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '第 {begin, number}-{end, number} 項,共 {totalCount, number} 項資料.', + 'The combination {values} of {attributes} has already been taken.' => '', 'The file "{file}" is not an image.' => '檔案 "{file}" 不是一個圖片檔案。', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '檔案"{file}"太大了。它的大小不可以超過{formattedLimit}。', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '文件"{file}"太小了。它的大小不可以小於{formattedLimit}。', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => '檔案 "{file}" 太大。它的大小不可以超過 {limit, number} 位元組。', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => '檔案 "{file}" 太小。它的大小不可以小於 {limit, number} 位元組。', 'The format of {attribute} is invalid.' => '屬性 {attribute} 的格式不正確。', + 'The format of {filter} is invalid.' => '', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '圖像 "{file}" 太大。它的高度不可以超過 {limit, number} 像素。', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '圖像 "{file}" 太大。它的寬度不可以超過 {limit, number} 像素。', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '圖像 "{file}" 太小。它的高度不可以小於 {limit, number} 像素。', @@ -60,14 +64,22 @@ 'The verification code is incorrect.' => '驗證碼不正確。', 'Total {count, number} {count, plural, one{item} other{items}}.' => '總計 {count, number} 項資料。', 'Unable to verify your data submission.' => '您提交的資料無法被驗證。', - 'Unknown command "{command}".' => '未知的指令 "{command}"。', + 'Unknown alias: -{name}' => '未知的別名: -{name}', + 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => '未知的選項:--{name}', 'Update' => '更新', 'View' => '查看', 'Yes' => '是', - 'Yii Framework' => 'Yii 框架', 'You are not allowed to perform this action.' => '您沒有執行此操作的權限。', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => '您最多可以上載 {limit, number} 個檔案。', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '', + 'in {delta, plural, =1{a day} other{# days}}' => '{delta}天後', + 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta}分鐘後', + 'in {delta, plural, =1{a month} other{# months}}' => '{delta}個月後', + 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta}秒後', + 'in {delta, plural, =1{a year} other{# years}}' => '{delta}年後', + 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta}小時後', + 'just now' => '剛剛', 'the input value' => '該輸入', '{attribute} "{value}" has already been taken.' => '{attribute} 的值 "{value}" 已經被佔用了。', '{attribute} cannot be blank.' => '{attribute} 不能為空白。', @@ -84,43 +96,35 @@ '{attribute} must be an integer.' => '{attribute} 必須為整數。', '{attribute} must be either "{true}" or "{false}".' => '{attribute} 必須為 "{true}" 或 "{false}"。', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute}必須等於"{compareValueOrAttribute}"。', - '{attribute} must be greater than "{compareValue}".' => '{attribute} 必須大於 "{compareValue}"。', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} 必須大或等於 "{compareValue}"。', - '{attribute} must be less than "{compareValue}".' => '{attribute} 必須小於 "{compareValue}"。', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} 必須少或等於 "{compareValue}"。', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} 必須大於 "{compareValueOrAttribute}"。', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} 必須大或等於 "{compareValueOrAttribute}"。', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} 必須小於 "{compareValueOrAttribute}"。', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} 必須少或等於 "{compareValueOrAttribute}"。', '{attribute} must be no greater than {max}.' => '{attribute} 不可以大於 {max}。', '{attribute} must be no less than {min}.' => '{attribute} 不可以少於 {min}。', '{attribute} must not be a subnet.' => '{attribute} 必須不是一個子網。', '{attribute} must not be an IPv4 address.' => '{attribute} 必須不是一個IPv4地址。', '{attribute} must not be an IPv6 address.' => '{attribute} 必須不是一個IPv6地址。', - '{attribute} must be repeated exactly.' => '{attribute} 必須重複一致。', - '{attribute} must not be equal to "{compareValue}".' => '{attribute} 不可以等於 "{compareValue}"。', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} 不可以等於 "{compareValueOrAttribute}"。', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} 應該包含至少 {min, number} 個字符。', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} 只能包含最多 {max, number} 個字符。', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} 應該包含 {length, number} 個字符。', - 'in {delta, plural, =1{a year} other{# years}}' => '{delta}年後', - 'in {delta, plural, =1{a month} other{# months}}' => '{delta}個月後', - 'in {delta, plural, =1{a day} other{# days}}' => '{delta}天後', - 'in {delta, plural, =1{an hour} other{# hours}}' => '{delta}小時後', - 'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta}分鐘後', - 'in {delta, plural, =1{a second} other{# seconds}}' => '{delta}秒後', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta} 天', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} 小時', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} 分鐘', '{delta, plural, =1{1 month} other{# months}}' => '{delta} 月', '{delta, plural, =1{1 second} other{# seconds}}' => '{delta} 秒', '{delta, plural, =1{1 year} other{# years}}' => '{delta} 年', - '{delta, plural, =1{a year} other{# years}} ago' => '{delta}年前', - '{delta, plural, =1{a month} other{# months}} ago' => '{delta}個月前', '{delta, plural, =1{a day} other{# days}} ago' => '{delta}天前', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta}小時前', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta}分鐘前', - 'just now' => '剛剛', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta}個月前', '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta}秒前', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta}年前', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta}小時前', '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -128,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} 字節', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} 千兆位二進制字節', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} 千兆字節', diff --git a/framework/messages/zh/yii.php b/framework/messages/zh/yii.php index 9d5447b89d7..7f1f3de35d9 100644 --- a/framework/messages/zh/yii.php +++ b/framework/messages/zh/yii.php @@ -26,6 +26,8 @@ ' and ' => ' 与 ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" 不支持操作 "{operator}"', '(not set)' => '(未设置)', + 'Action not found.' => '', + 'Aliases available: {aliases}' => '', 'An internal server error occurred.' => '服务器内部错误。', 'Are you sure you want to delete this item?' => '您确定要删除此项吗?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => '"{attribute}" 的条件应为一个值或有效的操作规约。', @@ -43,10 +45,10 @@ 'Only files with these extensions are allowed: {extensions}.' => '只允许使用以下文件扩展名的文件:{extensions}。', 'Operator "{operator}" must be used with a search attribute.' => '操作 "{operator}" 必须与一个搜索属性一起使用。', 'Operator "{operator}" requires multiple operands.' => '操作 "{operator}" 需要多个操作数。', + 'Options available: {options}' => '', 'Page not found.' => '页面未找到。', 'Please fix the following errors:' => '请修复以下错误', 'Please upload a file.' => '请上传一个文件。', - 'Powered by {yii}' => '技术支持 {yii}', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '第{begin, number}-{end, number}条,共{totalCount, number}条数据.', 'The combination {values} of {attributes} has already been taken.' => '{attributes} 的值 "{values}" 已经被占用了。', 'The file "{file}" is not an image.' => '文件 "{file}" 不是一个图像文件。', @@ -68,7 +70,6 @@ 'Update' => '更新', 'View' => '查看', 'Yes' => '是', - 'Yii Framework' => 'Yii 框架', 'You are not allowed to perform this action.' => '您没有执行此操作的权限。', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => '您最多上传{limit, number}个文件。', 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => '需要至少 {limit, number} 个文件。', @@ -108,6 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute}应该包含至少{min, number}个字符。', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute}只能包含至多{max, number}个字符。', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute}应该包含{length, number}个字符。', + '{compareAttribute} is invalid.' => '', '{delta, plural, =1{1 day} other{# days}}' => '{delta} 天', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} 小时', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} 分钟', @@ -123,7 +125,6 @@ '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', - '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} KiB' => '{nFormatted} KiB', '{nFormatted} MB' => '{nFormatted} MB', '{nFormatted} MiB' => '{nFormatted} MiB', @@ -131,6 +132,7 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} kB' => '{nFormatted} kB', '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} 字节', '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} 千兆二进制字节', '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} 千兆字节', From c9ac82d85db77bc0f8dd92a068be8aa5af1c3c00 Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Mon, 23 Oct 2023 21:46:23 +0330 Subject: [PATCH 045/125] Fixed #20023, Added `eol=lf` to `.gitattributes` file. (#20026) Signed-off-by: Nabi --- .gitattributes | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.gitattributes b/.gitattributes index 08f809af71e..044c0a1615e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,16 +4,16 @@ # ...Unless the name matches the following overriding patterns # Definitively text files -*.php text -*.css text -*.js text -*.txt text -*.md text -*.xml text -*.json text -*.bat text -*.sql text -*.yml text +*.php text eol=lf +*.css text eol=lf +*.js text eol=lf +*.txt text eol=lf +*.md text eol=lf +*.xml text eol=lf +*.json text eol=lf +*.bat text eol=lf +*.sql text eol=lf +*.yml text eol=lf # Ensure those won't be messed up with *.png binary From 2141f9abdfbdeffdc0c245f7850bf397b3b9e409 Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Mon, 23 Oct 2023 20:49:27 +0200 Subject: [PATCH 046/125] Improve performance of handling `ErrorHandler::$memoryReserveSize` --- framework/CHANGELOG.md | 1 + framework/base/ErrorHandler.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 469a23773da..69bcec2bd81 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -10,6 +10,7 @@ Yii Framework 2 Change Log - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) +- Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) 2.0.49.2 October 12, 2023 ------------------------- diff --git a/framework/base/ErrorHandler.php b/framework/base/ErrorHandler.php index 81a20f0a3c9..393438ede57 100644 --- a/framework/base/ErrorHandler.php +++ b/framework/base/ErrorHandler.php @@ -94,7 +94,7 @@ public function register() set_error_handler([$this, 'handleError']); } if ($this->memoryReserveSize > 0) { - $this->_memoryReserve = str_pad('', $this->memoryReserveSize, 'x'); + $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize); } // to restore working directory in shutdown handler if (PHP_SAPI !== 'cli') { From 6c19ba1c77e70bceb6e0a617660d1a34df7bd8da Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Tue, 24 Oct 2023 11:51:28 +0330 Subject: [PATCH 047/125] Effectiveness eol=lf on all text file extensions, in .gitattributes file (#20035) * Fixed #20023, Added `eol=lf` to `.gitattributes` file. Signed-off-by: Nabi * Fix #20023: Effectiveness eol=lf on all file extensions, in .gitattributes file. Signed-off-by: Nabi --------- Signed-off-by: Nabi --- .gitattributes | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.gitattributes b/.gitattributes index 044c0a1615e..1d3d767fd32 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,19 +1,19 @@ # Autodetect text files -* text=auto +* text=auto eol=lf # ...Unless the name matches the following overriding patterns # Definitively text files -*.php text eol=lf -*.css text eol=lf -*.js text eol=lf -*.txt text eol=lf -*.md text eol=lf -*.xml text eol=lf -*.json text eol=lf -*.bat text eol=lf -*.sql text eol=lf -*.yml text eol=lf +*.php text +*.css text +*.js text +*.txt text +*.md text +*.xml text +*.json text +*.bat text +*.sql text +*.yml text # Ensure those won't be messed up with *.png binary From 778d708c4f028c6997ff42ee2e1aead86cce3a64 Mon Sep 17 00:00:00 2001 From: Nabi KaramAliZadeh Date: Tue, 24 Oct 2023 11:55:08 +0330 Subject: [PATCH 048/125] Fix fa messages (#20037) * Fix 20016: Updating the Persian translation message file. Signed-off-by: Nabi * Fix 20036: Updating the Persian translation message file. Signed-off-by: Nabi --------- Signed-off-by: Nabi --- framework/messages/fa/yii.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/messages/fa/yii.php b/framework/messages/fa/yii.php index 86d08922ca8..e9213b3482f 100644 --- a/framework/messages/fa/yii.php +++ b/framework/messages/fa/yii.php @@ -27,7 +27,7 @@ '"{attribute}" does not support operator "{operator}".' => '"{attribute}" از عملگر "{operator}" پشتیبانی نمی‌کند.', '(not set)' => '(تنظیم نشده)', 'Action not found.' => 'عمل یافت نشد.', - 'Aliases available: {aliases}' => 'نام مستعارهای موجود: {aliases}', + 'Aliases available: {aliases}' => 'نام‌های مستعار موجود: {aliases}', 'An internal server error occurred.' => 'خطای داخلی سرور رخ داده است.', 'Are you sure you want to delete this item?' => 'آیا اطمینان به حذف این مورد دارید؟', 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'شرط برای "{attribute}" باید یک مقدار یا مشخصه‌ی عملگر معتبر باشد.', @@ -49,11 +49,11 @@ 'Page not found.' => 'صفحه‌ای یافت نشد.', 'Please fix the following errors:' => 'لطفاً خطاهای زیر را رفع نمائید:', 'Please upload a file.' => 'لطفاً یک فایل آپلود کنید.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'نمایش {begin, number} تا {end, number} مورد از کل {totalCount, number} مورد.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'نمایش {begin, number} تا {end, number} مورد از کل {totalCount, number} مورد.', 'The combination {values} of {attributes} has already been taken.' => 'مقدار {values} از {attributes} قبلاً گرفته شده است.', 'The file "{file}" is not an image.' => 'فایل "{file}" یک تصویر نیست.', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'حجم فایل "{file}" بسیار بیشتر می‌باشد. حجم آن نمی‌تواند از {formattedLimit} بیشتر باشد.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'حجم فایل "{file}" بسیار کم می‌باشد. حجم آن‌نمی تواند از {formattedLimit} کمتر باشد.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'حجم فایل "{file}" بسیار کم می‌باشد. حجم آن نمی‌تواند از {formattedLimit} کمتر باشد.', 'The format of {attribute} is invalid.' => 'قالب {attribute} نامعتبر است.', 'The format of {filter} is invalid.' => 'قالب {filter} نامعتبر است.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'تصویر "{file}" خیلی بزرگ است. ارتفاع نمی‌تواند بزرگتر از {limit, number} پیکسل باشد.', @@ -87,7 +87,7 @@ '{attribute} is invalid.' => '{attribute} معتبر نیست.', '{attribute} is not a valid URL.' => '{attribute} یک URL معتبر نیست.', '{attribute} is not a valid email address.' => '{attribute} یک آدرس ایمیل معتبر نیست.', - '{attribute} is not in the allowed range.' => '{attribute} در محدوده مجاز نمی‎باشد.', + '{attribute} is not in the allowed range.' => '{attribute} در محدوده مجاز نمی‌باشد.', '{attribute} must be "{requiredValue}".' => '{attribute} باید "{requiredValue}" باشد.', '{attribute} must be a number.' => '{attribute} باید یک عدد باشد.', '{attribute} must be a string.' => '{attribute} باید یک رشته باشد.', From 4b7669cf08c1ae1e3a32a4cc8c4a6f355b84707b Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 25 Oct 2023 08:37:18 -0300 Subject: [PATCH 049/125] Fix boolean type `MYSQL`. --- framework/db/mysql/Schema.php | 2 +- tests/framework/db/mysql/type/BooleanTest.php | 249 ++++++++++++++++++ 2 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 tests/framework/db/mysql/type/BooleanTest.php diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index fa2270eb77d..666279e3b98 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -279,7 +279,7 @@ protected function loadColumnSchema($info) if (isset($values[1])) { $column->scale = (int) $values[1]; } - if ($column->size === 1 && $type === 'bit') { + if ($column->size === 1 && ($type === 'tinyint' || $type === 'bit')) { $column->type = 'boolean'; } elseif ($type === 'bit') { if ($column->size > 32) { diff --git a/tests/framework/db/mysql/type/BooleanTest.php b/tests/framework/db/mysql/type/BooleanTest.php new file mode 100644 index 00000000000..5f8326134b6 --- /dev/null +++ b/tests/framework/db/mysql/type/BooleanTest.php @@ -0,0 +1,249 @@ +getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `false` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => false, 'bool_col_bit' => false])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + $this->assertEquals(0, $boolValues['bool_col_tinyint']); + $this->assertEquals(0, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertFalse($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertFalse($phpTypeCastBoolColBit); + + // test value `true` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => true, 'bool_col_bit' => true])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueInteger() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `0` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 0, 'bool_col_bit' => 0])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + $this->assertEquals(0, $boolValues['bool_col_tinyint']); + $this->assertEquals(0, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertFalse($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertFalse($phpTypeCastBoolColBit); + + // test value `1` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 1, 'bool_col_bit' => 1])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueNegative() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `-1` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => -1, 'bool_col_bit' => -1])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueNull() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `null` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => null, 'bool_col_bit' => null])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertNull($boolValues['bool_col_tinyint']); + $this->assertNull($boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertNull($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertNull($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueOverflow() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `2` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 2, 'bool_col_bit' => 2])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } +} From 18ed620e7890de315409a28f720be794a15f4434 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 25 Oct 2023 08:57:40 -0300 Subject: [PATCH 050/125] Update tests. --- tests/framework/db/mysql/SchemaTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/framework/db/mysql/SchemaTest.php b/tests/framework/db/mysql/SchemaTest.php index 4e602a317ea..82342419a8c 100644 --- a/tests/framework/db/mysql/SchemaTest.php +++ b/tests/framework/db/mysql/SchemaTest.php @@ -228,9 +228,13 @@ public function getExpectedColumns() ] ); + $columns['bool_col']['type'] = 'boolean'; + $columns['bool_col']['phpType'] = 'boolean'; + $columns['bool_col2']['type'] = 'boolean'; + $columns['bool_col2']['phpType'] = 'boolean'; + if (version_compare($version, '5.7', '<')) { $columns['int_col3']['phpType'] = 'string'; - $columns['json_col']['type'] = 'text'; $columns['json_col']['dbType'] = 'longtext'; $columns['json_col']['phpType'] = 'string'; From e2773e452491f2664d4ef0d11e2bb557c6d19112 Mon Sep 17 00:00:00 2001 From: Saleh Hashemi <81674631+salehhashemi1992@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:17:03 +0330 Subject: [PATCH 051/125] Fix #20032: Added `mask` method for string masking with multibyte support --- framework/CHANGELOG.md | 2 ++ framework/helpers/BaseStringHelper.php | 30 ++++++++++++++++++ tests/framework/helpers/StringHelperTest.php | 32 ++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 69bcec2bd81..ec2923a1e51 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -11,6 +11,8 @@ Yii Framework 2 Change Log - Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) +- Enh #20032: Added `mask` method for string masking with multibyte support (salehhashemi1992) + 2.0.49.2 October 12, 2023 ------------------------- diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index 60261f9828a..e9c5327b031 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -497,4 +497,34 @@ public static function mb_ucwords($string, $encoding = 'UTF-8') return implode('', $parts); } + + /** + * Masks a portion of a string with a repeated character. + * This method is multibyte-safe. + * + * @param string $string The input string. + * @param int $start The starting position from where to begin masking. + * This can be a positive or negative integer. + * Positive values count from the beginning, + * negative values count from the end of the string. + * @param int $length The length of the section to be masked. + * The masking will start from the $start position + * and continue for $length characters. + * @param string $mask The character to use for masking. The default is '*'. + * @return string The masked string. + */ + public static function mask($string, $start, $length, $mask = '*') { + $strLength = mb_strlen($string, 'UTF-8'); + + // Return original string if start position is out of bounds + if ($start >= $strLength || $start < -$strLength) { + return $string; + } + + $masked = mb_substr($string, 0, $start, 'UTF-8'); + $masked .= str_repeat($mask, abs($length)); + $masked .= mb_substr($string, $start + abs($length), null, 'UTF-8'); + + return $masked; + } } diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index 56acdb0c268..a640e5cdda2 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -474,4 +474,36 @@ public function dataProviderDirname() ['', ''], ]; } + + public function testMask() + { + // Standard masking + $this->assertSame('12******90', StringHelper::mask('1234567890', 2, 6)); + $this->assertSame('a********j', StringHelper::mask('abcdefghij', 1, 8)); + $this->assertSame('*************', StringHelper::mask('Hello, World!', 0, 13)); + $this->assertSame('************!', StringHelper::mask('Hello, World!', 0, 12)); + $this->assertSame('Hello, *orld!', StringHelper::mask('Hello, World!', 7, 1)); + $this->assertSame('Saleh Hashemi', StringHelper::mask('Saleh Hashemi', 0, 0)); + + // Different Mask Character + $this->assertSame('12######90', StringHelper::mask('1234567890', 2, 6, '#')); + + // Positions outside the string + $this->assertSame('1234567890', StringHelper::mask('1234567890', 20, 6)); + $this->assertSame('1234567890', StringHelper::mask('1234567890', -20, 6)); + + // Negative values for start + $this->assertSame('1234****90', StringHelper::mask('1234567890', -6, 4)); + + // type-related edge case + $this->assertSame('1234****90', StringHelper::mask(1234567890, -6, 4)); + + // Multibyte characters + $this->assertSame('你**', StringHelper::mask('你好吗', 1, 2)); + $this->assertSame('你好吗', StringHelper::mask('你好吗', 4, 2)); + + // Special characters + $this->assertSame('em**l@email.com', StringHelper::mask('email@email.com', 2, 2)); + $this->assertSame('******email.com', StringHelper::mask('email@email.com', 0, 6)); + } } From 9d3c71d6a712a99f42ae1c5d588312f49514523a Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:47:46 -0300 Subject: [PATCH 052/125] Fix #20040: Fix type `boolean` in `MSSQL` --- framework/CHANGELOG.md | 2 +- framework/db/mssql/Schema.php | 41 +++- tests/framework/db/mssql/type/BooleanTest.php | 198 ++++++++++++++++++ 3 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 tests/framework/db/mssql/type/BooleanTest.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ec2923a1e51..42ce39634cd 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ - +- Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) diff --git a/framework/db/mssql/Schema.php b/framework/db/mssql/Schema.php index 005b1555f78..db7f07c87cb 100644 --- a/framework/db/mssql/Schema.php +++ b/framework/db/mssql/Schema.php @@ -375,6 +375,7 @@ protected function resolveTableNames($table, $name) */ protected function loadColumnSchema($info) { + $isVersion2017orLater = version_compare($this->db->getSchema()->getServerVersion(), '14', '>='); $column = $this->createColumnSchema(); $column->name = $info['column_name']; @@ -393,20 +394,21 @@ protected function loadColumnSchema($info) if (isset($this->typeMap[$type])) { $column->type = $this->typeMap[$type]; } + + if ($isVersion2017orLater && $type === 'bit') { + $column->type = 'boolean'; + } + if (!empty($matches[2])) { $values = explode(',', $matches[2]); $column->size = $column->precision = (int) $values[0]; + if (isset($values[1])) { $column->scale = (int) $values[1]; } - if ($column->size === 1 && ($type === 'tinyint' || $type === 'bit')) { - $column->type = 'boolean'; - } elseif ($type === 'bit') { - if ($column->size > 32) { - $column->type = 'bigint'; - } elseif ($column->size === 32) { - $column->type = 'integer'; - } + + if ($isVersion2017orLater === false) { + $column->type = $this->booleanTypeLegacy($column->size, $type); } } } @@ -813,4 +815,27 @@ public function createColumnSchemaBuilder($type, $length = null) { return Yii::createObject(ColumnSchemaBuilder::className(), [$type, $length, $this->db]); } + + /** + * Assigns a type boolean for the column type bit, for legacy versions of MSSQL. + * + * @param int $size column size. + * @param string $type column type. + * + * @return string column type. + */ + private function booleanTypeLegacy($size, $type) + { + if ($size === 1 && ($type === 'tinyint' || $type === 'bit')) { + return 'boolean'; + } elseif ($type === 'bit') { + if ($size > 32) { + return 'bigint'; + } elseif ($size === 32) { + return 'integer'; + } + } + + return $type; + } } diff --git a/tests/framework/db/mssql/type/BooleanTest.php b/tests/framework/db/mssql/type/BooleanTest.php new file mode 100644 index 00000000000..97fd7124519 --- /dev/null +++ b/tests/framework/db/mssql/type/BooleanTest.php @@ -0,0 +1,198 @@ +getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `false` + $db->createCommand()->insert($tableName, ['bool_col' => false])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(0, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertFalse($phpTypeCast); + + // test value `true` + $db->createCommand()->insert($tableName, ['bool_col' => true])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 2")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueInteger() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value 0 + $db->createCommand()->insert($tableName, ['bool_col' => 0])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(0, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertFalse($phpTypeCast); + + // test value 1 + $db->createCommand()->insert($tableName, ['bool_col' => 1])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 2")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanValueNegative() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value 2 + $db->createCommand()->insert($tableName, ['bool_col' => -1])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueNull() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `null` + $db->createCommand()->insert($tableName, ['bool_col' => null])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertNull($boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertNull($phpTypeCast); + } + + public function testBooleanWithValueOverflow() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value 2 + $db->createCommand()->insert($tableName, ['bool_col' => 2])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } +} From 7005d2775b68003927cbf82efbdba823c1819a30 Mon Sep 17 00:00:00 2001 From: Rene Saare Date: Wed, 25 Oct 2023 19:53:45 +0300 Subject: [PATCH 053/125] Fix #20042: Add empty array check to `ActiveQueryTrait::findWith()` --- framework/CHANGELOG.md | 1 + framework/db/ActiveQueryTrait.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 42ce39634cd..13fb6e3d93b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -11,6 +11,7 @@ Yii Framework 2 Change Log - Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) +- Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) - Enh #20032: Added `mask` method for string masking with multibyte support (salehhashemi1992) diff --git a/framework/db/ActiveQueryTrait.php b/framework/db/ActiveQueryTrait.php index e2de1dd12d9..d49fa0fba87 100644 --- a/framework/db/ActiveQueryTrait.php +++ b/framework/db/ActiveQueryTrait.php @@ -135,6 +135,10 @@ protected function createModels($rows) */ public function findWith($with, &$models) { + if (empty($models)) { + return; + } + $primaryModel = reset($models); if (!$primaryModel instanceof ActiveRecordInterface) { /* @var $modelClass ActiveRecordInterface */ From f0628dfab5e5f78b1fd73f98df7be4bf649eccb3 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 25 Oct 2023 14:02:42 -0300 Subject: [PATCH 054/125] Fix error typo. --- tests/framework/db/mysql/type/BooleanTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/framework/db/mysql/type/BooleanTest.php b/tests/framework/db/mysql/type/BooleanTest.php index 5f8326134b6..bc9d307a78d 100644 --- a/tests/framework/db/mysql/type/BooleanTest.php +++ b/tests/framework/db/mysql/type/BooleanTest.php @@ -7,7 +7,7 @@ namespace yiiunit\framework\db\mysql\type; -use yii\db\mssql\Schema; +use yii\db\mysql\Schema; use yiiunit\framework\db\DatabaseTestCase; /** From 1d35584ec9f407c2ad89c3a15c5d8c362406c021 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 25 Oct 2023 14:39:54 -0300 Subject: [PATCH 055/125] Add changelog line. --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 13fb6e3d93b..5518b2bb582 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,6 +3,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #20045: Fix type `boolean` in `MYSQL` (terabytesoftw) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) From b40de6a5380819472f5bde6c5d120e9c83146c87 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Thu, 26 Oct 2023 05:05:34 -0300 Subject: [PATCH 056/125] Update framework/CHANGELOG.md Co-authored-by: Robert Korulczyk --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 5518b2bb582..a80668a4524 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ -- Bug #20045: Fix type `boolean` in `MYSQL` (terabytesoftw) +- Bug #20045: Fix type `boolean` in `MySQL` (terabytesoftw) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) From 6e6174deaac5f1781da3435ab0a707402a95bd38 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 26 Oct 2023 12:59:15 -0300 Subject: [PATCH 057/125] Add test for boolean type `SQLite`. --- .../framework/db/sqlite/type/BooleanTest.php | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 tests/framework/db/sqlite/type/BooleanTest.php diff --git a/tests/framework/db/sqlite/type/BooleanTest.php b/tests/framework/db/sqlite/type/BooleanTest.php new file mode 100644 index 00000000000..c5bfd811c11 --- /dev/null +++ b/tests/framework/db/sqlite/type/BooleanTest.php @@ -0,0 +1,249 @@ +getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `false` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => false, 'bool_col_bit' => false])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + $this->assertEquals(0, $boolValues['bool_col_tinyint']); + $this->assertEquals(0, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertFalse($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertFalse($phpTypeCastBoolColBit); + + // test value `true` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => true, 'bool_col_bit' => true])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueInteger() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `0` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 0, 'bool_col_bit' => 0])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + $this->assertEquals(0, $boolValues['bool_col_tinyint']); + $this->assertEquals(0, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertFalse($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertFalse($phpTypeCastBoolColBit); + + // test value `1` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 1, 'bool_col_bit' => 1])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueNegative() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `-1` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => -1, 'bool_col_bit' => -1])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueNull() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `null` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => null, 'bool_col_bit' => null])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertNull($boolValues['bool_col_tinyint']); + $this->assertNull($boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertNull($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertNull($phpTypeCastBoolColBit); + } + + public function testBooleanWithValueOverflow() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), + ] + )->execute(); + + // test type `boolean` + $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); + $this->assertSame('boolean', $columnBoolColTinyint->phpType); + + $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); + $this->assertSame('boolean', $columnBoolColBit->phpType); + + // test value `2` + $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 2, 'bool_col_bit' => 2])->execute(); + $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); + + $this->assertEquals(1, $boolValues['bool_col_tinyint']); + $this->assertEquals(1, $boolValues['bool_col_bit']); + + // test php typecast + $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); + $this->assertTrue($phpTypeCastBoolColTinyint); + + $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); + $this->assertTrue($phpTypeCastBoolColBit); + } +} From f3c1d0cba7a83100a97a6728becbd4a9de46313a Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 26 Oct 2023 13:07:23 -0300 Subject: [PATCH 058/125] Add test for boolean type `PostgreSQL`. --- tests/framework/db/pgsql/type/BooleanTest.php | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 tests/framework/db/pgsql/type/BooleanTest.php diff --git a/tests/framework/db/pgsql/type/BooleanTest.php b/tests/framework/db/pgsql/type/BooleanTest.php new file mode 100644 index 00000000000..4a9b21df249 --- /dev/null +++ b/tests/framework/db/pgsql/type/BooleanTest.php @@ -0,0 +1,239 @@ +getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `false` + $db->createCommand()->insert($tableName, ['bool_col' => false])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(0, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertFalse($phpTypeCast); + + // test value `true` + $db->createCommand()->insert($tableName, ['bool_col' => true])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 2")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueInteger() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `0` + $db->createCommand()->insert($tableName, ['bool_col' => 0])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(0, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertFalse($phpTypeCast); + + // test value `1` + $db->createCommand()->insert($tableName, ['bool_col' => 1])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 2")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueNegative() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `-1` + $db->createCommand()->insert($tableName, ['bool_col' => '-1'])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueNull() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `null` + $db->createCommand()->insert($tableName, ['bool_col' => null])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertNull($boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertNull($phpTypeCast); + } + + public function testBooleanWithValueOverflow() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `2` + $db->createCommand()->insert($tableName, ['bool_col' => 2])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } + + public function testBooleanWithValueString() + { + $db = $this->getConnection(true); + $schema = $db->getSchema(); + $tableName = '{{%boolean}}'; + + if ($db->getTableSchema($tableName)) { + $db->createCommand()->dropTable($tableName)->execute(); + } + + $db->createCommand()->createTable( + $tableName, + [ + 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), + 'bool_col' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), + ] + )->execute(); + + // test type `boolean` + $column = $db->getTableSchema($tableName)->getColumn('bool_col'); + $this->assertSame('boolean', $column->phpType); + + // test value `0` + $db->createCommand()->insert($tableName, ['bool_col' => '0'])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 1")->queryScalar(); + $this->assertEquals(0, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertFalse($phpTypeCast); + + // test value `1` + $db->createCommand()->insert($tableName, ['bool_col' => '1'])->execute(); + $boolValue = $db->createCommand("SELECT bool_col FROM $tableName WHERE id = 2")->queryScalar(); + $this->assertEquals(1, $boolValue); + + // test php typecast + $phpTypeCast = $column->phpTypecast($boolValue); + $this->assertTrue($phpTypeCast); + } +} From cb8307fad94d971d2012edf865d04490d10026dd Mon Sep 17 00:00:00 2001 From: Saleh Hashemi <81674631+salehhashemi1992@users.noreply.github.com> Date: Fri, 27 Oct 2023 22:23:07 +0330 Subject: [PATCH 059/125] Fix various linguistic and stylistic issues in Persian core-code-style file (#20054) --- docs/internals-fa/core-code-style.md | 250 ++++++++++++++------------- 1 file changed, 126 insertions(+), 124 deletions(-) diff --git a/docs/internals-fa/core-code-style.md b/docs/internals-fa/core-code-style.md index e63e2b77951..3becc5802b1 100644 --- a/docs/internals-fa/core-code-style.md +++ b/docs/internals-fa/core-code-style.md @@ -1,49 +1,52 @@ رعایت اصول و سبک کدنویسی فریمورک Yii2 =============================== -

-سبک کدنویسی که در نسخه 2 فریمورک و extension های رسمی استفاده میشه دارای اصول، قواعد و قانون های خودش هست. پس اگر تصمیم دارید چیزی به هسته اضافه کنید باید این قواعد رو در نظر بگیرید حتی در غیر این صورت هم رعایت این موارد خالی از لطف نیست و توصیه میکنم این کارُ انجام بدین. در حالی که میتونید راحت باشید، شما مجبور به رعایت این سبک در application خودتون نیستید... +

+سبک کدنویسی که در نسخه 2 فریمورک و extension های رسمی استفاده میشه دارای اصول، قواعد و قانون های خودش هست. پس اگر تصمیم دارید چیزی به هسته اضافه کنید باید این قواعد رو در نظر بگیرید حتی در غیر این صورت هم رعایت این موارد خالی از لطف نیست و توصیه می‌کنم این کارو انجام بدین. + +البته که نیاز نیست حتما این موارد رو در برنامه‌های خودتون رعایت کنید و می تونید در این مورد راحت باشید...

-

-میتونید برای دریافت پیکره بندی CodeSniffer اینجا رو مطالعه کنید: https://github.com/yiisoft/yii2-coding-standards +

+می‌تونید برای دریافت پیکربندی CodeSniffer اینجا رو مطالعه کنید: https://github.com/yiisoft/yii2-coding-standards

## 1. نگاه کلی -

-به طور کلی ما از سبک PSR-2 استفاده میکنیم و هر چیزی که در این سبک وجود داره اینجا هم هست. -(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)

- -

در فایل ها باید از برچسب های php?> و =?> استفاده شود.

-

در پایان هر فایل باید یک خط جدید(newline) داشته باشید.

-

encoding فایل برای کد های php باید UTF-8 without BOM باشد.

-

به جای tab از 4 فضای خالی(space) استفاده کنید.

-

نام کلاس ها باید به صورت StudlyCaps تعریف شوند.

-

ثابت های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده "_" تعریف شوند.

-

نام متد ها و پراپرتی ها باید به صورت camelCase تعریف شوند.

-

پراپرتی های خصوصی(private) باید با "_" شروع شوند.

-

همیشه از elseif جای else if استفاده کنید.

- -## 2. فایل ها - -

در فایل ها باید از برچسب های php?> و =?> استفاده کرد نه از ?> .

-

در انتهای فایل های php نباید از تگ -

در انتهای هر خط نباید space وجود داشته باشد

-

پسوند فایل هایی که شامل کد php هستند باید php. باشد.

-

encoding فایل برای کد های php باید UTF-8 without BOM باشد.

- - -## 3. نام کلاس ها -

-نام کلاس ها باید به صورت StudlyCaps تعریف شوند. به عنوان مثال, `Controller`, `Model`.

- -## 4. کلاس ها - -

نام کلاس ها باید به صورت CamelCase تعریف شوند.

-

آکولاد باز باید در خط بعدی، زیر نام کلاس نوشته شود.

-

تمام کلاس ها باید بلاک مستندات مطابق استاندارد PHPDoc داشته باشند.

-

برای تمام کد های داخل کلاس باید با 4 space فاصله ایجاد کنید.

-

فقط یک کلاس داخل هر فایل php باید موجود باشد.

-

تمام کلاس ها باید namespaced داشته باشند.

-

نام کلاس باید معال نام فایل و namespace باید مطابق مسیر آن باشد.

+

+به طور کلی ما از سبک کدنویسی PSR-2 پیروی می‌کنیم: + +https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

+ +

در فایل‌ها باید از برچسب‌های php?> و =?> استفاده شود.

+

در پایان هر فایل باید یک خط جدید (newline) داشته باشید.

+

encoding فایل برای کدهای php باید UTF-8 without BOM باشد.

+

به جای tab از 4 فضای خالی (space) استفاده کنید.

+

نام کلاس‌ها باید به صورت StudlyCaps تعریف شوند.

+

ثابت‌های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده "_" تعریف شوند.

+

نام متدها و پراپرتی‌ها باید به صورت camelCase تعریف شوند.

+

پراپرتی‌های خصوصی (private) باید با "_" شروع شوند.

+

همیشه از elseif جای else if استفاده کنید.

+ +## 2. فایل‌ها + +

در فایل‌ها باید از برچسب های php?> و =?> استفاده کرد نه از ?> .

+

در انتهای فایل‌های php نباید از تگ ?> استفاده کنید.

+

در انتهای هر خط نباید space وجود داشته باشد.

+

پسوند فایل‌هایی که شامل کد php هستند باید php. باشد.

+

encoding فایل برای کدهای php باید UTF-8 without BOM باشد.

+ + +## 3. نام کلاس‌ها +

+نام کلاس‌ها باید به صورت StudlyCaps تعریف شوند. به عنوان مثال، `Controller` و `Model`.

+ +## 4. کلاس‌ها + +

نام کلاس‌ها باید به صورت CamelCase تعریف شوند.

+

آکولاد باز باید در خط بعدی، زیر نام کلاس نوشته شود.

+

تمام کلاس‌ها باید بلاک مستندات مطابق استاندارد PHPDoc داشته باشند.

+

برای تمام کدهای داخل کلاس باید با 4 space فاصله ایجاد کنید.

+

فقط یک کلاس داخل هر فایل php باید موجود باشد.

+

تمام کلاس‌ها باید namespaced داشته باشند.

+

نام کلاس باید معادل نام فایل و namespace باید مطابق مسیر آن باشد.

```php /** @@ -55,9 +58,9 @@ class MyClass extends \yii\base\BaseObject implements MyInterface } ``` -### 4.1. ثابت ها -

-ثابت های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده "_" تعریف شوند.

+### 4.1. ثابت‌ها +

+ثابت‌های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده "_" تعریف شوند.

```php از کلید واژه های public، protected و private استفاده کنید.

-

پراپرتی های public و protected باید در بالای کلاس و قبل از متد ها تعریف شوند. private هم همینطور اما ممکن هست کاهی قبل از متدی که با آن مرتبط هست آورده شود.

-

ترتیب تعریف پراپرتی ها باید به صورت اول public، دوم protected و سپس private باشد! هیچ قانون سختی برای رعایت این مورد نیست...

-

برای خوانایی بهتر میتونید از خط خالی بین گروه های public، protected و private استفاده کنید. -

متغییر های private باید مثل varName_$ باشند.

-

اعضای عمومی داخل کلاس باید به صورت camelCase تعریف شوند.(حرف اول کوچک، با CamelCase فرق میکنه).

-

بهتره از نام هایی مثل i$ و j$ استفاده نکنید.

+

از کلید واژه های public ،protected و private استفاده کنید.

+

پراپرتی‌های public و protected باید در بالای کلاس و قبل از متدها تعریف شوند. private هم همینطور اما ممکن هست گاهی قبل از متدی که با آن مرتبط هست آورده شود.

+

ترتیب تعریف پراپرتی‌ها باید به صورت اول public، دوم protected و سپس private باشد! کار بسیار ساده‌ایست :)

+

برای خوانایی بهتر می‌تونید از خط خالی بین گروه‌های public، protected و private استفاده کنید. +

متغیر های private باید مثل varName_$ باشند.

+

اعضای عمومی داخل کلاس باید به صورت camelCase تعریف شوند. (حرف اول کوچک، با CamelCase فرق میکنه)

+

بهتره از نام‌هایی مثل i$ و j$ استفاده نکنید.

```php توابع و متد ها باید camelCase باشند.

-

نام باید هدف رو نشون بده.

-

از کلید واژه های public، protected و private استفاده کنید.

-

آکولاد باز باید در خط بعدی یعنی زیر نام متد قرار بگیره.

+

توابع و متدها باید camelCase باشند.

+

نام باید هدف رو نشون بده.

+

از کلید واژه های public، protected و private استفاده کنید.

+

آکولاد باز باید در خط بعدی یعنی زیر نام متد قرار بگیره.

```php /** @@ -120,14 +123,14 @@ class Foo } ``` -### 4.4 بلوک های PHPDoc +### 4.4 بلوک‌های PHPDoc -

برای متد ها باید مستندات بنویسید(PHPDoc).

-

در PHPDoc نوع param@, var@, property@ و return@ باید مشخص شود(bool, int, string, array یا null).

-

برای تایپ آرایه در PHPDoc از []ClassName استفاده کنید.

-

خط اول PHPDoc باید هدف یک متد رو شرح بده.

-

اگر متد ها چیزی رو بررسی میکنن مثل isActive بخش PHPDoc رو باید با عبارت Checks whether شروع کنید.

-

return@ در PHPDoc یاید دقیقا مشخص کنه چی بازگردانده میشود.

+

برای متدها باید مستندات بنویسید (PHPDoc).

+

در PHPDoc نوع param@ ،var@ ،property@ و return@ باید مشخص شود (bool, int, string, array یا null).

+

برای تایپ آرایه در PHPDoc از []ClassName استفاده کنید.

+

خط اول PHPDoc باید هدف یک متد رو شرح بده.

+

اگر متدها چیزی رو بررسی میکنن مثل isActive بخش PHPDoc رو باید با عبارت Checks whether شروع کنید.

+

return@ در PHPDoc یاید دقیقا مشخص کنه چی بازگردانده میشه.

```php /** @@ -146,14 +149,14 @@ class Foo ### 4.5 Constructors -

`__construct` باید به جای استایل PHP 4 constructors استفاده شود.

+

`__construct` باید به جای استایل PHP 4 constructors استفاده شود.

## 5 PHP -### 5.1 نوع ها +### 5.1 نوع‌ها -

تمام انواع و مقادیر باید با حروف کوچک نوشته شوند مثل true, false, null و array.

-

تغییر نوع یک متغییر خیلی بده، به این مثال توجه کنید:

+

تمام انواع و مقادیر باید با حروف کوچک نوشته شوند مثل true ،false ،null و array.

+

تغییر نوع یک متغیر خیلی بده، به این مثال توجه کنید:

```php @@ -164,22 +167,22 @@ public function save(Transaction $transaction, $argument2 = 100) } ``` -### 5.2 رشته ها +### 5.2 رشته‌ها -

اگر رشته ی شما شامل متغییر های دیگه این نیست از تک کوتیشن جای دابل کوتیشن استفاده کنید.

+

اگر رشته‌ی شما شامل متغیرهای دیگه‌ای نیست از تک‌کوتیشن جای دابل‌کوتیشن استفاده کنید.

```php $str = 'Like this.'; ``` -

دو روش زیر مناسب برای جایگزینی هستند:

+

دو روش زیر مناسب برای جایگزینی هستند:

```php $str1 = "Hello $username!"; $str2 = "Hello {$username}!"; ``` -

-حالت زی مجاز نیست:

+

+حالت زیر مجاز نیست:

```php $str3 = "Hello ${username}!"; @@ -187,13 +190,13 @@ $str3 = "Hello ${username}!"; #### الحاق -

برای الحاق قبل و بعد کاراکتر dot فاصله بذارید

+

برای الحاق قبل و بعد کاراکتر dot فاصله بذارید:

```php $name = 'Yii' . ' Framework'; ``` -

و اگر رشته ی شما بلند بود میتونید اینطور عمل کنید:

+

و اگر رشته ی شما بلند بود می‌تونید اینطور عمل کنید:

```php $sql = "SELECT *" @@ -201,11 +204,11 @@ $sql = "SELECT *" . "WHERE `id` = 121 "; ``` -### 5.3 آرایه ها +### 5.3 آرایه‌ها -

برای تعریف آرایه ها از نحوه ی کوتاه اون یعنی [] استفاده کنید.

-

از ایندکس منفی در آرایه ها استفاده نکنید.

-

روش های زیر قابل قبول و مناسب هستند:

+

برای تعریف آرایه‌ها از ساختار کوتاه اون یعنی [] استفاده کنید.

+

از ایندکس منفی در آرایه‌ها استفاده نکنید.

+

روش‌های زیر قابل قبول و مناسب هستند:

```php $arr = [3, 14, 15, 'Yii', 'Framework']; @@ -228,10 +231,10 @@ $config = [ ### 5.4 دستورات کنترلی -

در دستورات کنترلی قبل و بعد پرانتز space بذارید.

-

آکولاد باز در همان خط دستور قرار میگیرد.

-

آکولاد بسته در خط جدید.

-

برای دستورات یک خطی همیشه از پرانتز استفاده کنید.

+

در دستورات کنترلی قبل و بعد پرانتز space بذارید.

+

آکولاد باز در همان خط دستور قرار میگیرد.

+

آکولاد بسته در خط جدید.

+

برای دستورات یک خطی همیشه از پرانتز استفاده کنید.

```php if ($event === null) { @@ -248,7 +251,7 @@ if (!$model && null === $event) throw new Exception('test'); ``` -

بعد از return از else استفاده نکنید

+

بعد از return از else استفاده نکنید:

```php $result = $this->getResult(); @@ -258,7 +261,7 @@ if (empty($result)) { // process result } ``` -

اینطوری بهتره

+

اینطوری بهتره:

```php @@ -272,8 +275,8 @@ if (empty($result)) { #### switch -

از فرمت زیر برای switch استفاده کنید -

+

از فرمت زیر برای switch استفاده کنید:

+ ```php switch ($this->phpType) { case 'string': @@ -291,9 +294,9 @@ switch ($this->phpType) { } ``` -### 5.5 function calls +### 5.5 صدا زدن فانکشن‌ها -

روش مناسب صدا زدن توابع همراه با پارامتر ها هم اینطور صحیحه

+

روش مناسب صدا زدن فانکشن‌ها همراه با پارامتر هم به این صورته:

```php doIt(2, 3); @@ -308,7 +311,7 @@ doIt('a', [ ### 5.6 تعریف Anonymous functions (lambda) -

در توابع بی نام بین function/use فضای خالی(space) بذارید.

+

در توابع بی نام بین function/use فضای خالی (space) بذارید:

```php // good @@ -328,14 +331,14 @@ $mul = array_reduce($numbers, function($r, $x) use($n) { }); ``` -مستند نویسی +مستند نویسی ------------- -

[phpDoc](https://phpdoc.org/) رو بخونید و موارد اونُ رعایت کنید.

-

کد بدون مستندات مجاز نیست.

-

تمام کلاس ها باید شامل بلاک مستندات در ابتدای فایل باشند.

-

نیازی به نوشتن return@ ندارید اگر متد شما اگر چیزی را برنمیگرداند.

-

به مثال های زیر توجه کنید:

+

https://phpdoc.org رو بخونید و موارد اون رو رعایت کنید.

+

کد بدون مستندات مجاز نیست.

+

تمام کلاس‌ها باید شامل بلاک مستندات در ابتدای فایل باشند.

+

نیازی به نوشتن return@ ندارید اگر متد شما چیزی برنمی‌گرداند.

+

به مثال‌های زیر توجه کنید:

```php getEventHandlers($eventName)->insertAt(0, $eventHandler); - * ``` - * - * @param string $name the event name - * @return Vector list of attached event handlers for the event - * @throws Exception if the event is not defined - */ -public function getEventHandlers($name) -{ - if (!isset($this->_e[$name])) { - $this->_e[$name] = new Vector; - } - $this->ensureBehaviors(); - return $this->_e[$name]; -} +* $component->getEventHandlers($eventName)->insertAt(0, $eventHandler); +* ``` +* +* @param string $name the event name +* @return Vector list of attached event handlers for the event +* @throws Exception if the event is not defined + */ + public function getEventHandlers($name) + { + if (!isset($this->_e[$name])) { + $this->_e[$name] = new Vector; + } + $this->ensureBehaviors(); + return $this->_e[$name]; + } ``` #### نظرات -

از // برای کامنت گذاری استفاده کنید نه از #.

-

در خطوطی که کامنت گذاشتین نباید کد بنویسید، یعنی اون خط برای اون کامنت باید باشه.

+

از // برای کامنت گذاری استفاده کنید نه از #.

+

در خطوطی که کامنت گذاشتین نباید کد بنویسید، یعنی اون خط برای اون کامنت باید باشه.

قوانین بیشتر ---------------- -

تا جایی که میتونید از تابع empty به جای === استفاده کنید.

-

اگر شرایط تو در تویی در کد شما وجود نداره return زود هنگام یا ساده تر بگم return وسط متد مشکلی نخواهد داشت.

-

همیشه از static جای self به جز موارد زیر استفاده کنید:

-

1) دسترسی به ثابت ها باید با self انجام بشه.

-

2) دسترسی به پراپرتی های خصوصی باید با self انجام بشه.

-

3) مجاز به استفاده از self برای صدا زدن توابع در مواقعی مثل فراخوانی بازگشتی هستید.

+

تا جایی که می‌تونید از تابع empty به جای === استفاده کنید.

+

اگر شرایط تو در تویی در کد شما وجود نداره return زود هنگام یا ساده تر بگم return وسط متد مشکلی نخواهد داشت.

+

همیشه از static جای self به جز موارد زیر استفاده کنید:

+

1) دسترسی به ثابت‌ها باید با self انجام بشه.

+

2) دسترسی به پراپرتی‌های خصوصی باید با self انجام بشه.

+

3) مجاز به استفاده از self برای صدا زدن توابع در مواقعی مثل فراخوانی بازگشتی هستید.

-namespace ها +نیم‌اسپیس‌ها ---------------- -

از حرف کوچک استفاده کنید.

-

از فرم جمع اسم ها برای نشان دادن یک شی استفاده کنید مثل validators.

-

از فرم منفرد اسم ها برای قابلیت ها و امکانات استفاده کنید مثل web.

-

بهتره فضای نام تک کلمه ای باشه در غیر این صورت از camelCase استفاده کنید.

- +

از حرف کوچک استفاده کنید.

+

از فرم جمع اسم‌ها برای نشان دادن یک شی استفاده کنید مثل validators.

+

از فرم مفرد اسم‌ها برای قابلیت‌ها و امکانات استفاده کنید مثل web.

+

بهتره فضای نام تک‌کلمه‌ای باشه در غیر این صورت از camelCase استفاده کنید.

From bd452da4d2bc6636e3eabeef817b3917ae0b293b Mon Sep 17 00:00:00 2001 From: Saleh Hashemi <81674631+salehhashemi1992@users.noreply.github.com> Date: Fri, 27 Oct 2023 22:26:06 +0330 Subject: [PATCH 060/125] Add tests for uncovered lines in DbDependency (#20052) --- tests/framework/caching/DbDependencyTest.php | 41 +++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/framework/caching/DbDependencyTest.php b/tests/framework/caching/DbDependencyTest.php index bd801e3528c..bb723be3a49 100644 --- a/tests/framework/caching/DbDependencyTest.php +++ b/tests/framework/caching/DbDependencyTest.php @@ -21,7 +21,6 @@ class DbDependencyTest extends DatabaseTestCase */ protected $driverName = 'sqlite'; - /** * {@inheritdoc} */ @@ -39,11 +38,14 @@ protected function setUp() $db->createCommand()->insert('dependency_item', ['value' => 'initial'])->execute(); } - public function testIsChanged() + public function testQueryOneIsExecutedWhenQueryCacheEnabled() { $db = $this->getConnection(false); $cache = new ArrayCache(); + // Enable the query cache + $db->enableQueryCache = true; + $dependency = new DbDependency(); $dependency->db = $db; $dependency->sql = 'SELECT [[id]] FROM {{dependency_item}} ORDER BY [[id]] DESC LIMIT 1'; @@ -56,4 +58,39 @@ public function testIsChanged() $this->assertTrue($dependency->isChanged($cache)); } + + public function testQueryOneIsExecutedWhenQueryCacheDisabled() + { + $db = $this->getConnection(false); + $cache = new ArrayCache(); + + // Disable the query cache + $db->enableQueryCache = false; + + $dependency = new DbDependency(); + $dependency->db = $db; + $dependency->sql = 'SELECT [[id]] FROM {{dependency_item}} ORDER BY [[id]] DESC LIMIT 1'; + $dependency->reusable = false; + + $dependency->evaluateDependency($cache); + $this->assertFalse($dependency->isChanged($cache)); + + $db->createCommand()->insert('dependency_item', ['value' => 'new'])->execute(); + + $this->assertTrue($dependency->isChanged($cache)); + } + + public function testMissingSqlThrowsException() + { + $this->expectException('\yii\base\InvalidConfigException'); + + $db = $this->getConnection(false); + $cache = new ArrayCache(); + + $dependency = new DbDependency(); + $dependency->db = $db; + $dependency->sql = null; + + $dependency->evaluateDependency($cache); + } } From af1858c769330aae53f8291150a17ef31ce58576 Mon Sep 17 00:00:00 2001 From: Saleh Hashemi <81674631+salehhashemi1992@users.noreply.github.com> Date: Fri, 27 Oct 2023 22:26:43 +0330 Subject: [PATCH 061/125] add test coverage for error handler convertExceptionToString and convertExceptionToArray methods (#20051) --- tests/framework/web/ErrorHandlerTest.php | 43 ++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/framework/web/ErrorHandlerTest.php b/tests/framework/web/ErrorHandlerTest.php index 1634c572d4a..4ea8b15e6c8 100644 --- a/tests/framework/web/ErrorHandlerTest.php +++ b/tests/framework/web/ErrorHandlerTest.php @@ -42,6 +42,49 @@ public function testCorrectResponseCodeInErrorView() Exception: yii\web\NotFoundHttpException', $out); } + public function testFormatRaw() + { + Yii::$app->response->format = yii\web\Response::FORMAT_RAW; + + /** @var ErrorHandler $handler */ + $handler = Yii::$app->getErrorHandler(); + + ob_start(); // suppress response output + $this->invokeMethod($handler, 'renderException', [new \Exception('Test Exception')]); + $out = ob_get_clean(); + + $this->assertcontains('Test Exception', $out); + + $this->assertTrue(is_string(Yii::$app->response->data)); + $this->assertcontains("Exception 'Exception' with message 'Test Exception'", Yii::$app->response->data); + } + + public function testFormatXml() + { + Yii::$app->response->format = yii\web\Response::FORMAT_XML; + + /** @var ErrorHandler $handler */ + $handler = Yii::$app->getErrorHandler(); + + ob_start(); // suppress response output + $this->invokeMethod($handler, 'renderException', [new \Exception('Test Exception')]); + $out = ob_get_clean(); + + $this->assertcontains('Test Exception', $out); + + $outArray = Yii::$app->response->data; + + $this->assertTrue(is_array(Yii::$app->response->data)); + + $this->assertEquals('Exception', $outArray['name']); + $this->assertEquals('Test Exception', $outArray['message']); + $this->assertArrayHasKey('code', $outArray); + $this->assertEquals('Exception', $outArray['type']); + $this->assertContains('ErrorHandlerTest.php', $outArray['file']); + $this->assertArrayHasKey('stack-trace', $outArray); + $this->assertArrayHasKey('line', $outArray); + } + public function testClearAssetFilesInErrorView() { Yii::$app->getView()->registerJsFile('somefile.js'); From caa2029ec70604747fe36cfd4fd7d01ff31680d6 Mon Sep 17 00:00:00 2001 From: salehhashemi1992 <81674631+salehhashemi1992@users.noreply.github.com> Date: Mon, 23 Oct 2023 22:48:14 +0330 Subject: [PATCH 062/125] implement findBetween method to StringHelper --- framework/helpers/BaseStringHelper.php | 28 ++++++++++++++++++++ tests/framework/helpers/StringHelperTest.php | 26 ++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index e9c5327b031..1dda22be7c8 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -527,4 +527,32 @@ public static function mask($string, $start, $length, $mask = '*') { return $masked; } + + /** + * Returns the portion of the string that lies between the first occurrence of the start string + * and the last occurrence of the end string after that. + * + * @param string $string The input string. + * @param string $start The string marking the start of the portion to extract. + * @param string $end The string marking the end of the portion to extract. + * @return string The portion of the string between the first occurrence of start and the last occurrence of end. + */ + public static function findBetween($string, $start, $end) + { + $startPos = mb_strpos($string, $start); + + if ($startPos === false) { + return ''; + } + + // Cut the string from the start position + $subString = mb_substr($string, $startPos + mb_strlen($start)); + $endPos = mb_strrpos($subString, $end); + + if ($endPos === false) { + return ''; + } + + return mb_substr($subString, 0, $endPos); + } } diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index a640e5cdda2..ff6298eacf8 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -506,4 +506,30 @@ public function testMask() $this->assertSame('em**l@email.com', StringHelper::mask('email@email.com', 2, 2)); $this->assertSame('******email.com', StringHelper::mask('email@email.com', 0, 6)); } + + /** + * @param string $string + * @param string $start + * @param string $end + * @param string $expectedResult + * @dataProvider dataProviderFindBetween + */ + public function testFindBetween($string, $start, $end, $expectedResult) + { + $this->assertSame($expectedResult, StringHelper::findBetween($string, $start, $end)); + } + + public function dataProviderFindBetween() + { + return [ + ['hello world hello', 'hello ', ' world', ''], // end before start + ['This is a sample string', 'is ', ' string', 'is a sample'], // normal case + ['startendstart', 'start', 'end', ''], // end before start + ['startmiddleend', 'start', 'end', 'middle'], // normal case + ['startend', 'start', 'end', ''], // end immediately follows start + ['multiple start start end end', 'start ', ' end', 'start end'], // multiple starts and ends + ['', 'start', 'end', ''], // empty string + ['no delimiters here', 'start', 'end', ''], // no start and end + ]; + } } From 26032ad686f140b019cb7abfe25ca3c88d1648a2 Mon Sep 17 00:00:00 2001 From: salehhashemi1992 <81674631+salehhashemi1992@users.noreply.github.com> Date: Sat, 28 Oct 2023 22:19:51 +0330 Subject: [PATCH 063/125] refactor findBetween method and add other tests --- framework/CHANGELOG.md | 1 + framework/helpers/BaseStringHelper.php | 7 ++++--- tests/framework/helpers/StringHelperTest.php | 12 ++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a80668a4524..206da6ab1ae 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) - Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) - Enh #20032: Added `mask` method for string masking with multibyte support (salehhashemi1992) +- Enh #20034: Added `findBetween` to retrieve a substring that lies between two strings (salehhashemi1992) 2.0.49.2 October 12, 2023 diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index 1dda22be7c8..21a1f9e6432 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -535,14 +535,15 @@ public static function mask($string, $start, $length, $mask = '*') { * @param string $string The input string. * @param string $start The string marking the start of the portion to extract. * @param string $end The string marking the end of the portion to extract. - * @return string The portion of the string between the first occurrence of start and the last occurrence of end. + * @return string|null The portion of the string between the first occurrence of + * start and the last occurrence of end, or null if either start or end cannot be found. */ public static function findBetween($string, $start, $end) { $startPos = mb_strpos($string, $start); if ($startPos === false) { - return ''; + return null; } // Cut the string from the start position @@ -550,7 +551,7 @@ public static function findBetween($string, $start, $end) $endPos = mb_strrpos($subString, $end); if ($endPos === false) { - return ''; + return null; } return mb_substr($subString, 0, $endPos); diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index ff6298eacf8..94efbf67137 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -522,14 +522,18 @@ public function testFindBetween($string, $start, $end, $expectedResult) public function dataProviderFindBetween() { return [ - ['hello world hello', 'hello ', ' world', ''], // end before start - ['This is a sample string', 'is ', ' string', 'is a sample'], // normal case + ['hello world hello', ' hello', ' world', null], // end before start + ['This is a sample string', ' is ', ' string', 'a sample'], // normal case ['startendstart', 'start', 'end', ''], // end before start ['startmiddleend', 'start', 'end', 'middle'], // normal case ['startend', 'start', 'end', ''], // end immediately follows start ['multiple start start end end', 'start ', ' end', 'start end'], // multiple starts and ends - ['', 'start', 'end', ''], // empty string - ['no delimiters here', 'start', 'end', ''], // no start and end + ['', 'start', 'end', null], // empty string + ['no delimiters here', 'start', 'end', null], // no start and end + ['start only', 'start', 'end', null], // start found but no end + ['end only', 'start', 'end', null], // end found but no start + ['spécial !@#$%^&*()', 'spé', '&*()', 'cial !@#$%^'], // Special characters + ['من صالح هاشمی هستم', 'من ', ' هستم', 'صالح هاشمی'], // other languages ]; } } From 3d4e108a3e0ac6393f34159e9255748545238ec3 Mon Sep 17 00:00:00 2001 From: Bizley Date: Mon, 30 Oct 2023 12:18:25 +0100 Subject: [PATCH 064/125] Update CHANGELOG.md --- framework/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 206da6ab1ae..e2c67473595 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -13,8 +13,8 @@ Yii Framework 2 Change Log - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) - Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) -- Enh #20032: Added `mask` method for string masking with multibyte support (salehhashemi1992) -- Enh #20034: Added `findBetween` to retrieve a substring that lies between two strings (salehhashemi1992) +- Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992) +- Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) 2.0.49.2 October 12, 2023 From 5ce3b4ea01a55a2ecabd82ee5f62415d487c3c14 Mon Sep 17 00:00:00 2001 From: salehhashemi1992 <81674631+salehhashemi1992@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:04:32 +0330 Subject: [PATCH 065/125] Optimize findBetween method to remove calling function mb_substr() --- framework/helpers/BaseStringHelper.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index 21a1f9e6432..749f92f79cd 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -546,14 +546,13 @@ public static function findBetween($string, $start, $end) return null; } - // Cut the string from the start position - $subString = mb_substr($string, $startPos + mb_strlen($start)); - $endPos = mb_strrpos($subString, $end); + $startPos += mb_strlen($start); + $endPos = mb_strrpos($string, $end, $startPos); if ($endPos === false) { return null; } - return mb_substr($subString, 0, $endPos); + return mb_substr($string, $startPos, $endPos - $startPos); } } From abcd82fd1765a77e1d87f80a7338c3b428dc18d1 Mon Sep 17 00:00:00 2001 From: salehhashemi1992 <81674631+salehhashemi1992@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:40:26 +0330 Subject: [PATCH 066/125] Extract common cache data preparation logic to prepareCacheData method --- framework/caching/Cache.php | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/framework/caching/Cache.php b/framework/caching/Cache.php index 5e1828ef850..d6d363c6d34 100644 --- a/framework/caching/Cache.php +++ b/framework/caching/Cache.php @@ -294,21 +294,7 @@ public function multiSet($items, $duration = null, $dependency = null) $duration = $this->defaultDuration; } - if ($dependency !== null && $this->serializer !== false) { - $dependency->evaluateDependency($this); - } - - $data = []; - foreach ($items as $key => $value) { - if ($this->serializer === null) { - $value = serialize([$value, $dependency]); - } elseif ($this->serializer !== false) { - $value = call_user_func($this->serializer[0], [$value, $dependency]); - } - - $key = $this->buildKey($key); - $data[$key] = $value; - } + $data = $this->prepareCacheData($items, $dependency); return $this->setValues($data, $duration); } @@ -343,6 +329,21 @@ public function madd($items, $duration = 0, $dependency = null) * @since 2.0.7 */ public function multiAdd($items, $duration = 0, $dependency = null) + { + $data = $this->prepareCacheData($items, $dependency); + + return $this->addValues($data, $duration); + } + + /** + * Prepares data for caching by serializing values and evaluating dependencies. + * + * @param array $items The items to be cached. + * @param mixed $dependency The dependency to be evaluated. + * + * @return array The prepared data for caching. + */ + private function prepareCacheData($items, $dependency) { if ($dependency !== null && $this->serializer !== false) { $dependency->evaluateDependency($this); @@ -360,7 +361,7 @@ public function multiAdd($items, $duration = 0, $dependency = null) $data[$key] = $value; } - return $this->addValues($data, $duration); + return $data; } /** From 0263c19833d663f9bd02927363a0b51f14a20b61 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 2 Nov 2023 08:28:05 -0300 Subject: [PATCH 067/125] Revert 20045. --- framework/CHANGELOG.md | 1 - framework/db/mysql/Schema.php | 2 +- tests/framework/db/mysql/SchemaTest.php | 5 - tests/framework/db/mysql/type/BooleanTest.php | 249 ------------------ 4 files changed, 1 insertion(+), 256 deletions(-) delete mode 100644 tests/framework/db/mysql/type/BooleanTest.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e2c67473595..3867382321c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,6 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ -- Bug #20045: Fix type `boolean` in `MySQL` (terabytesoftw) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index 666279e3b98..fa2270eb77d 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -279,7 +279,7 @@ protected function loadColumnSchema($info) if (isset($values[1])) { $column->scale = (int) $values[1]; } - if ($column->size === 1 && ($type === 'tinyint' || $type === 'bit')) { + if ($column->size === 1 && $type === 'bit') { $column->type = 'boolean'; } elseif ($type === 'bit') { if ($column->size > 32) { diff --git a/tests/framework/db/mysql/SchemaTest.php b/tests/framework/db/mysql/SchemaTest.php index 82342419a8c..43a66a60b57 100644 --- a/tests/framework/db/mysql/SchemaTest.php +++ b/tests/framework/db/mysql/SchemaTest.php @@ -228,11 +228,6 @@ public function getExpectedColumns() ] ); - $columns['bool_col']['type'] = 'boolean'; - $columns['bool_col']['phpType'] = 'boolean'; - $columns['bool_col2']['type'] = 'boolean'; - $columns['bool_col2']['phpType'] = 'boolean'; - if (version_compare($version, '5.7', '<')) { $columns['int_col3']['phpType'] = 'string'; $columns['json_col']['type'] = 'text'; diff --git a/tests/framework/db/mysql/type/BooleanTest.php b/tests/framework/db/mysql/type/BooleanTest.php deleted file mode 100644 index bc9d307a78d..00000000000 --- a/tests/framework/db/mysql/type/BooleanTest.php +++ /dev/null @@ -1,249 +0,0 @@ -getConnection(true); - $schema = $db->getSchema(); - $tableName = '{{%boolean}}'; - - if ($db->getTableSchema($tableName)) { - $db->createCommand()->dropTable($tableName)->execute(); - } - - $db->createCommand()->createTable( - $tableName, - [ - 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), - 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), - 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), - ] - )->execute(); - - // test type `boolean` - $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); - $this->assertSame('boolean', $columnBoolColTinyint->phpType); - - $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); - $this->assertSame('boolean', $columnBoolColBit->phpType); - - // test value `false` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => false, 'bool_col_bit' => false])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); - $this->assertEquals(0, $boolValues['bool_col_tinyint']); - $this->assertEquals(0, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertFalse($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertFalse($phpTypeCastBoolColBit); - - // test value `true` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => true, 'bool_col_bit' => true])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); - $this->assertEquals(1, $boolValues['bool_col_tinyint']); - $this->assertEquals(1, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertTrue($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertTrue($phpTypeCastBoolColBit); - } - - public function testBooleanWithValueInteger() - { - $db = $this->getConnection(true); - $schema = $db->getSchema(); - $tableName = '{{%boolean}}'; - - if ($db->getTableSchema($tableName)) { - $db->createCommand()->dropTable($tableName)->execute(); - } - - $db->createCommand()->createTable( - $tableName, - [ - 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), - 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), - 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), - ] - )->execute(); - - // test type `boolean` - $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); - $this->assertSame('boolean', $columnBoolColTinyint->phpType); - - $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); - $this->assertSame('boolean', $columnBoolColBit->phpType); - - // test value `0` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 0, 'bool_col_bit' => 0])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); - $this->assertEquals(0, $boolValues['bool_col_tinyint']); - $this->assertEquals(0, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertFalse($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertFalse($phpTypeCastBoolColBit); - - // test value `1` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 1, 'bool_col_bit' => 1])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 2")->queryOne(); - $this->assertEquals(1, $boolValues['bool_col_tinyint']); - $this->assertEquals(1, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertTrue($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertTrue($phpTypeCastBoolColBit); - } - - public function testBooleanWithValueNegative() - { - $db = $this->getConnection(true); - $schema = $db->getSchema(); - $tableName = '{{%boolean}}'; - - if ($db->getTableSchema($tableName)) { - $db->createCommand()->dropTable($tableName)->execute(); - } - - $db->createCommand()->createTable( - $tableName, - [ - 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), - 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), - 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), - ] - )->execute(); - - // test type `boolean` - $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); - $this->assertSame('boolean', $columnBoolColTinyint->phpType); - - $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); - $this->assertSame('boolean', $columnBoolColBit->phpType); - - // test value `-1` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => -1, 'bool_col_bit' => -1])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); - - $this->assertEquals(1, $boolValues['bool_col_tinyint']); - $this->assertEquals(1, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertTrue($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertTrue($phpTypeCastBoolColBit); - } - - public function testBooleanWithValueNull() - { - $db = $this->getConnection(true); - $schema = $db->getSchema(); - $tableName = '{{%boolean}}'; - - if ($db->getTableSchema($tableName)) { - $db->createCommand()->dropTable($tableName)->execute(); - } - - $db->createCommand()->createTable( - $tableName, - [ - 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), - 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), - 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), - ] - )->execute(); - - // test type `boolean` - $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); - $this->assertSame('boolean', $columnBoolColTinyint->phpType); - - $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); - $this->assertSame('boolean', $columnBoolColBit->phpType); - - // test value `null` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => null, 'bool_col_bit' => null])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); - - $this->assertNull($boolValues['bool_col_tinyint']); - $this->assertNull($boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertNull($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertNull($phpTypeCastBoolColBit); - } - - public function testBooleanWithValueOverflow() - { - $db = $this->getConnection(true); - $schema = $db->getSchema(); - $tableName = '{{%boolean}}'; - - if ($db->getTableSchema($tableName)) { - $db->createCommand()->dropTable($tableName)->execute(); - } - - $db->createCommand()->createTable( - $tableName, - [ - 'id' => $schema->createColumnSchemaBuilder(Schema::TYPE_PK), - 'bool_col_tinyint' => $schema->createColumnSchemaBuilder(Schema::TYPE_BOOLEAN), - 'bool_col_bit' => $schema->createColumnSchemaBuilder('bit', 1), - ] - )->execute(); - - // test type `boolean` - $columnBoolColTinyint = $db->getTableSchema($tableName)->getColumn('bool_col_tinyint'); - $this->assertSame('boolean', $columnBoolColTinyint->phpType); - - $columnBoolColBit = $db->getTableSchema($tableName)->getColumn('bool_col_bit'); - $this->assertSame('boolean', $columnBoolColBit->phpType); - - // test value `2` - $db->createCommand()->insert($tableName, ['bool_col_tinyint' => 2, 'bool_col_bit' => 2])->execute(); - $boolValues = $db->createCommand("SELECT * FROM $tableName WHERE id = 1")->queryOne(); - - $this->assertEquals(1, $boolValues['bool_col_tinyint']); - $this->assertEquals(1, $boolValues['bool_col_bit']); - - // test php typecast - $phpTypeCastBoolColTinyint = $columnBoolColTinyint->phpTypecast($boolValues['bool_col_tinyint']); - $this->assertTrue($phpTypeCastBoolColTinyint); - - $phpTypeCastBoolColBit = $columnBoolColBit->phpTypecast($boolValues['bool_col_bit']); - $this->assertTrue($phpTypeCastBoolColBit); - } -} From ae3f2f2dad778276a3c3a546e8b44244fa858a9f Mon Sep 17 00:00:00 2001 From: AIZAWA Hina Date: Tue, 14 Nov 2023 05:26:41 +0900 Subject: [PATCH 068/125] Update Japanese messages --- framework/messages/ja/yii.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/messages/ja/yii.php b/framework/messages/ja/yii.php index 6fd6c3f9da5..b1b0f43cab8 100644 --- a/framework/messages/ja/yii.php +++ b/framework/messages/ja/yii.php @@ -26,8 +26,8 @@ ' and ' => ' および ', '"{attribute}" does not support operator "{operator}".' => '"{attribute}" は演算子 "{operator}" をサポートしていません。', '(not set)' => '(未設定)', - 'Action not found.' => '', - 'Aliases available: {aliases}' => '', + 'Action not found.' => 'アクションがありません。', + 'Aliases available: {aliases}' => '利用可能なエイリアス: {aliases}', 'An internal server error occurred.' => '内部サーバーエラーが発生しました。', 'Are you sure you want to delete this item?' => 'このアイテムを削除したいというのは本当ですか?', 'Condition for "{attribute}" should be either a value or valid operator specification.' => '"{attribute}" のための条件は値であるか有効な演算子の定義でなければなりません。', @@ -45,7 +45,7 @@ 'Only files with these extensions are allowed: {extensions}.' => '次の拡張子を持つファイルだけが許可されています : {extensions}', 'Operator "{operator}" must be used with a search attribute.' => '演算子 "{operator}" はサーチ属性とともに使用されなければなりません。', 'Operator "{operator}" requires multiple operands.' => '演算子 "{operator}" は複数の被演算子を要求します。', - 'Options available: {options}' => '', + 'Options available: {options}' => '利用可能なオプション: {options}', 'Page not found.' => 'ページが見つかりません。', 'Please fix the following errors:' => '次のエラーを修正してください :', 'Please upload a file.' => 'ファイルをアップロードしてください。', @@ -109,7 +109,7 @@ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} は {min} 文字以上でなければいけません。', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} は {max} 文字以下でなければいけません。', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} は {length} 文字でなければいけません。', - '{compareAttribute} is invalid.' => '', + '{compareAttribute} is invalid.' => '{compareAttribute} は無効です。', '{delta, plural, =1{1 day} other{# days}}' => '{delta} 日間', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} 時間', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta} 分間', From 6fdb805da8a571a93fde26035d6b05dc8530d041 Mon Sep 17 00:00:00 2001 From: ggh2e3 <148446635+ggh2e3@users.noreply.github.com> Date: Thu, 23 Nov 2023 16:09:35 +0100 Subject: [PATCH 069/125] Fix #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` --- framework/CHANGELOG.md | 2 + framework/web/Link.php | 9 ++-- tests/framework/web/LinkTest.php | 89 ++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 tests/framework/web/LinkTest.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3867382321c..6645863bfd7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,6 +3,8 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ + +- Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) diff --git a/framework/web/Link.php b/framework/web/Link.php index c64c34f81c5..3f90fc66a28 100644 --- a/framework/web/Link.php +++ b/framework/web/Link.php @@ -62,11 +62,10 @@ public static function serialize(array $links) { foreach ($links as $rel => $link) { if (is_array($link)) { - foreach ($link as $i => $l) { - $link[$i] = $l instanceof self ? array_filter((array) $l) : ['href' => $l]; - } - $links[$rel] = $link; - } elseif (!$link instanceof self) { + $links[$rel] = self::serialize($link); + } elseif ($link instanceof self) { + $links[$rel] = array_filter((array)$link); + } else { $links[$rel] = ['href' => $link]; } } diff --git a/tests/framework/web/LinkTest.php b/tests/framework/web/LinkTest.php new file mode 100644 index 00000000000..6cc99b4d5a2 --- /dev/null +++ b/tests/framework/web/LinkTest.php @@ -0,0 +1,89 @@ + 'https://example.com/users/4', + 'name' => 'User 4', + 'title' => 'My Manager', + ]); + + $expected = [ + 'self' => [ + 'href' => 'https://example.com/users/1' + ], + 'manager' => [ + 'href' => 'https://example.com/users/4', + 'name' => 'User 4', + 'title' => 'My Manager', + ], + ]; + + $this->assertEquals($expected, Link::serialize([ + 'self' => 'https://example.com/users/1', + 'manager' => $managerLink, + ])); + } + + public function testSerializeNestedArrayWithLinkWillSerialize() + { + $linkData = [ + 'self' => new Link([ + 'href' => 'https://example.com/users/3', + 'name' => 'Daffy Duck', + ]), + 'fellows' => [ + [ + new Link([ + 'href' => 'https://example.com/users/4', + 'name' => 'Bugs Bunny', + ]), + ], + [ + new Link([ + 'href' => 'https://example.com/users/5', + 'name' => 'Lola Bunny', + ]), + ] + ] + ]; + + $expected = [ + 'self' => [ + 'href' => 'https://example.com/users/3', + 'name' => 'Daffy Duck', + ], + 'fellows' => [ + [ + [ + 'href' => 'https://example.com/users/4', + 'name' => 'Bugs Bunny', + ] + ], + [ + [ + 'href' => 'https://example.com/users/5', + 'name' => 'Lola Bunny', + ] + ] + ], + ]; + + $this->assertEquals($expected, Link::serialize($linkData)); + } +} From d43341a73ab9ab711c42b74c117e076275d9b8c0 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:24:33 -0300 Subject: [PATCH 070/125] Add compatibility with PHP 8.3 (#20074) --- .github/workflows/build.yml | 4 + .github/workflows/ci-mssql.yml | 2 + .github/workflows/ci-mysql.yml | 1 + .github/workflows/ci-pgsql.yml | 2 + .github/workflows/ci-sqlite.yml | 1 + composer.lock | 108 +++++++++--------- tests/framework/data/BaseDataProviderTest.php | 2 +- 7 files changed, 65 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c3b0dcc341..b2cc61a4f5b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -65,6 +65,10 @@ jobs: extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached coverage: none os: ubuntu-latest + - php: 8.3 + extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached + coverage: none + os: ubuntu-latest steps: - name: Generate french locale. diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index 777f91fd306..e80550119d0 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -29,6 +29,8 @@ jobs: mssql: server:2019-latest - php: 8.2 mssql: server:2022-latest + - php: 8.3 + mssql: server:2022-latest services: mssql: diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index a1c201b07c9..4e0f651aae9 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -27,6 +27,7 @@ jobs: - 8.0 - 8.1 - 8.2 + - 8.3 mysql: - 5.7 diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index 8c623c283be..ba0217e2212 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -26,6 +26,8 @@ jobs: - 7.4 - 8.0 - 8.1 + - 8.2 + - 8.3 pgsql: - 10 diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index e163da11004..707ecb1b9aa 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -28,6 +28,7 @@ jobs: - 8.0 - 8.1 - 8.2 + - 8.3 steps: - name: Checkout. diff --git a/composer.lock b/composer.lock index 97f39ee4db3..e3b8a15c6c7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,14 +4,14 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "80e3f228bae519816def145a5a1d47ae", + "content-hash": "9ee35a67e578251573a9017059b62b76", "packages": [ { "name": "bower-asset/inputmask", "version": "5.0.8", "source": { "type": "git", - "url": "https://github.com/RobinHerbots/Inputmask.git", + "url": "git@github.com:RobinHerbots/Inputmask.git", "reference": "e0f39e0c93569c6b494c3a57edef2c59313a6b64" }, "dist": { @@ -29,16 +29,16 @@ }, { "name": "bower-asset/jquery", - "version": "3.7.1", + "version": "3.6.4", "source": { "type": "git", - "url": "https://github.com/jquery/jquery-dist.git", - "reference": "fde1f76e2799dd877c176abde0ec836553246991" + "url": "git@github.com:jquery/jquery-dist.git", + "reference": "91ef2d8836342875f2519b5815197ea0f23613cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/fde1f76e2799dd877c176abde0ec836553246991", - "reference": "fde1f76e2799dd877c176abde0ec836553246991" + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/91ef2d8836342875f2519b5815197ea0f23613cf", + "reference": "91ef2d8836342875f2519b5815197ea0f23613cf" }, "type": "bower-asset", "license": [ @@ -147,20 +147,20 @@ }, { "name": "ezyang/htmlpurifier", - "version": "v4.16.0", + "version": "v4.17.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", - "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", "shasum": "" }, "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" }, "require-dev": { "cerdic/css-tidy": "^1.7 || ^2.0", @@ -202,9 +202,9 @@ ], "support": { "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" }, - "time": "2022-09-18T07:06:19+00:00" + "time": "2023-11-17T15:01:25+00:00" }, { "name": "paragonie/random_compat", @@ -373,16 +373,16 @@ }, { "name": "composer/pcre", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { @@ -424,7 +424,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -440,7 +440,7 @@ "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/semver", @@ -715,16 +715,16 @@ }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { @@ -756,9 +756,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/instantiator", @@ -2228,16 +2228,16 @@ }, { "name": "symfony/console", - "version": "v6.3.4", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", + "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", "shasum": "" }, "require": { @@ -2298,7 +2298,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.4" + "source": "https://github.com/symfony/console/tree/v6.3.8" }, "funding": [ { @@ -2314,11 +2314,11 @@ "type": "tidelift" } ], - "time": "2023-08-16T10:10:12+00:00" + "time": "2023-10-31T08:09:35+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -2365,7 +2365,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -2465,7 +2465,7 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -2521,7 +2521,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -2604,16 +2604,16 @@ }, { "name": "symfony/finder", - "version": "v6.3.3", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "shasum": "" }, "require": { @@ -2648,7 +2648,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.3" + "source": "https://github.com/symfony/finder/tree/v6.3.5" }, "funding": [ { @@ -2664,7 +2664,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:31:44+00:00" + "time": "2023-09-26T12:56:25+00:00" }, { "name": "symfony/options-resolver", @@ -3288,16 +3288,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { @@ -3350,7 +3350,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -3366,7 +3366,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/stopwatch", @@ -3432,16 +3432,16 @@ }, { "name": "symfony/string", - "version": "v6.3.2", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "53d1a83225002635bca3482fcbf963001313fb68" + "reference": "13880a87790c76ef994c91e87efb96134522577a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", - "reference": "53d1a83225002635bca3482fcbf963001313fb68", + "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", + "reference": "13880a87790c76ef994c91e87efb96134522577a", "shasum": "" }, "require": { @@ -3498,7 +3498,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.2" + "source": "https://github.com/symfony/string/tree/v6.3.8" }, "funding": [ { @@ -3514,7 +3514,7 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-11-09T08:28:21+00:00" }, { "name": "symfony/yaml", diff --git a/tests/framework/data/BaseDataProviderTest.php b/tests/framework/data/BaseDataProviderTest.php index ea5ae21cb69..c06d4a09bc2 100644 --- a/tests/framework/data/BaseDataProviderTest.php +++ b/tests/framework/data/BaseDataProviderTest.php @@ -20,7 +20,7 @@ public function testGenerateId() $rc = new \ReflectionClass(BaseDataProvider::className()); $rp = $rc->getProperty('counter'); $rp->setAccessible(true); - $rp->setValue(null); + $rp->setValue(new ConcreteDataProvider(), null); $this->assertNull((new ConcreteDataProvider())->id); $this->assertNotNull((new ConcreteDataProvider())->id); From fc582a2cfda2181b3b433675c63209e3b1f57e25 Mon Sep 17 00:00:00 2001 From: ggh2e3 Date: Sun, 3 Dec 2023 15:07:25 +0100 Subject: [PATCH 071/125] 17191: fixed isRelative method --- framework/helpers/BaseUrl.php | 3 +- tests/framework/helpers/BaseUrlTest.php | 73 +++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/framework/helpers/BaseUrlTest.php diff --git a/framework/helpers/BaseUrl.php b/framework/helpers/BaseUrl.php index a671123c7cd..dcbab192730 100644 --- a/framework/helpers/BaseUrl.php +++ b/framework/helpers/BaseUrl.php @@ -378,7 +378,8 @@ public static function home($scheme = false) */ public static function isRelative($url) { - return strncmp($url, '//', 2) && strpos($url, '://') === false; + $urlComponents = parse_url($url, PHP_URL_SCHEME); + return strncmp($url, '//', 2) && empty($urlComponents); } /** diff --git a/tests/framework/helpers/BaseUrlTest.php b/tests/framework/helpers/BaseUrlTest.php new file mode 100644 index 00000000000..84933fcac96 --- /dev/null +++ b/tests/framework/helpers/BaseUrlTest.php @@ -0,0 +1,73 @@ +assertFalse(BaseUrl::isRelative('https://acme.com/tnt-room=123')); + } + + public function testUrlStartingWithDoubleSlashesWillReturnFalse() + { + $this->assertFalse(BaseUrl::isRelative('//example.com')); + } + + public function testIsRelativeWithRelativeUrlWillReturnTrue() + { + $this->assertTrue( + BaseUrl::isRelative('acme.com/tnt-room=123') + ); + } + + public function testIsRelativeWithRelativeUrlHavingHttpsUrlAsParamValueWillReturnTrue() + { + $this->assertTrue(BaseUrl::isRelative( + 'acme.com/tnt-room-link=https://asd.com' + )); + } + + public function testIsRelativeWithAbsoluteUrlHavingHttpsUrlAsParamValueWillReturnFalse() + { + $this->assertFalse( + BaseUrl::isRelative('https://acme.com/tnt-link=https://tnt.com') + ); + } + + public function testIsRelativeWithA() + { + $this->assertTrue( + BaseUrl::isRelative('/name=bugs.bunny') + ); + } + + public function testIsRelativeWithFtpProtocolUrlWillReturnFalse() + { + $this->assertFalse( + BaseUrl::isRelative('ftp://ftp.acme.com/tnt-suppliers.txt') + ); + } + + public function testIsRelativeWithHttpUrl() + { + $this->assertFalse( + BaseUrl::isRelative('http://no-protection.acme.com') + ); + } + + public function testIsRelativeWithFileUrl() + { + $this->assertFalse( + BaseUrl::isRelative('file:///home/User/2ndFile.html') + ); + } + +} From d3e4df762d51c48c920a0cd8587ac22b1a47d302 Mon Sep 17 00:00:00 2001 From: ggh2e3 Date: Sun, 3 Dec 2023 15:27:56 +0100 Subject: [PATCH 072/125] 17191: refacor tests using dataprovider --- tests/framework/helpers/BaseUrlTest.php | 101 ++++++++++++++++-------- 1 file changed, 70 insertions(+), 31 deletions(-) diff --git a/tests/framework/helpers/BaseUrlTest.php b/tests/framework/helpers/BaseUrlTest.php index 84933fcac96..ecc76fec787 100644 --- a/tests/framework/helpers/BaseUrlTest.php +++ b/tests/framework/helpers/BaseUrlTest.php @@ -10,64 +10,103 @@ */ class BaseUrlTest extends TestCase { + /** @dataProvider relativeTrueUrlProvider */ + public function testIsRelativeWillReturnTrue($url) + { + $this->assertTrue(BaseUrl::isRelative($url)); + } - public function testIsRelativeWithAbsoluteUrlWillReturnFalse() + /** @dataProvider relativeFalseUrlProvider */ + public function testIsRelativeWillReturnFalse($url) { - $this->assertFalse(BaseUrl::isRelative('https://acme.com/tnt-room=123')); + $this->assertFalse(BaseUrl::isRelative($url)); } - public function testUrlStartingWithDoubleSlashesWillReturnFalse() + public function testEnsureSchemeWithRelativeUrlWillReturnInputUrl() { - $this->assertFalse(BaseUrl::isRelative('//example.com')); + $url = 'acme.com?name=bugs.bunny'; + $this->assertEquals('acme.com?name=bugs.bunny', BaseUrl::ensureScheme($url, 'https')); } - public function testIsRelativeWithRelativeUrlWillReturnTrue() + public function testEnsureSchemeWithRelativeUrlWithAnotherUrlAsParamWillReturnInputUrl() { - $this->assertTrue( - BaseUrl::isRelative('acme.com/tnt-room=123') + $this->assertEquals('acme.com/test?tnt-link=https://tnt.com/', + BaseUrl::ensureScheme('acme.com/test?tnt-link=https://tnt.com/', 'https') ); } - public function testIsRelativeWithRelativeUrlHavingHttpsUrlAsParamValueWillReturnTrue() + public function testEnsureSchemeWithSchemeNotAStringWillReturnInputUrl() { - $this->assertTrue(BaseUrl::isRelative( - 'acme.com/tnt-room-link=https://asd.com' - )); + $url = 'acme.com?name=bugs.bunny'; + $this->assertEquals('acme.com?name=bugs.bunny', BaseUrl::ensureScheme($url, 123)); } - public function testIsRelativeWithAbsoluteUrlHavingHttpsUrlAsParamValueWillReturnFalse() + public function testEnsureSchemeWithProtocolRelativeUrlAndHttpsSchemeWillBeNormalized() { - $this->assertFalse( - BaseUrl::isRelative('https://acme.com/tnt-link=https://tnt.com') - ); + $url = '//acme.com?characters/list'; + $this->assertEquals('https://acme.com?characters/list', BaseUrl::ensureScheme($url, 'https')); } - public function testIsRelativeWithA() + public function testEnsureSchemeWithProtocolRelativeUrlAndEmptySchemeWillBeReturned() { - $this->assertTrue( - BaseUrl::isRelative('/name=bugs.bunny') - ); + $url = '//acme.com?characters/list'; + $this->assertEquals('//acme.com?characters/list', BaseUrl::ensureScheme($url, '')); } - public function testIsRelativeWithFtpProtocolUrlWillReturnFalse() + public function testAbsoluteUrlProtocolAndEmptySchemeWillCreateProtocolRelativeUrl() { - $this->assertFalse( - BaseUrl::isRelative('ftp://ftp.acme.com/tnt-suppliers.txt') - ); + $url = 'https://acme.com?characters/list'; + $this->assertEquals('//acme.com?characters/list', BaseUrl::ensureScheme($url, '')); } - public function testIsRelativeWithHttpUrl() + public function testEnsureSchemeWithAbsoluteUrlWithAnotherUrlAsParamWillReturnInputUrl() { - $this->assertFalse( - BaseUrl::isRelative('http://no-protection.acme.com') - ); + $url = 'ss://acme.com/test?tnt-link=https://tnt.com/'; + $this->assertEquals('https://acme.com/test?tnt-link=https://tnt.com/', BaseUrl::ensureScheme($url, 'https')); } - public function testIsRelativeWithFileUrl() + public function relativeTrueUrlProvider() { - $this->assertFalse( - BaseUrl::isRelative('file:///home/User/2ndFile.html') - ); + return [ + 'url url without protocol' => [ + 'url' => 'acme.com/tnt-room=123', + ], + 'url without protocol and another url in a parameter value' => [ + 'url' => 'acme.com?tnt-room-link=https://tnt.com', + ], + 'path only' => [ + 'url' => '/path', + ], + 'path with param' => [ + 'url' => '/path=/home/user', + ], + ]; } + public function relativeFalseUrlProvider() + { + return [ + 'url with https protocol' => [ + 'url' => 'https://acme.com', + ], + 'url with https protocol and ending slash' => [ + 'url' => 'https://acme.com/', + ], + 'url with https protocol and another url as param value' => [ + 'url' => 'https://acme.com?tnt-link=https://tnt.com', + ], + 'url starting with two slashes' => [ + 'url' => '//example.com', + ], + 'url with ftp protocol' => [ + 'url' => 'ftp://ftp.acme.com/tnt-suppliers.txt', + ], + 'url with http protocol' => [ + 'url' => 'http://no-protection.acme.com', + ], + 'file url' => [ + 'url' => 'file:///home/User/2ndFile.html', + ] + ]; + } } From d45c1cc6f909df76484360914838ebb90ba72328 Mon Sep 17 00:00:00 2001 From: ggh2e3 Date: Sun, 3 Dec 2023 16:18:04 +0100 Subject: [PATCH 073/125] #17191: improved ensureScheme tests readability --- tests/framework/helpers/BaseUrlTest.php | 76 +++++++++++++------------ 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/tests/framework/helpers/BaseUrlTest.php b/tests/framework/helpers/BaseUrlTest.php index ecc76fec787..8967d6154c7 100644 --- a/tests/framework/helpers/BaseUrlTest.php +++ b/tests/framework/helpers/BaseUrlTest.php @@ -22,47 +22,51 @@ public function testIsRelativeWillReturnFalse($url) $this->assertFalse(BaseUrl::isRelative($url)); } - public function testEnsureSchemeWithRelativeUrlWillReturnInputUrl() + /** @dataProvider ensureSchemeUrlProvider */ + public function testEnsureScheme() { - $url = 'acme.com?name=bugs.bunny'; - $this->assertEquals('acme.com?name=bugs.bunny', BaseUrl::ensureScheme($url, 'https')); - } - - public function testEnsureSchemeWithRelativeUrlWithAnotherUrlAsParamWillReturnInputUrl() - { - $this->assertEquals('acme.com/test?tnt-link=https://tnt.com/', - BaseUrl::ensureScheme('acme.com/test?tnt-link=https://tnt.com/', 'https') - ); - } - - public function testEnsureSchemeWithSchemeNotAStringWillReturnInputUrl() - { - $url = 'acme.com?name=bugs.bunny'; - $this->assertEquals('acme.com?name=bugs.bunny', BaseUrl::ensureScheme($url, 123)); - } - - public function testEnsureSchemeWithProtocolRelativeUrlAndHttpsSchemeWillBeNormalized() - { - $url = '//acme.com?characters/list'; - $this->assertEquals('https://acme.com?characters/list', BaseUrl::ensureScheme($url, 'https')); - } - public function testEnsureSchemeWithProtocolRelativeUrlAndEmptySchemeWillBeReturned() - { - $url = '//acme.com?characters/list'; - $this->assertEquals('//acme.com?characters/list', BaseUrl::ensureScheme($url, '')); } - public function testAbsoluteUrlProtocolAndEmptySchemeWillCreateProtocolRelativeUrl() + public function ensureSchemeUrlProvider() { - $url = 'https://acme.com?characters/list'; - $this->assertEquals('//acme.com?characters/list', BaseUrl::ensureScheme($url, '')); - } - - public function testEnsureSchemeWithAbsoluteUrlWithAnotherUrlAsParamWillReturnInputUrl() - { - $url = 'ss://acme.com/test?tnt-link=https://tnt.com/'; - $this->assertEquals('https://acme.com/test?tnt-link=https://tnt.com/', BaseUrl::ensureScheme($url, 'https')); + return [ + 'relative url and https scheme will return input url' => [ + 'url' => 'acme.com?name=bugs.bunny', + 'scheme' => 'https', + 'expected result' => 'acme.com?name=bugs.bunny', + ], + 'relative url and another url as parameter will return input url' => [ + 'url' => 'acme.com/test?tnt-link=https://tnt.com/', + 'scheme' => 'https', + 'expected' => 'acme.com/test?tnt-link=https://tnt.com/', + ], + 'url with scheme not a string will return input url' => [ + 'url' => 'acme.com?name=bugs.bunny', + 'scheme' => 123, + 'expected' => 'acme.com?name=bugs.bunny', + ], + 'protocol relative url and https scheme will be processed' => [ + 'url' => '//acme.com?characters/list', + 'scheme' => 'https', + 'expected' => 'https://acme.com?characters/list', + ], + 'protocol relative url and empty scheme will be returned' => [ + 'url' => '//acme.com?characters/list', + 'scheme' => '', + 'expected' => '//acme.com?characters/list', + ], + 'absolute url and empty scheme will create protocol relative url' => [ + 'url' => 'https://acme.com?characters/list', + 'scheme' => '', + 'expected' => '//acme.com?characters/list', + ], + 'absolute url and different scheme will be processed' => [ + 'url' => 'http://acme.com/test?tnt-link=https://tnt.com/', + 'scheme' => 'https', + 'expected' => 'https://acme.com/test?tnt-link=https://tnt.com/', + ] + ]; } public function relativeTrueUrlProvider() From 005a9c72652b721c0139fb77af31838c7b8d727e Mon Sep 17 00:00:00 2001 From: ggh2e3 Date: Sun, 3 Dec 2023 16:21:45 +0100 Subject: [PATCH 074/125] #17191: improved ensureScheme tests readability --- tests/framework/helpers/BaseUrlTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/framework/helpers/BaseUrlTest.php b/tests/framework/helpers/BaseUrlTest.php index 8967d6154c7..9bcd39ef981 100644 --- a/tests/framework/helpers/BaseUrlTest.php +++ b/tests/framework/helpers/BaseUrlTest.php @@ -23,9 +23,9 @@ public function testIsRelativeWillReturnFalse($url) } /** @dataProvider ensureSchemeUrlProvider */ - public function testEnsureScheme() + public function testEnsureScheme($url, $scheme, $expected) { - + $this->assertEquals($expected, BaseUrl::ensureScheme($url, $scheme)); } public function ensureSchemeUrlProvider() From 76f17336fe30ea604e5e9af4f2f9dcd1a8fc8411 Mon Sep 17 00:00:00 2001 From: ggh2e3 Date: Sun, 3 Dec 2023 16:27:39 +0100 Subject: [PATCH 075/125] #17191: updated changelog --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 6645863bfd7..0a95132681a 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #17191: Fixed `BaseUrl::isRelative($url)` method in `yii\helpers\BaseUrl` (ggh2e3) - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) From 4c959b5390e356cf7483ee4e7e8bb89180454054 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 23 Dec 2023 16:58:40 +0900 Subject: [PATCH 076/125] docs/guide-ja/* updated (#20088) --- docs/guide-ja/README.md | 1 + docs/guide-ja/caching-data.md | 2 +- docs/guide-ja/concept-behaviors.md | 4 +- docs/guide-ja/concept-di-container.md | 2 +- docs/guide-ja/concept-service-locator.md | 2 +- docs/guide-ja/db-migrations.md | 2 +- docs/guide-ja/db-query-builder.md | 2 +- docs/guide-ja/input-tabular-input.md | 31 ++- docs/guide-ja/input-validation.md | 2 +- docs/guide-ja/output-data-providers.md | 6 +- docs/guide-ja/output-data-widgets.md | 2 +- docs/guide-ja/output-formatting.md | 2 +- docs/guide-ja/rest-authentication.md | 2 +- docs/guide-ja/rest-filtering-collections.md | 190 ++++++++++++++++++ docs/guide-ja/rest-resources.md | 8 - docs/guide-ja/rest-response-formatting.md | 2 +- docs/guide-ja/rest-versioning.md | 2 +- docs/guide-ja/runtime-requests.md | 5 +- docs/guide-ja/security-authorization.md | 2 +- docs/guide-ja/security-best-practices.md | 4 +- .../structure-application-components.md | 2 +- docs/guide-ja/structure-applications.md | 4 +- docs/guide-ja/structure-assets.md | 2 +- docs/guide-ja/structure-controllers.md | 2 +- docs/guide-ja/structure-extensions.md | 4 +- docs/guide-ja/structure-filters.md | 2 +- docs/guide-ja/test-fixtures.md | 4 +- docs/guide-ja/test-functional.md | 2 +- docs/guide-ja/test-unit.md | 2 +- docs/guide-ja/tutorial-mailing.md | 13 +- 30 files changed, 251 insertions(+), 59 deletions(-) create mode 100644 docs/guide-ja/rest-filtering-collections.md diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index b86e3aaad98..c2c7997c695 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -135,6 +135,7 @@ RESTful ウェブ・サービス * [クイック・スタート](rest-quick-start.md) * [リソース](rest-resources.md) +* [コレクションのフィルタリング](rest-filtering-collections.md) * [コントローラ](rest-controllers.md) * [ルーティング](rest-routing.md) * [レスポンス形式の設定](rest-response-formatting.md) diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md index 513fdc59466..d2ae54e6fa6 100644 --- a/docs/guide-ja/caching-data.md +++ b/docs/guide-ja/caching-data.md @@ -57,7 +57,7 @@ $data = $cache->getOrSet($key, function () use ($user_id) { キャッシュ・コンポーネントは通常グローバルに設定しアクセスできるように [アプリケーション・コンポーネント](structure-application-components.md) として登録されます。 -以下のコードは、二台のキャッシュ・サーバを用いる [Memcached](https://memcached.org/) を使うように +以下のコードは、二台のキャッシュ・サーバを用いる [memcached](https://memcached.org/) を使うように `cache` アプリケーション・コンポーネントを構成する方法を示すものです。 ```php diff --git a/docs/guide-ja/concept-behaviors.md b/docs/guide-ja/concept-behaviors.md index a8583d92387..4389d7637ad 100644 --- a/docs/guide-ja/concept-behaviors.md +++ b/docs/guide-ja/concept-behaviors.md @@ -1,8 +1,8 @@ ビヘイビア ========== -ビヘイビアは [[yii\base\Behavior]] またその子クラスのインスタンスです。ビヘイビアは -[ミックスイン](https://ja.wikipedia.org/wiki/Mixin) としても知られ、既存の [[yii\base\Component|component]] クラスの +ビヘイビアは [[yii\base\Behavior]] またその子クラスのインスタンスです。 +ビヘイビアは [ミックスイン](https://ja.wikipedia.org/wiki/Mixin) としても知られ、既存の [[yii\base\Component|component]] クラスの 機能を、クラスの継承を変更せずに拡張することができます。コンポーネントにビヘイビアをアタッチすると、その コンポーネントにはビヘイビアのメソッドとプロパティが "注入" され、それらのメソッドとプロパティは、 コンポーネント・クラス自体に定義されているかのようにアクセスできるようになります。また、ビヘイビアは、 diff --git a/docs/guide-ja/concept-di-container.md b/docs/guide-ja/concept-di-container.md index 9580d425118..c603b5cf615 100644 --- a/docs/guide-ja/concept-di-container.md +++ b/docs/guide-ja/concept-di-container.md @@ -541,7 +541,7 @@ $reader = $container->get('app\storage\DocumentsReader'); 依存注入と [サービス・ロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 定番のデザインパターンです。 -依存注入とサービス・ロケータへのより深い理解を得るために、 [Martin の記事](https://martinfowler.com/articles/injection.html) +依存注入とサービス・ロケータをより深く理解するために、 [Martin の記事](https://martinfowler.com/articles/injection.html) を読むことを強くお勧めします。 Yii はその [サービス・ロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。 diff --git a/docs/guide-ja/concept-service-locator.md b/docs/guide-ja/concept-service-locator.md index e3082432de0..7cf325dac34 100644 --- a/docs/guide-ja/concept-service-locator.md +++ b/docs/guide-ja/concept-service-locator.md @@ -129,4 +129,4 @@ return [ モジュールからサービスを引き出そうとする全てのリクエストは、そのモジュールが要求に応じられない場合は、すべてその親に渡されます。 モジュール内のコンポーネントの構成情報は、親モジュール内のコンポーネントの構成情報とは決してマージされないことに注意して下さい。 -サービス・ロケータ・パターンによって私たちは名前の付いたサービスを定義することが出来ますが、同じ名前のサービスが同じ構成パラメータを使用すると想定することは出来ません。 +サービス・ロケータのパターンによって私たちは名前の付いたサービスを定義することが出来ますが、同じ名前のサービスが同じ構成パラメータを使用すると想定することは出来ません。 diff --git a/docs/guide-ja/db-migrations.md b/docs/guide-ja/db-migrations.md index a0b489cb0cd..6fa39cfae34 100644 --- a/docs/guide-ja/db-migrations.md +++ b/docs/guide-ja/db-migrations.md @@ -685,7 +685,7 @@ class m150101_185401_create_news_table extends Migration `safeDown()` では、先に行を削除して、次にテーブルを削除しています。 > Note: 全ての DBMS がトランザクションをサポートしている訳ではありません。また、トランザクションに入れることが出来ない DB クエリもあります。 - いくつかの例を [暗黙のコミット](https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html) で見ることが出来ます。 + そのいくつかの例を [暗黙のコミット](https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html) で見ることが出来ます。 その場合には、代りに、`up()` と `down()` を実装しなければなりません。 diff --git a/docs/guide-ja/db-query-builder.md b/docs/guide-ja/db-query-builder.md index 996b2a542f9..170e1aa2c89 100644 --- a/docs/guide-ja/db-query-builder.md +++ b/docs/guide-ja/db-query-builder.md @@ -299,7 +299,7 @@ $query->where([$column => $value]); 値が自動的に一対のパーセント記号によって囲まれることに注意してください。 > Note: PostgreSQL を使っている場合は、`like` の代りに、大文字と小文字を区別しない比較のための - > [`ilike`](https://www.postgresql.org/docs/8.3/functions-matching.html#FUNCTIONS-LIKE) を使うことも出来ます。 + > [`ilike`](https://www.postgresql.org/docs/8.3/static/functions-matching.html#FUNCTIONS-LIKE) を使うことも出来ます。 - `or like`: オペランド 2 が配列である場合に `LIKE` 述語が `OR` によって結合される以外は、 `like` 演算子と同じです。 diff --git a/docs/guide-ja/input-tabular-input.md b/docs/guide-ja/input-tabular-input.md index 252ca07a14b..48f2f7e986e 100644 --- a/docs/guide-ja/input-tabular-input.md +++ b/docs/guide-ja/input-tabular-input.md @@ -43,12 +43,14 @@ class SettingsController extends Controller { $settings = Setting::find()->indexBy('id')->all(); - if (Model::loadMultiple($settings, Yii::$app->request->post()) && Model::validateMultiple($settings)) { + if ($this->request->isPost) { + if (Setting::loadMultiple($settings, $this->request->post()) && Setting::validateMultiple($settings)) { foreach ($settings as $setting) { $setting->save(false); } return $this->redirect('index'); } + } return $this->render('update', ['settings' => $settings]); } @@ -71,10 +73,12 @@ use yii\widgets\ActiveForm; $form = ActiveForm::begin(); -foreach ($settings as $index => $setting) { - echo $form->field($setting, "[$index]value")->label($setting->name); +foreach ($settings as $id => $setting) { + echo $form->field($setting, "[$id]value")->label($setting->name); } +echo Html::submitButton('Save'); + ActiveForm::end(); ``` @@ -88,20 +92,29 @@ ActiveForm::end(); ```php public function actionCreate() { - $count = count(Yii::$app->request->post('Setting', [])); - $settings = [new Setting()]; - for($i = 1; $i < $count; $i++) { - $settings[] = new Setting(); + $settings = []; + if ($this->request->isPost) { + $count = count($this->request->post($setting->tableName())) - 1; + for ($i = 0; $i < $count; $i++) { + $settings[$i] = new Setting(); + } + if (Setting::loadMultiple($settings, $this->request->post()) && Setting::validateMultiple($settings)) { + foreach ($settings as $setting) { + $setting->save(false); + } + return $this->redirect('index'); } + } + $settings[] = new Setting(); - // ... + return $this->render('create', ['settings' => $settings]); } ``` ここでは、デフォルトで一個のモデルを含む `$settings` 配列を初期値として作成し、少なくとも一個のテキスト・フィールドが常にビューに表示されるようにしています。 そして、受信したインプットの行数に合せて、配列にモデルを追加しています。 -ビューでは javascript を使ってインプットの行を動的に追加することが出来ます。 +ビューでは JavaScript を使ってインプットの行を動的に追加することが出来ます。 ### 更新、作成、削除を一つのページに組み合わせる diff --git a/docs/guide-ja/input-validation.md b/docs/guide-ja/input-validation.md index 420317c0f35..b8826135377 100644 --- a/docs/guide-ja/input-validation.md +++ b/docs/guide-ja/input-validation.md @@ -748,7 +748,7 @@ JS; ### Deferred 検証 -非同期のクライアント・サイドの検証をサポートする必要がある場合は、[Defered オブジェクト](https://api.jquery.com/category/deferred-object/) を作成することが出来ます。 +非同期のクライアント・サイドの検証をサポートする必要がある場合は、[Deferred オブジェクト](https://api.jquery.com/category/deferred-object/) を作成することが出来ます。 例えば、AJAX によるカスタム検証を実行するために、次のコードを使うことが出来ます。 ```php diff --git a/docs/guide-ja/output-data-providers.md b/docs/guide-ja/output-data-providers.md index d15d313f457..0344016325d 100644 --- a/docs/guide-ja/output-data-providers.md +++ b/docs/guide-ja/output-data-providers.md @@ -354,13 +354,13 @@ $filter = new ActiveDataFilter([ $filterCondition = null; -// どのようなソースからでもフィルタをロードすることが出来ます。 -// 例えば、リクエスト・ボディの JSON からロードしたい場合は、 +// どのようなソースからでもフィルタをロードすることが出来ます。例えば、 +// リクエスト・ボディの JSON からロードしたい場合は、 // 下記のように Yii::$app->request->getBodyParams() を使います。 if ($filter->load(\Yii::$app->request->get())) { $filterCondition = $filter->build(); if ($filterCondition === false) { - // シリアライザがエラーを抽出するだろう + // シリアライザがフィルタの抽出でエラーを出すかもしれない return $filter; } } diff --git a/docs/guide-ja/output-data-widgets.md b/docs/guide-ja/output-data-widgets.md index 28946fe3393..b4dd7d4a05c 100644 --- a/docs/guide-ja/output-data-widgets.md +++ b/docs/guide-ja/output-data-widgets.md @@ -777,4 +777,4 @@ yii gii/crud --controllerClass="backend\\controllers\PostController" \ さらに読むべき文書 ------------------ -- Arno Slatius による [Rendering Data in Yii 2 with GridView and ListView](https://www.sitepoint.com/rendering-data-in-yii-2-with-gridview-and-listview/)。 +- Arno Slatius による [Rendering Data in Yii 2 with GridView and ListView](https://www.sitepoint.com/rendering-data-in-yii-2-with-gridview-and-listview/) diff --git a/docs/guide-ja/output-formatting.md b/docs/guide-ja/output-formatting.md index bcfaabc9d6c..4faf5c3c3ac 100644 --- a/docs/guide-ja/output-formatting.md +++ b/docs/guide-ja/output-formatting.md @@ -75,7 +75,7 @@ return [ - [[yii\i18n\Formatter::asDate()|date]] - 値は日付としてフォーマットされます。例えば `January 01, 2014`。 - [[yii\i18n\Formatter::asTime()|time]] - 値は時刻としてフォーマットされます。例えば `14:23`。 - [[yii\i18n\Formatter::asDatetime()|datetime]] - 値は日付および時刻としてフォーマットされます。例えば `January 01, 2014 14:23`。 -- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - 値は [unix タイムスタンプ](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93) としてフォーマットされます。例えば `1412609982`。 +- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - 値は [unix タイムスタンプ](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93) としてフォーマットされます。例えば `1412609982` - [[yii\i18n\Formatter::asRelativeTime()|relativeTime]] - 値は、その日時と現在との間隔として、人間に分かりやすい言葉でフォーマットされます。 例えば `1 hour ago`。 - [[yii\i18n\Formatter::asDuration()|duration]] - 値は継続時間として、人間に分かりやすい言葉でフォーマットされます。例えば `1 day, 2 minutes`。 diff --git a/docs/guide-ja/rest-authentication.md b/docs/guide-ja/rest-authentication.md index a811526f1a5..6a236cea835 100644 --- a/docs/guide-ja/rest-authentication.md +++ b/docs/guide-ja/rest-authentication.md @@ -12,7 +12,7 @@ * [HTTP Basic 認証](https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC): アクセス・トークンはユーザ名として送信されます。 この方法は、アクセス・トークンを API コンシューマ側で安全に保存することが出来る場合、 - 例えば API コンシューマがサーバ上で走るプログラムである場合などにのみ使用されるべきです。 + 例えば API コンシューマがサーバ上で走るプログラムである場合などのみに使用されるべきです。 * クエリ・パラメータ: アクセス・トークンは API の URL、例えば、`https://example.com/users?access-token=xxxxxxxx` でクエリ・パラメータとして送信されます。 ほとんどのウェブ・サーバはクエリ・パラメータをサーバのログに記録するため、この手法は、 diff --git a/docs/guide-ja/rest-filtering-collections.md b/docs/guide-ja/rest-filtering-collections.md new file mode 100644 index 00000000000..7eb809679e5 --- /dev/null +++ b/docs/guide-ja/rest-filtering-collections.md @@ -0,0 +1,190 @@ +コレクションのフィルタリング +============================ + +バージョン 2.0.13 以降、リソースのコレクションは [[yii\data\DataFilter]] コンポーネントを使ってフィルタにかけることが出来ます。 +このコンポーネントは、リクエスト経由で渡されるフィルタ条件の構築を可能にし、そして、拡張バージョンの [[yii\data\ActiveDataFilter]] の助力によって、 +[[yii\db\QueryInterface::where()]] にとって適切な形式でフィルタ条件を使う事を可能にします。 + + +## データ・プロバイダをフィルタリングのために構成する + +[コレクション](rest-resources.md#collections) のセクションで言及されているように、 +[データ・プロバイダ](output-data-providers#data-providers) を使うと、並べ替えてページ付けしたリソースのリストを出力することが出来ます。 +また、データ・プロバイダを使って、そのリストをフィルタにかけることも出来ます。 + +```php +$filter = new ActiveDataFilter([ + 'searchModel' => 'app\models\PostSearch', +]); + +$filterCondition = null; +// どのようなソースからでもフィルタをロードすることが出来ます。例えば、 +// リクエスト・ボディの JSON からロードしたい場合は、 +// 下記のように Yii::$app->request->getBodyParams() を使います。 +if ($filter->load(Yii::$app->request->get())) { + $filterCondition = $filter->build(); + if ($filterCondition === false) { + // シリアライザがフィルタの抽出でエラーを出すかもしれない + return $filter; + } +} + +$query = Post::find(); +if ($filterCondition !== null) { + $query->andWhere($filterCondition); +} + +return new ActiveDataProvider([ + 'query' => $query, +]); +``` + +`PostSearch` モデルが、どのプロパティと値がフィルタリングのために許容されるかを定義する役目を担います。 + +```php +use yii\base\Model; + +class PostSearch extends Model +{ + public $id; + public $title; + + public function rules() + { + return [ + ['id', 'integer'], + ['title', 'string', 'min' => 2, 'max' => 200], + ]; + } +} +``` + +そこで特別なビジネス・ロジックが必要でない場合には、検索ルールのためのスタンドアロンなモデルを準備する代わりに、 +[[yii\base\DynamicModel]] を使うことが出来ます。 + +```php +$filter = new ActiveDataFilter([ + 'searchModel' => (new DynamicModel(['id', 'title'])) + ->addRule(['id'], 'integer') + ->addRule(['title'], 'string', ['min' => 2, 'max' => 200]), +]); +``` + +`searchModel` を定義することは、エンド・ユーザに許容するフィルタ条件を制御するために欠かすことが出来ません。 + + +## リクエストのフィルタリング + +通常、エンド・ユーザは許容された一つ以上のメソッド(これらはAPIドキュメントに明示的に記述されるべきものです)を使ってフィルタリング条件をリクエストで提供するものと期待されます。 +例えば、フィルタリングが JSON を使って POST メソッドで操作される場合は、 +下記と似たようなものになります。 + +```json +{ + "filter": { + "id": {"in": [2, 5, 9]}, + "title": {"like": "cheese"} + } +} +``` + +上記の条件は、次のように解釈されます : +- `id` は、2, 5, または 9 でなければならず、**かつD** +- `title` は `cheese` という語を含まなければならない。 + +同一の条件が GET クエリの一部として送信される場合は、次のようになります : + +``` +?filter[id][in][]=2&filter[id][in][]=5&filter[id][in][]=9&filter[title][like]=cheese +``` + +デフォルトの `filter` キー・ワードは、[[yii\data\DataFilter::$filterAttributeName]] を設定して変更することが出来ます。 + + +## フィルタ制御キーワード + +許容されているフィルタ制御キーワードは下記の通りです : + +| キーワード | 意味 | +|:--------------:|:-------------:| +| `and` | `AND` | +| `or` | `OR` | +| `not` | `NOT` | +| `lt` | `<` | +| `gt` | `>` | +| `lte` | `<=` | +| `gte` | `>=` | +| `eq` | `=` | +| `neq` | `!=` | +| `in` | `IN` | +| `nin` | `NOT IN` | +| `like` | `LIKE` | + +オプションの [[yii\data\DataFilter::$filterControls]] を拡張して、上記のリストを拡張することが出来ます。 +例えば、下記のように、同一のフィルタ構築キーにいくつかのキーワードを与えて、複数のエイリアスを作成することが出来ます : + +```php +[ + 'eq' => '=', + '=' => '=', + '==' => '=', + '===' => '=', + // ... +] +``` + +未定義のキーワードは、すべて、フィルタ制御とは認識されず、属性名として扱われることに注意して下さい。 +制御キーワードと属性名の衝突は避けなければなりません。 +(例えば、制御キーワードとしての 'like' と属性名としての 'like' が存在する場合、そのような属性に対して条件を指定することは不可能です。) + +> Note: フィルタ制御を指定する時に、あなたのAPIが使用する実際のデータ交換形式に留意しましょう。 + すべての指定された制御キーワードがその形式にとって妥当なものであることを確認して下さい。 + 例えば、XML ではタグ名は Letter クラスの文字でしか開始出来ませんから、`>`, `=`, `$gt` 等は XML スキーマに違反することになります。 + +> Note: 新しいフィルタ制御キーワードを追加する時は、演算子の結合規則および所期の動作に基づいて、期待されるクエリ結果を得るためには + [[yii\data\DataFilter::$conditionValidators]] および/または [[yii\data\DataFilter::$operatorTypes]] をも + 更新する必要があるかどうか、必ず確認して下さい。 + + +## Null 値の扱い + +JSON の式野中では `null` を使う事は容易ですが、文字通りの 'null' を文字列としての "null" と混乱させずに GET クエリを使ってを送信することは不可能です。 +バージョン 2.0.40 以降では、[[yii\data\DataFilter::$nullValue]] オプションを使って、文字通りの `null` に置換される単語(デフォルトでは、"NULL")を構成することが出来ます。 + + +## 属性のエイリアス + +属性を別の名前で呼びたい場合や、結合された DB テーブルでフィルタをかけたい場合に、 +[[yii\data\DataFilter::$attributeMap]] を使ってエイリアスのマップを設定することが出来ます。 + +```php +[ + 'carPart' => 'car_part', // car_part 属性でフィルタするために carPart が使われる + 'authorName' => '{{author}}.[[name]]', // 結合された author テーブルの name 属性でフィルタするために authorName が使われる +] +``` + +## `ActiveController` のためにフィルタを構成する + +[[yii\rest\ActiveController]] には一般的な一揃いの REST アクションが失踪されていますが、 +[[yii\rest\IndexAction::$dataFilter]] プロパティによってフィルタを使うことも簡単に出来ます。 +可能な方法のうちの一つは [[yii\rest\ActiveController::actions()]] を使ってそうすることです : + +```php +public function actions() +{ + $actions = parent::actions(); + + $actions['index']['dataFilter'] = [ + 'class' => \yii\data\ActiveDataFilter::class, + 'attributeMap' => [ + 'clockIn' => 'clock_in', + ], + 'searchModel' => (new DynamicModel(['id', 'clockIn']))->addRule(['id', 'clockIn'], 'integer', ['min' => 1]), + ]; + + return $actions; +} +``` + +これで(`index` アクションによってアクセス可能な)コレクションを `id` と `clockIn` プロパティによってフィルタすることが出来ます。 diff --git a/docs/guide-ja/rest-resources.md b/docs/guide-ja/rest-resources.md index 09020bca275..07f71703825 100644 --- a/docs/guide-ja/rest-resources.md +++ b/docs/guide-ja/rest-resources.md @@ -251,11 +251,3 @@ class PostController extends Controller REST API におけるコレクションはデータ・プロバイダであるため、データ・プロバイダの全ての機能、すなわち、ページネーションやソーティングを共有しています。 その一例を [クイック・スタート](rest-quick-start.md#trying-it-out) のセクションで見ることが出来ます。 - -### コレクションをフィルタリングする - -バージョン 2.0.13 以降、Yii はコレクションをフィルタリングする便利な機能を提供しています。 -その一例を [クイック・スタート](rest-quick-start.md#trying-it-out) のガイドに見ることが出来ます。 -エンド・ボイントをあなた自身が実装しようとしている場合、フィルタリングは -データ・プロバイダのガイドの [データ・フィルタを使ってデータ・プロバイダをフィルタリングする](output-data-providers.md#filtering-data-providers-using-data-filters - のセクションで述べられている方法で行うことが出来ます。 diff --git a/docs/guide-ja/rest-response-formatting.md b/docs/guide-ja/rest-response-formatting.md index f30433f0170..502d5707a08 100644 --- a/docs/guide-ja/rest-response-formatting.md +++ b/docs/guide-ja/rest-response-formatting.md @@ -3,7 +3,7 @@ RESTful API のリクエストを処理するとき、アプリケーションは、通常、レスポンス形式の設定に関して次のステップを踏みます。 -1. レスポンス形式に影響するさまざまな要因、例えば、メディア・タイプ、言語、バージョンなどを決定します。 +1. レスポンス形式に影響しうるさまざまな要因、例えば、メディア・タイプ、言語、バージョンなどを決定します。 このプロセスは [コンテント・ネゴシエーション](https://en.wikipedia.org/wiki/Content_negotiation) としても知られるものです。 2. リソース・オブジェクトを配列に変換します。 [リソース](rest-resources.md) のセクションで説明したように、この作業は [[yii\rest\Serializer]] によって実行されます。 diff --git a/docs/guide-ja/rest-versioning.md b/docs/guide-ja/rest-versioning.md index f9b73f9006c..6b89c8e07ae 100644 --- a/docs/guide-ja/rest-versioning.md +++ b/docs/guide-ja/rest-versioning.md @@ -5,7 +5,7 @@ クライアント・サイドとサーバ・サイドの両方のコードを完全に制御できるウェブ・アプリケーションとは違って、API はあなたの制御が及ばないクライアントによって使用されることを想定したものです。このため、API の後方互換性 (BC) は、可能な限り保たれなければなりません。 BC を損なうかも知れない変更が必要な場合は、それを API の新しいバージョンにおいて導入し、バージョン番号を上げるべきです。そうすれば、既存のクライアントは、API の古いけれども動作するバージョンを使い続けることが出来ますし、新しいまたはアップグレードされたクライアントは、新しい API バージョンで新しい機能を使うことが出来ます。 -> Tip: API のバージョン番号の設計に関する詳細情報は +> Tip: API のバージョン番号の設計についての詳細な情報は [Semantic Versioning](https://semver.org/) を参照してください。 API のバージョン管理を実装する方法としてよく使われるのは、バージョン番号を API の URL に埋め込む方法です。 diff --git a/docs/guide-ja/runtime-requests.md b/docs/guide-ja/runtime-requests.md index 94257ad13a6..fde78a39a99 100644 --- a/docs/guide-ja/runtime-requests.md +++ b/docs/guide-ja/runtime-requests.md @@ -152,8 +152,9 @@ Yii アプリケーションに渡されるからです。 信頼できるプロキシの情報を構成することが出来るようになっています。 [[yii\web\Request::trustedHosts|trustedHosts]]、 [[yii\web\Request::secureHeaders|secureHeaders]]、 -[[yii\web\Request::ipHeaders|ipHeaders]] および -[[yii\web\Request::secureProtocolHeaders|secureProtocolHeaders]] +[[yii\web\Request::ipHeaders|ipHeaders]] +[[yii\web\Request::secureProtocolHeaders|secureProtocolHeaders]] および +[[yii\web\Request::portHeaders|portHeaders]] (2.0.46 以降) 以下は、リバース・プロキシ・アレイの背後で動作するアプリケーションのための、request の構成例です (リバース・プロキシ・アレイは `10.0.2.0/24` のネットワークに設置されているとします)。 diff --git a/docs/guide-ja/security-authorization.md b/docs/guide-ja/security-authorization.md index 6375122461f..8b22f1591a8 100644 --- a/docs/guide-ja/security-authorization.md +++ b/docs/guide-ja/security-authorization.md @@ -157,7 +157,7 @@ class SiteController extends Controller ロール・ベース・アクセス制御 (RBAC) は、単純でありながら強力な集中型のアクセス制御を提供します。 RBAC と他のもっと伝統的なアクセス制御スキーマとの比較に関する詳細については、 -[Wiki 記事](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1) を参照してください。 +[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1) を参照してください。 Yii は、[NIST RBAC モデル](https://csrc.nist.gov/CSRC/media/Publications/conference-paper/1992/10/13/role-based-access-controls/documents/ferraiolo-kuhn-92.pdf) に従って、一般的階層型 RBAC を実装しています。 RBAC の機能は、[[yii\rbac\ManagerInterface|authManager]] [アプリケーション・コンポーネント](structure-application-components.md) を通じて提供されます。 diff --git a/docs/guide-ja/security-best-practices.md b/docs/guide-ja/security-best-practices.md index 5e39114c63f..d38e18faab9 100644 --- a/docs/guide-ja/security-best-practices.md +++ b/docs/guide-ja/security-best-practices.md @@ -333,8 +333,8 @@ H5BP プロジェクトが提供する構成例を参考にすることも出来 - Apache 2: - Nginx: -サーバの構成にアクセスする権限がない場合は、このような攻撃に対して防御するために、[[yii\filters\HostControl]] -フィルタを設定することが出来ます。 +サーバの構成にアクセスする権限がない場合は、このような攻撃に対して防御するために、 +[[yii\filters\HostControl]] フィルタを設定することが出来ます。 ```php // ウェブ・アプリケーション構成ファイル diff --git a/docs/guide-ja/structure-application-components.md b/docs/guide-ja/structure-application-components.md index a75554af1af..7575f172ca1 100644 --- a/docs/guide-ja/structure-application-components.md +++ b/docs/guide-ja/structure-application-components.md @@ -58,7 +58,7 @@ けれども、場合によっては、明示的にアクセスされないときでも、リクエストごとにアプリケーション・コンポーネントのインスタンスを作成したいことがあります。 そうするために、アプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストにそのコンポーネントの ID を挙げることが出来ます。 -また、カスタマイズしたコンポーネントをブートストラップするためにクロージャを用いることも出来ます。インスタンス化されたコンポーネントを返すことは要求されません。 +また、カスタマイズされたコンポーネントをブートストラップするためにクロージャを用いることも出来ます。インスタンス化されたコンポーネントを返すことは要求されません。 単に [[yii\base\Application]] のインスタンス化の後にコードを走らせるだけのためにクロージャを使うことも出来ます。 例えば、次のアプリケーション構成情報は、`log` コンポーネントが常にロードされることを保証するものです。 diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index 5ec671f5eb7..c3c44b8ba9f 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -276,7 +276,7 @@ if (YII_ENV_DEV) { このプロパティを使用して決定します。 言語を指定するのには、[IETF 言語タグ](https://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うことが推奨されます。 -例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。 +例えば、`en` は英語を意味しますが、`en-US` はアメリカ合衆国の英語を意味します。 このプロパティに関する詳細は [国際化](tutorial-i18n.md) のセクションで読むことが出来ます。 @@ -348,7 +348,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; [language](#language) プロパティと同様に、このプロパティは [IETF 言語タグ](https://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。 -例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。 +例えば、`en` は英語を意味しますが、`en-US` はアメリカ合衆国の英語を意味します。 このプロパティに関する詳細は [国際化](tutorial-i18n.md) のセクションで読むことが出来ます。 diff --git a/docs/guide-ja/structure-assets.md b/docs/guide-ja/structure-assets.md index 4d42f5faf8e..d9ad0a52915 100644 --- a/docs/guide-ja/structure-assets.md +++ b/docs/guide-ja/structure-assets.md @@ -208,7 +208,7 @@ class FontAwesomeAsset extends AssetBundle ### Bower と NPM のアセットのインストール ほとんどの JavaScript/CSS パッケージは、[Bower](https://bower.io/) および/または [NPM](https://www.npmjs.com/) によって管理されています。 -PHP の世界には PHP の依存を管理する Composer がありますが、PHP のパッケージと全く同じように +PHP の世界には Composer があって、PHP の依存を管理していますが、PHP のパッケージと全く同じように `composer.json` を使って Bower のパッケージも NPM のパッケージもロードすることが可能です。 このことを達成するために Composer の構成を少し修正しなければなりません。二つの方法があります。 diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md index a0cac8d8ed7..d67367d42bf 100644 --- a/docs/guide-ja/structure-controllers.md +++ b/docs/guide-ja/structure-controllers.md @@ -1,7 +1,7 @@ コントローラ ============ -コントローラは [MVC](https://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。 +コントローラは [MVC](https://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を構成するものです。 それは [[yii\base\Controller]] を拡張したクラスのオブジェクトであり、リクエストの処理とレスポンスの生成について責任を負います。 具体的には、コントローラは、[アプリケーション](structure-applications.md) から制御を引き継いだ後、 入ってきたリクエストのデータを分析し、それを [モデル](structure-models.md) に引き渡して、 diff --git a/docs/guide-ja/structure-extensions.md b/docs/guide-ja/structure-extensions.md index 66f47e30090..f2122ec43e0 100644 --- a/docs/guide-ja/structure-extensions.md +++ b/docs/guide-ja/structure-extensions.md @@ -75,7 +75,7 @@ Image::thumbnail('@webroot/img/test-image.jpg', 120, 120) 2. もし有れば、エクステンションによって提供されているクラス・オートローダをインストールする。 3. 指示に従って、依存するエクステンションを全てダウンロードしインストールする。 -エクステンションがクラス・オートローダを持っていなくても、[PSR-4 標準](https://www.php-fig.org/psr/psr-4/) に従っている場合は、Yii によって提供されているクラス・オートローダを使ってエクステンションのクラスをオートロードすることが出来ます。 +エクステンションがクラス・オートローダを持っていなくても、[PSR-4 標準](https://www.php-fig.org/psr/psr-4/) に従っている場合は、Yii が提供しているクラス・オートローダを使ってエクステンションのクラスをオートロードすることが出来ます。 必要なことは、エクステンションのルート・ディレクトリのための [ルート・エイリアス](concept-aliases.md#defining-aliases) を宣言することだけです。 例えば、エクステンションを `vendor/mycompany/myext` というディレクトリにインストールしたと仮定します。 そして、エクステンションのクラスは `myext` 名前空間の下にあるとします。 @@ -184,7 +184,7 @@ Yii のアプリケーションは、このファイルによって、どんな それぞれの依存パッケージについて、適切なバージョン制約 (例えば `1.*` や `@stable`) を指定することも忘れてはなりません。 あなたのエクステンションを安定バージョンとしてリリースする場合は、安定した依存パッケージを使ってください。 -たいていの JavaScript/CSS パッケージは、Composer ではなく、[Bower](https://bower.io/) および/または [NPM](https://www.npmjs.com/) を使って管理されています。 +たいていの JavaScript/CSS パッケージは、Composer の代りに、[Bower](https://bower.io/) および/または [NPM](https://www.npmjs.com/) を使って管理されています。 Yii は [Composer アセット・プラグイン](https://github.com/fxpio/composer-asset-plugin) を使って、この種のパッケージを Composer によって管理することを可能にしています。 あなたのエクステンションが Bower パッケージに依存している場合でも、次のように、 `composer.json` に依存パッケージをリストアップすることが簡単に出来ます。 diff --git a/docs/guide-ja/structure-filters.md b/docs/guide-ja/structure-filters.md index dd7e097648f..701765ae8a8 100644 --- a/docs/guide-ja/structure-filters.md +++ b/docs/guide-ja/structure-filters.md @@ -142,7 +142,7 @@ public function behaviors() ### 認証メソッド・フィルタ 認証メソッド・フィルタは、[HTTP Basic 認証](https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC)、 -[OAuth 2](https://oauth.net/2/) など、様々なメソッドを使ってユーザを認証するために使われるものです。 +[OAuth 2](https://oauth.net/2/) などの様々なメソッドを使ってユーザを認証するために使われるものです。 これらのフィルタ・クラスはすべて `yii\filters\auth` 名前空間の下にあります。 次の例は、[[yii\filters\auth\HttpBasicAuth]] の使い方を示すもので、HTTP Basic 認証に基づくアクセス・トークンを使ってユーザを認証しています。 diff --git a/docs/guide-ja/test-fixtures.md b/docs/guide-ja/test-fixtures.md index 953b7974787..9a8bc4ed6d8 100644 --- a/docs/guide-ja/test-fixtures.md +++ b/docs/guide-ja/test-fixtures.md @@ -107,8 +107,8 @@ DB と関係しないフィクスチャ (例えば、何らかのファイルや ## フィクスチャを使用する -[Codeception](https://codeception.com/) を使ってコードをテストしている場合は、フィクスチャのローディングとアクセスについては、 -内蔵されているサポートを使用することが出来ます。 +[Codeception](https://codeception.com/) を使ってコードをテストしている場合は、 +フィクスチャのローディングとアクセスについて、内蔵されているサポートを使用することが出来ます。 その他のテスト・フレームワークを使っている場合は、テスト・ケースで [[yii\test\FixtureTrait]] を使って同じ目的を達することが出来ます。 diff --git a/docs/guide-ja/test-functional.md b/docs/guide-ja/test-functional.md index 8a6274e9065..9a08f90653c 100644 --- a/docs/guide-ja/test-functional.md +++ b/docs/guide-ja/test-functional.md @@ -9,7 +9,7 @@ POST や GET のパラメータなどの環境変数を設定しておいてか 経験則から言うと、特別なウェブ・サーバ設定や JavaScript による複雑な UI を持たない場合は、 機能テストの方を選ぶべきです。 -機能テストは Codeception フレームワークの助けを借りて実装されています。これにつては、優れたドキュメントがあります。 +機能テストは Codeception フレームワークの助けを借りて実装されています。これについては、優れたドキュメントがあります。 - [Codeception for Yii framework](https://codeception.com/for/yii) - [Codeception Functional Tests](https://codeception.com/docs/04-FunctionalTests) diff --git a/docs/guide-ja/test-unit.md b/docs/guide-ja/test-unit.md index 77e596b8f84..2f6caca5cb1 100644 --- a/docs/guide-ja/test-unit.md +++ b/docs/guide-ja/test-unit.md @@ -9,7 +9,7 @@ Yii における単体テストは、PHPUnit と Codeception (こちらはオプ - [Codeception for Yii framework](https://codeception.com/for/yii) - [Codeception Unit Tests](https://codeception.com/docs/05-UnitTests) -- [PHPUnit のドキュメントの第2章以降](https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html). +- [第2章から始まる PHPUnit のドキュメント](https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html) ## ベーシック・テンプレート、アドバンスト・テンプレートのテストを実行する diff --git a/docs/guide-ja/tutorial-mailing.md b/docs/guide-ja/tutorial-mailing.md index 5c8e9dd8d4a..1f7ec10f362 100644 --- a/docs/guide-ja/tutorial-mailing.md +++ b/docs/guide-ja/tutorial-mailing.md @@ -8,7 +8,7 @@ Yii は電子メールの作成と送信をサポートしています。 実際のメール送信メカニズムはエクステンションによって提供されなければなりません。 と言うのは、メール送信はプロジェクトが異なるごとに異なる実装が必要とされるでしょうし、通常、外部のサービスやライブラリに依存するものだからです。 -ごく一般的な場合であれば、[yii2-swiftmailer](https://www.yiiframework.com/extension/yiisoft/yii2-swiftmailer) 公式エクステンションを使用することが出来ます。 +ごく一般的な場合であれば、yii2-symfonymailer](https://www.yiiframework.com/extension/yiisoft/yii2-symfonymailer) 公式エクステンションを使用することが出来ます。 構成 @@ -22,16 +22,11 @@ return [ //.... 'components' => [ 'mailer' => [ - 'class' => 'yii\swiftmailer\Mailer', + 'class' => 'yii\symfonymailer\Mailer', 'useFileTransport' => false, 'transport' => [ - 'class' => 'Swift_SmtpTransport', - 'encryption' => 'tls', - 'host' => 'your_mail_server_host', - 'port' => 'your_smtp_port', - 'username' => 'your_username', - 'password' => 'your_password', - ], + 'dsn' => 'smtp://user:pass@smtp.example.com:465', + ], ], ], ]; From dffb4c7529fba471a063260ae3149a02d14b7bd4 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 25 Dec 2023 12:20:09 +0300 Subject: [PATCH 077/125] Fix version in since tag --- framework/db/BaseActiveRecord.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index ab5414416c5..0791c45ec2f 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -1806,7 +1806,7 @@ private function isValueDifferent($newValue, $oldValue) * - active record instance represented by array (i.e. active record was loaded using [[ActiveQuery::asArray()]]). * @param string|array $relationNames the names of the relations of primary models to be loaded from database. See [[ActiveQueryInterface::with()]] on how to specify this argument. * @param bool $asArray whether to load each related model as an array or an object (if the relation itself does not specify that). - * @since 2.0.49 + * @since 2.0.50 */ public static function loadRelationsFor(&$models, $relationNames, $asArray = false) { @@ -1833,7 +1833,7 @@ public static function loadRelationsFor(&$models, $relationNames, $asArray = fal * * @param string|array $relationNames the names of the relations of this model to be loaded from database. See [[ActiveQueryInterface::with()]] on how to specify this argument. * @param bool $asArray whether to load each relation as an array or an object (if the relation itself does not specify that). - * @since 2.0.49 + * @since 2.0.50 */ public function loadRelations($relationNames, $asArray = false) { From c7b4b1dcdde1cf38e56aa1141415f8604e6dacb4 Mon Sep 17 00:00:00 2001 From: g41797 Date: Wed, 3 Jan 2024 09:54:59 +0200 Subject: [PATCH 078/125] Get rid of deprecation warnings for trim() [PHP8.3] (#20090) --- framework/web/UrlManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php index 292c4bc3e70..71c38f85d49 100644 --- a/framework/web/UrlManager.php +++ b/framework/web/UrlManager.php @@ -413,7 +413,7 @@ public function createUrl($params) $anchor = isset($params['#']) ? '#' . $params['#'] : ''; unset($params['#'], $params[$this->routeParam]); - $route = trim($params[0], '/'); + $route = trim(isset($params[0]) ? $params[0] : '', '/'); unset($params[0]); $baseUrl = $this->showScriptName || !$this->enablePrettyUrl ? $this->getScriptUrl() : $this->getBaseUrl(); From dea891ed6a80faa21dd468e8813e0f6fcae0381a Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 3 Jan 2024 20:02:28 +0900 Subject: [PATCH 079/125] docs/guide-ja updated (#20091) --- docs/guide-ja/caching-fragment.md | 5 +++++ docs/guide-ja/concept-configurations.md | 4 ++-- docs/guide-ja/concept-properties.md | 4 ++-- docs/guide-ja/db-dao.md | 2 +- docs/guide-ja/intro-upgrade-from-v1.md | 2 +- docs/guide-ja/output-client-scripts.md | 4 ++-- docs/guide-ja/output-sorting.md | 2 +- docs/guide-ja/runtime-sessions-cookies.md | 3 ++- docs/guide-ja/start-databases.md | 4 ++-- docs/guide-ja/start-prerequisites.md | 2 +- docs/guide-ja/structure-models.md | 2 ++ docs/guide-ja/test-overview.md | 2 +- docs/guide-ja/tutorial-console.md | 4 ++-- docs/guide-ja/tutorial-core-validators.md | 21 ++++++++++++--------- docs/guide-ja/tutorial-docker.md | 2 +- docs/guide-ja/tutorial-i18n.md | 6 +++--- docs/guide-ja/tutorial-template-engines.md | 4 ++-- 17 files changed, 42 insertions(+), 31 deletions(-) diff --git a/docs/guide-ja/caching-fragment.md b/docs/guide-ja/caching-fragment.md index 4648769f0aa..2e3bd038ab4 100644 --- a/docs/guide-ja/caching-fragment.md +++ b/docs/guide-ja/caching-fragment.md @@ -24,6 +24,11 @@ if ($this->beginCache($id)) { [データ・キャッシュ](caching-data.md) と同様に、キャッシュされるコンテントを識別するためにユニークな `$id` が必要になります。 +次のようにすると、フラグメント・キャッシュを削除することが出来ます。 +```php +Yii::$app->cache->delete(['yii\widgets\FragmentCache', $id]); +``` + ## キャッシュのオプション diff --git a/docs/guide-ja/concept-configurations.md b/docs/guide-ja/concept-configurations.md index b62113647ad..6c664ea97a7 100644 --- a/docs/guide-ja/concept-configurations.md +++ b/docs/guide-ja/concept-configurations.md @@ -103,7 +103,7 @@ $config = [ 'class' => 'yii\caching\FileCache', ], 'mailer' => [ - 'class' => 'yii\swiftmailer\Mailer', + 'class' => 'yii\symfonymailer\Mailer', ], 'log' => [ 'class' => 'yii\log\Dispatcher', @@ -207,7 +207,7 @@ return [ 'class' => 'yii\caching\FileCache', ], 'mailer' => [ - 'class' => 'yii\swiftmailer\Mailer', + 'class' => 'yii\symfonymailer\Mailer', ], 'log' => [ 'class' => 'yii\log\Dispatcher', diff --git a/docs/guide-ja/concept-properties.md b/docs/guide-ja/concept-properties.md index 7692298683f..14464795ee7 100644 --- a/docs/guide-ja/concept-properties.md +++ b/docs/guide-ja/concept-properties.md @@ -80,7 +80,7 @@ getter と setter で定義されたプロパティには、いくつかの特 * 通常の `property_exists()` の呼び出しでは、マジック・プロパティが存在するかどうかを知ることは出来ません。 それぞれ、[[yii\base\BaseObject::canGetProperty()|canGetProperty()]] または [[yii\base\BaseObject::canSetProperty()|canSetProperty()]] を呼び出さなければなりません。 -このガイドの冒頭で説明した問題に戻ると、 `label` に値が代入されているあらゆる箇所で `trim()` を呼ぶのではなく、 -もう `setLabel()` という setter の内部だけで `trim()` を呼べば済むのです。 +このガイドの冒頭で説明した問題に戻ると、`label` に値が代入されているあらゆる箇所で `trim()` を呼ぶのではなく、 +`setLabel()` という setter の内部だけで `trim()` を呼べば済むようになります。 さらに、新しい要求でラベルの先頭を大文字にする必要が発生しても、他のいっさいのコードに触れることなく、 すぐに `setLabel()` メソッドを変更することができます。一箇所の変更は、すべての `label` への代入に普遍的に作用します。 diff --git a/docs/guide-ja/db-dao.md b/docs/guide-ja/db-dao.md index 26c3c6f3509..a9388ead827 100644 --- a/docs/guide-ja/db-dao.md +++ b/docs/guide-ja/db-dao.md @@ -682,5 +682,5 @@ $table = Yii::$app->db->getTableSchema('post'); ``` このメソッドは、テーブルのカラム、プライマリ・キー、外部キーなどの情報を含む [[yii\db\TableSchema]] オブジェクトを返します。 -これらの情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブ・レコード](db-active-record.md) によって利用されて、 +この情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブ・レコード](db-active-record.md) によって利用されて、 特定のデータベースに依存しないコードを書くことを助けてくれています。 diff --git a/docs/guide-ja/intro-upgrade-from-v1.md b/docs/guide-ja/intro-upgrade-from-v1.md index 53010f0da0e..b6dc75585d8 100644 --- a/docs/guide-ja/intro-upgrade-from-v1.md +++ b/docs/guide-ja/intro-upgrade-from-v1.md @@ -265,7 +265,7 @@ ActiveForm::end(); テーマは、ソースのビュー・ファイル・パスをテーマのビュー・ファイル・パスにマップするパス・マッピング機構に基づくものになりました。 例えば、あるテーマのパス・マップが `['/web/views' => '/web/themes/basic']` である場合、ビュー・ファイル `/web/views/site/index.php` のテーマ版は `/web/themes/basic/site/index.php` になります。 この理由により、テーマはどのようなビュー・ファイルに対してでも適用することが出来るようになりました。 -コントローラやウィジェットのコンテキストの外で表示されるビューに対してすら、適用できます。 +コントローラやウィジェットのコンテキストの外で表示されるビューであっても適用できます。 また、`CThemeManager` コンポーネントはもうありません。 その代りに、`theme` は `view` アプリケーション・コンポーネントの構成可能なプロパティになりました。 diff --git a/docs/guide-ja/output-client-scripts.md b/docs/guide-ja/output-client-scripts.md index 38ac328e2a4..2e307ab69ff 100644 --- a/docs/guide-ja/output-client-scripts.md +++ b/docs/guide-ja/output-client-scripts.md @@ -40,8 +40,8 @@ $this->registerJs( - [[yii\web\View::POS_LOAD|View::POS_LOAD]] - [ドキュメントの `load` イベント](https://learn.jquery.com/using-jquery-core/document-ready/) でコードを実行するための指定。 上記と同じく、これを指定すると、[[yii\web\JqueryAsset|jQuery]] が自動的に登録されます。 -最後の引数は、スクリプトのコード・ブロックを一意に特定するために使われるスクリプトのユニークな ID です。同じ ID のスクリプトが既にある場合は、新しいものを追加するのでなく、 -それを置き換えます。ID を指定しない場合は、JS コードそれ自身が ID として扱われます。この ID によって、同じコードが複数回登録されるのを防止します。 +最後の引数は、スクリプトのコード・ブロックを一意に特定するために使われるスクリプトのユニークな ID です。同じ ID のスクリプトが既にある場合は、新しいものを追加するのでなく、それを置き換えます。 +ID を指定しない場合は、JS コードそれ自身が ID として扱われます。この ID によって、同じコードが複数回登録されるのを防止します。 ### スクリプト・ファイルを登録する diff --git a/docs/guide-ja/output-sorting.md b/docs/guide-ja/output-sorting.md index 945c331a0d2..ec18e82c952 100644 --- a/docs/guide-ja/output-sorting.md +++ b/docs/guide-ja/output-sorting.md @@ -65,7 +65,7 @@ $articles = Article::find() ラベルは HTML エンコードされないことに注意してください。 > Info: [[yii\data\Sort::$orders|orders]] の値をデータベースのクエリに直接に供給して、 - `ORDER BY` 句を構築することが出来ます。 データベースのクエリが認識できない合成的な属性が入っている場合があるため、 + `ORDER BY` 句を構築することが出来ます。データベースのクエリが認識できない合成的な属性が入っている場合があるため、 [[yii\data\Sort::$attributeOrders|attributeOrders]] を使ってはいけません。 [[yii\data\Sort::link()]] を呼んでハイパーリンクを生成すれば、それをクリックして、指定した属性によるデータの並べ替えをリクエストすることが出来るようになります。 diff --git a/docs/guide-ja/runtime-sessions-cookies.md b/docs/guide-ja/runtime-sessions-cookies.md index 92eefef8b51..ae09ec64a5c 100644 --- a/docs/guide-ja/runtime-sessions-cookies.md +++ b/docs/guide-ja/runtime-sessions-cookies.md @@ -389,7 +389,8 @@ Yii 2.0.21 以降、[[yii\web\Cookie::sameSite]] 設定がサポートされて ブラウザが `sameSite` 設定をサポートしている場合、指定されたポリシー ('Lax' または 'Strict') に従うクッキーだけが送信されます。 詳細については [SameSite の wiki 記事](https://owasp.org/www-community/SameSite) を参照して下さい。 更なるセキュリティ強化のために、`sameSite` がサポートされていない PHP のバージョンで使われた場合には例外が投げられます。 -この機能を PHP のバージョンに関わりなく使用する場合は、最初にバージョンをチェックして下さい。例えば、 +この機能を PHP のバージョンに関わりなく使用する場合は、最初にバージョンをチェックして下さい。例えば + ```php [ 'sameSite' => PHP_VERSION_ID >= 70300 ? yii\web\Cookie::SAME_SITE_LAX : null, diff --git a/docs/guide-ja/start-databases.md b/docs/guide-ja/start-databases.md index b1393aaf545..933696b1757 100644 --- a/docs/guide-ja/start-databases.md +++ b/docs/guide-ja/start-databases.md @@ -106,8 +106,8 @@ class Country extends ActiveRecord } ``` -`Country` クラスは [[yii\db\ActiveRecord]] を拡張しています。この中には一つもコードを書く必要はありません。 -単に上記のコードだけで、Yii は関連付けられたテーブル名をクラス名から推測します。 +`Country` クラスは [[yii\db\ActiveRecord]] を拡張しています。ここにコードを追加する必要は全くありません。 +上記のコードだけで、Yii は関連付けられたテーブル名をクラス名から推測します。 > Info: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] メソッドをオーバーライドして、関連づけられたテーブル名を明示的に指定することが出来ます。 diff --git a/docs/guide-ja/start-prerequisites.md b/docs/guide-ja/start-prerequisites.md index 8aeac1fb64a..bce70b98d0c 100644 --- a/docs/guide-ja/start-prerequisites.md +++ b/docs/guide-ja/start-prerequisites.md @@ -5,7 +5,7 @@ Yii の学習曲線は他の PHP フレームワークほど急峻ではあり ## PHP Yii は PHP フレームワークですから、必ず [言語リファレンスを読んで理解する](https://www.php.net/manual/ja/langref.php) ようにして下さい。 -Yii を使って開発するときはオブジェクト指向の流儀でコードを書くことになりますから、必ず、[クラスとオブジェクト](https://www.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://www.php.net/manual/ja/language.namespaces.php) には慣れ親しんでおいて下さい。 +Yii を使って開発するときはオブジェクト指向の流儀でコードを書くことになりますから、必ず、[クラスとオブジェクト](https://www.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://www.php.net/manual/ja/language.namespaces.php) に慣れ親しんでおいて下さい。 ## オブジェクト指向プログラミング diff --git a/docs/guide-ja/structure-models.md b/docs/guide-ja/structure-models.md index dcbc102ead9..80e65d07afa 100644 --- a/docs/guide-ja/structure-models.md +++ b/docs/guide-ja/structure-models.md @@ -293,6 +293,8 @@ public function rules() // "login" シナリオでは、username と password が必須 [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN], + + [['username'], 'string'], // username は文字列でなければならない。この規則は全てのシナリオに適用される ]; } ``` diff --git a/docs/guide-ja/test-overview.md b/docs/guide-ja/test-overview.md index 41b75812154..89f82ce8c25 100644 --- a/docs/guide-ja/test-overview.md +++ b/docs/guide-ja/test-overview.md @@ -61,7 +61,7 @@ どんな形式の自動化テストもやりすぎになる、という場合もあるでしょう。 -- プロジェクトは単純で、この先も、複雑になる心配はない。 +- プロジェクトが単純で、この先も、複雑になる心配はない。 - これ以上かかわることはない一度限りのプロジェクトである。 ただ、このような場合であっても、時間に余裕があれば、テストを自動化することは良いことです。 diff --git a/docs/guide-ja/tutorial-console.md b/docs/guide-ja/tutorial-console.md index 74c3401412f..1c39707307b 100644 --- a/docs/guide-ja/tutorial-console.md +++ b/docs/guide-ja/tutorial-console.md @@ -113,11 +113,11 @@ exit($exitCode); -------------------------- シェルで作業をしている場合、コマンド引数の自動補完は便利なものです。 -2.0.11 以降、`./yii` コマンドは、内蔵で Bash および ZSH のために補完をサポートしています。 +2.0.11 以降、`./yii` コマンドは、Bash および ZSH のための自動補完を内蔵でサポートしています。 ### Bash の補完 -bash completion がインストールされていることを確認して下さい。ほとんどの bash のインストレーションでは、デフォルトで利用可能になっています。 +bash completion がインストールされていることを確認して下さい。ほとんどのインストレーションでは、デフォルトで利用可能になっています。 補完スクリプトを `/etc/bash_completion.d/` に置いて下さい。 diff --git a/docs/guide-ja/tutorial-core-validators.md b/docs/guide-ja/tutorial-core-validators.md index 8379daf470b..b51a5a7827e 100644 --- a/docs/guide-ja/tutorial-core-validators.md +++ b/docs/guide-ja/tutorial-core-validators.md @@ -53,7 +53,7 @@ public function rules() このバリデータは、通常、[[yii\captcha\CaptchaAction]] および [[yii\captcha\Captcha]] と一緒に使われ、 入力値が [[yii\captcha\Captcha|CAPTCHA]] ウィジェットによって表示された検証コードと同じであることを確認します。 -- `caseSensitive`: 検証コードの比較で大文字と小文字を区別するかどうか。デフォルト値は `false`。 +- `caseSensitive`: 検証コードの比較で大文字と小文字を区別するか否か。デフォルト値は `false`。 - `captchaAction`: CAPTCHA 画像を表示する [[yii\captcha\CaptchaAction|CAPTCHA アクション]] に対応する [ルート](structure-controllers.md#routes)。デフォルト値は `'site/captcha'`。 - `skipOnEmpty`: 入力値が空のときに検証をスキップできるかどうか。デフォルト値は `false` で、 @@ -113,8 +113,8 @@ compare バリデータは、文字列や数値を比較するためにしか使 ['fromDate', 'compare', 'compareAttribute' => 'toDate', 'operator' => '<', 'enableClientValidation' => false], ``` -バリデータは指定された順序に従って実行されますので、まず最初に、`fromDate` と `toDate` に入力された値が有効な日付であることが確認されます。 -そして、有効な日付であった場合は、機械が読める形式に変換されます。 +バリデータは指定された順序に従って実行されますので、まず最初に、`fromDate` と `toDate` に入力された値が +有効な日付であることが確認され、有効な日付であった場合は、機械が読める形式に変換されます。 その後に、これらの二つの値が compare バリデータによって比較されます。 現在、date バリデータはクライアント・サイドのバリデーションを提供していませんので、これはサーバ・サイドでのみ動作します。 そのため、compare バリデータについても、[[yii\validators\CompareValidator::$enableClientValidation|$enableClientValidation]] は @@ -289,7 +289,7 @@ function foo($model, $attribute) { // 以下と同義 ['a1', 'exist', 'targetAttribute' => ['a2' => 'a2']], - // a1 と a2 の両方が存在する必要がある。両者はともにエラー・メッセージを受け取る + // a1 と a2 の両方が存在する必要がある。エラーの無い最初の属性がエラー・メッセージを受け取る // すなわち、a1 = 3, a2 = 4 は、"a1" カラムに 3, "a2" カラムに 4 が存在する場合に有効 [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']], // 以下と同義 @@ -328,6 +328,8 @@ function foo($model, $attribute) { このバリデータは、一つまたは複数のカラムに対する検証に使用することが出来ます (複数のカラムに対する検証の場合は、それらの属性の組み合せが存在しなければならないことを意味します)。 +同時に複数のカラムをチェックして(例えば `['a1', 'a2']`)バリデーションが失敗したときに、`skipOnError` が `true` に設定されている場合は、 +先行するエラーが無い最初の属性だけが新しいエラー・メッセージを受け取ります。 - `targetClass`: 検証される入力値を探すために使用される [アクティブ・レコード](db-active-record.md) クラスの名前。 設定されていない場合は、現在検証されているモデルのクラスが使用されます。 @@ -418,8 +420,8 @@ function foo($model, $attribute) { - `filter`: フィルタを定義する PHP コールバック。これには、グローバル関数の名前、無名関数などを指定することが出来ます。 関数のシグニチャは ``function ($value) { return $newValue; }` でなければなりません。このプロパティは必須項目です。 - `skipOnArray`: 入力値が配列である場合にフィルタをスキップするか否か。デフォルト値は `false`。 - フィルタが配列の入力を処理できない場合は、このプロパティを `true` に設定しなければなりません。 - そうしないと、何らかの PHP エラーが生じ得ます。 + フィルタが配列の入力を処理できない場合は、このプロパティを `true` に設定しなければなりません。そうしないと、 + 何らかの PHP エラーが生じ得ます。 > Tip: 入力値をトリムしたい場合は、[trim](#trim) バリデータを直接使うことが出来ます。 @@ -679,7 +681,7 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている ['a1', 'unique', 'targetAttribute' => 'a1'], ['a1', 'unique', 'targetAttribute' => ['a1' => 'a1']], - // a1 の入力値が a2 のカラムにおいてユニークである必要がある + // a1 の入力値がユニークである必要がある。ただし a2 のカラムが a1 の入力値のユニークネスのチェックに用いられる // すなわち、a1 = 2 は、"a2" カラムに 2 の値が存在しない場合に有効 ['a1', 'unique', 'targetAttribute' => 'a2'], // 以下と同義 @@ -704,9 +706,10 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている ] ``` -このバリデータは、入力値がテーブルのカラムにおいてユニークであるかどうかをチェックします。 -[アクティブ・レコード](db-active-record.md) モデルの属性に対してのみ働きます。 +このバリデータは、入力値がテーブルのカラムにおいてユニークであるかどうかをチェックします。このバリデータは [アクティブ・レコード](db-active-record.md) モデルの属性に対してのみ働きます。 一つのカラムに対する検証か、複数のカラムに対する検証か、どちらかをサポートします。 +同時に複数のカラムをチェックするバリデーション(例えば上記の `['a1', 'a2']` )が失敗したときに、 +`skipOnError` が `true` に設定されている場合は、先行するエラーが無い最初の属性のみが新しいエラー・メッセージを受け取ります。 - `targetClass`: 検証される入力値を探すために使用される [アクティブ・レコード](db-active-record.md) クラスの名前。 設定されていない場合は、現在検証されているモデルのクラスが使用されます。 diff --git a/docs/guide-ja/tutorial-docker.md b/docs/guide-ja/tutorial-docker.md index 53864ab6144..d52d1a0793f 100644 --- a/docs/guide-ja/tutorial-docker.md +++ b/docs/guide-ja/tutorial-docker.md @@ -24,7 +24,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS これは Docker デーモンが起動して走っていることを意味します。 -これに加えて `docker-compose version` を実行すると、出力は次のようになるはずです。 +さらに、`docker-compose version` を実行すると、出力は次のようになるはずです。 ``` docker-compose version 1.20.0, build unknown diff --git a/docs/guide-ja/tutorial-i18n.md b/docs/guide-ja/tutorial-i18n.md index 43a43f14200..50ba4bf163a 100644 --- a/docs/guide-ja/tutorial-i18n.md +++ b/docs/guide-ja/tutorial-i18n.md @@ -156,8 +156,8 @@ return [ ##### 他のストレージ・タイプ -翻訳メッセージを格納するのには、PHP ファイル以外に、 -次のメッセージ・ソースを使うことも可能です。 +翻訳メッセージを格納するのには、PHP ファイル以外に、次のメッセージ・ソースを +使うことも可能です。 - [[yii\i18n\GettextMessageSource]] - 翻訳メッセージを保持するのに GNU Gettext の MO ファイルまたは PO ファイルを使用する - [[yii\i18n\DbMessageSource]] - 翻訳メッセージを保存するのにデータベース・テーブルを使用する @@ -743,7 +743,7 @@ class TranslationEventHandler 翻訳は [[yii\i18n\PhpMessageSource|php ファイル]]、[[yii\i18n\GettextMessageSource|.po ファイル]]、または [[yii\i18n\DbMessageSource|database]] に保存することが出来ます。追加のオプションについてはそれぞれのクラスを参照してください。 -まず最初に、構成情報ファイルを作成する必要があります。 +最初に、構成情報ファイルを作成する必要があります。 どこに保存したいかを決めて、次のコマンドを発行してください。 ```bash diff --git a/docs/guide-ja/tutorial-template-engines.md b/docs/guide-ja/tutorial-template-engines.md index 8791d5bff05..39518d13ad1 100644 --- a/docs/guide-ja/tutorial-template-engines.md +++ b/docs/guide-ja/tutorial-template-engines.md @@ -34,8 +34,8 @@ ] ``` -上記のコードにおいては、Smarty と Twig の両者がビュー・ファイルによって使用可能なものとして構成されています。 -しかし、これらのエクステンションをプロジェクトで使うためには、`composer.json` ファイルも修正して、これらのエクステンションを含める必要があります。 +上記のコードにおいては、Smarty と Twig の両者がビュー・ファイルによって使用可能なものとして構成されています。しかし、 +これらのエクステンションをプロジェクトで使うためには、`composer.json` ファイルも修正して、これらのエクステンションを含める必要があります。 ``` "yiisoft/yii2-smarty": "~2.0.0", From b46e2676d347adba7ca43f59008cde9dd17f09f5 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 6 Jan 2024 20:07:05 +0100 Subject: [PATCH 080/125] Fix #17181: Improved `BaseUrl::isRelative($url)` performance --- framework/CHANGELOG.md | 1 + framework/helpers/BaseUrl.php | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 0a95132681a..7296c02cd3d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #17181: Improved `BaseUrl::isRelative($url)` performance (sammousa, bizley, rob006) - Bug #17191: Fixed `BaseUrl::isRelative($url)` method in `yii\helpers\BaseUrl` (ggh2e3) - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) diff --git a/framework/helpers/BaseUrl.php b/framework/helpers/BaseUrl.php index dcbab192730..864dbc63c48 100644 --- a/framework/helpers/BaseUrl.php +++ b/framework/helpers/BaseUrl.php @@ -378,8 +378,7 @@ public static function home($scheme = false) */ public static function isRelative($url) { - $urlComponents = parse_url($url, PHP_URL_SCHEME); - return strncmp($url, '//', 2) && empty($urlComponents); + return preg_match('~^[[:alpha:]][[:alnum:]+-.]*://|^//~', $url) === 0; } /** From f83b772c4fd671f16dbe5d1c7799a338a42f15ef Mon Sep 17 00:00:00 2001 From: Gustavo Botti Date: Thu, 11 Jan 2024 13:27:26 -0300 Subject: [PATCH 081/125] Update input-tabular-input.md (#20100) Upper case title, as used in other pages --- docs/guide/input-tabular-input.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/input-tabular-input.md b/docs/guide/input-tabular-input.md index 44c9ffea1d5..f5aa95b57af 100644 --- a/docs/guide/input-tabular-input.md +++ b/docs/guide/input-tabular-input.md @@ -1,4 +1,4 @@ -Collecting tabular input +Collecting Tabular Input ======================== Sometimes you need to handle multiple models of the same kind in a single form. For example, multiple settings, where From 60ea174348a16249e79c73d1de86b47c6d594a7f Mon Sep 17 00:00:00 2001 From: Gustavo Botti Date: Fri, 12 Jan 2024 02:57:18 -0300 Subject: [PATCH 082/125] Fix typo in Menu phpdoc (#20101) --- framework/widgets/Menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/widgets/Menu.php b/framework/widgets/Menu.php index 025379796f1..d474ceb3a0e 100644 --- a/framework/widgets/Menu.php +++ b/framework/widgets/Menu.php @@ -23,7 +23,7 @@ * Menu checks the current route and request parameters to toggle certain menu items * with active state. * - * Note that Menu only renders the HTML tags about the menu. It does do any styling. + * Note that Menu only renders the HTML tags about the menu. It does not do any styling. * You are responsible to provide CSS styles to make it look like a real menu. * * The following example shows how to use Menu: From c9c5c61f7683a6f33e366e3c9cdb2d6dc0e3031f Mon Sep 17 00:00:00 2001 From: Skeptic Spriggan Date: Thu, 18 Jan 2024 16:30:22 +0100 Subject: [PATCH 083/125] Fix error summary always visible with CSP header (#19691) --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 8 +++++++- tests/framework/helpers/HtmlTest.php | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 7296c02cd3d..58e84e4f92d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,6 +7,7 @@ Yii Framework 2 Change Log - Bug #17181: Improved `BaseUrl::isRelative($url)` performance (sammousa, bizley, rob006) - Bug #17191: Fixed `BaseUrl::isRelative($url)` method in `yii\helpers\BaseUrl` (ggh2e3) - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) +- Bug #19691: Fix error summary always visible with CSP header (skepticspriggan) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 45812e4165b..82262b8a96b 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1260,6 +1260,7 @@ public static function activeHint($model, $attribute, $options = []) * - showAllErrors: boolean, if set to true every error message for each attribute will be shown otherwise * only the first error message for each attribute will be shown. Defaults to `false`. * Option is available since 2.0.10. + * - emptyClass: string, the class name that is added to an empty summary. * * The rest of the options will be rendered as the attributes of the container tag. * @@ -1271,12 +1272,17 @@ public static function errorSummary($models, $options = []) $footer = ArrayHelper::remove($options, 'footer', ''); $encode = ArrayHelper::remove($options, 'encode', true); $showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false); + $emptyClass = ArrayHelper::remove($options, 'emptyClass', null); unset($options['header']); $lines = self::collectErrors($models, $encode, $showAllErrors); if (empty($lines)) { // still render the placeholder for client-side validation use $content = '
    '; - $options['style'] = isset($options['style']) ? rtrim($options['style'], ';') . '; display:none' : 'display:none'; + if($emptyClass !== null) { + $options['class'] = $emptyClass; + } else { + $options['style'] = isset($options['style']) ? rtrim($options['style'], ';') . '; display:none' : 'display:none'; + } } else { $content = '
    • ' . implode("
    • \n
    • ", $lines) . '
    '; } diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index 12e8869d2d8..eef2f84bf7f 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -1672,6 +1672,11 @@ function ($model) { $model->addError('name', 'Error message. Here are even more chars: ""'); }, ], + [ + 'empty_class', + ['emptyClass' => 'd-none'], + '

    Please fix the following errors:

      ', + ], ]; } From 018fcb5d9662722fa99e6d3b2c6bfdaf8a07a5e2 Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:14:51 +0100 Subject: [PATCH 084/125] Fix error summary always visible with CSP header (#19691) Co-authored-by: Alexander Makarov --- framework/helpers/BaseHtml.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 82262b8a96b..4f17fa670ea 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1278,7 +1278,7 @@ public static function errorSummary($models, $options = []) if (empty($lines)) { // still render the placeholder for client-side validation use $content = '
        '; - if($emptyClass !== null) { + if ($emptyClass !== null) { $options['class'] = $emptyClass; } else { $options['style'] = isset($options['style']) ? rtrim($options['style'], ';') . '; display:none' : 'display:none'; From 32a20f9338a96120a2be51a5cf55036d32c98f4d Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:23:38 +0100 Subject: [PATCH 085/125] Fix error summary always visible with CSP header (#19691) Co-authored-by: Alexander Makarov --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 58e84e4f92d..a4dd74dfcb8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,7 +7,7 @@ Yii Framework 2 Change Log - Bug #17181: Improved `BaseUrl::isRelative($url)` performance (sammousa, bizley, rob006) - Bug #17191: Fixed `BaseUrl::isRelative($url)` method in `yii\helpers\BaseUrl` (ggh2e3) - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) -- Bug #19691: Fix error summary always visible with CSP header (skepticspriggan) +- Bug #19691: Allow using custom class to style error summary (skepticspriggan) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) From c2e0485e0a2c0e0c780459a202e65b705ac7fa60 Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Fri, 16 Feb 2024 23:11:56 +0100 Subject: [PATCH 086/125] Explain why DI fails sometimes and how to fix this (#20010) (#20108) * Explain why DI fails sometimes and how to fix this (#20010) * Explain why AR does not support DI by default and how to support it (#20010) --- docs/guide/db-active-record.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/guide/db-active-record.md b/docs/guide/db-active-record.md index e87727469bb..e77317214e5 100644 --- a/docs/guide/db-active-record.md +++ b/docs/guide/db-active-record.md @@ -650,6 +650,17 @@ life cycle will happen: > - [[yii\db\ActiveRecord::updateCounters()]] > - [[yii\db\ActiveRecord::updateAllCounters()]] +> Note: DI is not supported by default due to performance concerns. You can add support if needed by overriding +> the [[yii\db\ActiveRecord::instantiate()|instantiate()]] method to instantiate the class via [[Yii::createObject()]]: +> +> ```php +> public static function instantiate($row) +> { +> return Yii::createObject(static::class); +> } +> ``` + + ### Refreshing Data Life Cycle When calling [[yii\db\ActiveRecord::refresh()|refresh()]] to refresh an Active Record instance, the From 78cc7198f40cdb4afd7502f67841fd1506ded6d5 Mon Sep 17 00:00:00 2001 From: Muhammad Zubayr Date: Tue, 27 Feb 2024 11:32:33 +0500 Subject: [PATCH 087/125] =?UTF-8?q?Correction=20text=20"=D0=A2=D0=B0=D2=B3?= =?UTF-8?q?=D1=80=D0=B8=D1=80=D0=B8=D0=BB=D0=B0=D1=88"=20=3D>=20"=D0=A2?= =?UTF-8?q?=D0=B0=D2=B3=D1=80=D0=B8=D1=80=D0=BB=D0=B0=D1=88"=20(#20120)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Uzbek it is "Таҳрирлаш" not "Таҳририлаш" --- framework/messages/uz-Cy/yii.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/messages/uz-Cy/yii.php b/framework/messages/uz-Cy/yii.php index c7ae1e73d88..3d8d03ad5bb 100644 --- a/framework/messages/uz-Cy/yii.php +++ b/framework/messages/uz-Cy/yii.php @@ -67,7 +67,7 @@ 'Unknown alias: -{name}' => '', 'Unknown filter attribute "{attribute}"' => '', 'Unknown option: --{name}' => 'Ноаниқ танлов: --{name}', - 'Update' => 'Таҳририлаш', + 'Update' => 'Таҳрирлаш', 'View' => 'Кўриш', 'Yes' => 'Ҳа', 'You are not allowed to perform this action.' => 'Сизга ушбу амални бажаришга руҳсат берилмаган.', From 283499cf61475c9a3a67d7dd214ccf7235e31086 Mon Sep 17 00:00:00 2001 From: rhertogh Date: Sun, 3 Mar 2024 09:32:21 +0100 Subject: [PATCH 088/125] Fix #20122: Fixed parsing of boolean keywords (e.g. used in SQLite) in `\yii\db\ColumnSchema::typecast()` --- framework/CHANGELOG.md | 1 + framework/db/ColumnSchema.php | 2 +- tests/framework/db/SchemaTest.php | 33 +++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a4dd74dfcb8..9567e04fd97 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) +- Bug #20122: Fixed parsing of boolean keywords (e.g. used in SQLite) in `\yii\db\ColumnSchema::typecast()` (rhertogh) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Enh #20030: Improve performance of handling `ErrorHandler::$memoryReserveSize` (antonshevelev, rob006) - Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) diff --git a/framework/db/ColumnSchema.php b/framework/db/ColumnSchema.php index 74e1ddea84b..1d01cec2707 100644 --- a/framework/db/ColumnSchema.php +++ b/framework/db/ColumnSchema.php @@ -174,7 +174,7 @@ protected function typecast($value) case 'boolean': // treating a 0 bit value as false too // https://github.com/yiisoft/yii2/issues/9006 - return (bool) $value && $value !== "\0"; + return (bool) $value && $value !== "\0" && strtolower($value) !== 'false'; case 'double': return (float) $value; } diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php index af02b2170b6..dd05f78d9c2 100644 --- a/tests/framework/db/SchemaTest.php +++ b/tests/framework/db/SchemaTest.php @@ -545,6 +545,39 @@ public function testColumnSchemaDbTypecastWithEmptyCharType() $this->assertSame('', $columnSchema->dbTypecast('')); } + /** + * @dataProvider columnSchemaDbTypecastBooleanPhpTypeProvider + * @param mixed $value + * @param bool $expected + */ + public function testColumnSchemaDbTypecastBooleanPhpType($value, $expected) + { + $columnSchema = new ColumnSchema(['phpType' => Schema::TYPE_BOOLEAN]); + $this->assertSame($expected, $columnSchema->dbTypecast($value)); + } + + public function columnSchemaDbTypecastBooleanPhpTypeProvider() + { + return [ + [1, true], + [0, false], + ['1', true], + ['0', false], + + // https://github.com/yiisoft/yii2/issues/9006 + ["\1", true], + ["\0", false], + + // https://github.com/yiisoft/yii2/pull/20122 + ['TRUE', true], + ['FALSE', false], + ['true', true], + ['false', false], + ['True', true], + ['False', false], + ]; + } + public function testFindUniqueIndexes() { if ($this->driverName === 'sqlsrv') { From e02245f18e08b732040328ba3ef01350b3199862 Mon Sep 17 00:00:00 2001 From: forevermatt Date: Wed, 6 Mar 2024 14:34:00 -0500 Subject: [PATCH 089/125] Fix typo in setCookieParams() documentation --- framework/web/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index 40768924cf5..eb900bf96c1 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -398,7 +398,7 @@ public function getCookieParams() * of `session_get_cookie_params()`. * @param array $value cookie parameters, valid keys include: `lifetime`, `path`, `domain`, `secure` and `httponly`. * Starting with Yii 2.0.21 `sameSite` is also supported. It requires PHP version 7.3.0 or higher. - * For securtiy, an exception will be thrown if `sameSite` is set while using an unsupported version of PHP. + * For security, an exception will be thrown if `sameSite` is set while using an unsupported version of PHP. * To use this feature across different PHP versions check the version first. E.g. * ```php * [ From 75b95980f1ea8e2054cb835fb440d056675708f8 Mon Sep 17 00:00:00 2001 From: DaniloNicacio <70544466+DaniloNicacio@users.noreply.github.com> Date: Thu, 7 Mar 2024 01:24:00 -0400 Subject: [PATCH 090/125] FIx misspelled "token" in Portuguese Translation (#20125) Change "toke" on line 52 to "token" --- docs/guide-pt-BR/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-pt-BR/start-installation.md b/docs/guide-pt-BR/start-installation.md index a5228fb9b6d..1fcc2d07c4b 100644 --- a/docs/guide-pt-BR/start-installation.md +++ b/docs/guide-pt-BR/start-installation.md @@ -49,7 +49,7 @@ Você pode atualizar o Composer executando o comando `composer self-update`. > A quantidade de solicitações depende do número de dependências que sua aplicação possui e pode extrapolar a > **taxa limite da API do Github**. Se você atingir esse limite, o Composer pode pedir a você suas credenciais de login para obter um > token de acesso à API Github. Em conexões rápidas você pode atingir esse limite antes que o Composer consiga lidar com a situação, então, recomendamos -> configurar um toke de acesso antes de instalar o Yii. +> configurar um token de acesso antes de instalar o Yii. > Por favor, consulte a [documentação do Composer sobre tokens da API Github](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) > para instruções de como fazer isso. From e2a167028b5c77cf9533e1e9acb7ae9b785b6bd6 Mon Sep 17 00:00:00 2001 From: Razvan Grigore Date: Tue, 19 Mar 2024 16:21:27 +0200 Subject: [PATCH 091/125] Upgrade to PSR12 coding standard (#20121) --- .github/workflows/lint.yaml | 22 + .php_cs | 27 - composer.json | 9 +- composer.lock | 2518 +++-------------- cs/TODO.md | 1 - cs/src/YiiConfig.php | 172 -- cs/src/YiisoftConfig.php | 39 - framework/BaseYii.php | 4 +- framework/CHANGELOG.md | 1 + framework/Yii.php | 3 + framework/assets/yii.activeForm.js | 5 +- framework/assets/yii.gridView.js | 5 +- framework/assets/yii.js | 21 +- framework/assets/yii.validation.js | 19 +- framework/base/Action.php | 3 +- framework/base/ActionEvent.php | 1 + framework/base/ActionFilter.php | 1 + framework/base/Application.php | 1 + framework/base/ArrayAccessTrait.php | 1 + framework/base/Arrayable.php | 1 + framework/base/ArrayableTrait.php | 1 + framework/base/BaseObject.php | 1 + framework/base/Behavior.php | 1 + framework/base/BootstrapInterface.php | 1 + framework/base/Component.php | 1 + framework/base/Configurable.php | 1 + framework/base/Controller.php | 3 +- .../base/DynamicContentAwareInterface.php | 1 + framework/base/DynamicContentAwareTrait.php | 1 + framework/base/DynamicModel.php | 1 + framework/base/ErrorException.php | 1 + framework/base/ErrorHandler.php | 1 + framework/base/Event.php | 1 + framework/base/Exception.php | 1 + framework/base/ExitException.php | 1 + framework/base/InlineAction.php | 1 + framework/base/InvalidArgumentException.php | 1 + framework/base/InvalidCallException.php | 1 + framework/base/InvalidConfigException.php | 1 + framework/base/InvalidParamException.php | 1 + framework/base/InvalidRouteException.php | 1 + framework/base/InvalidValueException.php | 1 + framework/base/Model.php | 1 + framework/base/ModelEvent.php | 1 + framework/base/Module.php | 3 +- framework/base/NotSupportedException.php | 1 + framework/base/Object.php | 1 + framework/base/Request.php | 1 + framework/base/Response.php | 1 + framework/base/Security.php | 4 +- framework/base/StaticInstanceInterface.php | 1 + framework/base/StaticInstanceTrait.php | 1 + framework/base/Theme.php | 1 + framework/base/UnknownClassException.php | 1 + framework/base/UnknownMethodException.php | 1 + framework/base/UnknownPropertyException.php | 1 + framework/base/UserException.php | 1 + framework/base/View.php | 3 +- framework/base/ViewContextInterface.php | 1 + framework/base/ViewEvent.php | 1 + framework/base/ViewNotFoundException.php | 1 + framework/base/ViewRenderer.php | 1 + framework/base/Widget.php | 1 + framework/base/WidgetEvent.php | 1 + framework/behaviors/AttributeBehavior.php | 4 +- .../behaviors/AttributeTypecastBehavior.php | 11 +- framework/behaviors/AttributesBehavior.php | 7 +- framework/behaviors/BlameableBehavior.php | 1 + .../behaviors/CacheableWidgetBehavior.php | 1 + .../behaviors/OptimisticLockBehavior.php | 1 + framework/behaviors/SluggableBehavior.php | 1 + framework/behaviors/TimestampBehavior.php | 1 + framework/caching/ApcCache.php | 1 + framework/caching/ArrayCache.php | 1 + framework/caching/Cache.php | 1 + framework/caching/CacheInterface.php | 1 + framework/caching/ChainedDependency.php | 1 + framework/caching/DbCache.php | 1 + framework/caching/DbDependency.php | 1 + framework/caching/DbQueryDependency.php | 1 + framework/caching/Dependency.php | 1 + framework/caching/DummyCache.php | 1 + framework/caching/ExpressionDependency.php | 1 + framework/caching/FileCache.php | 1 + framework/caching/FileDependency.php | 1 + framework/caching/MemCache.php | 1 + framework/caching/MemCacheServer.php | 1 + framework/caching/TagDependency.php | 1 + framework/caching/WinCache.php | 1 + framework/caching/XCache.php | 1 + framework/caching/ZendDataCache.php | 1 + .../migrations/m150909_153426_cache_init.php | 1 + framework/captcha/Captcha.php | 1 + framework/captcha/CaptchaAction.php | 1 + framework/captcha/CaptchaAsset.php | 1 + framework/captcha/CaptchaValidator.php | 1 + framework/classes.php | 1 + framework/console/Application.php | 1 + framework/console/Controller.php | 1 + framework/console/ErrorHandler.php | 7 +- framework/console/Exception.php | 1 + framework/console/ExitCode.php | 1 + framework/console/Markdown.php | 1 + framework/console/Request.php | 1 + framework/console/Response.php | 1 + framework/console/UnknownCommandException.php | 1 + .../console/controllers/AssetController.php | 1 + .../controllers/BaseMigrateController.php | 1 + .../console/controllers/CacheController.php | 1 + .../console/controllers/FixtureController.php | 1 + .../console/controllers/HelpController.php | 32 +- .../console/controllers/MessageController.php | 103 +- .../console/controllers/MigrateController.php | 7 +- .../console/controllers/ServeController.php | 1 + framework/console/widgets/Table.php | 14 +- framework/data/ActiveDataFilter.php | 1 + framework/data/ActiveDataProvider.php | 1 + framework/data/ArrayDataProvider.php | 1 + framework/data/BaseDataProvider.php | 2 + framework/data/DataFilter.php | 1 + framework/data/DataProviderInterface.php | 1 + framework/data/Pagination.php | 1 + framework/data/Sort.php | 1 + framework/data/SqlDataProvider.php | 1 + framework/db/ActiveQuery.php | 1 + framework/db/ActiveQueryInterface.php | 1 + framework/db/ActiveQueryTrait.php | 1 + framework/db/ActiveRecord.php | 1 + framework/db/ActiveRecordInterface.php | 1 + framework/db/ActiveRelationTrait.php | 5 +- framework/db/AfterSaveEvent.php | 1 + framework/db/ArrayExpression.php | 2 + framework/db/BaseActiveRecord.php | 1 + framework/db/BatchQueryResult.php | 13 +- framework/db/CheckConstraint.php | 1 + framework/db/ColumnSchema.php | 16 +- framework/db/ColumnSchemaBuilder.php | 1 + framework/db/Command.php | 3 +- framework/db/Connection.php | 2 +- framework/db/Constraint.php | 1 + framework/db/ConstraintFinderInterface.php | 1 + framework/db/ConstraintFinderTrait.php | 1 + framework/db/DataReader.php | 1 + framework/db/DefaultValueConstraint.php | 1 + framework/db/Exception.php | 1 + framework/db/Expression.php | 1 + framework/db/ExpressionBuilder.php | 1 + framework/db/ExpressionBuilderInterface.php | 1 + framework/db/ExpressionBuilderTrait.php | 1 + framework/db/ExpressionInterface.php | 1 + framework/db/ForeignKeyConstraint.php | 1 + framework/db/IndexConstraint.php | 1 + framework/db/IntegrityException.php | 1 + framework/db/JsonExpression.php | 1 + framework/db/Migration.php | 1 + framework/db/MigrationInterface.php | 1 + framework/db/PdoValue.php | 2 + framework/db/PdoValueBuilder.php | 1 + framework/db/Query.php | 1 + framework/db/QueryBuilder.php | 4 +- framework/db/QueryExpressionBuilder.php | 1 + framework/db/QueryInterface.php | 1 + framework/db/QueryTrait.php | 1 + framework/db/Schema.php | 1 + framework/db/SchemaBuilderTrait.php | 1 + framework/db/SqlToken.php | 1 + framework/db/SqlTokenizer.php | 1 + framework/db/StaleObjectException.php | 1 + framework/db/TableSchema.php | 1 + framework/db/Transaction.php | 1 + framework/db/ViewFinderTrait.php | 1 + framework/db/conditions/AndCondition.php | 1 + .../db/conditions/BetweenColumnsCondition.php | 2 + .../BetweenColumnsConditionBuilder.php | 1 + framework/db/conditions/BetweenCondition.php | 2 + .../db/conditions/BetweenConditionBuilder.php | 1 + .../db/conditions/ConditionInterface.php | 1 + .../db/conditions/ConjunctionCondition.php | 1 + .../ConjunctionConditionBuilder.php | 1 + framework/db/conditions/ExistsCondition.php | 2 + .../db/conditions/ExistsConditionBuilder.php | 1 + framework/db/conditions/HashCondition.php | 2 + .../db/conditions/HashConditionBuilder.php | 1 + framework/db/conditions/InCondition.php | 2 + .../db/conditions/InConditionBuilder.php | 4 +- framework/db/conditions/LikeCondition.php | 1 + .../db/conditions/LikeConditionBuilder.php | 1 + framework/db/conditions/NotCondition.php | 2 + .../db/conditions/NotConditionBuilder.php | 1 + framework/db/conditions/OrCondition.php | 1 + framework/db/conditions/SimpleCondition.php | 2 + .../db/conditions/SimpleConditionBuilder.php | 1 + framework/db/cubrid/ColumnSchemaBuilder.php | 1 + framework/db/cubrid/QueryBuilder.php | 1 + framework/db/cubrid/Schema.php | 4 +- .../conditions/LikeConditionBuilder.php | 1 + framework/db/mssql/ColumnSchema.php | 1 + framework/db/mssql/ColumnSchemaBuilder.php | 1 + framework/db/mssql/DBLibPDO.php | 1 + framework/db/mssql/PDO.php | 1 + framework/db/mssql/QueryBuilder.php | 27 +- framework/db/mssql/Schema.php | 3 +- framework/db/mssql/SqlsrvPDO.php | 1 + framework/db/mssql/TableSchema.php | 1 + .../mssql/conditions/InConditionBuilder.php | 1 + .../mssql/conditions/LikeConditionBuilder.php | 1 + framework/db/mysql/ColumnSchema.php | 1 + framework/db/mysql/ColumnSchemaBuilder.php | 1 + framework/db/mysql/JsonExpressionBuilder.php | 1 + framework/db/mysql/QueryBuilder.php | 6 +- framework/db/mysql/Schema.php | 7 +- framework/db/oci/ColumnSchemaBuilder.php | 1 + framework/db/oci/Command.php | 1 + framework/db/oci/QueryBuilder.php | 5 +- framework/db/oci/Schema.php | 1 + .../db/oci/conditions/InConditionBuilder.php | 1 + .../oci/conditions/LikeConditionBuilder.php | 1 + framework/db/pgsql/ArrayExpressionBuilder.php | 3 +- framework/db/pgsql/ArrayParser.php | 2 + framework/db/pgsql/ColumnSchema.php | 1 + framework/db/pgsql/JsonExpressionBuilder.php | 1 + framework/db/pgsql/QueryBuilder.php | 14 +- framework/db/pgsql/Schema.php | 4 +- framework/db/sqlite/ColumnSchemaBuilder.php | 1 + framework/db/sqlite/Command.php | 1 + framework/db/sqlite/QueryBuilder.php | 1 + framework/db/sqlite/Schema.php | 1 + framework/db/sqlite/SqlTokenizer.php | 1 + .../sqlite/conditions/InConditionBuilder.php | 1 + .../conditions/LikeConditionBuilder.php | 1 + framework/di/Container.php | 2 +- framework/di/Instance.php | 1 + framework/di/NotInstantiableException.php | 1 + framework/di/ServiceLocator.php | 1 + framework/filters/AccessControl.php | 1 + framework/filters/AccessRule.php | 4 +- framework/filters/AjaxFilter.php | 1 + framework/filters/ContentNegotiator.php | 1 + framework/filters/Cors.php | 1 + framework/filters/HostControl.php | 1 + framework/filters/HttpCache.php | 1 + framework/filters/PageCache.php | 1 + framework/filters/RateLimitInterface.php | 1 + framework/filters/RateLimiter.php | 1 + framework/filters/VerbFilter.php | 1 + framework/filters/auth/AuthInterface.php | 1 + framework/filters/auth/AuthMethod.php | 1 + framework/filters/auth/CompositeAuth.php | 1 + framework/filters/auth/HttpBasicAuth.php | 1 + framework/filters/auth/HttpBearerAuth.php | 1 + framework/filters/auth/HttpHeaderAuth.php | 1 + framework/filters/auth/QueryParamAuth.php | 1 + framework/grid/ActionColumn.php | 1 + framework/grid/CheckboxColumn.php | 1 + framework/grid/Column.php | 1 + framework/grid/DataColumn.php | 9 +- framework/grid/GridView.php | 1 + framework/grid/GridViewAsset.php | 1 + framework/grid/RadioButtonColumn.php | 1 + framework/grid/SerialColumn.php | 1 + framework/helpers/ArrayHelper.php | 1 + framework/helpers/BaseArrayHelper.php | 1 + framework/helpers/BaseConsole.php | 5 +- framework/helpers/BaseFileHelper.php | 1 + framework/helpers/BaseFormatConverter.php | 73 +- framework/helpers/BaseHtml.php | 1 + framework/helpers/BaseHtmlPurifier.php | 1 + framework/helpers/BaseInflector.php | 2 +- framework/helpers/BaseIpHelper.php | 1 + framework/helpers/BaseJson.php | 1 + framework/helpers/BaseMarkdown.php | 1 + framework/helpers/BaseStringHelper.php | 6 +- framework/helpers/BaseUrl.php | 1 + framework/helpers/BaseVarDumper.php | 1 + framework/helpers/Console.php | 1 + framework/helpers/FileHelper.php | 1 + framework/helpers/FormatConverter.php | 1 + framework/helpers/Html.php | 1 + framework/helpers/HtmlPurifier.php | 1 + framework/helpers/Inflector.php | 1 + framework/helpers/IpHelper.php | 1 + framework/helpers/Json.php | 1 + framework/helpers/Markdown.php | 1 + framework/helpers/ReplaceArrayValue.php | 1 + framework/helpers/StringHelper.php | 1 + framework/helpers/UnsetArrayValue.php | 1 + framework/helpers/Url.php | 1 + framework/helpers/VarDumper.php | 1 + framework/helpers/mimeAliases.php | 2 + framework/helpers/mimeExtensions.php | 2 + framework/helpers/mimeTypes.php | 4 +- framework/i18n/DbMessageSource.php | 1 + framework/i18n/Formatter.php | 7 +- framework/i18n/GettextFile.php | 1 + framework/i18n/GettextMessageSource.php | 1 + framework/i18n/GettextMoFile.php | 1 + framework/i18n/GettextPoFile.php | 1 + framework/i18n/I18N.php | 1 + framework/i18n/Locale.php | 1 + framework/i18n/MessageFormatter.php | 4 +- framework/i18n/MessageSource.php | 1 + framework/i18n/MissingTranslationEvent.php | 1 + framework/i18n/PhpMessageSource.php | 1 + .../migrations/m150207_210500_i18n_init.php | 1 + framework/log/DbTarget.php | 7 +- framework/log/Dispatcher.php | 1 + framework/log/EmailTarget.php | 1 + framework/log/FileTarget.php | 1 + framework/log/LogRuntimeException.php | 1 + framework/log/Logger.php | 1 + framework/log/SyslogTarget.php | 1 + framework/log/Target.php | 1 + .../migrations/m141106_185632_log_init.php | 11 +- framework/mail/BaseMailer.php | 1 + framework/mail/BaseMessage.php | 1 + framework/mail/MailEvent.php | 1 + framework/mail/MailerInterface.php | 1 + framework/mail/MessageInterface.php | 1 + framework/messages/af/yii.php | 1 + framework/messages/ar/yii.php | 1 + framework/messages/az/yii.php | 1 + framework/messages/be/yii.php | 1 + framework/messages/bg/yii.php | 1 + framework/messages/bs/yii.php | 1 + framework/messages/ca/yii.php | 1 + framework/messages/config.php | 1 + framework/messages/cs/yii.php | 1 + framework/messages/da/yii.php | 1 + framework/messages/de/yii.php | 1 + framework/messages/el/yii.php | 1 + framework/messages/es/yii.php | 1 + framework/messages/et/yii.php | 1 + framework/messages/fa/yii.php | 1 + framework/messages/fi/yii.php | 1 + framework/messages/fr/yii.php | 1 + framework/messages/he/yii.php | 1 + framework/messages/hi/yii.php | 1 + framework/messages/hr/yii.php | 1 + framework/messages/hu/yii.php | 1 + framework/messages/hy/yii.php | 1 + framework/messages/id/yii.php | 1 + framework/messages/it/yii.php | 1 + framework/messages/ja/yii.php | 1 + framework/messages/ka/yii.php | 1 + framework/messages/kk/yii.php | 1 + framework/messages/ko/yii.php | 1 + framework/messages/kz/yii.php | 1 + framework/messages/lt/yii.php | 1 + framework/messages/lv/yii.php | 1 + framework/messages/ms/yii.php | 1 + framework/messages/nb-NO/yii.php | 1 + framework/messages/nl/yii.php | 1 + framework/messages/pl/yii.php | 1 + framework/messages/pt-BR/yii.php | 1 + framework/messages/pt/yii.php | 1 + framework/messages/ro/yii.php | 1 + framework/messages/ru/yii.php | 1 + framework/messages/sk/yii.php | 1 + framework/messages/sl/yii.php | 1 + framework/messages/sr-Latn/yii.php | 1 + framework/messages/sr/yii.php | 1 + framework/messages/sv/yii.php | 1 + framework/messages/tg/yii.php | 1 + framework/messages/th/yii.php | 1 + framework/messages/tr/yii.php | 1 + framework/messages/uk/yii.php | 1 + framework/messages/uz-Cy/yii.php | 1 + framework/messages/uz/yii.php | 1 + framework/messages/vi/yii.php | 1 + framework/messages/zh-TW/yii.php | 1 + framework/messages/zh/yii.php | 1 + framework/mutex/DbMutex.php | 1 + framework/mutex/FileMutex.php | 1 + framework/mutex/Mutex.php | 1 + framework/mutex/MysqlMutex.php | 3 +- framework/mutex/OracleMutex.php | 1 + framework/mutex/PgsqlMutex.php | 1 + framework/mutex/RetryAcquireTrait.php | 1 + framework/rbac/Assignment.php | 1 + framework/rbac/BaseManager.php | 1 + framework/rbac/CheckAccessInterface.php | 1 + framework/rbac/DbManager.php | 1 + framework/rbac/Item.php | 1 + framework/rbac/ManagerInterface.php | 1 + framework/rbac/Permission.php | 1 + framework/rbac/PhpManager.php | 1 + framework/rbac/Role.php | 1 + framework/rbac/Rule.php | 1 + .../migrations/m140506_102106_rbac_init.php | 1 + ...c_add_index_on_auth_assignment_user_id.php | 1 + ...38_rbac_updates_indexes_without_prefix.php | 1 + ...00409_110543_rbac_update_mssql_trigger.php | 11 +- framework/rest/Action.php | 1 + framework/rest/ActiveController.php | 1 + framework/rest/Controller.php | 1 + framework/rest/CreateAction.php | 1 + framework/rest/DeleteAction.php | 1 + framework/rest/IndexAction.php | 1 + framework/rest/OptionsAction.php | 1 + framework/rest/Serializer.php | 1 + framework/rest/UpdateAction.php | 1 + framework/rest/UrlRule.php | 1 + framework/rest/ViewAction.php | 1 + framework/test/ActiveFixture.php | 2 +- framework/test/ArrayFixture.php | 1 + framework/test/BaseActiveFixture.php | 1 + framework/test/DbFixture.php | 1 + framework/test/FileFixtureTrait.php | 2 +- framework/test/Fixture.php | 1 + framework/test/FixtureTrait.php | 1 + framework/test/InitDbFixture.php | 1 + framework/validators/BooleanValidator.php | 1 + framework/validators/CompareValidator.php | 1 + framework/validators/DateValidator.php | 1 + .../validators/DefaultValueValidator.php | 1 + framework/validators/EachValidator.php | 1 + framework/validators/EmailValidator.php | 1 + framework/validators/ExistValidator.php | 6 +- framework/validators/FileValidator.php | 1 + framework/validators/FilterValidator.php | 1 + framework/validators/ImageValidator.php | 1 + framework/validators/InlineValidator.php | 1 + framework/validators/IpValidator.php | 1 + framework/validators/NumberValidator.php | 1 + framework/validators/PunycodeAsset.php | 1 + framework/validators/RangeValidator.php | 7 +- .../validators/RegularExpressionValidator.php | 1 + framework/validators/RequiredValidator.php | 1 + framework/validators/SafeValidator.php | 1 + framework/validators/StringValidator.php | 1 + framework/validators/TrimValidator.php | 1 + framework/validators/UniqueValidator.php | 1 + framework/validators/UrlValidator.php | 1 + framework/validators/ValidationAsset.php | 1 + framework/validators/Validator.php | 1 + framework/views/addColumnMigration.php | 2 + framework/views/createJunctionMigration.php | 2 + framework/views/createTableMigration.php | 2 + framework/views/dropColumnMigration.php | 2 + framework/views/dropTableMigration.php | 2 + framework/views/migration.php | 2 + framework/web/Application.php | 1 + framework/web/AssetBundle.php | 1 + framework/web/AssetConverter.php | 1 + framework/web/AssetConverterInterface.php | 1 + framework/web/AssetManager.php | 1 + framework/web/BadRequestHttpException.php | 1 + framework/web/CacheSession.php | 1 + framework/web/CompositeUrlRule.php | 1 + framework/web/ConflictHttpException.php | 1 + framework/web/Controller.php | 1 + framework/web/Cookie.php | 1 + framework/web/CookieCollection.php | 1 + framework/web/DbSession.php | 3 +- framework/web/ErrorAction.php | 1 + framework/web/ErrorHandler.php | 1 + framework/web/ForbiddenHttpException.php | 1 + framework/web/GoneHttpException.php | 1 + framework/web/GroupUrlRule.php | 1 + framework/web/HeaderCollection.php | 1 + framework/web/HeadersAlreadySentException.php | 1 + framework/web/HtmlResponseFormatter.php | 1 + framework/web/HttpException.php | 1 + framework/web/IdentityInterface.php | 1 + framework/web/JqueryAsset.php | 1 + framework/web/JsExpression.php | 1 + framework/web/JsonParser.php | 1 + framework/web/JsonResponseFormatter.php | 4 +- framework/web/Link.php | 1 + framework/web/Linkable.php | 1 + .../web/MethodNotAllowedHttpException.php | 1 + framework/web/MultiFieldSession.php | 1 + framework/web/MultipartFormDataParser.php | 1 + framework/web/NotAcceptableHttpException.php | 1 + framework/web/NotFoundHttpException.php | 1 + .../web/RangeNotSatisfiableHttpException.php | 1 + framework/web/Request.php | 23 +- framework/web/RequestParserInterface.php | 1 + framework/web/Response.php | 1 + framework/web/ResponseFormatterInterface.php | 1 + framework/web/ServerErrorHttpException.php | 1 + framework/web/Session.php | 18 +- framework/web/SessionIterator.php | 1 + .../web/TooManyRequestsHttpException.php | 1 + framework/web/UnauthorizedHttpException.php | 1 + .../web/UnprocessableEntityHttpException.php | 1 + .../web/UnsupportedMediaTypeHttpException.php | 1 + framework/web/UploadedFile.php | 1 + framework/web/UrlManager.php | 1 + framework/web/UrlNormalizer.php | 1 + .../web/UrlNormalizerRedirectException.php | 1 + framework/web/UrlRule.php | 1 + framework/web/UrlRuleInterface.php | 1 + framework/web/User.php | 4 +- framework/web/UserEvent.php | 1 + framework/web/View.php | 1 + framework/web/ViewAction.php | 1 + framework/web/XmlResponseFormatter.php | 4 +- framework/web/YiiAsset.php | 1 + .../m160313_153426_session_init.php | 1 + framework/widgets/ActiveField.php | 1 + framework/widgets/ActiveForm.php | 1 + framework/widgets/ActiveFormAsset.php | 1 + framework/widgets/BaseListView.php | 1 + framework/widgets/Block.php | 1 + framework/widgets/Breadcrumbs.php | 1 + framework/widgets/ContentDecorator.php | 1 + framework/widgets/DetailView.php | 1 + framework/widgets/FragmentCache.php | 1 + framework/widgets/InputWidget.php | 1 + framework/widgets/LinkPager.php | 1 + framework/widgets/LinkSorter.php | 1 + framework/widgets/ListView.php | 1 + framework/widgets/MaskedInput.php | 1 + framework/widgets/MaskedInputAsset.php | 1 + framework/widgets/Menu.php | 1 + framework/widgets/Pjax.php | 1 + framework/widgets/PjaxAsset.php | 1 + framework/widgets/Spaceless.php | 1 + phpcs.xml.dist | 18 + tests/framework/log/TargetTest.php | 7 +- 521 files changed, 1265 insertions(+), 2619 deletions(-) create mode 100644 .github/workflows/lint.yaml delete mode 100644 .php_cs delete mode 100644 cs/TODO.md delete mode 100644 cs/src/YiiConfig.php delete mode 100644 cs/src/YiisoftConfig.php create mode 100644 phpcs.xml.dist diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 00000000000..17e514f9588 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,22 @@ +name: lint + +on: [push, pull_request] + +jobs: + phpcs: + runs-on: ubuntu-latest + name: PHP_CodeSniffer + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + tools: cs2pr + + - name: Install dependencies + run: composer install --prefer-dist + + - name: Run phpcs + run: vendor/bin/phpcs -q --report=checkstyle framework/ | cs2pr diff --git a/.php_cs b/.php_cs deleted file mode 100644 index 0350dff093c..00000000000 --- a/.php_cs +++ /dev/null @@ -1,27 +0,0 @@ -setCacheFile(__DIR__ . '/tests/runtime/php_cs.cache') - ->mergeRules([ - 'braces' => [ - 'allow_single_line_closure' => true, - ], - ]) - ->setFinder( - PhpCsFixer\Finder::create() - ->in(__DIR__) - ->exclude('docs') - ->exclude('apps') - ->exclude('extensions') - // requirement checker should work even on PHP 4.3, so it needs special treatment - ->exclude('framework/requirements') - ->notPath('framework/classes.php') - ->notPath('framework/helpers/mimeTypes.php') - ->notPath('framework/views/messageConfig.php') - ); diff --git a/composer.json b/composer.json index ef5d068f59d..937900a8004 100644 --- a/composer.json +++ b/composer.json @@ -85,8 +85,9 @@ "cweagans/composer-patches": "^1.7", "phpunit/phpunit": "4.8.34", "cebe/indent": "~1.0.2", - "friendsofphp/php-cs-fixer": "~2.2.3 | ^3.0", - "johnkary/phpunit-speedtrap": "^1.0" + "johnkary/phpunit-speedtrap": "^1.0", + "dealerdirect/phpcodesniffer-composer-installer": "*", + "yiisoft/yii2-coding-standards": "^3.0" }, "repositories": [ { @@ -104,7 +105,6 @@ }, "autoload-dev": { "psr-4": { - "yii\\cs\\": "cs/src/", "yii\\build\\": "build/", "yiiunit\\": "tests/" } @@ -112,7 +112,8 @@ "config": { "allow-plugins": { "cweagans/composer-patches": true, - "yiisoft/yii2-composer": true + "yiisoft/yii2-composer": true, + "dealerdirect/phpcodesniffer-composer-installer": true } }, "bin": [ diff --git a/composer.lock b/composer.lock index e3b8a15c6c7..0b04891c850 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ee35a67e578251573a9017059b62b76", + "content-hash": "7f989051117a0e72e6e59f7e1e568220", "packages": [ { "name": "bower-asset/inputmask", @@ -29,16 +29,16 @@ }, { "name": "bower-asset/jquery", - "version": "3.6.4", + "version": "3.7.1", "source": { "type": "git", - "url": "git@github.com:jquery/jquery-dist.git", - "reference": "91ef2d8836342875f2519b5815197ea0f23613cf" + "url": "https://github.com/jquery/jquery-dist.git", + "reference": "fde1f76e2799dd877c176abde0ec836553246991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/91ef2d8836342875f2519b5815197ea0f23613cf", - "reference": "91ef2d8836342875f2519b5815197ea0f23613cf" + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/fde1f76e2799dd877c176abde0ec836553246991", + "reference": "fde1f76e2799dd877c176abde0ec836553246991" }, "type": "bower-asset", "license": [ @@ -47,16 +47,16 @@ }, { "name": "bower-asset/punycode", - "version": "v2.2.3", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/mathiasbynens/punycode.js.git", - "reference": "46d412120e2feb868876769a9847790ba278c882" + "reference": "9e1b2cda98d215d3a73fcbfe93c62e021f4ba768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mathiasbynens/punycode.js/zipball/46d412120e2feb868876769a9847790ba278c882", - "reference": "46d412120e2feb868876769a9847790ba278c882" + "url": "https://api.github.com/repos/mathiasbynens/punycode.js/zipball/9e1b2cda98d215d3a73fcbfe93c62e021f4ba768", + "reference": "9e1b2cda98d215d3a73fcbfe93c62e021f4ba768" }, "type": "bower-asset" }, @@ -371,224 +371,6 @@ }, "time": "2014-05-23T14:40:08+00:00" }, - { - "name": "composer/pcre", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-10-11T07:11:09+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-08-31T09:50:34+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T21:32:43+00:00" - }, { "name": "cweagans/composer-patches", "version": "1.7.3", @@ -638,40 +420,39 @@ "time": "2022-12-20T22:53:13+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.3", + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, - "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -680,85 +461,41 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" - }, - "time": "2023-02-01T09:20:38+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2023-09-27T20:04:15+00:00" + "time": "2023-01-05T11:28:13+00:00" }, { "name": "doctrine/instantiator", @@ -831,34 +568,32 @@ "time": "2022-12-30T00:15:36+00:00" }, { - "name": "doctrine/lexer", - "version": "2.1.0", + "name": "johnkary/phpunit-speedtrap", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "url": "https://github.com/johnkary/phpunit-speedtrap.git", + "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", + "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "php": ">=5.6", + "phpunit/phpunit": ">=4.7,<6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "psr-0": { + "JohnKary": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -867,276 +602,58 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "John Kary", + "email": "john@johnkary.net" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Find slow tests in your PHPUnit test suite", + "homepage": "https://github.com/johnkary/phpunit-speedtrap", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "phpunit", + "profile", + "slow" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "issues": "https://github.com/johnkary/phpunit-speedtrap/issues", + "source": "https://github.com/johnkary/phpunit-speedtrap/tree/1.1" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2017-03-25T17:14:26+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.9.5", + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "4465d70ba776806857a1ac2a6f877e582445ff36" + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/4465d70ba776806857a1ac2a6f877e582445ff36", - "reference": "4465d70ba776806857a1ac2a6f877e582445ff36", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", "shasum": "" }, "require": { - "composer/semver": "^3.2", - "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^1.13", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0", - "php-cs-fixer/diff": "^2.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.23", - "symfony/polyfill-php80": "^1.25", - "symfony/polyfill-php81": "^1.25", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "php": ">=5.3.3" }, "require-dev": { - "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.5", - "mikey179/vfsstream": "^1.6.10", - "php-coveralls/php-coveralls": "^2.5.2", - "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.15", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "symfony/phpunit-bridge": "^6.0", - "symfony/yaml": "^5.4 || ^6.0" + "phpunit/phpunit": "~4.0" }, "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters." + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style", - "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.5" - }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2022-07-22T08:43:51+00:00" - }, - { - "name": "johnkary/phpunit-speedtrap", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/johnkary/phpunit-speedtrap.git", - "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", - "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "phpunit/phpunit": ">=4.7,<6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "JohnKary": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Kary", - "email": "john@johnkary.net" - } - ], - "description": "Find slow tests in your PHPUnit test suite", - "homepage": "https://github.com/johnkary/phpunit-speedtrap", - "keywords": [ - "phpunit", - "profile", - "slow" - ], - "support": { - "issues": "https://github.com/johnkary/phpunit-speedtrap/issues", - "source": "https://github.com/johnkary/phpunit-speedtrap/tree/1.1" - }, - "time": "2017-03-25T17:14:26+00:00" - }, - { - "name": "php-cs-fixer/diff", - "version": "v2.0.2", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "sebastian/diff v3 backport support for PHP 5.6+", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], - "support": { - "issues": "https://github.com/PHP-CS-Fixer/diff/issues", - "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" - }, - "abandoned": true, - "time": "2020-10-14T08:32:19+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.5", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] + "psr-0": { + "phpDocumentor": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -1625,397 +1142,195 @@ "time": "2015-10-02T06:51:40+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "sebastian/comparator", + "version": "1.2.4", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Common interface for caching libraries", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", "keywords": [ - "cache", - "psr", - "psr-6" + "comparator", + "compare", + "equality" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2017-01-29T09:50:25+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "sebastian/diff", + "version": "1.4.1", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.4-dev" } }, "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "diff" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/master" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2015-12-08T07:14:41+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "sebastian/environment", + "version": "1.3.7", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Standard interfaces for event handling.", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ - "events", - "psr", - "psr-14" + "Xdebug", + "environment", + "hhvm" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/1.3.7" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2016-05-17T03:18:57+00:00" }, { - "name": "psr/log", - "version": "3.0.0", + "name": "sebastian/exporter", + "version": "1.2.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" - }, - "time": "2021-07-14T16:46:02+00:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" - }, - "time": "2017-01-29T09:50:25+00:00" - }, - { - "name": "sebastian/diff", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, - "time": "2015-12-08T07:14:41+00:00" - }, - { - "name": "sebastian/environment", - "version": "1.3.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/1.3.7" - }, - "time": "2016-05-17T03:18:57+00:00" - }, - { - "name": "sebastian/exporter", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { @@ -2128,1272 +1443,221 @@ "issues": "https://github.com/sebastianbergmann/global-state/issues", "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1" }, - "time": "2015-10-12T03:26:01+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" - }, - "time": "2016-10-03T07:41:43+00:00" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/1.0.6" - }, - "time": "2015-06-21T13:59:46+00:00" - }, - { - "name": "symfony/console", - "version": "v6.3.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", - "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v6.3.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-10-31T08:09:35+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-23T14:45:45+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v6.3.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-07-06T06:56:43+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-23T14:45:45+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-06-01T08:30:39+00:00" - }, - { - "name": "symfony/finder", - "version": "v6.3.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/filesystem": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-09-26T12:56:25+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v6.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-12T14:21:09+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-07-28T09:04:16+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2015-10-12T03:26:01+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "name": "sebastian/recursion-context", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "1.0.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "time": "2023-01-26T09:26:14+00:00" + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + }, + "time": "2016-10-03T07:41:43+00:00" }, { - "name": "symfony/process", - "version": "v6.3.4", + "name": "sebastian/version", + "version": "1.0.6", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "shasum": "" }, - "require": { - "php": ">=8.1" - }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.4" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/1.0.6" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-08-07T10:39:22+00:00" + "time": "2015-06-21T13:59:46+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.4.0", + "name": "squizlabs/php_codesniffer", + "version": "3.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/d63cee4890a8afaf86a22e51ad4d97c91dd4579b", + "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^2.0" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "3.x-dev" } }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Greg Sherwood", + "role": "Former lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "phpcs", + "standards", + "static analysis" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/jrfnl", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2024-02-16T15:06:51+00:00" }, { - "name": "symfony/stopwatch", - "version": "v6.3.0", + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3401,18 +1665,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -3428,46 +1698,39 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { - "name": "symfony/string", - "version": "v6.3.8", + "name": "symfony/yaml", + "version": "v3.4.47", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "13880a87790c76ef994c91e87efb96134522577a" + "url": "https://github.com/symfony/yaml.git", + "reference": "88289caa3c166321883f67fe5130188ebbb47094" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", - "reference": "13880a87790c76ef994c91e87efb96134522577a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", + "reference": "88289caa3c166321883f67fe5130188ebbb47094", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "symfony/console": "<3.4" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3479,26 +1742,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.8" + "source": "https://github.com/symfony/yaml/tree/v3.4.47" }, "funding": [ { @@ -3514,78 +1769,93 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:21+00:00" + "time": "2020-10-24T10:57:07+00:00" }, { - "name": "symfony/yaml", - "version": "v3.4.47", + "name": "yiisoft/yii2-coding-standards", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" + "url": "https://github.com/yiisoft/yii2-coding-standards.git", + "reference": "8bc39acaae848aec1ad52b2af4cf380e3f0b104e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", + "url": "https://api.github.com/repos/yiisoft/yii2-coding-standards/zipball/8bc39acaae848aec1ad52b2af4cf380e3f0b104e", + "reference": "8bc39acaae848aec1ad52b2af4cf380e3f0b104e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "php": ">=5.4.0", + "squizlabs/php_codesniffer": ">=3.2" }, - "type": "library", + "type": "phpcodesniffer-standard", "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "yii\\console\\controllers\\": "src/console/controllers/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "https://www.yiiframework.com/", + "role": "Founder and project lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "https://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "https://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "https://cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "https://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" } ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", + "description": "Yii PHP Framework Version 2 - Coding standard tools", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "codesniffer", + "framework", + "yii" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "source": "https://github.com/yiisoft/yii2", + "wiki": "https://www.yiiframework.com/wiki/" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2024-03-15T12:57:48+00:00" } ], "aliases": [], diff --git a/cs/TODO.md b/cs/TODO.md deleted file mode 100644 index 79862057096..00000000000 --- a/cs/TODO.md +++ /dev/null @@ -1 +0,0 @@ -This should be moved to separate package, like `yii\yii2-cs`. diff --git a/cs/src/YiiConfig.php b/cs/src/YiiConfig.php deleted file mode 100644 index 582ab283bf0..00000000000 --- a/cs/src/YiiConfig.php +++ /dev/null @@ -1,172 +0,0 @@ - - * @since 2.0.0 - */ -class YiiConfig extends Config -{ - /** - * {@inheritdoc} - */ - public function __construct($name = 'yii-cs-config') - { - parent::__construct($name); - - $this->setRiskyAllowed(true); - - $this->setRules([ - '@PSR2' => true, - 'array_syntax' => [ - 'syntax' => 'short', - ], - 'binary_operator_spaces' => [ - 'align_double_arrow' => false, - 'align_equals' => false, - ], - 'blank_line_after_opening_tag' => true, - 'cast_spaces' => true, - 'concat_space' => [ - 'spacing' => 'one', - ], - 'dir_constant' => true, - 'ereg_to_preg' => true, - 'function_typehint_space' => true, - 'hash_to_slash_comment' => true, - 'include' => true, - 'heredoc_to_nowdoc' => true, - 'is_null' => [ - 'use_yoda_style' => false, - ], - 'linebreak_after_opening_tag' => true, - 'lowercase_cast' => true, - 'magic_constant_casing' => true, -// 'mb_str_functions' => true, // needs more discussion -// 'method_separation' => true, // conflicts with current Yii style with double line between properties and methods - 'modernize_types_casting' => true, - 'native_function_casing' => true, - 'new_with_braces' => true, - 'no_alias_functions' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_consecutive_blank_lines' => [ - 'tokens' => [ - 'break', - 'continue', -// 'extra', // conflicts with current Yii style with double line between properties and methods - 'return', - 'throw', - 'use', - 'use_trait', -// 'curly_brace_block', // breaks namespaces blocks - 'parenthesis_brace_block', - 'square_brace_block', - ], - ], - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => true, - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_multiline_whitespace_before_semicolons' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_around_offset' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, -// 'ordered_class_elements' => [ // needs more discussion -// 'order' => [ -// 'use_trait', -// 'constant_public', -// 'constant_protected', -// 'constant_private', -// 'property_public', -// 'property_protected', -// 'property_private', -// 'construct', -// 'destruct', -// 'magic', -// ], -// ], - 'ordered_imports' => [ - 'sortAlgorithm' => 'alpha', - 'importsOrder' => [ - 'const', - 'function', - 'class', - ], - ], - 'php_unit_construct' => true, - 'php_unit_dedicate_assert' => true, - 'php_unit_fqcn_annotation' => true, -// 'php_unit_strict' => true, // needs more attention - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_indent' => true, -// 'phpdoc_inline_tag' => true, // see https://github.com/yiisoft/yii2/issues/11635 - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_no_useless_inheritdoc' => true, -// 'phpdoc_order', // may be useful, but should be configurable: https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/1602 - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_summary' => true, -// 'phpdoc_to_comment' => true, // breaks phpdoc for define('CONSTANT', $value); - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_var_without_name' => true, - 'protected_to_private' => true, - 'psr4' => true, - 'self_accessor' => true, - 'short_scalar_cast' => true, - 'single_blank_line_before_namespace' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_operator_spaces' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'whitespace_after_comma_in_array' => true, - ]); - } - - /** - * Merge current rules' config with provided list of rules. - * - * @param array $rules - * @return $this - * @see setRules() - * @see ArrayHelper::merge() - */ - public function mergeRules(array $rules) - { - $this->setRules(ArrayHelper::merge($this->getRules(), $rules)); - - return $this; - } -} diff --git a/cs/src/YiisoftConfig.php b/cs/src/YiisoftConfig.php deleted file mode 100644 index 16dc6d6f871..00000000000 --- a/cs/src/YiisoftConfig.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @since 2.0.0 - */ -final class YiisoftConfig extends YiiConfig -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - parent::__construct('yiisoft-cs-config'); - - $header = <<<'HEADER' -@link https://www.yiiframework.com/ -@copyright Copyright (c) 2008 Yii Software LLC -@license https://www.yiiframework.com/license/ -HEADER; - - $this->mergeRules([ - 'header_comment' => [ - 'header' => $header, - 'commentType' => 'PHPDoc', - 'separate' => 'bottom', - ], - ]); - } -} diff --git a/framework/BaseYii.php b/framework/BaseYii.php index 496f6aa121a..ff716b4d349 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -1,4 +1,5 @@ '' . \Yii::t('yii', - 'Yii Framework') . '', + 'yii' => '' . \Yii::t('yii', 'Yii Framework') . '', ]); } diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9567e04fd97..78ddfdcbb70 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,6 +20,7 @@ Yii Framework 2 Change Log - Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) - Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992) - Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) +- Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) 2.0.49.2 October 12, 2023 diff --git a/framework/Yii.php b/framework/Yii.php index d02b95a231a..ee9a1b5dc69 100644 --- a/framework/Yii.php +++ b/framework/Yii.php @@ -1,4 +1,5 @@ * @since 2.0 + * @phpcs:disable PSR1.Files.SideEffects.FoundWithSymbols + * @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace */ class Yii extends \yii\BaseYii { diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index 5b9ce4aaec2..045cfebcaa1 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -330,7 +330,7 @@ this.$form = $form; var $input = findInput($form, this); - var disabled = $input.toArray().reduce(function(result, next) { + var disabled = $input.toArray().reduce(function (result, next) { return result && $(next).is(':disabled'); }, true); if (disabled) { @@ -733,8 +733,7 @@ var errorAttributes = [], $input; $.each(data.attributes, function () { - var hasError = (submitting && updateInput($form, this, messages)) || (!submitting && attrHasError($form, - this, messages)); + var hasError = (submitting && updateInput($form, this, messages)) || (!submitting && attrHasError($form, this, messages)); $input = findInput($form, this); if (!$input.is(':disabled') && !this.cancelled && hasError) { diff --git a/framework/assets/yii.gridView.js b/framework/assets/yii.gridView.js index f02d4d95e94..cdcb3731960 100644 --- a/framework/assets/yii.gridView.js +++ b/framework/assets/yii.gridView.js @@ -198,7 +198,7 @@ $grid.find(checkAllInput + (all ? ":not(:checked)" : ":checked")).prop('checked', all).change(); }; initEventHandler($grid, 'checkRow', 'click.yiiGridView', "#" + id + " " + inputs, handler); - if($grid.find(inputs).length) { + if ($grid.find(inputs).length) { handler(); // Ensure "check all" checkbox is checked on page load if all data row checkboxes are initially checked. } }, @@ -245,7 +245,8 @@ * @param {string} selector jQuery selector * @param {function} callback The actual function to be executed with this event */ - function initEventHandler($gridView, type, event, selector, callback) { + function initEventHandler($gridView, type, event, selector, callback) + { var id = $gridView.attr('id'); var prevHandler = gridEventHandlers[id]; if (prevHandler !== undefined && prevHandler[type] !== undefined) { diff --git a/framework/assets/yii.js b/framework/assets/yii.js index 6384d07d172..e7a61f75456 100644 --- a/framework/assets/yii.js +++ b/framework/assets/yii.js @@ -353,7 +353,8 @@ window.yii = (function ($) { } }; - function initCsrfHandler() { + function initCsrfHandler() + { // automatically send CSRF token for all AJAX requests $.ajaxPrefilter(function (options, originalOptions, xhr) { if (!options.crossDomain && pub.getCsrfParam()) { @@ -363,7 +364,8 @@ window.yii = (function ($) { pub.refreshCsrfToken(); } - function initRedirectHandler() { + function initRedirectHandler() + { // handle AJAX redirection $(document).ajaxComplete(function (event, xhr) { var url = xhr && xhr.getResponseHeader('X-Redirect'); @@ -373,7 +375,8 @@ window.yii = (function ($) { }); } - function initAssetFilters() { + function initAssetFilters() + { /** * Used for storing loaded scripts and information about loading each script if it's in the process of loading. * A single script can have one of the following values: @@ -472,7 +475,8 @@ window.yii = (function ($) { }); } - function initDataMethods() { + function initDataMethods() + { var handler = function (event) { var $this = $(this), method = $this.data('method'), @@ -499,7 +503,8 @@ window.yii = (function ($) { .on('change.yii', pub.changeableSelector, handler); } - function isReloadableAsset(url) { + function isReloadableAsset(url) + { for (var i = 0; i < pub.reloadableScripts.length; i++) { var rule = getAbsoluteUrl(pub.reloadableScripts[i]); var match = new RegExp("^" + escapeRegExp(rule).split('\\*').join('.+') + "$").test(url); @@ -512,7 +517,8 @@ window.yii = (function ($) { } // https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex/6969486#6969486 - function escapeRegExp(str) { + function escapeRegExp(str) + { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } @@ -521,7 +527,8 @@ window.yii = (function ($) { * @param {string} url Initial URL * @returns {string} */ - function getAbsoluteUrl(url) { + function getAbsoluteUrl(url) + { return url.charAt(0) === '/' ? pub.getBaseCurrentUrl() + url : url; } diff --git a/framework/assets/yii.validation.js b/framework/assets/yii.validation.js index 2cae037e3c1..af80bb80493 100644 --- a/framework/assets/yii.validation.js +++ b/framework/assets/yii.validation.js @@ -95,7 +95,7 @@ yii.validation = (function ($) { }, validateImage: function (file, messages, options, deferred, fileReader, image) { - image.onload = function() { + image.onload = function () { validateImageSize(file, image, messages, options); deferred.resolve(); }; @@ -379,7 +379,8 @@ yii.validation = (function ($) { } }; - function getUploadedFiles(attribute, messages, options) { + function getUploadedFiles(attribute, messages, options) + { // Skip validation if File API is not available if (typeof File === "undefined") { return []; @@ -415,12 +416,13 @@ yii.validation = (function ($) { return files; } - function validateFile(file, messages, options) { + function validateFile(file, messages, options) + { if (options.extensions && options.extensions.length > 0) { var found = false; var filename = file.name.toLowerCase(); - for (var index=0; index < options.extensions.length; index++) { + for (var index = 0; index < options.extensions.length; index++) { var ext = options.extensions[index].toLowerCase(); if ((ext === '' && filename.indexOf('.') === -1) || (filename.substr(filename.length - options.extensions[index].length - 1) === ('.' + ext))) { found = true; @@ -448,7 +450,8 @@ yii.validation = (function ($) { } } - function validateMimeType(mimeTypes, fileType) { + function validateMimeType(mimeTypes, fileType) + { for (var i = 0, len = mimeTypes.length; i < len; i++) { if (new RegExp(mimeTypes[i]).test(fileType)) { return true; @@ -458,7 +461,8 @@ yii.validation = (function ($) { return false; } - function validateImageSize(file, image, messages, options) { + function validateImageSize(file, image, messages, options) + { if (options.minWidth && image.width < options.minWidth) { messages.push(options.underWidth.replace(/\{file\}/g, file.name)); } @@ -479,7 +483,8 @@ yii.validation = (function ($) { /** * PHP: `trim($path, ' /')`, JS: `yii.helpers.trim(path, {chars: ' /'})` */ - function trimString(value, options = {skipOnEmpty: true, chars: null}) { + function trimString(value, options = {skipOnEmpty: true, chars: null}) + { if (options.skipOnEmpty !== false && pub.isEmpty(value)) { return value; } diff --git a/framework/base/Action.php b/framework/base/Action.php index 45d95c59cbf..b5d04b80ddd 100644 --- a/framework/base/Action.php +++ b/framework/base/Action.php @@ -1,4 +1,5 @@ controller->bindActionParams($this, $params); - Yii::debug('Running action: ' . get_class($this) . '::run(), invoked by ' . get_class($this->controller), __METHOD__); + Yii::debug('Running action: ' . get_class($this) . '::run(), invoked by ' . get_class($this->controller), __METHOD__); if (Yii::$app->requestedParams === null) { Yii::$app->requestedParams = $args; } diff --git a/framework/base/ActionEvent.php b/framework/base/ActionEvent.php index ab03d7366f1..9cfe64509ce 100644 --- a/framework/base/ActionEvent.php +++ b/framework/base/ActionEvent.php @@ -1,4 +1,5 @@ getName(); if (($component = $this->module->get($name, false)) instanceof $typeName) { $args[] = $component; - $requestedParams[$name] = "Component: " . get_class($component) . " \$$name"; + $requestedParams[$name] = 'Component: ' . get_class($component) . " \$$name"; } elseif ($this->module->has($typeName) && ($service = $this->module->get($typeName)) instanceof $typeName) { $args[] = $service; $requestedParams[$name] = 'Module ' . get_class($this->module) . " DI: $typeName \$$name"; diff --git a/framework/base/DynamicContentAwareInterface.php b/framework/base/DynamicContentAwareInterface.php index 58e2625c550..e605d8568f7 100644 --- a/framework/base/DynamicContentAwareInterface.php +++ b/framework/base/DynamicContentAwareInterface.php @@ -1,4 +1,5 @@ controllerNamespace . '\\' . str_replace('/', '\\', $prefix) . $className, '\\'); if (strpos($className, '-') !== false || !class_exists($className)) { return null; diff --git a/framework/base/NotSupportedException.php b/framework/base/NotSupportedException.php index 4161fb737f4..32a1bed9770 100644 --- a/framework/base/NotSupportedException.php +++ b/framework/base/NotSupportedException.php @@ -1,4 +1,5 @@ 30 ) { diff --git a/framework/base/StaticInstanceInterface.php b/framework/base/StaticInstanceInterface.php index 12cce4bfbc8..0d9af1134b5 100644 --- a/framework/base/StaticInstanceInterface.php +++ b/framework/base/StaticInstanceInterface.php @@ -1,4 +1,5 @@ dynamicPlaceholders[$placeholder] = $statements; -} + } /** * Evaluates the given PHP statements. diff --git a/framework/base/ViewContextInterface.php b/framework/base/ViewContextInterface.php index df2834c0d5c..ef2a1a4377d 100644 --- a/framework/base/ViewContextInterface.php +++ b/framework/base/ViewContextInterface.php @@ -1,4 +1,5 @@ skipUpdateOnClean + if ( + $this->skipUpdateOnClean && $event->name == ActiveRecord::EVENT_BEFORE_UPDATE && empty($this->owner->dirtyAttributes) ) { diff --git a/framework/behaviors/AttributeTypecastBehavior.php b/framework/behaviors/AttributeTypecastBehavior.php index a418b15de25..e2bde1b9a98 100644 --- a/framework/behaviors/AttributeTypecastBehavior.php +++ b/framework/behaviors/AttributeTypecastBehavior.php @@ -1,4 +1,5 @@ attributeTypes */ - private static $autoDetectedAttributeTypes = []; + private static $_autoDetectedAttributeTypes = []; /** @@ -193,7 +194,7 @@ class AttributeTypecastBehavior extends Behavior */ public static function clearAutoDetectedAttributeTypes() { - self::$autoDetectedAttributeTypes = []; + self::$_autoDetectedAttributeTypes = []; } /** @@ -205,10 +206,10 @@ public function attach($owner) if ($this->attributeTypes === null) { $ownerClass = get_class($this->owner); - if (!isset(self::$autoDetectedAttributeTypes[$ownerClass])) { - self::$autoDetectedAttributeTypes[$ownerClass] = $this->detectAttributeTypes(); + if (!isset(self::$_autoDetectedAttributeTypes[$ownerClass])) { + self::$_autoDetectedAttributeTypes[$ownerClass] = $this->detectAttributeTypes(); } - $this->attributeTypes = self::$autoDetectedAttributeTypes[$ownerClass]; + $this->attributeTypes = self::$_autoDetectedAttributeTypes[$ownerClass]; } } diff --git a/framework/behaviors/AttributesBehavior.php b/framework/behaviors/AttributesBehavior.php index df093864a34..5ab2ceea0d1 100644 --- a/framework/behaviors/AttributesBehavior.php +++ b/framework/behaviors/AttributesBehavior.php @@ -1,4 +1,5 @@ skipUpdateOnClean + if ( + $this->skipUpdateOnClean && $event->name === ActiveRecord::EVENT_BEFORE_UPDATE && empty($this->owner->dirtyAttributes) ) { @@ -152,7 +154,8 @@ public function evaluateAttributes($event) if (!empty($this->order[$event->name])) { $attributes = array_merge( array_intersect((array) $this->order[$event->name], $attributes), - array_diff($attributes, (array) $this->order[$event->name])); + array_diff($attributes, (array) $this->order[$event->name]) + ); } foreach ($attributes as $attribute) { if ($this->preserveNonEmptyValues && !empty($this->owner->$attribute)) { diff --git a/framework/behaviors/BlameableBehavior.php b/framework/behaviors/BlameableBehavior.php index f83b8b3f28c..f6396c33bfd 100755 --- a/framework/behaviors/BlameableBehavior.php +++ b/framework/behaviors/BlameableBehavior.php @@ -1,4 +1,5 @@ controller instanceof \yii\console\Controller && Yii::$app->controller->isColorEnabled($stream) - || Yii::$app instanceof \yii\console\Application && Console::streamSupportsAnsiColors($stream)) { + if ( + Yii::$app->controller instanceof \yii\console\Controller && Yii::$app->controller->isColorEnabled($stream) + || Yii::$app instanceof \yii\console\Application && Console::streamSupportsAnsiColors($stream) + ) { $message = Console::ansiFormat($message, $format); } diff --git a/framework/console/Exception.php b/framework/console/Exception.php index 59ee7d71acb..784857246da 100644 --- a/framework/console/Exception.php +++ b/framework/console/Exception.php @@ -1,4 +1,5 @@ getActionArgsHelp($action) as $argument => $help) { - $description = preg_replace("~\R~", '', addcslashes($help['comment'], ':')) ?: $argument; + $description = preg_replace('~\R~', '', addcslashes($help['comment'], ':')) ?: $argument; $this->stdout($argument . ':' . $description . "\n"); } $this->stdout("\n"); foreach ($controller->getActionOptionsHelp($action) as $argument => $help) { - $description = preg_replace("~\R~", '', addcslashes($help['comment'], ':')); + $description = preg_replace('~\R~', '', addcslashes($help['comment'], ':')); $this->stdout('--' . $argument . ($description ? ':' . $description : '') . "\n"); } } @@ -440,11 +441,12 @@ protected function getSubCommandHelp($controller, $actionID) if (!empty($args)) { foreach ($args as $name => $arg) { $this->stdout($this->formatOptionHelp( - '- ' . $this->ansiFormat($name, Console::FG_CYAN), - $arg['required'], - $arg['type'], - $arg['default'], - $arg['comment']) . "\n\n"); + '- ' . $this->ansiFormat($name, Console::FG_CYAN), + $arg['required'], + $arg['type'], + $arg['default'], + $arg['comment'] + ) . "\n\n"); } } @@ -452,12 +454,16 @@ protected function getSubCommandHelp($controller, $actionID) $this->stdout("\nOPTIONS\n\n", Console::BOLD); foreach ($options as $name => $option) { $this->stdout($this->formatOptionHelp( - $this->ansiFormat('--' . $name . $this->formatOptionAliases($controller, $name), - Console::FG_RED, empty($option['required']) ? Console::FG_RED : Console::BOLD), - !empty($option['required']), - $option['type'], - $option['default'], - $option['comment']) . "\n\n"); + $this->ansiFormat( + '--' . $name . $this->formatOptionAliases($controller, $name), + Console::FG_RED, + empty($option['required']) ? Console::FG_RED : Console::BOLD + ), + !empty($option['required']), + $option['type'], + $option['default'], + $option['comment'] + ) . "\n\n"); } } } diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 6d5a7d6448f..a869ab0195a 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -1,4 +1,5 @@ stdout('Inserting new messages...'); $insertCount = 0; @@ -392,9 +393,9 @@ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messag $db->schema->insert($sourceMessageTable, ['category' => $category, 'message' => $msg]); } } - + $this->stdout($insertCount ? "{$insertCount} saved.\n" : "Nothing to save.\n"); - + $this->stdout($removeUnused ? 'Deleting obsoleted messages...' : 'Updating obsoleted messages...'); if (empty($obsolete)) { @@ -408,13 +409,13 @@ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messag ->execute(); $this->stdout("{$affected} deleted.\n"); } elseif ($markUnused) { - $marked=0; + $marked = 0; $rows = (new Query()) ->select(['id', 'message']) ->from($sourceMessageTable) ->where(['in', 'id', array_keys($obsolete)]) ->all($db); - + foreach ($rows as $row) { $marked++; $db->createCommand()->update( @@ -428,64 +429,64 @@ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messag $this->stdout("kept untouched.\n"); } } - + // get fresh message id list $freshMessagesIds = []; $rows = (new Query())->select(['id'])->from($sourceMessageTable)->all($db); foreach ($rows as $row) { $freshMessagesIds[] = $row['id']; } - - $this->stdout("Generating missing rows..."); + + $this->stdout('Generating missing rows...'); $generatedMissingRows = []; - + foreach ($languages as $language) { - $count = 0; - - // get list of ids of translations for this language - $msgRowsIds = []; - $msgRows = (new Query())->select(['id'])->from($messageTable)->where([ - 'language'=>$language, - ])->all($db); - foreach ($msgRows as $row) { - $msgRowsIds[] = $row['id']; - } - - // insert missing - foreach ($freshMessagesIds as $id) { - if (!in_array($id, $msgRowsIds)) { - $db->createCommand() - ->insert($messageTable, ['id' => $id, 'language' => $language]) - ->execute(); - $count++; + $count = 0; + + // get list of ids of translations for this language + $msgRowsIds = []; + $msgRows = (new Query())->select(['id'])->from($messageTable)->where([ + 'language' => $language, + ])->all($db); + foreach ($msgRows as $row) { + $msgRowsIds[] = $row['id']; } - } - if ($count) { - $generatedMissingRows[] = "{$count} for {$language}"; - } - } - - $this->stdout($generatedMissingRows ? implode(", ", $generatedMissingRows).".\n" : "Nothing to do.\n"); - - $this->stdout("Dropping unused languages..."); - $droppedLanguages=[]; - + + // insert missing + foreach ($freshMessagesIds as $id) { + if (!in_array($id, $msgRowsIds)) { + $db->createCommand() + ->insert($messageTable, ['id' => $id, 'language' => $language]) + ->execute(); + $count++; + } + } + if ($count) { + $generatedMissingRows[] = "{$count} for {$language}"; + } + } + + $this->stdout($generatedMissingRows ? implode(', ', $generatedMissingRows) . ".\n" : "Nothing to do.\n"); + + $this->stdout('Dropping unused languages...'); + $droppedLanguages = []; + $currentLanguages = []; $rows = (new Query())->select(['language'])->from($messageTable)->groupBy('language')->all($db); foreach ($rows as $row) { $currentLanguages[] = $row['language']; } - + foreach ($currentLanguages as $currentLanguage) { - if (!in_array($currentLanguage, $languages)) { - $deleted=$db->createCommand()->delete($messageTable, "language=:language", [ - 'language'=>$currentLanguage, - ])->execute(); - $droppedLanguages[] = "removed {$deleted} rows for $currentLanguage"; - } - } - - $this->stdout($droppedLanguages ? implode(", ", $droppedLanguages).".\n" : "Nothing to do.\n"); + if (!in_array($currentLanguage, $languages)) { + $deleted = $db->createCommand()->delete($messageTable, 'language=:language', [ + 'language' => $currentLanguage, + ])->execute(); + $droppedLanguages[] = "removed {$deleted} rows for $currentLanguage"; + } + } + + $this->stdout($droppedLanguages ? implode(', ', $droppedLanguages) . ".\n" : "Nothing to do.\n"); } /** diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php index 17b6a76389a..3a7e5803641 100644 --- a/framework/console/controllers/MigrateController.php +++ b/framework/console/controllers/MigrateController.php @@ -1,4 +1,5 @@ templateFile; $table = null; - if (preg_match( - '/^create_?junction_?(?:table)?_?(?:for)?(.+)_?and(.+)_?tables?$/i', - $name, - $matches - )) { + if (preg_match('/^create_?junction_?(?:table)?_?(?:for)?(.+)_?and(.+)_?tables?$/i', $name, $matches)) { $templateFile = $this->generatorTemplateFiles['create_junction']; $firstTable = $this->normalizeTableName($matches[1]); $secondTable = $this->normalizeTableName($matches[2]); diff --git a/framework/console/controllers/ServeController.php b/framework/console/controllers/ServeController.php index b806f67d55b..2b8ce9f78c0 100644 --- a/framework/console/controllers/ServeController.php +++ b/framework/console/controllers/ServeController.php @@ -1,4 +1,5 @@ rows = array_map(function($row) { - return array_map(function($value) { + $this->rows = array_map(function ($row) { + return array_map(function ($value) { return empty($value) && !is_numeric($value) ? ' ' : (is_array($value) @@ -198,7 +199,8 @@ public function run() ); // Header if ($headerCount > 0) { - $buffer .= $this->renderRow($this->headers, + $buffer .= $this->renderRow( + $this->headers, $this->chars[self::CHAR_LEFT], $this->chars[self::CHAR_MIDDLE], $this->chars[self::CHAR_RIGHT] @@ -215,10 +217,12 @@ public function run() $this->chars[self::CHAR_RIGHT_MID] ); } - $buffer .= $this->renderRow($row, + $buffer .= $this->renderRow( + $row, $this->chars[self::CHAR_LEFT], $this->chars[self::CHAR_MIDDLE], - $this->chars[self::CHAR_RIGHT]); + $this->chars[self::CHAR_RIGHT] + ); } $buffer .= $this->renderSeparator( diff --git a/framework/data/ActiveDataFilter.php b/framework/data/ActiveDataFilter.php index be5704aa675..bf6eea2c32e 100644 --- a/framework/data/ActiveDataFilter.php +++ b/framework/data/ActiveDataFilter.php @@ -1,4 +1,5 @@ * @since 2.0 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ abstract class BaseDataProvider extends Component implements DataProviderInterface { diff --git a/framework/data/DataFilter.php b/framework/data/DataFilter.php index 057509203fe..8d4142e93f9 100644 --- a/framework/data/DataFilter.php +++ b/framework/data/DataFilter.php @@ -1,4 +1,5 @@ * @author Carsten Brandt * @since 2.0 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore * * @method ActiveRecordInterface|array|null one($db = null) See [[ActiveQueryInterface::one()]] for more info. * @method ActiveRecordInterface[] all($db = null) See [[ActiveQueryInterface::all()]] for more info. @@ -453,7 +455,8 @@ private function buildBuckets($models, $link, $viaModels = null, $viaQuery = nul * @param array $viaMap * @return array */ - private function mapVia($map, $viaMap) { + private function mapVia($map, $viaMap) + { $resultMap = []; foreach ($map as $key => $linkKeys) { $resultMap[$key] = []; diff --git a/framework/db/AfterSaveEvent.php b/framework/db/AfterSaveEvent.php index 3efccc10ec1..1a8a768d4fa 100644 --- a/framework/db/AfterSaveEvent.php +++ b/framework/db/AfterSaveEvent.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class ArrayExpression implements ExpressionInterface, \ArrayAccess, \Countable, \IteratorAggregate { diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 0791c45ec2f..41732caab1d 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -1,4 +1,5 @@ errorInfo[1]) ? $e->errorInfo[1] : null; - if ($this->getDbDriverName() !== 'sqlsrv' || $errorCode !== $this->mssqlNoMoreRowsErrorCode) { + if ($this->getDbDriverName() !== 'sqlsrv' || $errorCode !== self::MSSQL_NO_MORE_ROWS_ERROR_CODE) { throw $e; } } diff --git a/framework/db/CheckConstraint.php b/framework/db/CheckConstraint.php index 585032cfe80..1bb86d92bf4 100644 --- a/framework/db/CheckConstraint.php +++ b/framework/db/CheckConstraint.php @@ -1,4 +1,5 @@ type, [ @@ -123,12 +125,14 @@ protected function typecast($value) Schema::TYPE_BINARY, Schema::TYPE_CHAR ], - true) + true + ) ) { return null; } - if ($value === null + if ( + $value === null || gettype($value) === $this->phpType || $value instanceof ExpressionInterface || $value instanceof Query @@ -136,7 +140,8 @@ protected function typecast($value) return $value; } - if (is_array($value) + if ( + is_array($value) && count($value) === 2 && isset($value[1]) && in_array($value[1], $this->getPdoParamTypes(), true) @@ -154,7 +159,8 @@ protected function typecast($value) // ensure type cast always has . as decimal separator in all locales return StringHelper::floatToString($value); } - if (is_numeric($value) + if ( + is_numeric($value) && ColumnSchemaBuilder::CATEGORY_NUMERIC === ColumnSchemaBuilder::$typeCategoryMap[$this->type] ) { // https://github.com/yiisoft/yii2/issues/14663 diff --git a/framework/db/ColumnSchemaBuilder.php b/framework/db/ColumnSchemaBuilder.php index 756b4b8aa8b..d77515fad5d 100644 --- a/framework/db/ColumnSchemaBuilder.php +++ b/framework/db/ColumnSchemaBuilder.php @@ -1,4 +1,5 @@ _sql); diff --git a/framework/db/Connection.php b/framework/db/Connection.php index 4df8f3af62f..2a1c151c79d 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ final class PdoValue implements ExpressionInterface { diff --git a/framework/db/PdoValueBuilder.php b/framework/db/PdoValueBuilder.php index 6bec24c94bd..2eae1532739 100644 --- a/framework/db/PdoValueBuilder.php +++ b/framework/db/PdoValueBuilder.php @@ -1,4 +1,5 @@ columns : []; $sets = []; foreach ($columns as $name => $value) { - $value = isset($columnSchemas[$name]) ? $columnSchemas[$name]->dbTypecast($value) : $value; if ($value instanceof ExpressionInterface) { $placeholder = $this->buildExpression($value, $params); @@ -1527,7 +1527,7 @@ public function buildWithQueries($withs, &$params) $result[] = $with['alias'] . ' AS (' . $with['query'] . ')'; } - return 'WITH ' . ($recursive ? 'RECURSIVE ' : '') . implode (', ', $result); + return 'WITH ' . ($recursive ? 'RECURSIVE ' : '') . implode(', ', $result); } /** diff --git a/framework/db/QueryExpressionBuilder.php b/framework/db/QueryExpressionBuilder.php index e811c053c99..bd88a758ea0 100644 --- a/framework/db/QueryExpressionBuilder.php +++ b/framework/db/QueryExpressionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class BetweenColumnsCondition implements ConditionInterface { diff --git a/framework/db/conditions/BetweenColumnsConditionBuilder.php b/framework/db/conditions/BetweenColumnsConditionBuilder.php index 0795d0f2f85..516489c9c77 100644 --- a/framework/db/conditions/BetweenColumnsConditionBuilder.php +++ b/framework/db/conditions/BetweenColumnsConditionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class BetweenCondition implements ConditionInterface { diff --git a/framework/db/conditions/BetweenConditionBuilder.php b/framework/db/conditions/BetweenConditionBuilder.php index 2af0a29fe7c..dde3f9c3bb9 100644 --- a/framework/db/conditions/BetweenConditionBuilder.php +++ b/framework/db/conditions/BetweenConditionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class ExistsCondition implements ConditionInterface { diff --git a/framework/db/conditions/ExistsConditionBuilder.php b/framework/db/conditions/ExistsConditionBuilder.php index c7997d974cc..dcef6f7dcdc 100644 --- a/framework/db/conditions/ExistsConditionBuilder.php +++ b/framework/db/conditions/ExistsConditionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class HashCondition implements ConditionInterface { diff --git a/framework/db/conditions/HashConditionBuilder.php b/framework/db/conditions/HashConditionBuilder.php index 9e0b5a48002..da77c709322 100644 --- a/framework/db/conditions/HashConditionBuilder.php +++ b/framework/db/conditions/HashConditionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class InCondition implements ConditionInterface { diff --git a/framework/db/conditions/InConditionBuilder.php b/framework/db/conditions/InConditionBuilder.php index 3717c226b1f..32cb078ed79 100644 --- a/framework/db/conditions/InConditionBuilder.php +++ b/framework/db/conditions/InConditionBuilder.php @@ -1,4 +1,5 @@ queryBuilder->db->quoteColumnName($column); if ($operator === 'IN') { return sprintf('%s IS NULL', $column); diff --git a/framework/db/conditions/LikeCondition.php b/framework/db/conditions/LikeCondition.php index 0fe2a8fa0eb..8d203aab4cb 100644 --- a/framework/db/conditions/LikeCondition.php +++ b/framework/db/conditions/LikeCondition.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class NotCondition implements ConditionInterface { diff --git a/framework/db/conditions/NotConditionBuilder.php b/framework/db/conditions/NotConditionBuilder.php index 23772621f97..842d08a12e8 100644 --- a/framework/db/conditions/NotConditionBuilder.php +++ b/framework/db/conditions/NotConditionBuilder.php @@ -1,4 +1,5 @@ * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class SimpleCondition implements ConditionInterface { diff --git a/framework/db/conditions/SimpleConditionBuilder.php b/framework/db/conditions/SimpleConditionBuilder.php index 00a75115b8e..1983f52bfaf 100644 --- a/framework/db/conditions/SimpleConditionBuilder.php +++ b/framework/db/conditions/SimpleConditionBuilder.php @@ -1,4 +1,5 @@ type === 'timestamp' && $info['Default'] === 'SYS_TIMESTAMP' || + if ( + $column->type === 'timestamp' && $info['Default'] === 'SYS_TIMESTAMP' || $column->type === 'datetime' && $info['Default'] === 'SYS_DATETIME' || $column->type === 'date' && $info['Default'] === 'SYS_DATE' || $column->type === 'time' && $info['Default'] === 'SYS_TIME' diff --git a/framework/db/cubrid/conditions/LikeConditionBuilder.php b/framework/db/cubrid/conditions/LikeConditionBuilder.php index 80cd27173ea..89f0fe3ab88 100644 --- a/framework/db/cubrid/conditions/LikeConditionBuilder.php +++ b/framework/db/cubrid/conditions/LikeConditionBuilder.php @@ -1,4 +1,5 @@ hasLimit($limit)) { if ($limit instanceof Expression) { - $limit = '('. (string)$limit . ')'; + $limit = '(' . (string)$limit . ')'; } $sql = "SELECT TOP $limit * FROM ($sql) sub"; } else { @@ -199,7 +200,7 @@ public function alterColumn($table, $column, $type) if ($checkValue !== null) { $sqlAfter[] = "ALTER TABLE {$tableName} ADD CONSTRAINT " . $this->db->quoteColumnName("CK_{$constraintBase}") . - " CHECK (" . ($defaultValue instanceof Expression ? $checkValue : new Expression($checkValue)) . ")"; + ' CHECK (' . ($defaultValue instanceof Expression ? $checkValue : new Expression($checkValue)) . ')'; } if ($type->isUnique()) { @@ -307,10 +308,10 @@ protected function buildAddCommentSql($comment, $table, $column = null) throw new InvalidArgumentException("Table not found: $table"); } - $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'": 'SCHEMA_NAME()'; - $tableName = "N" . $this->db->quoteValue($tableSchema->name); - $columnName = $column ? "N" . $this->db->quoteValue($column) : null; - $comment = "N" . $this->db->quoteValue($comment); + $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'" : 'SCHEMA_NAME()'; + $tableName = 'N' . $this->db->quoteValue($tableSchema->name); + $columnName = $column ? 'N' . $this->db->quoteValue($column) : null; + $comment = 'N' . $this->db->quoteValue($comment); $functionParams = " @name = N'MS_description', @@ -373,9 +374,9 @@ protected function buildRemoveCommentSql($table, $column = null) throw new InvalidArgumentException("Table not found: $table"); } - $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'": 'SCHEMA_NAME()'; - $tableName = "N" . $this->db->quoteValue($tableSchema->name); - $columnName = $column ? "N" . $this->db->quoteValue($column) : null; + $schemaName = $tableSchema->schemaName ? "N'" . $tableSchema->schemaName . "'" : 'SCHEMA_NAME()'; + $tableName = 'N' . $this->db->quoteValue($tableSchema->name); + $columnName = $column ? 'N' . $this->db->quoteValue($column) : null; return " IF EXISTS ( @@ -502,7 +503,7 @@ public function insert($table, $columns, &$params) } $quoteColumnName = $this->db->quoteColumnName($column->name); - $cols[] = $quoteColumnName . ' ' . $dbType . ' ' . ($column->allowNull ? "NULL" : ""); + $cols[] = $quoteColumnName . ' ' . $dbType . ' ' . ($column->allowNull ? 'NULL' : ''); $outputColumns[] = 'INSERTED.' . $quoteColumnName; } } @@ -639,7 +640,7 @@ protected function extractAlias($table) * @see https://docs.microsoft.com/sql/relational-databases/system-catalog-views/sys-objects-transact-sql * @return string the DROP CONSTRAINTS SQL */ - private function dropConstraintsForColumn($table, $column, $type='') + private function dropConstraintsForColumn($table, $column, $type = '') { return "DECLARE @tableName VARCHAR(MAX) = '" . $this->db->quoteTableName($table) . "' DECLARE @columnName VARCHAR(MAX) = '{$column}' @@ -659,7 +660,7 @@ private function dropConstraintsForColumn($table, $column, $type='') WHERE i.[is_unique_constraint]=1 and i.[object_id]=OBJECT_ID(@tableName) ) cons JOIN [sys].[objects] so ON so.[object_id]=cons.[object_id] - " . (!empty($type) ? " WHERE so.[type]='{$type}'" : "") . ") + " . (!empty($type) ? " WHERE so.[type]='{$type}'" : '') . ") IF @constraintName IS NULL BREAK EXEC (N'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT [' + @constraintName + ']') END"; @@ -672,6 +673,6 @@ private function dropConstraintsForColumn($table, $column, $type='') public function dropColumn($table, $column) { return $this->dropConstraintsForColumn($table, $column) . "\nALTER TABLE " . $this->db->quoteTableName($table) - . " DROP COLUMN " . $this->db->quoteColumnName($column); + . ' DROP COLUMN ' . $this->db->quoteColumnName($column); } } diff --git a/framework/db/mssql/Schema.php b/framework/db/mssql/Schema.php index db7f07c87cb..a71f2e78647 100644 --- a/framework/db/mssql/Schema.php +++ b/framework/db/mssql/Schema.php @@ -1,4 +1,5 @@ db->quoteValue($table->name); + $whereSql = '[t1].[table_name] = ' . $this->db->quoteValue($table->name); if ($table->catalogName !== null) { $columnsTableName = "{$table->catalogName}.{$columnsTableName}"; $whereSql .= " AND [t1].[table_catalog] = '{$table->catalogName}'"; diff --git a/framework/db/mssql/SqlsrvPDO.php b/framework/db/mssql/SqlsrvPDO.php index 4285e220df0..ed8139eefad 100644 --- a/framework/db/mssql/SqlsrvPDO.php +++ b/framework/db/mssql/SqlsrvPDO.php @@ -1,4 +1,5 @@ columns)->name]; $defaultValue = 'DEFAULT'; } - + foreach ($columns as $name) { $names[] = $this->db->quoteColumnName($name); $placeholders[] = $defaultValue; @@ -312,8 +313,7 @@ public function upsert($table, $insertColumns, $updateColumns, &$params) public function addCommentOnColumn($table, $column, $comment) { // Strip existing comment which may include escaped quotes - $definition = trim(preg_replace("/COMMENT '(?:''|[^'])*'/i", '', - $this->getColumnDefinition($table, $column))); + $definition = trim(preg_replace("/COMMENT '(?:''|[^'])*'/i", '', $this->getColumnDefinition($table, $column))); $checkRegex = '/CHECK *(\(([^()]|(?-2))*\))/'; $check = preg_match($checkRegex, $definition, $checkMatches); diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index fa2270eb77d..6f8a2eb3ef7 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -1,4 +1,5 @@ type, ['timestamp', 'datetime', 'date', 'time']) + if ( + in_array($column->type, ['timestamp', 'datetime', 'date', 'time']) && isset($info['default']) - && preg_match('/^current_timestamp(?:\(([0-9]*)\))?$/i', $info['default'], $matches)) { + && preg_match('/^current_timestamp(?:\(([0-9]*)\))?$/i', $info['default'], $matches) + ) { $column->defaultValue = new Expression('CURRENT_TIMESTAMP' . (!empty($matches[1]) ? '(' . $matches[1] . ')' : '')); } elseif (isset($type) && $type === 'bit') { $column->defaultValue = bindec(trim(isset($info['default']) ? $info['default'] : '', 'b\'')); diff --git a/framework/db/oci/ColumnSchemaBuilder.php b/framework/db/oci/ColumnSchemaBuilder.php index dcb5ff21ef8..b104588c4cd 100644 --- a/framework/db/oci/ColumnSchemaBuilder.php +++ b/framework/db/oci/ColumnSchemaBuilder.php @@ -1,4 +1,5 @@ primaryKey)>1) { + if (count($tableSchema->primaryKey) > 1) { throw new InvalidArgumentException("Can't reset sequence for composite primary key in table: $table"); } // use master connection to get the biggest PK value $value = $this->db->useMaster(function (Connection $db) use ($tableSchema) { return $db->createCommand( - 'SELECT MAX("' . $tableSchema->primaryKey[0] . '") FROM "'. $tableSchema->name . '"' + 'SELECT MAX("' . $tableSchema->primaryKey[0] . '") FROM "' . $tableSchema->name . '"' )->queryScalar(); }) + 1; } diff --git a/framework/db/oci/Schema.php b/framework/db/oci/Schema.php index e0e4c05e2da..6234bfa490d 100644 --- a/framework/db/oci/Schema.php +++ b/framework/db/oci/Schema.php @@ -1,4 +1,5 @@ getType(), $expression->getDimension()-1); + return new $expressionClass($value, $expression->getType(), $expression->getDimension() - 1); } /** diff --git a/framework/db/pgsql/ArrayParser.php b/framework/db/pgsql/ArrayParser.php index 50a204e3c5d..e50ee3b7cda 100644 --- a/framework/db/pgsql/ArrayParser.php +++ b/framework/db/pgsql/ArrayParser.php @@ -1,4 +1,5 @@ * @author Dmytro Naumenko * @since 2.0.14 + * @phpcs:disable Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore */ class ArrayParser { diff --git a/framework/db/pgsql/ColumnSchema.php b/framework/db/pgsql/ColumnSchema.php index 33d97bbdf55..533e333e7b8 100644 --- a/framework/db/pgsql/ColumnSchema.php +++ b/framework/db/pgsql/ColumnSchema.php @@ -1,4 +1,5 @@ db->quoteTableName($name); @@ -435,7 +437,7 @@ private function oldUpsert($table, $insertColumns, $updateColumns, &$params) list($updates, $params) = $this->prepareUpdateSets($table, $updateColumns, $params); $updateSql = 'UPDATE ' . $this->db->quoteTableName($table) . ' SET ' . implode(', ', $updates) . ' FROM "EXCLUDED" ' . $this->buildWhere($updateCondition, $params) - . ' RETURNING ' . $this->db->quoteTableName($table) .'.*'; + . ' RETURNING ' . $this->db->quoteTableName($table) . '.*'; $selectUpsertSubQuery = (new Query()) ->select(new Expression('1')) ->from('upsert') diff --git a/framework/db/pgsql/Schema.php b/framework/db/pgsql/Schema.php index 154e01a3808..4b3604cf3bf 100644 --- a/framework/db/pgsql/Schema.php +++ b/framework/db/pgsql/Schema.php @@ -1,4 +1,5 @@ allowNull = $info['is_nullable']; $column->autoIncrement = $info['is_autoinc']; $column->comment = $info['column_comment']; - if ($info['type_scheme'] !== null && !in_array($info['type_scheme'], [$this->defaultSchema, 'pg_catalog'], true) - ) { + if ($info['type_scheme'] !== null && !in_array($info['type_scheme'], [$this->defaultSchema, 'pg_catalog'], true)) { $column->dbType = $info['type_scheme'] . '.' . $info['data_type']; } else { $column->dbType = $info['data_type']; diff --git a/framework/db/sqlite/ColumnSchemaBuilder.php b/framework/db/sqlite/ColumnSchemaBuilder.php index d9853b08ab3..7f3444d3d36 100644 --- a/framework/db/sqlite/ColumnSchemaBuilder.php +++ b/framework/db/sqlite/ColumnSchemaBuilder.php @@ -1,4 +1,5 @@ isBuiltin(); } - } else { $class = $param->getClass(); $isClass = $class !== null; diff --git a/framework/di/Instance.php b/framework/di/Instance.php index 39bd801b354..458b01f274c 100644 --- a/framework/di/Instance.php +++ b/framework/di/Instance.php @@ -1,4 +1,5 @@ matchAction($action) + if ( + $this->matchAction($action) && $this->matchRole($user) && $this->matchIP($request->getUserIP()) && $this->matchVerb($request->getMethod()) diff --git a/framework/filters/AjaxFilter.php b/framework/filters/AjaxFilter.php index 02b3d7ebf0e..a950946df95 100644 --- a/framework/filters/AjaxFilter.php +++ b/framework/filters/AjaxFilter.php @@ -1,4 +1,5 @@ filterAttribute === null) { + if ($this->filterAttribute === null) { $this->filterAttribute = $this->attribute; } } @@ -150,8 +151,10 @@ protected function renderHeaderCellContent() $label = Html::encode($label); } - if ($this->attribute !== null && $this->enableSorting && - ($sort = $this->grid->dataProvider->getSort()) !== false && $sort->hasAttribute($this->attribute)) { + if ( + $this->attribute !== null && $this->enableSorting && + ($sort = $this->grid->dataProvider->getSort()) !== false && $sort->hasAttribute($this->attribute) + ) { return $sort->link($this->attribute, array_merge($this->sortLinkOptions, ['label' => $label])); } diff --git a/framework/grid/GridView.php b/framework/grid/GridView.php index 7ee0e06bbc0..fc37be02859 100644 --- a/framework/grid/GridView.php +++ b/framework/grid/GridView.php @@ -1,4 +1,5 @@ "''''", // single `'` should be encoded as `''`, which internally should be encoded as `''''` // Day '\d' => "'d'", - 'd' => 'dd', // Day of the month, 2 digits with leading zeros 01 to 31 + 'd' => 'dd', // Day of the month, 2 digits with leading zeros — 01 to 31 '\D' => "'D'", - 'D' => 'eee', // A textual representation of a day, three letters Mon through Sun + 'D' => 'eee', // A textual representation of a day, three letters — Mon through Sun '\j' => "'j'", - 'j' => 'd', // Day of the month without leading zeros 1 to 31 + 'j' => 'd', // Day of the month without leading zeros — 1 to 31 '\l' => "'l'", - 'l' => 'eeee', // A full textual representation of the day of the week Sunday through Saturday + 'l' => 'eeee', // A full textual representation of the day of the week — Sunday through Saturday '\N' => "'N'", 'N' => 'e', // ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday) '\S' => "'S'", - 'S' => '', // English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j + 'S' => '', // English ordinal suffix for the day of the month, 2 characters — st, nd, rd or th. Works well with j '\w' => "'w'", - 'w' => '', // Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday) + 'w' => '', // Numeric representation of the day of the week — 0 (for Sunday) through 6 (for Saturday) '\z' => "'z'", - 'z' => 'D', // The day of the year (starting from 0) 0 through 365 + 'z' => 'D', // The day of the year (starting from 0) — 0 through 365 // Week '\W' => "'W'", - 'W' => 'w', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year) + 'W' => 'w', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) — Example: 42 (the 42nd week in the year) // Month '\F' => "'F'", 'F' => 'MMMM', // A full textual representation of a month, January through December '\m' => "'m'", - 'm' => 'MM', // Numeric representation of a month, with leading zeros 01 through 12 + 'm' => 'MM', // Numeric representation of a month, with leading zeros — 01 through 12 '\M' => "'M'", - 'M' => 'MMM', // A short textual representation of a month, three letters Jan through Dec + 'M' => 'MMM', // A short textual representation of a month, three letters — Jan through Dec '\n' => "'n'", - 'n' => 'M', // Numeric representation of a month, without leading zeros 1 through 12, not supported by ICU but we fallback to "with leading zero" + 'n' => 'M', // Numeric representation of a month, without leading zeros — 1 through 12, not supported by ICU but we fallback to "with leading zero" '\t' => "'t'", - 't' => '', // Number of days in the given month 28 through 31 + 't' => '', // Number of days in the given month — 28 through 31 // Year '\L' => "'L'", 'L' => '', // Whether it's a leap year, 1 if it is a leap year, 0 otherwise. '\o' => "'o'", 'o' => 'Y', // ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. '\Y' => "'Y'", - 'Y' => 'yyyy', // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 + 'Y' => 'yyyy', // A full numeric representation of a year, 4 digits — Examples: 1999 or 2003 '\y' => "'y'", - 'y' => 'yy', // A two digit representation of a year Examples: 99 or 03 + 'y' => 'yy', // A two digit representation of a year — Examples: 99 or 03 // Time '\a' => "'a'", 'a' => 'a', // Lowercase Ante meridiem and Post meridiem, am or pm '\A' => "'A'", 'A' => 'a', // Uppercase Ante meridiem and Post meridiem, AM or PM, not supported by ICU but we fallback to lowercase '\B' => "'B'", - 'B' => '', // Swatch Internet time 000 through 999 + 'B' => '', // Swatch Internet time — 000 through 999 '\g' => "'g'", - 'g' => 'h', // 12-hour format of an hour without leading zeros 1 through 12 + 'g' => 'h', // 12-hour format of an hour without leading zeros — 1 through 12 '\G' => "'G'", 'G' => 'H', // 24-hour format of an hour without leading zeros 0 to 23h '\h' => "'h'", @@ -294,9 +295,9 @@ public static function convertDatePhpToIcu($pattern) '\H' => "'H'", 'H' => 'HH', // 24-hour format of an hour with leading zeros, 00 to 23 h '\i' => "'i'", - 'i' => 'mm', // Minutes with leading zeros 00 to 59 + 'i' => 'mm', // Minutes with leading zeros — 00 to 59 '\s' => "'s'", - 's' => 'ss', // Seconds, with leading zeros 00 through 59 + 's' => 'ss', // Seconds, with leading zeros — 00 through 59 '\u' => "'u'", 'u' => '', // Microseconds. Example: 654321 // Timezone @@ -482,37 +483,37 @@ public static function convertDatePhpToJui($pattern) // https://www.php.net/manual/en/function.date return strtr($pattern, [ // Day - 'd' => 'dd', // Day of the month, 2 digits with leading zeros 01 to 31 - 'D' => 'D', // A textual representation of a day, three letters Mon through Sun - 'j' => 'd', // Day of the month without leading zeros 1 to 31 - 'l' => 'DD', // A full textual representation of the day of the week Sunday through Saturday + 'd' => 'dd', // Day of the month, 2 digits with leading zeros — 01 to 31 + 'D' => 'D', // A textual representation of a day, three letters — Mon through Sun + 'j' => 'd', // Day of the month without leading zeros — 1 to 31 + 'l' => 'DD', // A full textual representation of the day of the week — Sunday through Saturday 'N' => '', // ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday) - 'S' => '', // English ordinal suffix for the day of the month, 2 characters st, nd, rd or th. Works well with j - 'w' => '', // Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday) - 'z' => 'o', // The day of the year (starting from 0) 0 through 365 + 'S' => '', // English ordinal suffix for the day of the month, 2 characters — st, nd, rd or th. Works well with j + 'w' => '', // Numeric representation of the day of the week — 0 (for Sunday) through 6 (for Saturday) + 'z' => 'o', // The day of the year (starting from 0) — 0 through 365 // Week - 'W' => '', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year) + 'W' => '', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) — Example: 42 (the 42nd week in the year) // Month 'F' => 'MM', // A full textual representation of a month, January through December - 'm' => 'mm', // Numeric representation of a month, with leading zeros 01 through 12 - 'M' => 'M', // A short textual representation of a month, three letters Jan through Dec - 'n' => 'm', // Numeric representation of a month, without leading zeros 1 through 12 - 't' => '', // Number of days in the given month 28 through 31 + 'm' => 'mm', // Numeric representation of a month, with leading zeros — 01 through 12 + 'M' => 'M', // A short textual representation of a month, three letters — Jan through Dec + 'n' => 'm', // Numeric representation of a month, without leading zeros — 1 through 12 + 't' => '', // Number of days in the given month — 28 through 31 // Year 'L' => '', // Whether it's a leap year, 1 if it is a leap year, 0 otherwise. 'o' => '', // ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. - 'Y' => 'yy', // A full numeric representation of a year, 4 digits Examples: 1999 or 2003 - 'y' => 'y', // A two digit representation of a year Examples: 99 or 03 + 'Y' => 'yy', // A full numeric representation of a year, 4 digits — Examples: 1999 or 2003 + 'y' => 'y', // A two digit representation of a year — Examples: 99 or 03 // Time 'a' => '', // Lowercase Ante meridiem and Post meridiem, am or pm 'A' => '', // Uppercase Ante meridiem and Post meridiem, AM or PM, not supported by ICU but we fallback to lowercase - 'B' => '', // Swatch Internet time 000 through 999 - 'g' => '', // 12-hour format of an hour without leading zeros 1 through 12 + 'B' => '', // Swatch Internet time — 000 through 999 + 'g' => '', // 12-hour format of an hour without leading zeros — 1 through 12 'G' => '', // 24-hour format of an hour without leading zeros 0 to 23h 'h' => '', // 12-hour format of an hour with leading zeros, 01 to 12 h 'H' => '', // 24-hour format of an hour with leading zeros, 00 to 23 h - 'i' => '', // Minutes with leading zeros 00 to 59 - 's' => '', // Seconds, with leading zeros 00 through 59 + 'i' => '', // Minutes with leading zeros — 00 to 59 + 's' => '', // Seconds, with leading zeros — 00 through 59 'u' => '', // Microseconds. Example: 654321 // Timezone 'e' => '', // Timezone identifier. Examples: UTC, GMT, Atlantic/Azores diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 4f17fa670ea..e610af6ca1f 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1,4 +1,5 @@ charset : 'UTF-8'; } - } diff --git a/framework/helpers/BaseIpHelper.php b/framework/helpers/BaseIpHelper.php index 5ab73a63106..98b97ddd56a 100644 --- a/framework/helpers/BaseIpHelper.php +++ b/framework/helpers/BaseIpHelper.php @@ -1,4 +1,5 @@ 'application/rtf', 'text/xml' => 'application/xml', diff --git a/framework/helpers/mimeExtensions.php b/framework/helpers/mimeExtensions.php index e4936030fd8..8247ff28297 100644 --- a/framework/helpers/mimeExtensions.php +++ b/framework/helpers/mimeExtensions.php @@ -1,4 +1,5 @@ 'ez', 'application/applixware' => 'aw', diff --git a/framework/helpers/mimeTypes.php b/framework/helpers/mimeTypes.php index f895e8d0728..c5ddb934900 100644 --- a/framework/helpers/mimeTypes.php +++ b/framework/helpers/mimeTypes.php @@ -1,4 +1,5 @@ 'application/vnd.lotus-1-2-3', '3dml' => 'text/vnd.in3d.3dml', @@ -1008,7 +1010,7 @@ # fix for bundled libmagic bug, see also https://github.com/yiisoft/yii2/issues/19925 if ((PHP_VERSION_ID >= 80100 && PHP_VERSION_ID < 80122) || (PHP_VERSION_ID >= 80200 && PHP_VERSION_ID < 80209)) { - $mimeTypes = array_replace($mimeTypes, array('xz' => 'application/octet-stream')); + $mimeTypes = array_replace($mimeTypes, ['xz' => 'application/octet-stream']); } return $mimeTypes; diff --git a/framework/i18n/DbMessageSource.php b/framework/i18n/DbMessageSource.php index 0686291d2a7..155cbc3eccc 100644 --- a/framework/i18n/DbMessageSource.php +++ b/framework/i18n/DbMessageSource.php @@ -1,4 +1,5 @@ defaultTimeZone)) + new DateTimeZone($this->defaultTimeZone) + ) ) !== false ) { // try Y-m-d format (support invalid dates like 2012-13-01) return $checkDateTimeInfo ? [$timestamp, false, true] : $timestamp; @@ -891,7 +893,8 @@ protected function normalizeDatetimeValue($value, $checkDateTimeInfo = false) ($timestamp = DateTime::createFromFormat( 'Y-m-d H:i:s', $value, - new DateTimeZone($this->defaultTimeZone)) + new DateTimeZone($this->defaultTimeZone) + ) ) !== false ) { // try Y-m-d H:i:s format (support invalid dates like 2012-13-01 12:63:12) return $checkDateTimeInfo ? [$timestamp, true, true] : $timestamp; diff --git a/framework/i18n/GettextFile.php b/framework/i18n/GettextFile.php index 6e320348c31..519d9e1571c 100644 --- a/framework/i18n/GettextFile.php +++ b/framework/i18n/GettextFile.php @@ -1,4 +1,5 @@ bindValues([ + if ( + $command->bindValues([ ':level' => $level, ':category' => $category, ':log_time' => $timestamp, ':prefix' => $this->getMessagePrefix($message), ':message' => $text, - ])->execute() > 0) { + ])->execute() > 0 + ) { continue; } throw new LogRuntimeException('Unable to export log through database!'); diff --git a/framework/log/Dispatcher.php b/framework/log/Dispatcher.php index 11b6b0016a9..c913bc0873f 100644 --- a/framework/log/Dispatcher.php +++ b/framework/log/Dispatcher.php @@ -1,4 +1,5 @@ dbTargets === []) { + if ($this->_dbTargets === []) { $log = Yii::$app->getLog(); $usedTargets = []; @@ -45,17 +46,17 @@ protected function getDbTargets() if (!in_array($currentTarget, $usedTargets, true)) { // do not create same table twice $usedTargets[] = $currentTarget; - $this->dbTargets[] = $target; + $this->_dbTargets[] = $target; } } } - if ($this->dbTargets === []) { + if ($this->_dbTargets === []) { throw new InvalidConfigException('You should configure "log" component to use one or more database targets before executing this migration.'); } } - return $this->dbTargets; + return $this->_dbTargets; } public function up() diff --git a/framework/mail/BaseMailer.php b/framework/mail/BaseMailer.php index c5f76fb7538..f07bfa4f87e 100644 --- a/framework/mail/BaseMailer.php +++ b/framework/mail/BaseMailer.php @@ -1,4 +1,5 @@ keyPrefix instanceof Expression) { $expression = strtr($expression, [':prefix' => $this->keyPrefix->expression]); $params = $this->keyPrefix->params; diff --git a/framework/mutex/OracleMutex.php b/framework/mutex/OracleMutex.php index 1e15876edd8..c24c5f20b3f 100644 --- a/framework/mutex/OracleMutex.php +++ b/framework/mutex/OracleMutex.php @@ -1,4 +1,5 @@ from(['fkc' => 'sys.foreign_key_columns']) ->innerJoin(['c' => 'sys.columns'], 'fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id') ->innerJoin(['r' => 'sys.columns'], 'fkc.referenced_object_id = r.object_id AND fkc.referenced_column_id = r.column_id') - ->andWhere('fkc.parent_object_id=OBJECT_ID(:fkc_parent_object_id)',[':fkc_parent_object_id' => $this->db->schema->getRawTableName($table)]) - ->andWhere('fkc.referenced_object_id=OBJECT_ID(:fkc_referenced_object_id)',[':fkc_referenced_object_id' => $this->db->schema->getRawTableName($referenceTable)]) + ->andWhere('fkc.parent_object_id=OBJECT_ID(:fkc_parent_object_id)', [':fkc_parent_object_id' => $this->db->schema->getRawTableName($table)]) + ->andWhere('fkc.referenced_object_id=OBJECT_ID(:fkc_referenced_object_id)', [':fkc_referenced_object_id' => $this->db->schema->getRawTableName($referenceTable)]) ->andWhere(['c.name' => $column]) ->andWhere(['r.name' => $referenceColumn]) ->scalar($this->db); @@ -77,8 +78,7 @@ public function up() BEGIN DELETE FROM {$schema}.{$authManager->itemChildTable} WHERE parent IN (SELECT name FROM deleted) OR child IN (SELECT name FROM deleted); DELETE FROM {$schema}.{$authManager->itemTable} WHERE name IN (SELECT name FROM deleted); - END;" - ); + END;"); $foreignKey = $this->findForeignKeyName($authManager->itemChildTable, 'child', $authManager->itemTable, 'name'); $this->execute("CREATE TRIGGER {$schema}.trigger_update_{$triggerSuffix} @@ -106,8 +106,7 @@ public function up() BEGIN ALTER TABLE {$authManager->itemChildTable} CHECK CONSTRAINT {$foreignKey}; END - END;" - ); + END;"); } } diff --git a/framework/rest/Action.php b/framework/rest/Action.php index c700d665c8f..ca9accb27cf 100644 --- a/framework/rest/Action.php +++ b/framework/rest/Action.php @@ -1,4 +1,5 @@ dataFile === null) { - if ($this->dataDirectory !== null) { $dataFile = $this->getTableSchema()->fullName . '.php'; } else { diff --git a/framework/test/ArrayFixture.php b/framework/test/ArrayFixture.php index c146ab34e33..faa59c7a539 100644 --- a/framework/test/ArrayFixture.php +++ b/framework/test/ArrayFixture.php @@ -1,4 +1,5 @@ forceMasterDb && method_exists($connection, 'useMaster')) { - $exists = $connection->useMaster(function() use ($relationQuery) { + $exists = $connection->useMaster(function () use ($relationQuery) { return $relationQuery->exists(); }); } else { @@ -328,7 +329,8 @@ private function applyTableAlias($query, $conditions, $alias = null) $prefixedColumn = "{$alias}.[[" . preg_replace( '/^' . preg_quote($alias, '/') . '\.(.*)$/', '$1', - $columnName) . ']]'; + $columnName + ) . ']]'; } else { // there is an expression, can't prefix it reliably $prefixedColumn = $columnName; diff --git a/framework/validators/FileValidator.php b/framework/validators/FileValidator.php index 28d97f9c972..a93814a39ab 100644 --- a/framework/validators/FileValidator.php +++ b/framework/validators/FileValidator.php @@ -1,4 +1,5 @@ range) + if ( + !is_array($this->range) && !($this->range instanceof \Closure) && !($this->range instanceof \Traversable) ) { @@ -75,7 +77,8 @@ protected function validateValue($value) { $in = false; - if ($this->allowArray + if ( + $this->allowArray && ($value instanceof \Traversable || is_array($value)) && ArrayHelper::isSubset($value, $this->range, $this->strict) ) { diff --git a/framework/validators/RegularExpressionValidator.php b/framework/validators/RegularExpressionValidator.php index 747c4d2a9ee..7de28d478b2 100644 --- a/framework/validators/RegularExpressionValidator.php +++ b/framework/validators/RegularExpressionValidator.php @@ -1,4 +1,5 @@ db->useMaster(function() use ($oldID) { + $row = $this->db->useMaster(function () use ($oldID) { return (new Query())->from($this->sessionTable) ->where(['id' => $oldID]) ->createCommand($this->db) diff --git a/framework/web/ErrorAction.php b/framework/web/ErrorAction.php index e59f3ab2453..7ac9b0cbe27 100644 --- a/framework/web/ErrorAction.php +++ b/framework/web/ErrorAction.php @@ -1,4 +1,5 @@ data) + if ( + is_array($response->data) && isset($response->data['data'], $response->data['callback']) ) { $response->content = sprintf( diff --git a/framework/web/Link.php b/framework/web/Link.php index 3f90fc66a28..bf62be8e76c 100644 --- a/framework/web/Link.php +++ b/framework/web/Link.php @@ -1,4 +1,5 @@ getSecureForwardedHeaderTrustedPart('for'); - if ($ip !== null && preg_match( - '/^\[?(?P(?:(?:(?:[0-9a-f]{1,4}:){1,6}(?:[0-9a-f]{1,4})?(?:(?::[0-9a-f]{1,4}){1,6}))|(?:\d{1,3}\.){3}\d{1,3}))\]?(?::(?P\d+))?$/', - $ip, - $matches - )) { + if ( + $ip !== null && preg_match( + '/^\[?(?P(?:(?:(?:[0-9a-f]{1,4}:){1,6}(?:[0-9a-f]{1,4})?(?:(?::[0-9a-f]{1,4}){1,6}))|(?:\d{1,3}\.){3}\d{1,3}))\]?(?::(?P\d+))?$/', + $ip, + $matches + ) + ) { $ip = $this->getUserIpFromIpHeader($matches['ip']); if ($ip !== null) { return $ip; @@ -1291,7 +1297,7 @@ protected function getUserIpFromIpHeader($ips) public function getUserHost() { $userIp = $this->getUserIpFromIpHeaders(); - if($userIp === null) { + if ($userIp === null) { return $this->getRemoteHost(); } return gethostbyaddr($userIp); @@ -1980,8 +1986,7 @@ protected function getSecureForwardedHeaderParts() preg_match_all('/(?:[^",]++|"[^"]++")+/', $forwarded, $forwardedElements); foreach ($forwardedElements[0] as $forwardedPairs) { - preg_match_all('/(?P\w+)\s*=\s*(?:(?P[^",;]*[^",;\s])|"(?P[^"]+)")/', $forwardedPairs, - $matches, PREG_SET_ORDER); + preg_match_all('/(?P\w+)\s*=\s*(?:(?P[^",;]*[^",;\s])|"(?P[^"]+)")/', $forwardedPairs, $matches, PREG_SET_ORDER); $this->_secureForwardedHeaderParts[] = array_reduce($matches, function ($carry, $item) { $value = $item['value']; if (isset($item['value2']) && $item['value2'] !== '') { diff --git a/framework/web/RequestParserInterface.php b/framework/web/RequestParserInterface.php index 44a1051a6dd..cbc02ba731a 100644 --- a/framework/web/RequestParserInterface.php +++ b/framework/web/RequestParserInterface.php @@ -1,4 +1,5 @@ getIsActive()) { if (isset($_SESSION)) { - $this->frozenSessionData = $_SESSION; + $this->_frozenSessionData = $_SESSION; } $this->close(); Yii::info('Session frozen', __METHOD__); @@ -1029,8 +1028,7 @@ protected function freeze() */ protected function unfreeze() { - if (null !== $this->frozenSessionData) { - + if (null !== $this->_frozenSessionData) { YII_DEBUG ? session_start() : @session_start(); if ($this->getIsActive()) { @@ -1041,8 +1039,8 @@ protected function unfreeze() Yii::error($message, __METHOD__); } - $_SESSION = $this->frozenSessionData; - $this->frozenSessionData = null; + $_SESSION = $this->_frozenSessionData; + $this->_frozenSessionData = null; } } diff --git a/framework/web/SessionIterator.php b/framework/web/SessionIterator.php index e4b4c9eb809..433ebd943ac 100644 --- a/framework/web/SessionIterator.php +++ b/framework/web/SessionIterator.php @@ -1,4 +1,5 @@ getRequest(); $canRedirect = !$checkAcceptHeader || $this->checkRedirectAcceptable(); - if ($this->enableSession + if ( + $this->enableSession && $request->getIsGet() && (!$checkAjax || !$request->getIsAjax()) && $canRedirect diff --git a/framework/web/UserEvent.php b/framework/web/UserEvent.php index 34a028910bf..404d2c52d3d 100644 --- a/framework/web/UserEvent.php +++ b/framework/web/UserEvent.php @@ -1,4 +1,5 @@ useTraversableAsArray && !$data instanceof Arrayable) ) { foreach ($data as $name => $value) { diff --git a/framework/web/YiiAsset.php b/framework/web/YiiAsset.php index a66908b8a9d..52a73d795da 100644 --- a/framework/web/YiiAsset.php +++ b/framework/web/YiiAsset.php @@ -1,4 +1,5 @@ + + + + + + + + + + + + + + + + framework/views/* + diff --git a/tests/framework/log/TargetTest.php b/tests/framework/log/TargetTest.php index eace93aa3bf..30480bb2f73 100644 --- a/tests/framework/log/TargetTest.php +++ b/tests/framework/log/TargetTest.php @@ -76,7 +76,12 @@ public function testFilter($filter, $expected) $logger->log('testH', Logger::LEVEL_ERROR, 'yii.db.Command.whatever'); $logger->log('testI', Logger::LEVEL_ERROR, 'yii\db\Command::query'); - $this->assertEquals(count($expected), count(static::$messages), 'Expected ' . implode(',', $expected) . ', got ' . implode(',', array_column(static::$messages, 0))); + $messageColumn = []; + foreach (static::$messages as $message) { + $messageColumn[] = $message[0]; + } + + $this->assertEquals(count($expected), count(static::$messages), 'Expected ' . implode(',', $expected) . ', got ' . implode(',', $messageColumn)); $i = 0; foreach ($expected as $e) { $this->assertEquals('test' . $e, static::$messages[$i++][0]); From ce813e5060e15aba67ea1bf9fa1ae117bff2a9f6 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 20 Mar 2024 17:27:20 -0300 Subject: [PATCH 092/125] Raise version min `PHP 7.3`. --- .appveyor.yml | 4 +- .github/workflows/build.yml | 54 +- .github/workflows/ci-mssql.yml | 6 - .github/workflows/ci-mysql.yml | 11 +- .github/workflows/ci-pgsql.yml | 11 +- .github/workflows/ci-sqlite.yml | 9 - composer.json | 21 +- composer.lock | 1515 +++++++++++------ framework/base/Object.php | 31 - phpunit.xml.dist | 61 +- tests/IsOneOfAssert.php | 32 +- tests/ResultPrinter.php | 12 +- tests/TestCase.php | 6 +- tests/bootstrap.php | 1 - tests/compatibility.php | 75 - .../models/ValidatorTestTypedPropModel.php | 5 +- tests/framework/BaseYiiTest.php | 6 +- tests/framework/ChangeLogTest.php | 5 +- tests/framework/base/ActionFilterTest.php | 2 +- tests/framework/base/BaseObjectTest.php | 17 +- tests/framework/base/BehaviorTest.php | 4 +- tests/framework/base/ComponentTest.php | 9 +- tests/framework/base/DynamicModelTest.php | 2 +- tests/framework/base/EventTest.php | 4 +- tests/framework/base/ModelTest.php | 7 +- tests/framework/base/ModuleTest.php | 2 +- tests/framework/base/SecurityTest.php | 24 +- tests/framework/base/ThemeTest.php | 2 +- tests/framework/base/ViewTest.php | 4 +- tests/framework/base/WidgetTest.php | 2 +- .../behaviors/AttributeBehaviorTest.php | 6 +- .../AttributeTypecastBehaviorTest.php | 6 +- .../behaviors/AttributesBehaviorTest.php | 6 +- .../BlameableBehaviorConsoleTest.php | 6 +- .../behaviors/BlameableBehaviorTest.php | 6 +- .../behaviors/CacheableWidgetBehaviorTest.php | 2 +- .../behaviors/OptimisticLockBehaviorTest.php | 16 +- .../behaviors/SluggableBehaviorTest.php | 6 +- .../behaviors/TimestampBehaviorTest.php | 6 +- tests/framework/caching/CacheTestCase.php | 4 +- tests/framework/caching/DbCacheTest.php | 2 +- tests/framework/caching/DbDependencyTest.php | 2 +- .../caching/DbQueryDependencyTest.php | 2 +- tests/framework/caching/FileCacheTest.php | 37 +- tests/framework/caching/MssqlCacheTest.php | 2 +- tests/framework/caching/PgSQLCacheTest.php | 2 +- tests/framework/console/ControllerTest.php | 25 +- .../console/UnknownCommandExceptionTest.php | 2 +- .../controllers/AssetControllerTest.php | 28 +- .../controllers/BaseMessageControllerTest.php | 4 +- .../controllers/CacheControllerTest.php | 8 +- .../controllers/DbMessageControllerTest.php | 6 +- .../controllers/FixtureControllerTest.php | 4 +- .../controllers/HelpControllerTest.php | 58 +- .../controllers/MigrateControllerTest.php | 18 +- .../MigrateControllerTestTrait.php | 22 +- .../controllers/PHPMessageControllerTest.php | 6 +- .../controllers/POMessageControllerTest.php | 4 +- .../controllers/ServeControllerTest.php | 22 +- tests/framework/console/widgets/TableTest.php | 4 +- tests/framework/data/ActiveDataFilterTest.php | 2 +- .../framework/data/ActiveDataProviderTest.php | 4 +- .../framework/data/ArrayDataProviderTest.php | 2 +- tests/framework/data/DataFilterTest.php | 2 +- tests/framework/data/PaginationTest.php | 2 +- tests/framework/data/SortTest.php | 2 +- .../db/ActiveQueryModelConnectionTest.php | 2 +- tests/framework/db/ActiveQueryTest.php | 2 +- tests/framework/db/ActiveRecordTest.php | 58 +- tests/framework/db/BaseActiveRecordTest.php | 2 +- tests/framework/db/BatchQueryResultTest.php | 2 +- tests/framework/db/CommandTest.php | 28 +- tests/framework/db/ConnectionTest.php | 18 +- tests/framework/db/DatabaseTestCase.php | 4 +- tests/framework/db/QueryTest.php | 3 +- tests/framework/db/SchemaTest.php | 17 +- tests/framework/db/mssql/CommandTest.php | 7 +- .../framework/db/mssql/type/VarbinaryTest.php | 2 +- .../db/mysql/BaseActiveRecordTest.php | 4 + tests/framework/db/mysql/QueryTest.php | 3 +- tests/framework/db/oci/ActiveRecordTest.php | 3 +- tests/framework/db/oci/ConnectionTest.php | 2 + tests/framework/db/oci/QueryBuilderTest.php | 2 +- tests/framework/db/pgsql/ArrayParserTest.php | 2 +- .../db/pgsql/BaseActiveRecordTest.php | 4 + tests/framework/db/pgsql/ConnectionTest.php | 2 +- tests/framework/di/ContainerTest.php | 39 +- tests/framework/di/InstanceTest.php | 11 +- tests/framework/filters/AccessRuleTest.php | 2 +- .../filters/ContentNegotiatorTest.php | 9 +- tests/framework/filters/HostControlTest.php | 2 +- tests/framework/filters/HttpCacheTest.php | 2 +- tests/framework/filters/PageCacheTest.php | 4 +- tests/framework/filters/RateLimiterTest.php | 14 +- .../framework/filters/auth/AuthMethodTest.php | 2 +- tests/framework/filters/auth/AuthTest.php | 2 +- .../filters/auth/CompositeAuthTest.php | 2 +- tests/framework/grid/ActionColumnTest.php | 10 +- tests/framework/grid/CheckboxColumnTest.php | 38 +- tests/framework/grid/GridViewTest.php | 6 +- .../framework/grid/RadiobuttonColumnTest.php | 11 +- tests/framework/helpers/ArrayHelperTest.php | 32 +- tests/framework/helpers/BaseConsoleTest.php | 2 +- tests/framework/helpers/ConsoleTest.php | 2 +- tests/framework/helpers/FileHelperTest.php | 30 +- .../framework/helpers/FormatConverterTest.php | 6 +- tests/framework/helpers/HtmlTest.php | 38 +- tests/framework/helpers/InflectorTest.php | 2 +- tests/framework/helpers/IpHelperTest.php | 2 + tests/framework/helpers/JsonTest.php | 9 +- tests/framework/helpers/MarkdownTest.php | 11 +- tests/framework/helpers/StringHelperTest.php | 2 +- tests/framework/helpers/UrlTest.php | 6 +- tests/framework/helpers/VarDumperTest.php | 18 +- tests/framework/i18n/DbMessageSourceTest.php | 4 +- tests/framework/i18n/FormatterDateTest.php | 24 +- tests/framework/i18n/FormatterNumberTest.php | 4 +- tests/framework/i18n/FormatterTest.php | 4 +- tests/framework/i18n/GettextPoFileTest.php | 2 +- tests/framework/i18n/I18NTest.php | 2 +- tests/framework/i18n/LocaleTest.php | 4 +- tests/framework/log/DbTargetTest.php | 4 +- tests/framework/log/DispatcherTest.php | 2 +- tests/framework/log/EmailTargetTest.php | 9 +- tests/framework/log/FileTargetTest.php | 30 +- tests/framework/log/LoggerTest.php | 2 +- tests/framework/log/SyslogTargetTest.php | 2 +- tests/framework/log/TargetTest.php | 34 +- tests/framework/mail/BaseMailerTest.php | 10 +- tests/framework/mail/BaseMessageTest.php | 2 +- tests/framework/mutex/FileMutexTest.php | 2 +- tests/framework/rbac/DbManagerTestCase.php | 27 +- tests/framework/rbac/ManagerTestCase.php | 12 +- tests/framework/rbac/PhpManagerTest.php | 17 +- tests/framework/rest/IndexActionTest.php | 2 +- tests/framework/rest/SerializerTest.php | 2 +- tests/framework/rest/UrlRuleTest.php | 4 +- tests/framework/test/ActiveFixtureTest.php | 8 +- tests/framework/test/ArrayFixtureTest.php | 8 +- tests/framework/test/FixtureTest.php | 4 +- .../validators/BooleanValidatorTest.php | 2 +- .../validators/CompareValidatorTest.php | 2 +- .../validators/DateValidatorTest.php | 4 +- .../validators/DefaultValueValidatorTest.php | 2 +- .../validators/EachValidatorTest.php | 11 +- .../validators/EmailValidatorTest.php | 2 +- .../validators/ExistValidatorTest.php | 2 +- .../validators/FileValidatorTest.php | 8 +- .../validators/FilterValidatorTest.php | 2 +- .../framework/validators/IpValidatorTest.php | 2 +- .../validators/NumberValidatorTest.php | 18 +- .../validators/RangeValidatorTest.php | 4 +- .../RegularExpressionValidatorTest.php | 4 +- .../validators/RequiredValidatorTest.php | 2 +- .../validators/StringValidatorTest.php | 8 +- .../validators/UniqueValidatorTest.php | 4 +- .../framework/validators/UrlValidatorTest.php | 2 +- tests/framework/validators/ValidatorTest.php | 2 +- tests/framework/web/AssetBundleTest.php | 18 +- tests/framework/web/AssetConverterTest.php | 4 +- tests/framework/web/ControllerTest.php | 33 +- tests/framework/web/ErrorActionTest.php | 4 +- tests/framework/web/ErrorHandlerTest.php | 22 +- tests/framework/web/FormatterTest.php | 2 +- tests/framework/web/GroupUrlRuleTest.php | 2 +- tests/framework/web/RequestTest.php | 12 +- tests/framework/web/ResponseTest.php | 2 +- tests/framework/web/UploadedFileTest.php | 2 +- .../framework/web/UrlManagerParseUrlTest.php | 2 +- tests/framework/web/UrlNormalizerTest.php | 2 +- tests/framework/web/UrlRuleTest.php | 4 +- tests/framework/web/UserTest.php | 4 +- tests/framework/web/ViewTest.php | 155 +- .../web/session/AbstractDbSessionTest.php | 4 +- .../web/session/CacheSessionTest.php | 2 +- .../web/session/pgsql/DbSessionTest.php | 2 +- .../web/session/sqlite/DbSessionTest.php | 2 +- tests/framework/widgets/ActiveFieldTest.php | 11 +- tests/framework/widgets/ActiveFormTest.php | 4 +- tests/framework/widgets/BlockTest.php | 2 +- tests/framework/widgets/BreadcrumbsTest.php | 2 +- .../widgets/ContentDecoratorTest.php | 2 +- tests/framework/widgets/DetailViewTest.php | 2 +- tests/framework/widgets/FragmentCacheTest.php | 2 +- tests/framework/widgets/LinkPagerTest.php | 41 +- tests/framework/widgets/LinkSorterTest.php | 2 +- tests/framework/widgets/ListViewTest.php | 2 +- tests/framework/widgets/MenuTest.php | 2 +- tests/framework/widgets/PjaxTest.php | 2 +- 189 files changed, 1867 insertions(+), 1552 deletions(-) delete mode 100644 framework/base/Object.php delete mode 100644 tests/compatibility.php diff --git a/.appveyor.yml b/.appveyor.yml index 8b529e45537..92006505103 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,7 +4,7 @@ clone_folder: C:\projects\yii2 environment: matrix: - - php_ver: 7.2.4 + - php_ver: 7.3.0 cache: - '%APPDATA%\Composer' @@ -30,7 +30,7 @@ install: - echo extension=php_mbstring.dll >> php.ini - echo extension=php_openssl.dll >> php.ini - echo extension=php_pdo_sqlite.dll >> php.ini - - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/1.4.1/composer.phar) + - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/2.6.3/composer.phar) before_test: - cd C:\projects\yii2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2cc61a4f5b..9893def13f6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,62 +13,32 @@ concurrency: jobs: phpunit: - name: PHP ${{ matrix.php }} on ${{ matrix.os }} + name: PHP ${{ matrix.php }} - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - - php: 5.4 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 5.5 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 5.6 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 7.0 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 7.1 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 7.2 - coverage: none - extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - php: 7.3 - coverage: none extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest + coverage: none - php: 7.4 - coverage: xdebug extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest + coverage: pcov - php: 8.0 - coverage: none extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest - - php: 8.1 coverage: none + - php: 8.1 extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached - os: ubuntu-latest + coverage: none - php: 8.2 extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached coverage: none - os: ubuntu-latest - php: 8.3 extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached coverage: none - os: ubuntu-latest steps: - name: Generate french locale. @@ -92,18 +62,14 @@ jobs: - name: Install dependencies. run: composer update $DEFAULT_COMPOSER_FLAGS - - name: Run tests with PHPUnit. - if: matrix.php < '7.4' || matrix.php >= '8.1' - run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always - - - name: Run tests with PHPUnit. - if: matrix.php == '8.0' - run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always - - name: Run tests with PHPUnit and generate coverage. if: matrix.php == '7.4' run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --coverage-clover=coverage.xml --colors=always + - name: Run tests with PHPUnit. + if: matrix.php >= '8.0' + run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always + - name: Upload coverage to Codecov. if: matrix.php == '7.4' uses: codecov/codecov-action@v3 diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index e80550119d0..9efead3d6dd 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -66,15 +66,9 @@ jobs: run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - name: Run MSSQL tests with PHPUnit and generate coverage. - if: matrix.php == '7.4' run: vendor/bin/phpunit --group mssql --coverage-clover=coverage.xml --colors=always - - name: Run MSSQL tests with PHPUnit. - if: matrix.php > '7.4' - run: vendor/bin/phpunit --group mssql --colors=always - - name: Upload coverage to Codecov. - if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index 4e0f651aae9..11e3efbdbca 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -15,13 +15,10 @@ jobs: extensions: curl, intl, pdo, pdo_mysql XDEBUG_MODE: coverage, develop - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: - - ubuntu-latest - php: - 7.4 - 8.0 @@ -60,15 +57,9 @@ jobs: run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - name: Run MySQL tests with PHPUnit and generate coverage. - if: matrix.php == '7.4' run: vendor/bin/phpunit --group mysql --coverage-clover=coverage.xml --colors=always - - name: Run MySQL tests with PHPUnit. - if: matrix.php > '7.4' - run: vendor/bin/phpunit --group mysql --colors=always - - name: Upload coverage to Codecov. - if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index ba0217e2212..a64620a2d02 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -15,13 +15,10 @@ jobs: extensions: curl, intl, pdo, pdo_pgsql XDEBUG_MODE: coverage, develop - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: - - ubuntu-latest - php: - 7.4 - 8.0 @@ -68,15 +65,9 @@ jobs: run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - name: Run Pgsql tests with PHPUnit and generate coverage. - if: matrix.php == '7.4' run: vendor/bin/phpunit --group pgsql --coverage-clover=coverage.xml --colors=always - - name: Run Pgsql tests with PHPUnit. - if: matrix.php > '7.4' - run: vendor/bin/phpunit --group pgsql --colors=always - - name: Upload coverage to Codecov. - if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index 707ecb1b9aa..949fb0d6aae 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -20,9 +20,6 @@ jobs: strategy: matrix: - os: - - ubuntu-latest - php: - 7.4 - 8.0 @@ -50,15 +47,9 @@ jobs: run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - name: Run SQLite tests with PHPUnit and generate coverage. - if: matrix.php == '7.4' run: vendor/bin/phpunit --group sqlite --coverage-clover=coverage.xml --colors=always - - name: Run SQLite tests with PHPUnit. - if: matrix.php > '7.4' - run: vendor/bin/phpunit --group sqlite --colors=always - - name: Upload coverage to Codecov. - if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/composer.json b/composer.json index 937900a8004..c80f2ac7f15 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "yiisoft/yii2": "self.version" }, "require": { - "php": ">=5.4.0", + "php": ">=7.3.0", "ext-mbstring": "*", "ext-ctype": "*", "lib-pcre": "*", @@ -82,11 +82,10 @@ "paragonie/random_compat": ">=1" }, "require-dev": { - "cweagans/composer-patches": "^1.7", - "phpunit/phpunit": "4.8.34", "cebe/indent": "~1.0.2", - "johnkary/phpunit-speedtrap": "^1.0", "dealerdirect/phpcodesniffer-composer-installer": "*", + "dms/phpunit-arraysubset-asserts": "^0.5", + "phpunit/phpunit": "9.6", "yiisoft/yii2-coding-standards": "^3.0" }, "repositories": [ @@ -122,20 +121,6 @@ "extra": { "branch-alias": { "dev-master": "2.0.x-dev" - }, - "composer-exit-on-patch-failure": true, - "patches": { - "phpunit/phpunit-mock-objects": { - "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" - }, - "phpunit/php-file-iterator": { - "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch" - }, - "phpunit/phpunit": { - "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", - "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", - "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" - } } } } diff --git a/composer.lock b/composer.lock index 0b04891c850..e6caf6b55be 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7f989051117a0e72e6e59f7e1e568220", + "content-hash": "fe4cba7b97bdf43a740c7f6f9d224ae8", "packages": [ { "name": "bower-asset/inputmask", @@ -371,54 +371,6 @@ }, "time": "2014-05-23T14:40:08+00:00" }, - { - "name": "cweagans/composer-patches", - "version": "1.7.3", - "source": { - "type": "git", - "url": "https://github.com/cweagans/composer-patches.git", - "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db", - "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3.0" - }, - "require-dev": { - "composer/composer": "~1.0 || ~2.0", - "phpunit/phpunit": "~4.6" - }, - "type": "composer-plugin", - "extra": { - "class": "cweagans\\Composer\\Patches" - }, - "autoload": { - "psr-4": { - "cweagans\\Composer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Cameron Eagans", - "email": "me@cweagans.net" - } - ], - "description": "Provides a way to patch Composer packages.", - "support": { - "issues": "https://github.com/cweagans/composer-patches/issues", - "source": "https://github.com/cweagans/composer-patches/tree/1.7.3" - }, - "time": "2022-12-20T22:53:13+00:00" - }, { "name": "dealerdirect/phpcodesniffer-composer-installer", "version": "v1.0.0", @@ -497,32 +449,76 @@ }, "time": "2023-01-05T11:28:13+00:00" }, + { + "name": "dms/phpunit-arraysubset-asserts", + "version": "v0.5.0", + "source": { + "type": "git", + "url": "https://github.com/rdohms/phpunit-arraysubset-asserts.git", + "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rdohms/phpunit-arraysubset-asserts/zipball/aa6b9e858414e91cca361cac3b2035ee57d212e0", + "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0" + }, + "require-dev": { + "dms/coding-standard": "^9" + }, + "type": "library", + "autoload": { + "files": [ + "assertarraysubset-autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rafael Dohms", + "email": "rdohms@gmail.com" + } + ], + "description": "This package provides ArraySubset and related asserts once deprecated in PHPUnit 8", + "support": { + "issues": "https://github.com/rdohms/phpunit-arraysubset-asserts/issues", + "source": "https://github.com/rdohms/phpunit-arraysubset-asserts/tree/v0.5.0" + }, + "time": "2023-06-02T17:33:53+00:00" + }, { "name": "doctrine/instantiator", - "version": "1.5.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -549,7 +545,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -565,212 +561,283 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { - "name": "johnkary/phpunit-speedtrap", - "version": "v1.1.0", + "name": "myclabs/deep-copy", + "version": "1.11.1", "source": { "type": "git", - "url": "https://github.com/johnkary/phpunit-speedtrap.git", - "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", - "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { - "php": ">=5.6", - "phpunit/phpunit": ">=4.7,<6.0" + "php": "^7.1 || ^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, + "type": "library", "autoload": { - "psr-0": { - "JohnKary": "src/" + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "John Kary", - "email": "john@johnkary.net" - } - ], - "description": "Find slow tests in your PHPUnit test suite", - "homepage": "https://github.com/johnkary/phpunit-speedtrap", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "phpunit", - "profile", - "slow" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "issues": "https://github.com/johnkary/phpunit-speedtrap/issues", - "source": "https://github.com/johnkary/phpunit-speedtrap/tree/1.1" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, - "time": "2017-03-25T17:14:26+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.5", + "name": "nikic/php-parser", + "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { - "php": ">=5.3.3" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "5.0-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] + "psr-4": { + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "name": "Nikita Popov" } ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/2.x" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2016-01-25T08:17:30+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { - "name": "phpspec/prophecy", - "version": "v1.5.0", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/master" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2015-08-13T10:07:40+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "2.2.4", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -785,7 +852,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -797,33 +864,42 @@ "xunit" ], "support": { - "irc": "irc://irc.freenode.net/phpunit", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/2.2" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, - "time": "2015-10-06T15:47:00+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -838,7 +914,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -849,30 +925,47 @@ "iterator" ], "support": { - "irc": "irc://irc.freenode.net/phpunit", "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, - "time": "2017-11-27T13:52:08+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -889,38 +982,49 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "1.0.8", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4|~5" + "phpunit/phpunit": "^9.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -933,47 +1037,51 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, - "time": "2016-05-12T18:03:57+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "1.4.12", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -988,58 +1096,73 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/1.4" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, - "abandoned": true, - "time": "2017-12-04T08:55:13+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "4.8.34", + "version": "9.6.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca" + "reference": "70fc8be1d0b9fad56a199a4df5f9cfabfc246f84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7eb45205d27edd94bd2b3614085ea158bd1e2bca", - "reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/70fc8be1d0b9fad56a199a4df5f9cfabfc246f84", + "reference": "70fc8be1d0b9fad56a199a4df5f9cfabfc246f84", "shasum": "" }, "require": { + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.2.2", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" }, "suggest": { - "phpunit/php-invoker": "~1.1" + "ext-soap": "*", + "ext-xdebug": "*" }, "bin": [ "phpunit" @@ -1047,10 +1170,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.8.x-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -1075,40 +1201,48 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/4.8.34" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.0" }, - "time": "2017-01-26T16:15:36+00:00" + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-02-03T07:32:24+00:00" }, { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", + "name": "sebastian/cli-parser", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -1123,50 +1257,161 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", - "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/2.3" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, - "abandoned": true, - "time": "2015-10-02T06:51:40+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" }, { - "name": "sebastian/comparator", - "version": "1.2.4", + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1179,6 +1424,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -1190,14 +1439,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", @@ -1205,34 +1450,98 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, - "time": "2017-01-29T09:50:25+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "1.4.1", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1245,50 +1554,62 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, - "time": "2015-12-08T07:14:41+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "1.3.7", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -1315,36 +1636,42 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/1.3.7" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, - "time": "2016-05-17T03:18:57+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "1.2.2", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1357,6 +1684,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -1365,50 +1696,55 @@ "name": "Volker Dusch", "email": "github@wallbash.com" }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Adam Harvey", "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/master" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, - "time": "2016-06-17T09:04:28+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "1.1.1", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "ext-dom": "*", + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -1416,7 +1752,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1441,34 +1777,209 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] }, - "time": "2015-10-12T03:26:01+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "1.0.5", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1481,42 +1992,166 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, - "time": "2016-10-03T07:41:43+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "1.0.6", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, + "require": { + "php": ">=7.3" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1537,9 +2172,15 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/1.0.6" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2015-06-21T13:59:46+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -1622,154 +2263,54 @@ "time": "2024-02-16T15:06:51+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "name": "theseer/tokenizer", + "version": "1.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/theseer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "yiisoft/yii2-coding-standards", @@ -1866,7 +2407,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=5.4.0", + "php": ">=7.3.0", "ext-mbstring": "*", "ext-ctype": "*", "lib-pcre": "*" diff --git a/framework/base/Object.php b/framework/base/Object.php deleted file mode 100644 index 1ac1fefa6ae..00000000000 --- a/framework/base/Object.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @since 2.0 - * @deprecated since 2.0.13, the class name `Object` is invalid since PHP 7.2, use [[BaseObject]] instead. - * @see https://wiki.php.net/rfc/object-typehint - * @see https://github.com/yiisoft/yii2/issues/7936#issuecomment-315384669 - */ -class Object extends BaseObject -{ -} diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 2b9f7c6df55..9347786ca23 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,30 +1,35 @@ - - - - ./tests - - - - - framework/ - - - framework/i18n/GettextFile.php - framework/web/ResponseFormatterInterface.php - framework/.phpstorm.meta.php - framework/base - framework/bootstrap - - - - - + + + + ./tests + + + + + + framework/ + + + framework/.phpstorm.meta.php + framework/i18n/GettextFile.php + framework/web/ResponseFormatterInterface.php + framework/bootstrap + framework/base + framework/requirements + + diff --git a/tests/IsOneOfAssert.php b/tests/IsOneOfAssert.php index 5c630b7d041..8e25a0d7349 100644 --- a/tests/IsOneOfAssert.php +++ b/tests/IsOneOfAssert.php @@ -14,38 +14,34 @@ */ class IsOneOfAssert extends \PHPUnit\Framework\Constraint\Constraint { - private $allowedValues; - /** - * IsOneOfAssert constructor. - * @param array $allowedValues + * @var array the expected values */ - public function __construct(array $allowedValues) + private $allowedValues = []; + + public function __construct($allowedValues) { - parent::__construct(); $this->allowedValues = $allowedValues; } - /** * Returns a string representation of the object. - * - * @return string */ - public function toString() + public function toString(): string { - $allowedValues = array_map(function ($value) { - return VarDumper::dumpAsString($value); - }, $this->allowedValues); + $allowedValues = []; + + foreach ($this->allowedValues as $value) { + $this->allowedValues[] = VarDumper::dumpAsString($value); + } + $expectedAsString = implode(', ', $allowedValues); + return "is one of $expectedAsString"; } - /** - * {@inheritdoc} - */ - protected function matches($other) + protected function matches($other): bool { - return in_array($other, $this->allowedValues, false); + return in_array($other, $this->allowedValues); } } diff --git a/tests/ResultPrinter.php b/tests/ResultPrinter.php index 89299f0557c..6a6fca92dcc 100644 --- a/tests/ResultPrinter.php +++ b/tests/ResultPrinter.php @@ -12,12 +12,18 @@ * to change default output to STDOUT and prevent some tests from fail when * they can not be executed after headers have been sent. */ -class ResultPrinter extends \PHPUnit\TextUI\ResultPrinter +class ResultPrinter extends \PHPUnit\TextUI\DefaultResultPrinter { + private $out = null; + + /** + * @param null|resource|string $out + * @param int|string $numberOfColumns + */ public function __construct( $out = null, $verbose = false, - $colors = \PHPUnit\TextUI\ResultPrinter::COLOR_DEFAULT, + $colors = \PHPUnit\TextUI\DefaultResultPrinter::COLOR_DEFAULT, $debug = false, $numberOfColumns = 80, $reverse = false @@ -29,7 +35,7 @@ public function __construct( parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse); } - public function flush() + public function flush(): void { if ($this->out !== STDOUT) { parent::flush(); diff --git a/tests/TestCase.php b/tests/TestCase.php index 5a8287f1f55..192a3ccb2a7 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -20,7 +20,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase /** * Clean up after test case. */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { parent::tearDownAfterClass(); $logger = Yii::getLogger(); @@ -46,7 +46,7 @@ public static function getParam($name, $default = null) * Clean up after test. * By default the application created with [[mockApplication]] will be destroyed. */ - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); $this->destroyApplication(); @@ -168,7 +168,7 @@ protected function assertContainsWithoutLE($needle, $haystack, $message = '') $needle = str_replace("\r\n", "\n", $needle); $haystack = str_replace("\r\n", "\n", $haystack); - $this->assertContains($needle, $haystack, $message); + $this->assertStringContainsString($needle, $haystack, $message); } /** diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 44714ab28da..35a3b1e4a90 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -28,5 +28,4 @@ Yii::setAlias('@runtime', getenv('TEST_RUNTIME_PATH')); } -require_once __DIR__ . '/compatibility.php'; require_once __DIR__ . '/TestCase.php'; diff --git a/tests/compatibility.php b/tests/compatibility.php deleted file mode 100644 index 5a14c6e36e2..00000000000 --- a/tests/compatibility.php +++ /dev/null @@ -1,75 +0,0 @@ -setExpectedException($exception); - } - - /** - * @param string $message - */ - public function expectExceptionMessage($message) - { - $parentClassMethods = get_class_methods('PHPUnit_Framework_TestCase'); - if (in_array('expectExceptionMessage', $parentClassMethods)) { - parent::expectExceptionMessage($message); - return; - } - $this->setExpectedException($this->getExpectedException(), $message); - } - - /** - * @param string $messageRegExp - */ - public function expectExceptionMessageRegExp($messageRegExp) - { - $parentClassMethods = get_class_methods('PHPUnit_Framework_TestCase'); - if (in_array('expectExceptionMessageRegExp', $parentClassMethods)) { - parent::expectExceptionMessageRegExp($messageRegExp); - return; - } - $this->setExpectedExceptionRegExp($this->getExpectedException(), $messageRegExp); - } - } - } -} diff --git a/tests/data/validators/models/ValidatorTestTypedPropModel.php b/tests/data/validators/models/ValidatorTestTypedPropModel.php index fa838e183d8..5c676911924 100644 --- a/tests/data/validators/models/ValidatorTestTypedPropModel.php +++ b/tests/data/validators/models/ValidatorTestTypedPropModel.php @@ -11,5 +11,8 @@ class ValidatorTestTypedPropModel extends Model { - public array $arrayTypedProperty = [true, false]; + /** + * @var array + */ + public $arrayTypedProperty = [true, false]; } diff --git a/tests/framework/BaseYiiTest.php b/tests/framework/BaseYiiTest.php index 4e17fff0668..b0c99e9787d 100644 --- a/tests/framework/BaseYiiTest.php +++ b/tests/framework/BaseYiiTest.php @@ -26,13 +26,13 @@ class BaseYiiTest extends TestCase { public $aliases; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->aliases = Yii::$aliases; } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Yii::$aliases = $this->aliases; @@ -72,7 +72,7 @@ public function testGetVersion() public function testPowered() { - $this->assertInternalType('string', Yii::powered()); + $this->assertIsString(Yii::powered()); } public function testCreateObjectArray() diff --git a/tests/framework/ChangeLogTest.php b/tests/framework/ChangeLogTest.php index eef6cae4585..0dd72530b58 100644 --- a/tests/framework/ChangeLogTest.php +++ b/tests/framework/ChangeLogTest.php @@ -54,6 +54,9 @@ public function testContributorLine($line) * - Description ends without a "." * - Line ends with contributor name between "(" and ")". */ - $this->assertRegExp('/- (Bug|Enh|Chg|New)( #\d+(, #\d+)*)?(\s\(CVE-[\d-]+\))?: .*[^.] \(.+\)$/', $line); + $this->assertMatchesRegularExpression( + '/- (Bug|Enh|Chg|New)( #\d+(, #\d+)*)?(\s\(CVE-[\d-]+\))?: .*[^.] \(.+\)$/', + $line + ); } } diff --git a/tests/framework/base/ActionFilterTest.php b/tests/framework/base/ActionFilterTest.php index 7a527beb77b..17419d16cb5 100644 --- a/tests/framework/base/ActionFilterTest.php +++ b/tests/framework/base/ActionFilterTest.php @@ -19,7 +19,7 @@ */ class ActionFilterTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/base/BaseObjectTest.php b/tests/framework/base/BaseObjectTest.php index 98280fef25e..79e7c07a31a 100644 --- a/tests/framework/base/BaseObjectTest.php +++ b/tests/framework/base/BaseObjectTest.php @@ -20,14 +20,14 @@ class BaseObjectTest extends TestCase */ protected $object; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); $this->object = new NewObject(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); $this->object = null; @@ -159,19 +159,6 @@ public function testReadingWriteOnlyProperty() $this->expectExceptionMessage('Getting write-only property: yiiunit\framework\base\NewObject::writeOnly'); $this->object->writeOnly; } - - public function testBackwardCompatibilityWithObject() - { - if (PHP_MAJOR_VERSION > 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION >= 2)) { - $this->markTestSkipped('This test is meant to run on PHP <7.2.0 to check BC with yii\base\Object'); - } - $this->assertInstanceOf('yii\base\Object', new BCObject()); - $this->assertInstanceOf('yii\base\BaseObject', new BCObject()); - - BCObject::$initCalled = false; - new BCObject(); - $this->assertTrue(BCObject::$initCalled); - } } diff --git a/tests/framework/base/BehaviorTest.php b/tests/framework/base/BehaviorTest.php index b77a074d4be..47ecbf9e0fc 100644 --- a/tests/framework/base/BehaviorTest.php +++ b/tests/framework/base/BehaviorTest.php @@ -73,13 +73,13 @@ public function detach() */ class BehaviorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); gc_enable(); diff --git a/tests/framework/base/ComponentTest.php b/tests/framework/base/ComponentTest.php index e2fdbc6e02b..f01d21476f3 100644 --- a/tests/framework/base/ComponentTest.php +++ b/tests/framework/base/ComponentTest.php @@ -33,14 +33,14 @@ class ComponentTest extends TestCase */ protected $component; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); $this->component = new NewComponent(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); $this->component = null; @@ -451,11 +451,6 @@ public function testDetachNotAttachedHandler() */ public function testEventClosureDetachesItself() { - if (PHP_VERSION_ID < 70000) { - $this->markTestSkipped('Can not be tested on PHP < 7.0'); - return; - } - $obj = require __DIR__ . '/stub/AnonymousComponentClass.php'; $obj->trigger('barEventOnce'); diff --git a/tests/framework/base/DynamicModelTest.php b/tests/framework/base/DynamicModelTest.php index d3dca504b6f..6b368f08cd2 100644 --- a/tests/framework/base/DynamicModelTest.php +++ b/tests/framework/base/DynamicModelTest.php @@ -15,7 +15,7 @@ */ class DynamicModelTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/base/EventTest.php b/tests/framework/base/EventTest.php index f99d12bedb7..ab616d1572a 100644 --- a/tests/framework/base/EventTest.php +++ b/tests/framework/base/EventTest.php @@ -18,13 +18,13 @@ class EventTest extends TestCase { public $counter; - protected function setUp() + protected function setUp(): void { $this->counter = 0; Event::offAll(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Event::offAll(); diff --git a/tests/framework/base/ModelTest.php b/tests/framework/base/ModelTest.php index 5ed73163b8d..991ed08c0b0 100644 --- a/tests/framework/base/ModelTest.php +++ b/tests/framework/base/ModelTest.php @@ -20,7 +20,7 @@ */ class ModelTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -502,11 +502,6 @@ public function testValidateAttributeNames() public function testFormNameWithAnonymousClass() { - if (PHP_VERSION_ID < 70000) { - $this->markTestSkipped('Can not be tested on PHP < 7.0'); - return; - } - $model = require __DIR__ . '/stub/AnonymousModelClass.php'; $this->expectException('yii\base\InvalidConfigException'); diff --git a/tests/framework/base/ModuleTest.php b/tests/framework/base/ModuleTest.php index bbe36311279..333180924e0 100644 --- a/tests/framework/base/ModuleTest.php +++ b/tests/framework/base/ModuleTest.php @@ -18,7 +18,7 @@ */ class ModuleTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/base/SecurityTest.php b/tests/framework/base/SecurityTest.php index d50fc0ab44d..0f1c6ab8394 100644 --- a/tests/framework/base/SecurityTest.php +++ b/tests/framework/base/SecurityTest.php @@ -22,7 +22,7 @@ class SecurityTest extends TestCase */ protected $security; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->security = new ExposedSecurity(); @@ -813,12 +813,14 @@ public function randomKeyInvalidInputs() /** * @dataProvider randomKeyInvalidInputs - * @expectedException \yii\base\InvalidParamException - * @param mixed $input + * + * @param int|string|array $input */ public function testRandomKeyInvalidInput($input) { - $key1 = $this->security->generateRandomKey($input); + $this->expectException(\yii\base\InvalidArgumentException::class); + + $this->security->generateRandomKey($input); } public function testGenerateRandomKey() @@ -826,10 +828,10 @@ public function testGenerateRandomKey() // test various string lengths for ($length = 1; $length < 64; $length++) { $key1 = $this->security->generateRandomKey($length); - $this->assertInternalType('string', $key1); + $this->assertIsString($key1); $this->assertEquals($length, strlen($key1)); $key2 = $this->security->generateRandomKey($length); - $this->assertInternalType('string', $key2); + $this->assertIsString($key2); $this->assertEquals($length, strlen($key2)); if ($length >= 7) { // avoid random test failure, short strings are likely to collide $this->assertNotEquals($key1, $key2); @@ -839,10 +841,10 @@ public function testGenerateRandomKey() // test for /dev/urandom, reading larger data to see if loop works properly $length = 1024 * 1024; $key1 = $this->security->generateRandomKey($length); - $this->assertInternalType('string', $key1); + $this->assertIsString($key1); $this->assertEquals($length, strlen($key1)); $key2 = $this->security->generateRandomKey($length); - $this->assertInternalType('string', $key2); + $this->assertIsString($key2); $this->assertEquals($length, strlen($key2)); $this->assertNotEquals($key1, $key2); } @@ -1103,11 +1105,11 @@ public function testUnMaskingInvalidStrings() $this->assertEquals('', $this->security->unmaskToken('1')); } - /** - * @expectedException \yii\base\InvalidParamException - */ public function testMaskingInvalidStrings() { + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('First parameter ($length) must be greater than 0'); + $this->security->maskToken(''); } diff --git a/tests/framework/base/ThemeTest.php b/tests/framework/base/ThemeTest.php index 145380f3a7b..7b6ef72680e 100644 --- a/tests/framework/base/ThemeTest.php +++ b/tests/framework/base/ThemeTest.php @@ -16,7 +16,7 @@ */ class ThemeTest extends TestCase { - protected function setUp() + protected function setUp(): void { $config = ['aliases' => ['@web' => '']]; $this->mockWebApplication($config); diff --git a/tests/framework/base/ViewTest.php b/tests/framework/base/ViewTest.php index f568a5a7145..621c15fb156 100644 --- a/tests/framework/base/ViewTest.php +++ b/tests/framework/base/ViewTest.php @@ -24,7 +24,7 @@ class ViewTest extends TestCase */ protected $testViewPath = ''; - public function setUp() + protected function setUp(): void { parent::setUp(); @@ -33,7 +33,7 @@ public function setUp() FileHelper::createDirectory($this->testViewPath); } - public function tearDown() + protected function tearDown(): void { FileHelper::removeDirectory($this->testViewPath); parent::tearDown(); diff --git a/tests/framework/base/WidgetTest.php b/tests/framework/base/WidgetTest.php index 9517fed7e5b..067e9480125 100644 --- a/tests/framework/base/WidgetTest.php +++ b/tests/framework/base/WidgetTest.php @@ -21,7 +21,7 @@ class WidgetTest extends TestCase /** * {@inheritdoc} */ - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Widget::$counter = 0; diff --git a/tests/framework/behaviors/AttributeBehaviorTest.php b/tests/framework/behaviors/AttributeBehaviorTest.php index 3159603bac9..0c4fa2edb9f 100644 --- a/tests/framework/behaviors/AttributeBehaviorTest.php +++ b/tests/framework/behaviors/AttributeBehaviorTest.php @@ -26,14 +26,14 @@ class AttributeBehaviorTest extends TestCase */ protected $dbConnection; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -52,7 +52,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_attribute', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/behaviors/AttributeTypecastBehaviorTest.php b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php index a43b9346bbe..5af290672e1 100644 --- a/tests/framework/behaviors/AttributeTypecastBehaviorTest.php +++ b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php @@ -22,14 +22,14 @@ */ class AttributeTypecastBehaviorTest extends TestCase { - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - protected function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -51,7 +51,7 @@ protected function setUp() Yii::$app->getDb()->createCommand()->createTable('test_attribute_typecast', $columns)->execute(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); AttributeTypecastBehavior::clearAutoDetectedAttributeTypes(); diff --git a/tests/framework/behaviors/AttributesBehaviorTest.php b/tests/framework/behaviors/AttributesBehaviorTest.php index d26ddbc8b48..31dc224d997 100644 --- a/tests/framework/behaviors/AttributesBehaviorTest.php +++ b/tests/framework/behaviors/AttributesBehaviorTest.php @@ -26,14 +26,14 @@ class AttributesBehaviorTest extends TestCase */ protected $dbConnection; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -52,7 +52,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_attribute', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/behaviors/BlameableBehaviorConsoleTest.php b/tests/framework/behaviors/BlameableBehaviorConsoleTest.php index 4a220125521..389be398a88 100755 --- a/tests/framework/behaviors/BlameableBehaviorConsoleTest.php +++ b/tests/framework/behaviors/BlameableBehaviorConsoleTest.php @@ -21,14 +21,14 @@ */ class BlameableBehaviorConsoleTest extends TestCase { - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -47,7 +47,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_blame', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/behaviors/BlameableBehaviorTest.php b/tests/framework/behaviors/BlameableBehaviorTest.php index b9e1a86b081..b6254d6fd61 100644 --- a/tests/framework/behaviors/BlameableBehaviorTest.php +++ b/tests/framework/behaviors/BlameableBehaviorTest.php @@ -21,14 +21,14 @@ */ class BlameableBehaviorTest extends TestCase { - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -52,7 +52,7 @@ public function setUp() $this->getUser()->login(10); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/behaviors/CacheableWidgetBehaviorTest.php b/tests/framework/behaviors/CacheableWidgetBehaviorTest.php index fdcf5e0d3cd..9ff9d0826f5 100644 --- a/tests/framework/behaviors/CacheableWidgetBehaviorTest.php +++ b/tests/framework/behaviors/CacheableWidgetBehaviorTest.php @@ -32,7 +32,7 @@ class CacheableWidgetBehaviorTest extends TestCase /** * {@inheritdoc} */ - protected function setUp() + protected function setUp(): void { $this->initializeApplicationMock(); $this->initializeWidgetMocks(); diff --git a/tests/framework/behaviors/OptimisticLockBehaviorTest.php b/tests/framework/behaviors/OptimisticLockBehaviorTest.php index fe041eab9af..098b810ddde 100644 --- a/tests/framework/behaviors/OptimisticLockBehaviorTest.php +++ b/tests/framework/behaviors/OptimisticLockBehaviorTest.php @@ -29,14 +29,14 @@ class OptimisticLockBehaviorTest extends TestCase */ protected $dbConnection; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -60,7 +60,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_auto_lock_version_string', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); @@ -152,7 +152,7 @@ public function testUpdateRecord() try { $model->save(false); } catch (\yii\db\StaleObjectException $e) { - $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage()); $thrown = true; } @@ -168,7 +168,7 @@ public function testUpdateRecord() try { $model->save(false); } catch (\yii\db\StaleObjectException $e) { - $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage()); $thrown = true; } @@ -184,7 +184,7 @@ public function testUpdateRecord() try { $model->save(false); } catch (\yii\db\StaleObjectException $e) { - $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage()); $thrown = true; } @@ -233,7 +233,7 @@ public function testDeleteRecord() try { $model->delete(); } catch (\yii\db\StaleObjectException $e) { - $this->assertContains('The object being deleted is outdated.', $e->getMessage()); + $this->assertStringContainsString('The object being deleted is outdated.', $e->getMessage()); $thrown = true; } @@ -249,7 +249,7 @@ public function testDeleteRecord() try { $model->delete(); } catch (\yii\db\StaleObjectException $e) { - $this->assertContains('The object being deleted is outdated.', $e->getMessage()); + $this->assertStringContainsString('The object being deleted is outdated.', $e->getMessage()); $thrown = true; } diff --git a/tests/framework/behaviors/SluggableBehaviorTest.php b/tests/framework/behaviors/SluggableBehaviorTest.php index cf9e9ceddda..ad1444c4470 100644 --- a/tests/framework/behaviors/SluggableBehaviorTest.php +++ b/tests/framework/behaviors/SluggableBehaviorTest.php @@ -26,14 +26,14 @@ class SluggableBehaviorTest extends TestCase */ protected $dbConnection; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -60,7 +60,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_slug_related', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/behaviors/TimestampBehaviorTest.php b/tests/framework/behaviors/TimestampBehaviorTest.php index 22365f17993..8a64fcb90f4 100644 --- a/tests/framework/behaviors/TimestampBehaviorTest.php +++ b/tests/framework/behaviors/TimestampBehaviorTest.php @@ -28,14 +28,14 @@ class TimestampBehaviorTest extends TestCase */ protected $dbConnection; - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) { static::markTestSkipped('PDO and SQLite extensions are required.'); } } - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -61,7 +61,7 @@ public function setUp() Yii::$app->getDb()->createCommand()->createTable('test_auto_timestamp_string', $columns)->execute(); } - public function tearDown() + protected function tearDown(): void { Yii::$app->getDb()->close(); parent::tearDown(); diff --git a/tests/framework/caching/CacheTestCase.php b/tests/framework/caching/CacheTestCase.php index 7eb00321a35..fc98fb57e04 100644 --- a/tests/framework/caching/CacheTestCase.php +++ b/tests/framework/caching/CacheTestCase.php @@ -54,13 +54,13 @@ abstract class CacheTestCase extends TestCase */ abstract protected function getCacheInstance(); - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); } - protected function tearDown() + protected function tearDown(): void { static::$time = null; static::$microtime = null; diff --git a/tests/framework/caching/DbCacheTest.php b/tests/framework/caching/DbCacheTest.php index b18b30e2bcd..21d2723cb62 100644 --- a/tests/framework/caching/DbCacheTest.php +++ b/tests/framework/caching/DbCacheTest.php @@ -19,7 +19,7 @@ class DbCacheTest extends CacheTestCase private $_cacheInstance; private $_connection; - protected function setUp() + protected function setUp(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) { $this->markTestSkipped('pdo and pdo_mysql extensions are required.'); diff --git a/tests/framework/caching/DbDependencyTest.php b/tests/framework/caching/DbDependencyTest.php index bb723be3a49..a87a87e8542 100644 --- a/tests/framework/caching/DbDependencyTest.php +++ b/tests/framework/caching/DbDependencyTest.php @@ -24,7 +24,7 @@ class DbDependencyTest extends DatabaseTestCase /** * {@inheritdoc} */ - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/caching/DbQueryDependencyTest.php b/tests/framework/caching/DbQueryDependencyTest.php index f8a50183dcd..679fc9eb63a 100644 --- a/tests/framework/caching/DbQueryDependencyTest.php +++ b/tests/framework/caching/DbQueryDependencyTest.php @@ -23,7 +23,7 @@ class DbQueryDependencyTest extends DatabaseTestCase /** * {@inheritdoc} */ - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/caching/FileCacheTest.php b/tests/framework/caching/FileCacheTest.php index c9f6ee8f51f..aa12bf9cc13 100644 --- a/tests/framework/caching/FileCacheTest.php +++ b/tests/framework/caching/FileCacheTest.php @@ -77,44 +77,9 @@ public function testKeyPrefix() $cacheFile = $refMethodGetCacheFile->invoke($cache, $normalizeKey); $this->assertTrue($refMethodSet->invoke($cache, $key, $value)); - $this->assertContains($keyPrefix, basename($cacheFile)); + $this->assertStringContainsString($keyPrefix, basename($cacheFile)); $this->assertEquals($expectedDirectoryName, basename(dirname($cacheFile)), $cacheFile); $this->assertTrue(is_dir(dirname($cacheFile)), 'File not found ' . $cacheFile); $this->assertEquals($value, $refMethodGet->invoke($cache, $key)); } - - public function testCacheRenewalOnDifferentOwnership() - { - $TRAVIS_SECOND_USER = getenv('TRAVIS_SECOND_USER'); - if (empty($TRAVIS_SECOND_USER)) { - $this->markTestSkipped('Travis second user not found'); - } - - $cache = $this->getCacheInstance(); - - $cacheValue = uniqid('value_'); - $cachePublicKey = uniqid('key_'); - $cacheInternalKey = $cache->buildKey($cachePublicKey); - - static::$time = \time(); - $this->assertTrue($cache->set($cachePublicKey, $cacheValue, 2)); - $this->assertSame($cacheValue, $cache->get($cachePublicKey)); - - $refClass = new \ReflectionClass($cache); - $refMethodGetCacheFile = $refClass->getMethod('getCacheFile'); - $refMethodGetCacheFile->setAccessible(true); - $cacheFile = $refMethodGetCacheFile->invoke($cache, $cacheInternalKey); - $refMethodGetCacheFile->setAccessible(false); - - $output = array(); - $returnVar = null; - exec(sprintf('sudo chown %s %s', - escapeshellarg($TRAVIS_SECOND_USER), - escapeshellarg($cacheFile) - ), $output, $returnVar); - - $this->assertSame(0, $returnVar, 'Cannot change ownership of cache file to test cache renewal'); - - $this->assertTrue($cache->set($cachePublicKey, uniqid('value_2_'), 2), 'Cannot rebuild cache on different file ownership'); - } } diff --git a/tests/framework/caching/MssqlCacheTest.php b/tests/framework/caching/MssqlCacheTest.php index 324f1fcc036..2efc8bf5d6a 100644 --- a/tests/framework/caching/MssqlCacheTest.php +++ b/tests/framework/caching/MssqlCacheTest.php @@ -21,7 +21,7 @@ class MssqlCacheTest extends CacheTestCase private $_cacheInstance; private $_connection; - protected function setUp() + protected function setUp(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlsrv')) { $this->markTestSkipped('pdo and pdo_mssql extensions are required.'); diff --git a/tests/framework/caching/PgSQLCacheTest.php b/tests/framework/caching/PgSQLCacheTest.php index 76a4c6cc6b5..45478537c43 100644 --- a/tests/framework/caching/PgSQLCacheTest.php +++ b/tests/framework/caching/PgSQLCacheTest.php @@ -20,7 +20,7 @@ class PgSQLCacheTest extends DbCacheTest protected static $driverName = 'pgsql'; private $_connection; - protected function setUp() + protected function setUp(): void { if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) { $this->markTestSkipped('pdo and pdo_pgsql extensions are required.'); diff --git a/tests/framework/console/ControllerTest.php b/tests/framework/console/ControllerTest.php index a38cb7ea372..2103715b51c 100644 --- a/tests/framework/console/ControllerTest.php +++ b/tests/framework/console/ControllerTest.php @@ -26,7 +26,7 @@ class ControllerTest extends TestCase /** @var FakeController */ private $controller; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -101,11 +101,6 @@ public function testBindActionParams() public function testNullableInjectedActionParams() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } - // Use the PHP71 controller for this test $this->controller = new FakePhp71Controller('fake', new Application([ 'id' => 'app', @@ -122,10 +117,6 @@ public function testNullableInjectedActionParams() public function testInjectionContainerException() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } // Use the PHP71 controller for this test $this->controller = new FakePhp71Controller('fake', new Application([ 'id' => 'app', @@ -144,10 +135,6 @@ public function testInjectionContainerException() public function testUnknownInjection() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } // Use the PHP71 controller for this test $this->controller = new FakePhp71Controller('fake', new Application([ 'id' => 'app', @@ -165,10 +152,6 @@ public function testUnknownInjection() public function testInjectedActionParams() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } // Use the PHP71 controller for this test $this->controller = new FakePhp71Controller('fake', new Application([ 'id' => 'app', @@ -193,10 +176,6 @@ public function testInjectedActionParams() public function testInjectedActionParamsFromModule() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } $module = new \yii\base\Module('fake', new Application([ 'id' => 'app', 'basePath' => __DIR__, @@ -270,7 +249,7 @@ public function testHelpOption() $helpController = new FakeHelpControllerWithoutOutput('help', Yii::$app); $helpController->actionIndex('fake/aksi1'); - $this->assertContains('--test-array, -ta', $helpController->outputString); + $this->assertStringContainsString('--test-array, -ta', $helpController->outputString); } /** diff --git a/tests/framework/console/UnknownCommandExceptionTest.php b/tests/framework/console/UnknownCommandExceptionTest.php index 63dd11ccd97..e72526fdf03 100644 --- a/tests/framework/console/UnknownCommandExceptionTest.php +++ b/tests/framework/console/UnknownCommandExceptionTest.php @@ -16,7 +16,7 @@ */ class UnknownCommandExceptionTest extends TestCase { - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'enableCoreCommands' => false, diff --git a/tests/framework/console/controllers/AssetControllerTest.php b/tests/framework/console/controllers/AssetControllerTest.php index f9fe4be33c2..768829ef83f 100644 --- a/tests/framework/console/controllers/AssetControllerTest.php +++ b/tests/framework/console/controllers/AssetControllerTest.php @@ -32,7 +32,7 @@ class AssetControllerTest extends TestCase */ protected $testAssetsBasePath = ''; - public function setUp() + protected function setUp(): void { $this->mockApplication(); $this->testFilePath = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . str_replace('\\', '_', get_class($this)) . uniqid(); @@ -41,7 +41,7 @@ public function setUp() $this->createDir($this->testAssetsBasePath); } - public function tearDown() + protected function tearDown(): void { $this->removeDir($this->testFilePath); } @@ -258,7 +258,7 @@ public function testActionTemplate() $this->runAssetControllerAction('template', [$configFileName]); $this->assertFileExists($configFileName, 'Unable to create config file template!'); $config = require $configFileName; - $this->assertInternalType('array', $config, 'Invalid config created!'); + $this->assertIsArray($config, 'Invalid config created!'); } public function testActionCompress() @@ -304,7 +304,7 @@ public function testActionCompress() // Then : $this->assertFileExists($bundleFile, 'Unable to create output bundle file!'); $compressedBundleConfig = require $bundleFile; - $this->assertInternalType('array', $compressedBundleConfig, 'Output bundle file has incorrect format!'); + $this->assertIsArray($compressedBundleConfig, 'Output bundle file has incorrect format!'); $this->assertCount(2, $compressedBundleConfig, 'Output bundle config contains wrong bundle count!'); $this->assertArrayHasKey($assetBundleClassName, $compressedBundleConfig, 'Source bundle is lost!'); @@ -320,11 +320,19 @@ public function testActionCompress() $compressedCssFileContent = file_get_contents($compressedCssFileName); foreach ($cssFiles as $name => $content) { - $this->assertContains($content, $compressedCssFileContent, "Source of '{$name}' is missing in combined file!"); + $this->assertStringContainsString( + $content, + $compressedCssFileContent, + "Source of '{$name}' is missing in combined file!", + ); } $compressedJsFileContent = file_get_contents($compressedJsFileName); foreach ($jsFiles as $name => $content) { - $this->assertContains($content, $compressedJsFileContent, "Source of '{$name}' is missing in combined file!"); + $this->assertStringContainsString( + $content, + $compressedJsFileContent, + "Source of '{$name}' is missing in combined file!", + ); } } @@ -384,7 +392,7 @@ public function testCompressExternalAsset() // Then : $this->assertFileExists($bundleFile, 'Unable to create output bundle file!'); $compressedBundleConfig = require $bundleFile; - $this->assertInternalType('array', $compressedBundleConfig, 'Output bundle file has incorrect format!'); + $this->assertIsArray($compressedBundleConfig, 'Output bundle file has incorrect format!'); $this->assertArrayHasKey($externalAssetBundleClassName, $compressedBundleConfig, 'External bundle is lost!'); $compressedExternalAssetConfig = $compressedBundleConfig[$externalAssetBundleClassName]; @@ -392,7 +400,11 @@ public function testCompressExternalAsset() $this->assertEquals($externalAssetConfig['css'], $compressedExternalAssetConfig['css'], 'External bundle css is lost!'); $compressedRegularAssetConfig = $compressedBundleConfig[$regularAssetBundleClassName]; - $this->assertContains($externalAssetBundleClassName, $compressedRegularAssetConfig['depends'], 'Dependency on external bundle is lost!'); + $this->assertContains( + $externalAssetBundleClassName, + $compressedRegularAssetConfig['depends'], + 'Dependency on external bundle is lost!', + ); } /** diff --git a/tests/framework/console/controllers/BaseMessageControllerTest.php b/tests/framework/console/controllers/BaseMessageControllerTest.php index 90d77736209..a7aa869c33a 100644 --- a/tests/framework/console/controllers/BaseMessageControllerTest.php +++ b/tests/framework/console/controllers/BaseMessageControllerTest.php @@ -23,7 +23,7 @@ abstract class BaseMessageControllerTest extends TestCase protected $configFileName = ''; protected $language = 'en'; - public function setUp() + protected function setUp(): void { $this->mockApplication(); $this->sourcePath = Yii::getAlias('@yiiunit/runtime/test_source'); @@ -47,7 +47,7 @@ protected function generateConfigFileName() return $this->configFileName; } - public function tearDown() + protected function tearDown(): void { FileHelper::removeDirectory($this->sourcePath); if (file_exists($this->configFileName)) { diff --git a/tests/framework/console/controllers/CacheControllerTest.php b/tests/framework/console/controllers/CacheControllerTest.php index 907c6da4d3f..183d173d8e1 100644 --- a/tests/framework/console/controllers/CacheControllerTest.php +++ b/tests/framework/console/controllers/CacheControllerTest.php @@ -29,7 +29,7 @@ class CacheControllerTest extends TestCase private $driverName = 'mysql'; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -137,11 +137,11 @@ public function testNotFoundFlush() $this->assertEquals('firstValue', Yii::$app->firstCache->get('firstKey'), 'first cache data should not be flushed'); } - /** - * @expectedException \yii\console\Exception - */ public function testNothingToFlushException() { + $this->expectException('yii\console\Exception'); + $this->expectExceptionMessage('You should specify cache components names'); + $this->_cacheController->actionFlush(); } diff --git a/tests/framework/console/controllers/DbMessageControllerTest.php b/tests/framework/console/controllers/DbMessageControllerTest.php index 1c5707dab94..4ecdbd1124a 100644 --- a/tests/framework/console/controllers/DbMessageControllerTest.php +++ b/tests/framework/console/controllers/DbMessageControllerTest.php @@ -51,7 +51,7 @@ protected static function runConsoleAction($route, $params = []) } } - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $databases = static::getParam('databases'); @@ -65,7 +65,7 @@ public static function setUpBeforeClass() static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]); } - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]); if (static::$db) { @@ -75,7 +75,7 @@ public static function tearDownAfterClass() parent::tearDownAfterClass(); } - public function tearDown() + protected function tearDown(): void { parent::tearDown(); Yii::$app = null; diff --git a/tests/framework/console/controllers/FixtureControllerTest.php b/tests/framework/console/controllers/FixtureControllerTest.php index 49ad96b31df..a7882d1f1a3 100644 --- a/tests/framework/console/controllers/FixtureControllerTest.php +++ b/tests/framework/console/controllers/FixtureControllerTest.php @@ -30,7 +30,7 @@ class FixtureControllerTest extends DatabaseTestCase protected $driverName = 'mysql'; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -46,7 +46,7 @@ protected function setUp() ], [null, null]); //id and module are null } - protected function tearDown() + protected function tearDown(): void { $this->_fixtureController = null; FixtureStorage::clear(); diff --git a/tests/framework/console/controllers/HelpControllerTest.php b/tests/framework/console/controllers/HelpControllerTest.php index 68c4f61772f..2613e89ad42 100644 --- a/tests/framework/console/controllers/HelpControllerTest.php +++ b/tests/framework/console/controllers/HelpControllerTest.php @@ -21,7 +21,7 @@ class HelpControllerTest extends TestCase /** * {@inheritdoc} */ - public function setUp() + protected function setUp(): void { $this->mockApplication(); } @@ -154,37 +154,37 @@ public function testActionUsage() public function testActionIndex() { $result = Console::stripAnsiFormat($this->runControllerAction('index')); - $this->assertContains('This is Yii version ', $result); - $this->assertContains('The following commands are available:', $result); - $this->assertContains('To see the help of each command, enter:', $result); - $this->assertContains('bootstrap.php help', $result); + $this->assertStringContainsString('This is Yii version ', $result); + $this->assertStringContainsString('The following commands are available:', $result); + $this->assertStringContainsString('To see the help of each command, enter:', $result); + $this->assertStringContainsString('bootstrap.php help', $result); } public function testActionIndexWithHelpCommand() { $result = Console::stripAnsiFormat($this->runControllerAction('index', ['command' => 'help/index'])); - $this->assertContains('Displays available commands or the detailed information', $result); - $this->assertContains('bootstrap.php help [command] [...options...]', $result); - $this->assertContains('--appconfig: string', $result); - $this->assertContains('- command: string', $result); - $this->assertContains('--color: boolean, 0 or 1', $result); - $this->assertContains('--help, -h: boolean, 0 or 1', $result); - $this->assertContains('--interactive: boolean, 0 or 1 (defaults to 1)', $result); + $this->assertStringContainsString('Displays available commands or the detailed information', $result); + $this->assertStringContainsString('bootstrap.php help [command] [...options...]', $result); + $this->assertStringContainsString('--appconfig: string', $result); + $this->assertStringContainsString('- command: string', $result); + $this->assertStringContainsString('--color: boolean, 0 or 1', $result); + $this->assertStringContainsString('--help, -h: boolean, 0 or 1', $result); + $this->assertStringContainsString('--interactive: boolean, 0 or 1 (defaults to 1)', $result); } public function testActionIndexWithServeCommand() { $result = Console::stripAnsiFormat($this->runControllerAction('index', ['command' => 'serve'])); - $this->assertContains('Runs PHP built-in web server', $result); - $this->assertContains('bootstrap.php serve [address] [...options...]', $result); - $this->assertContains('- address: string (defaults to \'localhost\')', $result); - $this->assertContains('--appconfig: string', $result); - $this->assertContains('--color: boolean, 0 or 1', $result); - $this->assertContains('--docroot, -t: string (defaults to \'@app/web\')', $result); - $this->assertContains('--help, -h: boolean, 0 or 1', $result); - $this->assertContains('--interactive: boolean, 0 or 1 (defaults to 1)', $result); - $this->assertContains('--port, -p: int (defaults to 8080)', $result); - $this->assertContains('--router, -r: string', $result); + $this->assertStringContainsString('Runs PHP built-in web server', $result); + $this->assertStringContainsString('bootstrap.php serve [address] [...options...]', $result); + $this->assertStringContainsString('- address: string (defaults to \'localhost\')', $result); + $this->assertStringContainsString('--appconfig: string', $result); + $this->assertStringContainsString('--color: boolean, 0 or 1', $result); + $this->assertStringContainsString('--docroot, -t: string (defaults to \'@app/web\')', $result); + $this->assertStringContainsString('--help, -h: boolean, 0 or 1', $result); + $this->assertStringContainsString('--interactive: boolean, 0 or 1 (defaults to 1)', $result); + $this->assertStringContainsString('--port, -p: int (defaults to 8080)', $result); + $this->assertStringContainsString('--router, -r: string', $result); } public function testActionListContainsNoEmptyCommands() @@ -194,9 +194,9 @@ public function testActionListContainsNoEmptyCommands() 'controllerNamespace' => 'yiiunit\data\console\controllers', ]); $result = Console::stripAnsiFormat($this->runControllerAction('list')); - $this->assertNotContains("fake-empty\n", $result); - $this->assertNotContains("fake-no-default\n", $result); - $this->assertContains("fake-no-default/index\n", $result); + $this->assertStringNotContainsString("fake-empty\n", $result); + $this->assertStringNotContainsString("fake-no-default\n", $result); + $this->assertStringContainsString("fake-no-default/index\n", $result); } public function testActionIndexContainsNoEmptyCommands() @@ -206,10 +206,10 @@ public function testActionIndexContainsNoEmptyCommands() 'controllerNamespace' => 'yiiunit\data\console\controllers', ]); $result = Console::stripAnsiFormat($this->runControllerAction('index')); - $this->assertNotContains("- fake-empty", $result); - $this->assertContains("- fake-no-default", $result); - $this->assertContains(" fake-no-default/index", $result); - $this->assertNotContains(" fake-no-default/index (default)", $result); + $this->assertStringNotContainsString("- fake-empty", $result); + $this->assertStringContainsString("- fake-no-default", $result); + $this->assertStringContainsString(" fake-no-default/index", $result); + $this->assertStringNotContainsString(" fake-no-default/index (default)", $result); } } diff --git a/tests/framework/console/controllers/MigrateControllerTest.php b/tests/framework/console/controllers/MigrateControllerTest.php index 714b233b82b..8fdbce6e02f 100644 --- a/tests/framework/console/controllers/MigrateControllerTest.php +++ b/tests/framework/console/controllers/MigrateControllerTest.php @@ -26,7 +26,7 @@ class MigrateControllerTest extends TestCase { use MigrateControllerTestTrait; - public function setUp() + protected function setUp(): void { $this->migrateControllerClass = EchoMigrateController::className(); $this->migrationBaseClass = Migration::className(); @@ -44,7 +44,7 @@ public function setUp() parent::setUp(); } - public function tearDown() + protected function tearDown(): void { $this->tearDownMigrationPath(); parent::tearDown(); @@ -419,8 +419,8 @@ public function testUpdatingLongNamedMigration() $result = $this->runMigrateControllerAction('up'); $this->assertSame(ExitCode::UNSPECIFIED_ERROR, $this->getExitCode()); - $this->assertContains('The migration name', $result); - $this->assertContains('is too long. Its not possible to apply this migration.', $result); + $this->assertStringContainsString('The migration name', $result); + $this->assertStringContainsString('is too long. Its not possible to apply this migration.', $result); } public function testNamedMigrationWithCustomLimit() @@ -435,8 +435,8 @@ public function testNamedMigrationWithCustomLimit() $result = $this->runMigrateControllerAction('up'); $this->assertSame(ExitCode::OK, $this->getExitCode()); - $this->assertContains('1 migration was applied.', $result); - $this->assertContains('Migrated up successfully.', $result); + $this->assertStringContainsString('1 migration was applied.', $result); + $this->assertStringContainsString('Migrated up successfully.', $result); } public function testCreateLongNamedMigration() @@ -478,11 +478,11 @@ public function testRefreshMigration($db) $this->assertSame(ExitCode::OK, $this->getExitCode()); // Drop worked - $this->assertContains('Table hall_of_fame dropped.', $result); - $this->assertContains('View view_hall_of_fame dropped.', $result); + $this->assertStringContainsString('Table hall_of_fame dropped.', $result); + $this->assertStringContainsString('View view_hall_of_fame dropped.', $result); // Migration was restarted - $this->assertContains('No new migrations found. Your system is up-to-date.', $result); + $this->assertStringContainsString('No new migrations found. Your system is up-to-date.', $result); } public function refreshMigrationDataProvider() diff --git a/tests/framework/console/controllers/MigrateControllerTestTrait.php b/tests/framework/console/controllers/MigrateControllerTestTrait.php index bb71b5df1a9..046c512741e 100644 --- a/tests/framework/console/controllers/MigrateControllerTestTrait.php +++ b/tests/framework/console/controllers/MigrateControllerTestTrait.php @@ -228,7 +228,7 @@ public function testCreate() $this->assertSame(ExitCode::OK, $this->getExitCode()); $files = FileHelper::findFiles($this->migrationPath); $this->assertCount(1, $files, 'Unable to create new migration!'); - $this->assertContains($migrationName, basename($files[0]), 'Wrong migration name!'); + $this->assertStringContainsString($migrationName, basename($files[0]), 'Wrong migration name!'); } public function testUp() @@ -294,7 +294,7 @@ public function testDownAll() public function testHistory() { $output = $this->runMigrateControllerAction('history'); - $this->assertContains('No migration', $output); + $this->assertStringContainsString('No migration', $output); $this->createMigration('test_history1'); $this->createMigration('test_history2'); @@ -303,8 +303,8 @@ public function testHistory() $output = $this->runMigrateControllerAction('history'); $this->assertSame(ExitCode::OK, $this->getExitCode()); - $this->assertContains('_test_history1', $output); - $this->assertContains('_test_history2', $output); + $this->assertStringContainsString('_test_history1', $output); + $this->assertStringContainsString('_test_history2', $output); } /** @@ -316,7 +316,7 @@ public function testNew() $output = $this->runMigrateControllerAction('new'); $this->assertSame(ExitCode::OK, $this->getExitCode()); - $this->assertContains('_test_new1', $output); + $this->assertStringContainsString('_test_new1', $output); $this->runMigrateControllerAction('up'); $this->assertSame(ExitCode::OK, $this->getExitCode()); @@ -393,8 +393,8 @@ public function testNamespaceCreate() $this->assertSame(ExitCode::OK, $this->getExitCode()); $files = FileHelper::findFiles($this->migrationPath); $fileContent = file_get_contents($files[0]); - $this->assertContains("namespace {$this->migrationNamespace};", $fileContent); - $this->assertRegExp('/class M[0-9]{12}' . ucfirst($migrationName) . '/s', $fileContent); + $this->assertStringContainsString("namespace {$this->migrationNamespace};", $fileContent); + $this->assertMatchesRegularExpression('/class M[0-9]{12}' . ucfirst($migrationName) . '/s', $fileContent); unlink($files[0]); // namespace specify : @@ -406,7 +406,7 @@ public function testNamespaceCreate() $this->assertSame(ExitCode::OK, $this->getExitCode()); $files = FileHelper::findFiles($this->migrationPath); $fileContent = file_get_contents($files[0]); - $this->assertContains("namespace {$this->migrationNamespace};", $fileContent); + $this->assertStringContainsString("namespace {$this->migrationNamespace};", $fileContent); unlink($files[0]); // no namespace: @@ -478,7 +478,7 @@ public function testNamespaceHistory() ]; $output = $this->runMigrateControllerAction('history', [], $controllerConfig); - $this->assertContains('No migration', $output); + $this->assertStringContainsString('No migration', $output); $this->createNamespaceMigration('history1'); $this->createNamespaceMigration('history2'); @@ -487,8 +487,8 @@ public function testNamespaceHistory() $output = $this->runMigrateControllerAction('history', [], $controllerConfig); $this->assertSame(ExitCode::OK, $this->getExitCode()); - $this->assertRegExp('/' . preg_quote($this->migrationNamespace) . '.*History1/s', $output); - $this->assertRegExp('/' . preg_quote($this->migrationNamespace) . '.*History2/s', $output); + $this->assertMatchesRegularExpression('/' . preg_quote($this->migrationNamespace) . '.*History1/s', $output); + $this->assertMatchesRegularExpression('/' . preg_quote($this->migrationNamespace) . '.*History2/s', $output); } /** diff --git a/tests/framework/console/controllers/PHPMessageControllerTest.php b/tests/framework/console/controllers/PHPMessageControllerTest.php index d3a8074a665..f2d9c06fdb6 100644 --- a/tests/framework/console/controllers/PHPMessageControllerTest.php +++ b/tests/framework/console/controllers/PHPMessageControllerTest.php @@ -18,14 +18,14 @@ class PHPMessageControllerTest extends BaseMessageControllerTest { protected $messagePath; - public function setUp() + protected function setUp(): void { parent::setUp(); $this->messagePath = Yii::getAlias('@yiiunit/runtime/test_messages'); FileHelper::createDirectory($this->messagePath, 0777); } - public function tearDown() + protected function tearDown(): void { parent::tearDown(); FileHelper::removeDirectory($this->messagePath); @@ -165,7 +165,7 @@ public function testRemoveUnusedBehavior($category, $isUnused, $removeUnused, $i if ($isExpectedToExist) { $this->assertFileExists($filePath); } else { - $this->assertFileNotExists($filePath); + $this->assertFileDoesNotExist($filePath); } } } diff --git a/tests/framework/console/controllers/POMessageControllerTest.php b/tests/framework/console/controllers/POMessageControllerTest.php index 0aac7f2c8d3..25d165406b8 100644 --- a/tests/framework/console/controllers/POMessageControllerTest.php +++ b/tests/framework/console/controllers/POMessageControllerTest.php @@ -19,7 +19,7 @@ class POMessageControllerTest extends BaseMessageControllerTest protected $messagePath; protected $catalog = 'messages'; - public function setUp() + protected function setUp(): void { parent::setUp(); @@ -27,7 +27,7 @@ public function setUp() FileHelper::createDirectory($this->messagePath, 0777); } - public function tearDown() + protected function tearDown(): void { parent::tearDown(); FileHelper::removeDirectory($this->messagePath); diff --git a/tests/framework/console/controllers/ServeControllerTest.php b/tests/framework/console/controllers/ServeControllerTest.php index 35a5db6d075..def6c808a25 100644 --- a/tests/framework/console/controllers/ServeControllerTest.php +++ b/tests/framework/console/controllers/ServeControllerTest.php @@ -19,7 +19,7 @@ */ class ServeControllerTest extends TestCase { - public function setUp() + protected function setUp(): void { $this->mockApplication(); } @@ -46,7 +46,7 @@ public function testAddressTaken() $result = $serveController->flushStdOutBuffer(); - $this->assertContains('http://localhost:8080 is taken by another process.', $result); + $this->assertStringContainsString('http://localhost:8080 is taken by another process.', $result); } public function testDefaultValues() @@ -70,9 +70,9 @@ public function testDefaultValues() $result = $serveController->flushStdOutBuffer(); - $this->assertContains('Server started on http://localhost:8080', $result); - $this->assertContains("Document root is \"{$docroot}\"", $result); - $this->assertContains('Quit the server with CTRL-C or COMMAND-C.', $result); + $this->assertStringContainsString('Server started on http://localhost:8080', $result); + $this->assertStringContainsString("Document root is \"{$docroot}\"", $result); + $this->assertStringContainsString('Quit the server with CTRL-C or COMMAND-C.', $result); } public function testDoocRootWithNoExistValue() @@ -95,7 +95,7 @@ public function testDoocRootWithNoExistValue() $result = $serveController->flushStdOutBuffer(); - $this->assertContains("Document root \"{$docroot}\" does not exist.", $result); + $this->assertStringContainsString("Document root \"{$docroot}\" does not exist.", $result); } public function testWithRouterNoExistValue() @@ -121,7 +121,7 @@ public function testWithRouterNoExistValue() $result = $serveController->flushStdOutBuffer(); - $this->assertContains("Routing file \"$router\" does not exist.", $result); + $this->assertStringContainsString("Routing file \"$router\" does not exist.", $result); } public function testWithRouterValue() @@ -147,10 +147,10 @@ public function testWithRouterValue() $result = $serveController->flushStdOutBuffer(); - $this->assertContains('Server started on http://localhost:8081', $result); - $this->assertContains("Document root is \"{$docroot}\"", $result); - $this->assertContains("Routing file is \"{$router}\"", $result); - $this->assertContains('Quit the server with CTRL-C or COMMAND-C.', $result); + $this->assertStringContainsString('Server started on http://localhost:8081', $result); + $this->assertStringContainsString("Document root is \"{$docroot}\"", $result); + $this->assertStringContainsString("Routing file is \"{$router}\"", $result); + $this->assertStringContainsString('Quit the server with CTRL-C or COMMAND-C.', $result); } } diff --git a/tests/framework/console/widgets/TableTest.php b/tests/framework/console/widgets/TableTest.php index 796c95ad1d6..44e9f4427a9 100644 --- a/tests/framework/console/widgets/TableTest.php +++ b/tests/framework/console/widgets/TableTest.php @@ -16,7 +16,7 @@ */ class TableTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -502,7 +502,7 @@ public function testColorizedInputStripsANSIMarkersInternally() ->setScreenWidth(200) ->run(); - $columnWidths = \PHPUnit_Framework_Assert::readAttribute($table, "columnWidths"); + $columnWidths = $this->getInaccessibleProperty($table, 'columnWidths'); $this->assertArrayHasKey(1, $columnWidths); $this->assertEquals(4+2, $columnWidths[1]); diff --git a/tests/framework/data/ActiveDataFilterTest.php b/tests/framework/data/ActiveDataFilterTest.php index 9e4fbe7ca62..a4763fd81ad 100644 --- a/tests/framework/data/ActiveDataFilterTest.php +++ b/tests/framework/data/ActiveDataFilterTest.php @@ -13,7 +13,7 @@ class ActiveDataFilterTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/data/ActiveDataProviderTest.php b/tests/framework/data/ActiveDataProviderTest.php index 57f866ee809..af96dfef267 100644 --- a/tests/framework/data/ActiveDataProviderTest.php +++ b/tests/framework/data/ActiveDataProviderTest.php @@ -26,7 +26,7 @@ */ abstract class ActiveDataProviderTest extends DatabaseTestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); @@ -132,7 +132,7 @@ public function testQuery() ]); $orders = $provider->getModels(); $this->assertCount(3, $orders); - $this->assertInternalType('array', $orders[0]); + $this->assertIsArray($orders[0]); $this->assertEquals([0, 1, 2], $provider->getKeys()); $query = new Query(); diff --git a/tests/framework/data/ArrayDataProviderTest.php b/tests/framework/data/ArrayDataProviderTest.php index 6c9af6e98bf..84944d511b6 100644 --- a/tests/framework/data/ArrayDataProviderTest.php +++ b/tests/framework/data/ArrayDataProviderTest.php @@ -15,7 +15,7 @@ */ class ArrayDataProviderTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/data/DataFilterTest.php b/tests/framework/data/DataFilterTest.php index 1508a28ccde..aec273c9a5b 100644 --- a/tests/framework/data/DataFilterTest.php +++ b/tests/framework/data/DataFilterTest.php @@ -17,7 +17,7 @@ */ class DataFilterTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/data/PaginationTest.php b/tests/framework/data/PaginationTest.php index a50cba3745c..4dee36e6d3e 100644 --- a/tests/framework/data/PaginationTest.php +++ b/tests/framework/data/PaginationTest.php @@ -16,7 +16,7 @@ */ class PaginationTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockWebApplication([ diff --git a/tests/framework/data/SortTest.php b/tests/framework/data/SortTest.php index c9bb1884212..27a4659cbc7 100644 --- a/tests/framework/data/SortTest.php +++ b/tests/framework/data/SortTest.php @@ -19,7 +19,7 @@ */ class SortTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/db/ActiveQueryModelConnectionTest.php b/tests/framework/db/ActiveQueryModelConnectionTest.php index 86dff975fd4..e14b6824d4b 100644 --- a/tests/framework/db/ActiveQueryModelConnectionTest.php +++ b/tests/framework/db/ActiveQueryModelConnectionTest.php @@ -17,7 +17,7 @@ class ActiveQueryModelConnectionTest extends TestCase private $globalConnection; private $modelConnection; - protected function setUp() + protected function setUp(): void { $this->globalConnection = $this->getMockBuilder('yii\db\Connection')->getMock(); $this->modelConnection = $this->getMockBuilder('yii\db\Connection')->getMock(); diff --git a/tests/framework/db/ActiveQueryTest.php b/tests/framework/db/ActiveQueryTest.php index 3d3f451865c..3867d3ccb98 100644 --- a/tests/framework/db/ActiveQueryTest.php +++ b/tests/framework/db/ActiveQueryTest.php @@ -22,7 +22,7 @@ */ abstract class ActiveQueryTest extends DatabaseTestCase { - public function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index e50cca3e024..955dabbd934 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -44,7 +44,7 @@ abstract class ActiveRecordTest extends DatabaseTestCase { use ActiveRecordTestTrait; - protected function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); @@ -199,7 +199,7 @@ public function testFindLazyViaTable() $this->assertCount(0, $order->books); $order = Order::find()->where(['id' => 1])->asArray()->one(); - $this->assertInternalType('array', $order); + $this->assertIsArray($order); } public function testFindEagerViaTable() @@ -225,10 +225,10 @@ public function testFindEagerViaTable() // https://github.com/yiisoft/yii2/issues/1402 $orders = Order::find()->with('books')->orderBy('id')->asArray()->all(); $this->assertCount(3, $orders); - $this->assertInternalType('array', $orders[0]['orderItems'][0]); + $this->assertIsArray($orders[0]['orderItems'][0]); $order = $orders[0]; - $this->assertInternalType('array', $order); + $this->assertIsArray($order); $this->assertEquals(1, $order['id']); $this->assertCount(2, $order['books']); $this->assertEquals(1, $order['books'][0]['id']); @@ -1123,7 +1123,7 @@ public function testFindSimpleRelationWithJoin() $this->assertInstanceOf('yiiunit\data\ar\Customer', $customerWithJoin); $customerWithJoinIndexOrdered = $order->customerJoinedWithProfileIndexOrdered; - $this->assertInternalType('array', $customerWithJoinIndexOrdered); + $this->assertIsArray($customerWithJoinIndexOrdered); $this->assertArrayHasKey('user1', $customerWithJoinIndexOrdered); $this->assertInstanceOf('yiiunit\data\ar\Customer', $customerWithJoinIndexOrdered['user1']); } @@ -1424,38 +1424,6 @@ public function testUnlinkAllViaTable() $this->assertEquals(5, $itemClass::find()->count()); } - /** - * @requires PHP 5.6 - */ - public function testCastValues() - { - $model = new Type(); - $model->int_col = 123; - $model->int_col2 = 456; - $model->smallint_col = 42; - $model->char_col = '1337'; - $model->char_col2 = 'test'; - $model->char_col3 = 'test123'; - $model->float_col = 3.742; - $model->float_col2 = 42.1337; - $model->bool_col = true; - $model->bool_col2 = false; - $model->save(false); - - /* @var $model Type */ - $model = Type::find()->one(); - $this->assertSame(123, $model->int_col); - $this->assertSame(456, $model->int_col2); - $this->assertSame(42, $model->smallint_col); - $this->assertSame('1337', trim($model->char_col)); - $this->assertSame('test', $model->char_col2); - $this->assertSame('test123', $model->char_col3); -// $this->assertSame(1337.42, $model->float_col); -// $this->assertSame(42.1337, $model->float_col2); -// $this->assertSame(true, $model->bool_col); -// $this->assertSame(false, $model->bool_col2); - } - public function testIssues() { // https://github.com/yiisoft/yii2/issues/4938 @@ -1934,6 +1902,8 @@ public function legalValuesForFindByCondition() */ public function testLegalValuesForFindByCondition($modelClassName, $validFilter) { + $this->expectNotToPerformAssertions(); + /** @var Query $query */ $query = $this->invokeMethod(\Yii::createObject($modelClassName), 'findByCondition', [$validFilter]); Customer::getDb()->queryBuilder->build($query); @@ -1973,8 +1943,8 @@ public function illegalValuesForFindByCondition() */ public function testValueEscapingInFindByCondition($modelClassName, $filterWithInjection) { - $this->expectException('yii\base\InvalidArgumentException'); - $this->expectExceptionMessageRegExp('/^Key "(.+)?" is not a column name and can not be used as a filter$/'); + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessageMatches('/^Key "(.+)?" is not a column name and can not be used as a filter$/'); /** @var Query $query */ $query = $this->invokeMethod(\Yii::createObject($modelClassName), 'findByCondition', $filterWithInjection); Customer::getDb()->queryBuilder->build($query); @@ -2096,16 +2066,6 @@ public function testIssetException() $this->assertFalse(isset($cat->exception)); } - /** - * @requires PHP 7 - */ - public function testIssetThrowable() - { - $cat = new Cat(); - $this->assertFalse(isset($cat->throwable)); - - } - /** * @see https://github.com/yiisoft/yii2/issues/15482 */ diff --git a/tests/framework/db/BaseActiveRecordTest.php b/tests/framework/db/BaseActiveRecordTest.php index 0427421cd81..1ef9013aa77 100644 --- a/tests/framework/db/BaseActiveRecordTest.php +++ b/tests/framework/db/BaseActiveRecordTest.php @@ -6,7 +6,7 @@ abstract class BaseActiveRecordTest extends DatabaseTestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); diff --git a/tests/framework/db/BatchQueryResultTest.php b/tests/framework/db/BatchQueryResultTest.php index 54487083e72..3086bc19329 100644 --- a/tests/framework/db/BatchQueryResultTest.php +++ b/tests/framework/db/BatchQueryResultTest.php @@ -14,7 +14,7 @@ abstract class BatchQueryResultTest extends DatabaseTestCase { - public function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 041b788f3c1..1817ff65b4e 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -193,7 +193,7 @@ public function testBindParamValue() $command->bindParam(':blob_col', $blobCol); $command->bindParam(':bool_col', $boolCol, \PDO::PARAM_BOOL); } else { - $floatCol = 1.23; + $floatCol = 1.230; $numericCol = '1.23'; $blobCol = "\x10\x11\x12"; $boolCol = false; @@ -210,13 +210,13 @@ public function testBindParamValue() $row = $command->queryOne(); $this->assertEquals($intCol, $row['int_col']); $this->assertEquals($charCol, $row['char_col']); - $this->assertEquals($floatCol, $row['float_col']); + $this->assertEquals($floatCol, (float) $row['float_col']); if ($this->driverName === 'mysql' || $this->driverName === 'sqlite' || $this->driverName === 'oci') { $this->assertEquals($blobCol, $row['blob_col']); } elseif (\defined('HHVM_VERSION') && $this->driverName === 'pgsql') { // HHVMs pgsql implementation does not seem to support blob columns correctly. } else { - $this->assertInternalType('resource', $row['blob_col']); + $this->assertIsResource($row['blob_col']); $this->assertEquals($blobCol, stream_get_contents($row['blob_col'])); } $this->assertEquals($numericCol, $row['numeric_col']); @@ -281,7 +281,7 @@ public function testFetchMode() $command = $db->createCommand($sql); $command->fetchMode = \PDO::FETCH_OBJ; $result = $command->queryOne(); - $this->assertInternalType('object', $result); + $this->assertIsObject($result); // FETCH_NUM, customized in query method $sql = 'SELECT * FROM {{customer}}'; @@ -315,11 +315,7 @@ public function testBatchInsert() public function testBatchInsertWithYield() { - if (PHP_VERSION_ID < 50500) { - $this->markTestSkipped('The yield function is only supported with php 5.5 =< version'); - } else { - include __DIR__ . '/testBatchInsertWithYield.php'; - } + include __DIR__ . '/testBatchInsertWithYield.php'; } /** @@ -634,10 +630,11 @@ public function testInsertSelectFailed($invalidSelectColumns) $db = $this->getConnection(); $command = $db->createCommand(); - $command->insert( - '{{customer}}', - $query - )->execute(); + + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('Expected select query object with enumerated (named) parameters'); + + $command->insert('{{customer}}', $query)->execute(); } public function testInsertExpression() @@ -1222,7 +1219,10 @@ public function testAddDropCheck() $this->assertEmpty($schema->getTableChecks($tableName, true)); $db->createCommand()->addCheck($name, $tableName, '[[int1]] > 1')->execute(); - $this->assertRegExp('/^.*int1.*>.*1.*$/', $schema->getTableChecks($tableName, true)[0]->expression); + $this->assertMatchesRegularExpression( + '/^.*int1.*>.*1.*$/', + $schema->getTableChecks($tableName, true)[0]->expression + ); $db->createCommand()->dropCheck($name, $tableName)->execute(); $this->assertEmpty($schema->getTableChecks($tableName, true)); diff --git a/tests/framework/db/ConnectionTest.php b/tests/framework/db/ConnectionTest.php index a155517ffdf..663f6115926 100644 --- a/tests/framework/db/ConnectionTest.php +++ b/tests/framework/db/ConnectionTest.php @@ -230,12 +230,17 @@ public function testTransactionIsolation() public function testTransactionShortcutException() { $connection = $this->getConnection(true); + + $this->expectException(\Exception::class); + $connection->transaction(function () use ($connection) { $connection->createCommand()->insert('profile', ['description' => 'test transaction shortcut'])->execute(); throw new \Exception('Exception in transaction shortcut'); }); - $profilesCount = $connection->createCommand("SELECT COUNT(*) FROM profile WHERE description = 'test transaction shortcut';")->queryScalar(); + $profilesCount = $connection + ->createCommand("SELECT COUNT(*) FROM profile WHERE description = 'test transaction shortcut';") + ->queryScalar(); $this->assertEquals(0, $profilesCount, 'profile should not be inserted in transaction shortcut'); } @@ -400,7 +405,11 @@ private function runExceptionTest($connection) try { $connection->createCommand('INSERT INTO qlog1(a) VALUES(:a);', [':a' => 1])->execute(); } catch (\yii\db\Exception $e) { - $this->assertContains('INSERT INTO qlog1(a) VALUES(1);', $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e); + $this->assertStringContainsString( + 'INSERT INTO qlog1(a) VALUES(1);', + $e->getMessage(), + 'Exception message should contain raw SQL query: ' . (string) $e + ); $thrown = true; } $this->assertTrue($thrown, 'An exception should have been thrown by the command.'); @@ -409,7 +418,10 @@ private function runExceptionTest($connection) try { $connection->createCommand('SELECT * FROM qlog1 WHERE id=:a ORDER BY nonexistingcolumn;', [':a' => 1])->queryAll(); } catch (\yii\db\Exception $e) { - $this->assertContains('SELECT * FROM qlog1 WHERE id=1 ORDER BY nonexistingcolumn;', $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e); + $this->assertStringContainsString( + 'SELECT * FROM qlog1 WHERE id=1 ORDER BY nonexistingcolumn;', + $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e, + ); $thrown = true; } $this->assertTrue($thrown, 'An exception should have been thrown by the command.'); diff --git a/tests/framework/db/DatabaseTestCase.php b/tests/framework/db/DatabaseTestCase.php index 53ea945623e..c9275ebcfaf 100644 --- a/tests/framework/db/DatabaseTestCase.php +++ b/tests/framework/db/DatabaseTestCase.php @@ -24,7 +24,7 @@ abstract class DatabaseTestCase extends TestCase private $_db; - protected function setUp() + protected function setUp(): void { if ($this->driverName === null) { throw new \Exception('driverName is not set for a DatabaseTestCase.'); @@ -44,7 +44,7 @@ protected function setUp() $this->mockApplication(); } - protected function tearDown() + protected function tearDown(): void { if ($this->_db) { $this->_db->close(); diff --git a/tests/framework/db/QueryTest.php b/tests/framework/db/QueryTest.php index 4de29107045..515f70a485a 100644 --- a/tests/framework/db/QueryTest.php +++ b/tests/framework/db/QueryTest.php @@ -333,8 +333,7 @@ public function testLimitOffsetWithExpression() $this->assertCount(2, $result); $this->assertNotContains(1, $result); - $this->assertContains(2, $result); - $this->assertContains(3, $result); + $this->assertEquals([2, 3], $result); } public function testUnion() diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php index dd05f78d9c2..480aabbfdd0 100644 --- a/tests/framework/db/SchemaTest.php +++ b/tests/framework/db/SchemaTest.php @@ -528,7 +528,7 @@ public function testColumnSchema() $this->assertSame($expected['precision'], $column->precision, "precision of column $name does not match."); $this->assertSame($expected['scale'], $column->scale, "scale of column $name does not match."); if (\is_object($expected['defaultValue'])) { - $this->assertInternalType('object', $column->defaultValue, "defaultValue of column $name is expected to be an object but it is not."); + $this->assertIsObject($column->defaultValue, "defaultValue of column $name is expected to be an object but it is not."); $this->assertEquals((string)$expected['defaultValue'], (string)$column->defaultValue, "defaultValue of column $name does not match."); } else { $this->assertEquals($expected['defaultValue'], $column->defaultValue, "defaultValue of column $name does not match."); @@ -815,12 +815,25 @@ public function testTableSchemaConstraintsWithPdoLowercase($tableName, $type, $e private function assertMetadataEquals($expected, $actual) { - $this->assertInternalType(strtolower(\gettype($expected)), $actual); + switch (\strtolower(\gettype($expected))) { + case 'object': + $this->assertIsObject($actual); + break; + case 'array': + $this->assertIsArray($actual); + break; + case 'null': + $this->assertNull($actual); + break; + } + if (\is_array($expected)) { $this->normalizeArrayKeys($expected, false); $this->normalizeArrayKeys($actual, false); } + $this->normalizeConstraints($expected, $actual); + if (\is_array($expected)) { $this->normalizeArrayKeys($expected, true); $this->normalizeArrayKeys($actual, true); diff --git a/tests/framework/db/mssql/CommandTest.php b/tests/framework/db/mssql/CommandTest.php index 25a58a3a9e4..76c68cc8127 100644 --- a/tests/framework/db/mssql/CommandTest.php +++ b/tests/framework/db/mssql/CommandTest.php @@ -55,7 +55,7 @@ public function testBindParamValue() $command = $db->createCommand($sql); $intCol = 123; $charCol = 'abc'; - $floatCol = 1.23; + $floatCol = 1.230; $blobCol = "\x10\x11\x12"; $numericCol = '1.23'; $boolCol = false; @@ -69,9 +69,10 @@ public function testBindParamValue() $sql = 'SELECT int_col, char_col, float_col, CONVERT([nvarchar], blob_col) AS blob_col, numeric_col FROM type'; $row = $db->createCommand($sql)->queryOne(); + $this->assertEquals($intCol, $row['int_col']); $this->assertEquals($charCol, trim($row['char_col'])); - $this->assertEquals($floatCol, $row['float_col']); + $this->assertEquals($floatCol, (float) $row['float_col']); $this->assertEquals($blobCol, $row['blob_col']); $this->assertEquals($numericCol, $row['numeric_col']); @@ -113,7 +114,7 @@ public function testAddDropDefaultValue() $this->assertEmpty($schema->getTableDefaultValues($tableName, true)); $db->createCommand()->addDefaultValue($name, $tableName, 'int1', 41)->execute(); - $this->assertRegExp('/^.*41.*$/', $schema->getTableDefaultValues($tableName, true)[0]->value); + $this->assertMatchesRegularExpression('/^.*41.*$/', $schema->getTableDefaultValues($tableName, true)[0]->value); $db->createCommand()->dropDefaultValue($name, $tableName)->execute(); $this->assertEmpty($schema->getTableDefaultValues($tableName, true)); diff --git a/tests/framework/db/mssql/type/VarbinaryTest.php b/tests/framework/db/mssql/type/VarbinaryTest.php index b72a2b4c469..0840996f703 100644 --- a/tests/framework/db/mssql/type/VarbinaryTest.php +++ b/tests/framework/db/mssql/type/VarbinaryTest.php @@ -5,7 +5,7 @@ * @license https://www.yiiframework.com/license/ */ -namespace yiiunit\framework\db\mssql\Type; +namespace yiiunit\framework\db\mssql\type; use yii\db\Query; use yiiunit\framework\db\DatabaseTestCase; diff --git a/tests/framework/db/mysql/BaseActiveRecordTest.php b/tests/framework/db/mysql/BaseActiveRecordTest.php index 394922e87f7..8acdc27ac8a 100644 --- a/tests/framework/db/mysql/BaseActiveRecordTest.php +++ b/tests/framework/db/mysql/BaseActiveRecordTest.php @@ -4,6 +4,10 @@ use yiiunit\data\ar\Storage; +/** + * @group db + * @group mysql + */ class BaseActiveRecordTest extends \yiiunit\framework\db\BaseActiveRecordTest { public $driverName = 'mysql'; diff --git a/tests/framework/db/mysql/QueryTest.php b/tests/framework/db/mysql/QueryTest.php index 9f647308c6f..8d4847d6679 100644 --- a/tests/framework/db/mysql/QueryTest.php +++ b/tests/framework/db/mysql/QueryTest.php @@ -45,7 +45,6 @@ public function testLimitOffsetWithExpression() $this->assertCount(2, $result); $this->assertNotContains(1, $result); - $this->assertContains(2, $result); - $this->assertContains(3, $result); + $this->assertEquals([2, 3], $result); } } diff --git a/tests/framework/db/oci/ActiveRecordTest.php b/tests/framework/db/oci/ActiveRecordTest.php index 6be10ccc352..c7a11d722a8 100644 --- a/tests/framework/db/oci/ActiveRecordTest.php +++ b/tests/framework/db/oci/ActiveRecordTest.php @@ -26,7 +26,6 @@ class ActiveRecordTest extends \yiiunit\framework\db\ActiveRecordTest public function testCastValues() { // pass, because boolean casting is not available - return; $model = new Type(); $model->int_col = 123; $model->int_col2 = 456; @@ -48,7 +47,7 @@ public function testCastValues() $this->assertSame('1337', trim($model->char_col)); $this->assertSame('test', $model->char_col2); $this->assertSame('test123', $model->char_col3); - $this->assertSame(1337.42, $model->float_col); + $this->assertSame(3.742, $model->float_col); $this->assertSame(42.1337, $model->float_col2); $this->assertEquals('1', $model->bool_col); $this->assertEquals('0', $model->bool_col2); diff --git a/tests/framework/db/oci/ConnectionTest.php b/tests/framework/db/oci/ConnectionTest.php index 0d0bf842ef6..0b1a5f0d03b 100644 --- a/tests/framework/db/oci/ConnectionTest.php +++ b/tests/framework/db/oci/ConnectionTest.php @@ -78,6 +78,8 @@ public function testQuoteFullColumnName() public function testTransactionIsolation() { + $this->expectNotToPerformAssertions(); + $connection = $this->getConnection(true); $transaction = $connection->beginTransaction(Transaction::READ_COMMITTED); diff --git a/tests/framework/db/oci/QueryBuilderTest.php b/tests/framework/db/oci/QueryBuilderTest.php index 5bf3b831636..d7ed58cd3ba 100644 --- a/tests/framework/db/oci/QueryBuilderTest.php +++ b/tests/framework/db/oci/QueryBuilderTest.php @@ -305,7 +305,7 @@ public function testUpsert($table, $insertColumns, $updateColumns, $expectedSQL, if (is_string($expectedSQL)) { $this->assertEqualsWithoutLE($expectedSQL, $actualSQL); } else { - $this->assertContains($actualSQL, $expectedSQL); + $this->assertStringContainsString($actualSQL, $expectedSQL); } if (ArrayHelper::isAssociative($expectedParams)) { $this->assertSame($expectedParams, $actualParams); diff --git a/tests/framework/db/pgsql/ArrayParserTest.php b/tests/framework/db/pgsql/ArrayParserTest.php index 1962676180a..fdea8c9b20a 100644 --- a/tests/framework/db/pgsql/ArrayParserTest.php +++ b/tests/framework/db/pgsql/ArrayParserTest.php @@ -12,7 +12,7 @@ class ArrayParserTest extends TestCase */ protected $arrayParser; - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/db/pgsql/BaseActiveRecordTest.php b/tests/framework/db/pgsql/BaseActiveRecordTest.php index a4993685249..db6f1264815 100644 --- a/tests/framework/db/pgsql/BaseActiveRecordTest.php +++ b/tests/framework/db/pgsql/BaseActiveRecordTest.php @@ -5,6 +5,10 @@ use yii\db\JsonExpression; use yiiunit\data\ar\ActiveRecord; +/** + * @group db + * @group pgsql + */ class BaseActiveRecordTest extends \yiiunit\framework\db\BaseActiveRecordTest { public $driverName = 'pgsql'; diff --git a/tests/framework/db/pgsql/ConnectionTest.php b/tests/framework/db/pgsql/ConnectionTest.php index 2baa79e3b8d..c3a6d0c68eb 100644 --- a/tests/framework/db/pgsql/ConnectionTest.php +++ b/tests/framework/db/pgsql/ConnectionTest.php @@ -19,7 +19,7 @@ class ConnectionTest extends \yiiunit\framework\db\ConnectionTest public function testConnection() { - $this->assertInternalType('object', $this->getConnection(true)); + $this->assertIsObject($this->getConnection(true)); } public function testQuoteValue() diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php index 4df6140a819..89df53651e0 100644 --- a/tests/framework/di/ContainerTest.php +++ b/tests/framework/di/ContainerTest.php @@ -40,7 +40,7 @@ */ class ContainerTest extends TestCase { - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Yii::$container = new Container(); @@ -443,11 +443,10 @@ public function testGetByClassIndirectly() $this->assertSame(42, $qux->a); } - /** - * @expectedException \yii\base\InvalidConfigException - */ public function testThrowingNotFoundException() { + $this->expectException(\yii\di\NotInstantiableException::class); + $container = new Container(); $container->get('non_existing'); } @@ -480,36 +479,13 @@ public function testContainerSingletons() $this->assertSame($foo, $sameFoo); } - /** - * @requires PHP 5.6 - */ - public function testVariadicConstructor() - { - if (\defined('HHVM_VERSION')) { - static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); - } - - $container = new Container(); - $container->get('yiiunit\framework\di\stubs\Variadic'); - } - - /** - * @requires PHP 5.6 - */ - public function testVariadicCallable() - { - if (\defined('HHVM_VERSION')) { - static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); - } - - require __DIR__ . '/testContainerWithVariadicCallable.php'; - } - /** * @see https://github.com/yiisoft/yii2/issues/18245 */ public function testDelayedInitializationOfSubArray() { + $this->expectNotToPerformAssertions(); + $definitions = [ 'test' => [ 'class' => Corge::className(), @@ -610,11 +586,6 @@ public function testNotInstantiableException($class) public function testNullTypeConstructorParameters() { - if (PHP_VERSION_ID < 70100) { - $this->markTestSkipped('Can not be tested on PHP < 7.1'); - return; - } - $zeta = (new Container())->get(Zeta::className()); $this->assertInstanceOf(Beta::className(), $zeta->beta); $this->assertInstanceOf(Beta::className(), $zeta->betaNull); diff --git a/tests/framework/di/InstanceTest.php b/tests/framework/di/InstanceTest.php index fe61a6bdf95..78044062ed3 100644 --- a/tests/framework/di/InstanceTest.php +++ b/tests/framework/di/InstanceTest.php @@ -21,7 +21,7 @@ */ class InstanceTest extends TestCase { - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Yii::$container = new Container(); @@ -59,7 +59,7 @@ public function testEnsure_NonExistingComponentException() { $container = new Container(); $this->expectException('yii\base\InvalidConfigException'); - $this->expectExceptionMessageRegExp('/^Failed to instantiate component or class/i'); + $this->expectExceptionMessageMatches('/^Failed to instantiate component or class/i'); Instance::ensure('cache', 'yii\cache\Cache', $container); } @@ -70,7 +70,7 @@ public function testEnsure_NonExistingClassException() { $container = new Container(); $this->expectException('yii\base\InvalidConfigException'); - $this->expectExceptionMessageRegExp('/^Failed to instantiate component or class/i'); + $this->expectExceptionMessageMatches('/^Failed to instantiate component or class/i'); Instance::ensure('yii\cache\DoesNotExist', 'yii\cache\Cache', $container); } @@ -171,7 +171,10 @@ public function testRestoreAfterVarExport() $instance = Instance::of('something'); $export = var_export($instance, true); - $this->assertRegExp('~yii\\\\di\\\\Instance::__set_state\(array\(\s+\'id\' => \'something\',\s+\'optional\' => false,\s+\)\)~', $export); + $this->assertMatchesRegularExpression( + '~yii\\\\di\\\\Instance::__set_state\(array\(\s+\'id\' => \'something\',\s+\'optional\' => false,\s+\)\)~', + $export + ); $this->assertEquals($instance, Instance::__set_state([ 'id' => 'something', diff --git a/tests/framework/filters/AccessRuleTest.php b/tests/framework/filters/AccessRuleTest.php index 620766788d8..56bcd341574 100644 --- a/tests/framework/filters/AccessRuleTest.php +++ b/tests/framework/filters/AccessRuleTest.php @@ -23,7 +23,7 @@ */ class AccessRuleTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/filters/ContentNegotiatorTest.php b/tests/framework/filters/ContentNegotiatorTest.php index d52bb367c93..221716b80ec 100644 --- a/tests/framework/filters/ContentNegotiatorTest.php +++ b/tests/framework/filters/ContentNegotiatorTest.php @@ -20,7 +20,7 @@ */ class ContentNegotiatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -55,10 +55,6 @@ public function testWhenLanguageGETParamIsArray() $this->assertEquals($targetLanguage, Yii::$app->language); } - /** - * @expectedException yii\web\BadRequestHttpException - * @expectedExceptionMessageRegExp |Invalid data received for GET parameter '.+'| - */ public function testWhenFormatGETParamIsArray() { list($action, $filter) = $this->mockActionAndFilter(); @@ -74,6 +70,9 @@ public function testWhenFormatGETParamIsArray() 'application/xml' => Response::FORMAT_XML, ]; + $this->expectException(\yii\web\BadRequestHttpException::class); + $this->expectExceptionMessage('Invalid data received for GET parameter'); + $filter->beforeAction($action); } diff --git a/tests/framework/filters/HostControlTest.php b/tests/framework/filters/HostControlTest.php index 39478fe00ed..4f5a32eb8bc 100644 --- a/tests/framework/filters/HostControlTest.php +++ b/tests/framework/filters/HostControlTest.php @@ -19,7 +19,7 @@ */ class HostControlTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/filters/HttpCacheTest.php b/tests/framework/filters/HttpCacheTest.php index 8f0f0da6054..a5be733520a 100644 --- a/tests/framework/filters/HttpCacheTest.php +++ b/tests/framework/filters/HttpCacheTest.php @@ -15,7 +15,7 @@ */ class HttpCacheTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/filters/PageCacheTest.php b/tests/framework/filters/PageCacheTest.php index 6dc5ef5f9a6..b89259168cf 100644 --- a/tests/framework/filters/PageCacheTest.php +++ b/tests/framework/filters/PageCacheTest.php @@ -25,14 +25,14 @@ */ class PageCacheTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $_SERVER['SCRIPT_FILENAME'] = '/index.php'; $_SERVER['SCRIPT_NAME'] = '/index.php'; } - protected function tearDown() + protected function tearDown(): void { CacheTestCase::$time = null; CacheTestCase::$microtime = null; diff --git a/tests/framework/filters/RateLimiterTest.php b/tests/framework/filters/RateLimiterTest.php index 1bbaad6e299..e98736614d1 100644 --- a/tests/framework/filters/RateLimiterTest.php +++ b/tests/framework/filters/RateLimiterTest.php @@ -22,7 +22,7 @@ */ class RateLimiterTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -30,7 +30,7 @@ protected function setUp() $this->mockWebApplication(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); Yii::setLogger(null); @@ -84,7 +84,10 @@ public function testBeforeActionUserNotInstanceOfRateLimitInterface() $result = $rateLimiter->beforeAction('test'); - $this->assertContains('Rate limit skipped: "user" does not implement RateLimitInterface.', Yii::getLogger()->messages); + $this->assertContains( + 'Rate limit skipped: "user" does not implement RateLimitInterface.', + Yii::getLogger()->messages + ); $this->assertTrue($result); } @@ -164,6 +167,9 @@ public function testUserWithClosureFunction() // testing the evaluation of user closure, which in this case returns not the expect object and therefore // the log message "does not implement RateLimitInterface" is expected. $this->assertInstanceOf(User::className(), $rateLimiter->user); - $this->assertContains('Rate limit skipped: "user" does not implement RateLimitInterface.', Yii::getLogger()->messages); + $this->assertContains( + 'Rate limit skipped: "user" does not implement RateLimitInterface.', + Yii::getLogger()->messages + ); } } diff --git a/tests/framework/filters/auth/AuthMethodTest.php b/tests/framework/filters/auth/AuthMethodTest.php index beea7740c19..f045b26b6ad 100644 --- a/tests/framework/filters/auth/AuthMethodTest.php +++ b/tests/framework/filters/auth/AuthMethodTest.php @@ -16,7 +16,7 @@ class AuthMethodTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/filters/auth/AuthTest.php b/tests/framework/filters/auth/AuthTest.php index 102d215064e..1c4a7086655 100644 --- a/tests/framework/filters/auth/AuthTest.php +++ b/tests/framework/filters/auth/AuthTest.php @@ -25,7 +25,7 @@ */ class AuthTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/filters/auth/CompositeAuthTest.php b/tests/framework/filters/auth/CompositeAuthTest.php index 6a9245c5e2b..c378550883a 100644 --- a/tests/framework/filters/auth/CompositeAuthTest.php +++ b/tests/framework/filters/auth/CompositeAuthTest.php @@ -103,7 +103,7 @@ public function behaviors() */ class CompositeAuthTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/grid/ActionColumnTest.php b/tests/framework/grid/ActionColumnTest.php index 7b15414d43c..c5d9bcfa9f0 100644 --- a/tests/framework/grid/ActionColumnTest.php +++ b/tests/framework/grid/ActionColumnTest.php @@ -70,34 +70,34 @@ public function testRenderDataCell() //test default visible button $columnContents = $column->renderDataCell(['id' => 1], 1, 0); - $this->assertContains('update_button', $columnContents); + $this->assertStringContainsString('update_button', $columnContents); //test visible button $column->visibleButtons = [ 'update' => true, ]; $columnContents = $column->renderDataCell(['id' => 1], 1, 0); - $this->assertContains('update_button', $columnContents); + $this->assertStringContainsString('update_button', $columnContents); //test visible button (condition is callback) $column->visibleButtons = [ 'update' => function ($model, $key, $index) {return $model['id'] == 1;}, ]; $columnContents = $column->renderDataCell(['id' => 1], 1, 0); - $this->assertContains('update_button', $columnContents); + $this->assertStringContainsString('update_button', $columnContents); //test invisible button $column->visibleButtons = [ 'update' => false, ]; $columnContents = $column->renderDataCell(['id' => 1], 1, 0); - $this->assertNotContains('update_button', $columnContents); + $this->assertStringNotContainsString('update_button', $columnContents); //test invisible button (condition is callback) $column->visibleButtons = [ 'update' => function ($model, $key, $index) {return $model['id'] != 1;}, ]; $columnContents = $column->renderDataCell(['id' => 1], 1, 0); - $this->assertNotContains('update_button', $columnContents); + $this->assertStringNotContainsString('update_button', $columnContents); } } diff --git a/tests/framework/grid/CheckboxColumnTest.php b/tests/framework/grid/CheckboxColumnTest.php index 6a2442019c7..b652ff2dc60 100644 --- a/tests/framework/grid/CheckboxColumnTest.php +++ b/tests/framework/grid/CheckboxColumnTest.php @@ -21,7 +21,7 @@ */ class CheckboxColumnTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); IntlTestHelper::resetIntlStatus(); @@ -35,34 +35,34 @@ protected function setUp() public function testInputName() { $column = new CheckboxColumn(['name' => 'selection', 'grid' => $this->getGrid()]); - $this->assertContains('name="selection_all"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="selection_all"', $column->renderHeaderCell()); $column = new CheckboxColumn(['name' => 'selections[]', 'grid' => $this->getGrid()]); - $this->assertContains('name="selections_all"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="selections_all"', $column->renderHeaderCell()); $column = new CheckboxColumn(['name' => 'MyForm[grid1]', 'grid' => $this->getGrid()]); - $this->assertContains('name="MyForm[grid1_all]"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="MyForm[grid1_all]"', $column->renderHeaderCell()); $column = new CheckboxColumn(['name' => 'MyForm[grid1][]', 'grid' => $this->getGrid()]); - $this->assertContains('name="MyForm[grid1_all]"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="MyForm[grid1_all]"', $column->renderHeaderCell()); $column = new CheckboxColumn(['name' => 'MyForm[grid1][key]', 'grid' => $this->getGrid()]); - $this->assertContains('name="MyForm[grid1][key_all]"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="MyForm[grid1][key_all]"', $column->renderHeaderCell()); $column = new CheckboxColumn(['name' => 'MyForm[grid1][key][]', 'grid' => $this->getGrid()]); - $this->assertContains('name="MyForm[grid1][key_all]"', $column->renderHeaderCell()); + $this->assertStringContainsString('name="MyForm[grid1][key_all]"', $column->renderHeaderCell()); } public function testInputValue() { $column = new CheckboxColumn(['grid' => $this->getGrid()]); - $this->assertContains('value="1"', $column->renderDataCell([], 1, 0)); - $this->assertContains('value="42"', $column->renderDataCell([], 42, 0)); - $this->assertContains('value="[1,42]"', $column->renderDataCell([], [1, 42], 0)); + $this->assertStringContainsString('value="1"', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('value="42"', $column->renderDataCell([], 42, 0)); + $this->assertStringContainsString('value="[1,42]"', $column->renderDataCell([], [1, 42], 0)); $column = new CheckboxColumn(['checkboxOptions' => ['value' => 42], 'grid' => $this->getGrid()]); - $this->assertNotContains('value="1"', $column->renderDataCell([], 1, 0)); - $this->assertContains('value="42"', $column->renderDataCell([], 1, 0)); + $this->assertStringNotContainsString('value="1"', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('value="42"', $column->renderDataCell([], 1, 0)); $column = new CheckboxColumn([ 'checkboxOptions' => function ($model, $key, $index, $column) { @@ -70,9 +70,9 @@ public function testInputValue() }, 'grid' => $this->getGrid(), ]); - $this->assertContains('value="1"', $column->renderDataCell([], 1, 0)); - $this->assertContains('value="42"', $column->renderDataCell([], 42, 0)); - $this->assertContains('value="[1,42]"', $column->renderDataCell([], [1, 42], 0)); + $this->assertStringContainsString('value="1"', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('value="42"', $column->renderDataCell([], 42, 0)); + $this->assertStringContainsString('value="[1,42]"', $column->renderDataCell([], [1, 42], 0)); $column = new CheckboxColumn([ 'checkboxOptions' => function ($model, $key, $index, $column) { @@ -80,8 +80,8 @@ public function testInputValue() }, 'grid' => $this->getGrid(), ]); - $this->assertNotContains('value="1"', $column->renderDataCell([], 1, 0)); - $this->assertContains('value="42"', $column->renderDataCell([], 1, 0)); + $this->assertStringNotContainsString('value="1"', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('value="42"', $column->renderDataCell([], 1, 0)); } public function testContent() @@ -92,7 +92,7 @@ public function testContent() }, 'grid' => $this->getGrid(), ]); - $this->assertContains('', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('', $column->renderDataCell([], 1, 0));; $column = new CheckboxColumn([ 'content' => function ($model, $key, $index, $column) { @@ -100,7 +100,7 @@ public function testContent() }, 'grid' => $this->getGrid(), ]); - $this->assertContains(Html::checkBox('checkBoxInput', false), $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString(Html::checkBox('checkBoxInput', false), $column->renderDataCell([], 1, 0)); } /** diff --git a/tests/framework/grid/GridViewTest.php b/tests/framework/grid/GridViewTest.php index b698011493b..e151e257d42 100644 --- a/tests/framework/grid/GridViewTest.php +++ b/tests/framework/grid/GridViewTest.php @@ -20,7 +20,7 @@ */ class GridViewTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication([ @@ -155,8 +155,9 @@ public function testFooter() { public function testHeaderLabels() { + $this->expectNotToPerformAssertions(); + // Ensure GridView does not call Model::generateAttributeLabel() to generate labels unless the labels are explicitly used. - $this->mockApplication([ 'components' => [ 'db' => [ @@ -198,7 +199,6 @@ public function testHeaderLabels() 'attributes' => ['attr1', 'attr2'], ]); $grid->renderTableHeader(); - // If NoAutoLabels::generateAttributeLabel() has not been called no exception will be thrown meaning this test passed successfully. } } diff --git a/tests/framework/grid/RadiobuttonColumnTest.php b/tests/framework/grid/RadiobuttonColumnTest.php index 51292d3d2ce..bdd15ccef67 100644 --- a/tests/framework/grid/RadiobuttonColumnTest.php +++ b/tests/framework/grid/RadiobuttonColumnTest.php @@ -22,12 +22,11 @@ */ class RadiobuttonColumnTest extends TestCase { - /** - * @expectedException \yii\base\InvalidConfigException - * @expectedExceptionMessage The "name" property must be set. - */ public function testException() { + $this->expectException(\yii\base\InvalidConfigException::class); + $this->expectExceptionMessage('The "name" property must be set.'); + new RadioButtonColumn([ 'name' => null, ]); @@ -67,14 +66,14 @@ public function testContent() return null; } ]); - $this->assertContains('', $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString('', $column->renderDataCell([], 1, 0)); $column = new RadioButtonColumn([ 'content' => function ($model, $key, $index, $column) { return Html::radio('radioButtonInput', false); } ]); - $this->assertContains(Html::radio('radioButtonInput', false), $column->renderDataCell([], 1, 0)); + $this->assertStringContainsString(Html::radio('radioButtonInput', false), $column->renderDataCell([], 1, 0)); } public function testMultipleInGrid() diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php index 0d706bc552f..593d4007be5 100644 --- a/tests/framework/helpers/ArrayHelperTest.php +++ b/tests/framework/helpers/ArrayHelperTest.php @@ -20,7 +20,7 @@ */ class ArrayHelperTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -136,14 +136,12 @@ public function testRemove() } /** + * @requires PHP < 8.1 + * * @return void */ public function testRemoveWithFloat() { - if (version_compare(PHP_VERSION, '8.1.0', '>=')) { - $this->markTestSkipped('Using floats as array key is deprecated.'); - } - $array = ['name' => 'b', 'age' => 3, 1.1 => null]; $name = ArrayHelper::remove($array, 'name'); @@ -527,14 +525,12 @@ public function testMergeEmpty() } /** + * @requires PHP < 8.1 + * * @see https://github.com/yiisoft/yii2/pull/11549 */ public function testGetValueWithFloatKeys() { - if (version_compare(PHP_VERSION, '8.1.0', '>=')) { - $this->markTestSkipped('Using floats as array key is deprecated.'); - } - $array = []; $array[1.1] = 'some value'; $array[2.1] = null; @@ -754,12 +750,11 @@ public function testKeyExists() $this->assertFalse(ArrayHelper::keyExists('c', $array, false)); } + /** + * @requires PHP < 8.1 + */ public function testKeyExistsWithFloat() { - if (version_compare(PHP_VERSION, '8.1.0', '>=')) { - $this->markTestSkipped('Using floats as array key is deprecated.'); - } - $array = [ 1 => 3, 2.2 => 4, // Note: Floats are cast to ints, which means that the fractional part will be truncated. @@ -876,13 +871,12 @@ public function testGetValueObjects() public function testGetValueNonexistingProperties1() { - if (PHP_VERSION_ID < 80000) { - $this->expectException('PHPUnit_Framework_Error_Notice'); - } else { - $this->expectException('PHPUnit_Framework_Error_Warning'); + try { + $object = new Post1(); + ArrayHelper::getValue($object, 'nonExisting'); + } catch (\Throwable $th) { + $this->assertEquals('Undefined property: yiiunit\framework\helpers\Post1::$nonExisting', $th->getMessage()); } - $object = new Post1(); - ArrayHelper::getValue($object, 'nonExisting'); } public function testGetValueNonexistingPropertiesForArrayObject() diff --git a/tests/framework/helpers/BaseConsoleTest.php b/tests/framework/helpers/BaseConsoleTest.php index d9a4391dc10..aa7bc11061e 100644 --- a/tests/framework/helpers/BaseConsoleTest.php +++ b/tests/framework/helpers/BaseConsoleTest.php @@ -12,7 +12,7 @@ */ class BaseConsoleTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/helpers/ConsoleTest.php b/tests/framework/helpers/ConsoleTest.php index cbd1b322ee5..eb16d3056c7 100644 --- a/tests/framework/helpers/ConsoleTest.php +++ b/tests/framework/helpers/ConsoleTest.php @@ -18,7 +18,7 @@ */ class ConsoleTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/helpers/FileHelperTest.php b/tests/framework/helpers/FileHelperTest.php index 448e6148fd4..d13e57e8218 100644 --- a/tests/framework/helpers/FileHelperTest.php +++ b/tests/framework/helpers/FileHelperTest.php @@ -21,7 +21,7 @@ class FileHelperTest extends TestCase */ private $testFilePath = ''; - public function setUp() + protected function setUp(): void { $this->testFilePath = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . get_class($this); $this->createDir($this->testFilePath); @@ -56,7 +56,7 @@ private function isChmodReliable() return $mode === '0700'; } - public function tearDown() + protected function tearDown(): void { $this->removeDir($this->testFilePath); } @@ -140,7 +140,7 @@ protected function createFileStructure(array $items, $basePath = '') */ protected function assertFileMode($expectedMode, $fileName, $message = '') { - $expectedMode = sprintf('%o', $expectedMode); + $expectedMode = sprintf('%04o', $expectedMode); $this->assertEquals($expectedMode, $this->getMode($fileName), $message); } @@ -258,7 +258,7 @@ public function testCopyDirectoryNotRecursive() $fileName = $dstDirName . DIRECTORY_SEPARATOR . $name; if (is_array($content)) { - $this->assertFileNotExists($fileName); + $this->assertFileDoesNotExist($fileName); } else { $this->assertFileExists($fileName); $this->assertStringEqualsFile($fileName, $content, 'Incorrect file content!'); @@ -359,6 +359,8 @@ public function testCopyDirToAnotherWithSameName() */ public function testCopyDirWithSameName() { + $this->expectNotToPerformAssertions(); + $this->createFileStructure([ 'data' => [], 'data-backup' => [], @@ -389,7 +391,7 @@ public function testRemoveDirectory() FileHelper::removeDirectory($dirName); - $this->assertFileNotExists($dirName, 'Unable to remove directory!'); + $this->assertFileDoesNotExist($dirName, 'Unable to remove directory!'); // should be silent about non-existing directories FileHelper::removeDirectory($basePath . DIRECTORY_SEPARATOR . 'nonExisting'); @@ -432,10 +434,10 @@ public function testRemoveDirectorySymlinks1() $this->assertTrue(is_dir($basePath . 'directory')); $this->assertFileExists($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory still have it's file $this->assertFalse(is_dir($basePath . 'symlinks')); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2'); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file'); $this->assertFalse(is_dir($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory')); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); } public function testRemoveDirectorySymlinks2() @@ -473,12 +475,12 @@ public function testRemoveDirectorySymlinks2() $this->assertFileExists($basePath . 'file'); $this->assertTrue(is_dir($basePath . 'directory')); - $this->assertFileNotExists($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory doesn't have it's file now + $this->assertFileDoesNotExist($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory doesn't have it's file now $this->assertFalse(is_dir($basePath . 'symlinks')); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2'); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file'); $this->assertFalse(is_dir($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory')); - $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); + $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); } public function testFindFiles() @@ -910,8 +912,8 @@ public function testCopyDirectoryNoEmptyDirectories() $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1'); $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'file1.txt'); $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'file2.txt'); - $this->assertFileNotExists($dstDirName . DIRECTORY_SEPARATOR . 'dir2'); - $this->assertFileNotExists($dstDirName . DIRECTORY_SEPARATOR . 'dir3'); + $this->assertFileDoesNotExist($dstDirName . DIRECTORY_SEPARATOR . 'dir2'); + $this->assertFileDoesNotExist($dstDirName . DIRECTORY_SEPARATOR . 'dir3'); } public function testFindDirectories() diff --git a/tests/framework/helpers/FormatConverterTest.php b/tests/framework/helpers/FormatConverterTest.php index dd8d470a1cd..42ed3acb1e9 100644 --- a/tests/framework/helpers/FormatConverterTest.php +++ b/tests/framework/helpers/FormatConverterTest.php @@ -19,7 +19,7 @@ */ class FormatConverterTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -31,7 +31,7 @@ protected function setUp() ]); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); IntlTestHelper::resetIntlStatus(); @@ -358,7 +358,7 @@ public function testIntlUtf8Ru() $formatter = new Formatter(['locale' => 'ru-RU']); // There is a dot after month name in updated ICU data and no dot in old data. Both are acceptable. // See https://github.com/yiisoft/yii2/issues/9906 - $this->assertRegExp('/24 авг\.? 2014 г\./', $formatter->asDate('2014-8-24', "dd MMM y 'г'.")); + $this->assertMatchesRegularExpression('/24 авг\.? 2014 г\./', $formatter->asDate('2014-8-24', "dd MMM y 'г'.")); } public function testPhpToICUMixedPatterns() diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index eef2f84bf7f..6bb38ccc653 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -19,7 +19,7 @@ */ class HtmlTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication([ @@ -1958,6 +1958,7 @@ public function testAttributeNameValidation($name, $expected) public function testAttributeNameException($name) { $this->expectException('yii\base\InvalidArgumentException'); + Html::getAttributeName($name); } @@ -1994,12 +1995,11 @@ public function testActiveFileInput() $this->assertEqualsWithoutLE($expected, $actual); } - /** - * @expectedException \yii\base\InvalidArgumentException - * @expectedExceptionMessage Attribute name must contain word characters only. - */ public function testGetAttributeValueInvalidArgumentException() { + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('Attribute name must contain word characters only.'); + $model = new HtmlTestModel(); Html::getAttributeValue($model, '-'); } @@ -2029,24 +2029,24 @@ public function testGetAttributeValue() $this->assertSame($expected, $actual); } - /** - * @expectedException \yii\base\InvalidArgumentException - * @expectedExceptionMessage Attribute name must contain word characters only. - */ public function testGetInputNameInvalidArgumentExceptionAttribute() { $model = new HtmlTestModel(); + + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('Attribute name must contain word characters only.'); + Html::getInputName($model, '-'); } - /** - * @expectedException \yii\base\InvalidArgumentException - * @expectedExceptionMessageRegExp /(.*)formName\(\) cannot be empty for tabular inputs.$/ - */ public function testGetInputNameInvalidArgumentExceptionFormName() { $model = $this->getMockBuilder('yii\\base\\Model')->getMock(); $model->method('formName')->willReturn(''); + + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('cannot be empty for tabular inputs.'); + Html::getInputName($model, '[foo]bar'); } @@ -2152,7 +2152,7 @@ public function testActiveTextInput_placeholderFillFromModel() $html = Html::activeTextInput($model, 'name', ['placeholder' => true]); - $this->assertContains('placeholder="Name"', $html); + $this->assertStringContainsString('placeholder="Name"', $html); } public function testActiveTextInput_customPlaceholder() @@ -2161,7 +2161,7 @@ public function testActiveTextInput_customPlaceholder() $html = Html::activeTextInput($model, 'name', ['placeholder' => 'Custom placeholder']); - $this->assertContains('placeholder="Custom placeholder"', $html); + $this->assertStringContainsString('placeholder="Custom placeholder"', $html); } public function testActiveTextInput_placeholderFillFromModelTabular() @@ -2170,7 +2170,7 @@ public function testActiveTextInput_placeholderFillFromModelTabular() $html = Html::activeTextInput($model, '[0]name', ['placeholder' => true]); - $this->assertContains('placeholder="Name"', $html); + $this->assertStringContainsString('placeholder="Name"', $html); } public function testOverrideSetActivePlaceholder() @@ -2179,11 +2179,13 @@ public function testOverrideSetActivePlaceholder() $html = MyHtml::activeTextInput($model, 'name', ['placeholder' => true]); - $this->assertContains('placeholder="My placeholder: Name"', $html); + $this->assertStringContainsString('placeholder="My placeholder: Name"', $html); } public function testGetInputIdDataProvider() { + $this->expectNotToPerformAssertions(); + return [ [ 'foo', @@ -2223,6 +2225,8 @@ public function testGetInputIdDataProvider() public function testGetInputIdByNameDataProvider() { + $this->expectNotToPerformAssertions(); + return [ [ 'foo', diff --git a/tests/framework/helpers/InflectorTest.php b/tests/framework/helpers/InflectorTest.php index 7b1632b9929..644660e7211 100644 --- a/tests/framework/helpers/InflectorTest.php +++ b/tests/framework/helpers/InflectorTest.php @@ -15,7 +15,7 @@ */ class InflectorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/helpers/IpHelperTest.php b/tests/framework/helpers/IpHelperTest.php index ac77758ec5f..ae90bb6a056 100644 --- a/tests/framework/helpers/IpHelperTest.php +++ b/tests/framework/helpers/IpHelperTest.php @@ -54,6 +54,8 @@ public function expandIpv6Provider() public function testIpv6ExpandingWithInvalidValue() { try { + $this->expectNotToPerformAssertions(); + IpHelper::expandIPv6('fa01::1/64'); } catch (\Exception $exception) { $this->assertStringEndsWith('Unrecognized address fa01::1/64', $exception->getMessage()); diff --git a/tests/framework/helpers/JsonTest.php b/tests/framework/helpers/JsonTest.php index f8150c764d8..0802bf948e6 100644 --- a/tests/framework/helpers/JsonTest.php +++ b/tests/framework/helpers/JsonTest.php @@ -19,7 +19,7 @@ */ class JsonTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -205,12 +205,13 @@ public function testDecode() } /** - * @expectedException \yii\base\InvalidArgumentException - * @expectedExceptionMessage Invalid JSON data. * @covers ::decode */ - public function testDecodeInvalidParamException() + public function testDecodeInvalidArgumentException() { + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid JSON data.'); + Json::decode([]); } diff --git a/tests/framework/helpers/MarkdownTest.php b/tests/framework/helpers/MarkdownTest.php index 7514e142362..49178481674 100644 --- a/tests/framework/helpers/MarkdownTest.php +++ b/tests/framework/helpers/MarkdownTest.php @@ -18,7 +18,7 @@ */ class MarkdownTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -43,12 +43,11 @@ public function testOriginalFlavor() $this->assertEquals(Markdown::process($text), Markdown::process($text, 'gfm-comment')); } - /** - * @expectedException \yii\base\InvalidParamException - * @expectedExceptionMessage Markdown flavor 'undefined' is not defined. - */ - public function testProcessInvalidParamException() + public function testProcessInvalidArgumentException() { + $this->expectException(\yii\base\InvalidArgumentException::class); + $this->expectExceptionMessage("Markdown flavor 'undefined' is not defined."); + Markdown::process('foo', 'undefined'); } diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index 94efbf67137..5f222ec4e7a 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -17,7 +17,7 @@ class StringHelperTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/helpers/UrlTest.php b/tests/framework/helpers/UrlTest.php index 0f2b6584eb9..1aca8a92850 100644 --- a/tests/framework/helpers/UrlTest.php +++ b/tests/framework/helpers/UrlTest.php @@ -22,7 +22,7 @@ */ class UrlTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication([ @@ -47,7 +47,7 @@ protected function setUp() ], '\yii\web\Application'); } - protected function tearDown() + protected function tearDown(): void { Yii::$app->getSession()->removeAll(); parent::tearDown(); @@ -268,7 +268,7 @@ public function testToWithSuffix() ['label' => 'Test', 'url' => ['/site/page', 'view' => 'about']], ], ]); - $this->assertRegExp('~~', $output); + $this->assertMatchesRegularExpression('~~', $output); } public function testBase() diff --git a/tests/framework/helpers/VarDumperTest.php b/tests/framework/helpers/VarDumperTest.php index 434876398a2..b8dd2e63cc6 100644 --- a/tests/framework/helpers/VarDumperTest.php +++ b/tests/framework/helpers/VarDumperTest.php @@ -16,7 +16,7 @@ */ class VarDumperTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -29,8 +29,8 @@ public function testDumpIncompleteObject() $serializedObj = 'O:16:"nonExistingClass":0:{}'; $incompleteObj = unserialize($serializedObj); $dumpResult = VarDumper::dumpAsString($incompleteObj); - $this->assertContains("__PHP_Incomplete_Class#1\n(", $dumpResult); - $this->assertContains('nonExistingClass', $dumpResult); + $this->assertStringContainsString("__PHP_Incomplete_Class#1\n(", $dumpResult); + $this->assertStringContainsString('nonExistingClass', $dumpResult); } public function testExportIncompleteObject() @@ -38,7 +38,7 @@ public function testExportIncompleteObject() $serializedObj = 'O:16:"nonExistingClass":0:{}'; $incompleteObj = unserialize($serializedObj); $exportResult = VarDumper::export($incompleteObj); - $this->assertContains('nonExistingClass', $exportResult); + $this->assertStringContainsString('nonExistingClass', $exportResult); } public function testDumpObject() @@ -50,9 +50,9 @@ public function testDumpObject() $obj->name = 'test-name'; $obj->price = 19; $dumpResult = VarDumper::dumpAsString($obj); - $this->assertContains("stdClass#1\n(", $dumpResult); - $this->assertContains("[name] => 'test-name'", $dumpResult); - $this->assertContains('[price] => 19', $dumpResult); + $this->assertStringContainsString("stdClass#1\n(", $dumpResult); + $this->assertStringContainsString("[name] => 'test-name'", $dumpResult); + $this->assertStringContainsString('[price] => 19', $dumpResult); } /** @@ -197,7 +197,7 @@ public function testDumpClassWithCustomDebugInfo() $object->unitPrice = 15; $dumpResult = VarDumper::dumpAsString($object); - $this->assertContains('totalPrice', $dumpResult); - $this->assertNotContains('unitPrice', $dumpResult); + $this->assertStringContainsString('totalPrice', $dumpResult); + $this->assertStringNotContainsString('unitPrice', $dumpResult); } } diff --git a/tests/framework/i18n/DbMessageSourceTest.php b/tests/framework/i18n/DbMessageSourceTest.php index e295365ed86..8e4dd725e87 100644 --- a/tests/framework/i18n/DbMessageSourceTest.php +++ b/tests/framework/i18n/DbMessageSourceTest.php @@ -73,7 +73,7 @@ protected static function runConsoleAction($route, $params = []) } } - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $databases = static::getParam('databases'); @@ -104,7 +104,7 @@ public static function setUpBeforeClass() static::$db->createCommand()->insert('message', ['id' => 5, 'language' => 'ru', 'translation' => 'На диване {n, plural, =0{нет кошек} =1{лежит одна кошка} one{лежит # кошка} few{лежит # кошки} many{лежит # кошек} other{лежит # кошки}}!'])->execute(); } - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]); if (static::$db) { diff --git a/tests/framework/i18n/FormatterDateTest.php b/tests/framework/i18n/FormatterDateTest.php index ef488433572..c62ff491b11 100644 --- a/tests/framework/i18n/FormatterDateTest.php +++ b/tests/framework/i18n/FormatterDateTest.php @@ -22,7 +22,7 @@ class FormatterDateTest extends TestCase */ protected $formatter; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -35,7 +35,7 @@ protected function setUp() $this->formatter = new Formatter(['locale' => 'en-US']); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); IntlTestHelper::resetIntlStatus(); @@ -170,22 +170,22 @@ public function testIntlAsDatetime() // empty input $this->formatter->locale = 'de-DE'; - $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime('')); - $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(0)); - $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(false)); + $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime('')); + $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(0)); + $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(false)); } public function testAsDatetime() { $value = time(); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value)), $this->sanitizeWhitespaces($this->formatter->asDatetime($value)) ); $this->assertSame(date('Y/m/d h:i:s A', $value), $this->formatter->asDatetime($value, 'php:Y/m/d h:i:s A')); $value = new DateTime(); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())), $this->sanitizeWhitespaces($this->formatter->asDatetime($value)) ); @@ -195,7 +195,7 @@ public function testAsDatetime() $value = new DateTime(); $date = $value->format('Y-m-d'); $value = new DateTime($date); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())), $this->sanitizeWhitespaces($this->formatter->asDatetime($date)) ); @@ -203,7 +203,7 @@ public function testAsDatetime() if (PHP_VERSION_ID >= 50500) { $value = new \DateTimeImmutable(); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())), $this->sanitizeWhitespaces($this->formatter->asDatetime($value)) ); @@ -217,15 +217,15 @@ public function testAsDatetime() } // empty input - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'), $this->sanitizeWhitespaces($this->formatter->asDatetime('')) ); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'), $this->sanitizeWhitespaces($this->formatter->asDatetime(0)) ); - $this->assertRegExp( + $this->assertMatchesRegularExpression( $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'), $this->sanitizeWhitespaces($this->formatter->asDatetime(false)) ); diff --git a/tests/framework/i18n/FormatterNumberTest.php b/tests/framework/i18n/FormatterNumberTest.php index 234c9a5ea24..e572adb9021 100755 --- a/tests/framework/i18n/FormatterNumberTest.php +++ b/tests/framework/i18n/FormatterNumberTest.php @@ -22,7 +22,7 @@ class FormatterNumberTest extends TestCase */ protected $formatter; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -35,7 +35,7 @@ protected function setUp() $this->formatter = new Formatter(['locale' => 'en-US']); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); IntlTestHelper::resetIntlStatus(); diff --git a/tests/framework/i18n/FormatterTest.php b/tests/framework/i18n/FormatterTest.php index a44b74aec60..83d4f884212 100644 --- a/tests/framework/i18n/FormatterTest.php +++ b/tests/framework/i18n/FormatterTest.php @@ -24,7 +24,7 @@ class FormatterTest extends TestCase */ protected $formatter; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -39,7 +39,7 @@ protected function setUp() } } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); IntlTestHelper::resetIntlStatus(); diff --git a/tests/framework/i18n/GettextPoFileTest.php b/tests/framework/i18n/GettextPoFileTest.php index 2c202fad235..81a93e889ca 100644 --- a/tests/framework/i18n/GettextPoFileTest.php +++ b/tests/framework/i18n/GettextPoFileTest.php @@ -15,7 +15,7 @@ */ class GettextPoFileTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/i18n/I18NTest.php b/tests/framework/i18n/I18NTest.php index 77a514acaf0..c95ed2248ab 100644 --- a/tests/framework/i18n/I18NTest.php +++ b/tests/framework/i18n/I18NTest.php @@ -25,7 +25,7 @@ class I18NTest extends TestCase */ public $i18n; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/i18n/LocaleTest.php b/tests/framework/i18n/LocaleTest.php index 60d1951eca9..2e5ef84ebaa 100644 --- a/tests/framework/i18n/LocaleTest.php +++ b/tests/framework/i18n/LocaleTest.php @@ -20,7 +20,7 @@ class LocaleTest extends TestCase */ protected $locale; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -31,7 +31,7 @@ protected function setUp() $this->locale = new Locale(['locale' => 'en-US']); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); $this->locale = null; diff --git a/tests/framework/log/DbTargetTest.php b/tests/framework/log/DbTargetTest.php index 9d118d21bc1..853623963da 100644 --- a/tests/framework/log/DbTargetTest.php +++ b/tests/framework/log/DbTargetTest.php @@ -64,7 +64,7 @@ protected static function runConsoleAction($route, $params = []) } } - public function setUp() + protected function setUp(): void { parent::setUp(); $databases = static::getParam('databases'); @@ -78,7 +78,7 @@ public function setUp() static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/log/migrations/', 'interactive' => false]); } - public function tearDown() + protected function tearDown(): void { self::getConnection()->createCommand()->truncateTable(self::$logTable)->execute(); static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/log/migrations/', 'interactive' => false]); diff --git a/tests/framework/log/DispatcherTest.php b/tests/framework/log/DispatcherTest.php index 5cb35b52e3c..24af341a79d 100644 --- a/tests/framework/log/DispatcherTest.php +++ b/tests/framework/log/DispatcherTest.php @@ -52,7 +52,7 @@ class DispatcherTest extends TestCase */ public static $functions = []; - protected function setUp() + protected function setUp(): void { static::$microtimeIsMocked = false; $this->dispatcher = new Dispatcher(); diff --git a/tests/framework/log/EmailTargetTest.php b/tests/framework/log/EmailTargetTest.php index 7c3b4e008f2..a60046b6cd8 100644 --- a/tests/framework/log/EmailTargetTest.php +++ b/tests/framework/log/EmailTargetTest.php @@ -24,7 +24,7 @@ class EmailTargetTest extends TestCase /** * Set up mailer. */ - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mailer = $this->getMockBuilder('yii\\mail\\BaseMailer') @@ -38,16 +38,17 @@ protected function setUp() public function testInitWithOptionTo() { $target = new EmailTarget(['mailer' => $this->mailer, 'message' => ['to' => 'developer1@example.com']]); - $this->assertInternalType('object', $target); // should be no exception during `init()` + $this->assertIsObject($target); // should be no exception during `init()` } /** * @covers \yii\log\EmailTarget::init() - * @expectedException \yii\base\InvalidConfigException - * @expectedExceptionMessage The "to" option must be set for EmailTarget::message. */ public function testInitWithoutOptionTo() { + $this->expectException(\yii\base\InvalidConfigException::class); + $this->expectExceptionMessage('The "to" option must be set for EmailTarget::message.'); + new EmailTarget(['mailer' => $this->mailer]); } diff --git a/tests/framework/log/FileTargetTest.php b/tests/framework/log/FileTargetTest.php index 4f6eaf4ae75..6c23837f23c 100644 --- a/tests/framework/log/FileTargetTest.php +++ b/tests/framework/log/FileTargetTest.php @@ -20,7 +20,7 @@ */ class FileTargetTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -37,7 +37,7 @@ public function testInit() new FileTarget([ 'logFile' => Yii::getAlias('@yiiunit/runtime/log/filetargettest.log'), ]); - $this->assertFileNotExists( + $this->assertFileDoesNotExist( dirname($logFile), 'Log directory should not be created during init process' ); @@ -72,10 +72,10 @@ public function testRotate() clearstatcache(); $this->assertFileExists($logFile); - $this->assertFileNotExists($logFile . '.1'); - $this->assertFileNotExists($logFile . '.2'); - $this->assertFileNotExists($logFile . '.3'); - $this->assertFileNotExists($logFile . '.4'); + $this->assertFileDoesNotExist($logFile . '.1'); + $this->assertFileDoesNotExist($logFile . '.2'); + $this->assertFileDoesNotExist($logFile . '.3'); + $this->assertFileDoesNotExist($logFile . '.4'); // exceed max size for ($i = 0; $i < 1024; $i++) { @@ -92,9 +92,9 @@ public function testRotate() $this->assertFileExists($logFile); $this->assertFileExists($logFile . '.1'); - $this->assertFileNotExists($logFile . '.2'); - $this->assertFileNotExists($logFile . '.3'); - $this->assertFileNotExists($logFile . '.4'); + $this->assertFileDoesNotExist($logFile . '.2'); + $this->assertFileDoesNotExist($logFile . '.3'); + $this->assertFileDoesNotExist($logFile . '.4'); // second rotate @@ -107,9 +107,9 @@ public function testRotate() $this->assertFileExists($logFile); $this->assertFileExists($logFile . '.1'); - $this->assertFileNotExists($logFile . '.2'); - $this->assertFileNotExists($logFile . '.3'); - $this->assertFileNotExists($logFile . '.4'); + $this->assertFileDoesNotExist($logFile . '.2'); + $this->assertFileDoesNotExist($logFile . '.3'); + $this->assertFileDoesNotExist($logFile . '.4'); } public function testLogEmptyStrings() @@ -142,17 +142,17 @@ public function testLogEmptyStrings() $logger->messages = array_fill(0, 1, 'yyy'); $logger->export(); - $this->assertFileNotExists($logFile); + $this->assertFileDoesNotExist($logFile); $logger->messages = array_fill(0, 10, ''); $logger->export(); - $this->assertFileNotExists($logFile); + $this->assertFileDoesNotExist($logFile); $logger->messages = array_fill(0, 10, null); $logger->export(); - $this->assertFileNotExists($logFile); + $this->assertFileDoesNotExist($logFile); } private function clearLogFile($logFile) diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php index d5ffa83aca4..3238ea0afd7 100644 --- a/tests/framework/log/LoggerTest.php +++ b/tests/framework/log/LoggerTest.php @@ -26,7 +26,7 @@ class LoggerTest extends TestCase */ protected $dispatcher; - protected function setUp() + protected function setUp(): void { $this->logger = new Logger(); $this->dispatcher = $this->getMockBuilder('yii\log\Dispatcher') diff --git a/tests/framework/log/SyslogTargetTest.php b/tests/framework/log/SyslogTargetTest.php index 3c9efd10aec..384b51ec5d7 100644 --- a/tests/framework/log/SyslogTargetTest.php +++ b/tests/framework/log/SyslogTargetTest.php @@ -52,7 +52,7 @@ class SyslogTargetTest extends TestCase /** * Set up syslogTarget as the mock object. */ - protected function setUp() + protected function setUp(): void { $this->syslogTarget = $this->getMockBuilder('yii\\log\\SyslogTarget') ->setMethods(['getMessagePrefix']) diff --git a/tests/framework/log/TargetTest.php b/tests/framework/log/TargetTest.php index 30480bb2f73..7548092b788 100644 --- a/tests/framework/log/TargetTest.php +++ b/tests/framework/log/TargetTest.php @@ -123,23 +123,23 @@ public function testGetContextMessage() 'C_c' => 1, ]; $context = $target->getContextMessage(); - $this->assertContains('A_a', $context); - $this->assertNotContains('A_b', $context); - $this->assertContains('A_c', $context); - $this->assertContains('B_a', $context); - $this->assertNotContains('B_b', $context); - $this->assertNotContains('B_c', $context); - $this->assertContains('C_a', $context); - $this->assertContains('C_b', $context); - $this->assertContains('C_c', $context); - $this->assertNotContains('D_a', $context); - $this->assertNotContains('D_b', $context); - $this->assertNotContains('D_c', $context); - $this->assertNotContains('E_a', $context); - $this->assertNotContains('E_b', $context); - $this->assertNotContains('E_c', $context); - $this->assertNotContains('mySecret', $context); - $this->assertContains('***', $context); + $this->assertStringContainsString('A_a', $context); + $this->assertStringNotContainsString('A_b', $context); + $this->assertStringContainsString('A_c', $context); + $this->assertStringContainsString('B_a', $context); + $this->assertStringNotContainsString('B_b', $context); + $this->assertStringNotContainsString('B_c', $context); + $this->assertStringContainsString('C_a', $context); + $this->assertStringContainsString('C_b', $context); + $this->assertStringContainsString('C_c', $context); + $this->assertStringNotContainsString('D_a', $context); + $this->assertStringNotContainsString('D_b', $context); + $this->assertStringNotContainsString('D_c', $context); + $this->assertStringNotContainsString('E_a', $context); + $this->assertStringNotContainsString('E_b', $context); + $this->assertStringNotContainsString('E_c', $context); + $this->assertStringNotContainsString('mySecret', $context); + $this->assertStringContainsString('***', $context); } /** diff --git a/tests/framework/mail/BaseMailerTest.php b/tests/framework/mail/BaseMailerTest.php index dc7e43deb0e..e0c388027b3 100644 --- a/tests/framework/mail/BaseMailerTest.php +++ b/tests/framework/mail/BaseMailerTest.php @@ -19,7 +19,7 @@ */ class BaseMailerTest extends TestCase { - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ @@ -32,7 +32,7 @@ public function setUp() } } - public function tearDown() + protected function tearDown(): void { $filePath = $this->getTestFilePath(); if (file_exists($filePath)) { @@ -85,7 +85,7 @@ public function testSetupView() ]; $mailer->setView($viewConfig); $view = $mailer->getView(); - $this->assertInternalType('object', $view, 'Unable to setup view via config!'); + $this->assertIsObject($view, 'Unable to setup view via config!'); $this->assertEquals($viewConfig['params'], $view->params, 'Unable to configure view via config array!'); } @@ -96,14 +96,14 @@ public function testGetDefaultView() { $mailer = new Mailer(); $view = $mailer->getView(); - $this->assertInternalType('object', $view, 'Unable to get default view!'); + $this->assertIsObject($view, 'Unable to get default view!'); } public function testCreateMessage() { $mailer = new Mailer(); $message = $mailer->compose(); - $this->assertInternalType('object', $message, 'Unable to create message instance!'); + $this->assertIsObject($message, 'Unable to create message instance!'); $this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!'); } diff --git a/tests/framework/mail/BaseMessageTest.php b/tests/framework/mail/BaseMessageTest.php index 9741f5d66d7..32bf2dcd31b 100644 --- a/tests/framework/mail/BaseMessageTest.php +++ b/tests/framework/mail/BaseMessageTest.php @@ -17,7 +17,7 @@ */ class BaseMessageTest extends TestCase { - public function setUp() + protected function setUp(): void { $this->mockApplication([ 'components' => [ diff --git a/tests/framework/mutex/FileMutexTest.php b/tests/framework/mutex/FileMutexTest.php index 48e3778c6ec..60947e750aa 100644 --- a/tests/framework/mutex/FileMutexTest.php +++ b/tests/framework/mutex/FileMutexTest.php @@ -47,6 +47,6 @@ public function testDeleteLockFile($mutexName) $this->assertFileExists($fileName); $mutex->release($mutexName); - $this->assertFileNotExists($fileName); + $this->assertFileDoesNotExist($fileName); } } diff --git a/tests/framework/rbac/DbManagerTestCase.php b/tests/framework/rbac/DbManagerTestCase.php index bb5debaddc8..f1063ebe0f4 100644 --- a/tests/framework/rbac/DbManagerTestCase.php +++ b/tests/framework/rbac/DbManagerTestCase.php @@ -36,6 +36,20 @@ abstract class DbManagerTestCase extends ManagerTestCase */ protected $db; + public function testGetAssignmentsByRole() + { + $this->prepareData(); + $reader = $this->auth->getRole('reader'); + $this->auth->assign($reader, 123); + + $this->auth = $this->createManager(); + + $this->assertEquals([], $this->auth->getUserIdsByRole('nonexisting')); + $this->assertEquals(['123', 'reader A'], $this->auth->getUserIdsByRole('reader'), '', 0.0, 10, true); + $this->assertEquals(['author B'], $this->auth->getUserIdsByRole('author')); + $this->assertEquals(['admin C'], $this->auth->getUserIdsByRole('admin')); + } + protected static function runConsoleAction($route, $params = []) { if (Yii::$app === null) { @@ -67,7 +81,7 @@ protected static function runConsoleAction($route, $params = []) } } - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $databases = static::getParam('databases'); @@ -81,13 +95,13 @@ public static function setUpBeforeClass() static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]); } - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { static::runConsoleAction('migrate/down', ['all', 'migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]); parent::tearDownAfterClass(); } - protected function setUp() + protected function setUp(): void { if (defined('HHVM_VERSION') && static::$driverName === 'pgsql') { static::markTestSkipped('HHVM PDO for pgsql does not work with binary columns, which are essential for rbac schema. See https://github.com/yiisoft/yii2/issues/14244'); @@ -96,7 +110,7 @@ protected function setUp() $this->auth = $this->createManager(); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); $this->auth->removeAll(); @@ -393,7 +407,10 @@ private function assertSingleQueryToAssignmentsTable($logTarget) return strpos($message[0], 'auth_assignment') !== false; }); $this->assertCount(1, $messages, 'Only one query should have been performed, but there are the following logs: ' . print_r($logTarget->messages, true)); - $this->assertContains('auth_assignment', $messages[0][0], 'Log message should be a query to auth_assignment table'); + $this->assertStringContainsString( + 'auth_assignment', + $messages[0][0], 'Log message should be a query to auth_assignment table', + ); $logTarget->messages = []; } } diff --git a/tests/framework/rbac/ManagerTestCase.php b/tests/framework/rbac/ManagerTestCase.php index e68378c541e..8c5ead7b544 100644 --- a/tests/framework/rbac/ManagerTestCase.php +++ b/tests/framework/rbac/ManagerTestCase.php @@ -373,8 +373,16 @@ public function testAssignMultipleRoles() $roleNames[] = $role->name; } - $this->assertContains('reader', $roleNames, 'Roles should contain reader. Currently it has: ' . implode(', ', $roleNames)); - $this->assertContains('author', $roleNames, 'Roles should contain author. Currently it has: ' . implode(', ', $roleNames)); + $this->assertContains( + 'reader', + $roleNames, + 'Roles should contain reader. Currently it has: ' . implode(', ', $roleNames) + ); + $this->assertContains( + 'author', + $roleNames, + 'Roles should contain author. Currently it has: ' . implode(', ', $roleNames) + ); } public function testAssignmentsToIntegerId() diff --git a/tests/framework/rbac/PhpManagerTest.php b/tests/framework/rbac/PhpManagerTest.php index 38107d26a84..e27b74420f5 100644 --- a/tests/framework/rbac/PhpManagerTest.php +++ b/tests/framework/rbac/PhpManagerTest.php @@ -74,7 +74,7 @@ protected function createManager() ]); } - protected function setUp() + protected function setUp(): void { static::$filemtime = null; static::$time = null; @@ -89,7 +89,7 @@ protected function setUp() $this->auth = $this->createManager(); } - protected function tearDown() + protected function tearDown(): void { $this->removeDataFiles(); static::$filemtime = null; @@ -136,15 +136,16 @@ public function testUpdateDescription() $this->assertTrue($this->auth->update($name, $permission), 'You should be able to save w/o changing name.'); } - /** - * @expectedException \yii\base\InvalidParamException - */ public function testOverwriteName() { $this->prepareData(); + $name = 'readPost'; $permission = $this->auth->getPermission($name); $permission->name = 'createPost'; + + $this->expectException('yii\base\InvalidParamException'); + $this->auth->update($name, $permission); } @@ -154,11 +155,11 @@ public function testSaveAssignments() $role = $this->auth->createRole('Admin'); $this->auth->add($role); $this->auth->assign($role, 13); - $this->assertContains('Admin', file_get_contents($this->getAssignmentFile())); + $this->assertStringContainsString('Admin', file_get_contents($this->getAssignmentFile())); $role->name = 'NewAdmin'; $this->auth->update('Admin', $role); - $this->assertContains('NewAdmin', file_get_contents($this->getAssignmentFile())); + $this->assertStringContainsString('NewAdmin', file_get_contents($this->getAssignmentFile())); $this->auth->remove($role); - $this->assertNotContains('NewAdmin', file_get_contents($this->getAssignmentFile())); + $this->assertStringNotContainsString('NewAdmin', file_get_contents($this->getAssignmentFile())); } } diff --git a/tests/framework/rest/IndexActionTest.php b/tests/framework/rest/IndexActionTest.php index d6481aa10e2..2b703d5494e 100644 --- a/tests/framework/rest/IndexActionTest.php +++ b/tests/framework/rest/IndexActionTest.php @@ -18,7 +18,7 @@ */ class IndexActionTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockWebApplication([ diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 217d7fbf7a9..91b627b8f8e 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -18,7 +18,7 @@ */ class SerializerTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication([ diff --git a/tests/framework/rest/UrlRuleTest.php b/tests/framework/rest/UrlRuleTest.php index 0228742ce18..f2c5b4b6a89 100644 --- a/tests/framework/rest/UrlRuleTest.php +++ b/tests/framework/rest/UrlRuleTest.php @@ -20,7 +20,7 @@ */ class UrlRuleTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -415,6 +415,8 @@ public function testGetCreateUrlStatus($ruleConfig, $tests) */ public function testGetCreateUrlStatusProvider() { + $this->expectNotToPerformAssertions(); + return [ 'single controller' => [ // rule properties diff --git a/tests/framework/test/ActiveFixtureTest.php b/tests/framework/test/ActiveFixtureTest.php index ba52d0e286d..c659e6958cf 100644 --- a/tests/framework/test/ActiveFixtureTest.php +++ b/tests/framework/test/ActiveFixtureTest.php @@ -23,7 +23,7 @@ class ActiveFixtureTest extends DatabaseTestCase { protected $driverName = 'mysql'; - public function setUp() + protected function setUp(): void { parent::setUp(); $db = $this->getConnection(); @@ -31,7 +31,7 @@ public function setUp() ActiveRecord::$db = $db; } - public function tearDown() + protected function tearDown(): void { parent::tearDown(); } @@ -205,12 +205,12 @@ class BaseDbTestCase { use FixtureTrait; - public function setUp() + public function setUp(): void { $this->initFixtures(); } - public function tearDown() + public function tearDown(): void { } } diff --git a/tests/framework/test/ArrayFixtureTest.php b/tests/framework/test/ArrayFixtureTest.php index 50ec62c3282..669dbc6cbce 100644 --- a/tests/framework/test/ArrayFixtureTest.php +++ b/tests/framework/test/ArrayFixtureTest.php @@ -20,7 +20,7 @@ class ArrayFixtureTest extends TestCase */ private $_fixture; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->_fixture = new ArrayFixture(); @@ -47,12 +47,12 @@ public function testNothingToLoad() $this->assertEmpty($this->_fixture->data, 'fixture data should not be loaded'); } - /** - * @expectedException \yii\base\InvalidConfigException - */ public function testWrongDataFileException() { $this->_fixture->dataFile = 'wrong/fixtures/data/path/alias'; + + $this->expectException(\yii\base\InvalidConfigException::class); + $this->_fixture->load(); } } diff --git a/tests/framework/test/FixtureTest.php b/tests/framework/test/FixtureTest.php index 25c57bc5537..6ec23bae974 100644 --- a/tests/framework/test/FixtureTest.php +++ b/tests/framework/test/FixtureTest.php @@ -90,12 +90,12 @@ class MyTestCase public static $load; public static $unload; - public function setUp() + public function setUp(): void { $this->loadFixtures(); } - public function tearDown() + public function tearDown(): void { $this->unloadFixtures(); } diff --git a/tests/framework/validators/BooleanValidatorTest.php b/tests/framework/validators/BooleanValidatorTest.php index 63331f6136f..0405a518967 100644 --- a/tests/framework/validators/BooleanValidatorTest.php +++ b/tests/framework/validators/BooleanValidatorTest.php @@ -17,7 +17,7 @@ */ class BooleanValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/CompareValidatorTest.php b/tests/framework/validators/CompareValidatorTest.php index 2b600889d8c..69bc01b4c51 100644 --- a/tests/framework/validators/CompareValidatorTest.php +++ b/tests/framework/validators/CompareValidatorTest.php @@ -17,7 +17,7 @@ */ class CompareValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/DateValidatorTest.php b/tests/framework/validators/DateValidatorTest.php index fc3cd1ef3d6..c00017cb46c 100644 --- a/tests/framework/validators/DateValidatorTest.php +++ b/tests/framework/validators/DateValidatorTest.php @@ -18,7 +18,7 @@ */ class DateValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -30,7 +30,7 @@ protected function setUp() ]); } - protected function tearDown() + protected function tearDown(): void { parent::tearDown(); IntlTestHelper::resetIntlStatus(); diff --git a/tests/framework/validators/DefaultValueValidatorTest.php b/tests/framework/validators/DefaultValueValidatorTest.php index 9b25a1166ee..a76207b7f58 100644 --- a/tests/framework/validators/DefaultValueValidatorTest.php +++ b/tests/framework/validators/DefaultValueValidatorTest.php @@ -15,7 +15,7 @@ */ class DefaultValueValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/EachValidatorTest.php b/tests/framework/validators/EachValidatorTest.php index 8e32327b2f3..05475f8475f 100644 --- a/tests/framework/validators/EachValidatorTest.php +++ b/tests/framework/validators/EachValidatorTest.php @@ -20,7 +20,7 @@ */ class EachValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -76,12 +76,12 @@ public function testAllowMessageFromRule() $validator->allowMessageFromRule = true; $validator->validateAttribute($model, 'attr_one'); - $this->assertContains('integer', $model->getFirstError('attr_one')); + $this->assertStringContainsString('integer', $model->getFirstError('attr_one')); $model->clearErrors(); $validator->allowMessageFromRule = false; $validator->validateAttribute($model, 'attr_one'); - $this->assertNotContains('integer', $model->getFirstError('attr_one')); + $this->assertStringNotContainsString('integer', $model->getFirstError('attr_one')); } /** @@ -212,11 +212,6 @@ public function testValidateArrayAccess() */ public function testTypedProperties() { - if (PHP_VERSION_ID < 70400) { - $this->markTestSkipped('Can not be tested on PHP < 7.4'); - return; - } - $model = new ValidatorTestTypedPropModel(); $validator = new EachValidator(['rule' => ['boolean']]); diff --git a/tests/framework/validators/EmailValidatorTest.php b/tests/framework/validators/EmailValidatorTest.php index 7687b2bdc8f..fcf3b020871 100644 --- a/tests/framework/validators/EmailValidatorTest.php +++ b/tests/framework/validators/EmailValidatorTest.php @@ -16,7 +16,7 @@ */ class EmailValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/ExistValidatorTest.php b/tests/framework/validators/ExistValidatorTest.php index 259efe86e0d..1fc2e27b5ec 100644 --- a/tests/framework/validators/ExistValidatorTest.php +++ b/tests/framework/validators/ExistValidatorTest.php @@ -19,7 +19,7 @@ abstract class ExistValidatorTest extends DatabaseTestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/FileValidatorTest.php b/tests/framework/validators/FileValidatorTest.php index 157269e5d41..c25ed2c8312 100644 --- a/tests/framework/validators/FileValidatorTest.php +++ b/tests/framework/validators/FileValidatorTest.php @@ -19,7 +19,7 @@ */ class FileValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -29,7 +29,7 @@ public function testAssureMessagesSetOnInit() { $val = new FileValidator(); foreach (['message', 'uploadRequired', 'tooMany', 'wrongExtension', 'tooBig', 'tooSmall', 'wrongMimeType'] as $attr) { - $this->assertInternalType('string', $val->$attr); + $this->assertIsString($val->$attr); } } @@ -654,7 +654,9 @@ public function testValidateAttributeErrNoTmpDir() * @dataProvider mimeTypeCaseInsensitive */ public function testValidateMimeTypeCaseInsensitive($mask, $fileMimeType, $expected) { - $validator = $this->getMock('\yii\validators\FileValidator', ['getMimeTypeByFile']); + $validator = $this->getMockBuilder(\yii\validators\FileValidator::class) + ->onlyMethods(['getMimeTypeByFile']) + ->getMock(); $validator->method('getMimeTypeByFile')->willReturn($fileMimeType); $validator->mimeTypes = [$mask]; diff --git a/tests/framework/validators/FilterValidatorTest.php b/tests/framework/validators/FilterValidatorTest.php index 06153d934a3..f574f259b5a 100644 --- a/tests/framework/validators/FilterValidatorTest.php +++ b/tests/framework/validators/FilterValidatorTest.php @@ -16,7 +16,7 @@ */ class FilterValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); // destroy application, Validator must work without Yii::$app diff --git a/tests/framework/validators/IpValidatorTest.php b/tests/framework/validators/IpValidatorTest.php index a6a365ffb46..b99f6ad6c36 100644 --- a/tests/framework/validators/IpValidatorTest.php +++ b/tests/framework/validators/IpValidatorTest.php @@ -16,7 +16,7 @@ */ class IpValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); // destroy application, Validator must work without Yii::$app diff --git a/tests/framework/validators/NumberValidatorTest.php b/tests/framework/validators/NumberValidatorTest.php index 826eb9cf915..7114e167351 100644 --- a/tests/framework/validators/NumberValidatorTest.php +++ b/tests/framework/validators/NumberValidatorTest.php @@ -48,7 +48,7 @@ private function restoreLocale() setlocale(LC_NUMERIC, $this->oldLocale); } - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -519,8 +519,8 @@ public function testClientValidateComparison() ]); $model = new FakedValidationModel(); $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); - $this->assertContains('"min":5', $js); - $this->assertContains('"max":10', $js); + $this->assertStringContainsString('"min":5', $js); + $this->assertStringContainsString('"max":10', $js); $val = new NumberValidator([ 'min' => '5', @@ -528,8 +528,8 @@ public function testClientValidateComparison() ]); $model = new FakedValidationModel(); $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); - $this->assertContains('"min":5', $js); - $this->assertContains('"max":10', $js); + $this->assertStringContainsString('"min":5', $js); + $this->assertStringContainsString('"max":10', $js); $val = new NumberValidator([ 'min' => 5.65, @@ -537,8 +537,8 @@ public function testClientValidateComparison() ]); $model = new FakedValidationModel(); $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); - $this->assertContains('"min":5.65', $js); - $this->assertContains('"max":13.37', $js); + $this->assertStringContainsString('"min":5.65', $js); + $this->assertStringContainsString('"max":13.37', $js); $val = new NumberValidator([ 'min' => '5.65', @@ -546,8 +546,8 @@ public function testClientValidateComparison() ]); $model = new FakedValidationModel(); $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); - $this->assertContains('"min":5.65', $js); - $this->assertContains('"max":13.37', $js); + $this->assertStringContainsString('"min":5.65', $js); + $this->assertStringContainsString('"max":13.37', $js); } public function testValidateObject() diff --git a/tests/framework/validators/RangeValidatorTest.php b/tests/framework/validators/RangeValidatorTest.php index d86e0224e2b..67d843dc005 100644 --- a/tests/framework/validators/RangeValidatorTest.php +++ b/tests/framework/validators/RangeValidatorTest.php @@ -16,7 +16,7 @@ */ class RangeValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -34,7 +34,7 @@ public function testInitException() public function testAssureMessageSetOnInit() { $val = new RangeValidator(['range' => []]); - $this->assertInternalType('string', $val->message); + $this->assertIsString($val->message); } public function testValidateValue() diff --git a/tests/framework/validators/RegularExpressionValidatorTest.php b/tests/framework/validators/RegularExpressionValidatorTest.php index 76166d45a01..847f83724fc 100644 --- a/tests/framework/validators/RegularExpressionValidatorTest.php +++ b/tests/framework/validators/RegularExpressionValidatorTest.php @@ -16,7 +16,7 @@ */ class RegularExpressionValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -50,7 +50,7 @@ public function testValidateAttribute() public function testMessageSetOnInit() { $val = new RegularExpressionValidator(['pattern' => '/^[a-zA-Z0-9](\.)?([^\/]*)$/m']); - $this->assertInternalType('string', $val->message); + $this->assertIsString($val->message); } public function testInitException() diff --git a/tests/framework/validators/RequiredValidatorTest.php b/tests/framework/validators/RequiredValidatorTest.php index a45f3b10ef9..93a23837e45 100644 --- a/tests/framework/validators/RequiredValidatorTest.php +++ b/tests/framework/validators/RequiredValidatorTest.php @@ -17,7 +17,7 @@ */ class RequiredValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/StringValidatorTest.php b/tests/framework/validators/StringValidatorTest.php index bef0db0deb3..f24719d40f1 100644 --- a/tests/framework/validators/StringValidatorTest.php +++ b/tests/framework/validators/StringValidatorTest.php @@ -16,7 +16,7 @@ */ class StringValidatorTest extends TestCase { - public function setUp() + protected function setUp(): void { parent::setUp(); @@ -112,9 +112,9 @@ public function testValidateAttribute() public function testEnsureMessagesOnInit() { $val = new StringValidator(['min' => 1, 'max' => 2]); - $this->assertInternalType('string', $val->message); - $this->assertInternalType('string', $val->tooLong); - $this->assertInternalType('string', $val->tooShort); + $this->assertIsString($val->message); + $this->assertIsString($val->tooLong); + $this->assertIsString($val->tooShort); } public function testCustomErrorMessageInValidateAttribute() diff --git a/tests/framework/validators/UniqueValidatorTest.php b/tests/framework/validators/UniqueValidatorTest.php index 0c5149e5887..d580eefbc6d 100644 --- a/tests/framework/validators/UniqueValidatorTest.php +++ b/tests/framework/validators/UniqueValidatorTest.php @@ -22,7 +22,7 @@ abstract class UniqueValidatorTest extends DatabaseTestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); @@ -34,7 +34,7 @@ protected function setUp() public function testAssureMessageSetOnInit() { $val = new UniqueValidator(); - $this->assertInternalType('string', $val->message); + $this->assertIsString($val->message); } public function testCustomMessage() diff --git a/tests/framework/validators/UrlValidatorTest.php b/tests/framework/validators/UrlValidatorTest.php index 7872d9d21e9..99866a9655e 100644 --- a/tests/framework/validators/UrlValidatorTest.php +++ b/tests/framework/validators/UrlValidatorTest.php @@ -16,7 +16,7 @@ */ class UrlValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/validators/ValidatorTest.php b/tests/framework/validators/ValidatorTest.php index 3f3eb8c0dd0..cd25e3895db 100644 --- a/tests/framework/validators/ValidatorTest.php +++ b/tests/framework/validators/ValidatorTest.php @@ -24,7 +24,7 @@ */ class ValidatorTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/web/AssetBundleTest.php b/tests/framework/web/AssetBundleTest.php index a0399d0aa85..70471af07eb 100644 --- a/tests/framework/web/AssetBundleTest.php +++ b/tests/framework/web/AssetBundleTest.php @@ -18,7 +18,7 @@ */ class AssetBundleTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -124,7 +124,7 @@ public function testSourcesPublish_AssetManagerBeforeCopy() $this->assertFalse(is_dir($bundle->basePath)); foreach ($bundle->js as $filename) { $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename; - $this->assertFileNotExists($publishedFile); + $this->assertFileDoesNotExist($publishedFile); } } @@ -144,7 +144,7 @@ public function testSourcesPublish_AssetBeforeCopy() $this->assertFalse(is_dir($bundle->basePath)); foreach ($bundle->js as $filename) { $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename; - $this->assertFileNotExists($publishedFile); + $this->assertFileDoesNotExist($publishedFile); } } @@ -163,7 +163,7 @@ public function testSourcesPublish_publishOptions_Only() $bundle->publish($am); $notNeededFilesDir = dirname($bundle->basePath . DIRECTORY_SEPARATOR . $bundle->css[0]); - $this->assertFileNotExists($notNeededFilesDir); + $this->assertFileDoesNotExist($notNeededFilesDir); foreach ($bundle->js as $filename) { $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename; @@ -189,7 +189,9 @@ public function testBasePathIsWritableOnPublish() $view = $this->getView(['basePath' => '@testReadOnlyAssetPath']); $bundle = new TestSourceAsset(); - $this->setExpectedException('yii\base\InvalidConfigException', 'The directory is not writable by the Web process'); + $this->expectException(\yii\base\InvalidConfigException::class); + $this->expectExceptionMessage('The directory is not writable by the Web process'); + $bundle->publish($view->getAssetManager()); FileHelper::removeDirectory($path); @@ -543,7 +545,7 @@ public function testCustomFilePublishWithTimestamp() $am = $view->assetManager; // publishing without timestamp $result = $am->publish($path . '/data.txt'); - $this->assertRegExp('/.*data.txt$/i', $result[1]); + $this->assertMatchesRegularExpression('/.*data.txt$/i', $result[1]); unset($view, $am, $result); $view = $this->getView(); @@ -551,7 +553,7 @@ public function testCustomFilePublishWithTimestamp() // turn on timestamp appending $am->appendTimestamp = true; $result = $am->publish($path . '/data.txt'); - $this->assertRegExp('/.*data.txt\?v=\d+$/i', $result[1]); + $this->assertMatchesRegularExpression('/.*data.txt\?v=\d+$/i', $result[1]); } /** @@ -563,7 +565,7 @@ public function testNonRelativeAssetWebPathWithTimestamp() $view = $this->getView(['appendTimestamp' => true]); TestNonRelativeAsset::register($view); - $this->assertRegExp( + $this->assertMatchesRegularExpression( '~123', $html); + $this->assertStringContainsString('', $html); $view = new View(); $view->registerJsVar('objectTest', @@ -44,7 +44,10 @@ public function testRegisterJsVar() 'question' => 'Unknown', ]); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString( + '', + $html + ); } public function testRegisterJsFileWithAlias() @@ -61,7 +64,7 @@ public function testRegisterJsFileWithAlias() $view = new View(); $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_HEAD]); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); $view = new View(); $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_BEGIN]); @@ -71,13 +74,13 @@ public function testRegisterJsFileWithAlias() $view = new View(); $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_END]); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); // alias with depends $view = new View(); $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_END, 'depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); } public function testRegisterCssFileWithAlias() @@ -94,14 +97,14 @@ public function testRegisterCssFileWithAlias() $view = new View(); $view->registerCssFile('@web/css/somefile.css'); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); // with depends $view = new View(); $view->registerCssFile('@web/css/somefile.css', ['position' => View::POS_END, 'depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); } public function testRegisterregisterCsrfMetaTags() @@ -122,16 +125,16 @@ public function testRegisterregisterCsrfMetaTags() $view->registerCsrfMetaTags(); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', $html); - $this->assertContains('', $html); + $this->assertStringContainsString('', $html); - $this->assertContains('', $html); + $this->assertStringContainsString(' $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // test append timestamp when @web is prefixed in url \Yii::setAlias('@web', '/test-app'); @@ -191,7 +194,7 @@ public function testAppendTimestampForRegisterJsFile() $view->registerJsFile(\Yii::getAlias('@web/assetSources/js/jquery.js'), ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // test append timestamp when @web has the same name as the asset-source folder \Yii::setAlias('@web', '/assetSources/'); @@ -199,7 +202,7 @@ public function testAppendTimestampForRegisterJsFile() $view->registerJsFile(\Yii::getAlias('@web/assetSources/js/jquery.js'), ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // reset aliases $this->setUpAliases(); @@ -207,26 +210,26 @@ public function testAppendTimestampForRegisterJsFile() $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js', ['appendTimestamp' => true]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // redefine AssetManager timestamp setting $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // with alias $view = new View(); $view->registerJsFile('@web/assetSources/js/jquery.js'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // with alias but wo timestamp // redefine AssetManager timestamp setting @@ -237,35 +240,41 @@ public function testAppendTimestampForRegisterJsFile() 'depends' => 'yii\web\AssetBundle', ]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // wo depends == wo AssetManager $view = new View(); $view->registerJsFile('@web/assetSources/js/jquery.js', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // absolute link $view = new View(); $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerJsFile('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); \Yii::$app->assetManager->appendTimestamp = false; @@ -273,18 +282,18 @@ public function testAppendTimestampForRegisterJsFile() $view->registerJsFile('/assetSources/js/jquery.js', ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js', ['appendTimestamp' => true]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // redefine AssetManager timestamp setting $view = new View(); @@ -294,34 +303,40 @@ public function testAppendTimestampForRegisterJsFile() 'depends' => 'yii\web\AssetBundle', ]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); $view = new View(); $view->registerJsFile('/assetSources/js/jquery.js', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // absolute link $view = new View(); $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerJsFile('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); } @@ -347,7 +362,7 @@ public function testAppendTimestampForRegisterCssFile() $view->registerCssFile('/assetSources/css/stub.css', ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // test append timestamp when @web is prefixed in url \Yii::setAlias('@web', '/test-app'); @@ -355,7 +370,7 @@ public function testAppendTimestampForRegisterCssFile() $view->registerCssFile(\Yii::getAlias('@web/assetSources/css/stub.css'), ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // test append timestamp when @web has the same name as the asset-source folder \Yii::setAlias('@web', '/assetSources/'); @@ -363,7 +378,7 @@ public function testAppendTimestampForRegisterCssFile() $view->registerCssFile(\Yii::getAlias('@web/assetSources/css/stub.css'), ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // reset aliases $this->setUpAliases(); @@ -371,26 +386,26 @@ public function testAppendTimestampForRegisterCssFile() $view = new View(); $view->registerCssFile('/assetSources/css/stub.css'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); $view = new View(); $view->registerCssFile('/assetSources/css/stub.css', ['appendTimestamp' => true]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // redefine AssetManager timestamp setting $view = new View(); $view->registerCssFile('/assetSources/css/stub.css', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // with alias $view = new View(); $view->registerCssFile('@web/assetSources/css/stub.css'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // with alias but wo timestamp // redefine AssetManager timestamp setting @@ -401,35 +416,41 @@ public function testAppendTimestampForRegisterCssFile() 'depends' => 'yii\web\AssetBundle', ]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // wo depends == wo AssetManager $view = new View(); $view->registerCssFile('@web/assetSources/css/stub.css', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // absolute link $view = new View(); $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css'); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerCssFile('//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); \Yii::$app->assetManager->appendTimestamp = false; @@ -437,18 +458,18 @@ public function testAppendTimestampForRegisterCssFile() $view->registerCssFile('/assetSources/css/stub.css', ['depends' => 'yii\web\AssetBundle']); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); $view = new View(); $view->registerCssFile('/assetSources/css/stub.css'); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); $view = new View(); $view->registerCssFile('/assetSources/css/stub.css', ['appendTimestamp' => true]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); // redefine AssetManager timestamp setting $view = new View(); @@ -458,33 +479,39 @@ public function testAppendTimestampForRegisterCssFile() 'depends' => 'yii\web\AssetBundle', ]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertRegExp($pattern, $html); + $this->assertMatchesRegularExpression($pattern, $html); $view = new View(); $view->registerCssFile('/assetSources/css/stub.css', ['appendTimestamp' => false]); // $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertNotRegExp($pattern, $html); + $this->assertDoesNotMatchRegularExpression($pattern, $html); // absolute link $view = new View(); $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css'); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerCssFile('//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); $view = new View(); $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css', ['depends' => 'yii\web\AssetBundle']); $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']); - $this->assertContains('', - $html); + $this->assertStringContainsString( + '', + $html + ); } } diff --git a/tests/framework/web/session/AbstractDbSessionTest.php b/tests/framework/web/session/AbstractDbSessionTest.php index 5fdfe50f98b..f8dbb32f550 100644 --- a/tests/framework/web/session/AbstractDbSessionTest.php +++ b/tests/framework/web/session/AbstractDbSessionTest.php @@ -27,7 +27,7 @@ abstract class AbstractDbSessionTest extends TestCase */ abstract protected function getDriverNames(); - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -37,7 +37,7 @@ protected function setUp() $this->createTableSession(); } - protected function tearDown() + protected function tearDown(): void { $this->dropTableSession(); parent::tearDown(); diff --git a/tests/framework/web/session/CacheSessionTest.php b/tests/framework/web/session/CacheSessionTest.php index d34f7b7f82f..cc62e1b3681 100644 --- a/tests/framework/web/session/CacheSessionTest.php +++ b/tests/framework/web/session/CacheSessionTest.php @@ -18,7 +18,7 @@ class CacheSessionTest extends \yiiunit\TestCase { use SessionTestTrait; - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/web/session/pgsql/DbSessionTest.php b/tests/framework/web/session/pgsql/DbSessionTest.php index 8ef66fd0130..9af861b09f7 100644 --- a/tests/framework/web/session/pgsql/DbSessionTest.php +++ b/tests/framework/web/session/pgsql/DbSessionTest.php @@ -17,7 +17,7 @@ */ class DbSessionTest extends \yiiunit\framework\web\session\AbstractDbSessionTest { - protected function setUp() + protected function setUp(): void { if (defined('HHVM_VERSION')) { $this->markTestSkipped('HHVMs PgSQL implementation does not seem to support blob columns in the way they are used here.'); diff --git a/tests/framework/web/session/sqlite/DbSessionTest.php b/tests/framework/web/session/sqlite/DbSessionTest.php index e13539cebd0..a7e0154f538 100644 --- a/tests/framework/web/session/sqlite/DbSessionTest.php +++ b/tests/framework/web/session/sqlite/DbSessionTest.php @@ -19,7 +19,7 @@ */ class DbSessionTest extends \yiiunit\framework\web\session\AbstractDbSessionTest { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/widgets/ActiveFieldTest.php b/tests/framework/widgets/ActiveFieldTest.php index 0ac63c77b3f..25f77b73bfa 100644 --- a/tests/framework/widgets/ActiveFieldTest.php +++ b/tests/framework/widgets/ActiveFieldTest.php @@ -7,6 +7,7 @@ namespace yiiunit\framework\widgets; +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; use Yii; use yii\base\DynamicModel; use yii\web\AssetManager; @@ -23,6 +24,8 @@ */ class ActiveFieldTest extends \yiiunit\TestCase { + use ArraySubsetAsserts; + /** * @var ActiveFieldExtend */ @@ -37,7 +40,7 @@ class ActiveFieldTest extends \yiiunit\TestCase private $helperForm; private $attributeName = 'attributeName'; - protected function setUp() + protected function setUp(): void { parent::setUp(); // dirty way to have Request object not throwing exception when running testHomeLinkNull() @@ -672,14 +675,14 @@ public function testInputOptionsTransferToWidget() 'mask' => '999-999-9999', 'options' => ['placeholder' => 'pholder_direct'], ]); - $this->assertContains('placeholder="pholder_direct"', (string) $widget); + $this->assertStringContainsString('placeholder="pholder_direct"', (string) $widget); // transfer options from ActiveField to widget $this->activeField->inputOptions = ['placeholder' => 'pholder_input']; $widget = $this->activeField->widget(TestMaskedInput::className(), [ 'mask' => '999-999-9999', ]); - $this->assertContains('placeholder="pholder_input"', (string) $widget); + $this->assertStringContainsString('placeholder="pholder_input"', (string) $widget); // set both AF and widget options (second one takes precedence) $this->activeField->inputOptions = ['placeholder' => 'pholder_both_input']; @@ -687,7 +690,7 @@ public function testInputOptionsTransferToWidget() 'mask' => '999-999-9999', 'options' => ['placeholder' => 'pholder_both_direct'] ]); - $this->assertContains('placeholder="pholder_both_direct"', (string) $widget); + $this->assertStringContainsString('placeholder="pholder_both_direct"', (string) $widget); } /** diff --git a/tests/framework/widgets/ActiveFormTest.php b/tests/framework/widgets/ActiveFormTest.php index 64f921b0c24..4cca48b68f6 100644 --- a/tests/framework/widgets/ActiveFormTest.php +++ b/tests/framework/widgets/ActiveFormTest.php @@ -17,7 +17,7 @@ */ class ActiveFormTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); @@ -110,6 +110,8 @@ public function testOutputBuffering() public function testRegisterClientScript() { + $this->expectNotToPerformAssertions(); + $this->mockWebApplication(); $_SERVER['REQUEST_URI'] = 'http://example.com/'; diff --git a/tests/framework/widgets/BlockTest.php b/tests/framework/widgets/BlockTest.php index c7b8ad2f6ec..a6b6d7fc9c9 100644 --- a/tests/framework/widgets/BlockTest.php +++ b/tests/framework/widgets/BlockTest.php @@ -14,7 +14,7 @@ */ class BlockTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/widgets/BreadcrumbsTest.php b/tests/framework/widgets/BreadcrumbsTest.php index 5a4fddcbb3b..fd2106c7bfc 100644 --- a/tests/framework/widgets/BreadcrumbsTest.php +++ b/tests/framework/widgets/BreadcrumbsTest.php @@ -19,7 +19,7 @@ class BreadcrumbsTest extends \yiiunit\TestCase { private $breadcrumbs; - protected function setUp() + protected function setUp(): void { parent::setUp(); // dirty way to have Request object not throwing exception when running testHomeLinkNull() diff --git a/tests/framework/widgets/ContentDecoratorTest.php b/tests/framework/widgets/ContentDecoratorTest.php index 02fc9a49766..c33c507ea73 100644 --- a/tests/framework/widgets/ContentDecoratorTest.php +++ b/tests/framework/widgets/ContentDecoratorTest.php @@ -14,7 +14,7 @@ */ class ContentDecoratorTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/widgets/DetailViewTest.php b/tests/framework/widgets/DetailViewTest.php index a2fd34ef124..6b2f7fe3d96 100644 --- a/tests/framework/widgets/DetailViewTest.php +++ b/tests/framework/widgets/DetailViewTest.php @@ -20,7 +20,7 @@ class DetailViewTest extends \yiiunit\TestCase /** @var DetailView */ public $detailView; - protected function setUp() + protected function setUp(): void { parent::setUp(); diff --git a/tests/framework/widgets/FragmentCacheTest.php b/tests/framework/widgets/FragmentCacheTest.php index a3b040e8f9d..a08a0795efb 100644 --- a/tests/framework/widgets/FragmentCacheTest.php +++ b/tests/framework/widgets/FragmentCacheTest.php @@ -17,7 +17,7 @@ */ class FragmentCacheTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockWebApplication(); diff --git a/tests/framework/widgets/LinkPagerTest.php b/tests/framework/widgets/LinkPagerTest.php index 265b891362b..88200cfc207 100644 --- a/tests/framework/widgets/LinkPagerTest.php +++ b/tests/framework/widgets/LinkPagerTest.php @@ -16,7 +16,7 @@ */ class LinkPagerTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication([ @@ -52,8 +52,14 @@ public function testFirstLastPageLabels() 'lastPageLabel' => true, ]); - static::assertContains('
      • 1
      • ', $output); - static::assertContains('
      • 25
      • ', $output); + $this->assertStringContainsString( + '
      • 1
      • ', + $output, + ); + $this->assertStringContainsString( + '
      • 25
      • ', + $output, + ); $output = LinkPager::widget([ 'pagination' => $pagination, @@ -61,8 +67,14 @@ public function testFirstLastPageLabels() 'lastPageLabel' => 'Last', ]); - static::assertContains('
      • First
      • ', $output); - static::assertContains('
      • Last
      • ', $output); + $this->assertStringContainsString( + '
      • First
      • ', + $output, + ); + $this->assertStringContainsString( + '
      • Last
      • ', + $output, + ); $output = LinkPager::widget([ 'pagination' => $pagination, @@ -70,8 +82,8 @@ public function testFirstLastPageLabels() 'lastPageLabel' => false, ]); - static::assertNotContains('
      • ', $output); - static::assertNotContains('
      • ', $output); + $this->assertStringNotContainsString('
      • ', $output); + $this->assertStringNotContainsString('
      • ', $output); } public function testDisabledPageElementOptions() @@ -81,7 +93,7 @@ public function testDisabledPageElementOptions() 'disabledListItemSubTagOptions' => ['class' => 'foo-bar'], ]); - static::assertContains('«', $output); + $this->assertStringContainsString('«', $output); } public function testDisabledPageElementOptionsWithTagOption() @@ -91,7 +103,7 @@ public function testDisabledPageElementOptionsWithTagOption() 'disabledListItemSubTagOptions' => ['class' => 'foo-bar', 'tag' => 'div'], ]); - static::assertContains('
        «
        ', $output); + $this->assertStringContainsString('
        «
        ', $output); } public function testDisableCurrentPageButton() @@ -102,14 +114,17 @@ public function testDisableCurrentPageButton() 'disableCurrentPageButton' => false, ]); - static::assertContains('
      • 6
      • ', $output); + $this->assertStringContainsString( + '
      • 6
      • ', + $output, + ); $output = LinkPager::widget([ 'pagination' => $pagination, 'disableCurrentPageButton' => true, ]); - static::assertContains('
      • 6
      • ', $output); + $this->assertStringContainsString('
      • 6
      • ', $output); } public function testOptionsWithTagOption() @@ -135,11 +150,11 @@ public function testLinkWrapOptions() ], ]); - $this->assertContains( + $this->assertStringContainsString( '', $output ); - $this->assertContains( + $this->assertStringContainsString( '', $output ); diff --git a/tests/framework/widgets/LinkSorterTest.php b/tests/framework/widgets/LinkSorterTest.php index 49da1fce71e..652b8c18c2d 100644 --- a/tests/framework/widgets/LinkSorterTest.php +++ b/tests/framework/widgets/LinkSorterTest.php @@ -22,7 +22,7 @@ class LinkSorterTest extends DatabaseTestCase { protected $driverName = 'sqlite'; - protected function setUp() + protected function setUp(): void { parent::setUp(); ActiveRecord::$db = $this->getConnection(); diff --git a/tests/framework/widgets/ListViewTest.php b/tests/framework/widgets/ListViewTest.php index 6d3ff286f1f..8f01b9e78bd 100644 --- a/tests/framework/widgets/ListViewTest.php +++ b/tests/framework/widgets/ListViewTest.php @@ -18,7 +18,7 @@ */ class ListViewTest extends TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockApplication(); diff --git a/tests/framework/widgets/MenuTest.php b/tests/framework/widgets/MenuTest.php index 3de5f5efd83..938bec4b356 100644 --- a/tests/framework/widgets/MenuTest.php +++ b/tests/framework/widgets/MenuTest.php @@ -15,7 +15,7 @@ */ class MenuTest extends \yiiunit\TestCase { - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockWebApplication([ diff --git a/tests/framework/widgets/PjaxTest.php b/tests/framework/widgets/PjaxTest.php index e08d5776f17..209fa16e0cc 100644 --- a/tests/framework/widgets/PjaxTest.php +++ b/tests/framework/widgets/PjaxTest.php @@ -33,7 +33,7 @@ public function testGeneratedIdByPjaxWidget() $this->assertEquals('p1', $pjax2->options['id']); } - protected function setUp() + protected function setUp(): void { parent::setUp(); $this->mockWebApplication(); From c2d4691feeb020ff052ce21fc6fbbe9d0376643b Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:00:30 -0300 Subject: [PATCH 093/125] Update composer.json Co-authored-by: Robert Korulczyk --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c80f2ac7f15..90dc2720717 100644 --- a/composer.json +++ b/composer.json @@ -85,7 +85,7 @@ "cebe/indent": "~1.0.2", "dealerdirect/phpcodesniffer-composer-installer": "*", "dms/phpunit-arraysubset-asserts": "^0.5", - "phpunit/phpunit": "9.6", + "phpunit/phpunit": "^9.6", "yiisoft/yii2-coding-standards": "^3.0" }, "repositories": [ From ae7db0aaeed20154cfcaebd8bdcafb4b5c3bac88 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 20 Mar 2024 18:22:38 -0300 Subject: [PATCH 094/125] Only coverage `PHP 7.4` and upload version tests `scrutinizer.yml`. --- .github/workflows/build.yml | 2 +- .github/workflows/ci-mssql.yml | 1 + .github/workflows/ci-mysql.yml | 1 + .github/workflows/ci-pgsql.yml | 1 + .github/workflows/ci-sqlite.yml | 1 + .scrutinizer.yml | 2 +- 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9893def13f6..a6fbed5e181 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: coverage: none - php: 7.4 extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached - coverage: pcov + coverage: xdebug - php: 8.0 extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached coverage: none diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index 9efead3d6dd..0ad842fb84e 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -69,6 +69,7 @@ jobs: run: vendor/bin/phpunit --group mssql --coverage-clover=coverage.xml --colors=always - name: Upload coverage to Codecov. + if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index 11e3efbdbca..034cb33edc0 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -60,6 +60,7 @@ jobs: run: vendor/bin/phpunit --group mysql --coverage-clover=coverage.xml --colors=always - name: Upload coverage to Codecov. + if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index a64620a2d02..5bf286df3fb 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -68,6 +68,7 @@ jobs: run: vendor/bin/phpunit --group pgsql --coverage-clover=coverage.xml --colors=always - name: Upload coverage to Codecov. + if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index 949fb0d6aae..5a017016f2a 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -50,6 +50,7 @@ jobs: run: vendor/bin/phpunit --group sqlite --coverage-clover=coverage.xml --colors=always - name: Upload coverage to Codecov. + if: matrix.php == '7.4' uses: codecov/codecov-action@v3 with: file: ./coverage.xml diff --git a/.scrutinizer.yml b/.scrutinizer.yml index a30e8f62d95..0634033ee66 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -16,7 +16,7 @@ build: environment: php: - version: 7.4.28 + version: 8.1 ini: xdebug.mode: coverage,develop memory_limit: -1 From aec3b79e6d44a2bf7539eae1bf49d3048ead2699 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 20 Mar 2024 18:49:27 -0300 Subject: [PATCH 095/125] Change `@expectException` with `$this->expectException`. --- .../console/controllers/FixtureControllerTest.php | 8 ++------ .../console/controllers/MigrateControllerTestTrait.php | 4 ++-- tests/framework/db/CommandTest.php | 5 +++-- tests/framework/db/ConnectionTest.php | 5 +---- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/tests/framework/console/controllers/FixtureControllerTest.php b/tests/framework/console/controllers/FixtureControllerTest.php index a7882d1f1a3..ef44853b4e6 100644 --- a/tests/framework/console/controllers/FixtureControllerTest.php +++ b/tests/framework/console/controllers/FixtureControllerTest.php @@ -215,19 +215,15 @@ public function testNothingToUnloadParticularExceptOnes() $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should not be loaded'); } - /** - * @expectedException \yii\console\Exception - */ public function testNoFixturesWereFoundInLoad() { + $this->expectException('\yii\console\Exception'); $this->_fixtureController->actionLoad(['NotExistingFixture']); } - /** - * @expectedException \yii\console\Exception - */ public function testNoFixturesWereFoundInUnload() { + $this->expectException('\yii\console\Exception'); $this->_fixtureController->actionUnload(['NotExistingFixture']); } diff --git a/tests/framework/console/controllers/MigrateControllerTestTrait.php b/tests/framework/console/controllers/MigrateControllerTestTrait.php index 046c512741e..da3223764ae 100644 --- a/tests/framework/console/controllers/MigrateControllerTestTrait.php +++ b/tests/framework/console/controllers/MigrateControllerTestTrait.php @@ -323,7 +323,7 @@ public function testNew() $output = $this->runMigrateControllerAction('new'); $this->assertSame(ExitCode::OK, $this->getExitCode()); - $this->assertNotContains('_test_new1', $output); + $this->assertStringNotContainsString('_test_new1', $output); } public function testMark() @@ -418,7 +418,7 @@ public function testNamespaceCreate() $this->assertSame(ExitCode::OK, $this->getExitCode()); $files = FileHelper::findFiles($this->migrationPath); $fileContent = file_get_contents($files[0]); - $this->assertNotContains("namespace {$this->migrationNamespace};", $fileContent); + $this->assertStringNotContainsString("namespace {$this->migrationNamespace};", $fileContent); } /** diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 1817ff65b4e..b888a7073d6 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -619,8 +619,7 @@ public function invalidSelectColumns() * Test INSERT INTO ... SELECT SQL statement with wrong query object. * * @dataProvider invalidSelectColumns - * @expectedException \yii\base\InvalidParamException - * @expectedExceptionMessage Expected select query object with enumerated (named) parameters + * * @param mixed $invalidSelectColumns */ public function testInsertSelectFailed($invalidSelectColumns) @@ -634,6 +633,8 @@ public function testInsertSelectFailed($invalidSelectColumns) $this->expectException(\yii\base\InvalidArgumentException::class); $this->expectExceptionMessage('Expected select query object with enumerated (named) parameters'); + $this->expectException('yii\base\InvalidParamException'); + $this->expectExceptionMessage('Expected select query object with enumerated (named) parameters'); $command->insert('{{customer}}', $query)->execute(); } diff --git a/tests/framework/db/ConnectionTest.php b/tests/framework/db/ConnectionTest.php index 663f6115926..8b3a4f65d6d 100644 --- a/tests/framework/db/ConnectionTest.php +++ b/tests/framework/db/ConnectionTest.php @@ -224,15 +224,12 @@ public function testTransactionIsolation() $this->assertTrue(true); // should not be any exception so far } - /** - * @expectedException \Exception - */ public function testTransactionShortcutException() { $connection = $this->getConnection(true); $this->expectException(\Exception::class); - + $connection->transaction(function () use ($connection) { $connection->createCommand()->insert('profile', ['description' => 'test transaction shortcut'])->execute(); throw new \Exception('Exception in transaction shortcut'); From daae9cf9feecfba45b663a159537ffc2c5eaee5b Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 06:58:47 -0300 Subject: [PATCH 096/125] Update composer.json to require PHP 7.3 or higher. --- framework/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/composer.json b/framework/composer.json index ff36473707c..37c438afb17 100644 --- a/framework/composer.json +++ b/framework/composer.json @@ -63,7 +63,7 @@ "source": "https://github.com/yiisoft/yii2" }, "require": { - "php": ">=5.4.0", + "php": ">=7.3.0", "ext-mbstring": "*", "ext-ctype": "*", "lib-pcre": "*", From f8884dcb224a46b3f255e6c08111b724252b857b Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 07:02:47 -0300 Subject: [PATCH 097/125] Add line to `CHANGELOG,md`. --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 78ddfdcbb70..57567d20712 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -21,6 +21,7 @@ Yii Framework 2 Change Log - Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992) - Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) - Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) +- Enh #20134: Raise minimum `PHP` version to `7.3` (@terabytesoftw) 2.0.49.2 October 12, 2023 From a9ac7f5cee844c9bedc012a181c3bace039592a3 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 07:09:39 -0300 Subject: [PATCH 098/125] Update PHP version requirement to `7.3.0` or higher in `requirements.php`. --- framework/requirements/requirements.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/requirements/requirements.php b/framework/requirements/requirements.php index d065f6363bc..1bf372aee59 100644 --- a/framework/requirements/requirements.php +++ b/framework/requirements/requirements.php @@ -15,9 +15,9 @@ array( 'name' => 'PHP version', 'mandatory' => true, - 'condition' => version_compare(PHP_VERSION, '5.4.0', '>='), + 'condition' => version_compare(PHP_VERSION, '7.3.0', '>='), 'by' => 'Yii Framework', - 'memo' => 'PHP 5.4.0 or higher is required.', + 'memo' => 'PHP 7.3.0 or higher is required.', ), array( 'name' => 'Reflection extension', From 1a34aaa3f6c5651a76a96b1b4c5a29c3a4d873ea Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 07:11:40 -0300 Subject: [PATCH 099/125] Update docs `PHP` version requirement to `7.3.0` or higher. --- docs/guide-ar/intro-yii.md | 2 +- docs/guide-es/intro-yii.md | 2 +- docs/guide-fr/intro-yii.md | 2 +- docs/guide-id/intro-yii.md | 2 +- docs/guide-it/intro-yii.md | 2 +- docs/guide-ja/intro-yii.md | 2 +- docs/guide-pl/intro-yii.md | 2 +- docs/guide-pt-BR/intro-yii.md | 2 +- docs/guide-ru/intro-yii.md | 2 +- docs/guide-tr/intro-yii.md | 2 +- docs/guide-uk/intro-yii.md | 2 +- docs/guide-uz/intro-yii.md | 2 +- docs/guide-vi/intro-yii.md | 2 +- docs/guide-zh-CN/intro-yii.md | 2 +- docs/guide/intro-yii.md | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/guide-ar/intro-yii.md b/docs/guide-ar/intro-yii.md index bff073a5c4f..ae284244e2a 100644 --- a/docs/guide-ar/intro-yii.md +++ b/docs/guide-ar/intro-yii.md @@ -45,7 +45,7 @@ Yii هو إطار عام لبرمجة الويب ، مما يعني أنه يم #
        المتطلبات الأساسية للعمل على إطار ال Yii
          -
        • الإصدار PHP 5.4.0 أو أكثر
        • +
        • الإصدار PHP 7.3.0 أو أكثر
        • المعرفة الأساسية بمفاهيم البرمجة كائنية التوجه OOP
        • المعرفة بآخر وأحدث التقنيات الموجودة بال php مثل ال namespaces, traits، الفهم لهذه المفاهيم سيسهل عليك العمل كثيرا
        diff --git a/docs/guide-es/intro-yii.md b/docs/guide-es/intro-yii.md index 5c57a80a2c6..28f6e31182a 100644 --- a/docs/guide-es/intro-yii.md +++ b/docs/guide-es/intro-yii.md @@ -51,7 +51,7 @@ Esta guía está basada principalmente en la versión 2.0. del framework. Requisitos y Prerequisitos -------------------------- -Yii 2.0 requiere PHP 5.4.0 o una versión posterior y corre de mejor manera en la última versión de PHP. Se pueden encontrar requisitos más detallados de características individuales +Yii 2.0 requiere PHP 7.3.0 o una versión posterior y corre de mejor manera en la última versión de PHP. Se pueden encontrar requisitos más detallados de características individuales ejecutando el script de comprobación incluido en cada lanzamiento de Yii. Para utilizar Yii se requieren conocimientos básicos de programación orientada a objetos (POO), porque el framework Yii se basa íntegramente en esta tecnología. diff --git a/docs/guide-fr/intro-yii.md b/docs/guide-fr/intro-yii.md index b378e366051..508d7608373 100644 --- a/docs/guide-fr/intro-yii.md +++ b/docs/guide-fr/intro-yii.md @@ -47,7 +47,7 @@ Ce guide est principalement pour la version 2.0. Configuration nécessaire ------------------------ -Yii 2.0 nécessite PHP 5.4.0 ou plus. Vous pouvez trouver plus de détails sur la configuration requise pour chaque fonctionnalité +Yii 2.0 nécessite PHP 7.3.0 ou plus. Vous pouvez trouver plus de détails sur la configuration requise pour chaque fonctionnalité en utilisant le script de test de la configuration inclus dans chaque distribution de Yii. Utiliser Yii requiert des connaissances de base sur la programmation objet (OOP), en effet Yii est un framework basé sur ce type de programmation. diff --git a/docs/guide-id/intro-yii.md b/docs/guide-id/intro-yii.md index 2b1ae4c91cc..56620691ade 100644 --- a/docs/guide-id/intro-yii.md +++ b/docs/guide-id/intro-yii.md @@ -38,7 +38,7 @@ Panduan ini terutama tentang versi 2.0. ## Persyaratan dan Prasyarat -Yii 2.0 memerlukan PHP 5.4.0 atau versi lebih tinggi. Anda dapat menemukan persyaratan yang lebih rinci untuk setiap fitur +Yii 2.0 memerlukan PHP 7.3.0 atau versi lebih tinggi. Anda dapat menemukan persyaratan yang lebih rinci untuk setiap fitur dengan menjalankan pengecek persyaratan yang diikutsertakan dalam setiap rilis Yii. Menggunakan Yii memerlukan pengetahuan dasar tentang pemrograman berorientasi objek (OOP), mengingat Yii adalah framework berbasis OOP murni. diff --git a/docs/guide-it/intro-yii.md b/docs/guide-it/intro-yii.md index 056143be68b..f3cf8e7e4f6 100644 --- a/docs/guide-it/intro-yii.md +++ b/docs/guide-it/intro-yii.md @@ -50,7 +50,7 @@ Questa guida è focalizzata principalmente sulla versione 2.0. Richieste e requisiti di sistema --------------------------------- -Yii 2.0 richiede PHP 5.4.0 o successivo. Puoi trovare maggiori dettagli sulle richieste delle singole funzionalità +Yii 2.0 richiede PHP 7.3.0 o successivo. Puoi trovare maggiori dettagli sulle richieste delle singole funzionalità eseguendo lo script di verifica requisiti incluso in ogni versione di Yii. L'uso di Yii richiede una conoscenza base della programmazione ad oggetti (OOP), dato che Yii è un framework puramente OOP. diff --git a/docs/guide-ja/intro-yii.md b/docs/guide-ja/intro-yii.md index f2995b3e761..a249a0bed00 100644 --- a/docs/guide-ja/intro-yii.md +++ b/docs/guide-ja/intro-yii.md @@ -50,7 +50,7 @@ Yii は現在、利用可能な二つのメジャー・バージョン、すな 必要条件と前提条件 ------------------ -Yii 2.0 は PHP 5.4.0 以上を必要とし、PHP の最新バージョンで最高の力を発揮します。 +Yii 2.0 は PHP 7.3.0 以上を必要とし、PHP の最新バージョンで最高の力を発揮します。 個々の機能に対する詳細な必要条件は、全ての Yii リリースに含まれている必要条件チェッカを走らせることによって知ることが出来ます。 Yii を使うためには、オブジェクト指向プログラミング (OOP) の基本的な知識が必要です。 diff --git a/docs/guide-pl/intro-yii.md b/docs/guide-pl/intro-yii.md index a70e448fcff..b80de97d935 100644 --- a/docs/guide-pl/intro-yii.md +++ b/docs/guide-pl/intro-yii.md @@ -52,7 +52,7 @@ Ten przewodnik opisuje wersję 2.0. Wymagania i zależności ---------------------- -Yii 2.0 wymaga PHP w wersji 5.4.0 lub nowszej i pracuje najwydajniej na najnowszej wersji PHP. Aby otrzymać więcej +Yii 2.0 wymaga PHP w wersji 7.3.0 lub nowszej i pracuje najwydajniej na najnowszej wersji PHP. Aby otrzymać więcej informacji na temat wymagań i indywidualnych funkcjonalności, uruchom specjalny skrypt testujący system dołączony w każdym wydaniu Yii. Używanie Yii wymaga podstawowej wiedzy o programowaniu obiektowym w PHP (OOP), ponieważ Yii diff --git a/docs/guide-pt-BR/intro-yii.md b/docs/guide-pt-BR/intro-yii.md index 5ba072351c9..bc2126c75fd 100644 --- a/docs/guide-pt-BR/intro-yii.md +++ b/docs/guide-pt-BR/intro-yii.md @@ -59,7 +59,7 @@ desenvolvimento nos próximos anos. Este guia trata principalmente da versão 2. Requisitos e Pré-requisitos --------------------------- -Yii 2.0 requer PHP 5.4.0 ou superior. Você pode encontrar requisitos mais +Yii 2.0 requer PHP 7.3.0 ou superior. Você pode encontrar requisitos mais detalhados para recursos específicos executando o verificador de requisitos (requirement checker) incluído em cada lançamento do Yii. diff --git a/docs/guide-ru/intro-yii.md b/docs/guide-ru/intro-yii.md index 353ecaeac05..4ec5d66b1c4 100644 --- a/docs/guide-ru/intro-yii.md +++ b/docs/guide-ru/intro-yii.md @@ -42,7 +42,7 @@ Yii — не проект одного человека. Он поддержив Требования к ПО и знаниям ------------------------- -Yii 2.0 требует PHP 5.4.0 и выше и наилучшим образом работает на последней версии PHP. Чтобы узнать требования для отдельных возможностей, вы можете запустить скрипт проверки +Yii 2.0 требует PHP 7.3.0 и выше и наилучшим образом работает на последней версии PHP. Чтобы узнать требования для отдельных возможностей, вы можете запустить скрипт проверки требований, который поставляется с каждым релизом фреймворка. Для разработки на Yii потребуется общее понимание ООП, так как фреймворк полностью следует этой парадигме. Также стоит diff --git a/docs/guide-tr/intro-yii.md b/docs/guide-tr/intro-yii.md index 069f690f91d..f05107f19ee 100644 --- a/docs/guide-tr/intro-yii.md +++ b/docs/guide-tr/intro-yii.md @@ -32,6 +32,6 @@ Bu kılavuz esas olarak sürüm 2.0 ile ilgilidir. Gereksinimler ve Önkoşullar ------------------------------ -Yii 2.0, PHP 5.4.0 veya üstü sürüm gerektirir ve PHP 'nin en son sürümü ile en iyi şekilde çalışır. Her bir Yii sürümünde yer alan gereksinim denetleyicisini çalıştırarak, daha ayrıntılı gereksinimleri ayrı ayrı özellikler için bulabilirsiniz. +Yii 2.0, PHP 7.3.0 veya üstü sürüm gerektirir ve PHP 'nin en son sürümü ile en iyi şekilde çalışır. Her bir Yii sürümünde yer alan gereksinim denetleyicisini çalıştırarak, daha ayrıntılı gereksinimleri ayrı ayrı özellikler için bulabilirsiniz. Yii OOP temelli bir kütüphane olduğu için Yii'yi kullanmak, nesne yönelimli programlama (OOP) hakkında temel bilgi gerektirir. Yii 2.0 ayrıca PHP'nin [namespaceler](https://www.php.net/manual/en/language.namespaces.php) ve [traitler](https://www.php.net/manual/en/language.oop5.traits.php) gibi son özelliklerinden de yararlanır. Bu kavramları anlamak, Yii 2.0'ı daha kolay anlamanıza yardımcı olacaktır. diff --git a/docs/guide-uk/intro-yii.md b/docs/guide-uk/intro-yii.md index 93b0efb9998..cca32875a54 100644 --- a/docs/guide-uk/intro-yii.md +++ b/docs/guide-uk/intro-yii.md @@ -46,7 +46,7 @@ Yii — не проект однієї людини. Він підтримуєт Вимоги до ПЗ і знань -------------------- -Yii 2.0 потребує PHP 5.4.0 та вище. Щоб дізнатися вимоги для окремих можливостей ви можете запустити скрипт перевірки вимог, +Yii 2.0 потребує PHP 7.3.0 та вище. Щоб дізнатися вимоги для окремих можливостей ви можете запустити скрипт перевірки вимог, який поставляється із кожним релізом фреймворку. Для розробки на Yii необхідне загальне розуміння ООП, оскільки фреймворк повністю слідує цій парадигмі. diff --git a/docs/guide-uz/intro-yii.md b/docs/guide-uz/intro-yii.md index 4e9f1d6de52..be66bdc7cde 100644 --- a/docs/guide-uz/intro-yii.md +++ b/docs/guide-uz/intro-yii.md @@ -32,6 +32,6 @@ Ayni vaqtda Yii ning ikkita yo'nalishi mavjud: 1.1 va 2.0. 1.1 yo'nalishi avvalg DT va bilimlarga talablar ------------------------- -Yii 2.0 PHP 5.4.0 va undan yuqorisini talab qiladi. Boshqa imkoniyatlar uchun talablarni bilish uchun har bir alohida yo'lga qo'yilgan freymvork bilan birga mos o'rnatilgan talablar tekshiruv skriptini ishga tushirishingiz mumkin. +Yii 2.0 PHP 7.3.0 va undan yuqorisini talab qiladi. Boshqa imkoniyatlar uchun talablarni bilish uchun har bir alohida yo'lga qo'yilgan freymvork bilan birga mos o'rnatilgan talablar tekshiruv skriptini ishga tushirishingiz mumkin. Freymvork to'liq obektga mo'ljallangan dasturlashga (OMD) asoslanganligi bois Yii da ishlash uchun OMD ni umumiy tushunish talab etiladi. Shuningdek, PHP ning zamonaviy imkoniyatlari bo'lmish [nomlar soxasi](https://www.php.net/manual/ru/language.namespaces.php) va [treytlar](https://www.php.net/manual/ru/language.oop5.traits.php) ni o'rganish talab etiladi. diff --git a/docs/guide-vi/intro-yii.md b/docs/guide-vi/intro-yii.md index 6548c58ed28..f7e51d52113 100644 --- a/docs/guide-vi/intro-yii.md +++ b/docs/guide-vi/intro-yii.md @@ -47,7 +47,7 @@ Hướng dẫn này chủ yếu là về phiên bản 2.0. Yêu cầu hệ thống và các điều kiện cần thiết ------------------------------ -Yii 2.0 đòi hỏi phiên bản PHP 5.4.0 hoặc cao hơn. Bạn có thể chạy bất kỳ gói Yii đi kèm với các yêu cầu hệ thống. +Yii 2.0 đòi hỏi phiên bản PHP 7.3.0 hoặc cao hơn. Bạn có thể chạy bất kỳ gói Yii đi kèm với các yêu cầu hệ thống. kiểm tra xem những gì các đặc điểm cụ thể của từng cấu hình PHP. Để tìm hiểu Yii, bạn cần có kiến thức cơ bản về lập trình hướng đối tượng (OOP), vì Yii là một framework hướng đối tượng diff --git a/docs/guide-zh-CN/intro-yii.md b/docs/guide-zh-CN/intro-yii.md index d03e5ad9a14..af91110c2e3 100644 --- a/docs/guide-zh-CN/intro-yii.md +++ b/docs/guide-zh-CN/intro-yii.md @@ -50,7 +50,7 @@ Yii 当前有两个主要版本:1.1 和 2.0。 1.1 版是上代的老版本, 系统要求和先决条件 ------------------------------ -Yii 2.0 需要 PHP 5.4.0 或以上版本支持。你可以通过运行任何 +Yii 2.0 需要 PHP 7.3.0 或以上版本支持。你可以通过运行任何 Yii 发行包中附带的系统要求检查器查看每个具体特性所需的 PHP 配置。 使用 Yii 需要对面向对象编程(OOP)有基本了解,因为 Yii 是一个纯面向对象的框架。Yii 2.0 还使用了 PHP 的最新特性, diff --git a/docs/guide/intro-yii.md b/docs/guide/intro-yii.md index ea493cf2b8d..17a3242663f 100644 --- a/docs/guide/intro-yii.md +++ b/docs/guide/intro-yii.md @@ -50,7 +50,7 @@ This guide is mainly about version 2.0. Requirements and Prerequisites ------------------------------ -Yii 2.0 requires PHP 5.4.0 or above and runs best with the latest version of PHP. You can find more detailed +Yii 2.0 requires PHP 7.3.0 or above and runs best with the latest version of PHP. You can find more detailed requirements for individual features by running the requirement checker included in every Yii release. Using Yii requires basic knowledge of object-oriented programming (OOP), as Yii is a pure OOP-based framework. From e4e470fb10e7cdb80277c058ab29aef4f2462e1f Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 07:14:15 -0300 Subject: [PATCH 100/125] Update `PHP` version requirement to `7.3.0` or higher in `README.md`. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2bcf182fab8..b2aa8475b7a 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ The framework is easy to adjust to meet your needs, because Yii has been designe [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2.svg)](https://packagist.org/packages/yiisoft/yii2) [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2.svg)](https://packagist.org/packages/yiisoft/yii2) [![Build Status](https://github.com/yiisoft/yii2/workflows/build/badge.svg)](https://github.com/yiisoft/yii2/actions) -[![Code Coverage](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/coverage.png?s=31d80f1036099e9d6a3e4d7738f6b000b3c3d10e)](https://scrutinizer-ci.com/g/yiisoft/yii2/) +[![codecov](https://codecov.io/gh/yiisoft/yii2/graph/badge.svg?token=Exm6sRwhJ6)](https://codecov.io/gh/yiisoft/yii2) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/quality-score.png?s=b1074a1ff6d0b214d54fa5ab7abbb90fc092471d)](https://scrutinizer-ci.com/g/yiisoft/yii2/) Installation ------------ -- The minimum required PHP version of Yii is PHP 5.4. +- The minimum required PHP version of Yii is PHP 7.3. - It works best with PHP 8. - [Follow the Definitive Guide](https://www.yiiframework.com/doc-2.0/guide-start-installation.html) in order to get step by step instructions. From e82127e91d89fb4316585ed5bc2db35601ec8b96 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:08:16 -0300 Subject: [PATCH 101/125] Update arrayTypedProperty declaration to use PHP 7.4 typed properties. --- tests/data/validators/models/ValidatorTestTypedPropModel.php | 5 +---- tests/framework/validators/EachValidatorTest.php | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/data/validators/models/ValidatorTestTypedPropModel.php b/tests/data/validators/models/ValidatorTestTypedPropModel.php index 5c676911924..fa838e183d8 100644 --- a/tests/data/validators/models/ValidatorTestTypedPropModel.php +++ b/tests/data/validators/models/ValidatorTestTypedPropModel.php @@ -11,8 +11,5 @@ class ValidatorTestTypedPropModel extends Model { - /** - * @var array - */ - public $arrayTypedProperty = [true, false]; + public array $arrayTypedProperty = [true, false]; } diff --git a/tests/framework/validators/EachValidatorTest.php b/tests/framework/validators/EachValidatorTest.php index 05475f8475f..aa328b3287b 100644 --- a/tests/framework/validators/EachValidatorTest.php +++ b/tests/framework/validators/EachValidatorTest.php @@ -209,6 +209,8 @@ public function testValidateArrayAccess() * of different type during validation. * (ie: public array $dummy; where $dummy is array of booleans, * validator will try to assign these booleans one by one to $dummy) + * + * @requires PHP >= 7.4 */ public function testTypedProperties() { From 5a434ee93319368f1ce6fb8b8b92e6e76e2fed5f Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:18:12 -0300 Subject: [PATCH 102/125] Fix IsOneOfAssert constructor parameter type declaration. --- tests/IsOneOfAssert.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/IsOneOfAssert.php b/tests/IsOneOfAssert.php index 8e25a0d7349..36615a70b10 100644 --- a/tests/IsOneOfAssert.php +++ b/tests/IsOneOfAssert.php @@ -19,7 +19,7 @@ class IsOneOfAssert extends \PHPUnit\Framework\Constraint\Constraint */ private $allowedValues = []; - public function __construct($allowedValues) + public function __construct(array $allowedValues) { $this->allowedValues = $allowedValues; } @@ -42,6 +42,6 @@ public function toString(): string protected function matches($other): bool { - return in_array($other, $this->allowedValues); + return in_array($other, $this->allowedValues, false); } } From e10fd41a43f18ac99e894fee3cc0d881fdf0e107 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:21:21 -0300 Subject: [PATCH 103/125] Fix build.yml action. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a6fbed5e181..88ce382fa52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,7 +67,7 @@ jobs: run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --coverage-clover=coverage.xml --colors=always - name: Run tests with PHPUnit. - if: matrix.php >= '8.0' + if: matrix.php != '7.4' run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always - name: Upload coverage to Codecov. From d852773caea076c1e206f8f153fab103b0b584b8 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:31:03 -0300 Subject: [PATCH 104/125] Revert use `@requires`. --- tests/framework/helpers/ArrayHelperTest.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php index 593d4007be5..f450b281f7a 100644 --- a/tests/framework/helpers/ArrayHelperTest.php +++ b/tests/framework/helpers/ArrayHelperTest.php @@ -136,12 +136,14 @@ public function testRemove() } /** - * @requires PHP < 8.1 - * * @return void */ public function testRemoveWithFloat() { + if (version_compare(PHP_VERSION, '8.1.0', '>=')) { + $this->markTestSkipped('Using floats as array key is deprecated.'); + } + $array = ['name' => 'b', 'age' => 3, 1.1 => null]; $name = ArrayHelper::remove($array, 'name'); @@ -525,12 +527,14 @@ public function testMergeEmpty() } /** - * @requires PHP < 8.1 - * * @see https://github.com/yiisoft/yii2/pull/11549 */ public function testGetValueWithFloatKeys() { + if (version_compare(PHP_VERSION, '8.1.0', '>=')) { + $this->markTestSkipped('Using floats as array key is deprecated.'); + } + $array = []; $array[1.1] = 'some value'; $array[2.1] = null; @@ -750,11 +754,12 @@ public function testKeyExists() $this->assertFalse(ArrayHelper::keyExists('c', $array, false)); } - /** - * @requires PHP < 8.1 - */ public function testKeyExistsWithFloat() { + if (version_compare(PHP_VERSION, '8.1.0', '>=')) { + $this->markTestSkipped('Using floats as array key is deprecated.'); + } + $array = [ 1 => 3, 2.2 => 4, // Note: Floats are cast to ints, which means that the fractional part will be truncated. From efa3296b20c563191e147ab6a25e6eb09e491b00 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:40:15 -0300 Subject: [PATCH 105/125] Revert remove `testCastValues()` in `ActiveRecordTest.php`. --- tests/framework/db/ActiveRecordTest.php | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index 955dabbd934..d631023082e 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1424,6 +1424,35 @@ public function testUnlinkAllViaTable() $this->assertEquals(5, $itemClass::find()->count()); } + public function testCastValues() + { + $model = new Type(); + $model->int_col = 123; + $model->int_col2 = 456; + $model->smallint_col = 42; + $model->char_col = '1337'; + $model->char_col2 = 'test'; + $model->char_col3 = 'test123'; + $model->float_col = 3.742; + $model->float_col2 = 42.1337; + $model->bool_col = true; + $model->bool_col2 = false; + $model->save(false); + + /* @var $model Type */ + $model = Type::find()->one(); + $this->assertSame(123, $model->int_col); + $this->assertSame(456, $model->int_col2); + $this->assertSame(42, $model->smallint_col); + $this->assertSame('1337', trim((string) $model->char_col)); + $this->assertSame('test', $model->char_col2); + $this->assertSame('test123', $model->char_col3); + $this->assertEquals(3.742, $model->float_col); + $this->assertEquals(42.1337, $model->float_col2); + $this->assertSame(true, $model->bool_col); + $this->assertSame(false, $model->bool_col2); + } + public function testIssues() { // https://github.com/yiisoft/yii2/issues/4938 From d6a970b0addc512f043a4049034f5d6419a43d9e Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 08:56:29 -0300 Subject: [PATCH 106/125] Fix `testCastValues()`. --- tests/framework/db/ActiveRecordTest.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index d631023082e..867c186ecb9 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1447,10 +1447,10 @@ public function testCastValues() $this->assertSame('1337', trim((string) $model->char_col)); $this->assertSame('test', $model->char_col2); $this->assertSame('test123', $model->char_col3); - $this->assertEquals(3.742, $model->float_col); - $this->assertEquals(42.1337, $model->float_col2); - $this->assertSame(true, $model->bool_col); - $this->assertSame(false, $model->bool_col2); + $this->assertSame(3.742, $model->float_col); + $this->assertSame(42.1337, $model->float_col2); + //$this->assertSame(true, $model->bool_col); + //$this->assertSame(false, $model->bool_col2); } public function testIssues() @@ -2089,10 +2089,11 @@ public function testResetNotSavedRelation() $this->assertEquals(1, sizeof($order->orderItems)); } - public function testIssetException() + public function testIssetThrowable() { $cat = new Cat(); - $this->assertFalse(isset($cat->exception)); + $this->assertFalse(isset($cat->throwable)); + } /** From 843368cd0cc08efedd9e6acd83b75401edf62a22 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 09:07:39 -0300 Subject: [PATCH 107/125] Fix tests `testCastValues()` for `mssql`, `mysql`. --- tests/framework/db/ActiveRecordTest.php | 4 +-- tests/framework/db/mssql/ActiveRecordTest.php | 30 +++++++++++++++++++ tests/framework/db/mysql/ActiveRecordTest.php | 30 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index 867c186ecb9..264212a08c5 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1449,8 +1449,8 @@ public function testCastValues() $this->assertSame('test123', $model->char_col3); $this->assertSame(3.742, $model->float_col); $this->assertSame(42.1337, $model->float_col2); - //$this->assertSame(true, $model->bool_col); - //$this->assertSame(false, $model->bool_col2); + $this->assertSame(true, $model->bool_col); + $this->assertSame(false, $model->bool_col2); } public function testIssues() diff --git a/tests/framework/db/mssql/ActiveRecordTest.php b/tests/framework/db/mssql/ActiveRecordTest.php index 6b6841fa138..d126436bdcd 100644 --- a/tests/framework/db/mssql/ActiveRecordTest.php +++ b/tests/framework/db/mssql/ActiveRecordTest.php @@ -11,6 +11,7 @@ use yii\db\Expression; use yiiunit\data\ar\TestTrigger; use yiiunit\data\ar\TestTriggerAlert; +use yiiunit\data\ar\Type; /** * @group db @@ -25,6 +26,35 @@ public function testExplicitPkOnAutoIncrement() $this->markTestSkipped('MSSQL does not support explicit value for an IDENTITY column.'); } + public function testCastValues() + { + $model = new Type(); + $model->int_col = 123; + $model->int_col2 = 456; + $model->smallint_col = 42; + $model->char_col = '1337'; + $model->char_col2 = 'test'; + $model->char_col3 = 'test123'; + $model->float_col = 3.742; + $model->float_col2 = 42.1337; + $model->bool_col = true; + $model->bool_col2 = false; + $model->save(false); + + /* @var $model Type */ + $model = Type::find()->one(); + $this->assertSame(123, $model->int_col); + $this->assertSame(456, $model->int_col2); + $this->assertSame(42, $model->smallint_col); + $this->assertSame('1337', trim((string) $model->char_col)); + $this->assertSame('test', $model->char_col2); + $this->assertSame('test123', $model->char_col3); + //$this->assertSame(3.742, $model->float_col); + //$this->assertSame(42.1337, $model->float_col2); + //$this->assertSame(true, $model->bool_col); + //$this->assertSame(false, $model->bool_col2); + } + /** * @throws Exception */ diff --git a/tests/framework/db/mysql/ActiveRecordTest.php b/tests/framework/db/mysql/ActiveRecordTest.php index 27105693fed..95b91001179 100644 --- a/tests/framework/db/mysql/ActiveRecordTest.php +++ b/tests/framework/db/mysql/ActiveRecordTest.php @@ -8,6 +8,7 @@ namespace yiiunit\framework\db\mysql; use yiiunit\data\ar\Storage; +use yiiunit\data\ar\Type; /** * @group db @@ -17,6 +18,35 @@ class ActiveRecordTest extends \yiiunit\framework\db\ActiveRecordTest { public $driverName = 'mysql'; + public function testCastValues() + { + $model = new Type(); + $model->int_col = 123; + $model->int_col2 = 456; + $model->smallint_col = 42; + $model->char_col = '1337'; + $model->char_col2 = 'test'; + $model->char_col3 = 'test123'; + $model->float_col = 3.742; + $model->float_col2 = 42.1337; + $model->bool_col = true; + $model->bool_col2 = false; + $model->save(false); + + /* @var $model Type */ + $model = Type::find()->one(); + $this->assertSame(123, $model->int_col); + $this->assertSame(456, $model->int_col2); + $this->assertSame(42, $model->smallint_col); + $this->assertSame('1337', trim((string) $model->char_col)); + $this->assertSame('test', $model->char_col2); + $this->assertSame('test123', $model->char_col3); + $this->assertSame(3.742, $model->float_col); + $this->assertSame(42.1337, $model->float_col2); + //$this->assertSame(true, $model->bool_col); + //$this->assertSame(false, $model->bool_col2); + } + public function testJsonColumn() { if (version_compare($this->getConnection()->getSchema()->getServerVersion(), '5.7', '<')) { From e7f233c4b89cc69634518ffbf7c0b2a1cd36d461 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 09:35:28 -0300 Subject: [PATCH 108/125] Revert remove `testVariadicConstructor()`, `testVariadicCallable()` in `ContainerTest.php`. --- tests/framework/di/ContainerTest.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php index 89df53651e0..ff2be8feaf6 100644 --- a/tests/framework/di/ContainerTest.php +++ b/tests/framework/di/ContainerTest.php @@ -479,6 +479,25 @@ public function testContainerSingletons() $this->assertSame($foo, $sameFoo); } + public function testVariadicConstructor() + { + if (\defined('HHVM_VERSION')) { + static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); + } + + $container = new Container(); + $container->get('yiiunit\framework\di\stubs\Variadic'); + } + + public function testVariadicCallable() + { + if (\defined('HHVM_VERSION')) { + static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); + } + + require __DIR__ . '/testContainerWithVariadicCallable.php'; + } + /** * @see https://github.com/yiisoft/yii2/issues/18245 */ From 4b1281618a57a93d32ab5822502b7b06a45807a4 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 09:43:20 -0300 Subject: [PATCH 109/125] Fix `testVariadicConstructor` and `testVariadicCallable` in `ContainerTest.php`. --- tests/framework/di/ContainerTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php index ff2be8feaf6..b4c425b089f 100644 --- a/tests/framework/di/ContainerTest.php +++ b/tests/framework/di/ContainerTest.php @@ -481,6 +481,8 @@ public function testContainerSingletons() public function testVariadicConstructor() { + $this->expectNotToPerformAssertions(); + if (\defined('HHVM_VERSION')) { static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); } @@ -491,13 +493,15 @@ public function testVariadicConstructor() public function testVariadicCallable() { + $this->expectNotToPerformAssertions(); + if (\defined('HHVM_VERSION')) { static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); } require __DIR__ . '/testContainerWithVariadicCallable.php'; } - + /** * @see https://github.com/yiisoft/yii2/issues/18245 */ From 3357e64ee664f0b9d038ccd213f837d9e75f2cea Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 21 Mar 2024 09:56:54 -0300 Subject: [PATCH 110/125] Remove test of data providers, and replace `expectNotToPerformAssertions()` to `assertTrue(true)` for code coverage. --- tests/framework/db/ActiveRecordTest.php | 4 ++-- tests/framework/db/oci/ConnectionTest.php | 4 ++-- tests/framework/di/ContainerTest.php | 12 ++++++------ tests/framework/grid/GridViewTest.php | 4 ++-- tests/framework/helpers/FileHelperTest.php | 4 ++-- tests/framework/helpers/HtmlTest.php | 12 ++++-------- tests/framework/helpers/IpHelperTest.php | 3 +-- tests/framework/rest/UrlRuleTest.php | 7 +++---- tests/framework/web/UrlRuleTest.php | 7 +++---- tests/framework/widgets/ActiveFormTest.php | 4 ++-- 10 files changed, 27 insertions(+), 34 deletions(-) diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index 264212a08c5..389f470c768 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1931,11 +1931,11 @@ public function legalValuesForFindByCondition() */ public function testLegalValuesForFindByCondition($modelClassName, $validFilter) { - $this->expectNotToPerformAssertions(); - /** @var Query $query */ $query = $this->invokeMethod(\Yii::createObject($modelClassName), 'findByCondition', [$validFilter]); Customer::getDb()->queryBuilder->build($query); + + $this->assertTrue(true); } public function illegalValuesForFindByCondition() diff --git a/tests/framework/db/oci/ConnectionTest.php b/tests/framework/db/oci/ConnectionTest.php index 0b1a5f0d03b..76992cce915 100644 --- a/tests/framework/db/oci/ConnectionTest.php +++ b/tests/framework/db/oci/ConnectionTest.php @@ -78,8 +78,6 @@ public function testQuoteFullColumnName() public function testTransactionIsolation() { - $this->expectNotToPerformAssertions(); - $connection = $this->getConnection(true); $transaction = $connection->beginTransaction(Transaction::READ_COMMITTED); @@ -87,6 +85,8 @@ public function testTransactionIsolation() $transaction = $connection->beginTransaction(Transaction::SERIALIZABLE); $transaction->commit(); + + $this->assertTrue(true); } /** diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php index b4c425b089f..ba62b598b73 100644 --- a/tests/framework/di/ContainerTest.php +++ b/tests/framework/di/ContainerTest.php @@ -481,25 +481,25 @@ public function testContainerSingletons() public function testVariadicConstructor() { - $this->expectNotToPerformAssertions(); - if (\defined('HHVM_VERSION')) { static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); } $container = new Container(); $container->get('yiiunit\framework\di\stubs\Variadic'); + + $this->assertTrue(true); } public function testVariadicCallable() { - $this->expectNotToPerformAssertions(); - if (\defined('HHVM_VERSION')) { static::markTestSkipped('Can not test on HHVM because it does not support variadics.'); } require __DIR__ . '/testContainerWithVariadicCallable.php'; + + $this->assertTrue(true); } /** @@ -507,8 +507,6 @@ public function testVariadicCallable() */ public function testDelayedInitializationOfSubArray() { - $this->expectNotToPerformAssertions(); - $definitions = [ 'test' => [ 'class' => Corge::className(), @@ -534,6 +532,8 @@ public function testDelayedInitializationOfSubArray() Yii::$container->set('setLater', new Qux()); Yii::$container->get('test'); + + $this->assertTrue(true); } /** diff --git a/tests/framework/grid/GridViewTest.php b/tests/framework/grid/GridViewTest.php index e151e257d42..cdf63756c8f 100644 --- a/tests/framework/grid/GridViewTest.php +++ b/tests/framework/grid/GridViewTest.php @@ -155,8 +155,6 @@ public function testFooter() { public function testHeaderLabels() { - $this->expectNotToPerformAssertions(); - // Ensure GridView does not call Model::generateAttributeLabel() to generate labels unless the labels are explicitly used. $this->mockApplication([ 'components' => [ @@ -200,5 +198,7 @@ public function testHeaderLabels() ]); $grid->renderTableHeader(); // If NoAutoLabels::generateAttributeLabel() has not been called no exception will be thrown meaning this test passed successfully. + + $this->assertTrue(true); } } diff --git a/tests/framework/helpers/FileHelperTest.php b/tests/framework/helpers/FileHelperTest.php index d13e57e8218..c8b3f34427f 100644 --- a/tests/framework/helpers/FileHelperTest.php +++ b/tests/framework/helpers/FileHelperTest.php @@ -359,8 +359,6 @@ public function testCopyDirToAnotherWithSameName() */ public function testCopyDirWithSameName() { - $this->expectNotToPerformAssertions(); - $this->createFileStructure([ 'data' => [], 'data-backup' => [], @@ -370,6 +368,8 @@ public function testCopyDirWithSameName() $this->testFilePath . DIRECTORY_SEPARATOR . 'data', $this->testFilePath . DIRECTORY_SEPARATOR . 'data-backup' ); + + $this->assertTrue(true); } public function testRemoveDirectory() diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index 6bb38ccc653..c8d36466813 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -2060,7 +2060,7 @@ public function testGetInputName() } /** - * @dataProvider testGetInputIdDataProvider + * @dataProvider getInputIdDataProvider */ public function testGetInputId($attributeName, $inputIdExpected) { @@ -2073,7 +2073,7 @@ public function testGetInputId($attributeName, $inputIdExpected) } /** - * @dataProvider testGetInputIdByNameDataProvider + * @dataProvider getInputIdByNameDataProvider */ public function testGetInputIdByName($attributeName, $inputIdExpected) { @@ -2182,10 +2182,8 @@ public function testOverrideSetActivePlaceholder() $this->assertStringContainsString('placeholder="My placeholder: Name"', $html); } - public function testGetInputIdDataProvider() + public static function getInputIdDataProvider() { - $this->expectNotToPerformAssertions(); - return [ [ 'foo', @@ -2223,10 +2221,8 @@ public function testGetInputIdDataProvider() ]; } - public function testGetInputIdByNameDataProvider() + public static function getInputIdByNameDataProvider() { - $this->expectNotToPerformAssertions(); - return [ [ 'foo', diff --git a/tests/framework/helpers/IpHelperTest.php b/tests/framework/helpers/IpHelperTest.php index ae90bb6a056..fb6b1e40371 100644 --- a/tests/framework/helpers/IpHelperTest.php +++ b/tests/framework/helpers/IpHelperTest.php @@ -54,9 +54,8 @@ public function expandIpv6Provider() public function testIpv6ExpandingWithInvalidValue() { try { - $this->expectNotToPerformAssertions(); - IpHelper::expandIPv6('fa01::1/64'); + $this->assertTrue(true); } catch (\Exception $exception) { $this->assertStringEndsWith('Unrecognized address fa01::1/64', $exception->getMessage()); } diff --git a/tests/framework/rest/UrlRuleTest.php b/tests/framework/rest/UrlRuleTest.php index f2c5b4b6a89..9cc39935f7d 100644 --- a/tests/framework/rest/UrlRuleTest.php +++ b/tests/framework/rest/UrlRuleTest.php @@ -376,7 +376,8 @@ public function testCreateUrl($ruleConfig, $tests) } /** - * @dataProvider testGetCreateUrlStatusProvider + * @dataProvider getCreateUrlStatusProvider + * * @param array $ruleConfig * @param array $tests */ @@ -413,10 +414,8 @@ public function testGetCreateUrlStatus($ruleConfig, $tests) * - second element is the expected URL * - third element is the expected result of getCreateUrlStatus() method */ - public function testGetCreateUrlStatusProvider() + public static function getCreateUrlStatusProvider() { - $this->expectNotToPerformAssertions(); - return [ 'single controller' => [ // rule properties diff --git a/tests/framework/web/UrlRuleTest.php b/tests/framework/web/UrlRuleTest.php index f1d2dd6ee28..1602f4eff5b 100644 --- a/tests/framework/web/UrlRuleTest.php +++ b/tests/framework/web/UrlRuleTest.php @@ -1292,7 +1292,8 @@ protected function getTestsForToString() } /** - * @dataProvider testGetCreateUrlStatusProvider + * @dataProvider getCreateUrlStatusProvider + * * @param array $config * @param array $tests */ @@ -1329,10 +1330,8 @@ public function testGetCreateUrlStatus($config, $tests) * - third element is the expected URL * - fourth element is the expected result of getCreateUrlStatus() method */ - public function testGetCreateUrlStatusProvider() + public static function getCreateUrlStatusProvider() { - $this->expectNotToPerformAssertions(); - return [ 'route' => [ // rule properties diff --git a/tests/framework/widgets/ActiveFormTest.php b/tests/framework/widgets/ActiveFormTest.php index 4cca48b68f6..313b3459076 100644 --- a/tests/framework/widgets/ActiveFormTest.php +++ b/tests/framework/widgets/ActiveFormTest.php @@ -110,8 +110,6 @@ public function testOutputBuffering() public function testRegisterClientScript() { - $this->expectNotToPerformAssertions(); - $this->mockWebApplication(); $_SERVER['REQUEST_URI'] = 'http://example.com/'; @@ -135,6 +133,8 @@ public function testRegisterClientScript() $form->field($model, 'name'); $form::end(); ob_get_clean(); + + $this->assertTrue(true); } /** From 28cbf6cde5ff89fc1049d4015b7e4deea8c542cf Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Fri, 22 Mar 2024 04:29:27 -0300 Subject: [PATCH 111/125] Add tests for `PHP 8.4`. (#20132) --- .github/workflows/build.yml | 4 ++++ .github/workflows/ci-mssql.yml | 2 ++ .github/workflows/ci-mysql.yml | 16 +++------------- .github/workflows/ci-oracle.yml | 7 ++----- .github/workflows/ci-pgsql.yml | 20 +++----------------- .github/workflows/ci-sqlite.yml | 11 ++--------- 6 files changed, 16 insertions(+), 44 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2cc61a4f5b..876d76610d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,6 +69,10 @@ jobs: extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached coverage: none os: ubuntu-latest + - php: 8.4 + extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached + coverage: none + os: ubuntu-latest steps: - name: Generate french locale. diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index e80550119d0..b29e36b5456 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -31,6 +31,8 @@ jobs: mssql: server:2022-latest - php: 8.3 mssql: server:2022-latest + - php: 8.4 + mssql: server:2022-latest services: mssql: diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index 4e0f651aae9..c4a98556972 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -19,19 +19,9 @@ jobs: strategy: matrix: - os: - - ubuntu-latest - - php: - - 7.4 - - 8.0 - - 8.1 - - 8.2 - - 8.3 - - mysql: - - 5.7 - - latest + os: [ubuntu-latest] + php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] + mysql: [5.7, latest] services: mysql: diff --git a/.github/workflows/ci-oracle.yml b/.github/workflows/ci-oracle.yml index be139ff540c..42f12dbbcd3 100644 --- a/.github/workflows/ci-oracle.yml +++ b/.github/workflows/ci-oracle.yml @@ -20,11 +20,8 @@ jobs: strategy: matrix: - os: - - ubuntu-latest - - php: - - 7.4 + os: [ubuntu-latest] + php: [7.4] services: oci: diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index ba0217e2212..c1af0205684 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -19,23 +19,9 @@ jobs: strategy: matrix: - os: - - ubuntu-latest - - php: - - 7.4 - - 8.0 - - 8.1 - - 8.2 - - 8.3 - - pgsql: - - 10 - - 11 - - 12 - - 13 - - 14 - - 15 + os: [ubuntu-latest] + php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] + pgsql: [10, 11, 12, 13, 14, 15] services: postgres: diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index 707ecb1b9aa..03648262d99 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -20,15 +20,8 @@ jobs: strategy: matrix: - os: - - ubuntu-latest - - php: - - 7.4 - - 8.0 - - 8.1 - - 8.2 - - 8.3 + os: [ubuntu-latest] + php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] steps: - name: Checkout. From 2f9c24e130b779600bf7ca430754c20845c31847 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 22 Mar 2024 06:59:15 -0300 Subject: [PATCH 112/125] Update CI workflows to disable fail-fast strategy. --- .github/workflows/ci-mssql.yml | 1 + .github/workflows/ci-mysql.yml | 1 + .github/workflows/ci-pgsql.yml | 1 + .github/workflows/ci-sqlite.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index a4e17c86abd..698cf613040 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -19,6 +19,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: include: - php: 7.4 diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index a5f658b18b2..7bec2352248 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -18,6 +18,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: os: [ubuntu-latest] php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index de21615bcb7..8dd8b3d6da5 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -18,6 +18,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: os: [ubuntu-latest] php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index 0b7e1ca75d4..bf53dc35975 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -19,6 +19,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: os: [ubuntu-latest] php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4] From a292af13bf78c56629bb38312866cb0c417588d8 Mon Sep 17 00:00:00 2001 From: Ayesh Karunaratne Date: Tue, 26 Mar 2024 15:27:58 +0700 Subject: [PATCH 113/125] [PHP 8.4] Fixes for implicit nullability deprecation (#20133) Fixes all issues that emit deprecation notices on PHP 8.4 for implicit nullable parameter type declarations. Related to #20128. See: - [RFC](https://wiki.php.net/rfc/deprecate-implicitly-nullable-types) - [PHP 8.4: Implicitly nullable parameter declarations deprecated](https://php.watch/versions/8.4/implicitly-marking-parameter-type-nullable-deprecated) Co-authored-by: Wilmer Arambula Co-authored-by: Alexander Makarov --- framework/base/Component.php | 2 +- framework/db/ActiveQuery.php | 2 +- framework/db/ActiveQueryInterface.php | 2 +- framework/db/ActiveRelationTrait.php | 2 +- framework/mail/BaseMessage.php | 2 +- framework/mail/MessageInterface.php | 2 +- tests/framework/console/FakePhp71Controller.php | 2 +- tests/framework/di/ContainerTest.php | 2 +- tests/framework/di/stubs/Alpha.php | 8 ++++---- tests/framework/web/FakePhp71Controller.php | 2 +- tests/framework/web/FakePhp7Controller.php | 4 ++-- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/framework/base/Component.php b/framework/base/Component.php index fb4805df0ce..f2eb9bf05c1 100644 --- a/framework/base/Component.php +++ b/framework/base/Component.php @@ -605,7 +605,7 @@ public function off($name, $handler = null) * @param string $name the event name * @param Event|null $event the event instance. If not set, a default [[Event]] object will be created. */ - public function trigger($name, Event $event = null) + public function trigger($name, ?Event $event = null) { $this->ensureBehaviors(); diff --git a/framework/db/ActiveQuery.php b/framework/db/ActiveQuery.php index 2153e7db155..8f5fc9903e1 100644 --- a/framework/db/ActiveQuery.php +++ b/framework/db/ActiveQuery.php @@ -785,7 +785,7 @@ public function orOnCondition($condition, $params = []) * @throws InvalidConfigException when query is not initialized properly * @see via() */ - public function viaTable($tableName, $link, callable $callable = null) + public function viaTable($tableName, $link, ?callable $callable = null) { $modelClass = $this->primaryModel ? get_class($this->primaryModel) : $this->modelClass; $relation = new self($modelClass, [ diff --git a/framework/db/ActiveQueryInterface.php b/framework/db/ActiveQueryInterface.php index ec53af2d4bc..f15e49eb008 100644 --- a/framework/db/ActiveQueryInterface.php +++ b/framework/db/ActiveQueryInterface.php @@ -97,7 +97,7 @@ public function with(); * Its signature should be `function($query)`, where `$query` is the query to be customized. * @return $this the relation object itself. */ - public function via($relationName, callable $callable = null); + public function via($relationName, ?callable $callable = null); /** * Finds the related records for the specified primary record. diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php index 7e01e25fd99..467203e8a9f 100644 --- a/framework/db/ActiveRelationTrait.php +++ b/framework/db/ActiveRelationTrait.php @@ -104,7 +104,7 @@ public function __clone() * Its signature should be `function($query)`, where `$query` is the query to be customized. * @return $this the relation object itself. */ - public function via($relationName, callable $callable = null) + public function via($relationName, ?callable $callable = null) { $relation = $this->primaryModel->getRelation($relationName); $callableUsed = $callable !== null; diff --git a/framework/mail/BaseMessage.php b/framework/mail/BaseMessage.php index ca53dac10c9..30940994499 100644 --- a/framework/mail/BaseMessage.php +++ b/framework/mail/BaseMessage.php @@ -39,7 +39,7 @@ abstract class BaseMessage extends BaseObject implements MessageInterface * the "mailer" application component will be used instead. * @return bool whether this message is sent successfully. */ - public function send(MailerInterface $mailer = null) + public function send(?MailerInterface $mailer = null) { if ($mailer === null && $this->mailer === null) { $mailer = Yii::$app->getMailer(); diff --git a/framework/mail/MessageInterface.php b/framework/mail/MessageInterface.php index 091dce5faa7..e4c62a2d528 100644 --- a/framework/mail/MessageInterface.php +++ b/framework/mail/MessageInterface.php @@ -209,7 +209,7 @@ public function embedContent($content, array $options = []); * If null, the "mailer" application component will be used instead. * @return bool whether this message is sent successfully. */ - public function send(MailerInterface $mailer = null); + public function send(?MailerInterface $mailer = null); /** * Returns string representation of this message. diff --git a/tests/framework/console/FakePhp71Controller.php b/tests/framework/console/FakePhp71Controller.php index dbed836f8d1..cc23ae60299 100644 --- a/tests/framework/console/FakePhp71Controller.php +++ b/tests/framework/console/FakePhp71Controller.php @@ -14,7 +14,7 @@ class FakePhp71Controller extends Controller { - public function actionInjection($before, Request $request, $between, DummyService $dummyService, Post $post = null, $after) + public function actionInjection($before, Request $request, $between, DummyService $dummyService, ?Post $post = null, $after) { } diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php index ba62b598b73..2555f43c2d6 100644 --- a/tests/framework/di/ContainerTest.php +++ b/tests/framework/di/ContainerTest.php @@ -252,7 +252,7 @@ public function testOptionalDependencies() { $container = new Container(); // Test optional unresolvable dependency. - $closure = function (QuxInterface $test = null) { + $closure = function (?QuxInterface $test = null) { return $test; }; $this->assertNull($container->invoke($closure)); diff --git a/tests/framework/di/stubs/Alpha.php b/tests/framework/di/stubs/Alpha.php index 151d2f109bb..a5af3ffed78 100644 --- a/tests/framework/di/stubs/Alpha.php +++ b/tests/framework/di/stubs/Alpha.php @@ -12,10 +12,10 @@ class Alpha extends BaseObject public $color = true; public function __construct( - Beta $beta = null, - QuxInterface $omega = null, - Unknown $unknown = null, - AbstractColor $color = null + ?Beta $beta = null, + ?QuxInterface $omega = null, + ?Unknown $unknown = null, + ?AbstractColor $color = null ) { $this->beta = $beta; $this->omega = $omega; diff --git a/tests/framework/web/FakePhp71Controller.php b/tests/framework/web/FakePhp71Controller.php index d8aa0e406c5..f84214c6e8d 100644 --- a/tests/framework/web/FakePhp71Controller.php +++ b/tests/framework/web/FakePhp71Controller.php @@ -21,7 +21,7 @@ class FakePhp71Controller extends Controller { public $enableCsrfValidation = false; - public function actionInjection($before, Request $request, $between, VendorImage $vendorImage, Post $post = null, $after) + public function actionInjection($before, Request $request, $between, VendorImage $vendorImage, ?Post $post = null, $after) { } diff --git a/tests/framework/web/FakePhp7Controller.php b/tests/framework/web/FakePhp7Controller.php index 4d267a85e15..381ba3e0ee3 100644 --- a/tests/framework/web/FakePhp7Controller.php +++ b/tests/framework/web/FakePhp7Controller.php @@ -17,11 +17,11 @@ class FakePhp7Controller extends Controller { public $enableCsrfValidation = false; - public function actionAksi1(int $foo, float $bar = null, bool $true, bool $false) + public function actionAksi1(int $foo, ?float $bar = null, bool $true, bool $false) { } - public function actionStringy(string $foo = null) + public function actionStringy(?string $foo = null) { } } From 923c30938df274a3b57a77fed9683dca85ad5a8a Mon Sep 17 00:00:00 2001 From: Wilmer Arambula <42547589+terabytesoftw@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:31:20 -0300 Subject: [PATCH 114/125] Fix optional parameter declared before required parameter implicitly (#20139) --- tests/framework/console/FakePhp71Controller.php | 11 ++++++++--- tests/framework/web/FakePhp71Controller.php | 11 ++++++++--- tests/framework/web/FakePhp7Controller.php | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/framework/console/FakePhp71Controller.php b/tests/framework/console/FakePhp71Controller.php index cc23ae60299..44ba0fbd310 100644 --- a/tests/framework/console/FakePhp71Controller.php +++ b/tests/framework/console/FakePhp71Controller.php @@ -14,9 +14,14 @@ class FakePhp71Controller extends Controller { - public function actionInjection($before, Request $request, $between, DummyService $dummyService, ?Post $post = null, $after) - { - + public function actionInjection( + $before, + Request $request, + $between, + DummyService $dummyService, + ?Post $post, + $after + ) { } public function actionNullableInjection(?Request $request, ?Post $post) diff --git a/tests/framework/web/FakePhp71Controller.php b/tests/framework/web/FakePhp71Controller.php index f84214c6e8d..c48243e2fed 100644 --- a/tests/framework/web/FakePhp71Controller.php +++ b/tests/framework/web/FakePhp71Controller.php @@ -21,9 +21,14 @@ class FakePhp71Controller extends Controller { public $enableCsrfValidation = false; - public function actionInjection($before, Request $request, $between, VendorImage $vendorImage, ?Post $post = null, $after) - { - + public function actionInjection( + $before, + Request $request, + $between, + VendorImage $vendorImage, + ?Post $post, + $after + ) { } public function actionNullableInjection(?Request $request, ?Post $post) diff --git a/tests/framework/web/FakePhp7Controller.php b/tests/framework/web/FakePhp7Controller.php index 381ba3e0ee3..74008f49fad 100644 --- a/tests/framework/web/FakePhp7Controller.php +++ b/tests/framework/web/FakePhp7Controller.php @@ -17,7 +17,7 @@ class FakePhp7Controller extends Controller { public $enableCsrfValidation = false; - public function actionAksi1(int $foo, ?float $bar = null, bool $true, bool $false) + public function actionAksi1(int $foo, ?float $bar, bool $true, bool $false) { } From 953a1265d7f68b936069d824f9dd5bf6b0fb8305 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Tue, 26 Mar 2024 15:04:45 -0300 Subject: [PATCH 115/125] Update `ezyang/htmlpurifier` dependency to version `4.17`. --- .github/workflows/build.yml | 5 +++++ .github/workflows/ci-mssql.yml | 5 +++++ .github/workflows/ci-mysql.yml | 7 ++++++- .github/workflows/ci-pgsql.yml | 7 ++++++- .github/workflows/ci-sqlite.yml | 7 ++++++- composer.json | 2 +- framework/composer.json | 2 +- 7 files changed, 30 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a0e2bd033aa..9e8e898b3d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -65,8 +65,13 @@ jobs: uses: niden/actions-memcached@v7 - name: Install dependencies. + if: matrix.php != '8.4' run: composer update $DEFAULT_COMPOSER_FLAGS + - name: Install dependencies with PHP 8.4. + if: matrix.php == '8.4' + run: composer update $DEFAULT_COMPOSER_FLAGS --ignore-platform-reqs + - name: Run tests with PHPUnit and generate coverage. if: matrix.php == '7.4' run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --coverage-clover=coverage.xml --colors=always diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml index 698cf613040..5ed0abcb763 100644 --- a/.github/workflows/ci-mssql.yml +++ b/.github/workflows/ci-mssql.yml @@ -66,8 +66,13 @@ jobs: run: composer self-update - name: Install dependencies with composer + if: matrix.php != '8.4' run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + - name: Install dependencies with PHP 8.4. + if: matrix.php == '8.4' + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ignore-platform-reqs --ansi + - name: Run MSSQL tests with PHPUnit and generate coverage. run: vendor/bin/phpunit --group mssql --coverage-clover=coverage.xml --colors=always diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml index 7bec2352248..5753d916958 100644 --- a/.github/workflows/ci-mysql.yml +++ b/.github/workflows/ci-mysql.yml @@ -47,9 +47,14 @@ jobs: php-version: ${{ matrix.php }} tools: composer:v2, pecl - - name: Install dependencies with composer. + - name: Install dependencies with composer + if: matrix.php != '8.4' run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + - name: Install dependencies with PHP 8.4. + if: matrix.php == '8.4' + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ignore-platform-reqs --ansi + - name: Run MySQL tests with PHPUnit and generate coverage. run: vendor/bin/phpunit --group mysql --coverage-clover=coverage.xml --colors=always diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml index 8dd8b3d6da5..4b926645b82 100644 --- a/.github/workflows/ci-pgsql.yml +++ b/.github/workflows/ci-pgsql.yml @@ -51,9 +51,14 @@ jobs: - name: Update composer. run: composer self-update - - name: Install dependencies with composer. + - name: Install dependencies with composer + if: matrix.php != '8.4' run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + - name: Install dependencies with PHP 8.4. + if: matrix.php == '8.4' + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ignore-platform-reqs --ansi + - name: Run Pgsql tests with PHPUnit and generate coverage. run: vendor/bin/phpunit --group pgsql --coverage-clover=coverage.xml --colors=always diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml index bf53dc35975..fe7405ea4e2 100644 --- a/.github/workflows/ci-sqlite.yml +++ b/.github/workflows/ci-sqlite.yml @@ -40,9 +40,14 @@ jobs: - name: Update composer. run: composer self-update - - name: Install dependencies with composer. + - name: Install dependencies with composer + if: matrix.php != '8.4' run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi + - name: Install dependencies with PHP 8.4. + if: matrix.php == '8.4' + run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ignore-platform-reqs --ansi + - name: Run SQLite tests with PHPUnit and generate coverage. run: vendor/bin/phpunit --group sqlite --coverage-clover=coverage.xml --colors=always diff --git a/composer.json b/composer.json index 90dc2720717..af172dbb762 100644 --- a/composer.json +++ b/composer.json @@ -73,7 +73,7 @@ "ext-ctype": "*", "lib-pcre": "*", "yiisoft/yii2-composer": "~2.0.4", - "ezyang/htmlpurifier": "^4.6", + "ezyang/htmlpurifier": "^4.17", "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", "bower-asset/inputmask": "^5.0.8 ", diff --git a/framework/composer.json b/framework/composer.json index 37c438afb17..d24703fb442 100644 --- a/framework/composer.json +++ b/framework/composer.json @@ -68,7 +68,7 @@ "ext-ctype": "*", "lib-pcre": "*", "yiisoft/yii2-composer": "~2.0.4", - "ezyang/htmlpurifier": "^4.6", + "ezyang/htmlpurifier": "^4.17", "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", "bower-asset/inputmask": "^5.0.8 ", From 26f9e326c4ceae2d67a8977ef83444986b7aa83e Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Wed, 27 Mar 2024 06:09:44 -0300 Subject: [PATCH 116/125] Add line to `CHANGELOG.md`. --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 57567d20712..84c56493049 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -22,7 +22,7 @@ Yii Framework 2 Change Log - Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) - Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) - Enh #20134: Raise minimum `PHP` version to `7.3` (@terabytesoftw) - +- Bug #20141: Update `ezyang/htmlpurifier` dependency to version `4.17` (@terabytesoftw) 2.0.49.2 October 12, 2023 ------------------------- From 1cdb04236d640c80d3193f77af0c381cd90253a3 Mon Sep 17 00:00:00 2001 From: Rutger Hertogh Date: Wed, 27 Mar 2024 21:19:02 +0100 Subject: [PATCH 117/125] Added "Versions & PHP compatibility" section to readme.md --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index b2aa8475b7a..4bc05115c8d 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,20 @@ and a [Definitive Guide Mirror](http://stuff.cebe.cc/yii2docs/) which is updated - For Yii 1.1 users, there is [Upgrading from Yii 1.1](https://www.yiiframework.com/doc/guide/2.0/en/intro-upgrade-from-v1) to get an idea of what has changed in 2.0. +Versions & PHP compatibility +---------------------------- + +| Yii2 Version | PHP version | Development status | EOL ¹ | +|--------------|----------------|-----------------------------------|----------------------------------------------------------------| +| <= 2.0.49.* | >= 5.4, <= 8.3 | security fixes only | 23 Nov 2026 ³ | +| >= 2.0.50 | >= 7.3, <= 8.4 | bug fixes and security fixes only | bugfixes till 23 Nov 2026 ³, security fixes till 21 Nov 2027 ⁴ | +| >= 2.2.0 ² | >= 8.1 | active development | | + +¹ All mentioned dates may be subject to change and no rights can be derived from them. +² Note: Yii 2.1 was [skipped](https://github.com/yiisoft/yii2/discussions/19831#discussioncomment-5858046), [Yii 2.2](https://github.com/yiisoft/yii2/tree/2.2) has not yet been released. +³ [PHP 8.3 EOL date](https://www.php.net/supported-versions.php). +⁴ [Expected PHP 8.4 EOL date](https://wiki.php.net/todo/php84). + Community --------- From e56e77732506a98bb79febe85d2bcb83b72e0b33 Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:40:02 +0200 Subject: [PATCH 118/125] Fix #20083: Fix deprecated warning implicit conversion from float --- framework/CHANGELOG.md | 1 + framework/i18n/Formatter.php | 2 +- tests/framework/i18n/FormatterDateTest.php | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 84c56493049..593400797e3 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,6 +20,7 @@ Yii Framework 2 Change Log - Enh #20042: Add empty array check to `ActiveQueryTrait::findWith()` (renkas) - Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992) - Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) +- Bug #20083: Fix deprecated warning implicit conversion from float (skepticspriggan) - Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) - Enh #20134: Raise minimum `PHP` version to `7.3` (@terabytesoftw) - Bug #20141: Update `ezyang/htmlpurifier` dependency to version `4.17` (@terabytesoftw) diff --git a/framework/i18n/Formatter.php b/framework/i18n/Formatter.php index b72385eaa59..c1b9d9106eb 100644 --- a/framework/i18n/Formatter.php +++ b/framework/i18n/Formatter.php @@ -1059,7 +1059,7 @@ public function asDuration($value, $implodeString = ', ', $negativeSign = '-') } elseif (is_numeric($value)) { $isNegative = $value < 0; $zeroDateTime = (new DateTime())->setTimestamp(0); - $valueDateTime = (new DateTime())->setTimestamp(abs($value)); + $valueDateTime = (new DateTime())->setTimestamp(abs((int) $value)); $interval = $valueDateTime->diff($zeroDateTime); } elseif (strncmp($value, 'P-', 2) === 0) { $interval = new DateInterval('P' . substr($value, 2)); diff --git a/tests/framework/i18n/FormatterDateTest.php b/tests/framework/i18n/FormatterDateTest.php index c62ff491b11..1af75fc49e0 100644 --- a/tests/framework/i18n/FormatterDateTest.php +++ b/tests/framework/i18n/FormatterDateTest.php @@ -536,6 +536,7 @@ public function testAsDuration() // other options $this->assertSame('minus 244 seconds', $this->formatter->asDuration($interval_244_seconds, ' and ', 'minus ')); $this->assertSame('minus 4 minutes and 4 seconds', $this->formatter->asDuration(-244, ' and ', 'minus ')); + $this->assertSame('1 second', $this->formatter->asDuration(1.5)); // Pass a inverted DateInterval string $this->assertSame('-1 year, 2 months, 10 days, 2 hours, 30 minutes', $this->formatter->asDuration('2008-05-11T15:30:00Z/2007-03-01T13:00:00Z')); From f7cba1b9de5efec695771868931ac48c0bd85a2f Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:40:39 +0200 Subject: [PATCH 119/125] Fix required branch not specified (#20143) --- docs/internals/git-workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/internals/git-workflow.md b/docs/internals/git-workflow.md index 11e8a499a6c..b3ede5011a0 100644 --- a/docs/internals/git-workflow.md +++ b/docs/internals/git-workflow.md @@ -111,7 +111,7 @@ review your suggestion, and provide appropriate feedback along the way. ### 2. Pull the latest code from the main Yii branch ``` -git pull upstream +git pull upstream master ``` You should start at this point for every new contribution to make sure you are working on the latest code. From bf3ada13fc37506bb8706c667b2a02b66a6c1d17 Mon Sep 17 00:00:00 2001 From: skepticspriggan <91023755+skepticspriggan@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:18:16 +0200 Subject: [PATCH 120/125] Fix #20087: Add custom attributes to script tags --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 5 +++++ framework/web/View.php | 5 +++++ tests/framework/helpers/HtmlTest.php | 15 +++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 593400797e3..a348dbf5bf4 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -21,6 +21,7 @@ Yii Framework 2 Change Log - Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992) - Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992) - Bug #20083: Fix deprecated warning implicit conversion from float (skepticspriggan) +- Enh #20087: Add custom attributes to script tags (skepticspriggan) - Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) - Enh #20134: Raise minimum `PHP` version to `7.3` (@terabytesoftw) - Bug #20141: Update `ezyang/htmlpurifier` dependency to version `4.17` (@terabytesoftw) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index e610af6ca1f..0eab768e6e9 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -220,6 +220,11 @@ public static function style($content, $options = []) */ public static function script($content, $options = []) { + $view = Yii::$app->getView(); + if ($view instanceof \yii\web\View && !empty($view->scriptOptions)) { + $options = array_merge($view->scriptOptions, $options); + } + return static::tag('script', $content, $options); } diff --git a/framework/web/View.php b/framework/web/View.php index 21970711a59..a23b1228ca1 100644 --- a/framework/web/View.php +++ b/framework/web/View.php @@ -131,6 +131,11 @@ class View extends \yii\base\View * @see registerJsFile() */ public $jsFiles = []; + /** + * @since 2.0.50 + * @var array the script tag options. + */ + public $scriptOptions = []; private $_assetManager; diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index c8d36466813..24c8186181b 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -90,6 +90,21 @@ public function testScript() $this->assertEquals("", Html::script($content, ['type' => 'text/js'])); } + public function testScriptCustomAttribute() + { + $nonce = Yii::$app->security->generateRandomString(); + $this->mockApplication([ + 'components' => [ + 'view' => [ + 'class' => 'yii\web\View', + 'scriptOptions' => ['nonce' => $nonce], + ], + ], + ]); + $content = 'a <>'; + $this->assertEquals("", Html::script($content)); + } + public function testCssFile() { $this->assertEquals('', Html::cssFile('http://example.com')); From a733e8a6b2cab85b2e0b686d3742a0bc07d279c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=20=D0=93?= <130832992+korsNaike@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:30:18 +0300 Subject: [PATCH 121/125] Add a throws comment to BaseActiveRecord save --- framework/db/BaseActiveRecord.php | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 41732caab1d..8931c84f3ed 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -681,6 +681,7 @@ public function getDirtyAttributes($names = null) * @param array|null $attributeNames list of attribute names that need to be saved. Defaults to null, * meaning all attributes that are loaded from DB will be saved. * @return bool whether the saving succeeded (i.e. no validation errors occurred). + * @throws Exception in case update or insert failed. */ public function save($runValidation = true, $attributeNames = null) { From 8861f7bd9daf66cf7db7edaeefc236e71685273e Mon Sep 17 00:00:00 2001 From: Vlad Varlamov Date: Sun, 14 Apr 2024 02:36:29 +0400 Subject: [PATCH 122/125] Fix #20137: Added `yii\caching\CallbackDependency` to allow using a callback to determine if a cache dependency is still valid --- docs/guide-es/caching-data.md | 1 + docs/guide-fr/caching-data.md | 2 +- docs/guide-ja/caching-data.md | 2 +- docs/guide-pt-BR/caching-data.md | 2 +- docs/guide-ru/caching-data.md | 1 + docs/guide-zh-CN/caching-data.md | 2 +- docs/guide/caching-data.md | 2 +- framework/CHANGELOG.md | 1 + framework/caching/CallbackDependency.php | 39 ++++++++++++++++++ framework/caching/FileDependency.php | 1 + framework/classes.php | 1 + .../caching/CallbackDependencyTest.php | 41 +++++++++++++++++++ 12 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 framework/caching/CallbackDependency.php create mode 100644 tests/framework/caching/CallbackDependencyTest.php diff --git a/docs/guide-es/caching-data.md b/docs/guide-es/caching-data.md index 1349865d064..7aa09cd71c0 100644 --- a/docs/guide-es/caching-data.md +++ b/docs/guide-es/caching-data.md @@ -191,6 +191,7 @@ Aquí abajo se muestra un sumario de las dependencias disponibles: - [[yii\caching\ChainedDependency]]: la dependencia cambia si cualquiera de las dependencias en la cadena cambia. - [[yii\caching\DbDependency]]: la dependencia cambia si el resultado de la consulta de la sentencia SQL especificada cambia. - [[yii\caching\ExpressionDependency]]: la dependencia cambia si el resultado de la expresión de PHP especificada cambia. +- [[yii\caching\CallbackDependency]]: la dipendenza viene modificata se il risultato della callback PHP specificata cambia. - [[yii\caching\FileDependency]]: la dependencia cambia si se modifica la última fecha de modificación del archivo. - [[yii\caching\TagDependency]]: marca un elemento de datos en caché con un nombre de grupo. Puedes invalidar los elementos de datos almacenados en caché con el mismo nombre del grupo a la vez llamando a [[yii\caching\TagDependency::invalidate()]]. diff --git a/docs/guide-fr/caching-data.md b/docs/guide-fr/caching-data.md index 01979d539b3..5f5cdcb8ae0 100644 --- a/docs/guide-fr/caching-data.md +++ b/docs/guide-fr/caching-data.md @@ -217,6 +217,7 @@ Ci-dessous nous présentons un résumé des dépendances de mise en cache dispon - [[yii\caching\ChainedDependency]]: la dépendance est modifiée si l'une des dépendances de la chaîne est modifiée. - [[yii\caching\DbDependency]]: la dépendance est modifiée si le résultat de le requête de l'instruction SQL spécifiée est modifié. - [[yii\caching\ExpressionDependency]]: la dépendance est modifiée si le résultat de l'expression PHP spécifiée est modifié. +- [[yii\caching\CallbackDependency]]: la dépendance est modifiée si le résultat du rappel PHP spécifié est modifié. - [[yii\caching\FileDependency]]: la dépendance est modifiée si la date de dernière modification du fichier est modifiée. - [[yii\caching\TagDependency]]: associe une donnée mise en cache à une ou plusieurs balises. Vous pouvez invalider la donnée mise en cache associée à la balise spécifiée en appelant [[yii\caching\TagDependency::invalidate()]]. @@ -342,4 +343,3 @@ $result = $db->cache(function ($db) { La mise en cache de requêtes ne fonctionne pas avec des résultats de requêtes qui contiennent des gestionnaires de ressources. Par exemple, lorsque vous utilisez de type de colonne `BLOB` dans certains systèmes de gestion de bases de données (DBMS), la requête retourne un gestionnaire de ressources pour la donnée de la colonne. Quelques supports de stockage pour cache sont limités en taille. Par exemple, avec memcache, chaque entrée est limitée en taille à 1 MO. En conséquence, si le résultat d'une requête dépasse cette taille, la mise en cache échoue. - diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md index d2ae54e6fa6..e0d82eda602 100644 --- a/docs/guide-ja/caching-data.md +++ b/docs/guide-ja/caching-data.md @@ -275,6 +275,7 @@ $data = $cache->get($key); - [[yii\caching\ChainedDependency]]: チェーン上のいずれかの依存が変更された場合に、依存が変更されます。 - [[yii\caching\DbDependency]]: 指定された SQL 文のクエリ結果が変更された場合、依存が変更されます。 - [[yii\caching\ExpressionDependency]]: 指定された PHP の式の結果が変更された場合、依存が変更されます。 +- [[yii\caching\CallbackDependency]]: 指定されたPHPコールバックの結果が変更された場合、依存関係は変更されます。 - [[yii\caching\FileDependency]]: ファイルの最終更新日時が変更された場合、依存が変更されます。 - [[yii\caching\TagDependency]]: キャッシュされるデータ・アイテムに一つまたは複数のタグを関連付けます。 [[yii\caching\TagDependency::invalidate()]] を呼び出すことによって、指定されたタグ (複数可) を持つキャッシュされたデータ・アイテムを無効にすることができます。 @@ -431,4 +432,3 @@ $result = $db->cache(function ($db) { > Info: デフォルトでは、コンソール・アプリケーションは独立した構成情報ファイルを使用します。 正しい結果を得るためには、ウェブとコンソールのアプリケーション構成で同じキャッシュ・コンポーネントを使用していることを確認してください。 - diff --git a/docs/guide-pt-BR/caching-data.md b/docs/guide-pt-BR/caching-data.md index 3801b355a1e..3ac696c8208 100644 --- a/docs/guide-pt-BR/caching-data.md +++ b/docs/guide-pt-BR/caching-data.md @@ -229,6 +229,7 @@ Abaixo um sumário das dependências de cache disponíveis: - [[yii\caching\DbDependency]]: a dependência muda caso o resultado da consulta especificada pela instrução SQL seja alterado. - [[yii\caching\ExpressionDependency]]: a dependência muda se o resultado da expressão PHP especificada for alterado. +- [[yii\caching\CallbackDependency]]: a dependência é alterada se o resultado do callback PHP especificado for alterado.. - [[yii\caching\FileDependency]]: A dependência muda se a data da última alteração do arquivo for alterada. - [[yii\caching\TagDependency]]: associa um registro em cache com uma ou múltiplas tags. Você pode invalidar os registros em cache com a tag especificada ao chamar [[yii\caching\TagDependency::invalidate()]]. @@ -352,4 +353,3 @@ O cache de consulta não funciona com resultados de consulta que contêm mani Por exemplo, ao usar o tipo de coluna `BLOB` em alguns SGBDs, o resultado da consulta retornará um manipulador de recurso (resource handler) para o registro na coluna. Alguns armazenamentos em cache têm limitações de tamanho. Por exemplo, memcache limita o uso máximo de espaço de 1MB para cada registro. Então, se o tamanho do resultado de uma consulta exceder este limite, o cache falhará. - diff --git a/docs/guide-ru/caching-data.md b/docs/guide-ru/caching-data.md index 7b1a3052e29..d68bbfdb178 100644 --- a/docs/guide-ru/caching-data.md +++ b/docs/guide-ru/caching-data.md @@ -221,6 +221,7 @@ $data = $cache->get($key); - [[yii\caching\ChainedDependency]]: зависимость меняется, если любая зависимость в цепочке изменяется; - [[yii\caching\DbDependency]]: зависимость меняется, если результат некоторого определенного SQL запроса изменён; - [[yii\caching\ExpressionDependency]]: зависимость меняется, если результат определенного PHP выражения изменён; +- [[yii\caching\CallbackDependency]]: зависимость меняется, если результат коллбэк функции изменён; - [[yii\caching\FileDependency]]: зависимость меняется, если изменилось время последней модификации файла; - [[yii\caching\TagDependency]]: Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. [[yii\caching\TagDependency::invalidate()]]; diff --git a/docs/guide-zh-CN/caching-data.md b/docs/guide-zh-CN/caching-data.md index 046c85f4124..2fd3e3cfa51 100644 --- a/docs/guide-zh-CN/caching-data.md +++ b/docs/guide-zh-CN/caching-data.md @@ -275,6 +275,7 @@ $data = $cache->get($key); - [[yii\caching\ChainedDependency]]:如果依赖链上任何一个依赖产生变化,则依赖改变。 - [[yii\caching\DbDependency]]:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。 - [[yii\caching\ExpressionDependency]]:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。 +- [[yii\caching\CallbackDependency]]:如果指定的PHP回调结果发生变化,依赖性将改变。 - [[yii\caching\FileDependency]]:如果文件的最后修改时间发生变化,则依赖改变。 - [[yii\caching\TagDependency]]:将缓存的数据项与一个或多个标签相关联。 您可以通过调用  [[yii\caching\TagDependency::invalidate()]] 来检查指定标签的缓存数据项是否有效。 @@ -431,4 +432,3 @@ $result = $db->cache(function ($db) { > Info: 默认情况下,控制台应用使用独立的配置文件。 所以,为了上述命令发挥作用,请确保 Web 应用和控制台应用配置相同的缓存组件。 - diff --git a/docs/guide/caching-data.md b/docs/guide/caching-data.md index 1c712e801d0..2666e544d4f 100644 --- a/docs/guide/caching-data.md +++ b/docs/guide/caching-data.md @@ -277,6 +277,7 @@ Below is a summary of the available cache dependencies: - [[yii\caching\ChainedDependency]]: the dependency is changed if any of the dependencies on the chain is changed. - [[yii\caching\DbDependency]]: the dependency is changed if the query result of the specified SQL statement is changed. - [[yii\caching\ExpressionDependency]]: the dependency is changed if the result of the specified PHP expression is changed. +- [[yii\caching\CallbackDependency]]: the dependency is changed if the result of the specified PHP callback is changed. - [[yii\caching\FileDependency]]: the dependency is changed if the file's last modification time is changed. - [[yii\caching\TagDependency]]: associates a cached data item with one or multiple tags. You may invalidate the cached data items with the specified tag(s) by calling [[yii\caching\TagDependency::invalidate()]]. @@ -433,4 +434,3 @@ You can flush the cache from the console by calling `yii cache/flush` as well. > Info: Console application uses a separate configuration file by default. Ensure, that you have the same caching components in your web and console application configs to reach the proper effect. - diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a348dbf5bf4..ec38cf0cccd 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -23,6 +23,7 @@ Yii Framework 2 Change Log - Bug #20083: Fix deprecated warning implicit conversion from float (skepticspriggan) - Enh #20087: Add custom attributes to script tags (skepticspriggan) - Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp) +- New #20137: Added `yii\caching\CallbackDependency` to allow using a callback to determine if a cache dependency is still valid (laxity7) - Enh #20134: Raise minimum `PHP` version to `7.3` (@terabytesoftw) - Bug #20141: Update `ezyang/htmlpurifier` dependency to version `4.17` (@terabytesoftw) diff --git a/framework/caching/CallbackDependency.php b/framework/caching/CallbackDependency.php new file mode 100644 index 00000000000..5a4a8d2cf21 --- /dev/null +++ b/framework/caching/CallbackDependency.php @@ -0,0 +1,39 @@ + + * @since 2.0.50 + */ +class CallbackDependency extends Dependency +{ + /** + * @var callable the PHP callback that will be called to determine if the dependency has been changed. + */ + public $callback; + + + /** + * Generates the data needed to determine if dependency has been changed. + * This method returns the result of the callback function. + * @param CacheInterface $cache the cache component that is currently evaluating this dependency + * @return mixed the data needed to determine if dependency has been changed. + */ + protected function generateDependencyData($cache) + { + return $this->callback(); + } +} diff --git a/framework/caching/FileDependency.php b/framework/caching/FileDependency.php index 61b9b610547..7e358d2a1fd 100644 --- a/framework/caching/FileDependency.php +++ b/framework/caching/FileDependency.php @@ -45,6 +45,7 @@ protected function generateDependencyData($cache) } $fileName = Yii::getAlias($this->fileName); + clearstatcache(false, $fileName); return @filemtime($fileName); } diff --git a/framework/classes.php b/framework/classes.php index b65d50c7788..f9ee94d24f8 100644 --- a/framework/classes.php +++ b/framework/classes.php @@ -81,6 +81,7 @@ 'yii\caching\Dependency' => YII2_PATH . '/caching/Dependency.php', 'yii\caching\DummyCache' => YII2_PATH . '/caching/DummyCache.php', 'yii\caching\ExpressionDependency' => YII2_PATH . '/caching/ExpressionDependency.php', + 'yii\caching\CallbackDependency' => YII2_PATH . '/caching/CallbackDependency.php', 'yii\caching\FileCache' => YII2_PATH . '/caching/FileCache.php', 'yii\caching\FileDependency' => YII2_PATH . '/caching/FileDependency.php', 'yii\caching\MemCache' => YII2_PATH . '/caching/MemCache.php', diff --git a/tests/framework/caching/CallbackDependencyTest.php b/tests/framework/caching/CallbackDependencyTest.php new file mode 100644 index 00000000000..b2a93ff9541 --- /dev/null +++ b/tests/framework/caching/CallbackDependencyTest.php @@ -0,0 +1,41 @@ +callback = function () use (&$dependencyValue) { + return $dependencyValue === true; + }; + + $dependency->evaluateDependency($cache); + $this->assertFalse($dependency->isChanged($cache)); + + $dependencyValue = false; + $this->assertTrue($dependency->isChanged($cache)); + } + + public function testDependencyNotChanged() + { + $cache = new ArrayCache(); + + $dependency = new CallbackDependency(); + $dependency->callback = function () { + return 2 + 2; + }; + + $dependency->evaluateDependency($cache); + $this->assertFalse($dependency->isChanged($cache)); + $this->assertFalse($dependency->isChanged($cache)); + } +} From 90c0eb02d1768e7f2ab3512e1da5b8475dc5d32d Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 16 May 2024 12:03:03 +0300 Subject: [PATCH 123/125] Fix #20055: Fix Response header X-Pagination-Total-Count is always 0 --- framework/CHANGELOG.md | 1 + framework/data/ActiveDataProvider.php | 1 - framework/data/ArrayDataProvider.php | 10 +++----- framework/data/BaseDataProvider.php | 15 +++++++----- framework/data/SqlDataProvider.php | 1 - .../framework/data/ActiveDataProviderTest.php | 3 +-- tests/framework/rest/SerializerTest.php | 24 +++++++++++++++++++ 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ec38cf0cccd..302698ff536 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -9,6 +9,7 @@ Yii Framework 2 Change Log - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) - Bug #19691: Allow using custom class to style error summary (skepticspriggan) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) +- Bug #20055: Fix Response header X-Pagination-Total-Count is always 0 (lav45, xicond) - Bug #20005: Fix `yii\console\controllers\ServeController` to specify the router script (terabytesoftw) - Bug #19060: Fix `yii\widgets\Menu` bug when using Closure for active item and adding additional tests in `tests\framework\widgets\MenuTest` (atrandafir) - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) diff --git a/framework/data/ActiveDataProvider.php b/framework/data/ActiveDataProvider.php index b0aab615305..9280c1c0d1c 100644 --- a/framework/data/ActiveDataProvider.php +++ b/framework/data/ActiveDataProvider.php @@ -103,7 +103,6 @@ protected function prepareModels() } $query = clone $this->query; if (($pagination = $this->getPagination()) !== false) { - $pagination->totalCount = $this->getTotalCount(); if ($pagination->totalCount === 0) { return []; } diff --git a/framework/data/ArrayDataProvider.php b/framework/data/ArrayDataProvider.php index 1655b18b5bb..14511c54556 100644 --- a/framework/data/ArrayDataProvider.php +++ b/framework/data/ArrayDataProvider.php @@ -87,14 +87,10 @@ protected function prepareModels() $models = $this->sortModels($models, $sort); } - if (($pagination = $this->getPagination()) !== false) { - $pagination->totalCount = $this->getTotalCount(); - - if ($pagination->getPageSize() > 0) { - $models = array_slice($models, $pagination->getOffset(), $pagination->getLimit(), true); - } + $pagination = $this->getPagination(); + if ($pagination !== false && $pagination->getPageSize() > 0) { + $models = array_slice($models, $pagination->getOffset(), $pagination->getLimit(), true); } - return $models; } diff --git a/framework/data/BaseDataProvider.php b/framework/data/BaseDataProvider.php index 623ead89306..409b9f28bca 100644 --- a/framework/data/BaseDataProvider.php +++ b/framework/data/BaseDataProvider.php @@ -165,12 +165,12 @@ public function getCount() */ public function getTotalCount() { - if ($this->getPagination() === false) { + if ($this->_pagination === false) { return $this->getCount(); - } elseif ($this->_totalCount === null) { + } + if ($this->_totalCount === null) { $this->_totalCount = $this->prepareTotalCount(); } - return $this->_totalCount; } @@ -194,7 +194,6 @@ public function getPagination() if ($this->_pagination === null) { $this->setPagination([]); } - return $this->_pagination; } @@ -218,9 +217,13 @@ public function setPagination($value) $config['pageParam'] = $this->id . '-page'; $config['pageSizeParam'] = $this->id . '-per-page'; } - $this->_pagination = Yii::createObject(array_merge($config, $value)); - } elseif ($value instanceof Pagination || $value === false) { + $value = Yii::createObject(array_merge($config, $value)); + } + if ($value instanceof Pagination) { + $value->totalCount = $this->getTotalCount(); $this->_pagination = $value; + } elseif ($value === false) { + $this->_pagination = false; } else { throw new InvalidArgumentException('Only Pagination instance, configuration array or false is allowed.'); } diff --git a/framework/data/SqlDataProvider.php b/framework/data/SqlDataProvider.php index 97c6000c053..3ecf0595c9a 100644 --- a/framework/data/SqlDataProvider.php +++ b/framework/data/SqlDataProvider.php @@ -128,7 +128,6 @@ protected function prepareModels() } if ($pagination !== false) { - $pagination->totalCount = $this->getTotalCount(); $limit = $pagination->getLimit(); $offset = $pagination->getOffset(); } diff --git a/tests/framework/data/ActiveDataProviderTest.php b/tests/framework/data/ActiveDataProviderTest.php index af96dfef267..789a0337260 100644 --- a/tests/framework/data/ActiveDataProviderTest.php +++ b/tests/framework/data/ActiveDataProviderTest.php @@ -170,9 +170,8 @@ public function testPaginationBeforeModels() 'query' => $query->from('order')->orderBy('id'), ]); $pagination = $provider->getPagination(); - $this->assertEquals(0, $pagination->getPageCount()); - $this->assertCount(3, $provider->getModels()); $this->assertEquals(1, $pagination->getPageCount()); + $this->assertCount(3, $provider->getModels()); $provider->getPagination()->pageSize = 2; $this->assertCount(3, $provider->getModels()); diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 91b627b8f8e..f2e0ed72e5e 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -439,6 +439,30 @@ public function testHeadSerializeDataProvider($dataProvider, $expectedResult, $s ]); $serializer->preserveKeys = $saveKeys; $this->assertEmpty($serializer->serialize($dataProvider)); + $this->assertNotEmpty($serializer->response->getHeaders()->get($serializer->totalCountHeader)); + + $arrayDataProviderMock = $this->getMockBuilder(ArrayDataProvider::className()) + ->disableOriginalConstructor() + ->getMock(); + + // stub getModels to prevent empty + $arrayDataProviderMock + ->method('getModels') + ->willReturn($expectedResult); + + // stub getPagination for header + $arrayDataProviderMock + ->method('getPagination') + ->willReturn($dataProvider->getPagination()); + + // assert normal HEAD is empty response + $this->assertEmpty($serializer->serialize($arrayDataProviderMock)); + + // Test #20002: Set up the expectation for the getModels method + $arrayDataProviderMock->expects($this->never()) + ->method('getModels'); + + // reset Method unset($_POST[$request->methodParam], $_SERVER['REQUEST_METHOD']); } From 391997a96be7203fb4e9a2e03ff84f02c5ddd46c Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Thu, 16 May 2024 11:29:32 +0200 Subject: [PATCH 124/125] Fix `CallbackDependency` (#20158) --- framework/caching/CallbackDependency.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/caching/CallbackDependency.php b/framework/caching/CallbackDependency.php index 5a4a8d2cf21..15780f57228 100644 --- a/framework/caching/CallbackDependency.php +++ b/framework/caching/CallbackDependency.php @@ -34,6 +34,6 @@ class CallbackDependency extends Dependency */ protected function generateDependencyData($cache) { - return $this->callback(); + return ($this->callback)(); } } From f2ea9be24225987b2acf2d6fdd2789e0a32b7fb0 Mon Sep 17 00:00:00 2001 From: Bashir Anakobe Date: Thu, 16 May 2024 11:16:33 +0100 Subject: [PATCH 125/125] Update deprecated isArray() method in Controller.php (#20156) --- framework/web/Controller.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/framework/web/Controller.php b/framework/web/Controller.php index 8f2b695621d..d1688cfafee 100644 --- a/framework/web/Controller.php +++ b/framework/web/Controller.php @@ -129,12 +129,9 @@ public function bindActionParams($action, $params) foreach ($method->getParameters() as $param) { $name = $param->getName(); if (array_key_exists($name, $params)) { - $isValid = true; - if (PHP_VERSION_ID >= 80000) { - $isArray = ($type = $param->getType()) instanceof \ReflectionNamedType && $type->getName() === 'array'; - } else { - $isArray = $param->isArray(); - } + $isValid = true; + $isArray = ($type = $param->getType()) instanceof \ReflectionNamedType && $type->getName() === 'array'; + if ($isArray) { $params[$name] = (array)$params[$name]; } elseif (is_array($params[$name])) {