From 47b8f86e2a8b39cd8c10b51b6c42a32a4d9733a2 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 23 Jul 2024 14:20:18 +0100 Subject: [PATCH 001/249] [5.x] Remove metadata in EntriesTest (#10491) --- tests/Fieldtypes/EntriesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Fieldtypes/EntriesTest.php b/tests/Fieldtypes/EntriesTest.php index c06449ec73..7416ca21d0 100644 --- a/tests/Fieldtypes/EntriesTest.php +++ b/tests/Fieldtypes/EntriesTest.php @@ -360,7 +360,7 @@ public function it_localizes_the_shallow_augmented_item_to_the_current_sites_loc $this->assertNull($augmented); // 456 isnt localized } - /** @test */ + #[Test] public function it_doesnt_localize_when_select_across_sites_setting_is_enabled() { $parent = EntryFactory::id('parent')->collection('blog')->slug('theparent')->locale('fr')->create(); From d1373bab832bb0d3181dd1e518e299b4a50813b4 Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Tue, 23 Jul 2024 17:53:16 +0330 Subject: [PATCH 002/249] [5.x] Fix the "Learn More" translation and link (#10497) --- resources/js/components/AddonDetails.vue | 6 +++++- resources/js/components/updater/Release.vue | 8 ++++++-- resources/js/components/updater/Updater.vue | 6 +++++- resources/lang/ar.json | 2 +- resources/lang/cs.json | 2 +- resources/lang/da.json | 2 +- resources/lang/de.json | 2 +- resources/lang/de_CH.json | 2 +- resources/lang/es.json | 2 +- resources/lang/fa.json | 2 +- resources/lang/fr.json | 2 +- resources/lang/hu.json | 2 +- resources/lang/id.json | 2 +- resources/lang/it.json | 2 +- resources/lang/ja.json | 4 ++-- resources/lang/ms.json | 2 +- resources/lang/nb.json | 2 +- resources/lang/nl.json | 2 +- resources/lang/pl.json | 2 +- resources/lang/pt.json | 2 +- resources/lang/pt_BR.json | 2 +- resources/lang/ru.json | 2 +- resources/lang/sl.json | 2 +- resources/lang/sv.json | 2 +- resources/lang/tr.json | 2 +- resources/lang/uk.json | 2 +- resources/lang/zh_CN.json | 2 +- resources/lang/zh_TW.json | 2 +- resources/views/partials/docs-callout.blade.php | 2 +- 29 files changed, 43 insertions(+), 31 deletions(-) diff --git a/resources/js/components/AddonDetails.vue b/resources/js/components/AddonDetails.vue index 9d56a4775b..d154016a0f 100644 --- a/resources/js/components/AddonDetails.vue +++ b/resources/js/components/AddonDetails.vue @@ -21,7 +21,7 @@

-

{{ __('Learn more about') }} {{ __('Addons') }}.

+

@@ -87,6 +87,10 @@ import AddonEditions from './addons/Editions.vue'; high = high ? `$${high}` : __('Free'); return (low == high) ? low : `${low} - ${high}`; }, + + link() { + return __('Learn more about :link', { link: `${__('Addons')}`}) + '.'; + }, }, created() { diff --git a/resources/js/components/updater/Release.vue b/resources/js/components/updater/Release.vue index 6c360c02fb..9fded14f0b 100644 --- a/resources/js/components/updater/Release.vue +++ b/resources/js/components/updater/Release.vue @@ -27,7 +27,7 @@

-

{{ __('Learn more about') }} {{ __('Updates') }}.

+

@@ -89,7 +89,11 @@ export default { } return `composer require "${this.package} ${this.release.version}"`; - } + }, + + link() { + return __('Learn more about :link', { link: `${__('Updates')}`}) + '.'; + }, } } diff --git a/resources/js/components/updater/Updater.vue b/resources/js/components/updater/Updater.vue index 2c032fbd95..c8e06e2f90 100644 --- a/resources/js/components/updater/Updater.vue +++ b/resources/js/components/updater/Updater.vue @@ -53,7 +53,7 @@

-

{{ __('Learn more about') }} {{ __('Updates') }}.

+

@@ -113,6 +113,10 @@ latestVersion() { return this.latestRelease && this.latestRelease.version; }, + + link() { + return __('Learn more about :link', { link: `${__('Updates')}`}) + '.'; + }, }, created() { diff --git a/resources/lang/ar.json b/resources/lang/ar.json index 07a002368f..67d73526eb 100644 --- a/resources/lang/ar.json +++ b/resources/lang/ar.json @@ -549,7 +549,7 @@ "Latest Date": "أحدث تاريخ", "Layout": "تخطيط", "Learn more": "معرفة المزيد", - "Learn more about": "معرفة المزيد عن", + "Learn more about :link": "معرفة المزيد عن :link", "Less than": "أقل من", "Less than or equals": "أقل من أو يساوي", "Licensing": "الترخيص", diff --git a/resources/lang/cs.json b/resources/lang/cs.json index ed6b52ee63..f1c23ee5e9 100644 --- a/resources/lang/cs.json +++ b/resources/lang/cs.json @@ -442,7 +442,7 @@ "Latest Date": "Poslední datum", "Layout": "Layout", "Learn more": "Dozvědět se více", - "Learn more about": "Dozvědět se více o", + "Learn more about :link": "Dozvědět se více o :link", "Licensing": "Licencování", "Light": "Světlý", "Light Mode": "Světlý režim", diff --git a/resources/lang/da.json b/resources/lang/da.json index d6b07bbed0..cdd4711a9e 100644 --- a/resources/lang/da.json +++ b/resources/lang/da.json @@ -412,7 +412,7 @@ "Last rebuild": "Sidste genopbygning", "Layout": "Layout", "Learn more": "Lær mere", - "Learn more about": "Lær mere om", + "Learn more about :link": "Lær mere om :link", "Licensing": "Licensering", "Light": "Lys", "Light Mode": "Lys tilstand", diff --git a/resources/lang/de.json b/resources/lang/de.json index e751b17f5a..ea7954f2ca 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -549,7 +549,7 @@ "Latest Date": "Spätestes Datum", "Layout": "Layout", "Learn more": "Mehr erfahren", - "Learn more about": "Erfahre mehr über", + "Learn more about :link": "Erfahre mehr über :link", "Less than": "Kleiner als", "Less than or equals": "Kleiner oder gleich als", "Licensing": "Lizenzierung", diff --git a/resources/lang/de_CH.json b/resources/lang/de_CH.json index 24155194f6..4a8b8ff761 100644 --- a/resources/lang/de_CH.json +++ b/resources/lang/de_CH.json @@ -549,7 +549,7 @@ "Latest Date": "Spätestes Datum", "Layout": "Layout", "Learn more": "Mehr erfahren", - "Learn more about": "Erfahre mehr über", + "Learn more about :link": "Erfahre mehr über :link", "Less than": "Kleiner als", "Less than or equals": "Kleiner oder gleich als", "Licensing": "Lizenzierung", diff --git a/resources/lang/es.json b/resources/lang/es.json index 72e907f358..17bdd4880b 100644 --- a/resources/lang/es.json +++ b/resources/lang/es.json @@ -412,7 +412,7 @@ "Last rebuild": "Última reconstrucción", "Layout": "Layout", "Learn more": "Conoce más", - "Learn more about": "Conocer más acerca de", + "Learn more about :link": "Conocer más acerca de :link", "Licensing": "Licenciamiento", "Light": "Claro", "Light Mode": "Modo claro", diff --git a/resources/lang/fa.json b/resources/lang/fa.json index 04420c478a..a69e10200a 100644 --- a/resources/lang/fa.json +++ b/resources/lang/fa.json @@ -601,7 +601,7 @@ "Latest Date": "آخرین تاریخ", "Layout": "طرح (Layout)", "Learn more": "بیشتر بدانید", - "Learn more about": "توضیحات بیشتر در مورد", + "Learn more about :link": "درمورد :link بیشتر بدانید", "LESS": "لس (LESS)", "Less Than": "کمتر باشد از", "Less than": "کمتر از", diff --git a/resources/lang/fr.json b/resources/lang/fr.json index 30295fe815..3f07b08120 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -549,7 +549,7 @@ "Latest Date": "Dernière date", "Layout": "Mise en page", "Learn more": "En savoir plus", - "Learn more about": "En savoir plus sur les", + "Learn more about :link": "En savoir plus sur les :link", "Less than": "Inférieur à", "Less than or equals": "Inférieur ou égal à", "Licensing": "Licence", diff --git a/resources/lang/hu.json b/resources/lang/hu.json index fd27142e75..b60cabfbab 100644 --- a/resources/lang/hu.json +++ b/resources/lang/hu.json @@ -426,7 +426,7 @@ "Last rebuild": "Utolsó újraépítés", "Layout": "Elrendezés", "Learn more": "Tudj meg többet", - "Learn more about": "Tudj meg többet: ", + "Learn more about :link": "Tudj meg többet: :link", "Licensing": "Licenszelés", "Light": "Világos", "Light Mode": "Világos mód", diff --git a/resources/lang/id.json b/resources/lang/id.json index 84f9ec7840..90949b5d5b 100644 --- a/resources/lang/id.json +++ b/resources/lang/id.json @@ -412,7 +412,7 @@ "Last rebuild": "Terakhir dibangun kembali", "Layout": "Tata letak", "Learn more": "Pelajari lebih lanjut", - "Learn more about": "Pelajari lebih lanjut tentang", + "Learn more about :link": "Pelajari lebih lanjut tentang :link", "Licensing": "Perizinan", "Light": "Terang", "Light Mode": "Mode Terang", diff --git a/resources/lang/it.json b/resources/lang/it.json index 148b8c79cd..76c22f3a4e 100644 --- a/resources/lang/it.json +++ b/resources/lang/it.json @@ -412,7 +412,7 @@ "Last rebuild": "Ultimo rebuild", "Layout": "Layout", "Learn more": "Maggiori informazioni", - "Learn more about": "Maggiori informazioni su", + "Learn more about :link": "Maggiori informazioni su :link", "Licensing": "Licenza", "Light": "Chiaro", "Light Mode": "Modalità chiara", diff --git a/resources/lang/ja.json b/resources/lang/ja.json index a649f9712b..d04901a8a1 100644 --- a/resources/lang/ja.json +++ b/resources/lang/ja.json @@ -539,7 +539,7 @@ "Latest Date": "最新の日付", "Layout": "レイアウト", "Learn more": "もっと詳しく知る", - "Learn more about": "詳しくはこちら", + "Learn more about :link": "詳しくはこちら :link", "Less than": "未満", "Less than or equals": "以下", "Licensing": "ライセンス", @@ -1032,4 +1032,4 @@ "You can't do this while logged in": "ログイン中はこれを行うことはできません", "Your Favorites": "お気に入り", "Your working copy will be replaced by the contents of this revision.": "作業コピーはこのリビジョンの内容に置き換えられます。" -} \ No newline at end of file +} diff --git a/resources/lang/ms.json b/resources/lang/ms.json index 0271410dd3..b5cd29eee5 100644 --- a/resources/lang/ms.json +++ b/resources/lang/ms.json @@ -412,7 +412,7 @@ "Last rebuild": "Terakhir bina semula", "Layout": "Susun Atur", "Learn more": "Ketahui lebih lanjut", - "Learn more about": "Ketahui lebih lanjut tentang", + "Learn more about :link": "Ketahui lebih lanjut tentang :link", "Licensing": "Pelesenan", "Light": "Terang", "Light Mode": "Mod Terang", diff --git a/resources/lang/nb.json b/resources/lang/nb.json index c47f564d92..612b44abdf 100644 --- a/resources/lang/nb.json +++ b/resources/lang/nb.json @@ -547,7 +547,7 @@ "Latest Date": "Siste dato", "Layout": "Layout", "Learn more": "Lær mer", - "Learn more about": "Lær mer om", + "Learn more about :link": "Lær mer om :link", "Less than": "Mindre enn", "Less than or equals": "Mindre enn eller lik", "Licensing": "Lisensiering", diff --git a/resources/lang/nl.json b/resources/lang/nl.json index 7cee6cfe75..f7ec279361 100644 --- a/resources/lang/nl.json +++ b/resources/lang/nl.json @@ -544,7 +544,7 @@ "Latest Date": "Laatste datum", "Layout": "Layout", "Learn more": "Meer informatie", - "Learn more about": "Meer informatie over", + "Learn more about :link": "Meer informatie over :link", "Less than": "Kleiner dan", "Less than or equals": "Kleiner dan of gelijk aan", "Licensing": "Licenties", diff --git a/resources/lang/pl.json b/resources/lang/pl.json index 1f201d2466..941bdd0ec6 100644 --- a/resources/lang/pl.json +++ b/resources/lang/pl.json @@ -445,7 +445,7 @@ "Latest Date": "Ostatnia data", "Layout": "Układ", "Learn more": "Dowiedz się więcej", - "Learn more about": "Dowiedz się więcej o", + "Learn more about :link": "Dowiedz się więcej o :link", "Licensing": "Licencje", "Light": "Jasny", "Light Mode": "Tryb jasny", diff --git a/resources/lang/pt.json b/resources/lang/pt.json index 3c2d8f8ec4..fc27d34556 100644 --- a/resources/lang/pt.json +++ b/resources/lang/pt.json @@ -412,7 +412,7 @@ "Last rebuild": "Última reconstrução", "Layout": "Layout", "Learn more": "Aprende mais", - "Learn more about": "Aprender mais sobre", + "Learn more about :link": "Aprender mais sobre :link", "Licensing": "Licenciamento", "Light": "Claro", "Light Mode": "Modo Claro", diff --git a/resources/lang/pt_BR.json b/resources/lang/pt_BR.json index 8c392d04b1..a8829c24cd 100644 --- a/resources/lang/pt_BR.json +++ b/resources/lang/pt_BR.json @@ -461,7 +461,7 @@ "Latest Date": "Última data", "Layout": "Layout", "Learn more": "Saiba mais", - "Learn more about": "Saiba mais sobre", + "Learn more about :link": "Saiba mais sobre :link", "Licensing": "Licenciamento", "Light": "Claro", "Light Mode": "Modo Claro", diff --git a/resources/lang/ru.json b/resources/lang/ru.json index 8330b753f1..6c8fdbc151 100644 --- a/resources/lang/ru.json +++ b/resources/lang/ru.json @@ -546,7 +546,7 @@ "Latest Date": "Последняя дата", "Layout": "Макет", "Learn more": "Дополнительная информация", - "Learn more about": "Справка - ", + "Learn more about :link": "Справка - :link", "Less than": "Меньше чем", "Less than or equals": "Меньше или равно", "Licensing": "Лицензирование", diff --git a/resources/lang/sl.json b/resources/lang/sl.json index 4d6789dbc8..6b82885b25 100644 --- a/resources/lang/sl.json +++ b/resources/lang/sl.json @@ -412,7 +412,7 @@ "Last rebuild": "Zadnja obnova", "Layout": "Postavitev", "Learn more": "Nauči se več", - "Learn more about": "Več o", + "Learn more about :link": "Več o :link", "Licensing": "Licenciranje", "Light": "Svetloba", "Light Mode": "Način svetlobe", diff --git a/resources/lang/sv.json b/resources/lang/sv.json index 0f2837a027..091f13c1d8 100644 --- a/resources/lang/sv.json +++ b/resources/lang/sv.json @@ -447,7 +447,7 @@ "Latest Date": "Senaste datum", "Layout": "Layout", "Learn more": "Läs mer", - "Learn more about": "Läs mer om", + "Learn more about :link": "Läs mer om :link", "Licensing": "Licensiering", "Light": "Ljus", "Light Mode": "Ljust läge", diff --git a/resources/lang/tr.json b/resources/lang/tr.json index 4ba55d6b8b..98fc8a0866 100644 --- a/resources/lang/tr.json +++ b/resources/lang/tr.json @@ -507,7 +507,7 @@ "Latest Date": "Son tarih", "Layout": "Düzen", "Learn more": "Daha fazla bilgi edin", - "Learn more about": "Hakkında daha fazla öğren", + "Learn more about :link": ":link hakkında daha fazla öğren", "Licensing": "Lisanslama", "Light": "Aydınlık", "Light Mode": "Aydınlık Modu", diff --git a/resources/lang/uk.json b/resources/lang/uk.json index 06dc63606a..c44acd9121 100644 --- a/resources/lang/uk.json +++ b/resources/lang/uk.json @@ -540,7 +540,7 @@ "Latest Date": "Остання дата", "Layout": "Макет", "Learn more": "Дізнатися більше", - "Learn more about": "Дізнатися більше про", + "Learn more about :link": "Дізнатися більше про :link", "Less than": "Менше ніж", "Less than or equals": "Менше або дорівнює", "Licensing": "Ліцензування", diff --git a/resources/lang/zh_CN.json b/resources/lang/zh_CN.json index 153008e1f5..0ee862b9a3 100644 --- a/resources/lang/zh_CN.json +++ b/resources/lang/zh_CN.json @@ -457,7 +457,7 @@ "Latest Date": "最新日期", "Layout": "布局", "Learn more": "了解更多", - "Learn more about": "了解更多关于", + "Learn more about :link": "了解更多关于 :link", "Licensing": "许可", "Light": "浅色", "Light Mode": "浅色模式", diff --git a/resources/lang/zh_TW.json b/resources/lang/zh_TW.json index 5e5c23015e..af17f6caa9 100644 --- a/resources/lang/zh_TW.json +++ b/resources/lang/zh_TW.json @@ -457,7 +457,7 @@ "Latest Date": "最後修改", "Layout": "畫面配置", "Learn more": "瞭解更多", - "Learn more about": "瞭解更多有關", + "Learn more about :link": "瞭解更多有關 :link", "Licensing": "授權", "Light": "淺色", "Light Mode": "淺色模式", diff --git a/resources/views/partials/docs-callout.blade.php b/resources/views/partials/docs-callout.blade.php index 24e8a433c7..d3b5de1ea7 100644 --- a/resources/views/partials/docs-callout.blade.php +++ b/resources/views/partials/docs-callout.blade.php @@ -2,6 +2,6 @@ @if (config('statamic.cp.link_to_docs'))
-
{{ $text ?? __('Learn more about') }} {{ $topic }}
+
{!! $text ?? __('Learn more about :link', ['link' => ''.$topic.'']) !!}
@endif From 40d535f519c87e925f66eddae912538c55bfd465 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 23 Jul 2024 18:21:06 +0100 Subject: [PATCH 003/249] [5.x] Don't enforce a query length on comb searches (#10496) --- src/Search/Comb/Comb.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Search/Comb/Comb.php b/src/Search/Comb/Comb.php index 09526c7cc9..28f6b238f6 100644 --- a/src/Search/Comb/Comb.php +++ b/src/Search/Comb/Comb.php @@ -834,7 +834,7 @@ private function testValidQuery($query) { $length = strlen($query); - if ($length === 0) { + if ($length === 0 && $this->min_characters > 0) { throw new NoQuery('No query given.'); } From 2b542c4552dcd4cbce86b7f777958be9e88f718f Mon Sep 17 00:00:00 2001 From: Jack McDade Date: Tue, 23 Jul 2024 17:34:22 -0400 Subject: [PATCH 004/249] [5.x] Fix Date Picker dark mode bg color (#10499) Fix Date Picker dark mode bg color --- resources/css/components/fieldtypes/datetime.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/css/components/fieldtypes/datetime.css b/resources/css/components/fieldtypes/datetime.css index d7c51e6c3b..dfe277e6de 100644 --- a/resources/css/components/fieldtypes/datetime.css +++ b/resources/css/components/fieldtypes/datetime.css @@ -41,6 +41,10 @@ @apply border-none bg-none; } +.vc-container.vc-is-dark { + @apply dark:bg-transparent; +} + /* Time Field ========================================================================== */ From 6b0f1777dd95145128ad294363e45da152ae873c Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 24 Jul 2024 09:45:00 -0400 Subject: [PATCH 005/249] [5.x] Revert commonmark back to original constraint (#10502) --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index fe7517f212..fd996b867c 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "james-heinrich/getid3": "^1.9.21", "laravel/framework": "^10.40 || ^11.0", "laravel/prompts": "^0.1.16", - "league/commonmark": ">=2.2 <2.5", + "league/commonmark": "^2.2", "league/csv": "^9.0", "league/glide": "^2.3", "maennchen/zipstream-php": "^3.1", From 8d1c258028ae46351c408843a6336705b0936ecf Mon Sep 17 00:00:00 2001 From: Daniel Weaver Date: Thu, 25 Jul 2024 20:13:37 -0400 Subject: [PATCH 006/249] [5.x] Add frontMatter method to docblock for Parse facade (#10509) --- src/Facades/Parse.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Facades/Parse.php b/src/Facades/Parse.php index fc70fa6f3f..e7e4419856 100644 --- a/src/Facades/Parse.php +++ b/src/Facades/Parse.php @@ -9,6 +9,7 @@ * @method static AntlersString template($str, $variables = [], $context = [], $php = false) * @method static string templateLoop($content, $data, $supplement = true, $context = [], $php = false) * @method static array YAML($str) + * @method static array frontMatter($string) * @method static mixed env($val) * * @see \Statamic\Facades\Endpoint\Parse From a259314a036dff6d4701769a5f38939e72469aa4 Mon Sep 17 00:00:00 2001 From: Jack Sleight Date: Fri, 26 Jul 2024 20:23:56 +0100 Subject: [PATCH 007/249] [5.x] Fix button group and radio previews (#10501) --- resources/js/components/fieldtypes/ButtonGroupFieldtype.vue | 2 +- resources/js/components/fieldtypes/RadioFieldtype.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/components/fieldtypes/ButtonGroupFieldtype.vue b/resources/js/components/fieldtypes/ButtonGroupFieldtype.vue index 613f430768..d748e9d695 100644 --- a/resources/js/components/fieldtypes/ButtonGroupFieldtype.vue +++ b/resources/js/components/fieldtypes/ButtonGroupFieldtype.vue @@ -45,7 +45,7 @@ export default { replicatorPreview() { if (! this.showFieldPreviews || ! this.config.replicator_preview) return; - var option = _.findWhere(this.config.options, {value: this.value}); + var option = _.findWhere(this.options, {value: this.value}); return (option) ? option.label : this.value; }, }, diff --git a/resources/js/components/fieldtypes/RadioFieldtype.vue b/resources/js/components/fieldtypes/RadioFieldtype.vue index a6317642c8..2547a20f11 100644 --- a/resources/js/components/fieldtypes/RadioFieldtype.vue +++ b/resources/js/components/fieldtypes/RadioFieldtype.vue @@ -54,7 +54,7 @@ export default { replicatorPreview() { if (! this.showFieldPreviews || ! this.config.replicator_preview) return; - var option = _.findWhere(this.config.options, {value: this.value}); + var option = _.findWhere(this.options, {value: this.value}); return (option) ? option.label : this.value; }, }, From d47eeb97710b07dd67a430ce70bae48f503829c0 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 26 Jul 2024 20:24:39 +0100 Subject: [PATCH 008/249] [5.x] Prevent using `type` as a handle for fields in sets (#10507) --- resources/js/components/blueprints/Fields.vue | 5 +++++ resources/js/components/blueprints/RegularField.vue | 5 +++++ resources/js/components/fields/Settings.vue | 4 +++- .../js/components/fieldtypes/replicator/SetsFieldtype.vue | 4 ++++ src/Http/Controllers/CP/Fields/FieldsController.php | 5 +++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/resources/js/components/blueprints/Fields.vue b/resources/js/components/blueprints/Fields.vue index 4a4845695a..5108f22e14 100644 --- a/resources/js/components/blueprints/Fields.vue +++ b/resources/js/components/blueprints/Fields.vue @@ -59,6 +59,7 @@ :fields="fields" :config="pendingCreatedField.config" :suggestable-condition-fields="suggestableConditionFields" + :is-inside-set="isInsideSet" @committed="fieldCreated" @closed="close" /> @@ -98,6 +99,10 @@ export default { excludeFieldset: String, }, + inject: { + isInsideSet: { default: false }, + }, + data() { return { isSelectingNewFieldtype: false, diff --git a/resources/js/components/blueprints/RegularField.vue b/resources/js/components/blueprints/RegularField.vue index c5dc7cd200..3ddb0e1ce3 100644 --- a/resources/js/components/blueprints/RegularField.vue +++ b/resources/js/components/blueprints/RegularField.vue @@ -40,6 +40,7 @@ :config="fieldConfig" :overrides="field.config_overrides || []" :suggestable-condition-fields="suggestableConditionFields" + :is-inside-set="isInsideSet" @committed="settingsUpdated" @closed="editorClosed" /> @@ -70,6 +71,10 @@ export default { 'suggestableConditionFields' ], + inject: { + isInsideSet: { default: false }, + }, + data() { return { showHandle: false, diff --git a/resources/js/components/fields/Settings.vue b/resources/js/components/fields/Settings.vue index 05753b43cb..1e4a481d81 100644 --- a/resources/js/components/fields/Settings.vue +++ b/resources/js/components/fields/Settings.vue @@ -118,6 +118,7 @@ export default { root: Boolean, fields: Array, suggestableConditionFields: Array, + isInsideSet: Boolean, }, provide: { @@ -245,7 +246,8 @@ export default { id: this.id, type: this.type, values: this.values, - fields: this.fields + fields: this.fields, + isInsideSet: this.isInsideSet, }).then(response => { this.$emit('committed', response.data, this.editedFields); this.close(); diff --git a/resources/js/components/fieldtypes/replicator/SetsFieldtype.vue b/resources/js/components/fieldtypes/replicator/SetsFieldtype.vue index 56df61fc40..b02c73f461 100644 --- a/resources/js/components/fieldtypes/replicator/SetsFieldtype.vue +++ b/resources/js/components/fieldtypes/replicator/SetsFieldtype.vue @@ -39,6 +39,10 @@ export default { } }, + provide: { + isInsideSet: true, + }, + methods: { tabsUpdated(tabs) { diff --git a/src/Http/Controllers/CP/Fields/FieldsController.php b/src/Http/Controllers/CP/Fields/FieldsController.php index b594742296..2755ff8fe6 100644 --- a/src/Http/Controllers/CP/Fields/FieldsController.php +++ b/src/Http/Controllers/CP/Fields/FieldsController.php @@ -54,6 +54,7 @@ public function update(Request $request) 'type' => 'required', 'values' => 'required|array', 'fields' => 'sometimes|array', + 'isInsideSet' => 'sometimes|boolean', ]); $fieldtype = FieldtypeRepository::find($request->type); @@ -96,6 +97,10 @@ function ($attribute, $value, $fail) use ($request) { $extraRules['handle'][] = 'not_in:date'; } + if ($request->isInsideSet) { + $extraRules['handle'][] = 'not_in:type'; + } + if ($request->type === 'date' && $request->values['handle'] === 'date') { $extraRules['mode'] = 'in:single'; $customMessages['mode.in'] = __('statamic::validation.date_fieldtype_only_single_mode_allowed'); From 4e0c7ca3623d35513d9be6bda70e1994f03ffdbe Mon Sep 17 00:00:00 2001 From: John Koster Date: Fri, 26 Jul 2024 14:32:49 -0500 Subject: [PATCH 009/249] [5.x] Correct issue where search result supplemental data is not available (#10386) Co-authored-by: Jason Varga --- src/Search/Result.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Search/Result.php b/src/Search/Result.php index 03ae085653..2885fc486b 100644 --- a/src/Search/Result.php +++ b/src/Search/Result.php @@ -12,7 +12,7 @@ class Result implements ContainsQueryableValues, Contract { use HasAugmentedInstance { - toAugmentedCollection as traitToAugmentedCollection; + toAugmentedCollectionWithFields as traitToAugmentedCollectionWithFields; } protected $searchable; @@ -98,19 +98,14 @@ public function getQueryableValue($field) throw new \Exception('Searchable '.get_class($this->searchable).' must implement '.ContainsQueryableValues::class); } - public function toAugmentedCollection($keys = null) + private function toAugmentedCollectionWithFields($keys = null) { - return $this->traitToAugmentedCollection($keys)->merge([ + return $this->traitToAugmentedCollectionWithFields($keys)->merge([ 'result_type' => $this->getType(), 'search_score' => $this->getScore(), ])->merge($this->index->extraAugmentedResultData($this)); } - public function toDeferredAugmentedArray($keys = null) - { - return $this->toAugmentedCollection($keys); - } - public function newAugmentedInstance(): Augmented { if ($this->searchable instanceof Augmentable) { From fd24694982471443257df1f2d4dbd0b4576f1c95 Mon Sep 17 00:00:00 2001 From: kingsven Date: Sat, 27 Jul 2024 03:49:56 +0800 Subject: [PATCH 010/249] [5.x] Updated the BulkAugmentor to be able to handle iterables that don't have sequential numeric keys (#10512) Co-authored-by: Simon Geoghegan --- src/Data/BulkAugmentor.php | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/Data/BulkAugmentor.php b/src/Data/BulkAugmentor.php index d4481f3057..dacdaa6ace 100644 --- a/src/Data/BulkAugmentor.php +++ b/src/Data/BulkAugmentor.php @@ -36,13 +36,10 @@ public static function tree($tree) */ private function augment($items) { - $count = count($items); - $referenceKeys = []; $referenceFields = []; - for ($i = 0; $i < $count; $i++) { - $item = $items[$i]; + foreach ($items as $i => $item) { $reference = $this->getAugmentationReference($item); if (! $this->isTree) { @@ -58,8 +55,7 @@ private function augment($items) $referenceFields[$reference] = $augmented->blueprintFields(); } - for ($i = 0; $i < $count; $i++) { - $item = $items[$i]; + foreach ($items as $i => $item) { $reference = $this->getAugmentationReference($item); $fields = $referenceFields[$reference]; $keys = $referenceKeys[$reference]; @@ -80,9 +76,7 @@ private function augmentTree($tree) $items = []; - for ($i = 0; $i < count($tree); $i++) { - $item = $tree[$i]; - + foreach ($tree as $i => $item) { $items[] = $item['page']; $this->originalValues[$i] = $item; } @@ -94,8 +88,7 @@ public function map(callable $callable) { $items = []; - for ($i = 0; $i < count($this->originalValues); $i++) { - $original = $this->originalValues[$i]; + foreach ($this->originalValues as $i => $original) { $augmented = $this->augmentedValues[$i]; $items[] = call_user_func_array($callable, [$original, $augmented, $i]); From 17b666498eeb1da63a512197f494f9d608645908 Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Mon, 29 Jul 2024 17:17:02 +0330 Subject: [PATCH 011/249] [5.x] Turkish translation (#10518) --- resources/lang/tr.json | 912 +++++++++++++++++++----------- resources/lang/tr/fieldtypes.php | 504 +++++++---------- resources/lang/tr/messages.php | 129 +++-- resources/lang/tr/moment.php | 18 + resources/lang/tr/permissions.php | 15 +- resources/lang/tr/validation.php | 133 +++-- 6 files changed, 971 insertions(+), 740 deletions(-) create mode 100644 resources/lang/tr/moment.php diff --git a/resources/lang/tr.json b/resources/lang/tr.json index 98fc8a0866..9dcc3da68a 100644 --- a/resources/lang/tr.json +++ b/resources/lang/tr.json @@ -1,148 +1,138 @@ { - "A fresh verification link has been sent to your email address.": "E-posta adresinize yeni bir doğrulama bağlantısı gönderildi.", - "All rights reserved.": "Tüm hakları saklıdır.", - "Before proceeding, please check your email for a verification link.": "Devam etmeden önce, lütfen bir doğrulama bağlantısı için e-postanızı kontrol edin.", - "click here to request another": "yeni bir doğrulama bağlantısı için buraya tıklayın", - "Confirm Password": "Parolayı Onayla", - "E-Mail Address": "E-Posta Adresi", - "Error": "Hata", - "Forbidden": "Yasak", - "Forgot Your Password?": "Parolanızı mı unuttunuz?", - "Go Home": "Anasayfaya Git", - "Hello!": "Merhaba!", - "hi": "merhaba", - "If you did not create an account, no further action is required.": "Bir hesap oluşturmadıysanız, başka bir işlem yapmanız gerekmez.", - "If you did not receive the email": "E-postayı almadıysanız", - "If you did not request a password reset, no further action is required.": "Bir parola sıfırlama isteğinde bulunmadıysanız, başka bir işlem yapmanız gerekmez.", - "Login": "Giriş Yap", - "Logout": "Çıkış Yap", - "Oh no": "Ah hayır", - "Page Expired": "Sayfa zaman aşımına uğradı", - "Page Not Found": "Sayfa Bulunamadı", - "Not Found": "Sayfa Bulunamadı", - "CSRF token mismatch.": "CRSF tokeni uyuşmuyor.", - "Server Error": "Sunucu hatası", - "Password": "Parola", - "Please click the button below to verify your email address.": "Lütfen e-posta adresinizi doğrulamak için aşağıdaki düğmeyi tıklayın.", - "Register": "Kayıt Ol", - "Remember Me": "Beni hatırla", - "This password reset link will expire in :count minutes.": "Bu parola sıfırlama linki :count dakika sonra geçerliliğini yitirecek.", - "Reset Password Notification": "Parola Sıfırlama Bildirimi", - "Send Password Reset Link": "Parola Sıfırlama Bağlantısı Gönder", - "Sorry, the page you are looking for could not be found.": "Üzgünüz, aradığınız sayfa bulunamadı.", - "Sorry, you are forbidden from accessing this page.": "Üzgünüz, bu sayfaya erişiminiz yasak.", - "Sorry, you are making too many requests to our servers.": "Üzgünüz, sunucularımıza çok fazla istek yapıyorsunuz.", - "Sorry, you are not authorized to access this page.": "Üzgünüz, bu sayfaya erişme yetkiniz yok.", - "Sorry, your session has expired. Please refresh and try again.": "Üzgünüz, oturumunuzun süresi doldu. Lütfen yenileyin ve tekrar deneyin.", - "Sorry, we are doing some maintenance. Please check back soon.": "Üzgünüz, biraz bakım yapıyoruz. Lütfen kısa bir süre sonra tekrar kontrol edin.", - "Toggle navigation": "Açılır Menü", - "Too Many Requests": "Çok Fazla İstek", - "Verify Email Address": "E-posta Adresini Doğrula", - "Verify Your Email Address": "E-posta Adresinizi Doğrulayın", - "You are receiving this email because we received a password reset request for your account.": "Hesabınız için bir parola sıfırlama isteği aldığımız için bu e-postayı alıyorsunuz.", - "Whoops, something went wrong on our servers.": "Ops, sunucularımızda bir şeyler ters gitti.", - "Please confirm your password before continuing.": "Devam etmeden önce lütfen parolanızı onaylayın.", - "The :attribute must contain at least one letter.": ":attribute en az bir tane harf içermelidir.", - "The :attribute must contain at least one number.": ":attribute en az bir tane rakam içermelidir.", - "The :attribute must contain at least one symbol.": ":attribute en az bir tane özel karakter içermelidir.", - "The :attribute must contain at least one uppercase and one lowercase letter.": ":attribute en az bir tane büyük harf ve küçük harf içermelidir.", - "The given :attribute has appeared in a data leak. Please choose a different :attribute.": "Verilen :attribute bir veri sızıntısında ortaya çıktı. Lütfen başka bir :attribute seçiniz.", - "1 update available|:count updates available": "1 güncelleme mevcut|:count güncelleme mevcut", - "1 update|:count updates": "1 Güncelleme|:count güncelleme", ":count item selected|:count items selected": ":count öğe seçili|:count öğe seçili", ":count row|:count rows": ":count satır|:count satır", ":count selected|:count selected": ":count seçili|:count seçili", ":count set|:count sets": ":count set|:count set", + ":count word|:count words": ":count kelime|:count kelime", ":count/:max selected": ":count/:max seçildi", + ":count/:total characters": ":count/:total karakter", ":file uploaded": ":file yüklendi", - ":start-:end of :total": ":start-:end #:total", + ":start-:end of :total": ":total'tan :start-:end", + ":title Field": ":title Alan", + "0 B": "0 B", + "1 update available|:count updates available": "Bir güncelleme mevcut|:count güncelleme mevcut", + "1 update|:count updates": "Bir Güncelleme|:count güncelleme", "A blueprint with that name already exists.": "Bu isme sahip bir plan zaten var.", "A fieldset with that name already exists.": "Bu isme sahip bir alan seti zaten var.", + "A Global Set with that handle already exists.": "Bu tutamaç ile bir Evrensel Set zaten var.", + "A navigation with that handle already exists.": "Bu tutamaç ile bir navigasyon zaten var.", + "A Role with that handle already exists.": "Bu tutamaç ile bir Rol zaten var.", + "A User Group with that handle already exists.": "Bu tutamaç ile bir Kullanıcı Grubu zaten var.", "A valid blueprint is required.": "Geçerli bir plan gereklidir.", "Above": "Üstünde", + "Accepted": "Kabul Edilmiş", + "Accepted If": "Koşullu Kabul", "Action completed": "Eylem tamamlandı", - "Activate Account": "Aktif hesap", + "Activate Account": "Aktif Hesap", "Activation URL": "Aktivasyon URL'si", "Active": "Aktif", + "Active URL": "Aktif URL", "Add": "Ekle", - "Add an item": "Bir öğe ekle", + "Add Attribute": "Öznitelik Ekle", "Add child link to entry": "Girişe Alt Bağlantısı Ekle", - "Add child nav item": "Çocuk Nav öğesi ekle", + "Add child nav item": "Çocuk nav öğesi ekle", + "Add Color": "Renk Ekle", "Add Column": "Sütun Ekle", - "Add Column After": "Sonuna sütun ekle", - "Add Column Before": "Önüne sütun ekle", - "Add Condition": "Durum ekle", - "Add Date": "Tarih ekle", - "Add Email": "E-posta ekle", - "Add Field": "Alan ekle", - "Add Nav Item": "Nav öğesi ekle", - "Add Option": "Seçenek ekle", + "Add Column After": "Sonuna Sütun Ekle", + "Add Column Before": "Önüne Sütun Ekle", + "Add Condition": "Durum Ekle", + "Add Date": "Tarih Ekle", + "Add Email": "E-Posta Ekle", + "Add Item": "Öğe Ekle", + "Add Key": "Anahtar Ekle", + "Add Nav Item": "Nav Öğesi Ekle", + "Add Option": "Seçenek Ekle", "Add or drag fields here": "Alanları buraya ekleyin veya sürükleyin", - "Add Row": "Satır ekle", - "Add Row After": "Sonra satır ekle", + "Add Row": "Satır Ekle", + "Add Row After": "Sonra Satır Ekle", "Add Row Before": "Önce Satır Ekle", "Add Row Label": "Satır Etiketi Ekle", - "Add Rule": "Kural ekle", + "Add Rule": "Kural Ekle", + "Add Ruler": "Cetvel Ekle", "Add Section": "Bölüm Ekle", - "Add Set": "Set ekle", + "Add Set": "Set Ekle", + "Add Set Group": "Set Grubu Ekle", + "Add Set Label": "Setin Etiketini Ekle", + "Add Site": "Site Ekle", + "Add Tab": "Sekme Ekle", "Added": "Katma", - "Addon Settings": "Addon ayarları", + "Addon Settings": "Eklenti Ayarları", "Addons": "Eklentiler", "Affected files": "Etkilenen dosyalar", "After": "Sonrasında", - "After Saving": "Kaydettikten sonra", + "After (Date)": "Sonra (Tarih)", + "After Or Equal (Date)": "Sonra veya Eşit (Tarih)", + "After Saving": "Kaydettikten Sonra", + "Alias Item": "Takma Ad Ögesi", + "Align Center": "Ortala", + "Align Justify": "Düzenle", + "Align Left": "Sola Hizala", + "Align Right": "Sağa Hizala", "All": "Tümü", "All caches cleared.": "Tüm önbellekler temizlendi.", "All of the following conditions pass": "Aşağıdaki koşulların tümü geçerli", + "All rights reserved.": "Tüm hakları saklıdır.", "Allow additions": "Eklemelere izin ver", - "Allow Creating": "Yaratmaya izin vermek", + "Allow Antlers": "Antlers'a İzin Ver", + "Allow Any Color": "Herhangi Bir Renge İzin Ver", + "Allow Creating": "Yaratmaya İzin Ver", "Allow Downloading": "İndirmeye İzin Ver", - "Allow Fullscreen Mode": "Tam ekran moduna izin verin", - "Allow Moving": "Harekete geçmesine izin vermek", - "Allow Renaming": "Yeniden adlandırmaya izin ver", - "Allow Source Mode": "Kaynak moduna izin ver", - "Allow Uploads": "Yüklemelere izin ver", - "Alt Text": "Alt metin", + "Allow Fullscreen Mode": "Tam Ekran Moduna İzin Ver", + "Allow Moving": "Harekete Geçmesine İzin Ver", + "Allow Renaming": "Yeniden Adlandırmaya İzin Ver", + "Allow Source Mode": "Kaynak Moduna İzin Ver", + "Allow Uploads": "Yüklemelere İzin Ver", + "Alpha": "Alfa", + "Alpha Dash": "Alfa Tire", + "Alpha Numeric": "Alfa Sayısal", + "Alt Text": "Alt Metin", "Always Save": "Daima Kaydet", "Always show": "Her zaman göster", - "Always Show Set Button": "Daima Set düğmesini göster", + "Always Show Set Button": "Daima Set Düğmesini Göster", "An entry will be deleted|:count entries will be deleted": "Bir girdi silinecek|:count girdi silinecek", "An item with this ID could not be found": "Bu ID'ye sahip bir öğe bulunamadı", "and": "ve", "and :count more": "Ve :count daha", + "Antlers": "Antlers", "Any of the following conditions pass": "Aşağıdaki koşullardan herhangi biri geçer", - "Append": "İlave et", + "Any unsaved changes will not be duplicated into the new entry.": "Kaydedilmemiş değişiklikler yeni girdiye kopyalanmayacaktır.", + "Any unsaved changes will not be reflected in this action's behavior.": "Kaydedilmemiş değişiklikler bu eylemin davranışına yansımayacaktır.", + "Appearance": "Görünüm", + "Appearance & Behavior": "Görünüm ve Davranış", + "Append": "İlave Et", "Application Cache": "Uygulama Önbelleği", "Application cache cleared.": "Uygulama önbelleği temizlendi.", + "Apply": "Uygula", "Apply Link": "Bağlantı Uygula", "Are you sure you want to delete this column?": "Bu sütunu silmek istediğinizden emin misiniz?", "Are you sure you want to delete this entry?": "Bu girdiyi silmek istediğinizden emin misiniz?", "Are you sure you want to delete this item?": "Bu öğeyi silmek istediğinizden emin misiniz?", - "Are you sure you want to delete this preset?": "Bu ön ayarı silmek istediğinizden emin misiniz?", "Are you sure you want to delete this row?": "Bu satırı silmek istediğinden emin misiniz?", "Are you sure you want to delete this value?": "Bu değeri silmek istediğinizden emin misiniz?", + "Are you sure you want to delete this view?": "Bu görünümü silmek istediğinizden emin misiniz?", "Are you sure you want to delete this?|Are you sure you want to delete these :count items?": "Bunu silmek istediğinizden emin misiniz?", - "Are you sure you want to downgrade to :version?": "Aşağı geçmek istediğinizden emin misiniz :version?", "Are you sure you want to move this asset?|Are you sure you want to move these :count assets?": "Bu varlığı taşımak istediğinizden emin misiniz?|:count varlığı taşımak istediğinizden emin misiniz?", "Are you sure you want to move this folder?|Are you sure you want to move these :count folders?": "Bu klasörü taşımak istediğinizden emin misiniz?", "Are you sure you want to publish this entry?|Are you sure you want to publish these :count entries?": "Bu girişi yayınlamak istediğinizden emin misiniz?|:count girdiyi yayınlamak istediğinizden emin misiniz?", "Are you sure you want to remove this page?": "Bu sayfayı kaldırmak istediğinizden emin misiniz?", + "Are you sure you want to remove this section and all of its children?": "Bu bölümü ve tüm alt öğelerini kaldırmak istediğinizden emin misiniz?", "Are you sure you want to rename this asset?|Are you sure you want to rename these :count assets?": "Bu varlığı yeniden adlandırmak istediğinizden emin misiniz?", "Are you sure you want to rename this folder?|Are you sure you want to rename these :count folders?": "Bu klasörü yeniden adlandırmak istediğinizden emin misiniz?", + "Are you sure you want to reset nav customizations?": "Navigasyon özelleştirmelerini sıfırlamak istediğinizden emin misiniz?", "Are you sure you want to restore this revision?": "Bu revizyonu geri yüklemek istediğinizden emin misiniz?", "Are you sure you want to run this action?|Are you sure you want to run this action on :count items?": "Bu eylemi yürütmek istediğinizden emin misiniz?", "Are you sure you want to unpublish this entry?|Are you sure you want to unpublish these :count entries?": "Bu girdiyi yayınlamak istediğinizden emin misiniz?|:count girdiyi yayınlamak istediğinizden emin misiniz?", - "Are you sure you want to update to :version?": "Güncellemek istediğinizden emin misiniz :version?", "Are you sure?": "Emin misiniz?", "Are you sure? This field's value will be replaced by the value in the original entry.": "Emin misiniz? Bu alanın değeri orijinal girişteki değerle değiştirilecektir.", "Are you sure? Unsaved changes will be lost.": "Emin misiniz? Kaydedilmemiş değişiklikler kaybolacak.", + "Array": "Dizi", "Ascending": "Artan", "Asset": "Varlık", - "Asset container created": "Varlık Konteyneri Oluşturuldu", - "Asset container deleted": "Varlık Konteyneri Silindi", - "Asset container saved": "Varlık Konteyneri Kaydedildi", - "Asset container updated": "Varlık Konteyneri Güncellendi", - "Asset Containers": "Varlık kapları", + "Asset container created": "Varlık konteyneri oluşturuldu", + "Asset container deleted": "Varlık konteyneri silindi", + "Asset container saved": "Varlık konteyneri kaydedildi", + "Asset container updated": "Varlık konteyneri güncellendi", + "Asset Containers": "Varlık Kapları", "Asset deleted": "Varlık silindi", "Asset folder deleted": "Varlık klasörü silindi", "Asset folder saved": "Varlık klasörü kaydedildi", @@ -151,14 +141,28 @@ "Asset saved": "Varlık kaydedildi", "Asset uploaded": "Varlık yüklendi", "Assets": "Varlıklar", + "Assign Groups": "Grupları Ata", + "Assign groups to this user?|Assign groups to these :count users?": "Bu kullanıcıya grupları mı atamak istiyorsunuz?|Bu :count kullanıcıya grupları mı atamak istiyorsunuz?", + "Assign Roles": "Rolleri Ata", + "Assign roles to this user?|Assign roles to these :count users?": "Bu kullanıcıya rolleri mi atamak istiyorsunuz?|Bu :count kullanıcıya rolleri mi atamak istiyorsunuz?", + "Assign|Assign to :count users": "Ata|:count kullanıcılara ata", "Attachments": "Ekler", "Author": "Yazar", + "Autocomplete": "Otomatik Tamamla", "Automatic Line Breaks": "Otomatik Çizgi Kırmaları", - "Automatic Links": "Otomatik bağlantılar", - "Available Columns": "Mevcut sütunlar", + "Automatic Links": "Otomatik Bağlantılar", + "Available Columns": "Mevcut Sütunlar", + "B": "B", "Back to Users": "Kullanıcılara Dönüş", + "Bail": "İlk geçersiz alanı gördükten sonra doğrulamayı vazgeç", + "BCC Recipient(s)": "BCC Alıcı(ları)", "Before": "Önceki", + "Before (Date)": "Önce (Tarih)", + "Before Or Equal (Date)": "Önce veya Eşit (Tarih)", + "Before you can delete this fieldset, you need to remove references to it in blueprints and fieldsets:": "Bu alan seti silebilmeniz için, planlarda ve alan setlarında buna yapılan referansları kaldırmanız gerekir:", + "Behavior": "Davranış", "Below": "Aşağıda", + "Between": "Arasında", "Blockquote": "Blokquote", "Blueprint": "Taslak", "Blueprint created": "Plan oluşturuldu", @@ -166,99 +170,124 @@ "Blueprint saved": "Plan kaydedildi", "Blueprints": "Planlar", "Blueprints successfully reordered": "Planlar başarıyla yeniden sıralandı", - "Bold": "Koyu", - "Browse": "Araştır", - "Build time": "Yapım Zamanı", + "Bold": "Kalın", + "Boolean": "Boolean", + "Boundaries": "Sınırlar", + "Browse": "Gözat", + "Buddhist": "Budist", + "Build time": "Yapım zamanı", "Button": "Buton", "Buttons": "Düğmeler", "Buttons & Controls": "Düğmeler ve Kontroller", - "Buy Licenses": "Lisans satın al", + "Buy Licenses": "Lisans Satın Al", + "C-Like": "C Benzeri", "Cache": "Önbellek", - "Cache Manager": "Önbellek yöneticisi", + "Cache Manager": "Önbellek Yöneticisi", "Cached images": "Önbelleğe alınmış görüntüler", + "Calendar": "Takvim", "Cancel": "İptal", - "Cast Booleans": "Boolean değerler", - "Change Password": "Şifre değiştir", - "Changes to this field will stay in sync.": "Bu alandaki değişiklikler senkronize kalacaktır.", + "Cast Booleans": "Boolean Değerler", + "CC Recipient(s)": "CC Alıcı(ları)", + "Change Password": "Şifre Değiştir", + "Change successful.": "Değişiklik başarılı.", + "Changes to this field in the fieldset will stay in sync.": "Bu alandaki değişiklikler alan setinda senkronize kalacaktır.", "Changes to this fieldset will stay in sync.": "Bu alan setindeki değişiklikler senkronize kalacaktır.", - "Character Limit": "Karakter sınırı", + "Character Limit": "Karakter Sınırı", "Characters": "Karakter", - "Choose Blueprint": "Planı seçin", + "Checkbox Options": "Onay Kutusu Seçenekleri", + "Choose Blueprint": "Planı Seçin", "Choose Image": "Resmi Seçin", "Choose...": "Seçiniz...", - "Classic": "Klasik", + "Civil Islamic": "Medeni Hicrî Takvimi", "Clear": "Temizle", - "Clear All": "Hepsini temizle", + "Clear All": "Hepsini Temizle", "Clearable": "Temizlenebilir", "Close": "Kapat", - "Close editor": "Editorü kapat", - "Close Fullscreen Mode": "Tam ekran modunu kapatın", - "Close Markdown Cheatsheet": "Markdown Cheatsheet'i kapatın", + "Close Editor": "Düzenleyiciyi Kapa", + "Close Markdown Cheatsheet": "Markdown Cheatsheet'i Kapatın", "Close Modal": "Modal Kapat", - "Code Block": "Kod bloğu", + "Code Block": "Kod Bloğu", + "Code Fieldtype Rulers": "Kod Alan Türü Cetvelleri", "Collapse": "Yıkılmak", "Collapse All": "Hepsini Daralt", - "Collapse Set": "Çökme seti", + "Collapse Set": "Çökme Seti", + "Collapse Sets": "Çökme Setleri", "Collection": "Toplamak", "Collection already exists": "Koleksiyon zaten var", - "Collection created": "Koleksiyon Oluşturuldu", + "Collection created": "Koleksiyon oluşturuldu", "Collection deleted": "Koleksiyon silindi", - "Collection saved": "Koleksiyon Kaydedildi", + "Collection is not available on site \":handle\".": "Koleksiyon \":handle\" sitesinde mevcut değil.", + "Collection saved": "Koleksiyon kaydedildi", "Collection tree deleted": "Koleksiyon ağacı silindi", - "Collection tree saved": "Koleksiyon Ağacı Kaydedildi", + "Collection tree saved": "Koleksiyon ağacı kaydedildi", "Collections": "Koleksiyonlar", - "Color Modes": "Renk Modları", "Columns": "Sütunlar", "Columns have been reset to their defaults.": "Sütunlar varsayılanlarına sıfırlanmıştır.", "Commit": "İşle", + "Common": "Yaygın", "Computed": "Hesaplanmış", "Conditions": "Koşullar", "Configuration": "Yapılandırma", "Configuration is cached": "Yapılandırma önbelleğe alındı", "Configure": "Yapılandır", - "Configure Asset Container": "Varlık kapsayıcıyı yapılandırın", - "Configure Blueprints": "Planları yapılandırın", - "Configure Collection": "Koleksiyonu yapılandırın", + "Configure Asset Container": "Varlık Kapsayıcıyı Yapılandırın", + "Configure Blueprints": "Planları Yapılandırın", + "Configure Collection": "Koleksiyonu Yapılandırın", "Configure Form": "Formu Yapılandırma", - "Configure Global Set": "Evrensel seti yapılandırın", + "Configure Global Set": "Evrensel Seti Yapılandırın", "Configure Navigation": "Gezinmeyi Yapılandır", - "Configure Role": "Rolü yapılandır", - "Configure Taxonomy": "Taksonomiyi yapılandır", - "Configure User Group": "Kullanıcı grubunu yapılandır", + "Configure Role": "Rolü Yapılandır", + "Configure Site": "Siteyi Yapılandır", + "Configure Sites": "Siteleri Yapılandır", + "Configure Taxonomy": "Taksonomiyi Yapılandır", + "Configure User Group": "Kullanıcı Grubunu Yapılandır", "Confirm": "Onayla", + "Confirm Password": "Parolayı Onayla", + "Confirmed": "Onaylandı", "Container": "Konteyner", + "contains": "içerir", "Contains": "İçerir", + "contains any": "herhangi birini içerir", "Content": "İçerik", "Content committed": "İçerik işlendi", - "Content Model": "İçerik modeli", + "Content Model": "İçerik Modeli", "Content saved": "İçerik Kaydedildi", "Content Stache": "İçerik Stache'ı", - "Continue Editing": "Düzenlemeye devam et", - "Copied to clipboard": "Panoya kopyalandı", + "Continue Editing": "Düzenlemeye Devam Et", + "Copied to clipboard": "Panoya Kopyalandı", + "Coptic": "Kıpti Takvimi", "Copy": "Kopya", "Copy password reset email for this user?": "Bu kullanıcı için şifre sıfırlama e-postasını kopyalansın mı?", "Copy Password Reset Link": "Parola Sıfırlama Bağlantısı Kopyala", - "Copy URL": "Url'yi kopyala", + "Copy URL": "Url'yi Kopyala", + "Core": "Çekirdek", + "Couldn't save entry": "Girdi kaydedilemedi", + "Couldn't save term": "Terim kaydedilemedi", + "CP Nav": "CP Navigasyon", + "CP Nav Preferences": "CP Navigasyon Tercihleri", "Create": "Oluştur", "Create & Link Item": "Öğe Oluştur ve Bağla", - "Create a Blueprint": "Bir plan oluşturun", + "Create a Blueprint": "Bir Plan Oluşturun", "Create a Collection": "Bir Koleksiyon Oluştur", "Create a Navigation": "Navigasyon Oluşturun", - "Create and Send Email": "E-posta Oluştur ve Gönder", - "Create Another": "Başka bir tane yarat", + "Create and Send Email": "E-Posta Oluştur ve Gönder", + "Create Another": "Başka Bir Tane Yarat", "Create Asset Container": "Varlık Konteyneri Oluştur", "Create Blueprint": "Plan Oluştur", - "Create Child Entry": "Çocuk girişi oluştur", + "Create Child Entry": "Çocuk Girişi Oluştur", "Create Collection": "Koleksiyon Oluştur", "Create Container": "Konteyner Oluştur", "Create Entry": "Giriş Oluştur", "Create Field": "Alan Oluştur", "Create Fieldset": "Alan Seti Oluştur", - "Create Folder": "Klasör oluşturun", + "Create Folder": "Klasör Oluşturun", "Create Folders": "Klasörler Oluştur", "Create Form": "Form Oluştur", "Create Global Set": "Evrensel Set Oluştur", + "Create Group": "Grup Oluştur", + "Create Localization": "Yerelleştirme Oluştur", "Create Navigation": "Navigasyon Oluştur", + "Create New View": "Yeni Görünüm Oluştur", "Create Revision": "Revizyon Oluştur", "Create Role": "Rol Oluştur", "Create Taxonomy": "Taksonomi Oluştur", @@ -266,95 +295,125 @@ "Create User": "Kullanıcı Oluştur", "Create User Group": "Kullanıcı Grubu Oluştur", "Create Views": "Görünümler Oluştur", + "CSS": "CSS", "Current": "Mevcut", + "Current Password": "Mevcut Şifre", "Current Version": "Etkin Sürüm", + "custom": "özel", + "Custom Attributes": "Özel Öznitelikler", + "Custom Item": "Özel Öğe", "Custom method passes": "Özel yöntem geçer", - "Customize Columns": "Sütunları özelleştir", + "Custom Section": "Özel Bölüm", + "Customize Columns": "Sütunları Özelleştir", "Customize Invitation": "Davetiyeyi Özelleştir", + "Customizing the Control Panel Nav": "Kontrol Paneli Navigasyonunu Özelleştirme", "Dark": "Karanlık", - "Dark Mode": "Karanlık mod", + "Dark Mode": "Karanlık Mod", "Dashboard": "Gösterge Paneli", + "Data": "Veri", + "Data Format": "Veri Formatı", "Data updated": "Veriler Güncellendi", + "Date": "Tarih", + "Date Equals": "Tarih Eşit", + "Date Format": "Tarih Formatı", "Dates & Behaviors": "Tarihler ve Davranışlar", - "Default Color Mode": "Varsayılan renk modu", - "Default From Address": "Varsayılan Gönderici E-posta", + "Default": "Varsayılan", + "Default Color": "Varsayılan Renk", + "Default From Address": "Varsayılan Gönderici E-Posta", "Default From Name": "Varsayılan Gönderici Adı", - "Default Mailer": "Varsayılan postacı", - "Default Mode": "Varsayılan mod", - "Default Value": "Varsayılan değer", + "Default Mailer": "Varsayılan Postacı", + "Default Mode": "Varsayılan Mod", + "Default preferences saved": "Varsayılan tercihlerinizi kaydettiniz", + "Default Value": "Varsayılan Değer", "Delete": "Sil", "Delete :resource": ":resource sil", "Delete child entry|Delete :count child entries": "Alt girdiyi sil|:count alt girdiyi sil", "Delete Collection": "Koleksiyonu Sil", - "Delete Column": "Sütunu sil", + "Delete Column": "Sütunu Sil", "Delete Container": "Konteyneri Sil", - "Delete Entry": "Girişi sil", + "Delete Entry": "Girişi Sil", "Delete Form": "Formu Sil", "Delete Original Asset": "Orijinal Varlığı Sil", - "Delete Preset": "Ön ayarını sil", - "Delete Row": "Sırayı sil", + "Delete Row": "Sırayı Sil", "Delete Rule": "Kural Sil", - "Delete Set": "Seti sil", + "Delete Set": "Seti Sil", "Delete Table": "Tablo Sil", - "Delete Taxonomy": "Taksonomiyi sil", - "Delete User Group": "Kullanıcı grubunu sil", + "Delete Taxonomy": "Taksonomiyi Sil", + "Delete User Group": "Kullanıcı Grubunu Sil", "Delete Value": "Değer Sil", - "Deleted": "silindi", + "Delete View": "Görünümü Sil", "Delete|Delete :count items?": "Sil|:count öğeyi sil?", + "Deleted": "Silindi", "Descending": "Azalan", "Description of the image": "Görüntünün açıklaması", "Deselect option": "Seçme seçeneği", "Detach": "Ayrılmak", - "Dimensions": "Boyutlar", + "Diff": "Fark", + "Different": "Farklı", + "Digits": "Rakamlar", + "Digits Between": "Rakamlar Arasında", + "Dimensions (Image Files)": "Boyutlar (Görsel Dosyaları)", + "Directory": "Dizin", "Directory already exists.": "Dizin zaten var.", "Disabled": "Engelli", "Discard changes": "Değişiklikleri gözardı et", "Disk": "Disk", "Dismiss": "Azletmek", "Display": "Görüntülenme", - "Displayed Columns": "Görüntülenen sütunlar", + "Display Label": "Ekran Etiketi", + "Displayed Columns": "Görüntülenen Sütunlar", + "Distinct": "Farklı", "Documentation": "Belgeler", "Don't remove empty nodes": "Boş düğümleri kaldırmayın", - "Downgrade :name": "Downgrade: İsim", - "Downgrade to :version": ":version Sürümüne düşür", + "Downgrade to :version": ":version Sürümüne Düşür", "Download": "İndirmek", "Download file": "Dosyayı indir", "Downloads": "İndirilenler", "Draft": "Taslak", "Driver": "Şoför", - "Drop File to Upload": "Yüklemek için dosyayı bırakın", + "Drop File to Upload": "Yüklemek için Dosyayı Bırakın", + "Drop to Upload": "Yüklemek için Bırakın", "DummyClass": "KuklaClass", - "Duplicate ID Regenerated": "Yinelenen ID yeniden oluşturuldu", + "Duplicate": "Kopyala", + "Duplicate ID Regenerated": "Yinelenen ID Yeniden Oluşturuldu", "Duplicate IDs": "Yinelenen IDler", - "Duplicate Row": "Yinelenen satır", - "Duplicate Set": "Yinelenen set", + "Duplicate Row": "Yinelenen Satır", + "Duplicate Set": "Yinelenen Set", + "Duplicated": "Kopyalanmış", "Dynamic": "Dinamik", + "E-Mail": "E-Posta", "e.g. hero_": "Örneğin. hero_", - "Earliest Date": "En erken tarih", + "Earliest Date": "En Erken Tarih", "Edit": "Düzenle", "Edit Asset": "Varlığı Düzenle", - "Edit Blueprint": "Planı düzenle", - "Edit Blueprints": "Planı düzenle", + "Edit Blueprint": "Planı Düzenle", + "Edit Blueprints": "Planı Düzenle", "Edit Collection": "Koleksiyonu Düzenle", "Edit Container": "Konteyneri Düzenle", "Edit Content": "İçeriği Düzenle", "Edit Entry": "Giriş Düzenle", "Edit Fieldset": "Alan setini düzenle", - "Edit Folder": "Klasörü Düzenle", "Edit Form": "Formu Düzenle", "Edit Global Set": "Evrensel setini düzenle", + "Edit Image": "Görseli Düzenle", + "Edit Nav Item": "Navigasyon Öğesini Düzenle", "Edit Navigation": "Gezinmeyi Düzenle", + "Edit Section": "Bölümü Düzenle", + "Edit Set": "Seti Düzenle", + "Edit Set Group": "Set Grubunu Düzenle", "Edit Site": "Siteyi Düzenle", + "Edit Tab": "Sekmeyi Düzenle", "Edit Taxonomy": "Taksonomiyi Düzenle", "Edit Term": "Terim düzenleme", "Edit User": "kullanıcıyı düzenle", "Edit User Group": "Kullanıcı grubunu düzenle", "Editable once created": "Bir kez düzenlenebilir oluşturuldu", "Editions": "Sürümler", - "Email": "E-posta", - "Email Address": "E-posta adresi", - "Email Content": "E-posta İçeriği", - "Email Subject": "E-posta konusu", + "Editor": "Düzenleyici", + "Email": "E-Posta", + "Email Address": "E-Posta Adresi", + "Email Content": "E-Posta İçeriği", + "Email Subject": "E-Posta Konusu", "Enable Input Rules": "Giriş Kurallarını Etkinleştir", "Enable Line Wrapping": "Satır Sarma Etkinleştir", "Enable Paste Rules": "Yapıştırma Kurallarını Etkinleştir", @@ -362,152 +421,203 @@ "Enable Publish Dates": "Yayın Tarihlerini Etkinleştir", "Enable Revisions": "Revizyonları Etkinleştir", "Encryption": "Şifreleme", + "Ends With": "İle Biter", "Enter any internal or external URL.": "Herhangi bir dahili veya harici URL girin.", - "Enter URL": "URL girin", + "Enter URL": "URL Girin", "Entries": "Girdileri", "Entries successfully reordered": "Girişler başarıyla yeniden sıralandı", "Entry": "Giriş", - "Entry created": "Giriş Oluşturuldu", + "Entry created": "Giriş oluşturuldu", "Entry deleted": "Giriş silindi", "Entry has a published version": "Giriş yayınlanmış bir sürüme sahiptir", "Entry has not been published": "Giriş yayınlanmadı", "Entry has unpublished changes": "Giriş yayınlanmamış değişiklikler var", "Entry link": "Giriş bağlantısı", "Entry saved": "Giriş kaydedildi", + "equals": "eşittir", + "Equals": "Eşit", "Escape Markup": "Kaçış İşaretleme", + "Ethiopian": "Etiyopya Takvimi", + "Ethiopian (Amete Alem)": "Etiyopya Takvimi (Dünyanın kökeni)", "Everything is up to date.": "Her şey güncel.", "Example": "Örnek", - "Expand All": "Hepsini genişlet", - "Expand Set": "Set genişlet", + "Exit Fullscreen Mode": "Tam Ekran Modundan Çık", + "Expand All": "Hepsini Genişlet", + "Expand Set": "Set Genişlet", + "Expand Sets": "Setleri Genişlet", "Expand/Collapse Sets": "Setleri Genişlet/Çöktür", "Expect a root page": "Kök sayfası bekleyin", - "Expired": "Süresi doldu", - "Export as CSV": "CSV olarak dışarı aktar", - "Export as JSON": "JSON Olarak dışa aktar", - "Export Submissions": "Gönderimleri dışa aktar", + "Expired": "Süresi Doldu", + "Export Submissions": "Gönderimleri Dışa Aktar", "External link": "Harici bağlantı", - "FALSE": "YANLIŞ", + "False": "Yanlış", "Favorite removed": "Favori kaldırıldı", "Favorite saved": "Favori Kaydedildi", - "Featured": "Öne çıkan", + "Favorites": "Favoriler", + "Featured": "Öne Çıkan", "Field": "Alan", "Field added": "Alan eklendi", "Field Previews": "Alan Önizlemeleri", "Fields": "Alanlar", - "Fieldset": "Alan seti", + "Fieldset": "Alan Seti", "Fieldset created": "Alan seti oluşturuldu", "Fieldset deleted": "Alan seti silindi", "Fieldset saved": "Alan seti kaydedildi", - "Fieldsets": "Alan setleri", - "Fieldtypes": "Alan türleri", + "Fieldsets": "Alan Setleri", + "Fieldtypes": "Alan Türleri", "File": "Dosya", + "file (statamic)": "dosya (statamik)", "File Driver": "Dosya Sürücüsü", - "Filename": "Dosya adı", + "Filename": "Dosya Adı", + "Filled": "Dolu", "Filter": "Filtre", "Filter preset deleted": "Filtre ön ayarı silindi", - "Filter preset name": "Filtre Ön Ayar Adı", "Filter preset saved": "Filtre ön ayarı kaydedildi", "Filter preset updated": "Filtre ön ayarı güncellendi", "Finish": "Bitir", "First Child": "İlk alt kayıt", - "First Name": "İsim", "Fixed": "Sabit", "Floating": "Yüzer", - "Focal Point": "Odak noktası", - "Focus Search": "Odak arama", + "Focal Point": "Odak Noktası", + "Focus Search": "Odak Arama", "Folder": "Dosya", "Folder created": "Klasör uluşturuldu", - "Folder Name": "Klasör adı", - "Folder updated": "Klasör güncellendi", + "Folder Name": "Klasör Adı", "Forgot password?": "Parolanızı mı unuttunuz?", + "Forgot Your Password?": "Parolanızı mı Unuttunuz?", "Form already exists": "Form zaten var", "Form created": "Form oluşturuldu", "Form deleted": "Form silindi", "Form saved": "Form kaydedildi", - "Form Submission": "Form gönderisi", + "Form Submission": "Form Gönderisi", "Format": "Biçim", "Forms": "Formlar", "Free": "Serbest", - "Full Width": "Tam genişlik", - "Fullscreen Mode": "Tam ekran modu", - "Future Date Behavior": "Gelecek tarih davranışı", + "From": "Nereden", + "Full Width": "Tam Genişlik", + "Future Date Behavior": "Gelecek Tarih Davranışı", + "GB": "GB", + "General": "Genel", "Generate": "Üret", - "Global Search": "Evrensel arama", - "Global Set created": "Evrensel Set Oluşturuldu", - "Global Set deleted": "Evrensel Set Silindi", - "Global Set saved": "Evrensel set kaydedildi", + "Git": "Git", + "Global Search": "Evrensel Arama", + "Global Set created": "Evrensel Set oluşturuldu", + "Global Set deleted": "Evrensel Set silindi", + "Global Set saved": "Evrensel Set kaydedildi", "Global Sets": "Evrensel Setler", "Global Variables": "Evrensel Değişkenler", "Globals": "Evrensel", - "Go To Listing": "Listeye git", - "Grid": "Kafes", + "Go": "Go", + "Go To Listing": "Listeye Git", + "Greater than": "Büyüktür", + "Greater Than": "Bundan Daha Büyük", + "Greater Than Or Equal": "Büyük veya Eşit", + "Greater than or equals": "Büyüktür veya Eşittir", + "Gregory": "Miladi Takvimi", + "Grid": "Izgara", "Group": "Grup", "Groups": "Gruplar", + "HAML": "HAML", "Handle": "Tutamaç", + "Handlebars": "Handlebars", "Heading 1": "Başlık 1", "Heading 2": "Başlık 2", "Heading 3": "Başlık 3", "Heading 4": "Başlık 4", "Heading 5": "Başlık 5", "Heading 6": "Başlık 6", + "Heading Anchors": "Başlık Bağlantıları", + "Hebrew": "İbrani Takvimi", + "Hello!": "Merhaba!", "Here": "Burada", "Hidden": "Gizli", "Hidden by default": "Varsayılan olarak gizli", "Hidden from output": "Çıktıdan gizlenmiş", - "Hide Drafts": "Taslakları gizle", + "Hidden Item": "Gizli Öğe", + "Hidden Section": "Gizli Bölüm", + "Hide": "Gizle", "Hide Partials": "Kısmi Gizle", - "Hide when": "iken gizli", - "Horizontal Rule": "Yatay kural", + "Hide when": "Koşullu gizleme", + "Honeypot": "Honeypot", + "Horizontal Rule": "Yatay Kural", "Host": "Ev sahibi", + "HTML": "HTML", "HTML view": "HTML Görünümü", + "HTTP Status": "HTTP Durumu", "I remember my password": "Şifremi hatırlıyorum", + "Icon": "Simge", + "ID": "ID", "ID regenerated and Stache cleared": "ID yeniden oluşturuldu ve Stache temizlendi", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\" düğmesine tıklamakta sorun yaşıyorsanız, aşağıdaki URL'yi kopyalayıp\nweb tarayıcınıza yapıştırın:", + "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\" düğmesine tıklamakta sorun yaşıyorsanız, aşağıdaki URL'yi kopyalayıp\nweb tarayıcınıza yapıştırın:", "Image": "Görsel", + "Image (File)": "Görsel olsun (Dosya)", "Image Cache": "Görsel Önbelleği", "Image cache cleared.": "Görüntü önbelleği temizlendi.", + "Image Manipulation": "Görsel Manipülasyonu", + "Impersonating": "Kimlik Değiştirme Yapma", "Imported from fieldset": "Alan setinden içe aktarıldı", + "In": "Verilen değerlerden biri olsun", + "In Array": "Diğer alan değerleri arasında olmalıdır.", "Included in output": "Çıktıya dahil", "Indent Size": "Girinti Boyutu", "Indent Type": "Girinti Türü", "Index": "İndeks", - "Index Template": "Dizin şablonu", + "Index Template": "Dizin Şablonu", + "Indian": "Hindu Takvimi", "Inline": "Çizgide", - "Inline Code": "Satır içi kodu", - "Inline Label": "Satır içi etiket", + "Inline Code": "Satır İçi Kodu", + "Inline Label": "Satır İçi Etiket", + "Inline Label when True": "Doğru Olduğunda Satır İçi Etiket", + "Input Behavior": "Girdi Davranışı", "Input Label": "Giriş Etiketi", - "Input Type": "Giriş tipi", + "Input Type": "Giriş Tipi", "Insert Asset": "Varlık Ekle", - "Insert Image": "Resim ekle", + "Insert Image": "Resim Ekle", "Insert Link": "Bağlantı Ekle", "Install": "Kur", - "Installation complete!": "Kurulum tamamlandı!", "Installed": "Kurulmuş", - "Installing :package": "Paket :package kuruluyor", - "Installing :package version :version": "Paket :package :version kuruluyor", "Instructions": "Talimatlar", "Instructions Position": "Talimatlar Pozisyonu", - "Invalid content": "Geçersiz İçerik", + "Integer": "Tamsayi", + "Intelligently Warm Presets": "Akıllıca Isınan Önayarlar", + "Invalid content, :type button/extension is not enabled": "Geçersiz içerik, :type düğmesi/uzantısı etkinleştirilmemiş", + "Invalid content, nodes and marks must have a type": "Geçersiz içerik, düğümlerin ve işaretlerin bir türü olmalıdır", "Invalid credentials.": "Geçersiz kimlik bilgileri.", "Invitation": "Davet", + "IP Address": "IP Adresi", + "IP Address (ipv4)": "IP Adresi (ipv4)", + "IP Address (ipv6)": "IP Adresi (ipv6)", "Is": "Dır-dir", "Isn't": "Değil", "Italic": "İtalik", + "Japanese": "Japon Takvimi", + "Java": "Java", + "JavaScript": "JavaScript", + "JSON": "JSON", + "JSX": "JSX", + "KB": "KB", "Key": "Anahtar", - "Key Mappings": "Anahtar eşlemeler", - "Keyboard Shortcuts": "Klavye kısayolları", + "Key Mappings": "Anahtar Eşlemeler", + "Keyboard Shortcuts": "Klavye Kısayolları", "Keyed": "Anahtarlı", "Keys": "Anahtarlar", "Label": "Etiket", - "Laptop": "Dizüstü bilgisayar", - "Last Install Log": "Son Yükleme Günlüğü", - "Last Login": "Son giriş", - "Last Modified": "Son düzenleme", - "Last Name": "Soyisim", - "Last rebuild": "Son yeniden inşa", - "Latest Date": "Son tarih", + "Lang": "Dil", + "Language": "Dil", + "Laptop": "Dizüstü Bilgisayar", + "Last Login": "Son Giriş", + "Last Modified": "Son Düzenleme", + "Last rebuild": "Son yaratma", + "Latest Date": "Son Tarih", "Layout": "Düzen", "Learn more": "Daha fazla bilgi edin", "Learn more about :link": ":link hakkında daha fazla öğren", + "LESS": "LESS", + "Less than": "az", + "Less Than": "Bundan az olmalı", + "Less Than Or Equal": "Küçük veya Eşit", + "Less than or equals": "Küçük veya eşittir", "Licensing": "Lisanslama", "Light": "Aydınlık", "Light Mode": "Aydınlık Modu", @@ -516,62 +626,76 @@ "Link a single field": "Tek bir alanı bağlayın", "Link Collections": "Koleksiyonları Bağla", "Link Existing": "Varolanı Bağla", - "Link Existing Item": "Mevcut öğeyi bağla", + "Link Existing Item": "Mevcut Öğeyi Bağla", "Link Fields": "Alanları Bağla", - "Link Noopener": "noopener bağla", - "Link Noreferrer": "noreferrer bağla", - "Link to Entry": "Girdiye bağla", + "Link Noopener": "Noopener Bağla", + "Link Noreferrer": "Noreferrer Bağla", + "Link to Entry": "Izgaraye Bağla", "Link to URL": "URL'ye bağla", "Linked fieldset": "Bağlantılı alan seti", "Links": "Bağlar", "List": "Liste", "Listable": "Listelenebilir", - "Live Preview": "Canlı önizleme", + "Live Preview": "Canlı Önizleme", + "Loading": "Yükleniyor", + "Locale": "Yerel Ayar", "Localizable": "Yerelleştirilebilir", "Localizable field": "Yerelleştirilebilir alan", "Localizations": "Yerelleştirme", - "Lock Opacity": "Opaklığı kilitle", + "Location": "Konum", "Locked": "Kilitli", - "Log in": "Giriş yap", + "Log in": "Giriş Yap", "Log in to continue": "Devam etmek için oturum açın", "Log in with :provider": ":provider ile giriş yap", - "Log in with email": "E-postayla giriş yap", + "Log in with email": "E-Postayla giriş yap", "Log out": "Çıkış Yap", "Logged in": "Giriş yapıldı", "Login successful.": "Giriş başarılı.", "Main": "Ana", "Manage Licenses": "Lisansları Yönetin", - "Manual upgrade required": "Manuel yükseltme gerekli", - "Map to Blueprint": "Plana eşleme", + "Manage Preferences": "Tercihleri Yönet", + "Manage Sets": "Setleri Yönet", + "Map to Blueprint": "Plana Eşleme", "Markdown": "İşaret", "Markdown Cheatsheet": "Markdown Cheatsheet", - "Markdown paths": "Markdown Yolları", + "Markdown paths": "Markdown yolları", "Markdown theme": "Markdown teması", "Max": "Maksimum", - "Max Depth": "Maksimum derinlik", - "Max Files": "Maksimum dosyalar", + "Max Depth": "Maksimum Derinlik", + "Max Files": "Maksimum Dosyalar", + "Max Filesize (KB)": "Maksimum Dosya Boyutu (KB)", "Max Items": "Maksimum Öğeler", "Max Rows": "Max Sıra", - "Max Sets": "Maksimum set", + "Max Sets": "Maksimum Set", "Maximum items selected:": "Seçilen maksimum öğe:", - "Maximum Rows": "Maksimum satır", + "Maximum Rows": "Maksimum Satır", + "MB": "MB", "Media": "Medya", "Merge Cells": "Hücreleri Birleştir", + "MIME Type By File Extension": "Dosya Uzantısına Göre MIME Türü", + "MIME Types": "MIME Türleri", "Min": "Min", + "Min Files": "Minimum Dosyalar", + "Min Filesize (KB)": "Minimum Dosya Boyutu (KB)", "Min Rows": "Min Sıra", - "Mini": "Mini", - "Minimum Rows": "Minimum satır", + "Minimum Rows": "Minimum Satır", "Miscellaneous": "Çeşitli", "Mobile": "Mobil", - "Mode": "Mod", "Modified": "Değiştirilmiş", - "Mount": "Monte etmek", + "Modified Item": "Değiştirilen Öğe", + "Mount": "Tanıtmak", "Move": "Hareket", - "Move Asset|Move :count Assets": "Varlık Taşı|:count varlık taşı", - "Move Folder|Move :count Folders": "Klasörü taşı|:count klasör taşı", + "Move Asset|Move :count Assets": "Varlık Taşı|:count Varlık Taşı", + "Move Folder|Move :count Folders": "Klasörü Taşı|:count Klasör Taşı", + "Moved Item": "Taşınan Öğe", + "ms": "ms", + "Multi-Site": "Çoklu Site", "Multiple": "Çoklu", + "My Fieldsets": "Alan Setlerim", + "My Nav": "Menüm", + "My Preferences": "Tercihlerim", "Name": "İsim", - "Nav Item": "Nav öğesi", + "Nav Item": "Nav Öğesi", "Navigation": "Navigasyon", "Navigation deleted": "Navigasyon silindi", "Navigation saved": "Navigasyon kaydedildi", @@ -580,8 +704,11 @@ "Never": "Asla", "New Asset": "Yeni Varlık", "New Section": "Yeni Kısım", - "New Set": "Yeni set", + "New Set": "Yeni Set", + "New Set Group": "Yeni Set Grubu", + "New Tab": "Yeni Sekme", "Next": "Sonraki", + "Nginx": "Nginx", "No": "Numara", "No addons installed": "Yüklü eklentiler yok", "No available filters": "Mevcut filtre yok", @@ -590,75 +717,110 @@ "No link data found for": "Bağlantı verisi bunun için bulunamadı", "No options to choose from.": "Aralarından seçim yapabileceğiniz seçenek yok.", "No results": "Sonuç yok", - "No revisions": "Revizyon Yok", - "No submissions": "Gönderim Yok", + "No revisions": "Revizyon yok", + "No submissions": "Gönderim yok", + "No templates to choose from.": "Seçilecek şablon yok.", "None": "Hiçbiri", + "not": "değil", + "Not equals": "Eşit değil", "Not Featured": "Öne çıkan değil", + "Not In": "Verilen değerler arasında olmamalıdır", "Not listable": "Listelenemez", + "Not Regular Expression": "Alan değeri verilen düzenli ifadeiyle eşleşmemelidir", "Notes about this revision": "Bu revizyonla ilgili notlar", + "Nullable": "Boş Olabilir", "Number": "Sayı", + "Numeric": "Sayısal", + "Objective-C": "Objective-C", "OK": "TAMAM", "Only the references will be removed. Entries will not be deleted.": "Yalnızca referanslar kaldırılacaktır. Girdiler silinmeyecektir.", - "Open Dropdown": "Aşağı düşey aç", + "Open Dropdown": "Açılırlisteyi Aç", "Open in a new window": "Yeni bir pencerede aç", "Open in new window": "Yeni pencerede aç", - "Operation complete": "İşlem tamamlandı", + "Option": "Seçenek", "Optional": "İsteğe bağlı", "Options": "Seçenekler", "or": "veya", "or drag & drop here to replace.": "veya değiştirmek için buraya sürükleyin ve bırakın.", - "or drag & drop here.": "Veya buraya sürükleyin ve bırakın.", + "or drag & drop here.": "veya buraya sürükleyin ve bırakın.", "Orderable": "Düzenlenebilir", "Ordered List": "Sıralı Liste", "Ordering": "Sipariş", "Origin": "Kaynak", + "Origin Behavior": "Köken Davranışı", + "Statamic": "Statamik", + "Statamic Pro is required.": "Statamik Pro gereklidir.", "Other": "Diğer", - "Pages": "Sayfa", + "Override Alt": "Alternatifi Geçersiz Kıl", + "Override For Role": "Rol İçin Geçersiz Kıl", + "Override For User": "Kullanıcı İçin Geçersiz Kıl", + "Page": "Sayfa", + "Page Not Found": "Sayfa Bulunamadı", + "Pages": "Sayfalar", + "Parent": "Üst", "Parser": "Ayrıştırıcı", - "Password changed": "şifre değişti", - "Password Confirmation": "Şifre onayı", + "Password": "Parola", + "Password changed": "Şifre değişti", + "Password Confirmation": "Şifre Onayı", "Password for :username": ":username Şifresi", "Past Date Behavior": "Geçmiş Tarih Davranışı", - "Per Page": "Sayfa başına", - "Per-site": "Site başına", + "Per Page": "Sayfa Başına", + "Per-site": "Site Başına", "Permissions": "İzin", + "Persian": "Celali Takvimi", + "Phone": "Telefon", + "PHP": "PHP", "PHP Info": "PHP Bilgisi", + "PHP Version": "PHP Sürümü", + "Pick Color": "Renk Seç", "Pin to Favorites": "Favorilere Pinle", - "Placeholder": "Yer tutucu", - "Pop in": "İçeri gir", - "Pop out": "İçinden çıkar", + "Pin to Top Level": "Üst Düzeye Pinle", + "Pinned Item": "Sabitlenen Öğe", + "Placeholder": "Yer Tutucu", + "Pop in": "İçeri Gir", + "Pop out": "İçinden Çıkar", "Port": "Port", + "Preferences": "Tercihler", "Prefix": "Önek", - "Prepend": "Önüne ekle", + "Prepend": "Önüne Ekle", + "Present": "Mevcut", "Preview": "Önizleme", "Preview Targets": "Önizleme Hedefleri", "Previous": "Önceki", "Price": "Fiyat", - "Pro Tip": "Profesyonel ipucu", + "Pro": "Pro", + "PRO": "PRO", + "Pro Tip": "Profesyonel İpucu", + "Process Source Images": "Kaynak Görselleri İşle", "Profile": "Profil", "Propagate": "Yay", - "Protected Page": "Korumalı sayfa", + "Protected Page": "Korumalı Sayfa", "Publish": "Yayınla", - "Publish by Default": "Varsayılan olarak yayınla", - "Publish Date": "Yayın tarihi", + "Publish by Default": "Varsayılan Olarak Yayınla", + "Publish Date": "Yayın Tarihi", "Publish Entry|Publish :count Entries": "Girdiyi Yayınla|:count Girdiyi Yayınla", - "Publish Now": "Şimdi yayınla", + "Publish Now": "Şimdi Yayınla", "Published": "Yayınlanmış", - "Push Tags": "Push etiketleri", - "Quick Save": "Hızlı kaydet", - "Range": "Menzil", - "Read Only": "Salt okunur", - "Read the Docs": "Dokümanları oku", - "Read the Documentation": "Belgeleri oku", + "Push Tags": "Push Etiketleri", + "Python": "Python", + "Query Scopes": "Sorgu Kapsamları", + "Quick Save": "Hızlı Kaydet", + "Radio Options": "Radyo Seçenekleri", + "Range": "Seri", + "Read Only": "Salt Okunur", + "Read the Docs": "Dokümanları Oku", + "Read the Documentation": "Belgeleri Oku", "Reading Time": "Okuma Süresi", - "Rebuild Search": "Aramayı yeniden oluştur", - "Recipient": "Alıcı", + "Rebuild Search": "Aramayı Yeniden Oluştur", + "Recipient(s)": "Alıcı(lar)", "Records": "Kayıtlar", "Redirect": "Yönlendir", "Refresh": "Yenile", "Regards": "Saygılarımızla", - "Regenerate": "Yeniden oluştur", + "Regenerate": "Yeniden Oluştur", + "Regenerate from: :field": ":field dan yeniden oluştur", "Registration successful.": "Kayıt başarılı.", + "Regular Expression": "Düzenli İfade", "Relationship": "İlişki", "Released on :date": ":date tarihinde yayınlandı", "Remember me": "Beni hatırla", @@ -666,37 +828,49 @@ "Remove all empty nodes": "Tüm boş düğümleri kaldırın", "Remove Asset": "Varlığı Kaldır", "Remove child page|Remove :count child pages": "Alt Sayfasını Kaldır|:count alt sayfayı kaldır", - "Remove Empty Nodes": "Boş düğümleri kaldır", + "Remove Empty Nodes": "Boş Düğümleri Kaldır", "Remove empty nodes at the start and end": "Başlangıç ve sondaki boş düğümleri kaldırın", - "Remove Formatting": "Biçimlendirmeyi kaldır", - "Remove Link": "Bağlantıyı kaldır", + "Remove Filter": "Filtreyi Kaldır", + "Remove Formatting": "Biçimlendirmeyi Kaldır", + "Remove Link": "Bağlantıyı Kaldır", "Remove Page": "Sayfayı Kaldır", "Remove tag": "Etiketi kaldır", - "Rename": "Yeniden adlandır", + "Rename": "Yeniden Adlandır", "Rename Asset|Rename :count Assets": "Varlığı yeniden adlandır|:count varlığı yeniden adlandır", "Rename Folder|Rename :count Folders": "Klasörü yeniden adlandır|:count klasörü yeniden adlandır", - "Reorder": "Yeniden sırala", - "Reorderable": "Yeniden düzenlenebilir", + "Rename View": "Görünümü Yeniden Adlandır", + "Renamed Section": "Yeniden Adlandırılmış Bölüm", + "Reorder": "Yeniden Sırala", + "Reorderable": "Yeniden Düzenlenebilir", "Replace": "Değiştir", "Replace Asset": "Varlığı Değiştir", "Reply To": "Yanıtla", "Repository path": "Depo yolu", - "Require Slugs": "Kalıcı bağlantı gerektirir", + "Republic of China": "Çin Cumhuriyeti Takvimi", + "Require Slugs": "Sluglar Gerektir", "Required": "Gerekli", + "Required If": "Verilen değer başka bir alanda mevcutsa bu alan gereklidir", + "Required Unless": "Diğer alan verilen değere sahipse bu alan gerekli değildir", + "Required With": "Başka bir alan herhangi bir değer ile gönderilirse, bu alan gereklidir", + "Required With All": "Bu alan, diğer tüm alanlar gönderildiyse gereklidir", + "Required Without": "Başka bir alan değere sahip değilse, bu alan gereklidir", + "Required Without All": "Bu alan, diğer tüm alanlar boşsa gereklidir", "Reset": "Sıfırla", - "Reset Password": "Şifreyi yenile", + "Reset Nav Customizations": "Menü Özelleştirmelerini Sıfırla", + "Reset Password": "Şifreyi Yenile", "Responsive": "Duyarlı", - "Restore": "Eski haline getir", + "Restore": "Eski Haline Getir", "Restore Revision": "Revizyonu Geri Yükle", "Restrict": "Kısıtla", + "Restrict to Folder": "Klasörle Sınırla", "Resume Your Session": "Oturumunuza Devam Edin", - "Reupload": "Yeniden yükle", + "Reupload": "Yeniden Yükle", "Reveal Password": "Şifreyi Göster", "Revision created": "Revizyon oluşturuldu", "Revision deleted": "Revizyon silindi", "Revision History": "Revizyon Geçmişi", "Revision restored": "Revizyon restore edildi", - "Revision saved": "Revizyon Kaydedildi", + "Revision saved": "Revizyon kaydedildi", "Revisions": "Revizyonlar", "Role": "Rol", "Role created": "Rol eklendi", @@ -707,120 +881,154 @@ "Roles & Groups": "Roller ve Gruplar", "Roles & Permissions": "Roller ve İzinler", "Root": "Kök", - "Route": "Rota", + "Route": "Yol", "Routing & URLs": "Yönlendirme ve URL'ler", "Rows": "Satır", + "Ruby": "Ruby", + "Rulers": "Cetveller", "Rules": "Kurallar", "Run action|Run action on :count items": "Eylemi çalıştır|Eylemi :count öğe üzerinde çalıştır", + "s": "s", + "Same": "Bu alanın değeri, belirtilen alanın değeri ile eşit olmalıdır", "Save": "Kaydet", "Save & Publish": "Kaydet ve Yayınla", "Save & Unpublish": "Kaydet ve Yayınlama", - "Save as HTML": "HTML olarak kaydedin", + "Save as HTML": "HTML Olarak Kaydedin", "Save Changes": "Değişiklikleri Kaydet", "Save Draft": "Taslak Kaydet", "Save Order": "Sırayı Kaydet", + "Save to": "Şu konuma kaydet", "Saved": "Kaydedildi", "Saving": "Kaydediliyor", - "Scaffold Collection": "Scaffold koleksiyonu", + "Scaffold Collection": "Scaffold Koleksiyonu", "Scaffold Views": "Scaffold Görünümleri", "Scheduled": "Planlanmış", + "SCSS": "SCSS", "Search": "Ara", - "Search Indexes": "Arama dizinleri", + "Search Index": "Arama Dizin", + "Search Indexes": "Arama Dizinleri", + "Search Sets": "Setleri Ara", "Search...": "Ara...", "Searchable": "Aranabilir", "Searchables": "Aranabilirler", + "Searching in:": "Aranıyor:", "Select": "Seç", - "Select asset container": "Varlık Konteyneri'ni seçin", - "Select Dropdown": "Dropdown seçici", - "Select field": "Alanı seçin", + "Select Across Sites": "Siteler Arasında Seç", + "Select asset container": "Varlık konteyneri'ni seçin", + "Select Calendar": "Takvim Seç", + "Select Collection(s)": "Koleksiyon(ları) Seç", + "Select Dropdown": "Açılırliste Seçici", "Select Group": "Grup Seç", - "Select Operator": "Operatörü seçin", - "Select Role": "Rol Seçin", - "Select Value": "Değeri seç", - "Selectable Mode": "Seçilebilir mod", + "Select Operator": "Operatörü Seç", + "Select Role": "Rol Seç", + "Select Value": "Değeri Seç", + "Selectable Mode": "Seçilebilir Mod", + "Selection": "Seçim", "Seller": "Satıcı", - "Send Email Invitation": "E-posta Davetiyesi Gönder", + "Send Email Invitation": "E-Posta Davetiyesi Gönder", "Send Password Reset": "Şifre Sıfırlama Gönder", "Send password reset email to this user?|Send password reset email to these :count users?": "Bu kullanıcıya şifre sıfırlama e-postası gönderilsin mi?|:count kullanıcıya şifre sıfırlama e-postası gönderilsin mi?", - "Send Test Email": "Test e-postası gönder", - "Sender": "Gönderici", - "Sendmail": "Posta gönder", + "Send Test Email": "Test E-Postası Gönder", "Send|Send to :count users": "Gönder|:count kullanıcıya gönder", - "Service Unavailable": "Hizmet kullanılamıyor", - "Session Expired": "Oturum süresi doldu", - "Set Alt": "Alt'ı ayarla", + "Sender": "Gönderici", + "Sendmail": "Sendmail", + "Service Unavailable": "Hizmet Kullanılamıyor", + "Session Expired": "Oturum Süresi Doldu", + "Set Alt": "Alt'ı Ayarla", "Set as start page": "Başlangıç sayfası olarak ayarlayın", - "Set Focal Point": "Odak noktasını ayarlayın", + "Set Behavior": "Davranışı Ayarla", + "Set Timezone": "Saat Dilimini Ayarla", + "Set to now": "Şimdi olarak ayarla", "Sets": "Setler", "Settings": "Ayarlar", - "Show Drafts": "Taslakları Göster", - "Show everything where:": "Şuradaki herşeyi göster:", + "Shell": "Shell", + "Show": "Göster", "Show Fields": "Alanları Göster", - "Show Filename": "Dosya adını göster", + "Show Filename": "Dosya Adını Göster", "Show HTML Source": "HTML Kaynağını Göster", - "Show Keyboard Shortcuts": "Klavye kısayollarını göster", - "Show Line Numbers": "Satır numaralarını göster", - "Show Markdown Cheatsheet": "Markdown Cheatsheet'i göster", + "Show Keyboard Shortcuts": "Klavye Kısayollarını Göster", + "Show Line Numbers": "Satır Numaralarını Göster", + "Show Markdown Cheatsheet": "Markdown Cheatsheet'i Göster", "Show Reading Time": "Okuma Süresini Göster", - "Show Seconds": "Saniye göster", - "Show Template": "Şablonu göster", + "Show Regenerate Button": "Yeniden Oluştur Butonunu Göster", + "Show Seconds": "Saniye Göster", + "Show Set Alt": "Set Alternatifini Göster", + "Show Template": "Şablonu Göster", "Show when": "Şu zamanı göster", + "Show Word Count": "Kelime Sayısını Göster", "Shown by default": "Varsayılan olarak gösterilir", + "Sidebar": "Kenar Çubuğu", "Single": "Tek", "Site": "Alan", + "Site deleted": "Site silindi", + "Site saved": "Site kaydedildi", "Site selected.": "Site seçildi.", "Sites": "Siteler", "Size": "Boyut", - "Slug": "Kalıcı bağlantı", - "Slugs": "Kalıcı bağlantı", + "Slug": "Slug", + "Slugs": "Sluglar", "Small": "Küçük", + "Smart Typography": "Akıllı Tipografi", "Smartypants": "Çok bilmiş", "Something went wrong": "Bir şeyler yanlış gitti", + "Sometimes": "Bu alan yalnızca gönderilen veriler arasında bulunuyorsa doğrulanır.", "Sort Direction": "Sıralama Yönü", + "Sortable": "Sıralanabilir", "Spaces": "Boşluk", "Special": "Özel", + "SQL": "SQL", "Stache cleared.": "Stache temizlendi.", "Stache warmed.": "Stache ısındı.", "Stack Selector": "Stack Seçici", "Stacked": "Yığılmış", - "Statamic Pro is required.": "Statamic Pro gereklidir.", + "Start Impersonating": "Kimlik Taklidi Yapmaya Başla", + "Start Page": "Başlangıç Sayfası", + "Starts With": "Alan değeri verilen değerlerden biri ile başlamalıdır", "Static Page Cache": "Statik Sayfa Önbelleği", "Static page cache cleared.": "Statik sayfa önbelleği temizlendi.", "Status": "Durum", "Step": "Adım", + "Stop impersonating": "Kimlik taklidini durdur", + "Stop Impersonating": "Kimlik Taklidini Durdur", "Store Submissions": "Mağaza Gönderimleri", "Strategy": "Strateji", "Strikethrough": "Sert", + "String": "Bir dize harflerden oluşmalıdır", "Structured": "Yapılandırılmış", "Subject": "Konu", + "Sublime": "Sublime", "Submission deleted": "Gönderi silindi", "Submission saved": "Gönderi kaydedildi", "Submission successful.": "Gönderim başarılı.", "Submissions": "Gönderimler", "Submit": "Gönder", - "Subscript": "Alt simge", - "Super Admin": "Süper yönetici", - "Super User": "Süper kullanıcı", - "Superscript": "Üst simge", + "Subscript": "Alttaki", + "Super Admin": "Süper Yönetici", + "Super User": "Süper Kullanıcı", + "Superscript": "Üsttakı", "Support": "Destek", "Swatches": "Numuneler", - "Sync": "Senkronize et", + "Sync": "Senkronize Et", + "System": "Sistem", "System default": "Sistem varsayılanı", - "Tab Sections": "Sekme bölümleri", "Table": "Tablo", + "Table of Contents": "İçindekiler Tablosu", "Tablet": "Tablet", "Tabs": "Sekme", - "Target Blank": "Hedef boş", - "Taxonomies": "Taksonomi", + "Tabular Islamic": "Planlı Hicrî Takvimi", + "Target Blank": "Hedef Boş", + "Taxonomies": "Taksonomiler", "Taxonomy": "Taksonomi", "Taxonomy created": "Taksonomi eklendi", "Taxonomy deleted": "Taksonomi silindi", "Taxonomy saved": "Taksonomi kaydedildi", "Template": "Şablon", + "Templates": "Şablonlar", "Term created": "Terim eklendi", "Term deleted": "Terim silindi", "Term references updated": "Terim referansları güncellendi", "Term saved": "Terim kaydedildi", + "Term Template": "Terim Şablonu", "Terms": "Şartlar", "Test email sent.": "Test e-postası gönderildi.", "Text": "Metin", @@ -830,7 +1038,7 @@ "The given data was invalid.": "Verilen veriler geçersizdi.", "The Statamic Playground": "Statamik Oyun Alanı", "Theme": "Tema", - "There are no entries in this site": "Bu sitede girdi yok", + "There are no entries in this collection": "Bu koleksiyonda girdi yok", "These are now your default columns.": "Bunlar artık varsayılan sütunlarınızdır.", "This action is unauthorized.": "Bu eylem yetkisizdir.", "This container is empty": "Bu kap boş", @@ -839,53 +1047,61 @@ "This is now your start page.": "Bu şimdi başlangıç sayfanız.", "This is the published version": "Bu yayınlanmış sürüm", "This is the root page": "Bu kök sayfası", - "This user already exists.": "Bu kullanıcı zaten mevcut.", "Time Enabled": "Zaman Etkinleştirildi", + "Timepicker": "Saat seçici", + "Timezone": "Saat Dilimi", "Title": "Başlık", "Title Format": "Başlık Biçimi", "Today": "Bugün", - "Toggle": "Geçiş yap", - "Toggle Button": "Geçiş düğmesi", - "Toggle Dark Mode": "Karanlık Modu geçiş", - "Toggle Fullscreen Mode": "Tam ekran moduna geç", - "Toggle Header Cell": "Başlık hücresini değiştirin", - "Toggle Mobile Nav": "Mobile NAV'ı değiştirin", - "Toggle Nav": "Nav'a geçiş", - "Toggle Sidebar": "Kenar çubuğu", + "Toggle": "Geçiş Yap", + "Toggle Button": "Geçiş Düğmesi", + "Toggle Dark Mode": "Karanlık Modu Geçiş", + "Toggle Fullscreen": "Tam Ekran Modu Geçiş", + "Toggle Fullscreen Mode": "Tam Ekran Moduna Geç", + "Toggle Header Cell": "Başlık Hücresini Değiştirin", + "Toggle Mobile Nav": "Mobile Nav'ı Değiştirin", + "Toggle Nav": "Nav'a Geçiş", + "Toggle Sidebar": "Kenar Çubuğu", "Toolbar Mode": "Araç Çubuğu Modu", "Tools": "Araçlar", "Tree": "Ağaç", - "Trial Mode": "Deneme modu", - "TRUE": "DOĞRU", + "Trial Mode": "Deneme Modu", + "True": "Doğru", "Try again": "Tekrar deneyin", - "Type": "Tip", + "Twig": "Twig", "Typeahead Field": "Typehead Alanı", + "UI Mode": "UI Modu", + "Umm al-Qura": "Ümmü'l-Kura Takvimi", "Unable to change password": "Şifre değiştirilemiyor", "Unable to delete filter preset": "Filtre ön ayarı silinemiyor", + "Unable to delete view": "Görünüm silinemiyor", + "Unable to rename view": "Görünüm yeniden adlandırılamıyor", "Unable to save changes": "Değişiklikleri kaydedemiyor", "Unable to save column preferences.": "Sütun tercihlerini kaydedilemiyor.", "Unable to save favorite": "Favori kaydedilemiyor", "Unable to save filter preset": "Filtre ön ayarı kaydedilemiyor", "Unable to save role": "Rol kaydedilemiyor", - "Unable to save user group": "Kullanıcı grubunu kaydedilemiyor", + "Unable to save view": "Görünüm kaydedilemiyor", "Unable to update filter preset": "Filtre ön ayarı güncellenemiyor", "Unauthorized": "Yetkisiz", - "Uncheck All": "Tümünün işaretini kaldır", - "Underline": "Altını çiz", + "Uncheck All": "Tümünün İşaretini Kaldır", + "Underline": "Altını Çiz", "Uninstall": "Kaldır", - "Uninstalling :package": ":package paketi kaldırılıyor", - "Unlink": "Bağlantıyı kaldır", + "Unique Entry Value": "Benzersiz Giriş Değeri", + "Unique Form Handle": "Benzersiz Form Tutamaçı", + "Unique Term Value": "Benzersiz Terim Değeri", + "Unique User Value": "Benzersiz Kullanıcı Değeri", + "Unlink": "Bağlantıyı Kaldır", "Unlisted Addons": "Listelenmeyen Eklentiler", - "Unordered List": "Sırasız liste", - "Unpin from Favorites": "Favorilerden çıkar", + "Unordered List": "Sırasız Liste", + "Unpin from Favorites": "Favorilerden Çıkar", "Unpublish": "Yayınlama", "Unpublish Entry|Unpublish :count Entries": "Girişi yayından kaldır|:count girişi yayından kaldır", "Unpublished": "Yayınlanmamış", "Unsaved changes": "Kaydedilmemiş değişiklikler", "Up to date": "Güncel", "Update": "Güncelle", - "Update :name": ":name güncelle", - "Update All": "Hepsini güncelle", + "Update All": "Hepsini Güncelle", "Update successful.": "Güncelleme başarılı.", "Update to :version": ":version sürümüne güncelle", "Update to Latest": "Son sürüme güncelle", @@ -895,48 +1111,59 @@ "Upload failed. The file is larger than is allowed by your server.": "Yükleme başarısız. Dosya sunucunuz tarafından izin verilenden daha büyüktür.", "Upload failed. The file might be larger than is allowed by your server.": "Yükleme başarısız. Dosya sunucunuz tarafından izin verilenden daha büyük olabilir.", "Upload file": "Dosya yükle", + "Url": "Url", "URL": "Url", "Useful Links": "Faydalı Bağlantılar", "User": "Kullanıcı", "User created": "Kullanıcı oluşturuldu", "User deleted": "Kullanıcı silindi", - "User group created": "Kullanıcı grubu eklendi", + "User Group": "Kullanıcı Grubu", "User group deleted": "Kullanıcı grubu silindi", "User group saved": "Kullanıcı grubu kaydedildi", - "User group updated": "Kullanıcı grubu güncellendi", "User Groups": "Kullanıcı Grupları", - "User Information": "Kullanıcı bilgisi", + "User Information": "Kullanıcı Bilgisi", "User saved": "Kullanıcı kaydedildi", - "Username": "Kullanıcı adı", + "Username": "Kullanıcı Adı", "Users": "Kullanıcılar", "Utilities": "Araçlar", + "UUID": "UUID", "Validation": "Doğrulama", + "Validation Rules": "Doğrulama Kuralları", "Value": "Değer", "View": "Görünüm", "View additional releases": "Ek sürümleri görüntüleyin", - "View All": "Hepsini gör", + "View All": "Hepsini Gör", + "View deleted": "Görünüm silindi", "View History": "Tarihi Görüntüle", "View on Marketplace": "Marketplace'de görüntüle", + "View renamed": "Görünüm yeniden adlandırıldı", + "View saved": "Görünüm kaydedildi", "View Site": "Siteyi Görüntüle", "View Useful Links": "Yararlı bağlantıları görüntüleyin", "Views created successfully": "Görünümler başarıyla oluşturuldu", + "Vim": "Vim", "Visibility": "Görünürlük", - "Visible": "Gözle görülür", - "Visit URL": "URL'yi ziyaret edin", + "Visible": "Gözle Görülür", + "Visit URL": "URL'yi Ziyaret Edin", + "Vue": "Vue", "Warm": "Isındır", + "Warm Specific Presets": "Belirli Önayarları Isıt", + "Warning! Changing a site handle may break existing site content!": "Uyarı! Bir site tutamaçini değiştirmek ö sitenin içeriğini bozabilir!", "Whoops!": "Eyvah!", "Widgets": "Widgetlar", - "Width": "Genişlik", "Words": "Kelimeler", - "Working Copy": "Çalışma kopyası", + "Working Copy": "Çalışma Kopyası", "Working copy has unsaved changes": "Çalışma kopyasında kaydedilmemiş değişiklikler var", "Write": "Yaz", - "You are not authorized to configure navs.": "NAV'ları yapılandırma yetkisine sahip değilsiniz.", + "x": "x", + "XML": "XML", + "YAML": "YAML", + "You are not authorized to configure navs.": "Nav'ları yapılandırma yetkisine sahip değilsiniz.", "You are not authorized to create collections.": "Koleksiyon oluşturma yetkisine sahip değilsiniz.", "You are not authorized to create forms.": "Formlar oluşturma yetkisine sahip değilsiniz.", - "You are not authorized to create navs.": "NAV'lar oluşturma yetkisine sahip değilsiniz.", + "You are not authorized to create navs.": "Nav'lar oluşturma yetkisine sahip değilsiniz.", "You are not authorized to create taxonomies.": "Taksonomiler yaratma yetkisine sahip değilsiniz.", - "You are not authorized to delete navs.": "NAV'ları silme yetkisine sahip değilsiniz.", + "You are not authorized to delete navs.": "Nav'ları silme yetkisine sahip değilsiniz.", "You are not authorized to delete this collection.": "Bu koleksiyonu silme yetkisine sahip değilsiniz.", "You are not authorized to delete this taxonomy.": "Bu taksonomiyi silme yetkisine sahip değilsiniz.", "You are not authorized to edit this collection.": "Bu koleksiyonu düzenleme yetkisine sahip değilsiniz.", @@ -944,8 +1171,11 @@ "You are not authorized to run this action.": "Bu eylemi yürütme yetkisine sahip değilsiniz.", "You are not authorized to scaffold resources.": "Scaffold kaynaklarına yetkili değilsiniz.", "You are not authorized to view collections.": "Koleksiyonları görüntüleme yetkisine sahip değilsiniz.", - "You are not authorized to view navs.": "NAV'ları görüntüleme yetkisine sahip değilsiniz.", + "You are not authorized to view navs.": "Nav'ları görüntüleme yetkisine sahip değilsiniz.", "You are not authorized to view this collection.": "Bu koleksiyonu görüntüleme yetkisine sahip değilsiniz.", + "You are now impersonating": "Şu anda kimlik taklidi yapıyorsunuz", + "You can't do this while logged in": "Giriş yapmışken bunu yapamazsınız", + "You're already editing this item.": "Bu öğeyi zaten düzenliyorsunuz.", "Your Favorites": "Favorileriniz", "Your working copy will be replaced by the contents of this revision.": "Çalışma kopyanızın yerini bu revizyonun içeriği alacaktır." } diff --git a/resources/lang/tr/fieldtypes.php b/resources/lang/tr/fieldtypes.php index 4a3c25fc97..a37aaf4ccc 100644 --- a/resources/lang/tr/fieldtypes.php +++ b/resources/lang/tr/fieldtypes.php @@ -1,311 +1,201 @@ [ - 'config' => [ - 'antlers' => 'Bu alanın içeriğinde Antlers ile ayrıştırmayı etkinleştirin.', - 'cast_booleans' => 'true ve false değerlerine sahip seçenekler boolean olarak kaydedilecektir.', - ], - ], - 'array' => [ - 'config' => [ - 'keys' => 'Dizi anahtarlarını (değişkenler) ve isteğe bağlı etiketleri ayarlayın.', - 'mode' => 'Dinamik mod, kullanıcıya verilerin kontrolünü sağlarken, anahtarlı mod vermez.', - ], - 'title' => 'Dizi', - ], - 'assets' => [ - 'config' => [ - 'allow_uploads' => 'Yeni dosya yüklemelerine izin ver.', - 'container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', - 'folder' => 'Gezinmeye başlamak için klasör.', - 'max_files' => 'Maksimum seçilebilir varlık sayısı.', - 'mode' => 'Tercih ettiğiniz düzen stilini seçin.', - 'restrict' => 'Kullanıcıların diğer klasörlere gitmesini engelleyin.', - 'show_filename' => 'Önizleme görüntüsünün yanında dosya adını gösterin.', - ], - 'title' => 'Varlıklar', - ], - 'bard' => [ - 'config' => [ - 'allow_source' => 'Yazarken HTML kaynak kodunu görüntülemeyi etkinleştirin.', - 'always_show_set_button' => 'Her zaman "Set Ekle" düğmesini göstermek için etkinleştirin.', - 'buttons' => 'Araç çubuğunda hangi düğmelerin gösterileceğini seçin.', - 'container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', - 'enable_input_rules' => 'İçerik yazarken Markdown tarzı kısayolları etkinleştirir.', - 'enable_paste_rules' => 'İçeriği yapıştırırken Markdown tarzı kısayolları etkinleştirir.', - 'fullscreen' => 'Tam ekran moduna geçmek için etkinleştirin', - 'link_collections' => 'Bu koleksiyonlardan girişler bağlantı seçicide mevcut olacaktır. Bunu boş bırakmak tüm girişleri kullanılabilir hale getirecektir.', - 'link_noopener' => 'Tüm bağlantılarda `rel="noopener"` ayarlayın.', - 'link_noreferrer' => 'Tüm bağlantılarda `rel="noreferrer"` ayarlayın.', - 'previews' => 'Kümeler daraltıldığında gösterilir.', - 'reading_time' => 'Alanın altında tahmini okuma süresini gösterin.', - 'remove_empty_nodes' => 'Boş düğümlerle nasıl başa çıkacağınızı seçin.', - 'save_html' => 'Yapılandırılmış veriler yerine HTML\'yi kaydedin. Bu, şablon işaretlemenizin kontrolünü basitleştirir ancak sınırlandırır.', - 'sets' => 'Kümeler, Bard içeriğinizin herhangi bir yerine eklenebilen yapılandırılabilir alan bloklarıdır.', - 'target_blank' => 'Tüm bağlantılarda `target="_blank"` ayarlayın.', - 'toolbar_mode' => 'Tercih ettiğiniz araç çubuğu stilini seçin.', - ], - 'title' => 'Bard', - ], - 'button_group' => [ - 'title' => 'Buton Grubu', - ], - 'checkboxes' => [ - 'config' => [ - 'inline' => 'Onay kutularını arka arkaya göster.', - 'options' => 'Dizi tuşlarını ve isteğe bağlı etiketlerini ayarlayın.', - ], - 'title' => 'Onay kutuları', - ], - 'code' => [ - 'config' => [ - 'indent_size' => 'Tercih ettiğiniz girinti boyutunu ayarlayın (boşluklarda).', - 'indent_type' => 'Tercih ettiğiniz girinti türünü ayarlayın.', - 'key_map' => 'Tercih edilen klavye kısayolları kümesini seçin.', - 'mode' => 'Sözdizimi vurgulaması için dili seçin.', - 'mode_selectable' => 'Modun kullanıcı tarafından değiştirilip değiştirilemeyeceği.', - 'theme' => 'Tercih ettiğiniz temayı seçin.', - ], - 'title' => 'Kod', - ], - 'collections' => [ - 'title' => 'Koleksiyon', - ], - 'color' => [ - 'config' => [ - 'color_modes' => 'Aralarından seçim yapmak istediğiniz renk modlarını seçin.', - 'default_color_mode' => 'Önceden seçilmiş renk modunu ayarlayın.', - 'lock_opacity' => 'Opaklığın ayarlanmasını önleyerek alfa kaydırıcısını devre dışı bırakır.', - 'swatches' => 'Listeden seçilebilecek renkleri önceden tanımlayın.', - 'theme' => 'Klasik ve mini (daha basit) renk seçici arasında seçim yapın.', - ], - 'title' => 'Renk', - ], - 'date' => [ - 'config' => [ - 'columns' => 'Birden çok ay\'ı aynı anda satırlar ve sütunlar halinde göster', - 'earliest_date' => 'En erken seçilebilir tarihi ayarlayın.', - 'format' => '[PHP tarih formatı](https://www.php.net/manual/en/datetime.format.php) kullanılarak tarihin nasıl saklanması gerektiği.', - 'full_width' => 'Tam genişliği kullanmak için takvimi uzatın.', - 'inline' => 'Açılır giriş alanını atlayın ve takvimi doğrudan gösterin.', - 'latest_date' => 'En son seçilebilir tarihi ayarlayın.', - 'mode' => 'Tek veya aralık modu arasında seçim yapın (aralık, zaman seçiciyi devre dışı bırakır).', - 'rows' => 'Birden çok ayı aynı anda satırlar ve sütunlar halinde göster', - 'time_enabled' => 'Zaman seçiciyi etkinleştirin.', - 'time_seconds_enabled' => 'Zaman seçicide saniyeleri göster.', - ], - 'title' => 'Tarih', - ], - 'entries' => [ - 'config' => [ - 'create' => 'Yeni girdilerin oluşturulmasına izin verin.', - ], - 'title' => 'Girdiler', - ], - 'float' => [ - 'title' => 'Float', - ], - 'form' => [ - 'config' => [ - 'max_items' => 'Maksimum seçilebilir form sayısı.', - ], - 'title' => 'Form', - ], - 'grid' => [ - 'config' => [ - 'add_row' => '"Satır Ekle" düğmesinin etiketini ayarlayın.', - 'fields' => 'Her alan, ızgara tablosunda bir sütun haline gelir.', - 'max_rows' => 'Maksimum sayıda oluşturulabilir satır belirleyin.', - 'min_rows' => 'Minimum sayıda oluşturulabilir satır belirleyin.', - 'mode' => 'Tercih ettiğiniz düzen stilini seçin.', - 'reorderable' => 'Satırın yeniden sıralanmasına izin vermek için etkinleştirin.', - ], - 'title' => 'Izgara', - ], - 'hidden' => [ - 'title' => 'Gizli', - ], - 'html' => [ - 'title' => 'HTML', - ], - 'integer' => [ - 'title' => 'Integer (Tamsayı)', - ], - 'link' => [ - 'config' => [ - 'collections' => 'Bu koleksiyonlardan girişler mevcut olacak. Bunu boş bırakmak, yönlendirilebilir koleksiyonlardan girişleri kullanılabilir hale getirecektir.', - 'container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', - ], - 'title' => 'Bağlantı', - ], - 'list' => [ - 'title' => 'Liste', - ], - 'markdown' => [ - 'config' => [ - 'automatic_line_breaks' => 'Otomatik satır sonlarını etkinleştirir.', - 'automatic_links' => 'Herhangi bir URL\'nin otomatik olarak bağlanmasını sağlar.', - 'container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', - 'escape_markup' => 'Satır içi HTML işaretlemesinden çıkar (ör. `
` - `<div>`).', - 'folder' => 'Gezinmeye başlamak için klasör.', - 'parser' => 'Özelleştirilmiş bir Markdown ayrıştırıcısının adı. Varsayılan olarak boş bırakın.', - 'restrict' => 'Kullanıcıların diğer klasörlere gitmesini engelleyin.', - 'smartypants' => 'Düz tırnakları otomatik olarak kıvrımlı tırnaklara, tireleri en/em-tirelere ve diğer benzer metin dönüşümlerine dönüştürün.', - ], - 'title' => 'Markdown', - ], - 'picker' => [ - 'category' => [ - 'controls' => [ - 'description' => 'Mantığı kontrol edebilen seçilebilir seçenekler veya düğmeler sağlayan alanlar.', - ], - 'media' => [ - 'description' => 'Görüntüleri, videoları veya diğer ortamları depolayan alanlar.', - ], - 'number' => [ - 'description' => 'Numaraları saklayan alanlar.', - ], - 'relationship' => [ - 'description' => 'Diğer kaynaklarla ilişkileri depolayan alanlar.', - ], - 'special' => [ - 'description' => 'Bu alanlar, her biri kendi yolunda özeldir.', - ], - 'structured' => [ - 'description' => 'Yapılandırılmış verileri depolayan alanlar. Hatta bazıları diğer alanları kendi içlerine yerleştirebilir.', - ], - 'text' => [ - 'description' => 'Metin dizelerini, zengin içeriği veya her ikisini depolayan alanlar.', - ], - ], - ], - 'radio' => [ - 'config' => [ - 'inline' => 'Radyo düğmelerini arka arkaya göster.', - 'options' => 'Dizi tuşlarını ve isteğe bağlı etiketlerini ayarlayın.', - ], - 'title' => 'Radio', - ], - 'range' => [ - 'config' => [ - 'append' => 'Kaydırıcının sonuna (sağ tarafına) metin ekleyin.', - 'max' => 'Maksimum, en sağdaki değer.', - 'min' => 'Minimum, en soldaki değer.', - 'prepend' => 'Kaydırıcının başına (sol tarafa) metin ekleyin.', - 'step' => 'Değerler arasındaki minimum boyut.', - ], - 'title' => 'Menzil', - ], - 'relationship' => [ - 'config' => [ - 'mode' => 'Tercih ettiğiniz UI stilini seçin.', - ], - ], - 'replicator' => [ - 'config' => [ - 'collapse' => [ - 'accordion' => 'Bir seferde yalnızca bir kümenin genişletilmesine izin verin', - 'disabled' => 'Tüm setler varsayılan olarak genişletildi', - 'enabled' => 'Tüm setler varsayılan olarak daraltıldı', - ], - 'max_sets' => 'Maksimum set sayısı.', - 'previews' => 'Kümeler daraltıldığında gösterilir.', - ], - 'title' => 'Çoğaltıcı', - ], - 'revealer' => [ - 'config' => [ - 'input_label' => 'Düğmede veya geçişin yanında gösterilecek bir etiket ayarlayın.', - 'mode' => 'Tercih ettiğiniz düzen stilini seçin.', - ], - 'title' => 'Ortaya çıkarıcı', - ], - 'section' => [ - 'title' => 'Bölüm', - ], - 'select' => [ - 'config' => [ - 'clearable' => 'Seçeneğinizin seçimini kaldırmaya izin vermek için etkinleştirin.', - 'multiple' => 'Çoklu seçime izin ver.', - 'options' => 'Anahtarları ve isteğe bağlı etiketlerini ayarlayın.', - 'placeholder' => 'Yer tutucu metni ayarlayın.', - 'push_tags' => 'Seçenekler listesine yeni oluşturulan etiketleri ekleyin.', - 'searchable' => 'Olası seçenekler arasında aramayı etkinleştirin.', - 'taggable' => 'Önceden tanımlanmış seçeneklere ek olarak yeni seçenekler eklemeye izin ver', - ], - 'title' => 'Seçiniz', - ], - 'sites' => [ - 'title' => 'Siteler', - ], - 'slug' => [ - 'title' => 'Kalıcı Bağlantı', - ], - 'structures' => [ - 'title' => 'Yapılar', - ], - 'table' => [ - 'title' => 'Tablo', - ], - 'taggable' => [ - 'title' => 'Etiketlenebilir', - ], - 'taxonomies' => [ - 'title' => 'Taksonomiler', - ], - 'template' => [ - 'config' => [ - 'blueprint' => 'Bir "plana eşle" seçeneği ekler. [Belgelerde](https://statamic.dev/views#inferring-templates-from-entry-blueprints) daha fazla bilgi edinin.', - 'folder' => 'Yalnızca bu klasördeki şablonları göster.', - 'hide_partials' => 'Kısmi bölümlerin nadiren şablon olarak kullanılması amaçlanmıştır.', - ], - 'title' => 'Şablon', - ], - 'terms' => [ - 'config' => [ - 'create' => 'Yeni terimlerin oluşturulmasına izin verin.', - ], - 'title' => 'Taksonomi Terimleri', - ], - 'text' => [ - 'config' => [ - 'append' => 'Metin girişinin arkasına (sağına) metin ekleyin.', - 'character_limit' => 'Maksimum girilebilir karakter sayısını ayarlayın.', - 'input_type' => 'HTML5 giriş türünü ayarlayın.', - 'placeholder' => 'Yer tutucu metni ayarlayın.', - 'prepend' => 'Metin girişinin önüne (soluna) metin ekleyin.', - ], - 'title' => 'Metin', - ], - 'textarea' => [ - 'title' => 'Metin Alanı', - ], - 'time' => [ - 'config' => [ - 'seconds_enabled' => 'Zaman seçicide saniyeleri göster.', - ], - 'title' => 'Zaman', - ], - 'toggle' => [ - 'config' => [ - 'inline_label' => 'Geçiş girişinin yanında gösterilecek bir satır içi etiket ayarlayın.', - ], - 'title' => 'Aç/Kapat', - ], - 'user_groups' => [ - 'title' => 'Kullanıcı Grupları', - ], - 'user_roles' => [ - 'title' => 'Kullarıcı Rolleri', - ], - 'users' => [ - 'title' => 'Kullanıcılar', - ], - 'video' => [ - 'title' => 'Video', - ], - 'yaml' => [ - 'title' => 'YAML', - ], + 'any.config.antlers' => 'Bu alanın içeriğinde Antlers ile ayrıştırmayı etkinleştirin.', + 'any.config.cast_booleans' => 'True ve false değerlerine sahip seçenekler boolean olarak kaydedilecektir.', + 'any.config.mode' => 'Tercih ettiğiniz UI stilini seçin.', + 'array.config.keys' => 'Dizi anahtarlarını (değişkenler) ve isteğe bağlı etiketleri ayarlayın.', + 'array.config.mode' => 'Dinamik mod, kullanıcıya verilerin kontrolünü sağlarken, anahtarlı mod vermez.', + 'array.title' => 'Dizi', + 'assets.config.allow_uploads' => 'Yeni dosya yüklemelerine izin ver.', + 'assets.config.container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', + 'assets.config.folder' => 'Gezinmeye başlamak için klasör.', + 'assets.config.max_files' => 'Maksimum seçilebilir varlık sayısı.', + 'assets.config.min_files' => 'Seçilebilir varlıkların minimum sayısı.', + 'assets.config.mode' => 'Tercih ettiğiniz düzen stilini seçin.', + 'assets.config.query_scopes' => 'Seçilebilir varlıkları alırken hangi sorgu kapsamlarının uygulanacağını seçin.', + 'assets.config.restrict' => 'Kullanıcıların diğer klasörlere gitmesini engelleyin.', + 'assets.config.show_filename' => 'Önizleme görüntüsünün yanında dosya adını gösterin.', + 'assets.config.show_set_alt' => 'Herhangi bir resmin Alt Metnini ayarlamak için bir bağlantı göster.', + 'assets.title' => 'Varlıklar', + 'bard.config.allow_source' => 'Yazarken HTML kaynak kodunu görüntülemeyi etkinleştirin.', + 'bard.config.always_show_set_button' => 'Her zaman "Set Ekle" düğmesini göstermek için etkinleştirin.', + 'bard.config.buttons' => 'Araç çubuğunda hangi düğmelerin gösterileceğini seçin.', + 'bard.config.container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', + 'bard.config.enable_input_rules' => 'İçerik yazarken Markdown tarzı kısayolları etkinleştirir.', + 'bard.config.enable_paste_rules' => 'İçeriği yapıştırırken Markdown tarzı kısayolları etkinleştirir.', + 'bard.config.fullscreen' => 'Tam ekran moduna geçmek için etkinleştirin', + 'bard.config.inline' => 'Başlıklar, resimler ve setler gibi blok öğeleri devre dışı bırak.', + 'bard.config.inline.break' => 'Satır sonları ile etkin', + 'bard.config.inline.disabled' => 'Devre dışı', + 'bard.config.inline.enabled' => 'Satır sonları olmadan etkin', + 'bard.config.link_collections' => 'Bu koleksiyonlardan girişler bağlantı seçicide mevcut olacaktır. Bunu boş bırakmak tüm girişleri kullanılabilir hale getirecektir.', + 'bard.config.link_noopener' => 'Tüm bağlantılarda `rel="noopener"` ayarlayın.', + 'bard.config.link_noreferrer' => 'Tüm bağlantılarda `rel="noreferrer"` ayarlayın.', + 'bard.config.previews' => 'Kümeler daraltıldığında gösterilir.', + 'bard.config.reading_time' => 'Alanın altında tahmini okuma süresini gösterin.', + 'bard.config.remove_empty_nodes' => 'Boş düğümlerle nasıl başa çıkacağınızı seçin.', + 'bard.config.save_html' => 'Yapılandırılmış veriler yerine HTML\'yi kaydedin. Bu, şablon işaretlemenizin kontrolünü basitleştirir ancak sınırlandırır.', + 'bard.config.section.editor.instructions' => 'Editörün görünümünü ve genel davranışını yapılandırın.', + 'bard.config.section.links.instructions' => 'Bu Bard örneğinde bağlantıların nasıl yönetileceğini yapılandırın.', + 'bard.config.section.sets.instructions' => 'Bard içeriğinize herhangi bir yere eklenebilecek alan bloklarını yapılandırın.', + 'bard.config.sets' => 'Kümeler, Bard içeriğinizin herhangi bir yerine eklenebilen yapılandırılabilir alan bloklarıdır.', + 'bard.config.target_blank' => 'Tüm bağlantılarda `target="_blank"` ayarlayın.', + 'bard.config.toolbar_mode' => 'Tercih ettiğiniz araç çubuğu stilini seçin.', + 'bard.config.word_count' => 'Alanın alt kısmında kelime sayısını göster.', + 'bard.title' => 'Bard', + 'button_group.title' => 'Buton Grubu', + 'checkboxes.config.inline' => 'Onay kutularını arka arkaya göster.', + 'checkboxes.config.options' => 'Dizi tuşlarını ve isteğe bağlı etiketlerini ayarlayın.', + 'checkboxes.title' => 'Onay kutuları', + 'code.config.indent_size' => 'Tercih ettiğiniz girinti boyutunu ayarlayın (boşluklarda).', + 'code.config.indent_type' => 'Tercih ettiğiniz girinti türünü ayarlayın.', + 'code.config.key_map' => 'Tercih edilen klavye kısayolları kümesini seçin.', + 'code.config.mode' => 'Sözdizimi vurgulaması için dili seçin.', + 'code.config.mode_selectable' => 'Modun kullanıcı tarafından değiştirilip değiştirilemeyeceği.', + 'code.config.rulers' => 'Girintilere yardımcı olmak için dikey cetvelleri yapılandırın.', + 'code.config.theme' => 'Tercih ettiğiniz temayı seçin.', + 'code.title' => 'Kod', + 'collections.title' => 'Koleksiyon', + 'color.config.allow_any' => 'Renk seçici veya hex kodu ile herhangi bir renk değeri girmeye izin ver.', + 'color.config.default' => 'Varsayılan bir renk seçin.', + 'color.config.swatches' => 'Listeden seçilebilecek renkleri önceden tanımlayın.', + 'color.title' => 'Renk', + 'date.config.calendar' => 'Listeden herhangi bir takvimi veya hiçbiri seçin.', + 'date.config.columns' => 'Birden çok ay\'ı aynı anda satırlar ve sütunlar halinde göster', + 'date.config.earliest_date' => 'En erken seçilebilir tarihi ayarlayın.', + 'date.config.format' => '[PHP tarih formatı](https://www.php.net/manual/en/datetime.format.php) kullanılarak tarihin nasıl saklanması gerektiği.', + 'date.config.full_width' => 'Tam genişliği kullanmak için takvimi uzatın.', + 'date.config.inline' => 'Açılır giriş alanını atlayın ve takvimi doğrudan gösterin.', + 'date.config.latest_date' => 'En son seçilebilir tarihi ayarlayın.', + 'date.config.locale' => 'Takviminizin hangi yerelleştirme ile görüntülenmesini istediğinizi belirtin. Burada veya sitenin ayarlarında belirli bir takvim seçmediyseniz, takvim yerelleştirmenin standart takvimine varsayılabilir.', + 'date.config.mode' => 'Tek veya aralık modu arasında seçim yapın (aralık, zaman seçiciyi devre dışı bırakır).', + 'date.config.rows' => 'Birden çok ayı aynı anda satırlar ve sütunlar halinde göster', + 'date.config.time_enabled' => 'Zaman seçiciyi etkinleştirin.', + 'date.config.time_seconds_enabled' => 'Zaman seçicide saniyeleri göster.', + 'date.config.timezone' => 'Kullanıcının varsayılanından farklı bir tercih ettiğiniz saat dilimi varsa, lütfen burada belirtin.', + 'date.title' => 'Tarih', + 'entries.config.collections' => 'Kullanıcının seçebileceği koleksiyonları seçin.', + 'entries.config.create' => 'Yeni girdilerin oluşturulmasına izin verin.', + 'entries.config.query_scopes' => 'Seçilebilir girişleri alırken hangi sorgu kapsamlarının uygulanacağını seçin.', + 'entries.config.search_index' => 'Uygun bir arama dizini mümkün olduğunda otomatik olarak kullanılacaktır, ancak açıkça bir tane tanımlayabilirsiniz.', + 'entries.config.select_across_sites' => 'Diğer sitelerden giriş seçimine izin ver. Bu aynı zamanda ön uçta yerelleştirme seçeneklerini devre dışı bırakır. Daha fazla bilgi için [belgelere](https://statamic.dev/fieldtypes/entries#select-across-sites) bakın.', + 'entries.title' => 'Girdiler', + 'float.title' => 'Float', + 'form.config.max_items' => 'Maksimum seçilebilir form sayısı.', + 'form.config.query_scopes' => 'Seçilebilir formları alırken hangi sorgu kapsamlarının uygulanacağını seçin.', + 'form.title' => 'Form', + 'grid.config.add_row' => '"Satır Ekle" düğmesinin etiketini ayarlayın.', + 'grid.config.fields' => 'Her alan, ızgara tablosunda bir sütun haline gelir.', + 'grid.config.fullscreen' => 'Tam ekran modu için geçişi etkinleştir.', + 'grid.config.max_rows' => 'Maksimum sayıda oluşturulabilir satır belirleyin.', + 'grid.config.min_rows' => 'Minimum sayıda oluşturulabilir satır belirleyin.', + 'grid.config.mode' => 'Tercih ettiğiniz düzen stilini seçin.', + 'grid.config.reorderable' => 'Satırın yeniden sıralanmasına izin vermek için etkinleştirin.', + 'grid.title' => 'Izgara', + 'group.config.fields' => 'Bu grubun içinde yuvalanacak alanları yapılandırın.', + 'group.title' => 'Grup', + 'hidden.title' => 'Gizli', + 'html.config.html_instruct' => 'Yayın formunda görüntülenecek HTML\'yi yönetin.', + 'html.title' => 'HTML', + 'icon.config.directory' => 'Simgeleri içeren dizinin yolu.', + 'icon.config.folder' => 'Belirli bir simge setini içeren bir alt dizin.', + 'icon.title' => 'Simge', + 'integer.title' => 'Integer (Tamsayı)', + 'link.config.collections' => 'Bu koleksiyonlardan girişler mevcut olacak. Bunu boş bırakmak, yönlendirilebilir koleksiyonlardan girişleri kullanılabilir hale getirecektir.', + 'link.config.container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', + 'link.title' => 'Bağlantı', + 'list.title' => 'Liste', + 'markdown.config.automatic_line_breaks' => 'Otomatik satır sonlarını etkinleştirir.', + 'markdown.config.automatic_links' => 'Herhangi bir URL\'nin otomatik olarak bağlanmasını sağlar.', + 'markdown.config.container' => 'Bu alan için hangi varlık kapsayıcısının kullanılacağını seçin.', + 'markdown.config.escape_markup' => 'Satır içi HTML işaretlemesinden çıkar (ör. `
` - `<div>`).', + 'markdown.config.folder' => 'Gezinmeye başlamak için klasör.', + 'markdown.config.heading_anchors' => 'Tüm başlık öğelerine (`

`, `

`, vb.) bağlantı ekleyin.', + 'markdown.config.parser' => 'Özelleştirilmiş bir Markdown ayrıştırıcısının adı. Varsayılan olarak boş bırakın.', + 'markdown.config.restrict' => 'Kullanıcıların diğer klasörlere gitmesini engelleyin.', + 'markdown.config.smartypants' => 'Düz tırnakları otomatik olarak kıvrımlı tırnaklara, tireleri en/em-tirelere ve diğer benzer metin dönüşümlerine dönüştürün.', + 'markdown.config.table_of_contents' => 'İçeriğinizin üst kısmına otomatik olarak bir içerik tablosu ekleyin ve başlıklara bağlantılar koyun.', + 'markdown.title' => 'Markdown', + 'nav.title' => 'Menü', + 'picker.category.controls.description' => 'Mantığı kontrol edebilen seçilebilir seçenekler veya düğmeler sağlayan alanlar.', + 'picker.category.media.description' => 'Görüntüleri, videoları veya diğer ortamları depolayan alanlar.', + 'picker.category.number.description' => 'Numaraları saklayan alanlar.', + 'picker.category.relationship.description' => 'Diğer kaynaklarla ilişkileri depolayan alanlar.', + 'picker.category.special.description' => 'Bu alanlar, her biri kendi yolunda özeldir.', + 'picker.category.structured.description' => 'Yapılandırılmış verileri depolayan alanlar. Hatta bazıları diğer alanları kendi içlerine yerleştirebilir.', + 'picker.category.text.description' => 'Metin dizelerini, zengin içeriği veya her ikisini depolayan alanlar.', + 'radio.config.inline' => 'Radyo düğmelerini arka arkaya göster.', + 'radio.config.options' => 'Dizi tuşlarını ve isteğe bağlı etiketlerini ayarlayın.', + 'radio.title' => 'Radio', + 'range.config.append' => 'Kaydırıcının sonuna (sağ tarafına) metin ekleyin.', + 'range.config.max' => 'Maksimum, en sağdaki değer.', + 'range.config.min' => 'Minimum, en soldaki değer.', + 'range.config.prepend' => 'Kaydırıcının başına (sol tarafa) metin ekleyin.', + 'range.config.step' => 'Değerler arasındaki minimum boyut.', + 'range.title' => 'Menzil', + 'relationship.config.mode' => 'Tercih ettiğiniz UI stilini seçin.', + 'replicator.config.button_label' => 'Set ekleme düğmesine bir etiket ekleyin.', + 'replicator.config.collapse' => 'Set daraltma davranışı.', + 'replicator.config.collapse.accordion' => 'Bir seferde yalnızca bir kümenin genişletilmesine izin verin', + 'replicator.config.collapse.disabled' => 'Tüm setler varsayılan olarak genişletildi', + 'replicator.config.collapse.enabled' => 'Tüm setler varsayılan olarak daraltıldı', + 'replicator.config.fullscreen' => 'Tam ekran modu için geçişi etkinleştirin.', + 'replicator.config.max_sets' => 'Maksimum set sayısı.', + 'replicator.config.previews' => 'Kümeler daraltıldığında gösterilir.', + 'replicator.config.sets' => 'Setler, isteğe bağlı olarak oluşturulabilen ve yeniden sıralanabilen yapılandırılabilir alan bloklarıdır.', + 'replicator.title' => 'Çoğaltıcı', + 'revealer.config.input_label' => 'Düğmede veya geçişin yanında gösterilecek bir etiket ayarlayın.', + 'revealer.config.mode' => 'Tercih ettiğiniz düzen stilini seçin.', + 'revealer.title' => 'Ortaya Çıkarıcı', + 'section.title' => 'Bölüm', + 'select.config.clearable' => 'Seçeneğinizin seçimini kaldırmaya izin vermek için etkinleştirin.', + 'select.config.multiple' => 'Çoklu seçime izin ver.', + 'select.config.options' => 'Anahtarları ve isteğe bağlı etiketlerini ayarlayın.', + 'select.config.placeholder' => 'Yer tutucu metni ayarlayın.', + 'select.config.push_tags' => 'Seçenekler listesine yeni oluşturulan etiketleri ekleyin.', + 'select.config.searchable' => 'Olası seçenekler arasında aramayı etkinleştirin.', + 'select.config.taggable' => 'Önceden tanımlanmış seçeneklere ek olarak yeni seçenekler eklemeye izin ver', + 'select.title' => 'Seçiniz', + 'sites.title' => 'Siteler', + 'slug.config.from' => 'Bir slug oluşturmak için hedef alan.', + 'slug.config.generate' => 'Hedef `from` alanından otomatik olarak bir slug oluşturun.', + 'slug.config.show_regenerate' => 'Hedef alandan yeniden slug oluşturmak için yeniden oluşturma düğmesini göster.', + 'slug.title' => 'Slug', + 'spacer.title' => 'Boşluk', + 'structures.title' => 'Yapılar', + 'table.title' => 'Tablo', + 'taggable.config.options' => 'Seçilebilecek önceden tanımlanmış etiketler sağlayın.', + 'taggable.config.placeholder' => 'Yazın ve ↩ Enter tuşuna basın', + 'taggable.title' => 'Etiketlenebilir', + 'taxonomies.title' => 'Taksonomiler', + 'template.config.blueprint' => 'Bir "plana eşle" seçeneği ekler. [Belgelerde](https://statamic.dev/views#inferring-templates-from-entry-blueprints) daha fazla bilgi edinin.', + 'template.config.folder' => 'Yalnızca bu klasördeki şablonları göster.', + 'template.config.hide_partials' => 'Kısmi bölümlerin nadiren şablon olarak kullanılması amaçlanmıştır.', + 'template.title' => 'Şablon', + 'terms.config.create' => 'Yeni terimlerin oluşturulmasına izin verin.', + 'terms.config.query_scopes' => 'Seçilebilir terimleri alırken hangi sorgu kapsamlarının uygulanacağını seçin.', + 'terms.config.taxonomies' => 'Terimlerin hangi taksonomilerden gösterileceğini seçin.', + 'terms.title' => 'Taksonomi Terimleri', + 'text.config.append' => 'Metin girişinin arkasına (sağına) metin ekleyin.', + 'text.config.autocomplete' => 'Otomatik tamamlama özelliğini ayarlayın.', + 'text.config.character_limit' => 'Maksimum girilebilir karakter sayısını ayarlayın.', + 'text.config.input_type' => 'HTML5 giriş türünü ayarlayın.', + 'text.config.placeholder' => 'Yer tutucu metni ayarlayın.', + 'text.config.prepend' => 'Metin girişinin önüne (soluna) metin ekleyin.', + 'text.title' => 'Metin', + 'textarea.title' => 'Metin Alanı', + 'time.config.seconds_enabled' => 'Zaman seçicide saniyeleri göster.', + 'time.title' => 'Zaman', + 'toggle.config.inline_label' => 'Geçiş girişinin yanında gösterilecek bir satır içi etiket ayarlayın.', + 'toggle.config.inline_label_when_true' => 'Geçişin değeri doğru olduğunda gösterilecek satır içi etiketi ayarlayın.', + 'toggle.title' => 'Değiştirme', + 'user_groups.title' => 'Kullanıcı Grupları', + 'user_roles.title' => 'Kullarıcı Rolleri', + 'users.config.query_scopes' => 'Seçilebilir kullanıcıları alırken hangi sorgu kapsamlarının uygulanacağını seçin.', + 'users.title' => 'Kullanıcılar', + 'video.title' => 'Video', + 'width.config.options' => 'Kullanılabilir genişlik seçeneklerini ayarlayın.', + 'width.title' => 'Genişlik', + 'yaml.title' => 'YAML', ]; diff --git a/resources/lang/tr/messages.php b/resources/lang/tr/messages.php index 1c34eb051f..2211e90adf 100644 --- a/resources/lang/tr/messages.php +++ b/resources/lang/tr/messages.php @@ -5,17 +5,23 @@ 'activate_account_notification_subject' => 'Hesabınızı Etkinleştirin', 'addon_has_more_releases_beyond_license_body' => 'Güncelleyebilirsiniz, ancak yeni bir lisans yükseltmeniz veya satın almanız gerekecektir.', 'addon_has_more_releases_beyond_license_heading' => 'Bu eklentinin lisanslı sınırınızı aşan daha fazla sürümü var.', + 'addon_install_command' => 'Bu eklentiyi yüklemek için aşağıdaki komutu çalıştırın', 'addon_list_loading_error' => 'Eklentiler yüklenirken bir şeyler ters gitti. Daha sonra tekrar deneyin.', + 'addon_uninstall_command' => 'Bu eklentiyi kaldırmak için aşağıdaki komutu çalıştırın', 'asset_container_allow_uploads_instructions' => 'Etkinleştirildiğinde, kullanıcılara bu kapsayıcıya dosya yükleme yeteneği verir.', 'asset_container_blueprint_instructions' => 'Planlar, varlıkları düzenlerken kullanılabilen ek özel alanları tanımlar.', 'asset_container_create_folder_instructions' => 'Etkinleştirildiğinde, kullanıcılara bu kapsayıcıda klasör oluşturma yeteneği verir.', 'asset_container_disk_instructions' => 'Dosya sistemi diskleri, yerel olarak veya Amazon S3 gibi uzak bir konumda dosyaların nerede depolanacağını belirtir. `config/filesystems.php` içinde yapılandırılabilirler.', - 'asset_container_handle_instructions' => 'Ön uçta bu kapsayıcıya başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'asset_container_handle_instructions' => 'Ön uçta bu kapsayıcıya başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'asset_container_intro' => 'Medya ve belge dosyaları, sunucudaki veya diğer dosya depolama hizmetlerindeki klasörlerde bulunur. Bu konumların her birine kapsayıcı denir.', 'asset_container_move_instructions' => 'Etkinleştirildiğinde, kullanıcıların dosyaları bu kapsayıcı içinde taşımasına izin verir.', 'asset_container_quick_download_instructions' => 'Etkinleştirildiğinde, Varlık Yöneticisine bir hızlı indirme düğmesi eklenecektir.', 'asset_container_rename_instructions' => 'Etkinleştirildiğinde, kullanıcıların bu kapsayıcıdaki dosyaları yeniden adlandırmasına izin verir.', + 'asset_container_source_preset_instructions' => 'Yüklenen görüntüler bu ön ayar kullanılarak kalıcı olarak işlenecektir.', 'asset_container_title_instructions' => 'Genellikle Görüntüler veya Belgeler gibi çoğul bir isim', + 'asset_container_validation_rules_instructions' => 'Yüklenen dosyalara uygulanacak kurallar.', + 'asset_container_warm_intelligent_instructions' => 'Yüklerken uygun ön tanımlar oluştur.', + 'asset_container_warm_presets_instructions' => 'Yüklerken hangi ön tanımların oluşturulacağını belirtin.', 'asset_folders_directory_instructions' => 'URL\'leri temiz tutmak için boşluklardan ve özel karakterlerden kaçınmanızı öneririz.', 'asset_replace_confirmation' => 'İçerik içindeki bu varlığa yapılan referanslar, aşağıda seçtiğiniz varlığa göre güncellenecektir.', 'asset_reupload_confirmation' => 'Bu varlığı yeniden yüklemek istediğinizden emin misiniz?', @@ -23,21 +29,25 @@ 'blueprints_hidden_instructions' => 'Planı CP\'deki oluştur düğmelerinden gizler', 'blueprints_intro' => 'Planlar, koleksiyonlar, formlar ve diğer veri türleri için içerik modelleri oluşturmak üzere alanları tanımlar ve düzenler.', 'blueprints_title_instructions' => 'Genellikle Makale veya Ürün gibi tekil bir isim', - 'cache_utility_application_cache_description' => 'Laravel\'in Statamic, üçüncü taraf eklentiler ve composer paketleri tarafından kullanılan birleşik önbelleği.', - 'cache_utility_description' => 'Statamic\'in çeşitli önbelleğe alma katmanları hakkındaki önemli bilgileri yönetin ve görüntüleyin.', + 'cache_utility_application_cache_description' => 'Laravel\'in Statamik, üçüncü taraf eklentiler ve composer paketleri tarafından kullanılan birleşik önbelleği.', + 'cache_utility_description' => 'Statamik\'in çeşitli önbelleğe alma katmanları hakkındaki önemli bilgileri yönetin ve görüntüleyin.', 'cache_utility_image_cache_description' => 'Görüntü önbelleği, dönüştürülmüş ve yeniden boyutlandırılmış tüm görüntülerin kopyalarını saklar.', - 'cache_utility_stache_description' => 'Stache, Statamic\'in bir veritabanı gibi çalışan içerik deposudur. İçerik dosyalarından otomatik olarak oluşturulur.', - 'cache_utility_static_cache_description' => 'Statik sayfalar Statamic\'i tamamen atlar ve maksimum performans için doğrudan sunucudan oluşturulur.', + 'cache_utility_stache_description' => 'Stache, Statamik\'in bir veritabanı gibi çalışan içerik deposudur. İçerik dosyalarından otomatik olarak oluşturulur.', + 'cache_utility_static_cache_description' => 'Statik sayfalar Statamik\'i tamamen atlar ve maksimum performans için doğrudan sunucudan oluşturulur.', 'choose_entry_localization_deletion_behavior' => 'Yerelleştirilmiş girişlerde gerçekleştirmek istediğiniz eylemi seçin.', 'collection_configure_date_behavior_private' => 'Özel - Listelerden gizlendi, URL\'ler 404', 'collection_configure_date_behavior_public' => 'Herkese açık - Her zaman görünür', 'collection_configure_date_behavior_unlisted' => 'Listelenmemiş - Listelerden gizlenmiş, URL\'ler görünür', 'collection_configure_dated_instructions' => 'Yayınlama tarihleri, içeriği planlamak ve süresinin dolmasını sağlamak için kullanılabilir.', - 'collection_configure_handle_instructions' => 'Ön uçta bu koleksiyona başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'collection_configure_handle_instructions' => 'Ön uçta bu koleksiyona başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'collection_configure_intro' => 'Koleksiyon, davranışı, nitelikleri ve ayarları paylaşan bir grup ilgili girdidir.', 'collection_configure_layout_instructions' => 'Bu koleksiyonun varsayılan düzenini ayarlayın. Girişler, "düzen" adlı bir "şablon" alanıyla bu ayarı geçersiz kılabilir. Bu ayarı değiştirmek olağandışıdır.', + 'collection_configure_origin_behavior_instructions' => 'Bir giriş yerelleştirilirken, köken olarak hangi site kullanılmalıdır?', + 'collection_configure_origin_behavior_option_active' => 'Düzenlenen girişin etkin sitesini kullan', + 'collection_configure_origin_behavior_option_root' => 'Girişin ilk oluşturulduğu siteyi kullan', + 'collection_configure_origin_behavior_option_select' => 'Kullanıcıya kökeni seçme seçeneği ver', 'collection_configure_propagate_instructions' => 'Yeni girişleri tüm yapılandırılmış sitelere otomatik olarak yay.', - 'collection_configure_require_slugs_instructions' => 'Girişlerin kalıcı bağlantıya sahip olması gerekip gerekmediği.', + 'collection_configure_require_slugs_instructions' => 'Girişlerin sluga sahip olması gerekip gerekmediği.', 'collection_configure_template_instructions' => 'Bu koleksiyonun varsayılan şablonunu ayarlayın. Girişler, bir "şablon" alanıyla bu ayarı geçersiz kılabilir.', 'collection_configure_title_format_instructions' => 'Bunu, bu koleksiyondaki girişlerin başlıklarını otomatik olarak oluşturması için ayarlayın. [Belgelerde](https://statamic.dev/collections#titles) daha fazla bilgi edinin.', 'collection_configure_title_instructions' => '"Makaleler" veya "Ürünler" gibi çoğul bir isim öneririz.', @@ -54,69 +64,84 @@ 'collections_mount_instructions' => 'Bu koleksiyonun monte edileceği bir giriş seçin. [Belgelerde](https://statamic.dev/collections-and-entries#mounting) daha fazla bilgi edinin.', 'collections_orderable_instructions' => 'Sürükle ve bırak yoluyla manuel sıralamayı etkinleştirin.', 'collections_past_date_behavior_instructions' => 'Geçmiş tarihli girişlerin nasıl davranması gerektiği.', + 'collections_preview_target_refresh_instructions' => 'Düzenleme yaparken önizlemeyi otomatik olarak yenileyin. Bu özelliği devre dışı bırakmak postMessage kullanılmasını sağlar.', 'collections_preview_targets_instructions' => 'Canlı Önizleme\'de görüntülenebilecek URL\'ler. [Belgelerde](https://statamic.dev/live-preview#preview-targets) daha fazla bilgi edinin.', 'collections_route_instructions' => 'Rota, girişlerin URL modelini kontrol eder. [Belgelerde](https://statamic.dev/collections#routing) daha fazla bilgi edinin.', 'collections_sort_direction_instructions' => 'Varsayılan sıralama yönü.', 'collections_taxonomies_instructions' => 'Bu koleksiyondaki girişleri taksonomilere bağlayın. Formları yayınlamak için alanlar otomatik olarak eklenecektir.', + 'duplicate_action_localizations_confirmation' => 'Bu işlemi çalıştırmak istediğinizden emin misiniz? Yerelleştirmeler de kopyalanacak.', + 'duplicate_action_warning_localization' => 'Bu giriş bir yerelleştirme. Kaynak giriş kopyalanacak.', + 'duplicate_action_warning_localizations' => 'Seçili girişlerden bir veya daha fazlası yerelleştirmelerdir. Bu durumlarda kaynak giriş kopyalanacak.', 'email_utility_configuration_description' => 'Posta ayarları :path içinde yapılandırılır', - 'email_utility_description' => 'E-posta yapılandırma ayarlarını kontrol edin ve test e-postaları gönderin.', + 'email_utility_description' => 'E-Posta yapılandırma ayarlarını kontrol edin ve test e-postaları gönderin.', + 'entry_origin_instructions' => 'Yeni yerelleştirme, seçilen sitedeki girişteki değerleri devralır.', 'expect_root_instructions' => 'Ağaçtaki ilk sayfayı bir "kök" veya "ana sayfa" olarak kabul edin.', 'field_conditions_always_save_instructions' => 'Alan koşullarının nasıl değerlendirildiğine bakılmaksızın her zaman alan değerini kaydedin.', + 'field_conditions_field_instructions' => 'Herhangi bir alan tutamaçını girebilirsiniz. Açılırliste seçeneklerle sınırlı değilsiniz.', 'field_conditions_instructions' => 'Bu alanın ne zaman gösterileceği veya gizleneceği.', 'field_desynced_from_origin' => 'Kaynaktan senkronize edilmedi. Senkronize etmek ve kaynağın değerine geri dönmek için tıklayın.', 'field_synced_with_origin' => 'Kaynak ile senkronize edildi. Eşitlemeyi kaldırmak için alanı tıklayın veya düzenleyin.', 'field_validation_advanced_instructions' => 'Bu alana daha gelişmiş doğrulama ekleyin.', 'field_validation_required_instructions' => 'Bu alanın gerekli olup olmadığını kontrol edin.', + 'field_validation_sometimes_instructions' => 'Sadece bu alan görünür olduğunda veya gönderildiğinde doğrulayın.', 'fields_blueprints_description' => 'Planlar, koleksiyonlar, sınıflandırmalar, kullanıcılar ve formlar gibi içerik yapıları için alanları tanımlar.', 'fields_default_instructions' => 'Varsayılan değeri ayarlayın.', 'fields_display_instructions' => 'Kontrol Panelinde gösterilen alanın etiketi.', + 'fields_duplicate_instructions' => 'Bu öğe kopyalanırken bu alanın dahil edilip edilmeyeceği.', 'fields_fieldsets_description' => 'Alan kümeleri, yeniden kullanılabilir, önceden yapılandırılmış alanları düzenlemeye yardımcı olan basit, esnek ve tamamen isteğe bağlı alan gruplarıdır.', 'fields_handle_instructions' => 'Alanın şablon değişkeni.', 'fields_instructions_instructions' => 'Bu metin gibi, alanın ekran etiketinin altında gösterilir. İşaretleme desteklenir.', 'fields_instructions_position_instructions' => 'Alanın üstünde veya altında talimatları gösterin.', 'fields_listable_instructions' => 'Liste sütununun görünürlüğünü kontrol edin.', + 'fields_replicator_preview_instructions' => 'Replicator/Bard setlerinde önizleme görünürlüğünü kontrol edin.', + 'fields_sortable_instructions' => 'Listeleme görünümlerinde alanın sıralanabilir olup olmadığını kontrol edin.', 'fields_visibility_instructions' => 'Yayınlama formlarında alan görünürlüğünü kontrol edin.', 'fieldset_import_fieldset_instructions' => 'İçe aktarılacak alan kümesi.', 'fieldset_import_prefix_instructions' => 'İçe aktarıldıklarında her alana uygulanması gereken önek. Örneğin. kahraman_', 'fieldset_intro' => 'Alan kümeleri, planlarda kullanılabilecek yeniden kullanılabilir kısımlar olarak işlev gören, planların isteğe bağlı bir tamamlayıcısıdır.', 'fieldset_link_fields_prefix_instructions' => 'Bağlantılı alan kümesindeki her alanın önüne bu eklenir. Aynı alanları birden çok kez içe aktarmak istiyorsanız kullanışlıdır.', - 'fieldsets_handle_instructions' => 'Bu alan kümesine başka bir yerde başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', - 'fieldsets_title_instructions' => 'Genellikle Görüntü Bloğu veya Meta Veri gibi hangi alanların içinde olacağını açıklar', + 'fieldsets_handle_instructions' => 'Bu alan kümesine başka bir yerde başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', + 'fieldsets_title_instructions' => 'Genellikle hangi alanlarda olacağını açıklar, örneğin "Görüntü Bloğu" veya "Meta Veri".', + 'filters_view_already_exists' => 'Bu isimle zaten bir görünüm mevcut. Bu görünümü oluşturmak mevcut olanı üzerine yazacak.', 'focal_point_instructions' => 'Bir odak noktası ayarlamak, çerçeve içinde kalan bir özne ile dinamik fotoğraf kırpmaya olanak tanır.', 'focal_point_previews_are_examples' => 'Kırpma önizlemeleri yalnızca örnektir', 'forgot_password_enter_email' => 'Şifre sıfırlama bağlantısı gönderebilmemiz için e-posta adresinizi girin.', - 'form_configure_blueprint_instructions' => 'Mevcut Planlardan birini seçin veya yeni bir tane oluşturun.', + 'form_configure_blueprint_instructions' => 'Mevcut planlardan birini seçin veya yeni bir tane oluşturun.', 'form_configure_email_attachments_instructions' => 'Yüklenen varlıkları bu e-postaya ekleyin.', + 'form_configure_email_bcc_instructions' => 'BCC alıcı(lar)ının email adresi - virgülle ayrılmış.', + 'form_configure_email_cc_instructions' => 'CC alıcı(lar)ının email adresi - virgülle ayrılmış.', 'form_configure_email_from_instructions' => 'Site varsayılanına geri dönmek için boş bırakın', 'form_configure_email_html_instructions' => 'Bu e-postanın html sürümünün görünümü.', 'form_configure_email_instructions' => 'Yeni form gönderimi alındığında gönderilecek e-postaları yapılandırın.', 'form_configure_email_markdown_instructions' => 'Markdown kullanarak bu e-postanın HTML sürümünü oluşturun.', 'form_configure_email_reply_to_instructions' => 'Gönderene geri dönmek için boş bırakın.', - 'form_configure_email_subject_instructions' => 'E-posta konu satırı', + 'form_configure_email_subject_instructions' => 'E-Posta konu satırı', 'form_configure_email_text_instructions' => 'Bu e-postanın metin sürümünün görünümü.', 'form_configure_email_to_instructions' => 'Alıcının e-posta adresi.', - 'form_configure_handle_instructions' => 'Bu forma ön uçta başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'form_configure_handle_instructions' => 'Bu forma ön uçta başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'form_configure_honeypot_instructions' => 'Honeypot olarak kullanılacak alan adı. Honeypot\'lar, botspam\'i azaltmak için kullanılan özel alanlardır.', 'form_configure_intro' => 'Formlar, ziyaretçilerden bilgi toplamak ve yeni gönderimler olduğunda olayları ve bildirimleri göndermek için kullanılır.', + 'form_configure_mailer_instructions' => 'Bu e-postayı göndermek için mailer seçin. Varsayılan mailer için boş bırakın.', 'form_configure_store_instructions' => 'Gönderimleri depolamayı durdurmak için devre dışı bırakın. Etkinlikler ve e-posta bildirimleri gönderilmeye devam edecek.', 'form_configure_title_instructions' => 'Genellikle "Bize Ulaşın" gibi bir harekete geçirici mesajdır.', 'getting_started_widget_blueprints' => 'Planlar, içerik oluşturmak ve depolamak için kullanılan özel alanları tanımlar.', 'getting_started_widget_collections' => 'Koleksiyonlar, sitedeki farklı içerik türlerini içerir.', - 'getting_started_widget_docs' => 'Yeteneklerini doğru şekilde anlayarak Statamic\'i tanıyın.', - 'getting_started_widget_header' => 'Statamic\'e Başlarken', - 'getting_started_widget_intro' => 'Yeni Statamic sitenizi oluşturmaya başlamak için bu adımlarla başlamanızı öneririz.', + 'getting_started_widget_docs' => 'Yeteneklerini doğru şekilde anlayarak Statamik\'i tanıyın.', + 'getting_started_widget_header' => 'Statamik\'e Başlarken', + 'getting_started_widget_intro' => 'Yeni Statamik sitenizi oluşturmaya başlamak için bu adımlarla başlamanızı öneririz.', 'getting_started_widget_navigation' => 'Gezinme çubukları, altbilgiler vb. oluşturmak için kullanılabilecek çok düzeyli bağlantı listeleri oluşturun.', - 'getting_started_widget_pro' => 'Statamic Pro, sınırsız kullanıcı hesabı, rol, izin, git-entegrasyon, revizyon, çoklu site ve daha fazlasını ekler!', - 'git_disabled' => 'Statamic Git entegrasyonu şu anda devre dışı.', + 'getting_started_widget_pro' => 'Statamik Pro, sınırsız kullanıcı hesabı, rol, izin, git-entegrasyon, revizyon, çoklu site ve daha fazlasını ekler!', + 'git_disabled' => 'Statamik Git entegrasyonu şu anda devre dışı.', 'git_nothing_to_commit' => 'İşleme alınacak bir şey yok, içerik yolları temiz!', 'git_utility_description' => 'Git\'in izlenen içeriğini yönetin.', 'global_search_open_using_slash' => '/ tuşunu kullanarak genel aramaya odaklanın', 'global_set_config_intro' => 'Evrensel Kümeler, şirket ayrıntıları, iletişim bilgileri veya ön uç ayarları gibi sitenin tamamında bulunan içeriği yönetir.', 'global_set_no_fields_description' => 'Plana alanlar ekleyebilir veya setin kendisine manuel olarak değişkenler ekleyebilirsiniz.', 'globals_blueprint_instructions' => 'Değişkenleri düzenlerken görüntülenecek alanları kontrol eder.', - 'globals_configure_handle_instructions' => 'Ön uçta bu evrensel kümeye başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'globals_configure_handle_instructions' => 'Ön uçta bu evrensel kümeye başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'globals_configure_intro' => 'Genel küme, tüm ön uç sayfalarında kullanılabilen bir değişken grubudur.', 'globals_configure_title_instructions' => 'Setin içeriğini temsil eden bir isim öneriyoruz. Örneğin. "Marka" veya "Şirket"', + 'impersonate_action_confirmation' => 'Bu kullanıcı olarak giriş yapacaksınız. Avatar menüsünden hesabınıza geri dönebilirsiniz.', 'licensing_config_cached_warning' => '.env veya yapılandırma dosyalarınızda yaptığınız değişiklikler, önbelleği temizleyene kadar algılanmayacaktır. Burada beklenmeyen lisanslama sonuçları görüyorsanız, bunun nedeni bu olabilir. Önbelleği yeniden oluşturmak için php artisan config:cache komutunu kullanabilirsiniz.', 'licensing_error_invalid_domain' => 'Gerçersiz domain', 'licensing_error_invalid_edition' => 'Lisans şunun içindir: baskı baskısı', @@ -125,21 +150,24 @@ 'licensing_error_outside_license_range' => ':start ve :end sürümleri için geçerli lisans', 'licensing_error_unknown_site' => 'Bilinmeyen site', 'licensing_error_unlicensed' => 'Lisans yok', - 'licensing_production_alert' => 'Bu site Statamic Pro ve ticari eklentiler kullanıyor. Lütfen uygun lisansları satın alın.', + 'licensing_incorrect_key_format_body' => 'Site anahtarınızın doğru formatta olmadığı görünüyor. Anahtarınızı kontrol edin ve yeniden deneyin. Site anahtarınızı statamic.com\'un hesap alanından alabilirsiniz. Alfanümerik ve 16 karakter uzunluğundadır. UUID olan eski lisans anahtarını kullanmayın.', + 'licensing_incorrect_key_format_heading' => 'Yanlış site anahtar formatı', + 'licensing_production_alert' => 'Bu site Statamik Pro ve ticari eklentiler kullanıyor. Lütfen uygun lisansları satın alın.', 'licensing_production_alert_addons' => 'Bu site ticari eklentiler kullanıyor. Lütfen uygun lisansları satın alın.', - 'licensing_production_alert_renew_statamic' => 'Statamic Pro\'nun bu sürümünü kullanmak için bir lisans yenilemesi gerekir.', - 'licensing_production_alert_statamic' => 'Bu site Statamic Pro kullanıyor. Lütfen bir lisans satın alın.', + 'licensing_production_alert_statamik' => 'Bu site Statamik Pro kullanıyor. Lütfen bir lisans satın alın.', + 'licensing_production_alert_renew_statamik' => 'Statamik Pro\'nun bu sürümünü kullanmak için bir lisans yenilemesi gerekir.', 'licensing_sync_instructions' => 'statamic.com\'dan gelen veriler saatte bir senkronize edilir. Yaptığınız değişiklikleri görmek için bir senkronizasyonu zorlayın.', - 'licensing_trial_mode_alert' => 'Bu site Statamic Pro ve ticari eklentiler kullanıyor. Lansmandan önce lisans satın aldığınızdan emin olun. Teşekkürler!', + 'licensing_trial_mode_alert' => 'Bu site Statamik Pro ve ticari eklentiler kullanıyor. Lansmandan önce lisans satın aldığınızdan emin olun. Teşekkürler!', 'licensing_trial_mode_alert_addons' => 'Bu site ticari eklentiler kullanıyor. Lansmandan önce lisans satın aldığınızdan emin olun. Teşekkürler!', - 'licensing_trial_mode_alert_statamic' => 'Bu site Statamic Pro kullanıyor. Lansmandan önce bir lisans satın aldığınızdan emin olun. Teşekkürler!', + 'licensing_trial_mode_alert_statamik' => 'Bu site Statamik Pro kullanıyor. Lansmandan önce bir lisans satın aldığınızdan emin olun. Teşekkürler!', 'licensing_utility_description' => 'Lisans ayrıntılarını görüntüleyin ve çözün.', 'max_depth_instructions' => 'Sayfanın yuvalanabileceği maksimum düzey sayısı belirleyin. Limitsiz boş bırakın.', 'max_items_instructions' => 'Maksimum sayıda seçilebilir öğe ayarlayın.', - 'navigation_configure_blueprint_instructions' => 'Mevcut Planlardan birini seçin veya yeni bir tane oluşturun.', + 'navigation_configure_blueprint_instructions' => 'Mevcut planlardan birini seçin veya yeni bir tane oluşturun.', 'navigation_configure_collections_instructions' => 'Bu koleksiyonlardaki girişlere bağlanmayı etkinleştirin.', - 'navigation_configure_handle_instructions' => 'Ön uçta bu gezinmeye başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'navigation_configure_handle_instructions' => 'Ön uçta bu gezinmeye başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'navigation_configure_intro' => 'Gezinmeler, gezinme çubukları, altbilgiler, site haritaları ve diğer ön uç gezinme biçimleri oluşturmak için kullanılabilecek çok düzeyli bağlantı listeleridir.', + 'navigation_configure_select_across_sites' => 'Diğer sitelerden giriş seçimine izin ver.', 'navigation_configure_settings_intro' => 'Koleksiyonlara bağlanmayı etkinleştirin, maksimum bir derinlik ayarlayın ve diğer davranışlar.', 'navigation_configure_title_instructions' => '"Main Nav" veya "Footer Nav" gibi, kullanılacağı yerle eşleşen bir ad öneririz.', 'navigation_documentation_instructions' => 'Gezinmeler oluşturma, yapılandırma ve oluşturma hakkında daha fazla bilgi edinin.', @@ -148,11 +176,15 @@ 'outpost_error_422' => 'statamic.com ile iletişim kurulurken hata oluştu.', 'outpost_error_429' => 'statamic.com\'a çok fazla istek var.', 'outpost_issue_try_later' => 'statamic.com ile iletişimde bir sorun oluştu. Lütfen daha sonra tekrar deneyiniz.', + 'outpost_license_key_error' => 'Statamik sağlanan lisans anahtar dosyasını şifreleyemedi. Lütfen statamic.com\'dan yeniden indirin.', 'password_protect_enter_password' => 'Kilidi açmak için şifreyi girin', 'password_protect_incorrect_password' => 'Geçersiz şifre.', 'password_protect_token_invalid' => 'Geçersiz veya süresi dolmuş jeton.', 'password_protect_token_missing' => 'Güvenli belirteç eksik. Bu ekrana orijinal, korumalı URL\'den ulaşmalısınız.', 'phpinfo_utility_description' => 'PHP yapılandırma ayarlarını ve kurulu modülleri kontrol edin.', + 'preference_favorites_instructions' => 'Global arama çubuğunu açarken gösterilecek kısayollar. Alternatif olarak sayfaya gidip üstteki raptiye simgesini kullanarak listeye ekleyebilirsiniz.', + 'preference_locale_instructions' => 'Kontrol paneli için tercih edilen dil.', + 'preference_start_page_instructions' => 'Kontrol paneline giriş yapıldığında gösterilecek sayfa.', 'publish_actions_create_revision' => 'Çalışan kopyaya dayalı olarak bir revizyon oluşturulacaktır. Mevcut revizyon değişmeyecek.', 'publish_actions_current_becomes_draft_because_scheduled' => 'Mevcut revizyon yayınlandığından ve gelecekte bir tarih seçtiğinizden, gönderdikten sonra revizyon seçilen tarihe kadar bir taslak gibi davranacaktır.', 'publish_actions_publish' => 'Çalışma kopyasında yapılan değişiklikler girişe uygulanacak ve hemen yayınlanacaktır.', @@ -165,36 +197,61 @@ 'role_handle_instructions' => 'Ön uçta bu role başvurmak için tutamaçlar kullanılır. Kolayca değiştirilemez.', 'role_intro' => 'Roller, kullanıcılara ve kullanıcı gruplarına atanabilen erişim ve eylem izinleri gruplarıdır.', 'role_title_instructions' => 'Genellikle Editör veya Yönetici gibi tekil bir isim.', - 'search_utility_description' => 'Statamic\'in arama dizinleriyle ilgili önemli bilgileri yönetin ve görüntüleyin.', + 'search_utility_description' => 'Statamik\'in arama dizinleriyle ilgili önemli bilgileri yönetin ve görüntüleyin.', 'session_expiry_enter_password' => 'Kaldığınız yerden devam etmek için şifrenizi girin', 'session_expiry_logged_out_for_inactivity' => 'Bir süredir aktif olmadığınız için çıkış yaptınız.', 'session_expiry_logging_out_in_seconds' => 'Bir süredir aktif değilsiniz ve :saniye saniye içinde oturumunuz kapatılacak. Oturumunuzu uzatmak için tıklayın.', 'session_expiry_new_window' => 'Yeni bir pencerede açılır. Giriş yaptıktan sonra tekrar gelin.', - 'show_slugs_instructions' => 'Ağaç görünümünde kalıcı bağlantıların gösterilip gösterilmeyeceği.', - 'tabs_instructions' => 'Her bölümdeki alanlar sekmeler halinde gruplandırılacaktır. Yeni alanlar oluşturun, mevcut alanları yeniden kullanın veya mevcut alan kümelerinden tüm alan gruplarını içe aktarın.', + 'show_slugs_instructions' => 'Ağaç görünümünde slugların gösterilip gösterilmeyeceği.', + 'site_configure_attributes_instructions' => 'Şablonlarınızda erişebileceğiniz sitenizin yapılandırmasına ek öznitelikler ekleyin. [Daha fazla bilgi](https://statamic.dev/multi-site#additional-attributes).', + 'site_configure_handle_instructions' => 'Bu site için benzersiz bir referans. Daha sonra değiştirmesi zor olabilir.', + 'site_configure_lang_instructions' => '[Diller](https://statamic.dev/multi-site#language) hakkında bilgi edinin.', + 'site_configure_locale_instructions' => '[Yerelleştirme](https://statamic.dev/multi-site#locale) hakkında bilgi edinin.', + 'site_configure_name_instructions' => 'Kullanıcınin kontrol panelinde gösterilen ad.', + 'site_configure_url_instructions' => '[Site URL\'leri](https://statamic.dev/multi-site#urlhttps://statamic.dev/multi-site#url) hakkında bilgi edinin.', + 'status_expired_with_date' => ':date tarihinde süresi dolmuş', + 'status_published_with_date' => ':date tarihinde yayınlanmış', + 'status_scheduled_with_date' => ':date tarihinde yayınlanması planlanmış', + 'tabs_instructions' => 'Her bölümdeki alanlar sekme grupları halinde toplanacaktır. Yeni alanlar oluşturabilir, mevcut alanları yeniden kullanabilir veya var olan alan setlerinden tüm grupları içe aktarabilirsiniz.', 'taxonomies_blueprints_instructions' => 'Bu sınıflandırmadaki terimler bu planlardan herhangi birini kullanabilir.', 'taxonomies_collections_instructions' => 'Bu taksonomiyi kullanan koleksiyonlar.', + 'taxonomies_preview_target_refresh_instructions' => 'Düzenleme yaparken önizlemeyi otomatik olarak yenileyin. Bu özelliği devre dışı bırakmak postMessage kullanılmasını sağlar.', 'taxonomies_preview_targets_instructions' => 'Canlı Önizleme\'de görüntülenebilecek URL\'ler. [Belgelerde](https://statamic.dev/live-preview#preview-targets) daha fazla bilgi edinin.', - 'taxonomy_configure_handle_instructions' => 'Ön uçta bu sınıflandırmaya başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'taxonomy_configure_handle_instructions' => 'Ön uçta bu sınıflandırmaya başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'taxonomy_configure_intro' => 'Taksonomi, verileri kategori veya renk gibi bir dizi benzersiz özellik etrafında sınıflandırma sistemidir.', + 'taxonomy_configure_layout_instructions' => 'Bu taksonominin varsayılan düzenini ayarlayın. Terimler bu ayarı `layout` alanıyla geçersiz kılabilir.', + 'taxonomy_configure_template_instructions' => 'Bu taksonominin varsayılan şablonunu ayarlayın.', + 'taxonomy_configure_term_template_instructions' => 'Bu taksonominin varsayılan şablonunu ayarlayın. Terimler bu ayarı `template` alanıyla geçersiz kılabilir.', 'taxonomy_configure_title_instructions' => '"Kategoriler" veya "Etiketler" gibi çoğul bir isim kullanmanızı öneririz.', + 'taxonomy_next_steps_blueprints_description' => 'Bu taksonomi için kullanılabilir planları ve alanları yönetin.', 'taxonomy_next_steps_configure_description' => 'Adları yapılandırın, koleksiyonları ilişkilendirin, planları tanımlayın ve daha fazlasını yapın.', 'taxonomy_next_steps_create_term_description' => 'İlk terimi oluşturun veya bir avuç yer tutucu terimi çıkarın, bu size kalmış.', - 'taxonomy_next_steps_documentation_description' => 'Taksonomiler, nasıl çalıştıkları ve nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.', 'try_again_in_seconds' => '{0,1}Şimdi tekrar deneyin.|Saniye sayın sonra tekrar deneyin.', - 'user_groups_handle_instructions' => 'Ön uçta bu kullanıcı grubuna başvurmak için kullanılır. Daha sonra değiştirmek önemsizdir.', + 'units.B' => ':count B', + 'units.GB' => ':count GB', + 'units.KB' => ':count KB', + 'units.MB' => ':count MB', + 'units.ms' => ':countms', + 'units.s' => ':counts', + 'updater_require_version_command' => 'Belirli bir sürüm gerektirmek için aşağıdaki komutu çalıştırın', + 'updater_update_to_latest_command' => 'En son sürüme güncellemek için aşağıdaki komutu çalıştırın', + 'updates_available' => 'Güncellemeler mevcut!', + 'user_activation_email_not_sent_error' => 'Aktivasyon e-postası gönderilemedi. E-Posta yapılandırmanızı kontrol edin ve tekrar deneyin.', + 'user_groups_handle_instructions' => 'Ön uçta bu kullanıcı grubuna başvurmak için kullanılır. Daha sonra değiştirmesi zor olabilir.', 'user_groups_intro' => 'Kullanıcı grupları, kullanıcıları organize etmenize ve izin tabanlı rolleri toplu olarak uygulamanıza olanak tanır.', 'user_groups_role_instructions' => 'Bu gruptaki kullanıcılara ilgili tüm izinlerini vermek için roller atayın.', 'user_groups_title_instructions' => 'Editörler veya Fotoğrafçılar gibi genellikle çoğul bir isim', 'user_wizard_account_created' => 'Kullanıcı hesabı oluşturuldu.', - 'user_wizard_email_instructions' => 'E-posta adresi aynı zamanda bir kullanıcı adı görevi görür ve benzersiz olmalıdır.', + 'user_wizard_email_instructions' => 'E-Posta adresi aynı zamanda bir kullanıcı adı olarak da kullanılır ve benzersiz olmalıdır.', 'user_wizard_intro' => 'Kullanıcılara Denetim Masası üzerinden izinlerini, erişimlerini ve yeteneklerini özelleştiren roller atanabilir.', - 'user_wizard_invitation_body' => 'Bu web sitesini yönetmeye başlamak için :site adresindeki yeni Statamic hesabınızı etkinleştirin. Güvenliğiniz için aşağıdaki bağlantının süresi :expiry saatinden sonra sona erer. Bundan sonra, lütfen yeni bir şifre için site yöneticisiyle iletişime geçin.', + 'user_wizard_invitation_body' => 'Bu web sitesini yönetmeye başlamak için :site adresindeki yeni Statamik hesabınızı etkinleştirin. Güvenliğiniz için aşağıdaki bağlantının süresi :expiry saatinden sonra sona erer. Bundan sonra, lütfen yeni bir şifre için site yöneticisiyle iletişime geçin.', 'user_wizard_invitation_intro' => 'Yeni kullanıcıya hesap etkinleştirme ayrıntılarını içeren bir hoş geldiniz e-postası gönderin.', 'user_wizard_invitation_share' => 'Bu kimlik bilgilerini kopyalayın ve tercih ettiğiniz yöntemle :email ile paylaşın.', 'user_wizard_invitation_share_before' => 'Bir kullanıcı oluşturduktan sonra, tercih ettiğiniz yöntemle :email ile paylaşılacak ayrıntılar sağlanacaktır.', - 'user_wizard_invitation_subject' => ':site adresindeki yeni Statamic hesabınızı etkinleştirin', - 'user_wizard_name_instructions' => 'Kullanıcının doldurmasına izin vermek için adı boş bırakın.', + 'user_wizard_invitation_subject' => ':site adresindeki yeni Statamik hesabınızı etkinleştirin', + 'user_wizard_name_instructions' => 'Kullanıcı adını doldurmak için boş bırakın.', 'user_wizard_roles_groups_intro' => 'Kullanıcılara Denetim Masası üzerinden izinlerini, erişimlerini ve yeteneklerini özelleştiren roller atanabilir.', 'user_wizard_super_admin_instructions' => 'Süper yöneticiler, kontrol panelindeki her şeye tam kontrol ve erişime sahiptir. Bu rolü akıllıca verin.', + 'view_more_count' => ':count daha fazlasını görüntüle', + 'width_x_height' => ':width x :height', ]; diff --git a/resources/lang/tr/moment.php b/resources/lang/tr/moment.php new file mode 100644 index 0000000000..946488ee83 --- /dev/null +++ b/resources/lang/tr/moment.php @@ -0,0 +1,18 @@ + '%s içinde', + 'relativeTime.past' => '%s önce', + 'relativeTime.s' => 'birkaç saniye', + 'relativeTime.ss' => '%d saniye', + 'relativeTime.m' => 'bir dakika', + 'relativeTime.mm' => '%d dakika', + 'relativeTime.h' => 'bir saat', + 'relativeTime.hh' => '%d saat', + 'relativeTime.d' => 'bir gün', + 'relativeTime.dd' => '%d gün', + 'relativeTime.M' => 'bir ay', + 'relativeTime.MM' => '%d ay', + 'relativeTime.y' => 'bir yıl', + 'relativeTime.yy' => '%d yıl', +]; diff --git a/resources/lang/tr/permissions.php b/resources/lang/tr/permissions.php index 7252d057bd..11e97097cd 100644 --- a/resources/lang/tr/permissions.php +++ b/resources/lang/tr/permissions.php @@ -6,10 +6,16 @@ 'group_cp' => 'Kontrol Panel', 'access_cp' => 'Kontrol Paneline Erişin', 'access_cp_desc' => 'Kontrol paneline erişime izin verir, ancak içeride herhangi bir şey yapılabileceğini garanti etmez.', + 'configure_sites' => 'Siteleri Yapılandır', + 'configure_sites_desc' => 'Çoklu site etkinleştirildiğinde siteleri yapılandırma yeteneği.', 'configure_fields' => 'Alanları Yapılandır', 'configure_fields_desc' => 'Planları, alan kümelerini ve alanlarını düzenleme yeteneği.', 'configure_addons' => 'Eklentileri Yapılandır', 'configure_addons_desc' => 'Eklentileri yüklemek ve kaldırmak için eklenti alanına erişme yeteneği.', + 'manage_preferences' => 'Tercihleri Yönet', + 'manage_preferences_desc' => 'Genel ve rol bazında tercihleri özelleştirme yeteneği.', + 'group_sites' => 'Siteler', + 'access_{site}_site' => ':site sitesine erişim', 'group_collections' => 'Koleksiyonlar', 'configure_collections' => 'Koleksiyonları Yapılandır', 'configure_collections_desc' => 'Koleksiyonla ilgili tüm izinlere erişim izni verir', @@ -54,16 +60,21 @@ 'group_forms' => 'Formlar', 'configure_forms' => 'Formları yapılandır', 'configure_forms_desc' => 'Formla ilgili tüm izinlere erişim izni verir', + 'configure_form_fields' => 'Form Alanlarını Yapılandır', + 'configure_form_fields_desc' => 'Form planlarını, alan setlarını ve onlarin alanlarını düzenleme yeteneği.', 'view_{form}_form_submissions' => ':form gönderilerini görüntüle', 'delete_{form}_form_submissions' => ':form gönderilerini sil', 'group_users' => 'Kullanıcılar', 'view_users' => 'Kullanıcıları görüntüle', 'edit_users' => 'Kullanıcıları düzenle', 'create_users' => 'Kullanıcı oluştur', - 'delete_users' => 'Kullanıcı Sil', + 'delete_users' => 'Kullanıcı sil', 'change_passwords' => 'Şifre değiştir', 'edit_user_groups' => 'Grupları düzenle', 'edit_roles' => 'Rolleri düzenle', + 'assign_user_groups' => 'Kullanıcılara gruplar atama', + 'assign_roles' => 'Kullanıcılara roller atama', + 'impersonate_users' => 'Kullanıcıları taklit etme', 'group_updates' => 'Güncellemeler', 'view_updates' => 'Güncellemeleri görüntüle', 'group_utilities' => 'Araçlar', @@ -72,6 +83,6 @@ 'group_misc' => 'Çeşitli', 'resolve_duplicate_ids' => 'Yinelenen IDleri Çöz', 'resolve_duplicate_ids_desc' => 'Yinelenen IDleri görme ve çözme yeteneği verir.', - 'view_graphql' => 'GraphQL görüntüle', + 'view_graphql' => 'GraphQL Görüntüle', 'view_graphql_desc' => 'GraphQL görüntüleyicisine erişme yeteneği verir', ]; diff --git a/resources/lang/tr/validation.php b/resources/lang/tr/validation.php index 16356d1029..e524f87b02 100644 --- a/resources/lang/tr/validation.php +++ b/resources/lang/tr/validation.php @@ -10,20 +10,21 @@ 'alpha_dash' => ':attribute sadece harfler, rakamlar ve tirelerden oluşmalıdır.', 'alpha_num' => ':attribute sadece harfler ve rakamlar içermelidir.', 'array' => ':attribute dizi olmalıdır.', + 'ascii' => 'Yalnızca tek baytlık alfasayısal karakterler ve semboller içermelidir.', 'before' => ':attribute değeri :date tarihinden önce olmalıdır.', 'before_or_equal' => ':attribute değeri :date tarihinden önce veya eşit olmalıdır.', - 'between' => [ - 'numeric' => ':attribute :min - :max arasında olmalıdır.', - 'file' => ':attribute :min - :max arasındaki kilobayt değeri olmalıdır.', - 'string' => ':attribute :min - :max arasında karakterden oluşmalıdır.', - 'array' => ':attribute :min - :max arasında nesneye sahip olmalıdır.', - ], + 'between.array' => ':attribute :min - :max arasında nesneye sahip olmalıdır.', + 'between.file' => ':attribute :min - :max arasındaki kilobayt değeri olmalıdır.', + 'between.numeric' => ':attribute :min - :max arasında olmalıdır.', + 'between.string' => ':attribute :min - :max arasında karakterden oluşmalıdır.', 'boolean' => ':attribute sadece doğru veya yanlış olmalıdır.', + 'can' => 'Yetkisiz bir değer içerir.', 'confirmed' => ':attribute tekrarı eşleşmiyor.', 'current_password' => 'Parola hatalı.', 'date' => ':attribute geçerli bir tarih olmalıdır.', 'date_equals' => ':attribute ile :date aynı tarihler olmalıdır.', 'date_format' => ':attribute :format biçimi ile eşleşmiyor.', + 'decimal' => ':decimal ondalık basamağa sahip olmalıdır.', 'declined' => ':attribute kabul edilmemelidir.', 'declined_if' => ':attribute, :other :value olduğunda kabul edilmemelidir.', 'different' => ':attribute ile :other birbirinden farklı olmalıdır.', @@ -31,24 +32,22 @@ 'digits_between' => ':attribute :min ile :max arasında haneden oluşmalıdır.', 'dimensions' => ':attribute görsel ölçüleri geçersiz.', 'distinct' => ':attribute alanı yinelenen bir değere sahip.', + 'doesnt_end_with' => 'Sonrakilerden biriyle bitmemelidir: :values.', + 'doesnt_start_with' => 'Sonrakilerden biriyle başlamamalıdır: :values.', 'email' => ':attribute alanına girilen e-posta adresi geçersiz.', 'ends_with' => ':attribute, şunlardan biriyle bitmelidir :values', 'enum' => 'Seçili :attribute geçersiz.', 'exists' => 'Seçili :attribute geçersiz.', 'file' => ':attribute dosya olmalıdır.', 'filled' => ':attribute alanının doldurulması zorunludur.', - 'gt' => [ - 'numeric' => ':attribute, :value değerinden büyük olmalı.', - 'file' => ':attribute, :value kilobayt boyutundan büyük olmalı.', - 'string' => ':attribute, :value karakterden uzun olmalı.', - 'array' => ':attribute, :value taneden fazla olmalı.', - ], - 'gte' => [ - 'numeric' => ':attribute, :value kadar veya daha fazla olmalı.', - 'file' => ':attribute, :value kilobayt boyutu kadar veya daha büyük olmalı.', - 'string' => ':attribute, :value karakter kadar veya daha uzun olmalı.', - 'array' => ':attribute, :value tane veya daha fazla olmalı.', - ], + 'gt.array' => ':attribute, :value taneden fazla olmalı.', + 'gt.file' => ':attribute, :value kilobayt boyutundan büyük olmalı.', + 'gt.numeric' => ':attribute, :value değerinden büyük olmalı.', + 'gt.string' => ':attribute, :value karakterden uzun olmalı.', + 'gte.array' => ':attribute, :value tane veya daha fazla olmalı.', + 'gte.file' => ':attribute, :value kilobayt boyutu kadar veya daha büyük olmalı.', + 'gte.numeric' => ':attribute, :value kadar veya daha fazla olmalı.', + 'gte.string' => ':attribute, :value karakter kadar veya daha uzun olmalı.', 'image' => ':attribute alanı resim dosyası olmalıdır.', 'in' => ':attribute değeri geçersiz.', 'in_array' => ':attribute alanı :other içinde mevcut değil.', @@ -57,38 +56,37 @@ 'ipv4' => ':attribute geçerli bir IPv4 adresi olmalıdır.', 'ipv6' => ':attribute geçerli bir IPv6 adresi olmalıdır.', 'json' => ':attribute geçerli bir JSON değişkeni olmalıdır.', - 'lt' => [ - 'numeric' => ':attribute, :value değerinden küçük olmalı.', - 'file' => ':attribute, :value kilobayt boyutundan küçük olmalı.', - 'string' => ':attribute, :value karakterden kısa olmalı.', - 'array' => ':attribute, :value taneden az olmalı.', - ], - 'lte' => [ - 'numeric' => ':attribute, :value kadar veya daha küçük olmalı.', - 'file' => ':attribute, :value kilobayt boyutu kadar veya daha küçük olmalı.', - 'string' => ':attribute, :value karakter kadar veya daha kısa olmalı.', - 'array' => ':attribute, :value tane veya daha az olmalı.', - ], + 'lowercase' => 'Küçük harf olmalıdır.', + 'lt.array' => ':attribute, :value taneden az olmalı.', + 'lt.file' => ':attribute, :value kilobayt boyutundan küçük olmalı.', + 'lt.numeric' => ':attribute, :value değerinden küçük olmalı.', + 'lt.string' => ':attribute, :value karakterden kısa olmalı.', + 'lte.array' => ':attribute, :value tane veya daha az olmalı.', + 'lte.file' => ':attribute, :value kilobayt boyutu kadar veya daha küçük olmalı.', + 'lte.numeric' => ':attribute, :value kadar veya daha küçük olmalı.', + 'lte.string' => ':attribute, :value karakter kadar veya daha kısa olmalı.', 'mac_address' => ':attribute geçerli bir MAC adresi olmalıdır.', - 'max' => [ - 'numeric' => ':attribute değeri en çok :max olmalıdır.', - 'file' => ':attribute boyutu en çok :max kilobayt olmalıdır.', - 'string' => ':attribute uzunluğu en çok :max karakter olmalıdır.', - 'array' => ':attribute en çok :max nesneye sahip olmalıdır.', - ], + 'max.array' => ':attribute en çok :max nesneye sahip olmalıdır.', + 'max.file' => ':attribute boyutu en çok :max kilobayt olmalıdır.', + 'max.numeric' => ':attribute değeri en çok :max olmalıdır.', + 'max.string' => ':attribute uzunluğu en çok :max karakter olmalıdır.', + 'max_digits' => 'En fazla :max basamaklı olmalıdır.', 'mimes' => ':attribute dosya biçimi :values olmalıdır.', 'mimetypes' => ':attribute dosya biçimi :values olmalıdır.', - 'min' => [ - 'numeric' => ':attribute değeri en az :min olmalıdır.', - 'file' => ':attribute boyutu en az :min kilobayt olmalıdır.', - 'string' => ':attribute uzunluğu en az :min karakter olmalıdır.', - 'array' => ':attribute en az :min nesneye sahip olmalıdır.', - ], + 'min.array' => ':attribute en az :min nesneye sahip olmalıdır.', + 'min.file' => ':attribute boyutu en az :min kilobayt olmalıdır.', + 'min.numeric' => ':attribute değeri en az :min olmalıdır.', + 'min.string' => ':attribute uzunluğu en az :min karakter olmalıdır.', + 'min_digits' => 'En az :min basamaklı olmalıdır.', + 'missing' => 'Gönderilen veriler arasında olmaması gerekir.', + 'missing_if' => ':other alanı :value değerine eşit olduğunda, bu alan gönderilen verilere dahil edilmemelidir.', + 'missing_unless' => ':other\'ın değeri :value\'ye eşit olmadığı sürece bu gönderilen verilerde olmamalıdır.', + 'missing_with' => ':values geçirilen verilerin arasında olduğu sürece aralarında olmamalıdır.', + 'missing_with_all' => ':values geçirilen verilerin arasında olduğu sürece aralarında olmamalıdır.', 'multiple_of' => ':attribute, :value değerinin katları olmalıdır.', 'not_in' => 'Seçili :attribute geçersiz.', 'not_regex' => ':attribute biçimi geçersiz.', 'numeric' => ':attribute sayı olmalıdır.', - 'password' => 'Parola geçersiz.', 'present' => ':attribute alanı mevcut olmalıdır.', 'prohibited' => ':attribute alanını gönderemezsiniz.', 'prohibited_if' => ':other değeri :value olduğunda :attribute alanını gönderemezsiniz.', @@ -98,29 +96,56 @@ 'required' => ':attribute alanı gereklidir.', 'required_array_keys' => ':attribute alanı, :değerler için girişler içermelidir.', 'required_if' => ':attribute alanı, :other :value değerine sahip olduğunda zorunludur.', + 'required_if_accepted' => ':other kabul edildiğinde bu alan gereklidir.', 'required_unless' => ':attribute alanı, :other alanı :value değerlerinden birine sahip olmadığında zorunludur.', 'required_with' => ':attribute alanı :values varken zorunludur.', 'required_with_all' => ':attribute alanı herhangi bir :values değeri varken zorunludur.', 'required_without' => ':attribute alanı :values yokken zorunludur.', 'required_without_all' => ':attribute alanı :values değerlerinden herhangi biri yokken zorunludur.', 'same' => ':attribute ile :other eşleşmelidir.', - 'size' => [ - 'numeric' => ':attribute :size olmalıdır.', - 'file' => ':attribute :size kilobyte olmalıdır.', - 'string' => ':attribute :size karakter olmalıdır.', - 'array' => ':attribute :size nesneye sahip olmalıdır.', - ], + 'size.array' => ':attribute :size nesneye sahip olmalıdır.', + 'size.file' => ':attribute :size kilobyte olmalıdır.', + 'size.numeric' => ':attribute :size olmalıdır.', + 'size.string' => ':attribute :size karakter olmalıdır.', 'starts_with' => ':attribute şunlardan biri ile başlamalıdır: :values', 'string' => ':attribute dizge olmalıdır.', 'timezone' => ':attribute geçerli bir saat dilimi olmalıdır.', + 'ulid' => 'Geçerli bir ULID olmalıdır.', 'unique' => ':attribute daha önceden kayıt edilmiş.', 'uploaded' => ':attribute yüklemesi başarısız.', + 'uppercase' => 'Büyük harf olmalıdır.', 'url' => ':attribute biçimi geçersiz.', 'uuid' => ':attribute bir UUID formatına uygun olmalı.', - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => '', - ], - ], + 'arr_fieldtype' => 'Geçersiz', + 'handle' => 'Sadece küçük Latin harfleri, rakamlar ve ayraç olarak alt çizgi (_) içermelidir.', + 'slug' => 'Sadece harfler, rakamlar ve ayraç olarak tire (-) veya alt çizgi (_) içermelidir.', + 'code_fieldtype_rulers' => 'Geçersiz', + 'composer_package' => 'Geçerli bir Composer paket adı olmalıdır (örneğin, hasselhoff/kung-fury).', + 'date_fieldtype_date_required' => 'Tarih gereklidir.', + 'date_fieldtype_end_date_invalid' => 'Bitiş tarihi geçerli değil.', + 'date_fieldtype_end_date_required' => 'Bitiş tarihi gereklidir.', + 'date_fieldtype_only_single_mode_allowed' => 'Eğer alanın tutamaçı "date" ise, yalnızca "tek" modunu kullanabilirsiniz.', + 'date_fieldtype_start_date_invalid' => 'Başlangıç tarihi geçerli değil.', + 'date_fieldtype_start_date_required' => 'Başlangıç tarihi gereklidir.', + 'date_fieldtype_time_required' => 'Saat gereklidir.', + 'duplicate_field_handle' => ':handle ile bu alan birden fazla kez kullanılamaz.', + 'duplicate_uri' => 'Tekrarlanan yol (URI): :value', + 'email_available' => 'Bu e-posta ile bir kullanıcı zaten var.', + 'fieldset_imported_recursively' => ':handle alan seti özyinelemeli olarak içe aktarıldı.', + 'one_site_without_origin' => 'En az bir site kaynaksız olmalıdır.', + 'options_require_keys' => 'Tüm seçeneklerin anahtarları olmalıdır.', + 'origin_cannot_be_disabled' => 'Kaynağı devre dışı bırakmak mümkün değildir.', + 'parent_cannot_be_itself' => 'Kendisini ebeveyn olarak seçemezsiniz.', + 'parent_causes_root_children' => 'Bu, ana sayfaya çocuk eklenmesine izin verir.', + 'parent_exceeds_max_depth' => 'Maksimum derinliği aşıyor.', + 'reserved' => 'Bu bir rezerve kelimedir.', + 'reserved_field_handle' => ":handle handle'ına sahip alan bir rezerve kelimedir.", + 'unique_entry_value' => 'Bu değer daha önce seçilmiştir.', + 'unique_form_handle' => 'Bu değer daha önce seçilmiştir.', + 'unique_term_value' => 'Bu değer daha önce seçilmiştir.', + 'unique_user_value' => 'Bu değer daha önce seçilmiştir.', + 'unique_uri' => 'Bu yol (URI) daha önce seçilmiştir.', + 'time' => 'Geçerli bir saat değil.', + 'custom.attribute-name.rule-name' => 'custom-message', 'attributes' => [], ]; From 4ea872b41f3a9430c80731dc52467e590cdc59a1 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 29 Jul 2024 10:19:18 -0400 Subject: [PATCH 012/249] changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b5caee1c..8d0826225f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Release Notes +## 5.17.1 (2024-07-29) + +### What's fixed +- BulkAugmentor handles iterables that don't have sequential numeric keys [#10512](https://github.com/statamic/cms/issues/10512) by @kingsven +- Correct issue where search result supplemental data is not available [#10386](https://github.com/statamic/cms/issues/10386) by @JohnathonKoster +- Prevent using `type` as a handle for fields in sets [#10507](https://github.com/statamic/cms/issues/10507) by @duncanmcclean +- Fix button group and radio previews [#10501](https://github.com/statamic/cms/issues/10501) by @jacksleight +- Add frontMatter method to docblock for Parse facade [#10509](https://github.com/statamic/cms/issues/10509) by @godismyjudge95 +- Don't enforce a query length on comb searches [#10496](https://github.com/statamic/cms/issues/10496) by @ryanmitchell +- Fix the "Learn More" translation and link [#10497](https://github.com/statamic/cms/issues/10497) by @peimn +- Remove metadata in EntriesTest [#10491](https://github.com/statamic/cms/issues/10491) by @ryanmitchell +- Fix Date Picker dark mode bg color [#10499](https://github.com/statamic/cms/issues/10499) by @jackmcdade +- Sync datetime dark mode with control panel [#10488](https://github.com/statamic/cms/issues/10488) by @peimn +- Turkish translations [#10518](https://github.com/statamic/cms/issues/10518) by @peimn + + + ## 5.17.0 (2024-07-22) ### What's new From 73b97f9f2f92a86af5898b03cf67cbee4ca9958e Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 29 Jul 2024 16:59:39 +0100 Subject: [PATCH 013/249] [5.x] Dictionaries (#10380) Co-authored-by: duncanmcclean Co-authored-by: Jason Varga --- .../fieldtypes/dictionary-fields.css | 20 ++ resources/css/cp.css | 1 + resources/css/vendors/vue-select.css | 6 + resources/js/bootstrap/fieldtypes.js | 4 + .../fieldtypes/DictionaryFields.vue | 82 +++++ .../fieldtypes/DictionaryFieldtype.vue | 200 ++++++++++++ resources/lang/en/fieldtypes.php | 4 + resources/lang/en/messages.php | 1 + resources/svg/icons/light/dictionary.svg | 1 + .../forms/fields/dictionary.antlers.html | 21 ++ .../views/forms/automagic-email.antlers.html | 2 +- routes/cp.php | 2 + src/Console/Commands/MakeDictionary.php | 74 +++++ .../Commands/stubs/dictionary.php.stub | 21 ++ src/Dictionaries/BasicDictionary.php | 69 ++++ src/Dictionaries/Countries.php | 299 ++++++++++++++++++ src/Dictionaries/Currencies.php | 138 ++++++++ src/Dictionaries/Dictionary.php | 71 +++++ src/Dictionaries/DictionaryRepository.php | 30 ++ src/Dictionaries/File.php | 85 +++++ src/Dictionaries/Item.php | 43 +++ src/Dictionaries/Timezones.php | 33 ++ .../DictionaryNotFoundException.php | 11 + .../UndefinedDictionaryException.php | 13 + src/Facades/Dictionary.php | 20 ++ src/Fieldtypes/Dictionary.php | 168 ++++++++++ src/Fieldtypes/DictionaryFields.php | 100 ++++++ src/GraphQL/Types/DictionaryType.php | 19 ++ .../DictionaryFieldtypeController.php | 46 +++ src/Providers/AddonServiceProvider.php | 16 + src/Providers/ConsoleServiceProvider.php | 1 + src/Providers/ExtensionServiceProvider.php | 16 + .../Concerns/CleansUpGeneratedPaths.php | 1 + tests/Console/Commands/MakeDictionaryTest.php | 92 ++++++ tests/Dictionaries/CountriesTest.php | 99 ++++++ tests/Dictionaries/CurrenciesTest.php | 107 +++++++ .../Dictionaries/DictionaryRepositoryTest.php | 97 ++++++ tests/Dictionaries/FileTest.php | 183 +++++++++++ tests/Dictionaries/ItemTest.php | 31 ++ tests/Dictionaries/TimezonesTest.php | 115 +++++++ .../Fieldtypes/DictionaryFieldtypeTest.php | 91 ++++++ tests/Fieldtypes/DictionaryFieldsTest.php | 156 +++++++++ tests/Fieldtypes/DictionaryTest.php | 245 ++++++++++++++ 43 files changed, 2833 insertions(+), 1 deletion(-) create mode 100644 resources/css/components/fieldtypes/dictionary-fields.css create mode 100644 resources/js/components/fieldtypes/DictionaryFields.vue create mode 100644 resources/js/components/fieldtypes/DictionaryFieldtype.vue create mode 100644 resources/svg/icons/light/dictionary.svg create mode 100644 resources/views/extend/forms/fields/dictionary.antlers.html create mode 100644 src/Console/Commands/MakeDictionary.php create mode 100644 src/Console/Commands/stubs/dictionary.php.stub create mode 100644 src/Dictionaries/BasicDictionary.php create mode 100644 src/Dictionaries/Countries.php create mode 100644 src/Dictionaries/Currencies.php create mode 100644 src/Dictionaries/Dictionary.php create mode 100644 src/Dictionaries/DictionaryRepository.php create mode 100644 src/Dictionaries/File.php create mode 100644 src/Dictionaries/Item.php create mode 100644 src/Dictionaries/Timezones.php create mode 100644 src/Exceptions/DictionaryNotFoundException.php create mode 100644 src/Exceptions/UndefinedDictionaryException.php create mode 100644 src/Facades/Dictionary.php create mode 100644 src/Fieldtypes/Dictionary.php create mode 100644 src/Fieldtypes/DictionaryFields.php create mode 100644 src/GraphQL/Types/DictionaryType.php create mode 100644 src/Http/Controllers/CP/Fieldtypes/DictionaryFieldtypeController.php create mode 100644 tests/Console/Commands/MakeDictionaryTest.php create mode 100644 tests/Dictionaries/CountriesTest.php create mode 100644 tests/Dictionaries/CurrenciesTest.php create mode 100644 tests/Dictionaries/DictionaryRepositoryTest.php create mode 100644 tests/Dictionaries/FileTest.php create mode 100644 tests/Dictionaries/ItemTest.php create mode 100644 tests/Dictionaries/TimezonesTest.php create mode 100644 tests/Feature/GraphQL/Fieldtypes/DictionaryFieldtypeTest.php create mode 100644 tests/Fieldtypes/DictionaryFieldsTest.php create mode 100644 tests/Fieldtypes/DictionaryTest.php diff --git a/resources/css/components/fieldtypes/dictionary-fields.css b/resources/css/components/fieldtypes/dictionary-fields.css new file mode 100644 index 0000000000..f910a979a1 --- /dev/null +++ b/resources/css/components/fieldtypes/dictionary-fields.css @@ -0,0 +1,20 @@ +.dictionary_fields-fieldtype { + @apply p-0; + + .publish-fields { + @apply w-full; + } + + .config-field { + @apply md:flex flex-wrap border-b border-gray-400 dark:border-dark-900 w-full; + @apply p-3 @sm:p-4 m-0; + + .field-inner { + @apply w-full md:w-1/2 rtl:md:pl-8 ltr:md:pr-8; + } + + .field-inner + div { + @apply w-full md:w-1/2; + } + } +} diff --git a/resources/css/cp.css b/resources/css/cp.css index 791941b281..0c9768b493 100644 --- a/resources/css/cp.css +++ b/resources/css/cp.css @@ -58,6 +58,7 @@ @import "components/fieldtypes/checkboxes"; @import "components/fieldtypes/code"; @import "components/fieldtypes/datetime"; +@import "components/fieldtypes/dictionary-fields"; @import "components/fieldtypes/environment"; @import "components/fieldtypes/grid"; @import "components/fieldtypes/hidden"; diff --git a/resources/css/vendors/vue-select.css b/resources/css/vendors/vue-select.css index f4cfbbc050..4f2222c637 100644 --- a/resources/css/vendors/vue-select.css +++ b/resources/css/vendors/vue-select.css @@ -173,6 +173,12 @@ &.sortable-item { @apply !cursor-grab; } + &.invalid { + @apply border-red-300 dark:border-dark-red bg-red-100 dark:bg-red-400 text-red-500 dark:text-red-950; + background-image: none; + + .vs__deselect { @apply text-red-500 dark:text-red-950 } + } } .vs__deselect { diff --git a/resources/js/bootstrap/fieldtypes.js b/resources/js/bootstrap/fieldtypes.js index 245cb53d69..fb18e8689c 100644 --- a/resources/js/bootstrap/fieldtypes.js +++ b/resources/js/bootstrap/fieldtypes.js @@ -24,6 +24,8 @@ import Routes from '../components/collections/Routes.vue'; import TitleFormats from '../components/collections/TitleFormats.vue'; import ColorFieldtype from '../components/fieldtypes/ColorFieldtype.vue'; import DateFieldtype from '../components/fieldtypes/DateFieldtype.vue'; +import DictionaryFieldtype from "../components/fieldtypes/DictionaryFieldtype.vue"; +import DictionaryFields from "../components/fieldtypes/DictionaryFields.vue"; import FieldDisplayFieldtype from '../components/fieldtypes/FieldDisplayFieldtype.vue'; import FieldsFieldtype from '../components/fieldtypes/grid/FieldsFieldtype.vue'; import FilesFieldtype from '../components/fieldtypes/FilesFieldtype.vue'; @@ -86,6 +88,8 @@ Vue.component('collection_routes-fieldtype', Routes); Vue.component('collection_title_formats-fieldtype', TitleFormats); Vue.component('color-fieldtype', ColorFieldtype); Vue.component('date-fieldtype', DateFieldtype); +Vue.component('dictionary-fieldtype', DictionaryFieldtype); +Vue.component('dictionary_fields-fieldtype', DictionaryFields); Vue.component('field_display-fieldtype', FieldDisplayFieldtype); Vue.component('fields-fieldtype', FieldsFieldtype); Vue.component('files-fieldtype', FilesFieldtype); diff --git a/resources/js/components/fieldtypes/DictionaryFields.vue b/resources/js/components/fieldtypes/DictionaryFields.vue new file mode 100644 index 0000000000..6c92a372d0 --- /dev/null +++ b/resources/js/components/fieldtypes/DictionaryFields.vue @@ -0,0 +1,82 @@ + + + diff --git a/resources/js/components/fieldtypes/DictionaryFieldtype.vue b/resources/js/components/fieldtypes/DictionaryFieldtype.vue new file mode 100644 index 0000000000..7cf2d83611 --- /dev/null +++ b/resources/js/components/fieldtypes/DictionaryFieldtype.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/resources/lang/en/fieldtypes.php b/resources/lang/en/fieldtypes.php index 050eb22567..58f8b983b6 100644 --- a/resources/lang/en/fieldtypes.php +++ b/resources/lang/en/fieldtypes.php @@ -72,6 +72,10 @@ 'date.config.time_enabled' => 'Enable the timepicker.', 'date.config.time_seconds_enabled' => 'Show seconds in the timepicker.', 'date.title' => 'Date', + 'dictionary.config.dictionary' => 'The dictionary you wish to pull options from.', + 'dictionary.file.config.filename' => 'The filename containing your options, relative to the `resources/dictionaries` directory.', + 'dictionary.file.config.label' => "The key containing the options' labels. By default it's `label`. Alternatively, you may use Antlers.", + 'dictionary.file.config.value' => "The key containing the options' values. By default it's `value`.", 'entries.config.create' => 'Allow creation of new entries.', 'entries.config.collections' => 'Choose which collections the user can select from.', 'entries.config.query_scopes' => 'Choose which query scopes should be applied when retrieving selectable entries.', diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index e218aa22c7..1ac3670ab5 100644 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -69,6 +69,7 @@ 'collections_sort_direction_instructions' => 'The default sort direction.', 'collections_preview_target_refresh_instructions' => 'Automatically refresh the preview while editing. Disabling this will use postMessage.', 'collections_taxonomies_instructions' => 'Connect entries in this collection to taxonomies. Fields will be automatically added to publish forms.', + 'dictionaries_countries_region_instructions' => 'Optionally filter the countries by region.', 'duplicate_action_warning_localization' => 'This entry is a localization. The origin entry will be duplicated.', 'duplicate_action_warning_localizations' => 'One or more selected entries are localizations. In those cases, the origin entry will be duplicated instead.', 'duplicate_action_localizations_confirmation' => 'Are you sure you want to run this action? Localizations will also be duplicated.', diff --git a/resources/svg/icons/light/dictionary.svg b/resources/svg/icons/light/dictionary.svg new file mode 100644 index 0000000000..4147382376 --- /dev/null +++ b/resources/svg/icons/light/dictionary.svg @@ -0,0 +1 @@ + diff --git a/resources/views/extend/forms/fields/dictionary.antlers.html b/resources/views/extend/forms/fields/dictionary.antlers.html new file mode 100644 index 0000000000..b093f6a026 --- /dev/null +++ b/resources/views/extend/forms/fields/dictionary.antlers.html @@ -0,0 +1,21 @@ + diff --git a/resources/views/forms/automagic-email.antlers.html b/resources/views/forms/automagic-email.antlers.html index f8fd90528b..cab5234e64 100644 --- a/resources/views/forms/automagic-email.antlers.html +++ b/resources/views/forms/automagic-email.antlers.html @@ -12,7 +12,7 @@ {{ elseif fieldtype == "radio" }} {{ value:label ?? value }} - {{ elseif fieldtype == "select" || fieldtype == "checkboxes" }} + {{ elseif fieldtype == "select" || fieldtype == "checkboxes" || fieldtype == "dictionary" }} {{ value }}{{ label ?? value }}{{ if !last }}, {{ /if }}{{ /value }} {{ elseif value|is_iterable }} diff --git a/routes/cp.php b/routes/cp.php index 959e0f63c1..75af4e9206 100644 --- a/routes/cp.php +++ b/routes/cp.php @@ -45,6 +45,7 @@ use Statamic\Http\Controllers\CP\Fields\FieldsetController; use Statamic\Http\Controllers\CP\Fields\FieldtypesController; use Statamic\Http\Controllers\CP\Fields\MetaController; +use Statamic\Http\Controllers\CP\Fieldtypes\DictionaryFieldtypeController; use Statamic\Http\Controllers\CP\Fieldtypes\FilesFieldtypeController; use Statamic\Http\Controllers\CP\Fieldtypes\MarkdownFieldtypeController; use Statamic\Http\Controllers\CP\Fieldtypes\RelationshipFieldtypeController; @@ -309,6 +310,7 @@ Route::get('relationship/filters', [RelationshipFieldtypeController::class, 'filters'])->name('relationship.filters'); Route::post('markdown', [MarkdownFieldtypeController::class, 'preview'])->name('markdown.preview'); Route::post('files/upload', [FilesFieldtypeController::class, 'upload'])->name('files.upload'); + Route::get('dictionaries/{dictionary}', DictionaryFieldtypeController::class)->name('dictionary-fieldtype'); }); Route::group(['prefix' => 'api', 'as' => 'api.'], function () { diff --git a/src/Console/Commands/MakeDictionary.php b/src/Console/Commands/MakeDictionary.php new file mode 100644 index 0000000000..f1a8618496 --- /dev/null +++ b/src/Console/Commands/MakeDictionary.php @@ -0,0 +1,74 @@ +argument('addon')) { + $this->updateServiceProvider(); + } + } + + /** + * Update the Service Provider to register dictionary components. + */ + protected function updateServiceProvider() + { + $factory = new BuilderFactory(); + + $dictionaryClassValue = $factory->classConstFetch('Dictionaries\\'.$this->getNameInput(), 'class'); + + try { + PHPFile::load("addons/{$this->package}/src/ServiceProvider.php") + ->add()->protected()->property('dictionaries', $dictionaryClassValue) + ->save(); + } catch (\Exception $e) { + $this->comment("Don't forget to register the Dictionary class in your addon's service provider."); + } + } +} diff --git a/src/Console/Commands/stubs/dictionary.php.stub b/src/Console/Commands/stubs/dictionary.php.stub new file mode 100644 index 0000000000..05b2bc54ef --- /dev/null +++ b/src/Console/Commands/stubs/dictionary.php.stub @@ -0,0 +1,21 @@ + 'Alabama', 'abbr' => 'AL', 'capital' => 'Montgomery'], + ['name' => 'Alaska', 'abbr' => 'AK', 'capital' => 'Juneau'], + ['name' => 'Arizona', 'abbr' => 'AZ', 'capital' => 'Phoenix'], + // ... + ]; + } +} diff --git a/src/Dictionaries/BasicDictionary.php b/src/Dictionaries/BasicDictionary.php new file mode 100644 index 0000000000..45d6e5f322 --- /dev/null +++ b/src/Dictionaries/BasicDictionary.php @@ -0,0 +1,69 @@ +collectItems()->get($key); + } + + public function options(?string $search = null): array + { + return $this + ->getFilteredItems() + ->when($search, fn ($collection) => $collection->filter(fn ($item) => $this->matchesSearchQuery($search, $item))) + ->mapWithKeys(fn (Item $item) => [$item->value() => $item->label()]) + ->all(); + } + + protected function getFilteredItems(): Collection + { + return $this->collectItems(); + } + + protected function collectItems(): Collection + { + return collect($this->getItems())->mapWithKeys(function ($arr) { + $item = new Item($key = $this->getItemValue($arr), $this->getItemLabel($arr), $arr); + + return [$key => $item]; + }); + } + + protected function getItemValue(array $item): string + { + return $item[$this->valueKey]; + } + + protected function getItemLabel(array $item): string + { + return $item[$this->labelKey]; + } + + protected function matchesSearchQuery(string $query, Item $item): bool + { + $query = strtolower($query); + + foreach ($item->data() as $key => $value) { + if (! empty($this->searchable) && ! in_array($key, $this->searchable)) { + continue; + } + + if (str_contains(strtolower($value), $query)) { + return true; + } + } + + return false; + } + + abstract protected function getItems(): array; +} diff --git a/src/Dictionaries/Countries.php b/src/Dictionaries/Countries.php new file mode 100644 index 0000000000..669c20ec15 --- /dev/null +++ b/src/Dictionaries/Countries.php @@ -0,0 +1,299 @@ + 'Africa', + 'americas' => 'Americas', + 'asia' => 'Asia', + 'europe' => 'Europe', + 'oceania' => 'Oceania', + 'polar' => 'Polar', + ]; + + protected function getItemLabel(array $item): string + { + return "{$item['emoji']} {$item['name']}"; + } + + protected function fieldItems() + { + return [ + 'region' => [ + 'display' => __('Region'), + 'instructions' => __('statamic::messages.dictionaries_countries_region_instructions'), + 'type' => 'select', + 'options' => $this->regions, + ], + ]; + } + + protected function getFilteredItems(): Collection + { + return $this + ->collectItems() + ->when($this->config['region'] ?? false, fn ($collection, $region) => $collection->where('region', $this->regions[$region])); + } + + protected function getItems(): array + { + return [ + ['name' => 'Afghanistan', 'iso3' => 'AFG', 'iso2' => 'AF', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇦🇫'], + ['name' => 'Aland Islands', 'iso3' => 'ALA', 'iso2' => 'AX', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇦🇽'], + ['name' => 'Albania', 'iso3' => 'ALB', 'iso2' => 'AL', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇦🇱'], + ['name' => 'Algeria', 'iso3' => 'DZA', 'iso2' => 'DZ', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇩🇿'], + ['name' => 'American Samoa', 'iso3' => 'ASM', 'iso2' => 'AS', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇦🇸'], + ['name' => 'Andorra', 'iso3' => 'AND', 'iso2' => 'AD', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇦🇩'], + ['name' => 'Angola', 'iso3' => 'AGO', 'iso2' => 'AO', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇦🇴'], + ['name' => 'Anguilla', 'iso3' => 'AIA', 'iso2' => 'AI', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇦🇮'], + ['name' => 'Antarctica', 'iso3' => 'ATA', 'iso2' => 'AQ', 'region' => 'Polar', 'subregion' => '', 'emoji' => '🇦🇶'], + ['name' => 'Antigua And Barbuda', 'iso3' => 'ATG', 'iso2' => 'AG', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇦🇬'], + ['name' => 'Argentina', 'iso3' => 'ARG', 'iso2' => 'AR', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇦🇷'], + ['name' => 'Armenia', 'iso3' => 'ARM', 'iso2' => 'AM', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇦🇲'], + ['name' => 'Aruba', 'iso3' => 'ABW', 'iso2' => 'AW', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇦🇼'], + ['name' => 'Australia', 'iso3' => 'AUS', 'iso2' => 'AU', 'region' => 'Oceania', 'subregion' => 'Australia and New Zealand', 'emoji' => '🇦🇺'], + ['name' => 'Austria', 'iso3' => 'AUT', 'iso2' => 'AT', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇦🇹'], + ['name' => 'Azerbaijan', 'iso3' => 'AZE', 'iso2' => 'AZ', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇦🇿'], + ['name' => 'Bahamas The', 'iso3' => 'BHS', 'iso2' => 'BS', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇧🇸'], + ['name' => 'Bahrain', 'iso3' => 'BHR', 'iso2' => 'BH', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇧🇭'], + ['name' => 'Bangladesh', 'iso3' => 'BGD', 'iso2' => 'BD', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇧🇩'], + ['name' => 'Barbados', 'iso3' => 'BRB', 'iso2' => 'BB', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇧🇧'], + ['name' => 'Belarus', 'iso3' => 'BLR', 'iso2' => 'BY', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇧🇾'], + ['name' => 'Belgium', 'iso3' => 'BEL', 'iso2' => 'BE', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇧🇪'], + ['name' => 'Belize', 'iso3' => 'BLZ', 'iso2' => 'BZ', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇧🇿'], + ['name' => 'Benin', 'iso3' => 'BEN', 'iso2' => 'BJ', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇧🇯'], + ['name' => 'Bermuda', 'iso3' => 'BMU', 'iso2' => 'BM', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇧🇲'], + ['name' => 'Bhutan', 'iso3' => 'BTN', 'iso2' => 'BT', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇧🇹'], + ['name' => 'Bolivia', 'iso3' => 'BOL', 'iso2' => 'BO', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇧🇴'], + ['name' => 'Bonaire, Sint Eustatius and Saba', 'iso3' => 'BES', 'iso2' => 'BQ', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇧🇶'], + ['name' => 'Bosnia and Herzegovina', 'iso3' => 'BIH', 'iso2' => 'BA', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇧🇦'], + ['name' => 'Botswana', 'iso3' => 'BWA', 'iso2' => 'BW', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇧🇼'], + ['name' => 'Bouvet Island', 'iso3' => 'BVT', 'iso2' => 'BV', 'region' => '', 'subregion' => '', 'emoji' => '🇧🇻'], + ['name' => 'Brazil', 'iso3' => 'BRA', 'iso2' => 'BR', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇧🇷'], + ['name' => 'British Indian Ocean Territory', 'iso3' => 'IOT', 'iso2' => 'IO', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇮🇴'], + ['name' => 'Brunei', 'iso3' => 'BRN', 'iso2' => 'BN', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇧🇳'], + ['name' => 'Bulgaria', 'iso3' => 'BGR', 'iso2' => 'BG', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇧🇬'], + ['name' => 'Burkina Faso', 'iso3' => 'BFA', 'iso2' => 'BF', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇧🇫'], + ['name' => 'Burundi', 'iso3' => 'BDI', 'iso2' => 'BI', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇧🇮'], + ['name' => 'Cambodia', 'iso3' => 'KHM', 'iso2' => 'KH', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇰🇭'], + ['name' => 'Cameroon', 'iso3' => 'CMR', 'iso2' => 'CM', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇨🇲'], + ['name' => 'Canada', 'iso3' => 'CAN', 'iso2' => 'CA', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇨🇦'], + ['name' => 'Cape Verde', 'iso3' => 'CPV', 'iso2' => 'CV', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇨🇻'], + ['name' => 'Cayman Islands', 'iso3' => 'CYM', 'iso2' => 'KY', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇰🇾'], + ['name' => 'Central African Republic', 'iso3' => 'CAF', 'iso2' => 'CF', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇨🇫'], + ['name' => 'Chad', 'iso3' => 'TCD', 'iso2' => 'TD', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇹🇩'], + ['name' => 'Chile', 'iso3' => 'CHL', 'iso2' => 'CL', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇨🇱'], + ['name' => 'China', 'iso3' => 'CHN', 'iso2' => 'CN', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇨🇳'], + ['name' => 'Christmas Island', 'iso3' => 'CXR', 'iso2' => 'CX', 'region' => 'Oceania', 'subregion' => 'Australia and New Zealand', 'emoji' => '🇨🇽'], + ['name' => 'Cocos (Keeling) Islands', 'iso3' => 'CCK', 'iso2' => 'CC', 'region' => 'Oceania', 'subregion' => 'Australia and New Zealand', 'emoji' => '🇨🇨'], + ['name' => 'Colombia', 'iso3' => 'COL', 'iso2' => 'CO', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇨🇴'], + ['name' => 'Comoros', 'iso3' => 'COM', 'iso2' => 'KM', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇰🇲'], + ['name' => 'Congo', 'iso3' => 'COG', 'iso2' => 'CG', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇨🇬'], + ['name' => 'Cook Islands', 'iso3' => 'COK', 'iso2' => 'CK', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇨🇰'], + ['name' => 'Costa Rica', 'iso3' => 'CRI', 'iso2' => 'CR', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇨🇷'], + ['name' => 'Cote D\'Ivoire (Ivory Coast)', 'iso3' => 'CIV', 'iso2' => 'CI', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇨🇮'], + ['name' => 'Croatia', 'iso3' => 'HRV', 'iso2' => 'HR', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇭🇷'], + ['name' => 'Cuba', 'iso3' => 'CUB', 'iso2' => 'CU', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇨🇺'], + ['name' => 'Cura\\u00e7ao', 'iso3' => 'CUW', 'iso2' => 'CW', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇨🇼'], + ['name' => 'Cyprus', 'iso3' => 'CYP', 'iso2' => 'CY', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇨🇾'], + ['name' => 'Czech Republic', 'iso3' => 'CZE', 'iso2' => 'CZ', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇨🇿'], + ['name' => 'Democratic Republic of the Congo', 'iso3' => 'COD', 'iso2' => 'CD', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇨🇩'], + ['name' => 'Denmark', 'iso3' => 'DNK', 'iso2' => 'DK', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇩🇰'], + ['name' => 'Djibouti', 'iso3' => 'DJI', 'iso2' => 'DJ', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇩🇯'], + ['name' => 'Dominica', 'iso3' => 'DMA', 'iso2' => 'DM', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇩🇲'], + ['name' => 'Dominican Republic', 'iso3' => 'DOM', 'iso2' => 'DO', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇩🇴'], + ['name' => 'East Timor', 'iso3' => 'TLS', 'iso2' => 'TL', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇹🇱'], + ['name' => 'Ecuador', 'iso3' => 'ECU', 'iso2' => 'EC', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇪🇨'], + ['name' => 'Egypt', 'iso3' => 'EGY', 'iso2' => 'EG', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇪🇬'], + ['name' => 'El Salvador', 'iso3' => 'SLV', 'iso2' => 'SV', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇸🇻'], + ['name' => 'Equatorial Guinea', 'iso3' => 'GNQ', 'iso2' => 'GQ', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇬🇶'], + ['name' => 'Eritrea', 'iso3' => 'ERI', 'iso2' => 'ER', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇪🇷'], + ['name' => 'Estonia', 'iso3' => 'EST', 'iso2' => 'EE', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇪🇪'], + ['name' => 'Ethiopia', 'iso3' => 'ETH', 'iso2' => 'ET', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇪🇹'], + ['name' => 'Falkland Islands', 'iso3' => 'FLK', 'iso2' => 'FK', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇫🇰'], + ['name' => 'Faroe Islands', 'iso3' => 'FRO', 'iso2' => 'FO', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇫🇴'], + ['name' => 'Fiji Islands', 'iso3' => 'FJI', 'iso2' => 'FJ', 'region' => 'Oceania', 'subregion' => 'Melanesia', 'emoji' => '🇫🇯'], + ['name' => 'Finland', 'iso3' => 'FIN', 'iso2' => 'FI', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇫🇮'], + ['name' => 'France', 'iso3' => 'FRA', 'iso2' => 'FR', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇫🇷'], + ['name' => 'French Guiana', 'iso3' => 'GUF', 'iso2' => 'GF', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇬🇫'], + ['name' => 'French Polynesia', 'iso3' => 'PYF', 'iso2' => 'PF', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇵🇫'], + ['name' => 'French Southern Territories', 'iso3' => 'ATF', 'iso2' => 'TF', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇹🇫'], + ['name' => 'Gabon', 'iso3' => 'GAB', 'iso2' => 'GA', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇬🇦'], + ['name' => 'Gambia The', 'iso3' => 'GMB', 'iso2' => 'GM', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇬🇲'], + ['name' => 'Georgia', 'iso3' => 'GEO', 'iso2' => 'GE', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇬🇪'], + ['name' => 'Germany', 'iso3' => 'DEU', 'iso2' => 'DE', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇩🇪'], + ['name' => 'Ghana', 'iso3' => 'GHA', 'iso2' => 'GH', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇬🇭'], + ['name' => 'Gibraltar', 'iso3' => 'GIB', 'iso2' => 'GI', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇬🇮'], + ['name' => 'Greece', 'iso3' => 'GRC', 'iso2' => 'GR', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇬🇷'], + ['name' => 'Greenland', 'iso3' => 'GRL', 'iso2' => 'GL', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇬🇱'], + ['name' => 'Grenada', 'iso3' => 'GRD', 'iso2' => 'GD', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇬🇩'], + ['name' => 'Guadeloupe', 'iso3' => 'GLP', 'iso2' => 'GP', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇬🇵'], + ['name' => 'Guam', 'iso3' => 'GUM', 'iso2' => 'GU', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇬🇺'], + ['name' => 'Guatemala', 'iso3' => 'GTM', 'iso2' => 'GT', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇬🇹'], + ['name' => 'Guernsey and Alderney', 'iso3' => 'GGY', 'iso2' => 'GG', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇬🇬'], + ['name' => 'Guinea', 'iso3' => 'GIN', 'iso2' => 'GN', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇬🇳'], + ['name' => 'Guinea-Bissau', 'iso3' => 'GNB', 'iso2' => 'GW', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇬🇼'], + ['name' => 'Guyana', 'iso3' => 'GUY', 'iso2' => 'GY', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇬🇾'], + ['name' => 'Haiti', 'iso3' => 'HTI', 'iso2' => 'HT', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇭🇹'], + ['name' => 'Heard Island and McDonald Islands', 'iso3' => 'HMD', 'iso2' => 'HM', 'region' => '', 'subregion' => '', 'emoji' => '🇭🇲'], + ['name' => 'Honduras', 'iso3' => 'HND', 'iso2' => 'HN', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇭🇳'], + ['name' => 'Hong Kong S.A.R.', 'iso3' => 'HKG', 'iso2' => 'HK', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇭🇰'], + ['name' => 'Hungary', 'iso3' => 'HUN', 'iso2' => 'HU', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇭🇺'], + ['name' => 'Iceland', 'iso3' => 'ISL', 'iso2' => 'IS', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇮🇸'], + ['name' => 'India', 'iso3' => 'IND', 'iso2' => 'IN', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇮🇳'], + ['name' => 'Indonesia', 'iso3' => 'IDN', 'iso2' => 'ID', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇮🇩'], + ['name' => 'Iran', 'iso3' => 'IRN', 'iso2' => 'IR', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇮🇷'], + ['name' => 'Iraq', 'iso3' => 'IRQ', 'iso2' => 'IQ', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇮🇶'], + ['name' => 'Ireland', 'iso3' => 'IRL', 'iso2' => 'IE', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇮🇪'], + ['name' => 'Israel', 'iso3' => 'ISR', 'iso2' => 'IL', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇮🇱'], + ['name' => 'Italy', 'iso3' => 'ITA', 'iso2' => 'IT', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇮🇹'], + ['name' => 'Jamaica', 'iso3' => 'JAM', 'iso2' => 'JM', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇯🇲'], + ['name' => 'Japan', 'iso3' => 'JPN', 'iso2' => 'JP', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇯🇵'], + ['name' => 'Jersey', 'iso3' => 'JEY', 'iso2' => 'JE', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇯🇪'], + ['name' => 'Jordan', 'iso3' => 'JOR', 'iso2' => 'JO', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇯🇴'], + ['name' => 'Kazakhstan', 'iso3' => 'KAZ', 'iso2' => 'KZ', 'region' => 'Asia', 'subregion' => 'Central Asia', 'emoji' => '🇰🇿'], + ['name' => 'Kenya', 'iso3' => 'KEN', 'iso2' => 'KE', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇰🇪'], + ['name' => 'Kiribati', 'iso3' => 'KIR', 'iso2' => 'KI', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇰🇮'], + ['name' => 'Kosovo', 'iso3' => 'XKX', 'iso2' => 'XK', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇽🇰'], + ['name' => 'Kuwait', 'iso3' => 'KWT', 'iso2' => 'KW', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇰🇼'], + ['name' => 'Kyrgyzstan', 'iso3' => 'KGZ', 'iso2' => 'KG', 'region' => 'Asia', 'subregion' => 'Central Asia', 'emoji' => '🇰🇬'], + ['name' => 'Laos', 'iso3' => 'LAO', 'iso2' => 'LA', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇱🇦'], + ['name' => 'Latvia', 'iso3' => 'LVA', 'iso2' => 'LV', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇱🇻'], + ['name' => 'Lebanon', 'iso3' => 'LBN', 'iso2' => 'LB', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇱🇧'], + ['name' => 'Lesotho', 'iso3' => 'LSO', 'iso2' => 'LS', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇱🇸'], + ['name' => 'Liberia', 'iso3' => 'LBR', 'iso2' => 'LR', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇱🇷'], + ['name' => 'Libya', 'iso3' => 'LBY', 'iso2' => 'LY', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇱🇾'], + ['name' => 'Liechtenstein', 'iso3' => 'LIE', 'iso2' => 'LI', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇱🇮'], + ['name' => 'Lithuania', 'iso3' => 'LTU', 'iso2' => 'LT', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇱🇹'], + ['name' => 'Luxembourg', 'iso3' => 'LUX', 'iso2' => 'LU', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇱🇺'], + ['name' => 'Macau S.A.R.', 'iso3' => 'MAC', 'iso2' => 'MO', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇲🇴'], + ['name' => 'Macedonia', 'iso3' => 'MKD', 'iso2' => 'MK', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇲🇰'], + ['name' => 'Madagascar', 'iso3' => 'MDG', 'iso2' => 'MG', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇲🇬'], + ['name' => 'Malawi', 'iso3' => 'MWI', 'iso2' => 'MW', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇲🇼'], + ['name' => 'Malaysia', 'iso3' => 'MYS', 'iso2' => 'MY', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇲🇾'], + ['name' => 'Maldives', 'iso3' => 'MDV', 'iso2' => 'MV', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇲🇻'], + ['name' => 'Mali', 'iso3' => 'MLI', 'iso2' => 'ML', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇲🇱'], + ['name' => 'Malta', 'iso3' => 'MLT', 'iso2' => 'MT', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇲🇹'], + ['name' => 'Man (Isle of)', 'iso3' => 'IMN', 'iso2' => 'IM', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇮🇲'], + ['name' => 'Marshall Islands', 'iso3' => 'MHL', 'iso2' => 'MH', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇲🇭'], + ['name' => 'Martinique', 'iso3' => 'MTQ', 'iso2' => 'MQ', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇲🇶'], + ['name' => 'Mauritania', 'iso3' => 'MRT', 'iso2' => 'MR', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇲🇷'], + ['name' => 'Mauritius', 'iso3' => 'MUS', 'iso2' => 'MU', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇲🇺'], + ['name' => 'Mayotte', 'iso3' => 'MYT', 'iso2' => 'YT', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇾🇹'], + ['name' => 'Mexico', 'iso3' => 'MEX', 'iso2' => 'MX', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇲🇽'], + ['name' => 'Micronesia', 'iso3' => 'FSM', 'iso2' => 'FM', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇫🇲'], + ['name' => 'Moldova', 'iso3' => 'MDA', 'iso2' => 'MD', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇲🇩'], + ['name' => 'Monaco', 'iso3' => 'MCO', 'iso2' => 'MC', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇲🇨'], + ['name' => 'Mongolia', 'iso3' => 'MNG', 'iso2' => 'MN', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇲🇳'], + ['name' => 'Montenegro', 'iso3' => 'MNE', 'iso2' => 'ME', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇲🇪'], + ['name' => 'Montserrat', 'iso3' => 'MSR', 'iso2' => 'MS', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇲🇸'], + ['name' => 'Morocco', 'iso3' => 'MAR', 'iso2' => 'MA', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇲🇦'], + ['name' => 'Mozambique', 'iso3' => 'MOZ', 'iso2' => 'MZ', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇲🇿'], + ['name' => 'Myanmar', 'iso3' => 'MMR', 'iso2' => 'MM', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇲🇲'], + ['name' => 'Namibia', 'iso3' => 'NAM', 'iso2' => 'NA', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇳🇦'], + ['name' => 'Nauru', 'iso3' => 'NRU', 'iso2' => 'NR', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇳🇷'], + ['name' => 'Nepal', 'iso3' => 'NPL', 'iso2' => 'NP', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇳🇵'], + ['name' => 'Netherlands', 'iso3' => 'NLD', 'iso2' => 'NL', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇳🇱'], + ['name' => 'New Caledonia', 'iso3' => 'NCL', 'iso2' => 'NC', 'region' => 'Oceania', 'subregion' => 'Melanesia', 'emoji' => '🇳🇨'], + ['name' => 'New Zealand', 'iso3' => 'NZL', 'iso2' => 'NZ', 'region' => 'Oceania', 'subregion' => 'Australia and New Zealand', 'emoji' => '🇳🇿'], + ['name' => 'Nicaragua', 'iso3' => 'NIC', 'iso2' => 'NI', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇳🇮'], + ['name' => 'Niger', 'iso3' => 'NER', 'iso2' => 'NE', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇳🇪'], + ['name' => 'Nigeria', 'iso3' => 'NGA', 'iso2' => 'NG', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇳🇬'], + ['name' => 'Niue', 'iso3' => 'NIU', 'iso2' => 'NU', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇳🇺'], + ['name' => 'Norfolk Island', 'iso3' => 'NFK', 'iso2' => 'NF', 'region' => 'Oceania', 'subregion' => 'Australia and New Zealand', 'emoji' => '🇳🇫'], + ['name' => 'North Korea', 'iso3' => 'PRK', 'iso2' => 'KP', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇰🇵'], + ['name' => 'Northern Mariana Islands', 'iso3' => 'MNP', 'iso2' => 'MP', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇲🇵'], + ['name' => 'Norway', 'iso3' => 'NOR', 'iso2' => 'NO', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇳🇴'], + ['name' => 'Oman', 'iso3' => 'OMN', 'iso2' => 'OM', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇴🇲'], + ['name' => 'Pakistan', 'iso3' => 'PAK', 'iso2' => 'PK', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇵🇰'], + ['name' => 'Palau', 'iso3' => 'PLW', 'iso2' => 'PW', 'region' => 'Oceania', 'subregion' => 'Micronesia', 'emoji' => '🇵🇼'], + ['name' => 'Palestinian Territory Occupied', 'iso3' => 'PSE', 'iso2' => 'PS', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇵🇸'], + ['name' => 'Panama', 'iso3' => 'PAN', 'iso2' => 'PA', 'region' => 'Americas', 'subregion' => 'Central America', 'emoji' => '🇵🇦'], + ['name' => 'Papua new Guinea', 'iso3' => 'PNG', 'iso2' => 'PG', 'region' => 'Oceania', 'subregion' => 'Melanesia', 'emoji' => '🇵🇬'], + ['name' => 'Paraguay', 'iso3' => 'PRY', 'iso2' => 'PY', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇵🇾'], + ['name' => 'Peru', 'iso3' => 'PER', 'iso2' => 'PE', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇵🇪'], + ['name' => 'Philippines', 'iso3' => 'PHL', 'iso2' => 'PH', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇵🇭'], + ['name' => 'Pitcairn Island', 'iso3' => 'PCN', 'iso2' => 'PN', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇵🇳'], + ['name' => 'Poland', 'iso3' => 'POL', 'iso2' => 'PL', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇵🇱'], + ['name' => 'Portugal', 'iso3' => 'PRT', 'iso2' => 'PT', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇵🇹'], + ['name' => 'Puerto Rico', 'iso3' => 'PRI', 'iso2' => 'PR', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇵🇷'], + ['name' => 'Qatar', 'iso3' => 'QAT', 'iso2' => 'QA', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇶🇦'], + ['name' => 'Reunion', 'iso3' => 'REU', 'iso2' => 'RE', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇷🇪'], + ['name' => 'Romania', 'iso3' => 'ROU', 'iso2' => 'RO', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇷🇴'], + ['name' => 'Russia', 'iso3' => 'RUS', 'iso2' => 'RU', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇷🇺'], + ['name' => 'Rwanda', 'iso3' => 'RWA', 'iso2' => 'RW', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇷🇼'], + ['name' => 'Saint Helena', 'iso3' => 'SHN', 'iso2' => 'SH', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇸🇭'], + ['name' => 'Saint Kitts And Nevis', 'iso3' => 'KNA', 'iso2' => 'KN', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇰🇳'], + ['name' => 'Saint Lucia', 'iso3' => 'LCA', 'iso2' => 'LC', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇱🇨'], + ['name' => 'Saint Pierre and Miquelon', 'iso3' => 'SPM', 'iso2' => 'PM', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇵🇲'], + ['name' => 'Saint Vincent And The Grenadines', 'iso3' => 'VCT', 'iso2' => 'VC', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇻🇨'], + ['name' => 'Saint-Barthelemy', 'iso3' => 'BLM', 'iso2' => 'BL', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇧🇱'], + ['name' => 'Saint-Martin (French part)', 'iso3' => 'MAF', 'iso2' => 'MF', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇲🇫'], + ['name' => 'Samoa', 'iso3' => 'WSM', 'iso2' => 'WS', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇼🇸'], + ['name' => 'San Marino', 'iso3' => 'SMR', 'iso2' => 'SM', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇸🇲'], + ['name' => 'Sao Tome and Principe', 'iso3' => 'STP', 'iso2' => 'ST', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇸🇹'], + ['name' => 'Saudi Arabia', 'iso3' => 'SAU', 'iso2' => 'SA', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇸🇦'], + ['name' => 'Senegal', 'iso3' => 'SEN', 'iso2' => 'SN', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇸🇳'], + ['name' => 'Serbia', 'iso3' => 'SRB', 'iso2' => 'RS', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇷🇸'], + ['name' => 'Seychelles', 'iso3' => 'SYC', 'iso2' => 'SC', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇸🇨'], + ['name' => 'Sierra Leone', 'iso3' => 'SLE', 'iso2' => 'SL', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇸🇱'], + ['name' => 'Singapore', 'iso3' => 'SGP', 'iso2' => 'SG', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇸🇬'], + ['name' => 'Sint Maarten (Dutch part)', 'iso3' => 'SXM', 'iso2' => 'SX', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇸🇽'], + ['name' => 'Slovakia', 'iso3' => 'SVK', 'iso2' => 'SK', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇸🇰'], + ['name' => 'Slovenia', 'iso3' => 'SVN', 'iso2' => 'SI', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇸🇮'], + ['name' => 'Solomon Islands', 'iso3' => 'SLB', 'iso2' => 'SB', 'region' => 'Oceania', 'subregion' => 'Melanesia', 'emoji' => '🇸🇧'], + ['name' => 'Somalia', 'iso3' => 'SOM', 'iso2' => 'SO', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇸🇴'], + ['name' => 'South Africa', 'iso3' => 'ZAF', 'iso2' => 'ZA', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇿🇦'], + ['name' => 'South Georgia', 'iso3' => 'SGS', 'iso2' => 'GS', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇬🇸'], + ['name' => 'South Korea', 'iso3' => 'KOR', 'iso2' => 'KR', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇰🇷'], + ['name' => 'South Sudan', 'iso3' => 'SSD', 'iso2' => 'SS', 'region' => 'Africa', 'subregion' => 'Middle Africa', 'emoji' => '🇸🇸'], + ['name' => 'Spain', 'iso3' => 'ESP', 'iso2' => 'ES', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇪🇸'], + ['name' => 'Sri Lanka', 'iso3' => 'LKA', 'iso2' => 'LK', 'region' => 'Asia', 'subregion' => 'Southern Asia', 'emoji' => '🇱🇰'], + ['name' => 'Sudan', 'iso3' => 'SDN', 'iso2' => 'SD', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇸🇩'], + ['name' => 'Suriname', 'iso3' => 'SUR', 'iso2' => 'SR', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇸🇷'], + ['name' => 'Svalbard And Jan Mayen Islands', 'iso3' => 'SJM', 'iso2' => 'SJ', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇸🇯'], + ['name' => 'Swaziland', 'iso3' => 'SWZ', 'iso2' => 'SZ', 'region' => 'Africa', 'subregion' => 'Southern Africa', 'emoji' => '🇸🇿'], + ['name' => 'Sweden', 'iso3' => 'SWE', 'iso2' => 'SE', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇸🇪'], + ['name' => 'Switzerland', 'iso3' => 'CHE', 'iso2' => 'CH', 'region' => 'Europe', 'subregion' => 'Western Europe', 'emoji' => '🇨🇭'], + ['name' => 'Syria', 'iso3' => 'SYR', 'iso2' => 'SY', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇸🇾'], + ['name' => 'Taiwan', 'iso3' => 'TWN', 'iso2' => 'TW', 'region' => 'Asia', 'subregion' => 'Eastern Asia', 'emoji' => '🇹🇼'], + ['name' => 'Tajikistan', 'iso3' => 'TJK', 'iso2' => 'TJ', 'region' => 'Asia', 'subregion' => 'Central Asia', 'emoji' => '🇹🇯'], + ['name' => 'Tanzania', 'iso3' => 'TZA', 'iso2' => 'TZ', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇹🇿'], + ['name' => 'Thailand', 'iso3' => 'THA', 'iso2' => 'TH', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇹🇭'], + ['name' => 'Togo', 'iso3' => 'TGO', 'iso2' => 'TG', 'region' => 'Africa', 'subregion' => 'Western Africa', 'emoji' => '🇹🇬'], + ['name' => 'Tokelau', 'iso3' => 'TKL', 'iso2' => 'TK', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇹🇰'], + ['name' => 'Tonga', 'iso3' => 'TON', 'iso2' => 'TO', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇹🇴'], + ['name' => 'Trinidad And Tobago', 'iso3' => 'TTO', 'iso2' => 'TT', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇹🇹'], + ['name' => 'Tunisia', 'iso3' => 'TUN', 'iso2' => 'TN', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇹🇳'], + ['name' => 'Turkey', 'iso3' => 'TUR', 'iso2' => 'TR', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇹🇷'], + ['name' => 'Turkmenistan', 'iso3' => 'TKM', 'iso2' => 'TM', 'region' => 'Asia', 'subregion' => 'Central Asia', 'emoji' => '🇹🇲'], + ['name' => 'Turks And Caicos Islands', 'iso3' => 'TCA', 'iso2' => 'TC', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇹🇨'], + ['name' => 'Tuvalu', 'iso3' => 'TUV', 'iso2' => 'TV', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇹🇻'], + ['name' => 'Uganda', 'iso3' => 'UGA', 'iso2' => 'UG', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇺🇬'], + ['name' => 'Ukraine', 'iso3' => 'UKR', 'iso2' => 'UA', 'region' => 'Europe', 'subregion' => 'Eastern Europe', 'emoji' => '🇺🇦'], + ['name' => 'United Arab Emirates', 'iso3' => 'ARE', 'iso2' => 'AE', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇦🇪'], + ['name' => 'United Kingdom', 'iso3' => 'GBR', 'iso2' => 'GB', 'region' => 'Europe', 'subregion' => 'Northern Europe', 'emoji' => '🇬🇧'], + ['name' => 'United States', 'iso3' => 'USA', 'iso2' => 'US', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇺🇸'], + ['name' => 'United States Minor Outlying Islands', 'iso3' => 'UMI', 'iso2' => 'UM', 'region' => 'Americas', 'subregion' => 'Northern America', 'emoji' => '🇺🇲'], + ['name' => 'Uruguay', 'iso3' => 'URY', 'iso2' => 'UY', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇺🇾'], + ['name' => 'Uzbekistan', 'iso3' => 'UZB', 'iso2' => 'UZ', 'region' => 'Asia', 'subregion' => 'Central Asia', 'emoji' => '🇺🇿'], + ['name' => 'Vanuatu', 'iso3' => 'VUT', 'iso2' => 'VU', 'region' => 'Oceania', 'subregion' => 'Melanesia', 'emoji' => '🇻🇺'], + ['name' => 'Vatican City State (Holy See)', 'iso3' => 'VAT', 'iso2' => 'VA', 'region' => 'Europe', 'subregion' => 'Southern Europe', 'emoji' => '🇻🇦'], + ['name' => 'Venezuela', 'iso3' => 'VEN', 'iso2' => 'VE', 'region' => 'Americas', 'subregion' => 'South America', 'emoji' => '🇻🇪'], + ['name' => 'Vietnam', 'iso3' => 'VNM', 'iso2' => 'VN', 'region' => 'Asia', 'subregion' => 'South-Eastern Asia', 'emoji' => '🇻🇳'], + ['name' => 'Virgin Islands (British)', 'iso3' => 'VGB', 'iso2' => 'VG', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇻🇬'], + ['name' => 'Virgin Islands (US)', 'iso3' => 'VIR', 'iso2' => 'VI', 'region' => 'Americas', 'subregion' => 'Caribbean', 'emoji' => '🇻🇮'], + ['name' => 'Wallis And Futuna Islands', 'iso3' => 'WLF', 'iso2' => 'WF', 'region' => 'Oceania', 'subregion' => 'Polynesia', 'emoji' => '🇼🇫'], + ['name' => 'Western Sahara', 'iso3' => 'ESH', 'iso2' => 'EH', 'region' => 'Africa', 'subregion' => 'Northern Africa', 'emoji' => '🇪🇭'], + ['name' => 'Yemen', 'iso3' => 'YEM', 'iso2' => 'YE', 'region' => 'Asia', 'subregion' => 'Western Asia', 'emoji' => '🇾🇪'], + ['name' => 'Zambia', 'iso3' => 'ZMB', 'iso2' => 'ZM', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇿🇲'], + ['name' => 'Zimbabwe', 'iso3' => 'ZWE', 'iso2' => 'ZW', 'region' => 'Africa', 'subregion' => 'Eastern Africa', 'emoji' => '🇿🇼'], + ]; + } +} diff --git a/src/Dictionaries/Currencies.php b/src/Dictionaries/Currencies.php new file mode 100644 index 0000000000..dce2b0d7bb --- /dev/null +++ b/src/Dictionaries/Currencies.php @@ -0,0 +1,138 @@ + 'AED', 'name' => 'United Arab Emirates Dirham', 'symbol' => 'د.إ.‏', 'decimals' => 2], + ['code' => 'AFN', 'name' => 'Afghan Afghani', 'symbol' => '؋', 'decimals' => 0], + ['code' => 'ALL', 'name' => 'Albanian Lek', 'symbol' => 'Lek', 'decimals' => 0], + ['code' => 'AMD', 'name' => 'Armenian Dram', 'symbol' => 'դր.', 'decimals' => 0], + ['code' => 'ARS', 'name' => 'Argentine Peso', 'symbol' => '$', 'decimals' => 2], + ['code' => 'AUD', 'name' => 'Australian Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'AZN', 'name' => 'Azerbaijani Manat', 'symbol' => 'ман.', 'decimals' => 2], + ['code' => 'BAM', 'name' => 'Bosnia-Herzegovina Convertible Mark', 'symbol' => 'KM', 'decimals' => 2], + ['code' => 'BDT', 'name' => 'Bangladeshi Taka', 'symbol' => '৳', 'decimals' => 2], + ['code' => 'BGN', 'name' => 'Bulgarian Lev', 'symbol' => 'лв.', 'decimals' => 2], + ['code' => 'BHD', 'name' => 'Bahraini Dinar', 'symbol' => 'د.ب.‏', 'decimals' => 3], + ['code' => 'BIF', 'name' => 'Burundian Franc', 'symbol' => 'FBu', 'decimals' => 0], + ['code' => 'BND', 'name' => 'Brunei Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'BOB', 'name' => 'Bolivian Boliviano', 'symbol' => 'Bs', 'decimals' => 2], + ['code' => 'BRL', 'name' => 'Brazilian Real', 'symbol' => 'R$', 'decimals' => 2], + ['code' => 'BWP', 'name' => 'Botswanan Pula', 'symbol' => 'P', 'decimals' => 2], + ['code' => 'BYN', 'name' => 'Belarusian Ruble', 'symbol' => 'руб.', 'decimals' => 2], + ['code' => 'BZD', 'name' => 'Belize Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'CAD', 'name' => 'Canadian Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'CDF', 'name' => 'Congolese Franc', 'symbol' => 'FrCD', 'decimals' => 2], + ['code' => 'CHF', 'name' => 'Swiss Franc', 'symbol' => 'CHF', 'decimals' => 2], + ['code' => 'CLP', 'name' => 'Chilean Peso', 'symbol' => '$', 'decimals' => 0], + ['code' => 'CNY', 'name' => 'Chinese Yuan', 'symbol' => 'CN¥', 'decimals' => 2], + ['code' => 'COP', 'name' => 'Colombian Peso', 'symbol' => '$', 'decimals' => 0], + ['code' => 'CRC', 'name' => "Costa Rican Col\u00f3n", 'symbol' => '₡', 'decimals' => 0], + ['code' => 'CVE', 'name' => 'Cape Verdean Escudo', 'symbol' => 'CV$', 'decimals' => 2], + ['code' => 'CZK', 'name' => 'Czech Republic Koruna', 'symbol' => 'Kč', 'decimals' => 2], + ['code' => 'DJF', 'name' => 'Djiboutian Franc', 'symbol' => 'Fdj', 'decimals' => 0], + ['code' => 'DKK', 'name' => 'Danish Krone', 'symbol' => 'kr', 'decimals' => 2], + ['code' => 'DOP', 'name' => 'Dominican Peso', 'symbol' => 'RD$', 'decimals' => 2], + ['code' => 'DZD', 'name' => 'Algerian Dinar', 'symbol' => 'د.ج.‏', 'decimals' => 2], + ['code' => 'EEK', 'name' => 'Estonian Kroon', 'symbol' => 'kr', 'decimals' => 2], + ['code' => 'EGP', 'name' => 'Egyptian Pound', 'symbol' => 'ج.م.‏', 'decimals' => 2], + ['code' => 'ERN', 'name' => 'Eritrean Nakfa', 'symbol' => 'Nfk', 'decimals' => 2], + ['code' => 'ETB', 'name' => 'Ethiopian Birr', 'symbol' => 'Br', 'decimals' => 2], + ['code' => 'EUR', 'name' => 'Euro', 'symbol' => '€', 'decimals' => 2], + ['code' => 'GBP', 'name' => 'British Pound Sterling', 'symbol' => '£', 'decimals' => 2], + ['code' => 'GEL', 'name' => 'Georgian Lari', 'symbol' => 'GEL', 'decimals' => 2], + ['code' => 'GHS', 'name' => 'Ghanaian Cedi', 'symbol' => 'GH₵', 'decimals' => 2], + ['code' => 'GNF', 'name' => 'Guinean Franc', 'symbol' => 'FG', 'decimals' => 0], + ['code' => 'GTQ', 'name' => 'Guatemalan Quetzal', 'symbol' => 'Q', 'decimals' => 2], + ['code' => 'HKD', 'name' => 'Hong Kong Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'HNL', 'name' => 'Honduran Lempira', 'symbol' => 'L', 'decimals' => 2], + ['code' => 'HRK', 'name' => 'Croatian Kuna', 'symbol' => 'kn', 'decimals' => 2], + ['code' => 'HUF', 'name' => 'Hungarian Forint', 'symbol' => 'Ft', 'decimals' => 0], + ['code' => 'IDR', 'name' => 'Indonesian Rupiah', 'symbol' => 'Rp', 'decimals' => 0], + ['code' => 'ILS', 'name' => 'Israeli New Sheqel', 'symbol' => '₪', 'decimals' => 2], + ['code' => 'INR', 'name' => 'Indian Rupee', 'symbol' => 'টকা', 'decimals' => 2], + ['code' => 'IQD', 'name' => 'Iraqi Dinar', 'symbol' => 'د.ع.‏', 'decimals' => 0], + ['code' => 'IRR', 'name' => 'Iranian Rial', 'symbol' => '﷼', 'decimals' => 0], + ['code' => 'ISK', 'name' => "Icelandic Kr\u00f3na", 'symbol' => 'kr', 'decimals' => 0], + ['code' => 'JMD', 'name' => 'Jamaican Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'JOD', 'name' => 'Jordanian Dinar', 'symbol' => 'د.أ.‏', 'decimals' => 3], + ['code' => 'JPY', 'name' => 'Japanese Yen', 'symbol' => '¥', 'decimals' => 0], + ['code' => 'KES', 'name' => 'Kenyan Shilling', 'symbol' => 'Ksh', 'decimals' => 2], + ['code' => 'KHR', 'name' => 'Cambodian Riel', 'symbol' => '៛', 'decimals' => 2], + ['code' => 'KMF', 'name' => 'Comorian Franc', 'symbol' => 'FC', 'decimals' => 0], + ['code' => 'KRW', 'name' => 'South Korean Won', 'symbol' => '₩', 'decimals' => 0], + ['code' => 'KWD', 'name' => 'Kuwaiti Dinar', 'symbol' => 'د.ك.‏', 'decimals' => 3], + ['code' => 'KZT', 'name' => 'Kazakhstani Tenge', 'symbol' => 'тңг.', 'decimals' => 2], + ['code' => 'LBP', 'name' => 'Lebanese Pound', 'symbol' => 'ل.ل.‏', 'decimals' => 0], + ['code' => 'LKR', 'name' => 'Sri Lankan Rupee', 'symbol' => 'SL Re', 'decimals' => 2], + ['code' => 'LTL', 'name' => 'Lithuanian Litas', 'symbol' => 'Lt', 'decimals' => 2], + ['code' => 'LVL', 'name' => 'Latvian Lats', 'symbol' => 'Ls', 'decimals' => 2], + ['code' => 'LYD', 'name' => 'Libyan Dinar', 'symbol' => 'د.ل.‏', 'decimals' => 3], + ['code' => 'MAD', 'name' => 'Moroccan Dirham', 'symbol' => 'د.م.‏', 'decimals' => 2], + ['code' => 'MDL', 'name' => 'Moldovan Leu', 'symbol' => 'MDL', 'decimals' => 2], + ['code' => 'MGA', 'name' => 'Malagasy Ariary', 'symbol' => 'MGA', 'decimals' => 0], + ['code' => 'MKD', 'name' => 'Macedonian Denar', 'symbol' => 'MKD', 'decimals' => 2], + ['code' => 'MMK', 'name' => 'Myanma Kyat', 'symbol' => 'K', 'decimals' => 0], + ['code' => 'MOP', 'name' => 'Macanese Pataca', 'symbol' => 'MOP$', 'decimals' => 2], + ['code' => 'MUR', 'name' => 'Mauritian Rupee', 'symbol' => 'MURs', 'decimals' => 0], + ['code' => 'MXN', 'name' => 'Mexican Peso', 'symbol' => '$', 'decimals' => 2], + ['code' => 'MYR', 'name' => 'Malaysian Ringgit', 'symbol' => 'RM', 'decimals' => 2], + ['code' => 'MZN', 'name' => 'Mozambican Metical', 'symbol' => 'MTn', 'decimals' => 2], + ['code' => 'NAD', 'name' => 'Namibian Dollar', 'symbol' => 'N$', 'decimals' => 2], + ['code' => 'NGN', 'name' => 'Nigerian Naira', 'symbol' => '₦', 'decimals' => 2], + ['code' => 'NIO', 'name' => "Nicaraguan C\u00f3rdoba", 'symbol' => 'C$', 'decimals' => 2], + ['code' => 'NOK', 'name' => 'Norwegian Krone', 'symbol' => 'kr', 'decimals' => 2], + ['code' => 'NPR', 'name' => 'Nepalese Rupee', 'symbol' => 'नेरू', 'decimals' => 2], + ['code' => 'NZD', 'name' => 'New Zealand Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'OMR', 'name' => 'Omani Rial', 'symbol' => 'ر.ع.‏', 'decimals' => 3], + ['code' => 'PAB', 'name' => 'Panamanian Balboa', 'symbol' => 'B/.', 'decimals' => 2], + ['code' => 'PEN', 'name' => 'Peruvian Nuevo Sol', 'symbol' => 'S/.', 'decimals' => 2], + ['code' => 'PHP', 'name' => 'Philippine Peso', 'symbol' => '₱', 'decimals' => 2], + ['code' => 'PKR', 'name' => 'Pakistani Rupee', 'symbol' => '₨', 'decimals' => 0], + ['code' => 'PLN', 'name' => 'Polish Zloty', 'symbol' => 'zł', 'decimals' => 2], + ['code' => 'PYG', 'name' => 'Paraguayan Guarani', 'symbol' => '₲', 'decimals' => 0], + ['code' => 'QAR', 'name' => 'Qatari Rial', 'symbol' => 'ر.ق.‏', 'decimals' => 2], + ['code' => 'RON', 'name' => 'Romanian Leu', 'symbol' => 'RON', 'decimals' => 2], + ['code' => 'RSD', 'name' => 'Serbian Dinar', 'symbol' => 'дин.', 'decimals' => 0], + ['code' => 'RUB', 'name' => 'Russian Ruble', 'symbol' => '₽.', 'decimals' => 2], + ['code' => 'RWF', 'name' => 'Rwandan Franc', 'symbol' => 'FR', 'decimals' => 0], + ['code' => 'SAR', 'name' => 'Saudi Riyal', 'symbol' => 'ر.س.‏', 'decimals' => 2], + ['code' => 'SDG', 'name' => 'Sudanese Pound', 'symbol' => 'SDG', 'decimals' => 2], + ['code' => 'SEK', 'name' => 'Swedish Krona', 'symbol' => 'kr', 'decimals' => 2], + ['code' => 'SGD', 'name' => 'Singapore Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'SOS', 'name' => 'Somali Shilling', 'symbol' => 'Ssh', 'decimals' => 0], + ['code' => 'SYP', 'name' => 'Syrian Pound', 'symbol' => 'ل.س.‏', 'decimals' => 0], + ['code' => 'THB', 'name' => 'Thai Baht', 'symbol' => '฿', 'decimals' => 2], + ['code' => 'TND', 'name' => 'Tunisian Dinar', 'symbol' => 'د.ت.‏', 'decimals' => 3], + ['code' => 'TOP', 'name' => "Tongan Pa\u02bbanga", 'symbol' => 'T$', 'decimals' => 2], + ['code' => 'TRY', 'name' => 'Turkish Lira', 'symbol' => 'TL', 'decimals' => 2], + ['code' => 'TTD', 'name' => 'Trinidad and Tobago Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'TWD', 'name' => 'New Taiwan Dollar', 'symbol' => 'NT$', 'decimals' => 2], + ['code' => 'TZS', 'name' => 'Tanzanian Shilling', 'symbol' => 'TSh', 'decimals' => 0], + ['code' => 'UAH', 'name' => 'Ukrainian Hryvnia', 'symbol' => '₴', 'decimals' => 2], + ['code' => 'UGX', 'name' => 'Ugandan Shilling', 'symbol' => 'USh', 'decimals' => 0], + ['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'decimals' => 2], + ['code' => 'UYU', 'name' => 'Uruguayan Peso', 'symbol' => '$', 'decimals' => 2], + ['code' => 'UZS', 'name' => 'Uzbekistan Som', 'symbol' => 'UZS', 'decimals' => 0], + ['code' => 'VEF', 'name' => "Venezuelan Bol\u00edvar", 'symbol' => 'Bs.F.', 'decimals' => 2], + ['code' => 'VND', 'name' => 'Vietnamese Dong', 'symbol' => '₫', 'decimals' => 0], + ['code' => 'XAF', 'name' => 'CFA Franc BEAC', 'symbol' => 'FCFA', 'decimals' => 0], + ['code' => 'XOF', 'name' => 'CFA Franc BCEAO', 'symbol' => 'CFA', 'decimals' => 0], + ['code' => 'YER', 'name' => 'Yemeni Rial', 'symbol' => 'ر.ي.‏', 'decimals' => 0], + ['code' => 'ZAR', 'name' => 'South African Rand', 'symbol' => 'R', 'decimals' => 2], + ['code' => 'ZMK', 'name' => 'Zambian Kwacha', 'symbol' => 'ZK', 'decimals' => 0], + ['code' => 'ZWL', 'name' => 'Zimbabwean Dollar', 'symbol' => 'ZWL$', 'decimals' => 0], + ]; + } +} diff --git a/src/Dictionaries/Dictionary.php b/src/Dictionaries/Dictionary.php new file mode 100644 index 0000000000..c94771a254 --- /dev/null +++ b/src/Dictionaries/Dictionary.php @@ -0,0 +1,71 @@ +config = $config; + + return $this; + } + + public function config(): array + { + return $this->config; + } + + protected function fieldItems() + { + return $this->fields; + } + + public function getGqlType() + { + $name = str(class_basename($this))->singular()->value(); + + return new DictionaryType($name, $this->getGqlFields()); + } + + protected function getGqlFields(): array + { + // By default, we will make non-nullable strings out of all the keys + // of the first option. This is an easy way for it to "just work", + // and of course it may be easily overridden per dictionary. + $firstOption = collect($this->options())->keys()->first(); + + return collect($this->get($firstOption)) + ->map(fn ($value) => ['type' => GraphQL::nonNull($this->getInferredGqlType($value))]) + ->all(); + } + + private function getInferredGqlType($value) + { + if (is_int($value)) { + return GraphQL::int(); + } + + if (is_bool($value)) { + return GraphQL::boolean(); + } + + return GraphQL::string(); + } +} diff --git a/src/Dictionaries/DictionaryRepository.php b/src/Dictionaries/DictionaryRepository.php new file mode 100644 index 0000000000..55e43df95b --- /dev/null +++ b/src/Dictionaries/DictionaryRepository.php @@ -0,0 +1,30 @@ +map(fn ($class) => app($class)) + ->filter() + ->values(); + } + + public function find(string $handle, array $context = []): ?Dictionary + { + if (! $dictionary = app('statamic.dictionaries')->get($handle)) { + return null; + } + + /** @var $dictionary Dictionary */ + if (! $dictionary = app($dictionary)) { + return null; + } + + return $dictionary->setConfig($context); + } +} diff --git a/src/Dictionaries/File.php b/src/Dictionaries/File.php new file mode 100644 index 0000000000..57bdc173b6 --- /dev/null +++ b/src/Dictionaries/File.php @@ -0,0 +1,85 @@ + [ + 'type' => 'slug', + 'display' => __('Filename'), + 'instructions' => __('statamic::fieldtypes.dictionary.file.config.filename'), + 'validate' => ['required'], + ], + 'label' => [ + 'type' => 'text', + 'display' => __('Label'), + 'instructions' => __('statamic::fieldtypes.dictionary.file.config.label'), + ], + 'value' => [ + 'type' => 'text', + 'display' => __('Value'), + 'instructions' => __('statamic::fieldtypes.dictionary.file.config.value'), + ], + ]; + } + + public function setConfig(array $config): Dictionary + { + if ($value = $config['value'] ?? null) { + $this->valueKey = $value; + } + + if ($label = $config['label'] ?? null) { + $this->labelKey = $label; + } + + return parent::setConfig($config); + } + + protected function getItemLabel(array $item): string + { + if (str_contains($this->labelKey, '{{')) { + return (string) Antlers::parse($this->labelKey, $item); + } + + return parent::getItemLabel($item); + } + + protected function getItems(): array + { + $path = resource_path('dictionaries').'/'.$this->config['filename']; + + if (! file_exists($path)) { + throw new \Exception('Dictionary file ['.$path.'] does not exist.'); + } + + $extension = pathinfo($path, PATHINFO_EXTENSION); + + return match ($extension) { + 'json' => json_decode(file_get_contents($path), true), + 'yaml' => YAML::file($path)->parse(), + 'csv' => $this->fromCsv($path), + }; + } + + private function fromCsv(string $path): array + { + $rows = []; + + if (($handle = fopen($path, 'r')) !== false) { + $headers = fgetcsv($handle, 1000, ','); + while (($data = fgetcsv($handle, 1000, ',')) !== false) { + $rows[] = array_combine($headers, $data); + } + fclose($handle); + } + + return $rows; + } +} diff --git a/src/Dictionaries/Item.php b/src/Dictionaries/Item.php new file mode 100644 index 0000000000..5ee458f75a --- /dev/null +++ b/src/Dictionaries/Item.php @@ -0,0 +1,43 @@ +extra = array_merge( + $extra, + ['label' => $label] + ); + } + + public function data(): array + { + return Arr::except($this->extra, ['label']); + } + + public function offsetExists(mixed $offset): bool + { + return true; + } + + public function offsetGet(mixed $offset): mixed + { + return $this->data()[$offset]; + } + + public function offsetSet(mixed $offset, mixed $value): void + { + $this->extra[$offset] = $value; + } + + public function offsetUnset(mixed $offset): void + { + unset($this->extra[$offset]); + } +} diff --git a/src/Dictionaries/Timezones.php b/src/Dictionaries/Timezones.php new file mode 100644 index 0000000000..8a4e9420d0 --- /dev/null +++ b/src/Dictionaries/Timezones.php @@ -0,0 +1,33 @@ +map(fn ($tz) => ['name' => $tz, 'offset' => $this->getOffset($tz)]) + ->all(); + } + + private function getOffset(string $tz): string + { + $tz = new DateTimeZone($tz); + $utcTime = Carbon::now('UTC'); + $offsetInSecs = $tz->getOffset($utcTime); + $hoursAndSec = gmdate('H:i', abs($offsetInSecs)); + + return stripos($offsetInSecs, '-') === false ? "+{$hoursAndSec}" : "-{$hoursAndSec}"; + } +} diff --git a/src/Exceptions/DictionaryNotFoundException.php b/src/Exceptions/DictionaryNotFoundException.php new file mode 100644 index 0000000000..dd672f1985 --- /dev/null +++ b/src/Exceptions/DictionaryNotFoundException.php @@ -0,0 +1,11 @@ +dictionaryHandle}] not found"); + } +} diff --git a/src/Exceptions/UndefinedDictionaryException.php b/src/Exceptions/UndefinedDictionaryException.php new file mode 100644 index 0000000000..a9c1f0f56d --- /dev/null +++ b/src/Exceptions/UndefinedDictionaryException.php @@ -0,0 +1,13 @@ + __('Options'), + 'fields' => [ + 'dictionary' => [ + 'type' => 'dictionary_fields', + 'hide_display' => true, + 'full_width_setting' => true, + ], + ], + ], + [ + 'display' => __('Selection'), + 'fields' => [ + 'placeholder' => [ + 'display' => __('Placeholder'), + 'instructions' => __('statamic::fieldtypes.select.config.placeholder'), + 'type' => 'text', + 'default' => '', + ], + 'max_items' => [ + 'display' => __('Max Items'), + 'instructions' => __('statamic::messages.max_items_instructions'), + 'min' => 1, + 'type' => 'integer', + ], + ], + ], + [ + 'display' => __('Data'), + 'fields' => [ + 'default' => [ + 'display' => __('Default Value'), + 'instructions' => __('statamic::messages.fields_default_instructions'), + 'type' => 'text', + ], + ], + ], + ]; + } + + public function preload(): array + { + return [ + 'url' => cp_route('dictionary-fieldtype', $this->dictionary()->handle()), + 'selectedOptions' => $this->getItemData($this->field->value()), + ]; + } + + private function getItemData($values) + { + return collect($values)->map(function ($key) { + $item = $this->dictionary()->get($key); + + return [ + 'value' => $item?->value() ?? $key, + 'label' => $item?->label() ?? $key, + 'invalid' => ! $item, + ]; + })->values()->all(); + } + + public function augment($value) + { + if ($this->multiple() && is_null($value)) { + return []; + } + + $dictionary = $this->dictionary(); + + if ($this->multiple()) { + return collect($value)->map(function ($value) use ($dictionary) { + return $dictionary->get($value); + })->filter()->all(); + } + + $item = $value ? $dictionary->get($value) : null; + + return $item ?? new Item(null, null, []); + } + + public function extraRenderableFieldData(): array + { + return [ + 'multiple' => $this->multiple(), + 'options' => $this->dictionary()->options(), + ]; + } + + protected function multiple(): bool + { + return $this->config('max_items') !== 1; + } + + public function dictionary(): DictionaryInstance + { + $config = is_array($config = $this->config('dictionary')) ? $config : ['type' => $config]; + + if (! $handle = Arr::pull($config, 'type')) { + throw new UndefinedDictionaryException; + } + + if ($dictionary = Dictionaries::find($handle, $config)) { + return $dictionary; + } + + throw new DictionaryNotFoundException($handle); + } + + public function toGqlType() + { + $type = GraphQL::type($this->dictionary()->getGqlType()->name); + + return $this->multiple() + ? $this->multiSelectGqlType($type) + : $this->singleSelectGqlType($type); + } + + private function singleSelectGqlType($type) + { + return [ + 'type' => $type, + 'resolve' => function ($item, $args, $context, $info) { + $resolved = $item->resolveGqlValue($info->fieldName); + + return is_null($resolved->value()) ? null : $resolved; + }, + ]; + } + + private function multiSelectGqlType($type) + { + return [ + 'type' => GraphQL::listOf($type), + 'resolve' => function ($item, $args, $context, $info) { + $resolved = $item->resolveGqlValue($info->fieldName); + + return empty($resolved) ? null : $resolved; + }, + ]; + } + + public function addGqlTypes() + { + GraphQL::addType($this->dictionary()->getGqlType()); + } +} diff --git a/src/Fieldtypes/DictionaryFields.php b/src/Fieldtypes/DictionaryFields.php new file mode 100644 index 0000000000..35cac097bc --- /dev/null +++ b/src/Fieldtypes/DictionaryFields.php @@ -0,0 +1,100 @@ + 'type', + 'field' => [ + 'display' => __('Dictionary'), + 'instructions' => __('statamic::fieldtypes.dictionary.config.dictionary'), + 'type' => 'select', + 'options' => Dictionary::all() + ->mapWithKeys(fn ($dictionary) => [$dictionary->handle() => $dictionary->title()]) + ->all(), + 'max_items' => 1, + 'validate' => 'required', + ], + ]]); + + return [ + 'type' => [ + 'fields' => $typeField->toPublishArray(), + 'meta' => $typeField->meta(), + ], + 'dictionaries' => Dictionary::all()->mapWithKeys(function (\Statamic\Dictionaries\Dictionary $dictionary) { + return [$dictionary->handle() => [ + 'fields' => $dictionary->fields()->toPublishArray(), + 'meta' => $dictionary->fields()->meta(), + 'defaults' => $dictionary->fields()->all()->map(function ($field) { + return $field->fieldtype()->preProcess($field->defaultValue()); + }), + ]]; + }), + ]; + } + + public function preProcess($data): array + { + if (is_null($data)) { + return ['type' => null]; + } + + if (is_string($data)) { + return ['type' => $data]; + } + + $dictionary = Dictionary::find($data['type']); + + return array_merge( + ['type' => $data['type']], + $dictionary->fields()->addValues($data)->preProcess()->values()->all() + ); + } + + public function process($data): string|array + { + $dictionary = Dictionary::find($data['type']); + $values = $dictionary->fields()->addValues($data)->process()->values(); + + if ($values->filter()->isEmpty()) { + return $dictionary->handle(); + } + + return array_merge(['type' => $dictionary->handle()], $values->all()); + } + + public function extraRules(): array + { + if (! $dictionary = Arr::get($this->field->value(), 'type')) { + return [ + $this->field->handle().'.type' => ['required'], + ]; + } + + $dictionary = Dictionary::find($dictionary); + + $rules = $dictionary + ->fields() + ->addValues((array) $this->field->value()) + ->validator() + ->withContext([ + 'prefix' => $this->field->handle().'.', + ]) + ->rules(); + + return collect($rules)->mapWithKeys(function ($rules, $handle) { + return [$this->field->handle().'.'.$handle => $rules]; + })->all(); + } +} diff --git a/src/GraphQL/Types/DictionaryType.php b/src/GraphQL/Types/DictionaryType.php new file mode 100644 index 0000000000..97524e08ef --- /dev/null +++ b/src/GraphQL/Types/DictionaryType.php @@ -0,0 +1,19 @@ +attributes['name'] = 'Dictionary_'.$name; + $this->fields = $fields; + } + + public function fields(): array + { + return $this->fields; + } +} diff --git a/src/Http/Controllers/CP/Fieldtypes/DictionaryFieldtypeController.php b/src/Http/Controllers/CP/Fieldtypes/DictionaryFieldtypeController.php new file mode 100644 index 0000000000..5d442c916f --- /dev/null +++ b/src/Http/Controllers/CP/Fieldtypes/DictionaryFieldtypeController.php @@ -0,0 +1,46 @@ +fieldtype($request); + + return [ + 'data' => $fieldtype->dictionary()->options($request->search), + ]; + } + + protected function fieldtype($request) + { + $config = $this->getConfig($request); + + return Fieldtype::find($config['type'])->setField( + new Field('relationship', $config) + ); + } + + private function getConfig($request) + { + // The fieldtype base64-encodes the config. + $json = base64_decode($request->config); + + // The json may include unicode characters, so we'll try to convert it to UTF-8. + // See https://github.com/statamic/cms/issues/566 + $utf8 = mb_convert_encoding($json, 'UTF-8', mb_list_encodings()); + + // In PHP 8.1 there's a bug where encoding will return null. It's fixed in 8.1.2. + // In this case, we'll fall back to the original JSON, but without the encoding. + // Issue #566 may still occur, but it's better than failing completely. + $json = empty($utf8) ? $json : $utf8; + + return json_decode($json, true); + } +} diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 307bd9e76c..44d463ed76 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Route; use Illuminate\Support\ServiceProvider; use Statamic\Actions\Action; +use Statamic\Dictionaries\Dictionary; use Statamic\Exceptions\NotBootedException; use Statamic\Extend\Manifest; use Statamic\Facades\Addon; @@ -55,6 +56,11 @@ abstract class AddonServiceProvider extends ServiceProvider */ protected $actions = []; + /** + * @var list> + */ + protected $dictionaries = []; + /** * @var list> */ @@ -187,6 +193,7 @@ public function boot() ->bootTags() ->bootScopes() ->bootActions() + ->bootDictionaries() ->bootFieldtypes() ->bootModifiers() ->bootWidgets() @@ -258,6 +265,15 @@ protected function bootActions() return $this; } + protected function bootDictionaries() + { + foreach ($this->dictionaries as $class) { + $class::register(); + } + + return $this; + } + protected function bootFieldtypes() { foreach ($this->fieldtypes as $class) { diff --git a/src/Providers/ConsoleServiceProvider.php b/src/Providers/ConsoleServiceProvider.php index 79f5bb4517..618a82358b 100644 --- a/src/Providers/ConsoleServiceProvider.php +++ b/src/Providers/ConsoleServiceProvider.php @@ -22,6 +22,7 @@ class ConsoleServiceProvider extends ServiceProvider Commands\LicenseSet::class, Commands\MakeAction::class, Commands\MakeAddon::class, + Commands\MakeDictionary::class, Commands\MakeFieldtype::class, Commands\MakeModifier::class, Commands\MakeScope::class, diff --git a/src/Providers/ExtensionServiceProvider.php b/src/Providers/ExtensionServiceProvider.php index 10a0da94a3..e499359dc5 100644 --- a/src/Providers/ExtensionServiceProvider.php +++ b/src/Providers/ExtensionServiceProvider.php @@ -6,6 +6,8 @@ use Illuminate\Support\ServiceProvider; use Statamic\Actions; use Statamic\Actions\Action; +use Statamic\Dictionaries; +use Statamic\Dictionaries\Dictionary; use Statamic\Extend\Manifest; use Statamic\Fields\Fieldtype; use Statamic\Fieldtypes; @@ -48,6 +50,13 @@ class ExtensionServiceProvider extends ServiceProvider Actions\Impersonate::class, ]; + protected $dictionaries = [ + Dictionaries\Countries::class, + Dictionaries\Currencies::class, + Dictionaries\File::class, + Dictionaries\Timezones::class, + ]; + protected $fieldtypes = [ Fieldtypes\Arr::class, Fieldtypes\AssetContainer::class, @@ -63,6 +72,8 @@ class ExtensionServiceProvider extends ServiceProvider Fieldtypes\Collections::class, Fieldtypes\Color::class, Fieldtypes\Date::class, + Fieldtypes\Dictionary::class, + Fieldtypes\DictionaryFields::class, Fieldtypes\Entries::class, Fieldtypes\FieldDisplay::class, Fieldtypes\Files::class, @@ -263,6 +274,11 @@ protected function registerExtensions() 'directory' => 'Actions', 'extensions' => $this->actions, ], + 'dictionaries' => [ + 'class' => Dictionary::class, + 'directory' => 'Dictionaries', + 'extensions' => $this->dictionaries, + ], 'fieldtypes' => [ 'class' => Fieldtype::class, 'directory' => 'Fieldtypes', diff --git a/tests/Console/Commands/Concerns/CleansUpGeneratedPaths.php b/tests/Console/Commands/Concerns/CleansUpGeneratedPaths.php index c72fb1dcc3..45d2a63ed4 100644 --- a/tests/Console/Commands/Concerns/CleansUpGeneratedPaths.php +++ b/tests/Console/Commands/Concerns/CleansUpGeneratedPaths.php @@ -11,6 +11,7 @@ protected function cleanupPaths() $dirs = [ base_path('addons'), base_path('app/Actions'), + base_path('app/Dictionaries'), base_path('app/Fieldtypes'), base_path('app/Modifiers'), base_path('app/Scopes'), diff --git a/tests/Console/Commands/MakeDictionaryTest.php b/tests/Console/Commands/MakeDictionaryTest.php new file mode 100644 index 0000000000..48c9a61832 --- /dev/null +++ b/tests/Console/Commands/MakeDictionaryTest.php @@ -0,0 +1,92 @@ +files = app(Filesystem::class); + $this->fakeSuccessfulComposerRequire(); + } + + public function tearDown(): void + { + $this->cleanupPaths(); + + parent::tearDown(); + } + + #[Test] + public function it_can_make_a_dictionary() + { + $path = base_path('app/Dictionaries/Provinces.php'); + + $this->assertFileDoesNotExist($path); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces']); + + $this->assertFileExists($path); + $this->assertStringContainsString('namespace App\Dictionaries;', $this->files->get($path)); + } + + #[Test] + public function it_will_not_overwrite_an_existing_dictionary() + { + $path = base_path('app/Dictionaries/Provinces.php'); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces']); + $this->files->put($path, 'overwritten action'); + + $this->assertStringContainsString('overwritten action', $this->files->get($path)); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces']); + + $this->assertStringContainsString('overwritten action', $this->files->get($path)); + } + + #[Test] + public function using_force_option_will_overwrite_original_dictionary() + { + $path = base_path('app/Dictionaries/Provinces.php'); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces']); + $this->files->put($path, 'overwritten action'); + + $this->assertStringContainsString('overwritten action', $this->files->get($path)); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces', '--force' => true]); + + $this->assertStringNotContainsString('overwritten action', $this->files->get($path)); + } + + #[Test] + public function it_can_make_a_dictionary_into_an_addon() + { + $path = base_path('addons/yoda/bag-odah'); + + $this->artisan('statamic:make:addon', ['addon' => 'yoda/bag-odah']); + + Composer::shouldReceive('installedPath')->andReturn($path); + + $this->assertFileDoesNotExist($action = "$path/src/Dictionaries/Provinces.php"); + + $this->artisan('statamic:make:dictionary', ['name' => 'Provinces', 'addon' => 'yoda/bag-odah']); + + $this->assertFileExists($action); + $this->assertStringContainsString('namespace Yoda\BagOdah\Dictionaries;', $this->files->get($action)); + } +} diff --git a/tests/Dictionaries/CountriesTest.php b/tests/Dictionaries/CountriesTest.php new file mode 100644 index 0000000000..ffcb6fdadc --- /dev/null +++ b/tests/Dictionaries/CountriesTest.php @@ -0,0 +1,99 @@ +options(); + + $this->assertCount(250, $options); + $this->assertEquals([ + 'AFG' => '🇦🇫 Afghanistan', + 'ALA' => '🇦🇽 Aland Islands', + 'ALB' => '🇦🇱 Albania', + 'DZA' => '🇩🇿 Algeria', + 'ASM' => '🇦🇸 American Samoa', + ], array_slice($options, 0, 5)); + } + + #[Test] + public function it_filters_options_by_region() + { + $options = (new Countries)->setConfig(['region' => 'oceania'])->options(); + + $this->assertCount(27, $options); + $this->assertEquals([ + 'ASM' => '🇦🇸 American Samoa', + 'AUS' => '🇦🇺 Australia', + 'CXR' => '🇨🇽 Christmas Island', + 'CCK' => '🇨🇨 Cocos (Keeling) Islands', + 'COK' => '🇨🇰 Cook Islands', + ], array_slice($options, 0, 5)); + } + + #[Test] + #[DataProvider('searchProvider')] + public function it_searches_options($query, $expected) + { + $this->assertEquals($expected, (new Countries)->options($query)); + } + + public static function searchProvider() + { + return [ + 'au' => [ + 'au', + [ + 'AUS' => '🇦🇺 Australia', + 'AUT' => '🇦🇹 Austria', + 'GNB' => '🇬🇼 Guinea-Bissau', + 'MAC' => '🇲🇴 Macau S.A.R.', + 'MRT' => '🇲🇷 Mauritania', + 'MUS' => '🇲🇺 Mauritius', + 'NRU' => '🇳🇷 Nauru', + 'PLW' => '🇵🇼 Palau', + 'SAU' => '🇸🇦 Saudi Arabia', + 'TKL' => '🇹🇰 Tokelau', + ], + ], + 'us' => [ + 'us', + [ + 'AUS' => '🇦🇺 Australia', + 'AUT' => '🇦🇹 Austria', + 'BLR' => '🇧🇾 Belarus', + 'BES' => '🇧🇶 Bonaire, Sint Eustatius and Saba', + 'CYP' => '🇨🇾 Cyprus', + 'MUS' => '🇲🇺 Mauritius', + 'RUS' => '🇷🇺 Russia', + 'USA' => '🇺🇸 United States', + 'VIR' => '🇻🇮 Virgin Islands (US)', + ], + ], + ]; + } + + #[Test] + public function it_gets_array_from_value() + { + $item = (new Countries)->get('AUS'); + $this->assertInstanceOf(Item::class, $item); + $this->assertEquals([ + 'name' => 'Australia', + 'iso3' => 'AUS', + 'iso2' => 'AU', + 'region' => 'Oceania', + 'subregion' => 'Australia and New Zealand', + 'emoji' => '🇦🇺', + ], $item->data()); + } +} diff --git a/tests/Dictionaries/CurrenciesTest.php b/tests/Dictionaries/CurrenciesTest.php new file mode 100644 index 0000000000..0328dce849 --- /dev/null +++ b/tests/Dictionaries/CurrenciesTest.php @@ -0,0 +1,107 @@ +options(); + + $this->assertCount(119, $options); + $option = $options['USD']; + $this->assertEquals('US Dollar (USD)', $option); + } + + #[Test] + #[DataProvider('searchProvider')] + public function it_searches_options($query, $expected) + { + $this->assertEquals($expected, (new Currencies)->options($query)); + } + + public static function searchProvider() + { + return [ + 'euro' => [ + 'euro', + [ + 'EUR' => 'Euro (EUR)', + ], + ], + 'dollar' => [ + 'dollar', + [ + 'AUD' => 'Australian Dollar (AUD)', + 'BZD' => 'Belize Dollar (BZD)', + 'CAD' => 'Canadian Dollar (CAD)', + 'HKD' => 'Hong Kong Dollar (HKD)', + 'JMD' => 'Jamaican Dollar (JMD)', + 'NAD' => 'Namibian Dollar (NAD)', + 'NZD' => 'New Zealand Dollar (NZD)', + 'SGD' => 'Singapore Dollar (SGD)', + 'TTD' => 'Trinidad and Tobago Dollar (TTD)', + 'USD' => 'US Dollar (USD)', + 'BND' => 'Brunei Dollar (BND)', + 'TWD' => 'New Taiwan Dollar (TWD)', + 'ZWL' => 'Zimbabwean Dollar (ZWL)', + ], + ], + 'dollar symbol' => [ + '$', + [ + 'ARS' => 'Argentine Peso (ARS)', + 'AUD' => 'Australian Dollar (AUD)', + 'BND' => 'Brunei Dollar (BND)', + 'BRL' => 'Brazilian Real (BRL)', + 'BZD' => 'Belize Dollar (BZD)', + 'CAD' => 'Canadian Dollar (CAD)', + 'CLP' => 'Chilean Peso (CLP)', + 'COP' => 'Colombian Peso (COP)', + 'CVE' => 'Cape Verdean Escudo (CVE)', + 'DOP' => 'Dominican Peso (DOP)', + 'HKD' => 'Hong Kong Dollar (HKD)', + 'JMD' => 'Jamaican Dollar (JMD)', + 'MOP' => 'Macanese Pataca (MOP)', + 'MXN' => 'Mexican Peso (MXN)', + 'NAD' => 'Namibian Dollar (NAD)', + 'NIO' => "Nicaraguan C\u00f3rdoba (NIO)", + 'NZD' => 'New Zealand Dollar (NZD)', + 'SGD' => 'Singapore Dollar (SGD)', + 'TOP' => "Tongan Pa\u02bbanga (TOP)", + 'TTD' => 'Trinidad and Tobago Dollar (TTD)', + 'TWD' => 'New Taiwan Dollar (TWD)', + 'USD' => 'US Dollar (USD)', + 'UYU' => 'Uruguayan Peso (UYU)', + 'ZWL' => 'Zimbabwean Dollar (ZWL)', + ], + ], + 'pound symbol' => [ + '£', + [ + 'GBP' => 'British Pound Sterling (GBP)', + ], + ], + ]; + } + + #[Test] + public function it_gets_array_from_value() + { + $item = (new Currencies)->get('USD'); + $this->assertInstanceOf(Item::class, $item); + $this->assertEquals([ + 'name' => 'US Dollar', + 'code' => 'USD', + 'symbol' => '$', + 'decimals' => 2, + ], $item->data()); + } +} diff --git a/tests/Dictionaries/DictionaryRepositoryTest.php b/tests/Dictionaries/DictionaryRepositoryTest.php new file mode 100644 index 0000000000..62df5a27ab --- /dev/null +++ b/tests/Dictionaries/DictionaryRepositoryTest.php @@ -0,0 +1,97 @@ +repo = new DictionaryRepository; + + FakeDictionary::register(); + } + + #[Test] + public function can_get_all_dictionaries() + { + $all = $this->repo->all(); + + $this->assertCount(5, $all); // The built-in dictionaries + our fake one + $this->assertEveryItem($all, fn ($item) => $item instanceof Dictionary); + } + + #[Test] + public function can_get_a_dictionary() + { + $find = $this->repo->find('fake_dictionary'); + + $this->assertInstanceOf(Dictionary::class, $find); + $this->assertSame('fake_dictionary', $find->handle()); + } + + #[Test] + public function ensure_context_is_passed_to_dictionary() + { + $dictionary = $this->repo->find('fake_dictionary', [ + 'sort_in_alphabetical_order' => true, + ]); + + // When the sort_in_alphabetical_order context is passed, + // the options should be returned in alphabetical order. + $this->assertEquals([ + 'bar' => 'Bar', + 'baz' => 'Baz', + 'foo' => 'Foo', + 'qux' => 'Qux', + ], $dictionary->options()); + } +} + +class FakeDictionary extends Dictionary +{ + public function options(?string $search = null): array + { + return $this->data() + ->when($search ?? false, function ($collection) use ($search) { + return $collection->filter(fn ($item) => str_contains($item['id'], $search)); + }) + ->mapWithKeys(fn ($item) => [$item['id'] => $item['name']]) + ->when($this->config['sort_in_alphabetical_order'] ?? false, function ($collection) { + return $collection->sortBy('id'); + }) + ->all(); + } + + public function get(string $key): ?Item + { + return $this->data()->firstWhere('id', $key); + } + + protected function data() + { + return collect([ + ['name' => 'Foo', 'id' => 'foo'], + ['name' => 'Bar', 'id' => 'bar'], + ['name' => 'Baz', 'id' => 'baz'], + ['name' => 'Qux', 'id' => 'qux'], + ]); + } + + protected function fieldItems() + { + return [ + 'sort_in_alphabetical_order' => [ + 'display' => 'Sort in alphabetical order?', + 'type' => 'toggle', + ], + ]; + } +} diff --git a/tests/Dictionaries/FileTest.php b/tests/Dictionaries/FileTest.php new file mode 100644 index 0000000000..cf5f45b8a4 --- /dev/null +++ b/tests/Dictionaries/FileTest.php @@ -0,0 +1,183 @@ + 'apple', 'label' => 'Apple', 'emoji' => '🍎'], + ['value' => 'banana', 'label' => 'Banana', 'emoji' => '🍌'], + ['value' => 'cherry', 'label' => 'Cherry', 'emoji' => '🍒'], + ]; + + Filesystem::put( + resource_path('dictionaries').'/items.'.$extension, + $fileDumpCallback($arr, 'value', 'label') + ); + + $options = (new File) + ->setConfig(['filename' => 'items.'.$extension]) + ->options(); + + $this->assertCount(3, $options); + $this->assertEquals([ + 'apple' => 'Apple', + 'banana' => 'Banana', + 'cherry' => 'Cherry', + ], $options); + } + + #[Test] + #[DataProvider('optionProvider')] + public function it_gets_options_with_custom_value_and_label_keys( + $extension, + $fileDumpCallback + ) { + $arr = [ + ['id' => 'apple', 'name' => 'Apple', 'emoji' => '🍎'], + ['id' => 'banana', 'name' => 'Banana', 'emoji' => '🍌'], + ['id' => 'cherry', 'name' => 'Cherry', 'emoji' => '🍒'], + ]; + + Filesystem::put( + resource_path('dictionaries').'/items.'.$extension, + $fileDumpCallback($arr, 'id', 'name') + ); + + $options = (new File) + ->setConfig([ + 'filename' => 'items.'.$extension, + 'value' => 'id', + 'label' => 'name', + ]) + ->options(); + + $this->assertCount(3, $options); + $this->assertEquals([ + 'apple' => 'Apple', + 'banana' => 'Banana', + 'cherry' => 'Cherry', + ], $options); + } + + #[Test] + #[DataProvider('optionProvider')] + public function it_gets_options_with_antlers_label( + $extension, + $fileDumpCallback + ) { + $arr = [ + ['value' => 'apple', 'name' => 'Apple', 'emoji' => '🍎'], + ['value' => 'banana', 'name' => 'Banana', 'emoji' => '🍌'], + ['value' => 'cherry', 'name' => 'Cherry', 'emoji' => '🍒'], + ]; + + Filesystem::put( + resource_path('dictionaries').'/items.'.$extension, + $fileDumpCallback($arr, 'value', 'name') + ); + + $options = (new File) + ->setConfig([ + 'filename' => 'items.'.$extension, + 'label' => '{{ emoji }} {{ name }}!', + ]) + ->options(); + + $this->assertCount(3, $options); + $this->assertEquals([ + 'apple' => '🍎 Apple!', + 'banana' => '🍌 Banana!', + 'cherry' => '🍒 Cherry!', + ], $options); + } + + public static function optionProvider() + { + return [ + 'yaml' => ['yaml', fn ($arr, $value, $label) => YAML::dump($arr)], + 'json' => ['json', fn ($arr, $value, $label) => json_encode($arr)], + 'csv' => ['csv', fn ($arr, $value, $label) => "{$value},{$label},emoji".PHP_EOL.implode(PHP_EOL, array_map(fn ($item) => implode(',', $item), $arr))], + ]; + } + + #[Test] + #[DataProvider('searchProvider')] + public function it_searches_options($query, $expected) + { + $arr = [ + ['value' => 'apple', 'label' => 'Apple', 'emoji' => '🍎'], + ['value' => 'banana', 'label' => 'Banana', 'emoji' => '🍌'], + ['value' => 'cherry', 'label' => 'Cherry', 'emoji' => '🍒'], + ]; + + Filesystem::put( + resource_path('dictionaries').'/items.yaml', + YAML::dump($arr) + ); + + $dictionary = (new File)->setConfig(['filename' => 'items.yaml']); + + $this->assertEquals($expected, $dictionary->options($query)); + } + + public static function searchProvider() + { + return [ + 'e' => [ + 'e', + [ + 'apple' => 'Apple', + 'cherry' => 'Cherry', + ], + ], + 'n' => [ + 'n', + [ + 'banana' => 'Banana', + ], + ], + ]; + } + + #[Test] + public function it_gets_array_from_value() + { + $arr = [ + ['value' => 'apple', 'label' => 'Apple', 'emoji' => '🍎'], + ['value' => 'banana', 'label' => 'Banana', 'emoji' => '🍌'], + ['value' => 'cherry', 'label' => 'Cherry', 'emoji' => '🍒'], + ]; + + Filesystem::put( + resource_path('dictionaries').'/items.yaml', + YAML::dump($arr) + ); + + $item = (new File) + ->setConfig(['filename' => 'items.yaml']) + ->get('banana'); + + $this->assertInstanceOf(Item::class, $item); + $this->assertEquals('Banana', $item->label()); + $this->assertEquals('banana', $item->value()); + $this->assertEquals([ + 'value' => 'banana', + 'emoji' => '🍌', + ], $item->data()); + } +} diff --git a/tests/Dictionaries/ItemTest.php b/tests/Dictionaries/ItemTest.php new file mode 100644 index 0000000000..6dc623060b --- /dev/null +++ b/tests/Dictionaries/ItemTest.php @@ -0,0 +1,31 @@ + 'Apple', // Ensures the label argument takes precedence. + 'color' => 'red', + 'emoji' => '🍎', + ]); + + $this->assertEquals('apple', $item->value()); + $this->assertEquals('🍎 Apple', $item->label()); + $this->assertEquals(['color' => 'red', 'emoji' => '🍎'], $item->data()); + $this->assertEquals([ + 'key' => 'apple', + 'value' => 'apple', + 'color' => 'red', + 'emoji' => '🍎', + 'label' => '🍎 Apple', + ], $item->toArray()); + } +} diff --git a/tests/Dictionaries/TimezonesTest.php b/tests/Dictionaries/TimezonesTest.php new file mode 100644 index 0000000000..b426a4ae51 --- /dev/null +++ b/tests/Dictionaries/TimezonesTest.php @@ -0,0 +1,115 @@ +options(); + + $this->assertCount(419, $options); + $this->assertEquals([ + 'Africa/Abidjan' => 'Africa/Abidjan (+00:00)', + 'Africa/Accra' => 'Africa/Accra (+00:00)', + 'Africa/Addis_Ababa' => 'Africa/Addis_Ababa (+03:00)', + 'Pacific/Wake' => 'Pacific/Wake (+12:00)', + 'Pacific/Wallis' => 'Pacific/Wallis (+12:00)', + 'UTC' => 'UTC (+00:00)', + ], [...array_slice($options, 0, 3), ...array_slice($options, -3, 3)]); + } + + #[Test] + #[DataProvider('searchProvider')] + public function it_searches_options($query, $expected) + { + // UTC offsets can change during daylight saving time, so we need to freeze time. + Carbon::setTestNow('2024-07-23'); + + $this->assertEquals($expected, (new Timezones)->options($query)); + } + + public static function searchProvider() + { + return [ + 'new' => [ + 'new', + [ + 'America/New_York' => 'America/New_York (-04:00)', + 'America/North_Dakota/New_Salem' => 'America/North_Dakota/New_Salem (-05:00)', + ], + ], + 'ten' => [ + '10', + [ + 'Antarctica/DumontDUrville' => 'Antarctica/DumontDUrville (+10:00)', + 'Antarctica/Macquarie' => 'Antarctica/Macquarie (+10:00)', + 'Asia/Ust-Nera' => 'Asia/Ust-Nera (+10:00)', + 'Asia/Vladivostok' => 'Asia/Vladivostok (+10:00)', + 'Australia/Brisbane' => 'Australia/Brisbane (+10:00)', + 'Australia/Hobart' => 'Australia/Hobart (+10:00)', + 'Australia/Lindeman' => 'Australia/Lindeman (+10:00)', + 'Australia/Lord_Howe' => 'Australia/Lord_Howe (+10:30)', + 'Australia/Melbourne' => 'Australia/Melbourne (+10:00)', + 'Australia/Sydney' => 'Australia/Sydney (+10:00)', + 'Pacific/Chuuk' => 'Pacific/Chuuk (+10:00)', + 'Pacific/Guam' => 'Pacific/Guam (+10:00)', + 'Pacific/Honolulu' => 'Pacific/Honolulu (-10:00)', + 'Pacific/Port_Moresby' => 'Pacific/Port_Moresby (+10:00)', + 'Pacific/Rarotonga' => 'Pacific/Rarotonga (-10:00)', + 'Pacific/Saipan' => 'Pacific/Saipan (+10:00)', + 'Pacific/Tahiti' => 'Pacific/Tahiti (-10:00)', + ], + ], + 'plus ten' => [ + '+10', + [ + 'Antarctica/DumontDUrville' => 'Antarctica/DumontDUrville (+10:00)', + 'Antarctica/Macquarie' => 'Antarctica/Macquarie (+10:00)', + 'Asia/Ust-Nera' => 'Asia/Ust-Nera (+10:00)', + 'Asia/Vladivostok' => 'Asia/Vladivostok (+10:00)', + 'Australia/Brisbane' => 'Australia/Brisbane (+10:00)', + 'Australia/Hobart' => 'Australia/Hobart (+10:00)', + 'Australia/Lindeman' => 'Australia/Lindeman (+10:00)', + 'Australia/Lord_Howe' => 'Australia/Lord_Howe (+10:30)', + 'Australia/Melbourne' => 'Australia/Melbourne (+10:00)', + 'Australia/Sydney' => 'Australia/Sydney (+10:00)', + 'Pacific/Chuuk' => 'Pacific/Chuuk (+10:00)', + 'Pacific/Guam' => 'Pacific/Guam (+10:00)', + 'Pacific/Port_Moresby' => 'Pacific/Port_Moresby (+10:00)', + 'Pacific/Saipan' => 'Pacific/Saipan (+10:00)', + ], + ], + 'minus ten' => [ + '-10', + [ + 'Pacific/Honolulu' => 'Pacific/Honolulu (-10:00)', + 'Pacific/Rarotonga' => 'Pacific/Rarotonga (-10:00)', + 'Pacific/Tahiti' => 'Pacific/Tahiti (-10:00)', + ], + ], + ]; + } + + #[Test] + public function it_gets_array_from_value() + { + // UTC offsets can change during daylight saving time, so we need to freeze time. + Carbon::setTestNow('2024-07-23'); + + $item = (new Timezones)->get('America/New_York'); + $this->assertInstanceOf(Item::class, $item); + $this->assertEquals([ + 'name' => 'America/New_York', + 'offset' => '-04:00', + ], $item->data()); + } +} diff --git a/tests/Feature/GraphQL/Fieldtypes/DictionaryFieldtypeTest.php b/tests/Feature/GraphQL/Fieldtypes/DictionaryFieldtypeTest.php new file mode 100644 index 0000000000..6ec56a0fa7 --- /dev/null +++ b/tests/Feature/GraphQL/Fieldtypes/DictionaryFieldtypeTest.php @@ -0,0 +1,91 @@ +createEntryWithFields([ + 'undefined' => [ + 'value' => null, + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'countries']], + ], + 'country' => [ + 'value' => 'USA', + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'countries'], 'max_items' => 1], + ], + 'countries' => [ + 'value' => ['AUS', 'USA'], + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'countries']], + ], + 'timezone' => [ + 'value' => 'America/New_York', + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'timezones'], 'max_items' => 1], + ], + 'timezones' => [ + 'value' => ['Australia/Sydney', 'America/New_York'], + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'timezones']], + ], + 'currency' => [ + 'value' => 'USD', + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'currencies'], 'max_items' => 1], + ], + 'currencies' => [ + 'value' => ['GBP', 'USD'], + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'currencies']], + ], + ]); + + $this->assertGqlEntryHas(' + undefined { name, iso2 } + country { name, iso2 } + countries { name, iso2 } + timezone { name, offset } + timezones { name, offset } + currency { name, code, symbol } + currencies { name, code, symbol } + ', [ + 'undefined' => null, + 'country' => ['name' => 'United States', 'iso2' => 'US'], + 'countries' => [['name' => 'Australia', 'iso2' => 'AU'], ['name' => 'United States', 'iso2' => 'US']], + 'timezone' => ['name' => 'America/New_York', 'offset' => '-04:00'], + 'timezones' => [['name' => 'Australia/Sydney', 'offset' => '+10:00'], ['name' => 'America/New_York', 'offset' => '-04:00']], + 'currency' => ['name' => 'US Dollar', 'code' => 'USD', 'symbol' => '$'], + 'currencies' => [['name' => 'British Pound Sterling', 'code' => 'GBP', 'symbol' => '£'], ['name' => 'US Dollar', 'code' => 'USD', 'symbol' => '$']], + ]); + } + + #[Test] + public function it_filters_out_invalid_values() + { + $this->createEntryWithFields([ + 'timezone' => [ + 'value' => 'Somewhere/Nowhere', + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'timezones'], 'max_items' => 1], + ], + 'timezones' => [ + 'value' => ['Somewhere/Nowhere', 'America/New_York'], + 'field' => ['type' => 'dictionary', 'dictionary' => ['type' => 'timezones']], + ], + ]); + + $this->assertGqlEntryHas(' + timezone { name } + timezones { name } + ', [ + 'timezone' => null, + 'timezones' => [['name' => 'America/New_York']], + ]); + } +} diff --git a/tests/Fieldtypes/DictionaryFieldsTest.php b/tests/Fieldtypes/DictionaryFieldsTest.php new file mode 100644 index 0000000000..ade9f3e1c5 --- /dev/null +++ b/tests/Fieldtypes/DictionaryFieldsTest.php @@ -0,0 +1,156 @@ +preload(); + + $this->assertArraySubset([ + 'type' => [ + 'fields' => [ + ['handle' => 'type', 'type' => 'select'], + ], + 'meta' => collect(['type' => null]), + ], + ], $preload); + + $this->assertArraySubset([ + 'fake_dictionary' => [ + 'fields' => [ + ['handle' => 'category', 'type' => 'select'], + ], + 'meta' => collect(['category' => null]), + 'defaults' => collect(['category' => null]), + ], + ], $preload['dictionaries']->all()); + } + + #[Test] + public function it_pre_processes_dictionary_fields() + { + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + + $preProcess = $fieldtype->preProcess([ + 'type' => 'fake_dictionary', + 'category' => 'foo', + ]); + + $this->assertEquals([ + 'type' => 'fake_dictionary', + 'category' => 'foo', + ], $preProcess); + } + + #[Test] + public function it_pre_processes_dictionary_fields_saved_as_a_string() + { + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + + $preProcess = $fieldtype->preProcess('fake_dictionary'); + + $this->assertEquals([ + 'type' => 'fake_dictionary', + ], $preProcess); + } + + #[Test] + public function it_processes_dictionary_fields() + { + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + + $process = $fieldtype->process([ + 'type' => 'fake_dictionary', + 'category' => 'foo', + ]); + + $this->assertEquals([ + 'type' => 'fake_dictionary', + 'category' => 'foo', + ], $process); + } + + #[Test] + public function it_processes_dictionary_fields_into_a_string_when_dictionary_has_no_config_values() + { + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + + $process = $fieldtype->process([ + 'type' => 'fake_dictionary', + ]); + + $this->assertEquals('fake_dictionary', $process); + } + + #[Test] + public function it_returns_validation_rules() + { + $field = (new Field('test', ['type' => 'dictionary_fields']))->setValue(['type' => 'fake_dictionary']); + + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + $fieldtype->setField($field); + + $extraRules = $fieldtype->extraRules(); + + $this->assertEquals([ + 'test.category' => ['required'], + ], $extraRules); + } + + #[Test] + public function it_returns_validation_rules_when_no_dictionary_is_selected() + { + $field = (new Field('test', ['type' => 'dictionary_fields'])); + + $fieldtype = FieldtypeRepository::find('dictionary_fields'); + $fieldtype->setField($field); + + $extraRules = $fieldtype->extraRules(); + + $this->assertEquals([ + 'test.type' => ['required'], + ], $extraRules); + } +} + +class FakeDictionary extends Dictionary +{ + public function options(?string $search = null): array + { + return []; + } + + public function get(string $key): ?Item + { + return []; + } + + protected function fieldItems() + { + return [ + 'category' => [ + 'type' => 'select', + 'validate' => 'required', + ], + ]; + } +} diff --git a/tests/Fieldtypes/DictionaryTest.php b/tests/Fieldtypes/DictionaryTest.php new file mode 100644 index 0000000000..eac8639263 --- /dev/null +++ b/tests/Fieldtypes/DictionaryTest.php @@ -0,0 +1,245 @@ + 'dictionary', 'dictionary' => $dictionaryConfig])); + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $dictionary = $fieldtype->dictionary(); + $this->assertInstanceOf(Countries::class, $dictionary); + $this->assertEquals($expectedConfig, $dictionary->config()); + } + + public static function dictionaryConfigProvider() + { + return [ + 'string' => [ + 'countries', + [], + ], + 'array' => [ + ['type' => 'countries', 'foo' => 'bar', 'baz' => 'qux'], + ['foo' => 'bar', 'baz' => 'qux'], + ], + ]; + } + + #[Test] + #[DataProvider('undefinedDictionaryConfigProvider')] + public function it_throw_exception_when_dictionary_is_undefined($dictionaryConfig) + { + $this->expectException(UndefinedDictionaryException::class); + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => $dictionaryConfig])); + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + $fieldtype->dictionary(); + } + + public static function undefinedDictionaryConfigProvider() + { + return [ + 'string' => [null], + 'array' => [['foo' => 'bar']], + ]; + } + + #[Test] + #[DataProvider('invalidDictionaryConfigProvider')] + public function it_throws_exception_when_invalid_dictionary_is_defined($dictionaryConfig) + { + $this->expectException(DictionaryNotFoundException::class); + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => $dictionaryConfig])); + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + $fieldtype->dictionary(); + } + + public static function invalidDictionaryConfigProvider() + { + return [ + 'string' => ['invalid'], + 'array' => [['type' => 'invalid']], + ]; + } + + #[Test] + public function it_returns_preload_data() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries'])); + $field->setValue(['USA', 'AUS', 'CAN', 'BLA', 'DEU', 'GBR']); + + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $preload = $fieldtype->preload(); + + $this->assertArraySubset([ + 'url' => 'http://localhost/cp/fieldtypes/dictionaries/countries', + 'selectedOptions' => [ + ['value' => 'USA', 'label' => '🇺🇸 United States', 'invalid' => false], + ['value' => 'AUS', 'label' => '🇦🇺 Australia', 'invalid' => false], + ['value' => 'CAN', 'label' => '🇨🇦 Canada', 'invalid' => false], + ['value' => 'BLA', 'label' => 'BLA', 'invalid' => true], + ['value' => 'DEU', 'label' => '🇩🇪 Germany', 'invalid' => false], + ['value' => 'GBR', 'label' => '🇬🇧 United Kingdom', 'invalid' => false], + ], + ], $preload); + } + + #[Test] + public function it_augments_a_single_option() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries', 'max_items' => 1])); + + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $augmented = $fieldtype->augment('USA'); + $this->assertInstanceOf(Item::class, $augmented); + $this->assertEquals('USA', $augmented->value()); + $this->assertEquals('🇺🇸 United States', $augmented->label()); + $this->assertEquals([ + 'key' => 'USA', + 'name' => 'United States', + 'iso3' => 'USA', + 'iso2' => 'US', + 'region' => 'Americas', + 'subregion' => 'Northern America', + 'emoji' => '🇺🇸', + 'value' => 'USA', + 'label' => '🇺🇸 United States', + ], $augmented->toArray()); + + $augmented = $fieldtype->augment(null); + $this->assertInstanceOf(Item::class, $augmented); + $this->assertNull($augmented->value()); + $this->assertNull($augmented->label()); + } + + #[Test] + public function it_augments_multiple_options() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries'])); + + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $augment = $fieldtype->augment(['USA', 'GBR']); + + $this->assertEveryItemIsInstanceOf(Item::class, $augment); + + $this->assertEquals([ + [ + 'name' => 'United States', + 'key' => 'USA', + 'iso3' => 'USA', + 'iso2' => 'US', + 'region' => 'Americas', + 'subregion' => 'Northern America', + 'emoji' => '🇺🇸', + 'value' => 'USA', + 'label' => '🇺🇸 United States', + ], + [ + 'name' => 'United Kingdom', + 'key' => 'GBR', + 'iso3' => 'GBR', + 'iso2' => 'GB', + 'region' => 'Europe', + 'subregion' => 'Northern Europe', + 'emoji' => '🇬🇧', + 'value' => 'GBR', + 'label' => '🇬🇧 United Kingdom', + ], + ], collect($augment)->toArray()); + } + + #[Test] + public function it_augments_to_empty_array_when_null_and_configured_for_multiple() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries'])); + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $this->assertEquals([], $fieldtype->augment(null)); + } + + #[Test] + public function invalid_value_augments_to_null() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries', 'max_items' => 1])); + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $augmented = $fieldtype->augment('invalid'); + $this->assertInstanceOf(Item::class, $augmented); + $this->assertNull($augmented->value()); + $this->assertNull($augmented->label()); + } + + #[Test] + public function it_filters_out_invalid_values_when_augmenting_multiple() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries'])); + + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $augment = $fieldtype->augment(['USA', 'Invalid']); + + $this->assertCount(1, $augment); + $this->assertEveryItemIsInstanceOf(Item::class, $augment); + $this->assertEquals([ + [ + 'name' => 'United States', + 'key' => 'USA', + 'iso3' => 'USA', + 'iso2' => 'US', + 'region' => 'Americas', + 'subregion' => 'Northern America', + 'emoji' => '🇺🇸', + 'value' => 'USA', + 'label' => '🇺🇸 United States', + ], + ], collect($augment)->toArray()); + } + + #[Test] + public function it_returns_extra_renderable_field_data() + { + $field = (new Field('test', ['type' => 'dictionary', 'dictionary' => 'countries'])); + $field->setValue(['USA', 'AUS', 'CAN', 'DEU', 'GBR']); + + $fieldtype = FieldtypeRepository::find('dictionary'); + $fieldtype->setField($field); + + $extraRenderableFieldData = $fieldtype->extraRenderableFieldData(); + + $this->assertArraySubset([ + 'options' => [ + 'AUS' => '🇦🇺 Australia', + 'CAN' => '🇨🇦 Canada', + 'DEU' => '🇩🇪 Germany', + 'GBR' => '🇬🇧 United Kingdom', + 'USA' => '🇺🇸 United States', + ], + ], $extraRenderableFieldData); + } +} From 9d9c8f7d70d395a24e954c3a2e297155f4396b61 Mon Sep 17 00:00:00 2001 From: Vic Luijkx Date: Mon, 29 Jul 2024 18:00:19 +0200 Subject: [PATCH 014/249] [5.x] Replace percentages in filenames (#10523) --- src/Assets/AssetUploader.php | 1 + tests/Assets/AssetUploaderTest.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Assets/AssetUploader.php b/src/Assets/AssetUploader.php index b89e221830..3dfdcad99e 100644 --- a/src/Assets/AssetUploader.php +++ b/src/Assets/AssetUploader.php @@ -89,6 +89,7 @@ public static function getSafeFilename($string) '|' => '-', '?' => '-', '*' => '-', + '%' => '-', ]; $str = Stringy::create(urldecode($string))->toAscii(); diff --git a/tests/Assets/AssetUploaderTest.php b/tests/Assets/AssetUploaderTest.php index 6c080e71c9..2bbb70c1a1 100644 --- a/tests/Assets/AssetUploaderTest.php +++ b/tests/Assets/AssetUploaderTest.php @@ -30,6 +30,7 @@ public static function filenameReplacementsProvider() 'pipes' => ['one|two.jpg', 'one-two.jpg'], 'question marks' => ['one?two.jpg', 'one-two.jpg'], 'asterisks' => ['one*two.jpg', 'one-two.jpg'], + 'percentage' => ['one%two.jpg', 'one-two.jpg'], ]; } } From c7e132ad3e4a15208700f357c0b2f9b581b9c1f5 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 29 Jul 2024 17:00:33 +0100 Subject: [PATCH 015/249] [5.x] Prevent error when redirecting to first asset container (#10521) --- .../Controllers/CP/Assets/RedirectsToFirstAssetContainer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/CP/Assets/RedirectsToFirstAssetContainer.php b/src/Http/Controllers/CP/Assets/RedirectsToFirstAssetContainer.php index 03fd067323..86fb6f230a 100644 --- a/src/Http/Controllers/CP/Assets/RedirectsToFirstAssetContainer.php +++ b/src/Http/Controllers/CP/Assets/RedirectsToFirstAssetContainer.php @@ -13,7 +13,7 @@ public function redirectToFirstContainer() { $firstContainerInNav = Nav::build()->pluck('items')->flatten() ->filter(fn (NavItem $navItem) => $navItem->url() === cp_route('assets.index')) - ->map(fn (NavItem $navItem) => $navItem->children()?->first()) + ->map(fn (NavItem $navItem) => $navItem->resolveChildren()->children()?->first()) ->first(); if ($firstContainerInNav) { From f9777b8c8c0ec38047b55028a9ad4ff79e60b8bb Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 30 Jul 2024 02:35:25 +0100 Subject: [PATCH 016/249] [5.x] Make it possible to add to form configuration screen (#8491) Co-authored-by: Duncan McClean Co-authored-by: Jason Varga --- src/Facades/Form.php | 2 + src/Forms/Form.php | 34 +++++++++++------ src/Forms/FormRepository.php | 34 +++++++++++++++++ .../Controllers/CP/Forms/FormsController.php | 31 ++++++++++++--- tests/Feature/Forms/EditFormTest.php | 34 +++++++++++++++++ tests/Feature/Forms/UpdateFormTest.php | 33 ++++++++++++++++ tests/Forms/FormRepositoryTest.php | 38 +++++++++++++++++++ tests/Forms/FormTest.php | 10 ++++- 8 files changed, 199 insertions(+), 17 deletions(-) diff --git a/src/Facades/Form.php b/src/Facades/Form.php index 9842ae975e..6bc7a1cf44 100644 --- a/src/Facades/Form.php +++ b/src/Facades/Form.php @@ -10,6 +10,8 @@ * @method static \Statamic\Contracts\Forms\Form findOrFail($handle) * @method static \Illuminate\Support\Collection all() * @method static \Statamic\Contracts\Forms\Form make($handle = null) + * @method static array extraConfigFor($handle) + * @method static void appendConfigFields($handle, $display, $fields) * * @see \Statamic\Contracts\Forms\FormRepository */ diff --git a/src/Forms/Form.php b/src/Forms/Form.php index ab5ab455a2..e5af45130d 100644 --- a/src/Forms/Form.php +++ b/src/Forms/Form.php @@ -8,6 +8,7 @@ use Statamic\Contracts\Forms\Form as FormContract; use Statamic\Contracts\Forms\Submission; use Statamic\Contracts\Forms\SubmissionQueryBuilder; +use Statamic\Data\ContainsData; use Statamic\Data\HasAugmentedInstance; use Statamic\Events\FormBlueprintFound; use Statamic\Events\FormCreated; @@ -29,7 +30,7 @@ class Form implements Arrayable, Augmentable, FormContract { - use FluentlyGetsAndSets, HasAugmentedInstance; + use ContainsData, FluentlyGetsAndSets, HasAugmentedInstance; protected $handle; protected $title; @@ -41,6 +42,11 @@ class Form implements Arrayable, Augmentable, FormContract protected $afterSaveCallbacks = []; protected $withEvents = true; + public function __construct() + { + $this->data = collect(); + } + /** * Get or set the handle. * @@ -186,7 +192,7 @@ public function save() } } - $data = collect([ + $data = $this->data->merge(collect([ 'title' => $this->title, 'honeypot' => $this->honeypot, 'email' => collect(isset($this->email['to']) ? [$this->email] : $this->email)->map(function ($email) { @@ -196,7 +202,7 @@ public function save() return Arr::removeNullValues($email); })->all(), 'metrics' => $this->metrics, - ])->filter()->all(); + ]))->filter()->all(); if ($this->store === false) { $data['store'] = false; @@ -254,14 +260,20 @@ public function delete() */ public function hydrate() { - collect(YAML::parse(File::get($this->path()))) - ->filter(function ($value, $property) { - return in_array($property, [ - 'title', - 'honeypot', - 'store', - 'email', - ]); + $contents = YAML::parse(File::get($this->path())); + + $methods = [ + 'title', + 'honeypot', + 'store', + 'email', + ]; + + $this->merge(collect($contents)->except($methods)); + + collect($contents) + ->filter(function ($value, $property) use ($methods) { + return in_array($property, $methods); }) ->each(function ($value, $property) { $this->{$property}($value); diff --git a/src/Forms/FormRepository.php b/src/Forms/FormRepository.php index b18557fb3a..dbef859b5a 100644 --- a/src/Forms/FormRepository.php +++ b/src/Forms/FormRepository.php @@ -10,9 +10,12 @@ use Statamic\Facades\File; use Statamic\Facades\Folder; use Statamic\Forms\Exporters\ExporterRepository; +use Statamic\Support\Arr; +use Statamic\Support\Str; class FormRepository implements Contract { + private $configs = []; private $redirects = []; /** @@ -82,6 +85,37 @@ public function make($handle = null) return $form; } + public function appendConfigFields($handles, string $display, array $fields) + { + $this->configs[] = [ + 'display' => $display, + 'handles' => Arr::wrap($handles), + 'fields' => $fields, + ]; + } + + public function extraConfigFor($handle) + { + $reserved = ['title', 'honeypot', 'store', 'email']; + + return collect($this->configs) + ->filter(function ($config) use ($handle) { + return in_array('*', $config['handles']) || in_array($handle, $config['handles']); + }) + ->flatMap(function ($config) use ($reserved) { + + return [ + Str::snake($config['display']) => [ + 'display' => $config['display'], + 'fields' => collect($config['fields']) + ->filter(fn ($field, $index) => ! in_array($field['handle'] ?? $index, $reserved)) + ->all(), + ], + ]; + }) + ->all(); + } + public function redirect(string $form, Closure $callback) { $this->redirects[$form] = $callback; diff --git a/src/Http/Controllers/CP/Forms/FormsController.php b/src/Http/Controllers/CP/Forms/FormsController.php index a2c53b7399..73b2c65cfb 100644 --- a/src/Http/Controllers/CP/Forms/FormsController.php +++ b/src/Http/Controllers/CP/Forms/FormsController.php @@ -151,13 +151,13 @@ public function edit($form) { $this->authorize('edit', $form); - $values = [ + $values = array_merge($form->data()->all(), [ 'handle' => $form->handle(), 'title' => __($form->title()), 'honeypot' => $form->honeypot(), 'store' => $form->store(), 'email' => $form->email(), - ]; + ]); $fields = ($blueprint = $this->editFormBlueprint($form)) ->fields() @@ -182,11 +182,14 @@ public function update($form, Request $request) $values = $fields->process()->values()->all(); + $data = collect($values)->except(['title', 'honeypot', 'store', 'email']); + $form ->title($values['title']) ->honeypot($values['honeypot']) ->store($values['store']) - ->email($values['email']); + ->email($values['email']) + ->merge($data); $form->save(); @@ -202,7 +205,7 @@ public function destroy($form) protected function editFormBlueprint($form) { - return Blueprint::makeFromTabs([ + $fields = [ 'name' => [ 'display' => __('Name'), 'fields' => [ @@ -349,6 +352,24 @@ protected function editFormBlueprint($form) ], // metrics - ]); + // ... + + ]; + + foreach (Form::extraConfigFor($form->handle()) as $handle => $config) { + $merged = false; + foreach ($fields as $sectionHandle => $section) { + if ($section['display'] == $config['display']) { + $fields[$sectionHandle]['fields'] += $config['fields']; + $merged = true; + } + } + + if (! $merged) { + $fields[$handle] = $config; + } + } + + return Blueprint::makeFromTabs($fields); } } diff --git a/tests/Feature/Forms/EditFormTest.php b/tests/Feature/Forms/EditFormTest.php index 0721917a9c..db856a869e 100644 --- a/tests/Feature/Forms/EditFormTest.php +++ b/tests/Feature/Forms/EditFormTest.php @@ -49,4 +49,38 @@ public function it_denies_access_if_you_dont_have_permission() ->assertRedirect('/original') ->assertSessionHas('error'); } + + #[Test] + public function fields_can_be_added() + { + $this->setTestRoles(['test' => ['access cp', 'configure forms']]); + $user = User::make()->assignRole('test')->save(); + $form = tap(Form::make('test'))->save(); + + Form::appendConfigFields('*', 'Fields', [ + 'a' => ['type' => 'text', 'display' => 'First injected into fields section'], + 'b' => ['type' => 'text', 'display' => 'Second injected into fields section'], + ]); + Form::appendConfigFields('*', 'Additional Section', [ + 'c' => ['type' => 'text', 'display' => 'First injected into additional section'], + 'd' => ['type' => 'text', 'display' => 'Second injected into additional section'], + ]); + + $this + ->actingAs($user) + ->get(cp_route('forms.edit', $form->handle())) + ->assertSuccessful() + ->assertViewHas('form', $form) + ->assertSeeInOrder([ + 'Title', + 'Blueprint', + 'Honeypot', + 'First injected into fields section', + 'Second injected into fields section', + 'Store Submissions', + 'Additional Section', + 'First injected into additional section', + 'Second injected into additional section', + ]); + } } diff --git a/tests/Feature/Forms/UpdateFormTest.php b/tests/Feature/Forms/UpdateFormTest.php index a0d1e50830..65c1717f0a 100644 --- a/tests/Feature/Forms/UpdateFormTest.php +++ b/tests/Feature/Forms/UpdateFormTest.php @@ -108,6 +108,39 @@ public function it_updates_emails() ], $updated->email()); } + /** @test */ + public function it_updates_data() + { + $form = tap(Form::make('test'))->save(); + $this->assertNull($form->email()); + + Form::appendConfigFields('*', 'Test Config', [ + 'another_config' => [ + 'handle' => 'another_config', + 'field' => [ + 'type' => 'text', + ], + ], + 'some_config' => [ + 'handle' => 'some_config', + 'field' => [ + 'type' => 'text', + ], + ], + ]); + + $this + ->actingAs($this->userWithPermission()) + ->update($form, ['some_config' => 'foo', 'another_config' => 'bar']) + ->assertOk(); + + $updated = Form::all()->first(); + $this->assertEquals([ + 'another_config' => 'bar', + 'some_config' => 'foo', + ], $updated->data()->all()); + } + private function userWithoutPermission() { $this->setTestRoles(['test' => ['access cp']]); diff --git a/tests/Forms/FormRepositoryTest.php b/tests/Forms/FormRepositoryTest.php index e93b1fee8a..3f3011ad0e 100644 --- a/tests/Forms/FormRepositoryTest.php +++ b/tests/Forms/FormRepositoryTest.php @@ -42,4 +42,42 @@ public function test_find_or_fail_throws_exception_when_form_does_not_exist() $this->repo->findOrFail('does-not-exist'); } + + /** @test */ + public function it_registers_config() + { + $this->repo->appendConfigFields('test_form', 'Test Config', [ + 'alfa' => ['type' => 'text'], + 'bravo' => ['type' => 'text'], + ]); + + $this->repo->appendConfigFields('*', 'This Goes Everywhere', [ + ['charlie' => ['type' => 'text']], + ]); + + $this->assertEquals([ + 'test_config' => [ + 'display' => 'Test Config', + 'fields' => [ + 'alfa' => ['type' => 'text'], + 'bravo' => ['type' => 'text'], + ], + ], + 'this_goes_everywhere' => [ + 'display' => 'This Goes Everywhere', + 'fields' => [ + ['charlie' => ['type' => 'text']], + ], + ], + ], $this->repo->extraConfigFor('test_form')); + + $this->assertEquals([ + 'this_goes_everywhere' => [ + 'display' => 'This Goes Everywhere', + 'fields' => [ + ['charlie' => ['type' => 'text']], + ], + ], + ], $this->repo->extraConfigFor('another_form')); + } } diff --git a/tests/Forms/FormTest.php b/tests/Forms/FormTest.php index 13105f8b8c..46cc05daa9 100644 --- a/tests/Forms/FormTest.php +++ b/tests/Forms/FormTest.php @@ -33,13 +33,21 @@ public function it_saves_a_form() $form = Form::make('contact_us') ->title('Contact Us') - ->honeypot('winnie'); + ->honeypot('winnie') + ->data([ + 'foo' => 'bar', + 'roo' => 'rar', + ]); $form->save(); $this->assertEquals('contact_us', $form->handle()); $this->assertEquals('Contact Us', $form->title()); $this->assertEquals('winnie', $form->honeypot()); + $this->assertEquals([ + 'foo' => 'bar', + 'roo' => 'rar', + ], $form->data()->all()); Event::assertDispatched(FormCreating::class, function ($event) use ($form) { return $event->form === $form; From e4d6e45dfb041aede770f56a637711fa610250e3 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Tue, 30 Jul 2024 09:30:37 -0400 Subject: [PATCH 017/249] [5.x] Avoid extending already-extended file cache store (#10526) --- src/Providers/CacheServiceProvider.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Providers/CacheServiceProvider.php b/src/Providers/CacheServiceProvider.php index 642dd7d46e..6a598cf431 100644 --- a/src/Providers/CacheServiceProvider.php +++ b/src/Providers/CacheServiceProvider.php @@ -46,6 +46,12 @@ private function extendFileStore() ), $this->app['config']['cache.stores.file']); }); + // Don't extend the file store if it's already being extended. + $creators = (fn () => $this->customCreators)->call(Cache::getFacadeRoot()); + if (isset($creators['file'])) { + return; + } + Cache::extend('file', function ($app, $config) { return Cache::repository( (new FileStore($app['files'], $config['path'], $config['permission'] ?? null)) From dc2da263d42dccbd887d3c3e0db93d98fd8e20d2 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Tue, 30 Jul 2024 09:40:23 -0400 Subject: [PATCH 018/249] [5.x] Fix error when changing dictionary type (#10530) --- resources/js/components/fieldtypes/DictionaryFields.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/components/fieldtypes/DictionaryFields.vue b/resources/js/components/fieldtypes/DictionaryFields.vue index 6c92a372d0..8649ce1b07 100644 --- a/resources/js/components/fieldtypes/DictionaryFields.vue +++ b/resources/js/components/fieldtypes/DictionaryFields.vue @@ -71,10 +71,10 @@ export default { }, watch: { - dictionary() { + dictionary(dictionary) { this.update({ type: dictionary, - ...this.meta.dictionaries[this.dictionary]?.defaults + ...this.meta.dictionaries[dictionary]?.defaults }) }, }, From 7d534e484ad023780110ba74c194bcad26aa7f99 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Tue, 30 Jul 2024 12:32:29 -0400 Subject: [PATCH 019/249] changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d0826225f..95ab40f0ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Release Notes +## 5.18.0 (2024-07-30) + +### What's new +- Dictionaries [#10380](https://github.com/statamic/cms/issues/10380) by @duncanmcclean +- Make it possible to add to form configuration screen [#8491](https://github.com/statamic/cms/issues/8491) by @ryanmitchell + +### What's fixed +- Avoid extending already-extended file cache store [#10526](https://github.com/statamic/cms/issues/10526) by @jasonvarga +- Prevent error when redirecting to first asset container [#10521](https://github.com/statamic/cms/issues/10521) by @duncanmcclean +- Percentage symbols get replaced with dashes in asset filenames [#10523](https://github.com/statamic/cms/issues/10523) by @vluijkx + + + ## 5.17.1 (2024-07-29) ### What's fixed From c7c3b732374e49291e4db2ccc8796c664b734e34 Mon Sep 17 00:00:00 2001 From: Danique Wijnalda Date: Wed, 31 Jul 2024 16:08:54 +0200 Subject: [PATCH 020/249] [5.x] Use form submission query count instead of collection count (#10534) --- src/Http/Controllers/CP/Forms/FormsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/CP/Forms/FormsController.php b/src/Http/Controllers/CP/Forms/FormsController.php index 73b2c65cfb..a54fe143ef 100644 --- a/src/Http/Controllers/CP/Forms/FormsController.php +++ b/src/Http/Controllers/CP/Forms/FormsController.php @@ -33,7 +33,7 @@ public function index(Request $request) return [ 'id' => $form->handle(), 'title' => __($form->title()), - 'submissions' => $form->submissions()->count(), + 'submissions' => $form->querySubmissions()->count(), 'show_url' => $form->showUrl(), 'edit_url' => $form->editUrl(), 'blueprint_url' => cp_route('forms.blueprint.edit', $form->handle()), From 389817e843c48354b696e41177e8f79f1f686228 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Wed, 31 Jul 2024 16:02:17 -0400 Subject: [PATCH 021/249] [5.x] Prevent parentheses and currencies in js slug (#10538) --- resources/js/components/slugs/Slug.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/resources/js/components/slugs/Slug.js b/resources/js/components/slugs/Slug.js index c8dd326a1f..3097fdeca4 100644 --- a/resources/js/components/slugs/Slug.js +++ b/resources/js/components/slugs/Slug.js @@ -54,19 +54,38 @@ export default class Slug { } #createSynchronously() { - const custom = Statamic.$config.get(`charmap.${this.#language}`) ?? {}; + const symbols = Statamic.$config.get('asciiReplaceExtraSymbols'); + const charmap = Statamic.$config.get('charmap'); + let custom = charmap[this.#language] ?? {}; custom["'"] = ""; // Remove apostrophes in all languages custom["’"] = ""; // Remove smart single quotes custom[" - "] = " "; // Prevent `Block - Hero` turning into `block_-_hero` + custom['('] = ''; // Remove parentheses + custom[')'] = ''; // Remove parentheses + custom = symbols + ? this.#replaceCurrencySymbols(custom, charmap) + : this.#removeCurrencySymbols(custom, charmap); return speakingUrl(this.#string, { separator: this.#separator, lang: this.#language, custom, - symbols: Statamic.$config.get('asciiReplaceExtraSymbols') + symbols }); } + #replaceCurrencySymbols(custom, charmap) { + return { ...custom, ...charmap.currency }; + } + + #removeCurrencySymbols(custom, charmap) { + for (const key in charmap.currency_short) { + custom[key] = ''; + } + + return custom; + } + #createAsynchronously() { if (! this.#string) { this.#controller?.abort(); From c907c55ae27d5f26db994f64d80306c05d698fd7 Mon Sep 17 00:00:00 2001 From: Andreas Schantl Date: Wed, 31 Jul 2024 22:55:34 +0200 Subject: [PATCH 022/249] [5.x] Add where_in modifier (#10529) Co-authored-by: Jason Varga --- src/Modifiers/CoreModifiers.php | 17 +++++++++++++ tests/Modifiers/WhereInTest.php | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 tests/Modifiers/WhereInTest.php diff --git a/src/Modifiers/CoreModifiers.php b/src/Modifiers/CoreModifiers.php index 31b3cefb9b..68d83417f5 100644 --- a/src/Modifiers/CoreModifiers.php +++ b/src/Modifiers/CoreModifiers.php @@ -2896,6 +2896,23 @@ public function where($value, $params) return $collection->values()->all(); } + /** + * Filters the data by a given key that matches an array of values. + * + * @param array $value + * @param array $params + * @return array + */ + public function whereIn($value, $params) + { + $key = Arr::get($params, 0); + $arr = Arr::get($params, 1); + + $collection = collect($value)->whereIn($key, $arr); + + return $collection->values()->all(); + } + /** * Attempts to prevent widows in a string by adding * tags between the last two words of each paragraph. diff --git a/tests/Modifiers/WhereInTest.php b/tests/Modifiers/WhereInTest.php new file mode 100644 index 0000000000..c5ff317b60 --- /dev/null +++ b/tests/Modifiers/WhereInTest.php @@ -0,0 +1,44 @@ + 'Desk', 'price' => 200], + ['product' => 'Chair', 'price' => 100], + ['product' => 'Bookcase', 'price' => 150], + ['product' => 'Door', 'price' => 100], + ]; + $modified = $this->modify($collection, ['price', [150, 200]]); + $this->assertEquals(['Desk', 'Bookcase'], Arr::pluck($modified, 'product')); + } + + #[Test] + public function it_filters_data_by_key_and_single_value(): void + { + $collection = [ + ['product' => 'Desk', 'price' => 200], + ['product' => 'Chair', 'price' => 100], + ['product' => 'Bookcase', 'price' => 150], + ['product' => 'Door', 'price' => 100], + ]; + $modified = $this->modify($collection, ['price', 100]); + $this->assertEquals(['Chair', 'Door'], Arr::pluck($modified, 'product')); + } + + private function modify($value, array $params) + { + return Modify::value($value)->whereIn($params)->fetch(); + } +} From 2d7bc9f5cbecfc818c47ee203b1df199e9ca5270 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 1 Aug 2024 09:33:09 -0400 Subject: [PATCH 023/249] [5.x] Bring back select modifier (#10219) Co-authored-by: John Koster --- src/Modifiers/CoreModifiers.php | 35 +++ .../Language/Runtime/NodeProcessor.php | 2 +- tests/Modifiers/SelectTest.php | 270 ++++++++++++++++++ tests/Tags/StructureTagTest.php | 10 + 4 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 tests/Modifiers/SelectTest.php diff --git a/src/Modifiers/CoreModifiers.php b/src/Modifiers/CoreModifiers.php index 68d83417f5..51879e9aa1 100644 --- a/src/Modifiers/CoreModifiers.php +++ b/src/Modifiers/CoreModifiers.php @@ -1825,6 +1825,41 @@ public function pluck($value, $params) return $wasArray ? $items->all() : $items; } + /** + * Selects certain values from each item in a collection. + * + * @param array|Collection $value + * @param array $params + * @return array|Collection + */ + public function select($value, $params) + { + $keys = Arr::wrap($params); + + if ($wasArray = is_array($value)) { + $value = collect($value); + } + + if (Compare::isQueryBuilder($value)) { + $value = $value->get(); + } + + $items = $value->map(function ($item) use ($keys) { + return collect($keys)->mapWithKeys(function ($key) use ($item) { + $value = null; + if (is_array($item) || $item instanceof ArrayAccess) { + $value = Arr::get($item, $key); + } else { + $value = method_exists($item, 'value') ? $item->value($key) : $item->get($key); + } + + return [$key => $value]; + })->all(); + }); + + return $wasArray ? $items->all() : $items; + } + /** * Get the plural form of an English word with access to $context. * diff --git a/src/View/Antlers/Language/Runtime/NodeProcessor.php b/src/View/Antlers/Language/Runtime/NodeProcessor.php index 733e60dfee..c4e420bc99 100644 --- a/src/View/Antlers/Language/Runtime/NodeProcessor.php +++ b/src/View/Antlers/Language/Runtime/NodeProcessor.php @@ -1399,7 +1399,7 @@ public function reduce($processNodes) if (! empty($recursiveParent->parameters)) { $lockData = $this->data; foreach ($recursiveParent->parameters as $param) { - if (ModifierManager::isModifier($param)) { + if ($param->name === 'scope') { $childDataToUse = $this->runModifier($param->name, $parentParameterValues, $childDataToUse, $rootData); } } diff --git a/tests/Modifiers/SelectTest.php b/tests/Modifiers/SelectTest.php new file mode 100644 index 0000000000..2a8b5cd58f --- /dev/null +++ b/tests/Modifiers/SelectTest.php @@ -0,0 +1,270 @@ +items(); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified, + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified, + ); + } + + /** @test */ + public function it_selects_certain_values_from_collections_of_items() + { + $items = Collection::make($this->items()); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertInstanceOf(Collection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified->all(), + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertInstanceOf(Collection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified->all(), + ); + } + + /** @test */ + public function it_selects_certain_values_from_query_builder() + { + $builder = Mockery::mock(Builder::class); + $builder->shouldReceive('get')->andReturn(Collection::make($this->items())); + + $modified = $this->modify($builder, ['title', 'type']); + $this->assertInstanceOf(Collection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified->all(), + ); + + $modified = $this->modify($builder, ['title', 'stock']); + $this->assertInstanceOf(Collection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified->all(), + ); + } + + /** @test */ + public function it_selects_certain_values_from_array_of_items_with_origins() + { + $items = $this->itemsWithOrigins(); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Pan', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ['title' => 'Cafe', 'type' => 'drink'], + ], + $modified, + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Pan', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ['title' => 'Cafe', 'stock' => 2], + ], + $modified, + ); + } + + /** @test */ + public function it_selects_certain_values_from_collections_of_items_with_origins() + { + $items = EntryCollection::make($this->itemsWithOrigins()); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertInstanceOf(EntryCollection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Pan', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ['title' => 'Cafe', 'type' => 'drink'], + ], + $modified->all(), + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertInstanceOf(EntryCollection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Pan', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ['title' => 'Cafe', 'stock' => 2], + ], + $modified->all(), + ); + } + + /** @test */ + public function it_selects_certain_values_from_array_of_items_of_type_array() + { + $items = $this->itemsOfTypeArray(); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified, + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified, + ); + } + + /** @test */ + public function it_selects_certain_values_from_collections_of_items_of_type_array() + { + $items = EntryCollection::make($this->itemsOfTypeArray()); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertInstanceOf(EntryCollection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified->all(), + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertInstanceOf(EntryCollection::class, $modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified->all(), + ); + } + + /** @test */ + public function it_selects_certain_values_from_array_of_items_of_type_arrayaccess() + { + $items = $this->itemsOfTypeArrayAccess(); + + $modified = $this->modify($items, ['title', 'type']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'type' => 'food'], + ['title' => 'Coffee', 'type' => 'drink'], + ], + $modified, + ); + + $modified = $this->modify($items, ['title', 'stock']); + $this->assertIsArray($modified); + $this->assertEquals( + [ + ['title' => 'Bread', 'stock' => 1], + ['title' => 'Coffee', 'stock' => 2], + ], + $modified, + ); + } + + private function items() + { + return [ + new Item(['title' => 'Bread', 'type' => 'food', 'stock' => 1]), + new Item(['title' => 'Coffee', 'type' => 'drink', 'stock' => 2]), + ]; + } + + private function itemsWithOrigins() + { + return [ + $breadEn = new ItemWithOrigin(['title' => 'Bread', 'type' => 'food', 'stock' => 1]), + $breadEs = new ItemWithOrigin(['title' => 'Pan'], $breadEn), + $coffeeEn = new ItemWithOrigin(['title' => 'Coffee', 'type' => 'drink', 'stock' => 2]), + $coffeeEs = new ItemWithOrigin(['title' => 'Cafe'], $coffeeEn), + ]; + } + + private function itemsOfTypeArray() + { + return [ + ['title' => 'Bread', 'type' => 'food', 'stock' => 1], + ['title' => 'Coffee', 'type' => 'drink', 'stock' => 2], + ]; + } + + private function itemsOfTypeArrayAccess() + { + return [ + new ArrayAccessType(['title' => 'Bread', 'type' => 'food', 'stock' => 1]), + new ArrayAccessType(['title' => 'Coffee', 'type' => 'drink', 'stock' => 2]), + ]; + } + + private function modify($value, ...$keys) + { + return Modify::value($value)->select(Arr::flatten($keys))->fetch(); + } +} diff --git a/tests/Tags/StructureTagTest.php b/tests/Tags/StructureTagTest.php index dd0436aae1..077d568486 100644 --- a/tests/Tags/StructureTagTest.php +++ b/tests/Tags/StructureTagTest.php @@ -81,6 +81,16 @@ public function it_renders_a_nav() ])); } + #[Test] + public function it_renders_a_nav_with_selected_fields() + { + $this->createCollectionAndNav(); + + $template = '{{ nav:test select="title" }}{{ *recursive children* }}{{ /nav:test }}'; + + $this->assertNotNull(Antlers::parse($template)); + } + #[Test] public function it_renders_a_nav_with_scope() { From 242cf7750731077886955a179a05c5643bd8324d Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 1 Aug 2024 10:01:14 -0400 Subject: [PATCH 024/249] [5.x] Bring back select param on nav tag (#10226) --- src/Data/BulkAugmentor.php | 16 ++++++-- src/Tags/Structure.php | 2 +- tests/Tags/StructureTagTest.php | 67 ++++++++++++++++++++++++++++++++- 3 files changed, 79 insertions(+), 6 deletions(-) diff --git a/src/Data/BulkAugmentor.php b/src/Data/BulkAugmentor.php index dacdaa6ace..018b1b52c2 100644 --- a/src/Data/BulkAugmentor.php +++ b/src/Data/BulkAugmentor.php @@ -10,6 +10,7 @@ class BulkAugmentor private $isTree = false; private $originalValues = []; private $augmentedValues = []; + private ?array $keys = null; private function getAugmentationReference($item) { @@ -25,9 +26,18 @@ public static function make($items) return (new static)->augment($items); } - public static function tree($tree) + public static function tree($tree, $keys = null) { - return (new static)->augmentTree($tree); + return (new static) + ->withKeys($keys) + ->augmentTree($tree); + } + + public function withKeys(?array $keys) + { + $this->keys = $keys; + + return $this; } /** @@ -51,7 +61,7 @@ private function augment($items) } $augmented = $item->augmented(); - $referenceKeys[$reference] = $augmented->keys(); + $referenceKeys[$reference] = $this->keys ?? $augmented->keys(); $referenceFields[$reference] = $augmented->blueprintFields(); } diff --git a/src/Tags/Structure.php b/src/Tags/Structure.php index bc7eb603f9..3bf57d1082 100644 --- a/src/Tags/Structure.php +++ b/src/Tags/Structure.php @@ -121,7 +121,7 @@ protected function isQueryingStatus() public function toArray($tree, $parent = null, $depth = 1) { - $pages = BulkAugmentor::tree($tree)->map(function ($item, $data, $index) use ($depth, $tree, $parent) { + $pages = BulkAugmentor::tree($tree, $this->params->explode('select'))->map(function ($item, $data, $index) use ($depth, $tree, $parent) { $page = $item['page']; $children = empty($item['children']) ? [] : $this->toArray($item['children'], $page, $depth + 1); diff --git a/tests/Tags/StructureTagTest.php b/tests/Tags/StructureTagTest.php index 077d568486..77c5cbd56e 100644 --- a/tests/Tags/StructureTagTest.php +++ b/tests/Tags/StructureTagTest.php @@ -86,9 +86,72 @@ public function it_renders_a_nav_with_selected_fields() { $this->createCollectionAndNav(); - $template = '{{ nav:test select="title" }}{{ *recursive children* }}{{ /nav:test }}'; + // The html uses tags (could be any tag, but i is short) to prevent whitespace comparison issues in the assertion. + $template = <<<'EOT' +
    +{{ nav:test select="title" }} +
  • + {{ title }} {{ foo }} + {{ if children }} +
      + {{ *recursive children* }} +
    + {{ /if }} +
  • +{{ /nav:test }} +
+EOT; + + $expected = <<<'EOT' +
    +
  • + One bar +
      +
    • + One One bar +
    • +
    • + URL and title bar +
    • +
    +
  • +
  • + Two bar +
  • +
  • + Three bar +
      +
    • + Three One bar +
    • +
    • + Three Two bar +
    • +
    +
  • +
  • + Title only bar +
      +
    • + URL only bar +
    • +
    +
  • +
+EOT; + + $parsed = (string) Antlers::parse($template, [ + 'foo' => 'bar', // to test that cascade is inherited. + 'title' => 'outer title', // to test that cascade the page's data takes precedence over the cascading data. + ]); + + // This is really what we're interested in testing. The "Two" entry has a foo value + // of "notbar", but we're only selecting the title, so we shouldn't get the real value. + if (str_contains($parsed, 'Two notbar')) { + $this->fail('The "Two" entry\'s "foo" value was included.'); + } - $this->assertNotNull(Antlers::parse($template)); + $this->assertXmlStringEqualsXmlString($expected, $parsed); } #[Test] From bffcb0079f3db9f60ac5bda080c26895543b69aa Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Thu, 1 Aug 2024 17:53:49 +0330 Subject: [PATCH 025/249] [5.x] Copy moment file in translate generate (#10547) --- translator | 1 + 1 file changed, 1 insertion(+) diff --git a/translator b/translator index 94c7d69e38..9cd9d28862 100644 --- a/translator +++ b/translator @@ -22,6 +22,7 @@ $manualFiles = [ 'permissions', 'markdown', 'validation', + 'moment', ]; // Don't translate the following files. From cc65f6faf6500f0f583063461ee8021fbeec61cc Mon Sep 17 00:00:00 2001 From: Emmanuel Beauchamps Date: Thu, 1 Aug 2024 16:24:20 +0200 Subject: [PATCH 026/249] [5.x] French translations (#10539) --- resources/lang/fr.json | 5 +++++ resources/lang/fr/fieldtypes.php | 5 +++++ resources/lang/fr/messages.php | 2 ++ 3 files changed, 12 insertions(+) diff --git a/resources/lang/fr.json b/resources/lang/fr.json index 3f07b08120..8e8920d621 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -322,6 +322,7 @@ "Description of the image": "Description de l'image", "Deselect option": "Désélectionner l'option", "Detach": "Détacher", + "Dictionary": "Dictionnaire", "Directory": "Répertoire", "Directory already exists.": "Le répertoire existe déjà.", "Disabled": "Désactivé", @@ -730,6 +731,7 @@ "Regards": "Cordialement", "Regenerate": "Régénérer", "Regenerate from: :field": "Régénérer à partir de : :field", + "Region": "Région", "Registration successful.": "Inscription réussie.", "Relationship": "Relation", "Released on :date": "Publiée le :date", @@ -812,6 +814,7 @@ "Searchables": "Consultables", "Searching in:": "Recherche dans", "Select": "Choisir", + "Select Across Sites": "Choisir au sein des sites", "Select asset container": "Choisir un conteneur de ressources", "Select Collection(s)": "Choisir collection(s)", "Select Dropdown": "Liste déroulante", @@ -854,6 +857,8 @@ "Shown by default": "Affiché par défaut", "Single": "Single", "Site": "Site", + "Site deleted": "Site supprimé", + "Site saved": "Site enregistré", "Site selected.": "Site sélectionné", "Sites": "Sites", "Size": "Taille", diff --git a/resources/lang/fr/fieldtypes.php b/resources/lang/fr/fieldtypes.php index 38ef7c5383..be92225fb9 100644 --- a/resources/lang/fr/fieldtypes.php +++ b/resources/lang/fr/fieldtypes.php @@ -72,10 +72,15 @@ 'date.config.time_enabled' => 'Activez l’horodateur.', 'date.config.time_seconds_enabled' => 'Affichez les secondes dans l’horodateur.', 'date.title' => 'Date', + 'dictionary.config.dictionary' => 'Le dictionnaire à partir duquel vous souhaitez extraire des options.', + 'dictionary.file.config.filename' => 'Le nom du fichier contenant vos options, relatif au répertoire `resources/dictionaries`.', + 'dictionary.file.config.label' => 'La clef contenant les libellés des options. Par défaut, c’est `label`. Alternativement, vous pouvez utiliser Antlers.', + 'dictionary.file.config.value' => 'La clef contenant les valeurs des options. Par défaut, c’est `value`.', 'entries.config.collections' => 'Choisissez les collections à partir desquelles l’utilisateur pourra sélectionner.', 'entries.config.create' => 'Autorisez la création de nouvelles entrées.', 'entries.config.query_scopes' => 'Choisissez les étendues de requête à appliquer lors de la récupération des entrées sélectionnables.', 'entries.config.search_index' => 'Un index de recherche approprié sera automatiquement utilisé dès que possible, mais vous pouvez en définir un de manière explicite.', + 'entries.config.select_across_sites' => 'Autoriser la sélection d’entrées à partir d’autres sites. Cela désactive également les options de localisation sur le frontal. Pour en savoir plus, consultez la [documentation](https://statamic.dev/fieldtypes/entries#select-across-sites).', 'entries.title' => 'Entries', 'float.title' => 'Float', 'form.config.max_items' => 'Le nombre maximal de formulaires sélectionnables.', diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index abbb6fc454..e11a53f200 100644 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -69,6 +69,7 @@ 'collections_route_instructions' => 'La route contrôle le modèle d’URL des entrées. Apprenez-en plus dans la [documentation](https://statamic.dev/collections#routing).', 'collections_sort_direction_instructions' => 'Le sens de tri par défaut.', 'collections_taxonomies_instructions' => 'Reliez les entrées de cette collection à des taxonomies. Les champs seront automatiquement ajoutés aux formulaires.', + 'dictionaries_countries_region_instructions' => 'Filtrez éventuellement les pays par région.', 'duplicate_action_localizations_confirmation' => 'Êtes-vous sûr de vouloir effectuer cette action ? Les traductions seront également dupliquées.', 'duplicate_action_warning_localization' => 'Cette entrée est une traduction. L’entrée originale sera dupliquée.', 'duplicate_action_warning_localizations' => 'Une ou plusieurs entrées sélectionnées sont des traductions. Dans un tel cas, l’entrée originale sera dupliquée à la place.', @@ -167,6 +168,7 @@ 'navigation_configure_collections_instructions' => 'Activer le lien vers les entrées de ces collections.', 'navigation_configure_handle_instructions' => 'Comment vous allez faire référence à cette navigation sur le frontal. Il n’est pas évident de le modifier par la suite.', 'navigation_configure_intro' => 'Les navigations sont des listes multi-niveaux de liens qui peuvent être utilisées pour construire des barres de navigation, des pieds de page, des plans de site et d’autres formes de navigation sur le frontal.', + 'navigation_configure_select_across_sites' => 'Autoriser la sélection d’entrées provenant d’autres sites.', 'navigation_configure_settings_intro' => 'Activer les liens vers les collections, définir une profondeur maximale et d’autres comportements.', 'navigation_configure_title_instructions' => 'Nous recommandons un nom qui corresponde à son emplacement, comme "Nav Principale" ou "Nav Pied De Page".', 'navigation_documentation_instructions' => 'En savoir plus sur la construction, la configuration et le rendu des navigations.', From dd222339dfdd32d8a6b8bd0d28f436146a370109 Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Thu, 1 Aug 2024 17:55:57 +0330 Subject: [PATCH 027/249] [5.x] Turkish translation (#10543) --- resources/lang/tr.json | 2 ++ resources/lang/tr/fieldtypes.php | 4 ++++ resources/lang/tr/messages.php | 7 ++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/lang/tr.json b/resources/lang/tr.json index 9dcc3da68a..bad7385474 100644 --- a/resources/lang/tr.json +++ b/resources/lang/tr.json @@ -348,6 +348,7 @@ "Description of the image": "Görüntünün açıklaması", "Deselect option": "Seçme seçeneği", "Detach": "Ayrılmak", + "Dictionary": "Sözlük", "Diff": "Fark", "Different": "Farklı", "Digits": "Rakamlar", @@ -819,6 +820,7 @@ "Regards": "Saygılarımızla", "Regenerate": "Yeniden Oluştur", "Regenerate from: :field": ":field dan yeniden oluştur", + "Region": "Bölge", "Registration successful.": "Kayıt başarılı.", "Regular Expression": "Düzenli İfade", "Relationship": "İlişki", diff --git a/resources/lang/tr/fieldtypes.php b/resources/lang/tr/fieldtypes.php index a37aaf4ccc..a4870e3ab3 100644 --- a/resources/lang/tr/fieldtypes.php +++ b/resources/lang/tr/fieldtypes.php @@ -75,6 +75,10 @@ 'date.config.time_seconds_enabled' => 'Zaman seçicide saniyeleri göster.', 'date.config.timezone' => 'Kullanıcının varsayılanından farklı bir tercih ettiğiniz saat dilimi varsa, lütfen burada belirtin.', 'date.title' => 'Tarih', + 'dictionary.config.dictionary' => 'Seçenekleri çekmek istediğiniz sözlük.', + 'dictionary.file.config.filename' => '`resources/dictionaries` dizinine göre seçeneklerinizi içeren dosya adı.', + 'dictionary.file.config.label' => 'Seçeneklerin etiketlerini içeren anahtar. Varsayılan olarak `label`. Alternatif olarak Antlers kullanabilirsiniz.', + 'dictionary.file.config.value' => 'Seçeneklerin değerlerini içeren anahtar. Varsayılan olarak `value`.', 'entries.config.collections' => 'Kullanıcının seçebileceği koleksiyonları seçin.', 'entries.config.create' => 'Yeni girdilerin oluşturulmasına izin verin.', 'entries.config.query_scopes' => 'Seçilebilir girişleri alırken hangi sorgu kapsamlarının uygulanacağını seçin.', diff --git a/resources/lang/tr/messages.php b/resources/lang/tr/messages.php index 2211e90adf..0c28ff169e 100644 --- a/resources/lang/tr/messages.php +++ b/resources/lang/tr/messages.php @@ -69,6 +69,7 @@ 'collections_route_instructions' => 'Rota, girişlerin URL modelini kontrol eder. [Belgelerde](https://statamic.dev/collections#routing) daha fazla bilgi edinin.', 'collections_sort_direction_instructions' => 'Varsayılan sıralama yönü.', 'collections_taxonomies_instructions' => 'Bu koleksiyondaki girişleri taksonomilere bağlayın. Formları yayınlamak için alanlar otomatik olarak eklenecektir.', + 'dictionaries_countries_region_instructions' => 'Ülkeleri bölgeye göre filtrelemek için isteğe bağlı olarak kullanın.', 'duplicate_action_localizations_confirmation' => 'Bu işlemi çalıştırmak istediğinizden emin misiniz? Yerelleştirmeler de kopyalanacak.', 'duplicate_action_warning_localization' => 'Bu giriş bir yerelleştirme. Kaynak giriş kopyalanacak.', 'duplicate_action_warning_localizations' => 'Seçili girişlerden bir veya daha fazlası yerelleştirmelerdir. Bu durumlarda kaynak giriş kopyalanacak.', @@ -154,12 +155,12 @@ 'licensing_incorrect_key_format_heading' => 'Yanlış site anahtar formatı', 'licensing_production_alert' => 'Bu site Statamik Pro ve ticari eklentiler kullanıyor. Lütfen uygun lisansları satın alın.', 'licensing_production_alert_addons' => 'Bu site ticari eklentiler kullanıyor. Lütfen uygun lisansları satın alın.', - 'licensing_production_alert_statamik' => 'Bu site Statamik Pro kullanıyor. Lütfen bir lisans satın alın.', - 'licensing_production_alert_renew_statamik' => 'Statamik Pro\'nun bu sürümünü kullanmak için bir lisans yenilemesi gerekir.', + 'licensing_production_alert_statamic' => 'Bu site Statamik Pro kullanıyor. Lütfen bir lisans satın alın.', + 'licensing_production_alert_renew_statamic' => 'Statamik Pro\'nun bu sürümünü kullanmak için bir lisans yenilemesi gerekir.', 'licensing_sync_instructions' => 'statamic.com\'dan gelen veriler saatte bir senkronize edilir. Yaptığınız değişiklikleri görmek için bir senkronizasyonu zorlayın.', 'licensing_trial_mode_alert' => 'Bu site Statamik Pro ve ticari eklentiler kullanıyor. Lansmandan önce lisans satın aldığınızdan emin olun. Teşekkürler!', 'licensing_trial_mode_alert_addons' => 'Bu site ticari eklentiler kullanıyor. Lansmandan önce lisans satın aldığınızdan emin olun. Teşekkürler!', - 'licensing_trial_mode_alert_statamik' => 'Bu site Statamik Pro kullanıyor. Lansmandan önce bir lisans satın aldığınızdan emin olun. Teşekkürler!', + 'licensing_trial_mode_alert_statamic' => 'Bu site Statamik Pro kullanıyor. Lansmandan önce bir lisans satın aldığınızdan emin olun. Teşekkürler!', 'licensing_utility_description' => 'Lisans ayrıntılarını görüntüleyin ve çözün.', 'max_depth_instructions' => 'Sayfanın yuvalanabileceği maksimum düzey sayısı belirleyin. Limitsiz boş bırakın.', 'max_items_instructions' => 'Maksimum sayıda seçilebilir öğe ayarlayın.', From 528d36d6d374f8c8d40a9093004dc64efa7e4100 Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Thu, 1 Aug 2024 17:56:14 +0330 Subject: [PATCH 028/249] [5.x] Persian translation (#10545) --- resources/lang/fa.json | 6 +++--- resources/lang/fa/fieldtypes.php | 4 ++++ resources/lang/fa/messages.php | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/lang/fa.json b/resources/lang/fa.json index a69e10200a..aa159963de 100644 --- a/resources/lang/fa.json +++ b/resources/lang/fa.json @@ -348,6 +348,7 @@ "Digits": "تعداد ارقام", "Digits Between": "ارقام بین", "Dimensions (Image Files)": "ابعاد تصویر", + "Dictionary": "دیکشنری", "Directory": "پوشه", "Directory already exists.": "پوشه از قبل موجود است.", "Disabled": "غیرفعال است", @@ -737,8 +738,6 @@ "Ordering": "درحال مرتب‌سازی", "Origin": "مبدا", "Origin Behavior": "رفتار مبدا", - "Statamic": "استتمیک", - "Statamic Pro is required.": "نسخه‌ی حرفه‌ای استتمیک نیاز می‌باشد", "Other": "دیگر موارد", "Override Alt": "جایگزین کردن متن ثانوی (Alt)", "Override For Role": "جایگزین کردن نقش", @@ -807,6 +806,7 @@ "Regards": "با احترام", "Regenerate": "از نو سازی", "Regenerate from: :field": "از نو سازی از: :field", + "Region": "منطقه", "Registration successful.": "ثبت نام با موفقیت انجام شد.", "Regular Expression": "مقدار فیلد باید با الگوی (ریجکس) داده شده همخوانی داشته باشد", "Relationship": "ارتباط", @@ -1022,7 +1022,7 @@ "Text item": "آیتم متنی", "Text view": "نمایش متن", "The given data was invalid.": "داده‌ی موردنظر غیرمعتبر است.", - "The Statamic Playground": "زمین بازی Statamic", + "The Statamic Playground": "زمین بازی استتمیک", "Theme": "تم", "There are no entries in this collection": "در این کلکسیون هیچ مطلبی وجود ندارد", "These are now your default columns.": "این ستون‌ها اکنون به عنوان پیشفرض ذخیره شدند.", diff --git a/resources/lang/fa/fieldtypes.php b/resources/lang/fa/fieldtypes.php index 41cac7f159..57760804ff 100644 --- a/resources/lang/fa/fieldtypes.php +++ b/resources/lang/fa/fieldtypes.php @@ -72,6 +72,10 @@ 'date.config.time_enabled' => 'فعال‌سازی انتخاب زمان.', 'date.config.time_seconds_enabled' => 'نمایش ثانیه‌ها در انتخابگر زمان.', 'date.title' => 'تاریخ', + 'dictionary.config.dictionary' => 'دیکشنری که تمایل دارید آیتم‌ها را از آن دریافت کنید.', + 'dictionary.file.config.filename' => 'نام فایلی که حاوی آیتم‌ها می‌باشد، مبدا این فایل پوشه‌ی resources/dictionaries می‌باشد.', + 'dictionary.file.config.label' => 'نام کلید لیبل آیتم‌ها را وارد نمائید. بصورت پیشفرض label می‌باشد. می‌توانید از تگ‌های قالب نیزاستفاده نمائید.', + 'dictionary.file.config.value' => 'نام کلید مقدار آیتم‌ها را وارد نمائید. بصورت پیشفرض value می‌باشد.', 'entries.config.collections' => 'مضخص سازید که کاربر از بین کدام کلکسیون‌ها می‌تواند انتخاب کند', 'entries.config.create' => 'اجازه‌ی ایجاد مطالب جدید داده شود.', 'entries.config.query_scopes' => 'محدودیت‌های فراخوانی مطالب را مشخص کنید.', diff --git a/resources/lang/fa/messages.php b/resources/lang/fa/messages.php index 6139cda690..6682956293 100644 --- a/resources/lang/fa/messages.php +++ b/resources/lang/fa/messages.php @@ -69,6 +69,7 @@ 'collections_route_instructions' => 'با تنظیمات مسیر الگوی آدرس‌دهی مطالب کلکسیون‌ها را مشخص می‌کنید. برای اطلاعات بیشتر لطفا به [مستندات](https://statamic.dev/collections#routing) مراجعه کنید.', 'collections_sort_direction_instructions' => 'تنظیم جهت پیشفرض برای مرتب‌سازی.', 'collections_taxonomies_instructions' => 'مطالب این کلکسیون را به یک یا چندتا از تکسنومی‌ها متصل کنید. فیلدهای تکسنومی به طور خودکار به فرم انتشار مطلب اضافه می‌شوند.', + 'dictionaries_countries_region_instructions' => 'فیلتر کردن اختیاری کشورها بر اساس منطقه.', 'duplicate_action_localizations_confirmation' => 'با انجام این عمل ترجمه‌ی این مطلب نیز تکثیر می‌یابد. با توجه به این موضوع می‌خواهید این عمل انجام شود؟', 'duplicate_action_warning_localization' => 'آیتمی که برای تکثیر برگزیده‌اید یک نسخه‌ی ترجمه شده می‌باشد. بجای آن مطلب اصلی تکثیر خواهد یافت.', 'duplicate_action_warning_localizations' => 'در بین آیتم‌های انتخاب شده نسخه‌های ترجمه‌شده وجود دارند که بجای آنها مطلب اصلی و مرجع تکثیر خواهد یافت.', From ccf973069efb3b001cf713c9437db8b73f6d6a23 Mon Sep 17 00:00:00 2001 From: Jack McDade Date: Thu, 1 Aug 2024 10:53:09 -0400 Subject: [PATCH 029/249] [5.x] Adds the ability to set default Table data (#10540) --- src/Fieldtypes/Table.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Fieldtypes/Table.php b/src/Fieldtypes/Table.php index 64a57cdfa6..bf235cc516 100644 --- a/src/Fieldtypes/Table.php +++ b/src/Fieldtypes/Table.php @@ -10,6 +10,17 @@ class Table extends Fieldtype { protected $categories = ['structured']; + protected function configFieldItems(): array + { + return [ + 'default' => [ + 'display' => __('Default Value'), + 'instructions' => __('statamic::messages.fields_default_instructions'), + 'type' => 'table', + ], + ]; + } + public function toGqlType() { return GraphQL::listOf(GraphQL::type(TableRowType::NAME)); From 400dbccd77451a2566588fcc7bfb71a07cdd6664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Heidk=C3=A4mper?= <10990014+heidkaemper@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:30:00 +0200 Subject: [PATCH 030/249] [5.x] Minor dark mode adjustments (#10544) * add dark mode bg-color for little dot * adjust widgets header icon color for dark mode * change cp widgets svg color --- resources/css/elements/buttons.css | 2 +- resources/css/elements/icons.css | 2 +- resources/js/components/entries/Listing.vue | 2 +- resources/js/components/entries/Widget.vue | 2 +- .../fieldtypes/relationship/RelationshipIndexFieldtype.vue | 2 +- resources/js/components/structures/Branch.vue | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/css/elements/buttons.css b/resources/css/elements/buttons.css index c7bdd30127..a42524054e 100644 --- a/resources/css/elements/buttons.css +++ b/resources/css/elements/buttons.css @@ -296,7 +296,7 @@ td .btn-icon { @apply dark:hover:bg-dark-575 dark:hover:border-dark-400; svg { - @apply h-8 w-8 text-gray-800 dark:text-dark-175; + @apply h-8 w-8 text-gray-800 dark:text-dark-200; } h3 { diff --git a/resources/css/elements/icons.css b/resources/css/elements/icons.css index aa6fc67a7d..6c91319585 100644 --- a/resources/css/elements/icons.css +++ b/resources/css/elements/icons.css @@ -70,7 +70,7 @@ svg { flex-shrink: 0; &.published { @apply bg-green-600 } - &.draft, &.expired { @apply bg-gray-600 } + &.draft, &.expired { @apply bg-gray-600 dark:bg-dark-200 } &.scheduled, &.hollow { @apply bg-transparent border border-gray-600 } } diff --git a/resources/js/components/entries/Listing.vue b/resources/js/components/entries/Listing.vue index 9cdd029548..6b56a0e4ea 100644 --- a/resources/js/components/entries/Listing.vue +++ b/resources/js/components/entries/Listing.vue @@ -183,7 +183,7 @@ export default { } else if (entry.published) { return 'bg-green-600'; } else { - return 'bg-gray-400'; + return 'bg-gray-400 dark:bg-dark-200'; } }, diff --git a/resources/js/components/entries/Widget.vue b/resources/js/components/entries/Widget.vue index b33e0f5655..b9703d1bc5 100644 --- a/resources/js/components/entries/Widget.vue +++ b/resources/js/components/entries/Widget.vue @@ -71,7 +71,7 @@ export default { } else if (entry.published) { return 'bg-green-600'; } else { - return 'bg-gray-400'; + return 'bg-gray-400 dark:bg-dark-200'; } }, diff --git a/resources/js/components/fieldtypes/relationship/RelationshipIndexFieldtype.vue b/resources/js/components/fieldtypes/relationship/RelationshipIndexFieldtype.vue index f3354ec8a9..55c223bf41 100644 --- a/resources/js/components/fieldtypes/relationship/RelationshipIndexFieldtype.vue +++ b/resources/js/components/fieldtypes/relationship/RelationshipIndexFieldtype.vue @@ -9,7 +9,7 @@ >
+ class="little-dot h-1 w-1 rtl:ml-1 ltr:mr-1" :class="[item.published ? 'bg-green-600' : 'bg-gray-400 dark:bg-dark-200']" />
diff --git a/resources/js/components/structures/Branch.vue b/resources/js/components/structures/Branch.vue index 19e40f86d9..9d4f66c594 100644 --- a/resources/js/components/structures/Branch.vue +++ b/resources/js/components/structures/Branch.vue @@ -120,7 +120,7 @@ export default { case 'published': return 'bg-green-600'; case 'draft': - return 'bg-gray-400'; + return 'bg-gray-400 dark:bg-dark-200'; default: return 'bg-transparent border border-gray-600'; } From ef0cb8a90a89271563836afb6f06762b0e60c7ac Mon Sep 17 00:00:00 2001 From: FrankGREV Date: Thu, 1 Aug 2024 19:14:36 +0200 Subject: [PATCH 031/249] [5.x] Dutch translations (#10550) --- resources/lang/nl/messages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/nl/messages.php b/resources/lang/nl/messages.php index 4c8bc78ce3..afe06ff544 100644 --- a/resources/lang/nl/messages.php +++ b/resources/lang/nl/messages.php @@ -178,7 +178,7 @@ 'password_protect_token_invalid' => 'Ongeldig of verlopen token.', 'password_protect_token_missing' => 'Beveiligde token mist. Je moet op dit scherm komen via de originele, beveiligde URL.', 'phpinfo_utility_description' => 'Controleer de PHP-configuratie-instellingen en geïnstalleerde modules.', - 'preference_favorites_instructions' => 'Snelkoppelingen die getoont worden bij het openen van de algemen zoekbalk. Je kunt ook de pagina bezoeken en het speldpictogram bovenaan de pagina gebruiken om deze toe te voegen aan deze lijst.', + 'preference_favorites_instructions' => 'Snelkoppelingen die getoont worden bij het openen van de algemene zoekbalk. Je kunt ook de pagina bezoeken en het speldpictogram bovenaan de pagina gebruiken om deze toe te voegen aan deze lijst.', 'preference_locale_instructions' => 'De voorkeurstaal voor het Control Panel.', 'preference_start_page_instructions' => 'De pagina die moet worden weergegeven na het inloggen op het Control Panel.', 'publish_actions_create_revision' => 'Een revisie wordt gemaakt op basis van de werkkopie. De huidige revisie zal niet wijzigen.', From b9708857ab69c0ced1a7089f374d7dfac4adde8f Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 1 Aug 2024 18:39:47 +0100 Subject: [PATCH 032/249] [5.x] Fix Template & Layout fields in Live Preview (#10542) Co-authored-by: Jason Varga --- src/Entries/Entry.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Entries/Entry.php b/src/Entries/Entry.php index 59368e7360..bc980b4170 100644 --- a/src/Entries/Entry.php +++ b/src/Entries/Entry.php @@ -515,7 +515,7 @@ public function template($template = null) return $this ->fluentlyGetOrSet('template') ->getter(function ($template) { - $template = $template ?? $this->get('template') ?? optional($this->origin())->template() ?? $this->collection()->template(); + $template = $template ?? $this->getSupplement('template') ?? $this->get('template') ?? optional($this->origin())->template() ?? $this->collection()->template(); return $template === '@blueprint' ? $this->inferTemplateFromBlueprint() @@ -540,7 +540,7 @@ public function layout($layout = null) return $this ->fluentlyGetOrSet('layout') ->getter(function ($layout) { - return $layout ?? $this->get('layout') ?? optional($this->origin())->layout() ?? $this->collection()->layout(); + return $layout ?? $this->getSupplement('layout') ?? $this->get('layout') ?? optional($this->origin())->layout() ?? $this->collection()->layout(); }) ->args(func_get_args()); } From 45e4229ab550585b65695ca432e9b686d333b2c9 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Thu, 1 Aug 2024 13:45:40 -0400 Subject: [PATCH 033/249] changelog --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95ab40f0ab..d0e7a34014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Release Notes +## 5.19.0 (2024-08-01) + +### What's new +- Ability to set default table fieldtype data [#10540](https://github.com/statamic/cms/issues/10540) by @jackmcdade +- Bring back select param on nav tag [#10226](https://github.com/statamic/cms/issues/10226) by @jasonvarga +- Bring back select modifier [#10219](https://github.com/statamic/cms/issues/10219) by @jasonvarga +- Add where_in modifier [#10529](https://github.com/statamic/cms/issues/10529) by @andjsch + +### What's fixed +- Fix template & layout fields in Live Preview [#10542](https://github.com/statamic/cms/issues/10542) by @duncanmcclean +- Minor dark mode adjustments [#10544](https://github.com/statamic/cms/issues/10544) by @heidkaemper +- Copy moment file in translate generate [#10547](https://github.com/statamic/cms/issues/10547) by @peimn +- Prevent parentheses and currencies in js slug [#10538](https://github.com/statamic/cms/issues/10538) by @jasonvarga +- Use form submission query count instead of collection count [#10534](https://github.com/statamic/cms/issues/10534) by @dnwjn +- Dutch translations [#10550](https://github.com/statamic/cms/issues/10550) by @FrankGREV +- Persian translation [#10545](https://github.com/statamic/cms/issues/10545) by @peimn +- Turkish translation [#10543](https://github.com/statamic/cms/issues/10543) by @peimn +- French translations [#10539](https://github.com/statamic/cms/issues/10539) by @ebeauchamps + + + ## 5.18.0 (2024-07-30) ### What's new From 5be9c5001ee7ccc5dc21548588bcd6b954f51d02 Mon Sep 17 00:00:00 2001 From: Jelle Roorda <9193686+jelleroorda@users.noreply.github.com> Date: Thu, 1 Aug 2024 20:26:48 +0200 Subject: [PATCH 034/249] [5.x] Fix error toast when logging in. (#10308) Co-authored-by: Jelle Roorda Co-authored-by: Jason Varga --- src/Http/Controllers/CP/Auth/LoginController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/CP/Auth/LoginController.php b/src/Http/Controllers/CP/Auth/LoginController.php index 367d4c6a3c..885cb5d91d 100644 --- a/src/Http/Controllers/CP/Auth/LoginController.php +++ b/src/Http/Controllers/CP/Auth/LoginController.php @@ -101,9 +101,11 @@ protected function guard() public function redirectPath() { + $cp = cp_route('index'); $referer = request('referer'); + $referredFromCp = Str::startsWith($referer, $cp) && ! Str::startsWith($referer, $cp.'/auth/'); - return Str::contains($referer, '/'.config('statamic.cp.route')) ? $referer : cp_route('index'); + return $referredFromCp ? $referer : $cp; } protected function authenticated(Request $request, $user) From 20089a8a8d0f25ad02ba95095a18402d5401b72b Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 1 Aug 2024 22:01:27 +0100 Subject: [PATCH 035/249] [5.x] Fallback to `nocache` content when request is missing the `Cache` middleware (#9406) Co-authored-by: Jason Varga --- src/StaticCaching/Middleware/Cache.php | 5 +++ src/StaticCaching/NoCache/BladeDirective.php | 6 +++ src/StaticCaching/NoCache/Tags.php | 5 +++ tests/StaticCaching/NocacheRouteTest.php | 20 +-------- tests/StaticCaching/NocacheTagsTest.php | 47 ++++++++++++++++++++ 5 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/StaticCaching/Middleware/Cache.php b/src/StaticCaching/Middleware/Cache.php index 73c8d1348c..2abbb8f549 100644 --- a/src/StaticCaching/Middleware/Cache.php +++ b/src/StaticCaching/Middleware/Cache.php @@ -186,4 +186,9 @@ private function createLock($request): Lock return $store->lock($key, $this->lockFor); } + + public static function isBeingUsedOnCurrentRoute() + { + return in_array(static::class, app('router')->gatherRouteMiddleware(request()->route())); + } } diff --git a/src/StaticCaching/NoCache/BladeDirective.php b/src/StaticCaching/NoCache/BladeDirective.php index d6cf8cb793..fa6e3ed7ab 100644 --- a/src/StaticCaching/NoCache/BladeDirective.php +++ b/src/StaticCaching/NoCache/BladeDirective.php @@ -2,6 +2,8 @@ namespace Statamic\StaticCaching\NoCache; +use Statamic\StaticCaching\Middleware\Cache; + class BladeDirective { /** @@ -25,6 +27,10 @@ public function handle($expression, array $params, ?array $data = null) $context = array_merge($data, $params); + if (! Cache::isBeingUsedOnCurrentRoute()) { + return view($view, $context)->render(); + } + return $this->nocache->pushView($view, $context)->placeholder(); } } diff --git a/src/StaticCaching/NoCache/Tags.php b/src/StaticCaching/NoCache/Tags.php index 60a08a7387..8e71ae28f9 100644 --- a/src/StaticCaching/NoCache/Tags.php +++ b/src/StaticCaching/NoCache/Tags.php @@ -3,6 +3,7 @@ namespace Statamic\StaticCaching\NoCache; use Statamic\Facades\Antlers; +use Statamic\StaticCaching\Middleware\Cache; class Tags extends \Statamic\Tags\Tags { @@ -21,6 +22,10 @@ public function __construct(Session $nocache) public function index() { + if (! Cache::isBeingUsedOnCurrentRoute()) { + return $this->parse(); + } + if ($this->params->has('select')) { $fields = $this->params->explode('select'); diff --git a/tests/StaticCaching/NocacheRouteTest.php b/tests/StaticCaching/NocacheRouteTest.php index 7f648dd23a..5639702109 100644 --- a/tests/StaticCaching/NocacheRouteTest.php +++ b/tests/StaticCaching/NocacheRouteTest.php @@ -37,27 +37,11 @@ public function index() $this->createPage('test', ['with' => ['title' => 'Test']]); - $secondTemplate = <<<'EOT' -Second {{ example_count }} {{ name }} {{ title }} -{{ nocache }} - Nested {{ example_count }} {{ name }} {{ title }} - {{ nocache }} - Double nested {{ example_count }} {{ name }} {{ title }} - {{ /nocache }} -{{ /nocache }} -EOT; - $session = new Session('http://localhost/test'); $regionOne = $session->pushRegion('First {{ example_count }} {{ name }} {{ title }}', ['name' => 'Dustin'], 'antlers.html'); - $regionTwo = $session->pushRegion($secondTemplate, ['name' => 'Will'], 'antlers.html'); + $regionTwo = $session->pushRegion('Second {{ example_count }} {{ name }} {{ title }}', ['name' => 'Will'], 'antlers.html'); $session->write(); - $secondExpectation = <<<'EOT' -Second 2 Will Test -Nested 3 Will Test - Double nested 4 Will Test -EOT; - $this ->postJson('/!/nocache', ['url' => 'http://localhost/test']) ->assertOk() @@ -65,7 +49,7 @@ public function index() 'csrf' => csrf_token(), 'regions' => [ $regionOne->key() => 'First 1 Dustin Test', - $regionTwo->key() => $secondExpectation, + $regionTwo->key() => 'Second 2 Will Test', ], ]); } diff --git a/tests/StaticCaching/NocacheTagsTest.php b/tests/StaticCaching/NocacheTagsTest.php index 77203a9df9..e21daa639f 100644 --- a/tests/StaticCaching/NocacheTagsTest.php +++ b/tests/StaticCaching/NocacheTagsTest.php @@ -25,6 +25,47 @@ protected function getEnvironmentSetUp($app) $app['config']->set('statamic.static_caching.strategy', null); } + #[Test] + public function it_can_nest_nocache_tags() + { + $this->withStandardFakeViews(); + + $template = <<<'EOT' +{{ title }} +{{ nocache }} + {{ title }} + {{ nocache }} + {{ title }} + {{ nocache }}{{ title }}{{ /nocache }} + {{ /nocache }} +{{ /nocache }} +EOT; + + $this->viewShouldReturnRaw('default', $template); + + $page = $this->createPage('about', [ + 'with' => [ + 'title' => 'Existing', + ], + ]); + + $this + ->get('/about') + ->assertOk() + ->assertSeeInOrder(['Existing', 'Existing', 'Existing', 'Existing']); + + $page + ->set('title', 'Updated') + ->saveQuietly(); // Save quietly to prevent the invalidator from clearing the statically cached page. + + $this->app->make(Session::class)->reset(); + + $this + ->get('/about') + ->assertOk() + ->assertSeeInOrder(['Updated', 'Updated', 'Updated', 'Updated']); + } + #[Test] public function it_can_keep_nocache_tags_dynamic_inside_cache_tags() { @@ -107,6 +148,9 @@ public function it_can_keep_nested_nocache_tags_dynamic_inside_cache_tags() #[Test] public function it_only_adds_appropriate_fields_of_context_to_session() { + // The tag won't do anything if it's not being used on a request with the cache middleware. + $this->get('/'); + $expectedFields = [ 'foo', // By adding @auto it will be picked up from the template. 'baz', // Explicitly selected @@ -133,6 +177,9 @@ public function it_only_adds_appropriate_fields_of_context_to_session() #[Test] public function it_only_adds_explicitly_defined_fields_of_context_to_session() { + // The tag won't do anything if it's not being used on a request with the cache middleware. + $this->get('/'); + // We will not add `bar` to the session because it is not explicitly defined. // We will not add `nope` to the session because it is not in the context. $expectedFields = ['foo', 'baz']; From 1c9cce567345be30a3ba9e21c7f261a446e0513b Mon Sep 17 00:00:00 2001 From: PatrickJunod Date: Fri, 2 Aug 2024 15:46:40 +0200 Subject: [PATCH 036/249] [5.x] Add duplicate stacked row option to Grid fieldtype (#10556) --- resources/js/components/fieldtypes/grid/Stacked.vue | 1 + resources/js/components/fieldtypes/grid/StackedRow.vue | 3 +++ 2 files changed, 4 insertions(+) diff --git a/resources/js/components/fieldtypes/grid/Stacked.vue b/resources/js/components/fieldtypes/grid/Stacked.vue index 63d59d45c9..75536569ae 100644 --- a/resources/js/components/fieldtypes/grid/Stacked.vue +++ b/resources/js/components/fieldtypes/grid/Stacked.vue @@ -39,6 +39,7 @@ :can-delete="canDeleteRows" :can-add-rows="canAddRows" @updated="(row, value) => $emit('updated', row, value)" + @duplicate="(row) => $emit('duplicate', row)" @meta-updated="$emit('meta-updated', row._id, $event)" @removed="(row) => $emit('removed', row)" @focus="$emit('focus')" diff --git a/resources/js/components/fieldtypes/grid/StackedRow.vue b/resources/js/components/fieldtypes/grid/StackedRow.vue index 8861972e7e..5f82f758af 100644 --- a/resources/js/components/fieldtypes/grid/StackedRow.vue +++ b/resources/js/components/fieldtypes/grid/StackedRow.vue @@ -8,6 +8,9 @@
+ From 30bd17bb1c5412f2df384508f4225b5fd9ad1103 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 2 Aug 2024 15:30:36 +0100 Subject: [PATCH 037/249] [5.x] Fix the Video fieldtype with Vimeo file URLs (#10552) --- .../js/components/fieldtypes/VideoFieldtype.vue | 3 ++- src/Modifiers/CoreModifiers.php | 3 ++- tests/Modifiers/EmbedUrlTest.php | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/resources/js/components/fieldtypes/VideoFieldtype.vue b/resources/js/components/fieldtypes/VideoFieldtype.vue index 8e44f544df..0f0e31cb63 100644 --- a/resources/js/components/fieldtypes/VideoFieldtype.vue +++ b/resources/js/components/fieldtypes/VideoFieldtype.vue @@ -73,7 +73,8 @@ export default { if (embed_url.includes('vimeo')) { embed_url = embed_url.replace('/vimeo.com', '/player.vimeo.com/video'); - if (embed_url.split('/').length > 5) { + + if (! this.data.includes('progressive_redirect') && embed_url.split('/').length > 5) { let hash = embed_url.substr(embed_url.lastIndexOf('/') + 1); embed_url = embed_url.substr(0, embed_url.lastIndexOf('/')) + '?h=' + hash.replace('?', '&'); } diff --git a/src/Modifiers/CoreModifiers.php b/src/Modifiers/CoreModifiers.php index 51879e9aa1..ebfe34e311 100644 --- a/src/Modifiers/CoreModifiers.php +++ b/src/Modifiers/CoreModifiers.php @@ -3196,7 +3196,8 @@ private function getFromContext($context, $params, $key = 0) private function handleUnlistedVimeoUrls($url) { $hash = ''; - if (Str::substrCount($url, '/') > 4) { + + if (! Str::contains($url, 'progressive_redirect') && Str::substrCount($url, '/') > 4) { $hash = Str::afterLast($url, '/'); $url = Str::beforeLast($url, '/'); diff --git a/tests/Modifiers/EmbedUrlTest.php b/tests/Modifiers/EmbedUrlTest.php index 4f725bcc9c..c452a54fc6 100644 --- a/tests/Modifiers/EmbedUrlTest.php +++ b/tests/Modifiers/EmbedUrlTest.php @@ -42,6 +42,20 @@ public function it_transforms_private_vimeo_urls() ); } + #[Test] + public function it_transforms_vimeo_file_links() + { + $embedUrl = 'https://player.vimeo.com/progressive_redirect/playback/990169258/rendition/1080p/file.mp4?dnt=1&loc=external&log_user=0&signature=275be15f3630d1ca3e7a51456a911e11e3ba9fddf89911f49140f6de95357e05'; + + $this->assertEquals($embedUrl, $this->embed('https://player.vimeo.com/progressive_redirect/playback/990169258/rendition/1080p/file.mp4?loc=external&log_user=0&signature=275be15f3630d1ca3e7a51456a911e11e3ba9fddf89911f49140f6de95357e05')); + + $this->assertEquals( + $embedUrl.'&foo=bar', + $this->embed('https://player.vimeo.com/progressive_redirect/playback/990169258/rendition/1080p/file.mp4?loc=external&log_user=0&signature=275be15f3630d1ca3e7a51456a911e11e3ba9fddf89911f49140f6de95357e05&foo=bar'), + 'It appends the do not track query param if a query string already exists.' + ); + } + #[Test] public function it_transforms_youtube_urls() { From 04af068ead49407cec417c0c2b8ab60b3d905320 Mon Sep 17 00:00:00 2001 From: Tom Mulroy Date: Fri, 2 Aug 2024 22:32:17 +0800 Subject: [PATCH 038/249] [5.x] Adding page title to forgot your password page (#10555) --- src/Http/Controllers/ForgotPasswordController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/ForgotPasswordController.php b/src/Http/Controllers/ForgotPasswordController.php index 111d39651a..9bfb5c99f1 100644 --- a/src/Http/Controllers/ForgotPasswordController.php +++ b/src/Http/Controllers/ForgotPasswordController.php @@ -22,7 +22,9 @@ public function __construct() public function showLinkRequestForm() { - return view('statamic::auth.passwords.email'); + return view('statamic::auth.passwords.email')->with([ + 'title' => __('Forgot Your Password?'), + ]); } public function sendResetLinkEmail(Request $request) From f4c828001f45d9b7553c0949413ce11f1768d9e8 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 2 Aug 2024 15:40:06 +0100 Subject: [PATCH 039/249] [5.x] Asset tag: Fail silently when no URL has been provided (#10553) --- src/Tags/Asset.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Tags/Asset.php b/src/Tags/Asset.php index bb6f98e64c..f2c5dc6afe 100644 --- a/src/Tags/Asset.php +++ b/src/Tags/Asset.php @@ -41,6 +41,10 @@ public function index() return $this->context->value('asset'); } - return AssetAPI::find($this->params->get(['url', 'src'])); + if (! $asset = $this->params->get(['url', 'src'])) { + return null; + } + + return AssetAPI::find($asset); } } From 8efcedcee2f29f36c895e50d4ee48438c4e6f352 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 2 Aug 2024 17:17:40 +0100 Subject: [PATCH 040/249] [5.x] Fix hyphens in JS slugs (#10541) Co-authored-by: Jason Varga --- resources/js/components/slugs/Slug.js | 3 ++ resources/js/tests/Slug.test.js | 40 +++++++++++++++++++++++++++ tests/Feature/SlugTest.php | 3 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 resources/js/tests/Slug.test.js diff --git a/resources/js/components/slugs/Slug.js b/resources/js/components/slugs/Slug.js index 3097fdeca4..b40167e5a4 100644 --- a/resources/js/components/slugs/Slug.js +++ b/resources/js/components/slugs/Slug.js @@ -56,6 +56,7 @@ export default class Slug { #createSynchronously() { const symbols = Statamic.$config.get('asciiReplaceExtraSymbols'); const charmap = Statamic.$config.get('charmap'); + let custom = charmap[this.#language] ?? {}; custom["'"] = ""; // Remove apostrophes in all languages custom["’"] = ""; // Remove smart single quotes @@ -66,6 +67,8 @@ export default class Slug { ? this.#replaceCurrencySymbols(custom, charmap) : this.#removeCurrencySymbols(custom, charmap); + if (this.#separator !== '-') custom['-'] = this.#separator; // Replace dashes with custom separator + return speakingUrl(this.#string, { separator: this.#separator, lang: this.#language, diff --git a/resources/js/tests/Slug.test.js b/resources/js/tests/Slug.test.js new file mode 100644 index 0000000000..7661b07ff8 --- /dev/null +++ b/resources/js/tests/Slug.test.js @@ -0,0 +1,40 @@ +import Slug from "../components/slugs/Slug"; + +let config = { + asciiReplaceExtraSymbols: false, + selectedSite: 'en', + sites: [{handle: 'en', lang: 'en'}], + charmap: { + // More values would be in this charmap in reality but this enough for the test. + en: {}, // en *would* be empty by default though. + currency_short: {'$': '$'} + } +} + +window.Statamic = { + $config: { + get: (key) => config[key] + } +} + +test('it slugifies', () => { + expect((new Slug).create('One')).toBe('one'); + expect((new Slug).create('One Two Three')).toBe('one-two-three'); + expect((new Slug).create(`Apple's`)).toBe('apples'); + expect((new Slug).create(`Statamic’s latest feature: “Duplicator”`)).toBe('statamics-latest-feature-duplicator'); + expect((new Slug).separatedBy('_').create('JSON-LD Document')).toBe('json_ld_document'); + expect((new Slug).create('Block - Hero')).toBe('block-hero'); + expect((new Slug).create('10% off over $100 & more')).toBe('10-off-over-100-more'); +}) + +test('it slugifies with extra symbols', () => { + // When setting ascii_replace_extra_symbols to true, these would get set by php. + // There would be more in reality but these are enough for the test. + config.asciiReplaceExtraSymbols = true; + config.charmap.en['%'] = ' percent '; + config.charmap.en['&'] = ' and '; + config.charmap.en['&'] = ' and '; + config.charmap.currency = {'$': ' Dollar '} + + expect((new Slug).create('10% off over $100 & more')).toBe('10-percent-off-over-dollar-100-and-more'); +}); diff --git a/tests/Feature/SlugTest.php b/tests/Feature/SlugTest.php index b186d40a00..a5b8bac75f 100644 --- a/tests/Feature/SlugTest.php +++ b/tests/Feature/SlugTest.php @@ -34,7 +34,8 @@ public static function slugProvider() 'multiple words' => ['one two three', '-', 'en', 'one-two-three'], 'apples' => ["Apple's", '-', 'en', 'apples'], 'smart quotes' => ['Statamic’s latest feature: “Duplicator”', '-', 'en', 'statamics-latest-feature-duplicator'], - 'hyphens separated by spaces' => ['Block - Hero', '-', 'en', 'block-hero'], + 'dashes using underscore separator' => ['JSON-LD Document', '_', 'en', 'json_ld_document'], + 'dashes separated by spaces' => ['Block - Hero', '-', 'en', 'block-hero'], 'chinese characters' => ['你好,世界', '-', 'ch', 'ni-hao-shi-jie'], 'german characters' => ['Björn Müller', '-', 'de', 'bjoern-mueller'], 'arabic characters' => ['صباح الخير', '-', 'ar', 'sbah-alkhyr'], From fa0c1f3eea00e5d2818ba8cd097d0884e410a4b3 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Mon, 5 Aug 2024 15:53:48 +0200 Subject: [PATCH 041/249] [5.x] Allow entry of hex colors without leading hash (#10568) --- .../js/components/fieldtypes/ColorFieldtype.vue | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/js/components/fieldtypes/ColorFieldtype.vue b/resources/js/components/fieldtypes/ColorFieldtype.vue index 0bc20c3d67..d539eb300a 100644 --- a/resources/js/components/fieldtypes/ColorFieldtype.vue +++ b/resources/js/components/fieldtypes/ColorFieldtype.vue @@ -67,6 +67,7 @@ :readonly="isReadOnly" :value="customColor" @input="updateDebounced($event.target.value)" + @blur="sanitizeCustomColor" />
@@ -111,6 +112,11 @@ export default { this.customColor = event.target.value; }, + sanitizeCustomColor() { + this.customColor = this.sanitizeColor(this.customColor); + this.update(this.customColor); + }, + commitCustomColor() { this.update(this.customColor); }, @@ -119,6 +125,15 @@ export default { this.update(null); }, + sanitizeColor(color) { + if (color && /^#?([a-fA-F0-9]{3,6})$/.test(color.trim())) { + color = color.replace(/[^a-fA-F0-9]/g, ''); + if (color.length === 3) { + color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; + } + return `#${color}`; + } + } } }; From 1f51041f4e373aeabb417863fe84b7fbaaa4f99a Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Mon, 5 Aug 2024 15:58:52 +0200 Subject: [PATCH 042/249] [5.x] Fix invisible links in Bard headings (#10567) --- resources/css/components/fieldtypes/bard.css | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/resources/css/components/fieldtypes/bard.css b/resources/css/components/fieldtypes/bard.css index a8404b7ec7..0a26a9c822 100644 --- a/resources/css/components/fieldtypes/bard.css +++ b/resources/css/components/fieldtypes/bard.css @@ -335,7 +335,23 @@ h1, h2, h3, h4, h5, h6 { margin-top: 1.275em; margin-bottom: .85em; - font-weight: 700 + font-weight: 700; + + b, + strong { + font-weight: 900; + } + + a { + @apply text-blue dark:text-dark-blue-100 underline break-words; + } + + a:active, + a:focus, + a:hover { + outline: 0; + text-decoration: underline; + } } h1 { font-size: 2em } From 1aa0d202a06574e6c70a0784cd34379fc4c201f7 Mon Sep 17 00:00:00 2001 From: Peiman Nourani Date: Mon, 5 Aug 2024 17:29:03 +0330 Subject: [PATCH 043/249] [5.x] Azerbaijani translation (#10561) Co-authored-by: Jason Varga --- resources/lang/az.json | 1124 +++++++++++++++++++++++++++ resources/lang/az/fieldtypes.php | 205 +++++ resources/lang/az/markdown.php | 58 ++ resources/lang/az/messages.php | 258 ++++++ resources/lang/az/moment.php | 18 + resources/lang/az/permissions.php | 88 +++ resources/lang/az/validation.php | 151 ++++ src/Preferences/CorePreferences.php | 1 + 8 files changed, 1903 insertions(+) create mode 100644 resources/lang/az.json create mode 100644 resources/lang/az/fieldtypes.php create mode 100644 resources/lang/az/markdown.php create mode 100644 resources/lang/az/messages.php create mode 100644 resources/lang/az/moment.php create mode 100644 resources/lang/az/permissions.php create mode 100644 resources/lang/az/validation.php diff --git a/resources/lang/az.json b/resources/lang/az.json new file mode 100644 index 0000000000..55d423c20c --- /dev/null +++ b/resources/lang/az.json @@ -0,0 +1,1124 @@ +{ + ":count item selected|:count items selected" : ":count element seçildi|:count element seçildi", + ":count row|:count rows" : ":count sətir|:count sətir", + ":count selected|:count selected" : ":count seçildi|:count seçildi", + ":count set|:count sets" : ":count dəst|:count dəst", + ":count word|:count words" : ":count kəlmə|:count kəlmə", + ":count/:max selected" : ":count/:max seçildi", + ":count/:total characters" : ":count/:total hərf", + ":file uploaded" : ":file yükləndi", + ":start-:end of :total" : ":start-:end :total-dən", + ":title Field" : ":title Sahə", + "0 B" : "0 B", + "1 update available|:count updates available" : "Bir yeniləmə mövcuddur|:count yeniləmə mövcuddur", + "1 update|:count updates" : "Bir yeniləmə|:count yeniləmə", + "A blueprint with that name already exists." : "Bu adla artıq bir plan mövcuddur.", + "A fieldset with that name already exists." : "Bu adla artıq bir sahə dəsti mövcuddur.", + "A Global Set with that handle already exists." : "Bu tutacaqla artıq bir Qlobal Dəst mövcuddur.", + "A navigation with that handle already exists." : "Bu tutacaqla artıq bir naviqasiya mövcuddur.", + "A Role with that handle already exists." : "Bu tutacaqla artıq bir Rol mövcuddur.", + "A User Group with that handle already exists." : "Bu tutacaqla artıq bir İstifadəçi Qrupu mövcuddur.", + "A valid blueprint is required." : "Etibarlı bir plan tələb olunur.", + "Above" : "Yuxarıda", + "Action completed" : "Əməliyyat tamamlandı", + "Activate Account" : "Hesabı Aktivləşdir", + "Activation URL" : "Aktivləşdirmə URL-i", + "Active" : "Aktiv", + "Add" : "Əlavə et", + "Add Attribute" : "Xüsusiyyət əlavə et", + "Add child link to entry" : "Girişə uşaq linki əlavə et", + "Add child nav item" : "Uşaq naviqasiya elementi əlavə et", + "Add Color" : "Rəng əlavə et", + "Add Column" : "Sütun əlavə et", + "Add Column After" : "Sonra Sütun əlavə et", + "Add Column Before" : "Əvvəl Sütun əlavə et", + "Add Condition" : "Şərt əlavə et", + "Add Date" : "Tarix əlavə et", + "Add Email" : "E-poçt əlavə et", + "Add Item" : "Element əlavə et", + "Add Key" : "Açar əlavə et", + "Add Nav Item" : "Naviqasiya elementi əlavə et", + "Add Option" : "Seçim əlavə et", + "Add or drag fields here" : "Sahələri bura əlavə edin və ya sürükləyin", + "Add Row" : "Sətir əlavə et", + "Add Row After" : "Sonra Sətir əlavə et", + "Add Row Before" : "Əvvəl Sətir əlavə et", + "Add Row Label" : "Sətir Etiketi əlavə et", + "Add Rule" : "Qayda əlavə et", + "Add Ruler" : "Xətkeş əlavə et", + "Add Section" : "Bölmə əlavə et", + "Add Set" : "Dəst əlavə et", + "Add Set Group" : "Dəst Qrupu əlavə et", + "Add Set Label" : "Dəst Etiketi əlavə et", + "Add Site" : "Sayt əlavə et", + "Add Tab" : "Tab əlavə et", + "Added" : "Əlavə edildi", + "Addon Settings" : "Əlavə Parametrləri", + "Addons" : "Əlavələr", + "Affected files" : "Təsirlənən fayllar", + "After" : "Sonra", + "After Saving" : "Yadda saxlandıqdan sonra", + "Alias Item" : "Ləqəb Elementi", + "Align Center" : "Ortaya hizala", + "Align Justify" : "Tam hizala", + "Align Left" : "Sola hizala", + "Align Right" : "Sağa hizala", + "All" : "Hamısı", + "All caches cleared." : "Bütün keşlər təmizləndi.", + "All of the following conditions pass" : "Aşağıdakı şərtlərin hamısı keçərli oldu", + "All rights reserved." : "Bütün hüquqlar qorunur.", + "Allow additions" : "Əlavələrə icazə ver", + "Allow Antlers" : "Antlers-ə icazə ver", + "Allow Any Color" : "Hər hansı rəngə icazə ver", + "Allow Creating" : "Yaratmağa icazə ver", + "Allow Downloading" : "Yükləməyə icazə ver", + "Allow Fullscreen Mode" : "Tam ekran rejiminə icazə ver", + "Allow Moving" : "Hərəkət etməyə icazə ver", + "Allow Renaming" : "Adını dəyişməyə icazə ver", + "Allow Source Mode" : "Mənbə rejiminə icazə ver", + "Allow Uploads" : "Yükləməyə icazə ver", + "Alt Text" : "Alternativ Mətn", + "Always Save" : "Həmişə Yadda Saxla", + "Always show" : "Həmişə göstər", + "Always Show Set Button" : "Həmişə Dəst Düyməsini Göstər", + "An entry will be deleted|:count entries will be deleted" : "Bir giriş silinəcək|:count giriş silinəcək", + "An item with this ID could not be found" : "Bu ID ilə element tapılmadı", + "and" : "və", + "and :count more" : "və :count daha", + "Antlers" : "Antlers", + "Any of the following conditions pass" : "Aşağıdakı şərtlərdən hər hansı biri keçərli oldu", + "Any unsaved changes will not be duplicated into the new entry." : "Yadda saxlanmamış dəyişikliklər yeni girişə kopyalanmayacaq.", + "Any unsaved changes will not be reflected in this action's behavior." : "Yadda saxlanmamış dəyişikliklər bu əməliyyatın davranışında əks olunmayacaq.", + "Appearance" : "Görünüş", + "Appearance & Behavior" : "Görünüş və Davranış", + "Append" : "Əlavə et", + "Application Cache" : "Tətbiqi Program Keşi", + "Application cache cleared." : "Tətbiq Program keşi təmizləndi.", + "Apply" : "Tətbiq et", + "Apply Link" : "Keçidi tətbiq et", + "Are you sure you want to delete this column?" : "Bu sütunu silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this entry?" : "Bu girişi silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this item?" : "Bu elementi silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this row?" : "Bu sətri silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this value?" : "Bu dəyəri silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this view?" : "Bu görünüşü silmək istədiyinizə əminsinizmi?", + "Are you sure you want to delete this?|Are you sure you want to delete these :count items?" : "Bunu silmək istədiyinizə əminsinizmi?|Bu :count elementləri silmək istədiyinizə əminsinizmi?", + "Are you sure you want to move this asset?|Are you sure you want to move these :count assets?" : "Bu varlığı köçürmək istədiyinizə əminsinizmi?|Bu :count varlığı köçürmək istədiyinizə əminsinizmi?", + "Are you sure you want to move this folder?|Are you sure you want to move these :count folders?" : "Bu qovluğu köçürmək istədiyinizə əminsinizmi?|Bu :count qovluqları köçürmək istədiyinizə əminsinizmi?", + "Are you sure you want to publish this entry?|Are you sure you want to publish these :count entries?" : "Bu girişi yayımlamaq istədiyinizə əminsinizmi?|Bu :count girişləri yayımlamaq istədiyinizə əminsinizmi?", + "Are you sure you want to remove this page?" : "Bu səhifəni silmək istədiyinizə əminsinizmi?", + "Are you sure you want to remove this section and all of its children?" : "Bu bölməni və onun bütün uşaqlarını silmək istədiyinizə əminsinizmi?", + "Are you sure you want to rename this asset?|Are you sure you want to rename these :count assets?" : "Bu varlığın adını dəyişmək istədiyinizə əminsinizmi?|Bu :count varlığın adını dəyişmək istədiyinizə əminsinizmi?", + "Are you sure you want to rename this folder?|Are you sure you want to rename these :count folders?" : "Bu qovluğun adını dəyişmək istədiyinizə əminsinizmi?|Bu :count qovluqların adını dəyişmək istədiyinizə əminsinizmi?", + "Are you sure you want to reset nav customizations?" : "Naviqasiya fərdiləşdirmələrini sıfırlamaq istədiyinizə əminsinizmi?", + "Are you sure you want to restore this revision?" : "Bu değişikliki bərpa etmək istədiyinizə əminsinizmi?", + "Are you sure you want to run this action?|Are you sure you want to run this action on :count items?" : "Bu əməliyyatı yerinə yetirmək istədiyinizə əminsinizmi?|Bu əməliyyatı :count elementdə yerinə yetirmək istədiyinizə əminsinizmi?", + "Are you sure you want to unpublish this entry?|Are you sure you want to unpublish these :count entries?" : "Bu girişi yayından çıxarmaq istədiyinizə əminsinizmi?|Bu :count girişləri yayından çıxarmaq istədiyinizə əminsinizmi?", + "Are you sure?" : "Əminsinizmi?", + "Are you sure? This field's value will be replaced by the value in the original entry." : "Əminsinizmi? Bu sahənin dəyəri orijinal girişin dəyəri ilə əvəz olunacaq.", + "Are you sure? Unsaved changes will be lost." : "Əminsinizmi? Yadda saxlanmamış dəyişikliklər itəcək.", + "Ascending" : "Artan", + "Asset" : "Varlıq", + "Asset container created" : "Varlıq konteyneri yaradıldı", + "Asset container deleted" : "Varlıq konteyneri silindi", + "Asset container saved" : "Varlıq konteyneri yadda saxlanıldı", + "Asset container updated" : "Varlıq konteyneri yeniləndi", + "Asset Containers" : "Varlıq Konteynerləri", + "Asset deleted" : "Varlıq silindi", + "Asset folder deleted" : "Varlıq qovluğu silindi", + "Asset folder saved" : "Varlıq qovluğu yadda saxlanıldı", + "Asset references updated" : "Varlıq istinadları yeniləndi", + "Asset reuploaded" : "Varlıq yenidən yükləndi", + "Asset saved" : "Varlıq yadda saxlanıldı", + "Asset uploaded" : "Varlıq yükləndi", + "Assets" : "Varlıqlar", + "Assign Groups" : "Qrupları təyin et", + "Assign groups to this user?|Assign groups to these :count users?" : "Bu istifadəçiyə qrupları təyin et?|Bu :count istifadəçiyə qrupları təyin et?", + "Assign Roles" : "Rolları təyin et", + "Assign roles to this user?|Assign roles to these :count users?" : "Bu istifadəçiyə rolları təyin et?|Bu :count istifadəçiyə rolları təyin et?", + "Assign|Assign to :count users" : "Təyin et|:count istifadəçiyə təyin et", + "Attachments" : "Əlavələr", + "Author" : "Müəllif", + "Autocomplete" : "Avtomatik tamamla", + "Automatic Line Breaks" : "Avtomatik Sətir Sonları", + "Automatic Links" : "Avtomatik Keçidlər", + "Available Columns" : "Mövcud Sütunlar", + "B" : "B", + "Back to Users" : "İstifadəçilərə qayıt", + "BCC Recipient(s)" : "Gizli Göndərilənlər", + "Before" : "Əvvəl", + "Before you can delete this fieldset, you need to remove references to it in blueprints and fieldsets:" : "Bu sahə dəstini silməzdən əvvəl, planlar və sahə dəstlərindəki istinadları çıxarmalısınız:", + "Behavior" : "Davranış", + "Below" : "Aşağıda", + "Between" : "Arasında", + "Blockquote" : "Sitat Bloku", + "Blueprint" : "Plan", + "Blueprint created" : "Plan yaradıldı", + "Blueprint deleted" : "Plan silindi", + "Blueprint saved" : "Plan yadda saxlanıldı", + "Blueprints" : "Planlar", + "Blueprints successfully reordered" : "Planlar uğurla yenidən sıralandı", + "Bold" : "Qalın", + "Boundaries" : "Sərhədlər", + "Browse" : "Göz at", + "Buddhist" : "Buddist Təqvimi", + "Build time" : "Yığma vaxtı", + "Button" : "Düymə", + "Buttons" : "Düymələr", + "Buttons & Controls" : "Düymələr və İdarəetmələr", + "Buy Licenses" : "Lisenziyaları Al", + "C-Like" : "C-Kimi", + "Cache" : "Keş", + "Cache Manager" : "Keş Meneceri", + "Cached images" : "Keşlənmiş şəkillər", + "Calendar" : "Təqvim", + "Cancel" : "Ləğv et", + "Cast Booleans" : "Boolean-ları çevir", + "CC Recipient(s)" : "Göndərilənlər", + "Change Password" : "Şifrəni Dəyiş", + "Change successful." : "Dəyişiklik uğurlu oldu.", + "Changes to this field in the fieldset will stay in sync." : "Bu sahə dəstindəki bu sahəyə edilən dəyişikliklər sinxron olaraq qalacaq.", + "Changes to this fieldset will stay in sync." : "Bu sahə dəstinə edilən dəyişikliklər sinxron olaraq qalacaq.", + "Character Limit" : "Hərf Limiti", + "Characters" : "Hərflar", + "Checkbox Options" : "Qutu Seçimləri", + "Choose Blueprint" : "Plani Seç", + "Choose Image" : "Şəkili Seç", + "Choose..." : "Seç...", + "Civil Islamic" : "Sivil Hicri Təqvimi", + "Clear" : "Təmizlə", + "Clear All" : "Hamısını Təmizlə", + "Clearable" : "Təmizlənə bilən", + "Close" : "Bağla", + "Close Editor" : "Redaktoru Bağla", + "Close Markdown Cheatsheet" : "Markdown Kömək Cədvəlini Bağla", + "Close Modal" : "Modalı Bağla", + "Code Block" : "Kod Bloku", + "Code Fieldtype Rulers" : "Kod Sahə Tipi Qaydaları", + "Collapse" : "Daralt", + "Collapse All" : "Hamısını Daralt", + "Collapse Set" : "Dəsti Daralt", + "Collapse Sets" : "Dəstləri Daralt", + "Collection" : "Kolleksiya", + "Collection already exists" : "Kolleksiya artıq mövcuddur", + "Collection created" : "Kolleksiya yaradıldı", + "Collection deleted" : "Kolleksiya silindi", + "Collection is not available on site \":handle\"." : "Kolleksiya \":handle\" saytında mövcud deyil.", + "Collection saved" : "Kolleksiya yadda saxlanıldı", + "Collection tree deleted" : "Kolleksiya ağacı silindi", + "Collection tree saved" : "Kolleksiya ağacı yadda saxlanıldı", + "Collections" : "Kolleksiyalar", + "Columns" : "Sütunlar", + "Columns have been reset to their defaults." : "Sütunlar standartlarına sıfırlandı.", + "Commit" : "Təsdiq et", + "Common" : "Ümumi", + "Computed" : "Hesablanmış", + "Conditions" : "Şərtlər", + "Configuration" : "Konfiqurasiya", + "Configuration is cached" : "Konfiqurasiya keşdədir", + "Configure" : "Konfiqurasiya et", + "Configure Asset Container" : "Varlıq Konteynerini Konfiqurasiya et", + "Configure Blueprints" : "Planları Konfiqurasiya et", + "Configure Collection" : "Kolleksiyanı Konfiqurasiya et", + "Configure Form" : "Formu Konfiqurasiya et", + "Configure Global Set" : "Qlobal Dəsti Konfiqurasiya et", + "Configure Navigation" : "Naviqasiyanı Konfiqurasiya et", + "Configure Role" : "Rolu Konfiqurasiya et", + "Configure Site" : "Saytı Konfiqurasiya et", + "Configure Sites" : "Saytları Konfiqurasiya et", + "Configure Taxonomy" : "Taksonomiyanı Konfiqurasiya et", + "Configure User Group" : "İstifadəçi Qrupunu Konfiqurasiya et", + "Confirm" : "Təsdiq et", + "Confirm Password" : "Şifrəni Təsdiq et", + "Container" : "Konteyner", + "contains" : "ehtiva edir", + "Contains" : "Ehtiva edir", + "contains any" : "hər hansı birini ehtiva edir", + "Content" : "Məzmun", + "Content committed" : "Məzmun təsdiq edildi", + "Content Model" : "Məzmun Modeli", + "Content saved" : "Məzmun yadda saxlanıldı", + "Content Stache" : "Məzmun Stache", + "Continue Editing" : "Redaktəyə Davam et", + "Copied to clipboard" : "Panoya kopyalandı", + "Coptic" : "Qibti Təqvimi", + "Copy" : "Kopyala", + "Copy password reset email for this user?" : "Bu istifadəçi üçün şifrə yeniləmə e-poçtunu kopyalamaq?", + "Copy Password Reset Link" : "Şifrə Yeniləmə Keçidini Kopyala", + "Copy URL" : "URL-ni Kopyala", + "Core" : "Nüvə", + "Couldn't save entry" : "Giriş yadda saxlanıla bilmədi", + "Couldn't save term" : "Termin yadda saxlanıla bilmədi", + "CP Nav" : "KP Naviqasiya", + "CP Nav Preferences" : "KP Naviqasiya Seçimləri", + "Create" : "Yarat", + "Create & Link Item" : "Element Yarat və Bağla", + "Create a Blueprint" : "Plan Yarat", + "Create a Collection" : "Kolleksiya Yarat", + "Create a Navigation" : "Naviqasiya Yarat", + "Create and Send Email" : "E-poçt Yarat və Göndər", + "Create Another" : "Başqa Birini Yarat", + "Create Asset Container" : "Varlıq Konteyneri Yarat", + "Create Blueprint" : "Plan Yarat", + "Create Child Entry" : "Uşaq Giriş Yarat", + "Create Collection" : "Kolleksiya Yarat", + "Create Container" : "Konteyner Yarat", + "Create Entry" : "Giriş Yarat", + "Create Field" : "Sahə Yarat", + "Create Fieldset" : "Sahə Dəsti Yarat", + "Create Folder" : "Qovluq Yarat", + "Create Folders" : "Qovluqlar Yarat", + "Create Form" : "Form Yarat", + "Create Global Set" : "Qlobal Dəst Yarat", + "Create Group" : "Qrup Yarat", + "Create Localization" : "Lokallaşma Yarat", + "Create Navigation" : "Naviqasiya Yarat", + "Create New View" : "Yeni Baxış Yarat", + "Create Revision" : "Reviziya Yarat", + "Create Role" : "Rol Yarat", + "Create Taxonomy" : "Taksonomiya Yarat", + "Create Term" : "Termin Yarat", + "Create User" : "İstifadəçi Yarat", + "Create User Group" : "İstifadəçi Qrupu Yarat", + "Create Views" : "Baxışlar Yarat", + "CSS" : "CSS", + "Current" : "Cari", + "Current Password" : "Cari Şifrə", + "Current Version" : "Cari Versiya", + "custom" : "fərdi", + "Custom Attributes" : "Fərdi Atributlar", + "Custom Item" : "Fərdi Element", + "Custom method passes" : "Fərdi metod keçid edir", + "Custom Section" : "Fərdi Bölmə", + "Customize Columns" : "Sütunları Fərdiləşdir", + "Customize Invitation" : "Dəvətnaməni Fərdiləşdir", + "Customizing the Control Panel Nav" : "İdarəetmə Paneli Naviqasiyasını Fərdiləşdirir", + "Dark" : "Qaranlıq", + "Dark Mode" : "Qaranlıq Rejim", + "Dashboard" : "Panel", + "Data" : "Veri", + "Data Format" : "Veri Formatı", + "Data updated" : "Veri yeniləndi", + "Date" : "Tarix", + "Dates & Behaviors" : "Tarixlər və Davranışlar", + "Default" : "Defolt", + "Default Color" : "Defolt Rəng", + "Default From Address" : "Defolt Göndərən Ünvanı", + "Default From Name" : "Defolt Göndərən Adı", + "Default Mailer" : "Defolt Poçt Göndəricisi", + "Default Mode" : "Defolt Rejim", + "Default preferences saved" : "Defolt üstünlüklər yadda saxlanıldı", + "Default Value" : "Defolt Dəyər", + "Delete" : "Sil", + "Delete :resource" : "Bunu sil: :resource", + "Delete child entry|Delete :count child entries" : "Uşaq girişi sil|:count uşaq girişi sil", + "Delete Collection" : "Kolleksiyanı Sil", + "Delete Column" : "Sütunu Sil", + "Delete Container" : "Konteyneri Sil", + "Delete Entry" : "Girişi Sil", + "Delete Form" : "Formu Sil", + "Delete Original Asset" : "Orijinal Varlığı Sil", + "Delete Row" : "Sıra Sil", + "Delete Rule" : "Qaydanı Sil", + "Delete Set" : "Dəsti Sil", + "Delete Table" : "Cədvəli Sil", + "Delete Taxonomy" : "Taksonomiyanı Sil", + "Delete User Group" : "İstifadəçi Qrupunu Sil", + "Delete Value" : "Dəyəri Sil", + "Delete View" : "Baxışı Sil", + "Delete|Delete :count items?" : "Sil|:count elementi sil?", + "Deleted" : "Silindi", + "Descending" : "Azalan", + "Description of the image" : "Şəklin açıklamayi", + "Deselect option" : "Seçimi ləğv et", + "Detach" : "Ayır", + "Dictionary" : "Lüğət", + "Directory" : "Qovluq", + "Directory already exists." : "Qovluq artıq mövcuddur.", + "Disabled" : "Deaktiv edilib", + "Discard changes" : "Dəyişiklikləri ləğv et", + "Disk" : "Disk", + "Dismiss" : "Rədd et", + "Display" : "Ekran", + "Display Label" : "Ekran Etiketı", + "Displayed Columns" : "Göstərilən Sütunlar", + "Documentation" : "Sənədləşmə", + "Don't remove empty nodes" : "Boş qovşaqları çıxarma", + "Downgrade to :version" : ":version versiyasına keç", + "Download" : "Yüklə", + "Download file" : "Faylı yüklə", + "Downloads" : "Yükləmələr", + "Draft" : "Qaralama", + "Driver" : "Sürücü", + "Drop File to Upload" : "Yükləmək üçün Faylı Buraxın", + "Drop to Upload" : "Yükləmək üçün Buraxın", + "DummyClass" : "DummyClass", + "Duplicate" : "Dublikat", + "Duplicate ID Regenerated" : "Dublikat ID Yenidən Yaradıldı", + "Duplicate IDs" : "Dublikat ID-lər", + "Duplicate Row" : "Sıra Dublikatı", + "Duplicate Set" : "Dəst Dublikatı", + "Duplicated" : "Dublikatlaşdırıldı", + "Dynamic" : "Dinamik", + "e.g. hero_" : "məsələn, hero_", + "Earliest Date" : "Ən Erkən Tarix", + "Edit" : "Redaktə et", + "Edit Asset" : "Varlığı Redaktə et", + "Edit Blueprint" : "Plani Redaktə et", + "Edit Blueprints" : "Planları Redaktə et", + "Edit Collection" : "Kolleksiyanı Redaktə et", + "Edit Container" : "Konteyneri Redaktə et", + "Edit Content" : "Məzmunu Redaktə et", + "Edit Entry" : "Girişi Redaktə et", + "Edit Fieldset" : "Sahə Dəstini Redaktə et", + "Edit Form" : "Formu Redaktə et", + "Edit Global Set" : "Qlobal Dəsti Redaktə et", + "Edit Image" : "Şəkli Redaktə et", + "Edit Nav Item" : "Naviqasiya Elementini Redaktə et", + "Edit Navigation" : "Naviqasiyanı Redaktə et", + "Edit Section" : "Bölməni Redaktə et", + "Edit Set" : "Dəsti Redaktə et", + "Edit Set Group" : "Dəst Qrupunu Redaktə et", + "Edit Site" : "Saytı Redaktə et", + "Edit Tab" : "Sekməni Redaktə et", + "Edit Taxonomy" : "Taksonomiyanı Redaktə et", + "Edit Term" : "Termini Redaktə et", + "Edit User" : "İstifadəçini Redaktə et", + "Edit User Group" : "İstifadəçi Qrupunu Redaktə et", + "Editable once created" : "Yaradıldıqdan sonra redaktə edilə bilər", + "Editions" : "Nəşrlər", + "Editor" : "Redaktor", + "Email" : "E-poçt", + "Email Address" : "E-poçt Ünvanı", + "Email Content" : "E-poçt Məzmunu", + "Email Subject" : "E-poçt Mövzusu", + "Enable Input Rules" : "Daxiletmə Qaydalarını Aktivləşdir", + "Enable Line Wrapping" : "Sətir Bükməsini Aktivləşdir", + "Enable Paste Rules" : "Yapışdırma Qaydalarını Aktivləşdir", + "Enable Pro Mode" : "Pro Rejimi Aktivləşdir", + "Enable Publish Dates" : "Yayımlama Tarixlərini Aktivləşdir", + "Enable Revisions" : "Reviziyaları Aktivləşdir", + "Encryption" : "Şifrələmə", + "Enter any internal or external URL." : "Hər hansı daxili və ya xarici URL daxil edin.", + "Enter URL" : "URL daxil edin", + "Entries" : "Girişlər", + "Entries successfully reordered" : "Girişlər uğurla yenidən sıralandı", + "Entry" : "Giriş", + "Entry created" : "Giriş yaradıldı", + "Entry deleted" : "Giriş silindi", + "Entry has a published version" : "Girişin nəşr olunmuş versiyası var", + "Entry has not been published" : "Giriş nəşr edilməyib", + "Entry has unpublished changes" : "Girişdə yayımlanmayan dəyişikliklər var", + "Entry link" : "Giriş bağlantısı", + "Entry saved" : "Giriş saxlanıldı", + "equals" : "bərabərdir", + "Equals" : "Bərabərdir", + "Escape Markup" : "Nişanlamadan Qaçın", + "Ethiopian" : "Efiopiya Təqvimi", + "Ethiopian (Amete Alem)" : "Efiopiya Təqvimi (Dünyanın Yaradılması)", + "Everything is up to date." : "Hər şey yenilənib.", + "Example" : "Nümunə", + "Exit Fullscreen Mode" : "Tam Ekran Rejimindən Çıx", + "Expand All" : "Hamısını Genişləndir", + "Expand Set" : "Dəsti Genişləndir", + "Expand Sets" : "Dəstləri Genişləndir", + "Expand/Collapse Sets" : "Dəstləri Genişləndir/Daralt", + "Expect a root page" : "Kök səhifə gözlənilir", + "Expired" : "Müddəti bitmiş", + "Export Submissions" : "Göndərişləri İxrac Et", + "External link" : "Xarici bağlantı", + "False" : "Yanlış", + "Favorite removed" : "Sevimli silindi", + "Favorite saved" : "Sevimli saxlanıldı", + "Favorites" : "Sevimlilər", + "Featured" : "Seçilmiş", + "Field" : "Sahə", + "Field added" : "Sahə əlavə olundu", + "Field Previews" : "Sahə Önizləmələri", + "Fields" : "Sahələr", + "Fieldset" : "Sahə Dəsti", + "Fieldset created" : "Sahə dəsti yaradıldı", + "Fieldset deleted" : "Sahə dəsti silindi", + "Fieldset saved" : "Sahə dəsti saxlanıldı", + "Fieldsets" : "Sahə Dəstləri", + "Fieldtypes" : "Sahə Tipləri", + "File" : "Fayl", + "file (statamic)" : "fayl (statamik)", + "File Driver" : "Fayl Sürücüsü", + "Filename" : "Fayl adı", + "Filter" : "Süzgəc", + "Filter preset deleted" : "Süzgəcin əvvəlcədən təyin edilməsi silindi", + "Filter preset saved" : "Süzgəcin əvvəlcədən təyin edilməsi saxlanıldı", + "Filter preset updated" : "Süzgəcin əvvəlcədən təyin edilməsi yeniləndi", + "Finish" : "Bitir", + "First Child" : "Birinci Uşaq", + "Fixed" : "Sabit", + "Floating" : "Üzən", + "Focal Point" : "Fokus Nöqtəsi", + "Focus Search" : "Axtarışı Fokusla", + "Folder" : "Qovluq", + "Folder created" : "Qovluq yaradıldı", + "Folder Name" : "Qovluq Adı", + "Forgot password?" : "Şifrəni unutdun?", + "Forgot Your Password?" : "Şifrənizi Unutdunuz?", + "Form already exists" : "Forma artıq mövcuddur", + "Form created" : "Forma yaradıldı", + "Form deleted" : "Forma silindi", + "Form saved" : "Forma saxlanıldı", + "Form Submission" : "Forma Göndərməsi", + "Format" : "Format", + "Forms" : "Formalar", + "Free" : "Pulsuz", + "From" : "Kimdən", + "Full Width" : "Tam Genişlik", + "Future Date Behavior" : "Gələcək Tarix Davranışı", + "GB" : "GB", + "General" : "Ümumi", + "Generate" : "Yarat", + "Git" : "Git", + "Global Search" : "Qlobal Axtarış", + "Global Set created" : "Qlobal Dəst yaradıldı", + "Global Set deleted" : "Qlobal Dəst silindi", + "Global Set saved" : "Qlobal Dəst saxlanıldı", + "Global Sets" : "Qlobal Dəstlər", + "Global Variables" : "Qlobal Dəyişənlər", + "Globals" : "Qloballar", + "Go" : "Go", + "Go To Listing" : "Siyahıya Get", + "Greater than" : "Böyükdür", + "Greater than or equals" : "Böyükdür və ya bərabərdir", + "Gregory" : "Qriqori Təqvimi", + "Grid" : "Şəbəkə", + "Group" : "Qrup", + "Groups" : "Qruplar", + "HAML" : "HAML", + "Handle" : "Tanıdıcı", + "Handlebars" : "Handlebars", + "Heading 1" : "Başlıq 1", + "Heading 2" : "Başlıq 2", + "Heading 3" : "Başlıq 3", + "Heading 4" : "Başlıq 4", + "Heading 5" : "Başlıq 5", + "Heading 6" : "Başlıq 6", + "Heading Anchors" : "Başlıq Ankerləri", + "Hebrew" : "Yəhudi Təqvimi", + "Hello!" : "Salam!", + "Here" : "Burada", + "Hidden" : "Gizli", + "Hidden by default" : "Varsayılan olaraq gizli", + "Hidden from output" : "Çıxışdan gizlədilib", + "Hidden Item" : "Gizli Maddə", + "Hidden Section" : "Gizli Bölmə", + "Hide" : "Gizlət", + "Hide Partials" : "Parçaları Gizlət", + "Hide when" : "Zamanı Gizlət", + "Honeypot" : "Tələ (Honeypot)", + "Horizontal Rule" : "Üfüqi Xətt", + "Host" : "Host", + "HTML" : "HTML", + "HTML view" : "HTML görünüşü", + "HTTP Status" : "HTTP Statusu", + "I remember my password" : "Şifrəmi xatırlayıram", + "Icon" : "İkon", + "ID" : "ID", + "ID regenerated and Stache cleared" : "ID yenidən yaradıldı və Stache təmizləndi", + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:" : "Əgər \":actionText\" düyməsini tıklamaqda çətinlik çəkirsinizsə, aşağıdakı URL-ni kopyalayıb veb brauzerinizə yapışdırın:", + "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:" : "Əgər \":actionText\" düyməsini tıklamaqda çətinlik çəkirsinizsə, aşağıdakı URL-ni kopyalayıb veb brauzerinizə yapışdırın:", + "Image" : "Şəkil", + "Image Cache" : "Şəkil Keşi", + "Image cache cleared." : "Şəkil keşi təmizləndi.", + "Image Manipulation" : "Şəkil Manipulyasiyası", + "Impersonating" : "Təqlid Etmək", + "Imported from fieldset" : "Sahə dəstindən idxal edildi", + "Included in output" : "Çıxışda daxil edilmiş", + "Indent Size" : "Giriş Ölçüsü", + "Indent Type" : "Giriş Növü", + "Index" : "İndeks", + "Index Template" : "İndeks Şablonu", + "Indian" : "Hind Təqvimi", + "Inline" : "Xətdə", + "Inline Code" : "Xətdə Kod", + "Inline Label" : "Xətdə Etiket", + "Inline Label when True" : "Düzgün olduqda Xətdə Etiket", + "Input Behavior" : "Giriş Davranışı", + "Input Label" : "Giriş Etiketi", + "Input Type" : "Giriş Növü", + "Insert Asset" : "Varlığ Əlavə et", + "Insert Image" : "Şəkil Əlavə et", + "Insert Link" : "Bağlantı Əlavə et", + "Install" : "Quraşdır", + "Installed" : "Quraşdırıldı", + "Instructions" : "Təlimatlar", + "Instructions Position" : "Təlimatların Mövqeyi", + "Intelligently Warm Presets" : "Əvvəlcədən təyinləri zəkalı şəkildə qızdırın", + "Invalid content, :type button/extension is not enabled" : "Yanlış məzmun, :type düyməsi/uzantısı aktiv deyil", + "Invalid content, nodes and marks must have a type" : "Yanlış məzmun, düyünlər və işarələr tipə sahib olmalıdır", + "Invalid credentials." : "Yanlış etimadnamə.", + "Invitation" : "Dəvət", + "Is" : "Dir", + "Isn't" : "Deyil", + "Italic" : "İtalik", + "Japanese" : "Yapon Təqvimi", + "Java" : "Java", + "JavaScript" : "JavaScript", + "JSON" : "JSON", + "JSX" : "JSX", + "KB" : "KB", + "Key" : "Açar", + "Key Mappings" : "Açar Xəritələri", + "Keyboard Shortcuts" : "Klaviatura Qısayolları", + "Keyed" : "Açarla", + "Keys" : "Açarlar", + "Label" : "Etiket", + "Lang" : "Dil", + "Language" : "Dil", + "Laptop" : "Laptop", + "Last Login" : "Son Daxilolma", + "Last Modified" : "Son Dəyişdirilən", + "Last rebuild" : "Son Yenidənqurma", + "Latest Date" : "Ən Son Tarix", + "Layout" : "Dizayn", + "Learn more" : "Əlavə məlumat əldə edin", + "Learn more about :link" : ":link haqqında daha çox öyrənin", + "LESS" : "LESS", + "Less than" : "Kiçikdır", + "Less than or equals" : "Kiçikdır və ya bərabər", + "Licensing" : "Lisenziyalaşdırma", + "Light" : "Aydın", + "Light Mode" : "Aydın Rejim", + "Link" : "Link", + "Link a fieldset" : "Bir sahə dəstini bağlayın", + "Link a single field" : "Tək bir sahəni bağlayın", + "Link Collections" : "Kolleksiyanı Bağlayın", + "Link Existing" : "Mövcud Bağlayın", + "Link Existing Item" : "Mövcud Maddəni Bağlayın", + "Link Fields" : "Sahələri Bağlayın", + "Link Noopener" : "Noopener Bağla", + "Link Noreferrer" : "Noreferrer Bağla", + "Link to Entry" : "Girişə Bağlayın", + "Link to URL" : "URL-ə Bağlayın", + "Linked fieldset" : "Bağlı sahə dəsti", + "Links" : "Linklər", + "List" : "Siyahı", + "Listable" : "Siyahıya Alınabilir", + "Live Preview" : "Canlı Önizləmə", + "Loading" : "Yüklənir", + "Locale" : "Region", + "Localizable" : "Tərcümə Edilə Bilən", + "Localizable field" : "Tərcümə Edilə Bilən Sahə", + "Localizations" : "Tərcümələr", + "Location" : "Məkan", + "Locked" : "Kilidli", + "Log in" : "Daxil olun", + "Log in to continue" : "Davam etmək üçün daxil olun", + "Log in with :provider" : ":provider ilə daxil olun", + "Log in with email" : "E-poçtla daxil olun", + "Log out" : "Çıxış edin", + "Logged in" : "Daxil oldunuz", + "Login successful." : "Daxil olma uğurlu oldu.", + "Main" : "Əsas", + "Manage Licenses" : "Lisenziyaları İdarə Et", + "Manage Preferences" : "Üstünlükləri İdarə Et", + "Manage Sets" : "Dəstləri İdarə Et", + "Map to Blueprint" : "Plan üçün Xəritə", + "Markdown" : "Markdown", + "Markdown Cheatsheet" : "Markdown Kömək Cədvəli", + "Markdown paths" : "Markdown Yolları", + "Markdown theme" : "Markdown Teması", + "Max" : "Maksimum", + "Max Depth" : "Maksimum Dərinlik", + "Max Files" : "Maksimum Fayllar", + "Max Items" : "Maksimum Maddələr", + "Max Rows" : "Maksimum Sətirlər", + "Max Sets" : "Maksimum Dəstlər", + "Maximum items selected:" : "Seçilmiş maksimum maddələr:", + "Maximum Rows" : "Maksimum Sətirlər", + "MB" : "MB", + "Media" : "Media", + "Merge Cells" : "Hüceyrələri Birləşdirin", + "Min" : "Minimum", + "Min Files" : "Minimum Fayllar", + "Min Rows" : "Minimum Sətirlər", + "Minimum Rows" : "Minimum Sətirlər", + "Miscellaneous" : "Müxtəlif", + "Mobile" : "Mobil", + "Modified" : "Dəyişdirilmiş", + "Modified Item" : "Dəyişdirilmiş Maddə", + "Mount" : "Quraşdır", + "Move" : "Hərəkət Et", + "Move Asset|Move :count Assets" : "Varlığı Köçür| :count Varlığı Köçür", + "Move Folder|Move :count Folders" : "Qovluğu Köçür| :count Qovluğu Köçür", + "Moved Item" : "Köçürülmüş Maddə", + "ms" : "ms", + "Multi-Site" : "Çoxsaylı Sayt", + "Multiple" : "Çoxlu", + "My Fieldsets" : "Mənim Sahə Qruplarım", + "My Nav" : "Mənim Naviqasiya", + "My Preferences" : "Mənim Təqdimatlarım", + "Name" : "Ad", + "Nav Item" : "Naviqasiya Maddəsi", + "Navigation" : "Naviqasiya", + "Navigation deleted" : "Naviqasiya Silindi", + "Navigation saved" : "Naviqasiya Saxlanıldı", + "Navigation tree deleted" : "Naviqasiya ağacı silindi", + "Navigation tree saved" : "Naviqasiya ağacı saxlanıldı", + "Never" : "Heç vaxt", + "New Asset" : "Yeni Varlığ", + "New Section" : "Yeni Bölmə", + "New Set" : "Yeni Dəst", + "New Set Group" : "Yeni Dəst Qrupu", + "New Tab" : "Yeni Tab", + "Next" : "Sonrakı", + "Nginx" : "Nginx", + "No" : "Xeyr", + "No addons installed" : "Heç bir əlavələr quraşdırılmayıb", + "No available filters" : "Mövcud süzgəc yoxdur", + "No items with duplicate IDs." : "Təkrarlanan ID-lərlə maddə yoxdur.", + "No license key" : "Lisenziya açarı yoxdur", + "No link data found for" : "Aşağıdakı üçün link məlumatı tapılmadı", + "No options to choose from." : "Seçmək üçün seçim yoxdur.", + "No results" : "Nəticə yoxdur", + "No revisions" : "Reviziya yoxdur", + "No submissions" : "Təqdimatlar yoxdur", + "No templates to choose from." : "Seçmək üçün şablon yoxdur.", + "None" : "Heç biri", + "not" : "deyil", + "Not equals" : "Bərabər deyil", + "Not Featured" : "Özə çıxarılmayıb", + "Not listable" : "Siyahıya alınmaz", + "Notes about this revision" : "Bu reviziyanin haqqında qeydlər", + "Number" : "Rəqəm", + "Numeric" : "Rəqəmsal", + "Objective-C" : "Objective-C", + "OK" : "TAMAM", + "Only the references will be removed. Entries will not be deleted." : "Yalnız referanslar silinəcək. Girişlər silinməyəcək.", + "Open Dropdown" : "Açılan Menyu Aç", + "Open in a new window" : "Yeni pəncərədə aç", + "Open in new window" : "Yeni pəncərədə aç", + "Option" : "Seçim", + "Optional" : "İstəyə bağlı", + "Options" : "Seçimlər", + "or" : "və ya", + "or drag & drop here to replace." : "və ya əvəz etmək üçün bura sürükləyin və buraxın.", + "or drag & drop here." : "və ya bura sürükləyin və buraxın.", + "Orderable" : "Sıralana bilən", + "Ordered List" : "Sıralı Siyahı", + "Ordering" : "Sıralama", + "Origin" : "Mənbə", + "Origin Behavior" : "Mənbə Davranışı", + "Statamic" : "Statamik", + "Statamic Pro is required." : "Statamik Pro tələb olunur.", + "Other" : "Digər", + "Override Alt" : "Altını üstələyin", + "Override For Role" : "Rol üçün üstələyin", + "Override For User" : "İstifadəçi üçün üstələyin", + "Page" : "Səhifə", + "Page Not Found" : "Səhifə Tapılmadı", + "Pages" : "Səhifələr", + "Parent" : "Valideyn", + "Parser" : "Parsers", + "Password" : "Şifrə", + "Password changed" : "Şifrə dəyişdirildi", + "Password Confirmation" : "Şifrə Təsdiqi", + "Password for :username" : ":username üçün şifrə", + "Past Date Behavior" : "Keçmiş Tarix Davranışı", + "Per Page" : "Səhifə başına", + "Per-site" : "Hər sayt üçün", + "Permissions" : "İcazələr", + "Persian" : "Hicri-Şəmsi Təqvimi", + "Phone" : "Telefon", + "PHP" : "PHP", + "PHP Info" : "PHP Məlumatı", + "PHP Version" : "PHP Versiyası", + "Pick Color" : "Rəng Seçin", + "Pin to Favorites" : "Sevimlilərə Sabitleyin", + "Pin to Top Level" : "Yuxarı Səviyyəyə Sabitleyin", + "Pinned Item" : "Sabitlenmiş Maddə", + "Placeholder" : "Nümunə Mətn", + "Pop in" : "Girin", + "Pop out" : "Çıxın", + "Port" : "Port", + "Preferences" : "Təqdimatlar", + "Prefix" : "Ön əlavə", + "Prepend" : "Əvvəl əlavə et", + "Preview" : "Önizləmə", + "Preview Targets" : "Önizləmə Məqsədləri", + "Previous" : "Əvvəlki", + "Price" : "Qiymət", + "Pro" : "Pro", + "PRO" : "PRO", + "Pro Tip" : "Pro İpucu", + "Process Source Images" : "Mənbə Şəkilləri Emal Et", + "Profile" : "Profil", + "Propagate" : "Yayılmaq", + "Protected Page" : "Qorunan Səhifə", + "Publish" : "Yayımla", + "Publish by Default" : "Varsayılan olaraq yayımla", + "Publish Date" : "Yayımlama Tarixi", + "Publish Entry|Publish :count Entries" : "Girişi Yayımla| :count Girişi Yayımla", + "Publish Now" : "İndi Yayımla", + "Published" : "Yayımlandı", + "Push Tags" : "Tagləri Yönləndir", + "Python" : "Python", + "Query Scopes" : "Sorgu Əhatələri", + "Quick Save" : "Tez Yaddaşa Al", + "Radio Options" : "Radio Seçimlər", + "Range" : "Aralıq", + "Read Only" : "Yalnız oxumaq", + "Read the Docs" : "Sənədləri Oxuyun", + "Read the Documentation" : "Sənədləri Oxuyun", + "Reading Time" : "Oxuma Vaxtı", + "Rebuild Search" : "Axtarışı Yenidən Qur", + "Recipient(s)" : "Alıcı(lar)", + "Records" : "Qeydlər", + "Redirect" : "Yönləndir", + "Refresh" : "Təzələmək", + "Regards" : "Hörmətlə", + "Regenerate" : "Yenidən Yarad", + "Regenerate from: :field" : ":field-dən yenidən yaradın", + "Region" : "Region", + "Registration successful." : "Qeydiyyat uğurlu oldu.", + "Relationship" : "İlişki", + "Released on :date" : ":date tarixində buraxıldı", + "Remember me" : "Məni xatırla", + "Remove" : "Sil", + "Remove all empty nodes" : "Bütün boş düyünləri sil", + "Remove Asset" : "Varlığı Sil", + "Remove child page|Remove :count child pages" : "Uşaq səhifəsini sil| :count uşaq səhifəsini sil", + "Remove Empty Nodes" : "Boş Düyünləri Sil", + "Remove empty nodes at the start and end" : "Başlanğıc və sonlarda boş düyünləri sil", + "Remove Filter" : "Süzgəci Sil", + "Remove Formatting" : "Formatı Sil", + "Remove Link" : "Linki Sil", + "Remove Page" : "Səhifəni Sil", + "Remove tag" : "Tagi sil", + "Rename" : "Adını dəyiş", + "Rename Asset|Rename :count Assets" : "Varlığ Adını Dəyiş| :count Varlığ Adını Dəyiş", + "Rename Folder|Rename :count Folders" : "Qovluğu Adını Dəyiş| :count Qovluqların Adını Dəyiş", + "Rename View" : "Görünüşün Adın Dəyiş", + "Renamed Section" : "Adı Dəyişdirilmiş Bölmə", + "Reorder" : "Sıralamağı Yenidən Təyin Et", + "Reorderable" : "Yenidən Sıralana Bilən", + "Replace" : "Əvəz Et", + "Replace Asset" : "Varlığı Əvəz Et", + "Reply To" : "Cavablandır", + "Repository path" : "Anbar yolu", + "Republic of China" : "Çin Respublikas Təqvimi", + "Require Slugs" : "Slug tələb edir", + "Required" : "Tələb olunur", + "Reset" : "Sıfırla", + "Reset Nav Customizations" : "Naviqasiyanın Xüsusiləşdirmələrini Sıfırla", + "Reset Password" : "Şifrəni Sıfırla", + "Responsive" : "Uyğunlaşan", + "Restore" : "Bərpa Et", + "Restore Revision" : "Təkrarlamanı Bərpa Et", + "Restrict" : "Məhdudlaşdır", + "Restrict to Folder" : "Qovluğa Məhdudlaşdır", + "Resume Your Session" : "Sessiyanıza Davam Edin", + "Reupload" : "Yenidən yükləyin", + "Reveal Password" : "Şifrəni Açıqlayın", + "Revision created" : "Reviziya yaradıldı", + "Revision deleted" : "Reviziya silindi", + "Revision History" : "Reviziya Tarixi", + "Revision restored" : "Reviziya bərpa edildi", + "Revision saved" : "Reviziya saxlanıldı", + "Revisions" : "Reviziyalar", + "Role" : "Rol", + "Role created" : "Rol yaradıldı", + "Role deleted" : "Rol silindi", + "Role saved" : "Rol saxlanıldı", + "Role updated" : "Rol yeniləndi", + "Roles" : "Rollar", + "Roles & Groups" : "Rollar və Qruplar", + "Roles & Permissions" : "Rollar və İcazələr", + "Root" : "Kök", + "Route" : "Yol", + "Routing & URLs" : "Yollama və URL-lər", + "Rows" : "Sətirlər", + "Ruby" : "Ruby", + "Rulers" : "Hökmdarlar", + "Rules" : "Qaydalar", + "Run action|Run action on :count items" : "Hərəkət et| :count maddəyə hərəkət et", + "s" : "s", + "Same" : "Bu sahənin dəyəri verilmiş sahənin dəyərinə bərabər olmalıdır", + "Save" : "Saxla", + "Save & Publish" : "Saxla və Nəşr et", + "Save & Unpublish" : "Saxla və Nəşr etmə", + "Save as HTML" : "HTML kimi Saxla", + "Save Changes" : "Dəyişiklikləri Saxla", + "Save Draft" : "Qaralamayi Saxla", + "Save Order" : "Sifarişi Saxla", + "Save to" : "Ayri Saxla", + "Saved" : "Saxlanıldı", + "Saving" : "Saxlanılır", + "Scaffold Collection" : "Koleksiyonu İskele", + "Scaffold Views" : "Görünüşləri İskele", + "Scheduled" : "Cədvəl üzrə", + "SCSS" : "SCSS", + "Search" : "Axtarış", + "Search Index" : "Axtarış İndeksi", + "Search Indexes" : "Axtarış İndeksləri", + "Search Sets" : "Dəstləri Axtar", + "Search..." : "Axtarış...", + "Searchable" : "Axtarılan", + "Searchables" : "Axtarılanlar", + "Searching in:" : "Axtarılır:", + "Select" : "Seç", + "Select Across Sites" : "Saytlar arasında seç", + "Select asset container" : "Varlığ konteynerini seç", + "Select Calendar" : "Təqvim seç", + "Select Collection(s)" : "Koleksiyon(ları) seç", + "Select Dropdown" : "Açılan Menyu", + "Select Group" : "Qrup seç", + "Select Operator" : "Operator seç", + "Select Role" : "Rol seç", + "Select Value" : "Dəyəri seç", + "Selectable Mode" : "Seçilə bilən rejim", + "Selection" : "Seçim", + "Seller" : "Satıcı", + "Send Email Invitation" : "E-poçt dəvəti göndər", + "Send Password Reset" : "Şifrəni sıfırlamaq üçün göndər", + "Send password reset email to this user?|Send password reset email to these :count users?" : "Bu istifadəçiyə şifrə sıfırlama e-poçtu göndərin?|Bu :count istifadəçiyə şifrə sıfırlama e-poçtu göndərin?", + "Send Test Email" : "Test e-poçtu göndər", + "Send|Send to :count users" : "Göndər| :count istifadəçiyə göndər", + "Sender" : "Göndərən", + "Sendmail" : "Sendmail", + "Service Unavailable" : "Xidmət mövcud deyil", + "Session Expired" : "Sessiya bitdi", + "Set Alt" : "Alternativ təyin et", + "Set as start page" : "Baş səhifə kimi təyin et", + "Set Behavior" : "Davranışı təyin et", + "Set Timezone" : "Vaxt zonasını təyin et", + "Set to now" : "İndiki vaxtı təyin et", + "Sets" : "Dəstlər", + "Settings" : "Tənzimləmələr", + "Shell" : "Shell", + "Show" : "Göstər", + "Show Fields" : "Sahələri göstər", + "Show Filename" : "Fayl adını göstər", + "Show HTML Source" : "HTML mənbəyini göstər", + "Show Keyboard Shortcuts" : "Klaviatura qısayollarını göstər", + "Show Line Numbers" : "Sətir nömrələrini göstər", + "Show Markdown Cheatsheet" : "Markdown köməkçi səhifəsini göstər", + "Show Reading Time" : "Oxuma vaxtını göstər", + "Show Regenerate Button" : "Yenidən yaratma düyməsini göstər", + "Show Seconds" : "Saniyələri göstər", + "Show Set Alt" : "Alternativ təyin etmek göstər", + "Show Template" : "Şablonu göstər", + "Show when" : "Göstərildiyi zaman", + "Show Word Count" : "Söz sayını göstər", + "Shown by default" : "Varsayılan olaraq göstərilir", + "Sidebar" : "Yan panel", + "Single" : "Tək", + "Site" : "Sayt", + "Site deleted" : "Sayt silindi", + "Site saved" : "Sayt saxlanıldı", + "Site selected." : "Sayt seçildi.", + "Sites" : "Saytlar", + "Size" : "Ölçü", + "Slug" : "Slug", + "Slugs" : "Sluglar", + "Small" : "Kiçik", + "Smart Typography" : "Zəkalı tipografiya", + "Smartypants" : "Smartypants", + "Something went wrong" : "Nəsə xəta baş verdi", + "Sometimes" : "Bəzən", + "Sort Direction" : "Sıralama Səmti", + "Sortable" : "Sıralanabilir", + "Spaces" : "Boşluqlar", + "Special" : "Məxsus", + "SQL" : "SQL", + "Stache cleared." : "Stache təmizləndi.", + "Stache warmed." : "Stache isidildi.", + "Stack Selector" : "Yığın Seçici", + "Stacked" : "Yığılan", + "Start Impersonating" : "Təqlid Etməki Başlayın", + "Start Page" : "Baş Səhifə", + "Static Page Cache" : "Statik səhifə keşi", + "Static page cache cleared." : "Statik səhifə keşi təmizləndi.", + "Status" : "Vəziyyət", + "Step" : "Addım", + "Stop impersonating" : "Təqlid etməki dayandır", + "Stop Impersonating" : "Təqlid Etməki dayandır", + "Store Submissions" : "Təqdimatları saxla", + "Strategy" : "Strategiya", + "Strikethrough" : "Üstündən xətt", + "Structured" : "Strukturlaşdırılmış", + "Subject" : "Mövzu", + "Sublime" : "Sublime", + "Submission deleted" : "Təqdimat silindi", + "Submission saved" : "Təqdimat saxlanıldı", + "Submission successful." : "Təqdimat uğurlu.", + "Submissions" : "Təqdimatlar", + "Submit" : "Təqdim et", + "Subscript" : "Alt yazı", + "Super Admin" : "Super Admin", + "Super User" : "Super İstifadəçi", + "Superscript" : "Yuxarı yazı", + "Support" : "Dəstək", + "Swatches" : "Nümunələr", + "Sync" : "Sinxronizasiya", + "System" : "Sistem", + "System default" : "Sistem varsayılanı", + "Table" : "Cədvəl", + "Table of Contents" : "Məzmun cədvəli", + "Tablet" : "Planşet", + "Tabs" : "Tablar", + "Tabular Islamic" : "Cədvəlli Hicri Təqvimi", + "Target Blank" : "Boş hədəf", + "Taxonomies" : "Taksonomiyalar", + "Taxonomy" : "Taksonomiya", + "Taxonomy created" : "Taksonomiya yaradıldı", + "Taxonomy deleted" : "Taksonomiya silindi", + "Taxonomy saved" : "Taksonomiya saxlanıldı", + "Template" : "Şablon", + "Templates" : "Şablonlar", + "Term created" : "Termin yaradıldı", + "Term deleted" : "Termin silindi", + "Term references updated" : "Termin istinadları yeniləndi", + "Term saved" : "Termin saxlanıldı", + "Term Template" : "Termin Şablonu", + "Terms" : "Terminlər", + "Test email sent." : "Test e-poçtu göndərildi.", + "Text" : "Mətn", + "Text & Rich Content" : "Mətn və Zəngin Məzmun", + "Text item" : "Mətn elementi", + "Text view" : "Mətn görünüşü", + "The given data was invalid." : "Verilmiş məlumat etibarsızdır.", + "The Statamic Playground" : "Statamik Oyun Sahəsi", + "Theme" : "Tema", + "There are no entries in this collection" : "Bu kolleksiyada heç bir giriş yoxdur", + "These are now your default columns." : "Bunlar indi sizin varsayılan sütunlarınızdır.", + "This action is unauthorized." : "Bu hərəkət səlahiyyətli deyil.", + "This container is empty" : "Bu konteyner boştur", + "This form is awaiting responses" : "Bu forma cavabları gözləyir", + "This Global Set has no fields." : "Bu Qlobal Dəstdə heç bir sahə yoxdur.", + "This is now your start page." : "Bu indi sizin başlanğıc səhifənizdir.", + "This is the published version" : "Bu nəşr olunan versiyadır", + "This is the root page" : "Bu kök səhifədir", + "Time Enabled" : "Vaxt Aktivdir", + "Timepicker" : "Vaxt seçici", + "Title" : "Başlıq", + "Title Format" : "Başlıq Formatı", + "Today" : "Bu gün", + "Toggle" : "Geçiş", + "Toggle Button" : "Geçiş düyməsi", + "Toggle Dark Mode" : "Qaranlıq rejimi keçid", + "Toggle Fullscreen" : "Tam ekran rejimini keçid", + "Toggle Fullscreen Mode" : "Tam ekran rejimini keçid", + "Toggle Header Cell" : "Başlıq hüceyrəsini keçid", + "Toggle Mobile Nav" : "Mobil menyunu keçid", + "Toggle Nav" : "Menyunu keçid", + "Toggle Sidebar" : "Yan paneli keçid", + "Toolbar Mode" : "Alət çubuğu rejimi", + "Tools" : "Alətlər", + "Tree" : "Ağac", + "Trial Mode" : "Sınaq rejimi", + "True" : "Doğru", + "Try again" : "Təkrar cəhd et", + "Twig" : "Twig", + "Typeahead Field" : "Typeahead Sahəsi", + "UI Mode" : "UI Rejimi", + "Umm al-Qura" : "Umm al-Qura Təqvimi", + "Unable to change password" : "Şifrəni dəyişdirmək mümkün deyil", + "Unable to delete filter preset" : "Süzgəc ön ayarını silmək mümkün deyil", + "Unable to delete view" : "Görünüşü silmək mümkün deyil", + "Unable to rename view" : "Görünüşü yenidən adlandırmaq mümkün deyil", + "Unable to save changes" : "Dəyişiklikləri saxlamaq mümkün deyil", + "Unable to save column preferences." : "Sütun tənzimləmələrini saxlamaq mümkün deyil.", + "Unable to save favorite" : "Seçimləri saxlamaq mümkün deyil", + "Unable to save filter preset" : "Süzgəc ön ayarını saxlamaq mümkün deyil", + "Unable to save role" : "Rolü saxlamaq mümkün deyil", + "Unable to save view" : "Görünüşü saxlamaq mümkün deyil", + "Unable to update filter preset" : "Süzgəc ön ayarını yeniləmək mümkün deyil", + "Unauthorized" : "Səlahiyyətsiz", + "Uncheck All" : "Hamısını seçmə", + "Underline" : "Altından xətt", + "Uninstall" : "Qaldır", + "Unlink" : "Bağlantını kəs", + "Unlisted Addons" : "Qeydə alınmamış əlavələr", + "Unordered List" : "Sıralanmamış siyahı", + "Unpin from Favorites" : "Seçilənlərdən çıxar", + "Unpublish" : "Nəşr etmə", + "Unpublish Entry|Unpublish :count Entries" : "Girişi nəşr etmə| :count girişi nəşr etmə", + "Unpublished" : "Nəşr olunmamış", + "Unsaved changes" : "Saxlanılmamış dəyişikliklər", + "Up to date" : "Ən son versiya", + "Update" : "Yenilə", + "Update All" : "Hamısını Yenilə", + "Update successful." : "Yeniləmə uğurlu.", + "Update to :version" : ":version versiyasına yenilə", + "Update to Latest" : "Ən son versiyaya yenilə", + "Updater" : "Yeniləyici", + "Updates" : "Yeniləmələr", + "Upload" : "Yüklə", + "Upload failed. The file is larger than is allowed by your server." : "Yükləmə uğursuz oldu. Fayl serveriniz tərəfindən icazə verilən ölçüdən böyükdür.", + "Upload failed. The file might be larger than is allowed by your server." : "Yükləmə uğursuz oldu. Fayl serveriniz tərəfindən icazə verilən ölçüdən böyük ola bilər.", + "Upload file" : "Faylı yüklə", + "Url" : "Url", + "URL" : "URL", + "Useful Links" : "Faydalı bağlantılar", + "User" : "İstifadəçi", + "User created" : "İstifadəçi yaradıldı", + "User deleted" : "İstifadəçi silindi", + "User Group" : "İstifadəçi Qrupu", + "User group deleted" : "İstifadəçi qrupu silindi", + "User group saved" : "İstifadəçi qrupu saxlanıldı", + "User Groups" : "İstifadəçi Qrupları", + "User Information" : "İstifadəçi Məlumatı", + "User saved" : "İstifadəçi saxlanıldı", + "Username" : "İstifadəçi adı", + "Users" : "İstifadəçilər", + "Utilities" : "Köməkçi proqramlar", + "Validation" : "Doğrulama", + "Validation Rules" : "Doğrulama Qaydaları", + "Value" : "Dəyər", + "View" : "Görünüş", + "View additional releases" : "Əlavə buraxılışlara bax", + "View All" : "Hamısını Gör", + "View deleted" : "Görünüş silindi", + "View History" : "Tarixi Gör", + "View on Marketplace" : "Bazar yerində bax", + "View renamed" : "Görünüş yenidən adlandırıldı", + "View saved" : "Görünüş saxlanıldı", + "View Site" : "Saytı Gör", + "View Useful Links" : "Faydalı bağlantılara bax", + "Views created successfully" : "Görünüşlər uğurla yaradıldı", + "Vim" : "Vim", + "Visibility" : "Görünürlük", + "Visible" : "Görünür", + "Visit URL" : "URL-ə bax", + "Vue" : "Vue", + "Warm" : "İsindirin", + "Warm Specific Presets" : "Xüsusi ön ayarları isindirin", + "Warning! Changing a site handle may break existing site content!" : "Xəbərdarlıq! Saytın başlığını dəyişmək mövcud sayt məzmununu pozabilir!", + "Whoops!" : "Ops!", + "Widgets" : "Vidgetlər", + "Words" : "Sözlər", + "Working Copy" : "İşləyən Nüsxə", + "Working copy has unsaved changes" : "İşləyən nüsxədə saxlanılmamış dəyişikliklər var", + "Write" : "Yaz", + "x" : "x", + "XML" : "XML", + "YAML" : "YAML", + "You are not authorized to configure navs." : "Menyuları konfiqurasiya etmək səlahiyyətiniz yoxdur.", + "You are not authorized to create collections." : "Kolleksiyalar yaratmaq səlahiyyətiniz yoxdur.", + "You are not authorized to create forms." : "Formalar yaratmaq səlahiyyətiniz yoxdur.", + "You are not authorized to create navs." : "Menyular yaratmaq səlahiyyətiniz yoxdur.", + "You are not authorized to create taxonomies." : "Taksonomiyalar yaratmaq səlahiyyətiniz yoxdur.", + "You are not authorized to delete navs." : "Menyuları silmək səlahiyyətiniz yoxdur.", + "You are not authorized to delete this collection." : "Bu kolleksiyanı silmək səlahiyyətiniz yoxdur.", + "You are not authorized to delete this taxonomy." : "Bu taksonomiyanı silmək səlahiyyətiniz yoxdur.", + "You are not authorized to edit this collection." : "Bu kolleksiyanı redaktə etmək səlahiyyətiniz yoxdur.", + "You are not authorized to edit this taxonomy." : "Bu taksonomiyanı redaktə etmək səlahiyyətiniz yoxdur.", + "You are not authorized to run this action." : "Bu hərəkəti həyata keçirmək səlahiyyətiniz yoxdur.", + "You are not authorized to scaffold resources." : "Resursları iskelesine səlahiyyətiniz yoxdur.", + "You are not authorized to view collections." : "Kolleksiyaları görmək səlahiyyətiniz yoxdur.", + "You are not authorized to view navs." : "Menyuları görmək səlahiyyətiniz yoxdur.", + "You are not authorized to view this collection." : "Bu kolleksiyanı görmək səlahiyyətiniz yoxdur.", + "You are now impersonating" : "İndi təqlid edirsiniz", + "You can't do this while logged in" : "Giriş etdikdən sonra bunu edə bilməzsiniz", + "You're already editing this item." : "Bu elementi artıq redaktə edirsiniz.", + "Your Favorites" : "Seçilənləriniz", + "Your working copy will be replaced by the contents of this revision." : "İşləyən nüsxəniz bu reviziya məzmunu ilə əvəz ediləcək." +} diff --git a/resources/lang/az/fieldtypes.php b/resources/lang/az/fieldtypes.php new file mode 100644 index 0000000000..3df182f423 --- /dev/null +++ b/resources/lang/az/fieldtypes.php @@ -0,0 +1,205 @@ + 'Bu sahənin məzmununda Antlers ayrıştırmasını aktiv edin.', + 'any.config.cast_booleans' => 'Doğru və yanlış dəyərləri olan seçimlər boolean olaraq saxlanacaq.', + 'any.config.mode' => 'Özünüzə uyğun UI stilini seçin.', + 'array.config.keys' => 'Massiv açarlarını (dəyişənləri) və isteğe bağlı etiketləri təyin edin.', + 'array.config.mode' => '**dinamik** mod istifadəçiyə məlumatlar üzərində sərbəst nəzarət verir; **açarla** və **tək** modlar isə sərt açar qaydalarını tətbiq edir.', + 'array.title' => 'Massiv', + 'assets.config.allow_uploads' => 'Yeni fayl yükləmələrinə icazə ver.', + 'assets.config.container' => 'Bu sahə üçün hansı varlıq konteynerinin istifadə olunacağını seçin.', + 'assets.config.folder' => 'Göz atmağa başlayacağınız qovluq.', + 'assets.config.max_files' => 'Seçilə biləcək maksimum fayl sayını təyin edin.', + 'assets.config.min_files' => 'Seçilə biləcək minimum fayl sayı.', + 'assets.config.mode' => 'Özünüzə uyğun dizayn stilini seçin.', + 'assets.config.query_scopes' => 'Seçilə bilən varlıqları əldə edərkən tətbiq olunacaq sorgu əhatələrini seçin.', + 'assets.config.restrict' => 'İstifadəçilərin digər qovluqlara keçməsini əngəlləyin.', + 'assets.config.show_filename' => 'Önizləmə şəkilinin yanında fayl adını göstərin.', + 'assets.config.show_set_alt' => 'Şəkillərin Alt Mətni təyin etmək üçün bir bağlantı göstərin.', + 'assets.title' => 'Varlıqlar', + 'bard.config.allow_source' => 'Yazarkən HTML mənbə kodunu görməyə imkan ver.', + 'bard.config.always_show_set_button' => '“Set Ekle” düyməsini həmişə göstərmək üçün aktivləşdirin.', + 'bard.config.buttons' => 'Alət çubuğunda hansı düymələrin göstəriləcəyini seçin.', + 'bard.config.container' => 'Bu sahə üçün hansı varlıq konteynerinin istifadə olunacağını seçin.', + 'bard.config.enable_input_rules' => 'Məzmun yazarkən Markdown tərzi qısayollarını aktivləşdir.', + 'bard.config.enable_paste_rules' => 'Məzmun yapışdırarkən Markdown tərzi qısayollarını aktivləşdir.', + 'bard.config.fullscreen' => 'Tam ekran rejimi üçün keçidi aktiv edin', + 'bard.config.inline' => 'Başlıqlar, şəkillər və setlər kimi blok elementlərini deaktiv et.', + 'bard.config.inline.break' => 'Sətir qırılması ilə aktiv', + 'bard.config.inline.disabled' => 'Deaktiv', + 'bard.config.inline.enabled' => 'Sətir qırılması olmadan aktiv', + 'bard.config.link_collections' => 'Bu kolleksiyalardan olan girişlər bağlantı seçicisində mövcud olacaq. Bunu boş qoysanız, bütün girişlər mövcud olacaq.', + 'bard.config.link_noopener' => 'Bütün bağlantılarda `rel="noopener"` təyin et.', + 'bard.config.link_noreferrer' => 'Bütün bağlantılarda `rel="noreferrer"` təyin et.', + 'bard.config.previews' => 'Setlər yığılmış vəziyyətdə göstərilir.', + 'bard.config.reading_time' => 'Sahənin altına təxmini oxuma müddətini göstər.', + 'bard.config.remove_empty_nodes' => 'Boş düyünlərlə necə davranacağınızı seçin.', + 'bard.config.save_html' => 'HTML olaraq saxla, strukturlaşdırılmış məlumat yerinə. Bu, şablon işarələməsini asanlaşdırır, amma nəzarəti məhdudlaşdırır.', + 'bard.config.section.editor.instructions' => 'Redaktorun görünüşünü və ümumi davranışını tənzimləyin.', + 'bard.config.section.links.instructions' => 'Bu Bard nümunəsində bağlantıların necə idarə olunacağını tənzimləyin.', + 'bard.config.section.sets.instructions' => 'Bard məzmununuza istənilən yerə daxil edilə bilən sahə bloklarını tənzimləyin.', + 'bard.config.smart_typography' => 'Yaygın mətn naxışlarını doğru tipoqrafik simvollarla çevir.', + 'bard.config.target_blank' => 'Bütün bağlantılarda `target="_blank"` təyin et.', + 'bard.config.toolbar_mode' => '**Sabit** mod alət çubuğunu hər zaman görünür saxlayır, **üzən** isə yalnız mətn seçərkən görünür.', + 'bard.config.word_count' => 'Sahənin altına söz sayını göstər.', + 'bard.title' => 'Bard', + 'button_group.title' => 'Düymə Qrupu', + 'checkboxes.config.inline' => 'Yoxlama qutularını bir sətirdə göstər.', + 'checkboxes.config.options' => 'Dizi açarlarını və isteğe bağlı etiketlərini təyin edin.', + 'checkboxes.title' => 'Yoxlama Qutuları', + 'code.config.indent_size' => 'Tercih etdiyiniz girinti ölçüsünü (boşluq olaraq) təyin edin.', + 'code.config.indent_type' => 'Tercih etdiyiniz girinti növünü təyin edin.', + 'code.config.key_map' => 'Tercih etdiyiniz klaviatura qısayolları dəstini seçin.', + 'code.config.mode' => 'Sintaks vurğulama üçün dili seçin.', + 'code.config.mode_selectable' => 'Modun istifadəçi tərəfindən dəyişdirilib-dəyişdirilə bilməyəcəyini göstərin.', + 'code.config.rulers' => 'Girinti köməkliyi üçün şaquli cetvelləri tənzimləyin.', + 'code.config.theme' => 'Tercih etdiyiniz temanı seçin.', + 'code.title' => 'Kod', + 'collections.title' => 'Kolleksiyalar', + 'color.config.allow_any' => 'Rəng seçici və ya hex kodu vasitəsilə istənilən rəng dəyərinin daxil edilməsinə icazə ver.', + 'color.config.default' => 'Bir varsayılan rəng seçin.', + 'color.config.swatches' => 'Listədən seçilə bilən əvvəlcədən təyin edilmiş rənglər.', + 'color.title' => 'Rəng', + 'date.config.calendar' => 'Listədən hər hansı bir təqvimi seçin və ya heç birini seçməyin.', + 'date.config.columns' => 'Bir anda bir neçə ayı satırlar və sütunlar şəklində göstərin.', + 'date.config.earliest_date' => 'Seçilə biləcək ən erkən tarixi təyin edin.', + 'date.config.format' => 'Tarixin necə saxlanmalı olduğunu [PHP tarix formatı](https://www.php.net/manual/en/datetime.format.php) istifadə edərək göstərin.', + 'date.config.full_width' => 'Təqvimi tam genişlikdə uzat.', + 'date.config.inline' => 'Açılır menyu giriş sahəsini atlaya və təqvimi birbaşa göstərə bilərsiniz.', + 'date.config.latest_date' => 'Seçilə biləcək ən gec tarixi təyin edin.', + 'date.config.locale' => 'Təqvimin hansı lokal dildə göstərilməsini istədiyinizi göstərin. Burada və ya saytın ayarlarında xüsusi bir təqvim seçmədiyiniz halda, təqvim lokal standart təqvimə qayıda bilər.', + 'date.config.mode' => 'Birlikdə və ya aralıq mod arasında seçim edin (aralıq zaman seçicini deaktiv edir).', + 'date.config.rows' => 'Bir anda bir neçə ayı satırlar və sütunlar şəklində göstərin.', + 'date.config.time_enabled' => 'Zaman seçicini aktivləşdir.', + 'date.config.time_seconds_enabled' => 'Zaman seçicidə saniyələri göstərin.', + 'date.config.timezone' => 'İstifadəçinin varsayılanından fərqli bir saat qurşağınız varsa, bunu burada göstərin.', + 'date.title' => 'Tarix', + 'dictionary.config.dictionary' => 'Seçimləri almaq istədiyiniz lüğət.', + 'dictionary.file.config.filename' => 'Seçimlərinizi ehtiva edən fayl adı, `resources/dictionaries` qovluğuna nisbətən.', + 'dictionary.file.config.label' => 'Seçimlərin etiketlərini ehtiva edən açar. Varsayılan olaraq `label`\'dir. Alternativ olaraq, Antlers istifadə edə bilərsiniz.', + 'dictionary.file.config.value' => 'Seçimlərin dəyərlərini ehtiva edən açar. Varsayılan olaraq `value`\'dir.', + 'entries.config.collections' => 'İstifadəçinin seçə biləcəyi kolleksiyaları seçin.', + 'entries.config.create' => 'Yeni girişlərin yaradılmasına icazə ver.', + 'entries.config.query_scopes' => 'Seçilə bilən girişləri alarkən tətbiq olunacaq sorgu əhatələrini seçin.', + 'entries.config.search_index' => 'Mümkün olduğu halda uyğun bir axtarış indeksindən istifadə olunacaq, amma açıq şəkildə bir indeks müəyyən edə bilərsiniz.', + 'entries.config.select_across_sites' => 'Digər saytlardan girişləri seçməyə icazə ver. Bu, ön yüzdə lokalizasiya seçimlərini də deaktiv edir. Daha çox məlumat üçün [sənədi](https://statamic.dev/fieldtypes/entries#select-across-sites) oxuyun.', + 'entries.title' => 'Girişlər', + 'float.title' => 'Ondalık ədəd', + 'form.config.max_items' => 'Seçilə biləcək formaların maksimum sayını təyin edin.', + 'form.config.query_scopes' => 'Seçilə bilən formaları əldə edərkən tətbiq olunacaq sorgu əhatələrini seçin.', + 'form.title' => 'Forma', + 'grid.config.add_row' => '"Sətir əlavə et" düyməsinin etiketini fərdiləşdirin.', + 'grid.config.fields' => 'Hər bir sahə grid cədvəlində bir sütun olur.', + 'grid.config.fullscreen' => 'Tam ekran rejimi üçün keçidi aktiv edin.', + 'grid.config.max_rows' => 'Yaradıla biləcək maksimum sətir sayını təyin edin.', + 'grid.config.min_rows' => 'Yaradıla biləcək minimum sətir sayını təyin edin.', + 'grid.config.mode' => 'Özünüzə uyğun dizayn stilini seçin.', + 'grid.config.reorderable' => 'Sətirlərin sıralanmasını aktivləşdir.', + 'grid.title' => 'Grid', + 'group.config.fields' => 'Bu qrup daxilində yerləşəcək sahələri tənzimləyin.', + 'group.title' => 'Qrup', + 'hidden.title' => 'Gizli', + 'html.config.html_instruct' => 'Yayımlama formasında göstəriləcək HTML-i idarə edin.', + 'html.title' => 'HTML', + 'icon.config.directory' => 'İkonların olduğu qovluğun yolu.', + 'icon.config.folder' => 'Xüsusi bir ikon setini ehtiva edən alt qovluq.', + 'icon.title' => 'İkon', + 'integer.title' => 'Tam ədəd', + 'link.config.collections' => 'Bu kolleksiyalardan olan girişlər mövcud olacaq. Bunu boş qoysanız, yönləndirilə bilən kolleksiyalardan olan girişlər mövcud olacaq.', + 'link.config.container' => 'Bu sahə üçün hansı varlıq konteynerinin istifadə olunacağını seçin.', + 'link.title' => 'Bağlantı', + 'list.title' => 'Siyahı', + 'markdown.config.automatic_line_breaks' => 'Avtomatik sətir qırılmalarını aktivləşdirir.', + 'markdown.config.automatic_links' => 'Hər hansı URL-ləri avtomatik bağlayır.', + 'markdown.config.container' => 'Bu sahə üçün hansı varlıq konteynerinin istifadə olunacağını seçin.', + 'markdown.config.escape_markup' => 'İnline HTML işarələmələrini qaçırır (məsələn, `
`\'i `<div>`-ə çevirir).', + 'markdown.config.folder' => 'Göz atmağa başlayacağınız qovluq.', + 'markdown.config.heading_anchors' => 'Başlıq elementlərinizə (`

`, `

`, və s.) anker bağlantıları əlavə edin.', + 'markdown.config.parser' => 'Xüsusi bir Markdown parser-in adı. Varsayılan üçün boş saxlayın.', + 'markdown.config.restrict' => 'İstifadəçilərin digər qovluqlara keçməsini əngəlləyin.', + 'markdown.config.smartypants' => 'Düz sitatları qıvrılmış sitatlara, tireləri en/em-tirlərə və digər oxşar mətn transformasiyalarına avtomatik çevirir.', + 'markdown.config.table_of_contents' => 'Məzmununuzun başlıqlarına bağlantılarla bir məzmun cədvəlini avtomatik olaraq əlavə edin.', + 'markdown.title' => 'Markdown', + 'nav.title' => 'Naviqasiya', + 'picker.category.controls.description' => 'Məntiqi idarə edə bilən seçilə bilən seçimlər və ya düymələr təqdim edən sahələr.', + 'picker.category.media.description' => 'Şəkilləri, videoları və ya digər media fayllarını saxlayan sahələr.', + 'picker.category.number.description' => 'Rəqəmləri saxlayan sahələr.', + 'picker.category.relationship.description' => 'Digər resurslarla aidiyyətləri saxlayan sahələr.', + 'picker.category.structured.description' => 'Strukturlaşdırılmış məlumatları saxlayan sahələr. Bəziləri hətta digər sahələri içərilərində qura bilər.', + 'picker.category.special.description' => 'Bu sahələr xüsusi olub, hər biri özünəməxsusdur.', + 'picker.category.text.description' => 'Mətn sətirlərini, zəngin məzmunu və ya hər ikisini saxlayan sahələr.', + 'radio.config.inline' => 'Radioları bir sətirdə göstərin.', + 'radio.config.options' => 'Dizi açarlarını və isteğe bağlı etiketlərini təyin edin.', + 'radio.title' => 'Radio', + 'range.config.append' => 'Sürgü mətninin sonuna (sağ tərəfə) mətn əlavə edin.', + 'range.config.max' => 'Maksimum, sağdakı dəyər.', + 'range.config.min' => 'Minimum, soldakı dəyər.', + 'range.config.prepend' => 'Sürgü mətninin əvvəlinə (sol tərəfə) mətn əlavə edin.', + 'range.config.step' => 'Dəyərlər arasındakı minimum ölçü.', + 'range.title' => 'Aralıq', + 'relationship.config.mode' => 'Özünüzə uyğun UI stilini seçin.', + 'replicator.config.button_label' => 'Əlavə et düyməsinə etiket əlavə edin.', + 'replicator.config.collapse' => 'Setlərin çökmə davranışı.', + 'replicator.config.collapse.accordion' => 'Bir anda yalnız bir setin açılmasına icazə verin.', + 'replicator.config.collapse.disabled' => 'Bütün setlər varsayılan olaraq açıqdır.', + 'replicator.config.collapse.enabled' => 'Bütün setlər varsayılan olaraq yığılmışdır.', + 'replicator.config.fullscreen' => 'Tam ekran rejimi üçün keçidi aktiv edin.', + 'replicator.config.max_sets' => 'Maksimum set sayını təyin edin.', + 'replicator.config.previews' => 'Yığılmış vəziyyətdə bir setin içindəki məzmunun önizləməsini göstərin.', + 'replicator.config.sets' => 'Setlər, yaradılabilən və istədiyiniz kimi sıralanabilən konfiqurasiya edilə bilən sahə bloklarıdır.', + 'revealer.title' => 'Açıcı', + 'replicator.title' => 'Replikator', + 'revealer.config.input_label' => 'Düymədə və ya keçid yanında göstəriləcək bir etiket təyin edin.', + 'revealer.config.mode' => 'Özünüzə uyğun UI stilini seçin.', + 'section.title' => 'Bölmə', + 'select.config.clearable' => 'Seçiminizi ləğv etməyə icazə vermək üçün aktivləşdirin.', + 'select.config.multiple' => 'Birdən çox seçim etməyə icazə ver.', + 'select.config.options' => 'Açarları və isteğe bağlı etiketlərini təyin edin.', + 'select.config.placeholder' => 'Yer tutucu mətnini təyin edin.', + 'select.config.push_tags' => 'Yeni yaradılmış etiketləri seçimlər siyahısına əlavə edin.', + 'select.config.searchable' => 'Mümkün seçimlər arasında axtarış etməyə icazə ver.', + 'select.config.taggable' => 'Öncədən təyin edilmiş seçimlərə əlavə olaraq yeni seçimlər əlavə etməyə icazə ver.', + 'select.title' => 'Seç', + 'sites.title' => 'Saytlar', + 'slug.config.from' => 'Slug yaratmaq üçün hədəf sahə.', + 'slug.config.generate' => 'Hədəf `from` sahəsindən avtomatik slug yaradın.', + 'slug.config.show_regenerate' => 'Hədəf sahədən slug-ı yenidən yaratmaq üçün düyməni göstərin.', + 'slug.title' => 'Slug', + 'spacer.title' => 'Boşluq', + 'structures.title' => 'Strukturlar', + 'table.title' => 'Cədvəl', + 'taggable.config.options' => 'Seçilə bilən əvvəlcədən təyin edilmiş etiketləri təqdim edin.', + 'taggable.config.placeholder' => 'Yazın və ↩ Enter düyməsini basın.', + 'taggable.title' => 'Etiketlənə bilən', + 'taxonomies.title' => 'Taksonomiyalar', + 'template.config.blueprint' => '"Plan-a xəritə əlavə et" seçimini əlavə edir. Daha çox məlumat üçün [sənədi](https://statamic.dev/views#inferring-templates-from-entry-blueprints) oxuyun.', + 'template.config.folder' => 'Yalnız bu qovluqdakı şablonları göstərin.', + 'template.config.hide_partials' => 'Parçalar nadir hallarda şablon kimi istifadə olunmaq üçün nəzərdə tutulur.', + 'template.title' => 'Şablon', + 'terms.config.create' => 'Yeni terimlərin yaradılmasına icazə ver.', + 'terms.config.query_scopes' => 'Seçilə bilən terimləri əldə edərkən tətbiq olunacaq sorgu əhatələrini seçin.', + 'terms.config.taxonomies' => 'Terimləri göstərmək üçün hansı taksonomiyaları seçin.', + 'terms.title' => 'Taksonomi Terimləri', + 'text.config.append' => 'Girişdən sonra (sağ tərəfdə) mətn əlavə edin.', + 'text.config.autocomplete' => 'Avtomatik tamamlanma atributunu təyin edin.', + 'text.config.character_limit' => 'Giriş üçün maksimum simvol sayını təyin edin.', + 'text.config.input_type' => 'HTML5 giriş növünü təyin edin.', + 'text.config.placeholder' => 'Yer tutucu mətnini təyin edin.', + 'text.config.prepend' => 'Girişdən əvvəl (sol tərəfdə) mətn əlavə edin.', + 'text.title' => 'Mətn', + 'textarea.title' => 'Mətn sahəsi', + 'time.config.seconds_enabled' => 'Vaxt seçicidə saniyələri göstərin.', + 'time.title' => 'Vaxt', + 'toggle.config.inline_label' => 'Keçid girişinin yanında göstəriləcək bir xətdə etiket təyin edin.', + 'toggle.config.inline_label_when_true' => 'Keçidin dəyəri doğru olduğunda göstəriləcək bir xətdə etiket təyin edin.', + 'toggle.title' => 'Keçid', + 'user_groups.title' => 'İstifadəçi Qrupları', + 'user_roles.title' => 'İstifadəçi Rolları', + 'users.config.query_scopes' => 'Seçilə bilən istifadəçiləri əldə edərkən tətbiq olunacaq sorgu əhatələrini seçin.', + 'users.title' => 'İstifadəçilər', + 'video.title' => 'Video', + 'width.config.options' => 'Mövcud genişlik seçimlərini təyin edin.', + 'width.title' => 'Genişlik', + 'yaml.title' => 'YAML', +]; diff --git a/resources/lang/az/markdown.php b/resources/lang/az/markdown.php new file mode 100644 index 0000000000..d6c2334a30 --- /dev/null +++ b/resources/lang/az/markdown.php @@ -0,0 +1,58 @@ + ' +

Markdown veb yazarları üçün mətn-dən-HTML-ə işarə sintaksisidir. Markdown sizə oxumaq və yazmaq asan olan sadə mətn formatından istifadə etməyə imkan verir və bu mətn struktur baxımından düzgün HTML-ə çevrilir.

+ +

Başlıqlar

+
# Bu h1 başlıqdır
+## Bu h2 başlıqdır
+### Bu h3 başlıqdır, və s.
+
+ +

Qalın və İtalik

+
İfadələri *vurğulamaq*, **qalın** etmək, və ya _**hər ikisini**_ etmək olar.
+ +

Keçidlər

+
Bu bir [nümunə keçiddir](http://example.com).
+ +

Kod

+

+Wrap your code with 3 backticks (```) on the line before and after. +Kodunuzu üç arxa tikə (backtick) (`````) işarəsi ilə yazın, həm başlanğıcda, həm də sonda. +

+ +
```
+this: is some yaml
+```
+ +

Kodu daxili olaraq da əlavə edə bilərsiniz, məzmunu tək arxa tikə (backtick) (``) işarələri ilə əhatə edin. + +

Sitat

+ +

Sitat yaratmaq üçün mətninizin əvvəlində > işarəsini qoyun.

+ +
> Bu bir sitat olacaq.
+ +

Şəkillər

+
![alt mətni](http://example.com/image.jpg)
+ +

Qeyri-sıralı siyahı

+
- Bekon
+- Biftek
+- Pivə<
+ +

Sıralı siyahı

+
1. Ye
+2. İç
+3. Şən ol
+ +

Cədvəllər

+ +
Birinci Başlıq  | İkinci Başlıq
+------------- | -------------
+Məzmun Hüceyrəsi  | Məzmun Hüceyrəsi
+Məzmun Hüceyrəsi  | Məzmun Hüceyrəsi
', + +]; diff --git a/resources/lang/az/messages.php b/resources/lang/az/messages.php new file mode 100644 index 0000000000..0bba9330fe --- /dev/null +++ b/resources/lang/az/messages.php @@ -0,0 +1,258 @@ + 'Bu emaili alırsınız, çünki hesabınız üçün parol sıfırlama tələbi almışıq.', + 'activate_account_notification_subject' => 'Hesabınızı Aktivləşdirin', + 'addon_has_more_releases_beyond_license_body' => 'Yeniləmə edə bilərsiniz, lakin yeniləmək və ya yeni lisenziya almaq lazım olacaq.', + 'addon_has_more_releases_beyond_license_heading' => 'Bu əlavənin lisenziyalı limitinizdən artıq buraxılışları var.', + 'addon_install_command' => 'Bu əlavəni quraşdırmaq üçün aşağıdakı əmri yerinə yetirin', + 'addon_list_loading_error' => 'Əlavələri yükləyərkən bir şey səhv getdi. Zəhmət olmasa, bir az sonra yenidən cəhd edin.', + 'addon_uninstall_command' => 'Bu əlavəni silmək üçün aşağıdakı əmri yerinə yetirin', + 'asset_container_allow_uploads_instructions' => 'Aktiv edildikdə, istifadəçilərə bu konteynerə fayllar yükləmək imkanı verəcək.', + 'asset_container_blueprint_instructions' => 'Planlar varlığlari redaktə edərkən mövcud olan əlavə xüsusi sahələri müəyyən edir.', + 'asset_container_create_folder_instructions' => 'Aktiv edildikdə, istifadəçilərə bu konteynerdə qovluqlar yaratmaq imkanı verəcək.', + 'asset_container_disk_instructions' => 'Fayl sistemi diskləri faylların harada saxlanılacağını müəyyən edir - ya yerli, ya da Amazon S3 kimi uzaq yerdə. Onlar `config/filesystems.php` faylında konfiqurasiya edilə bilər.', + 'asset_container_handle_instructions' => 'Bu konteyneri frontend-də istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətin olacaq.', + 'asset_container_intro' => 'Media və sənəd faylları serverdəki qovluqlarda və ya digər fayl saxlama xidmətlərində saxlanılır. Bu yerlərin hər biri konteyner adlanır.', + 'asset_container_move_instructions' => 'Aktiv edildikdə, istifadəçilərə bu konteyner daxilində faylları hərəkət etdirmək imkanı verəcək.', + 'asset_container_quick_download_instructions' => 'Aktiv edildikdə, Varlıg Menecerində tez yükləmə düyməsini əlavə edəcək.', + 'asset_container_rename_instructions' => 'Aktiv edildikdə, istifadəçilərə bu konteynerdəki faylları yenidən adlandırmaq imkanı verəcək.', + 'asset_container_source_preset_instructions' => 'Yüklənmiş şəkillər bu hazır parametrlə daimi olaraq emal ediləcək.', + 'asset_container_title_instructions' => 'Adətən, Çoxluq isim, məsələn, Şəkillər və ya Sənədlər', + 'asset_container_validation_rules_instructions' => 'Bu qaydalar yüklənmiş fayllara tətbiq ediləcək.', + 'asset_container_warm_intelligent_instructions' => 'Yükləmə zamanı uyğun hazır parametrləri (presets) yaratmaq.', + 'asset_container_warm_presets_instructions' => 'Yükləmə zamanı hansı hazır parametrlərin yaradılacağını müəyyən edin.', + 'asset_folders_directory_instructions' => 'URL-ləri təmiz saxlamaq üçün boşluqlar və xüsusi simvolların qarşısını almağı tövsiyə edirik.', + 'asset_replace_confirmation' => 'Məzmun daxilində bu varlıga olan istinadlar aşağıda seçilmiş varlıga yenilənəcək.', + 'asset_reupload_confirmation' => 'Bu varlıgi yenidən yükləmək istədiyinizə əminsinizmi?', + 'asset_reupload_warning' => 'Brauzer və ya server səviyyəli keşləmə problemləri ilə qarşılaşa bilərsiniz. Varlığin əvəzlənməsini üstün tuta bilərsiniz.', + 'blueprints_hidden_instructions' => 'Plani idarəetmə panelində yaratma düymələrindən gizlədir', + 'blueprints_intro' => 'Planlar kolleksiyalar, formalar və digər məlumat növləri üçün məzmun modellərini yaratmaq üçün sahələri müəyyən edir və təşkil edir.', + 'blueprints_title_instructions' => 'Adətən, Tək isim, məsələn, Məqalə və ya Məhsul', + 'cache_utility_application_cache_description' => 'Laravel\'in Statamik, üçüncü tərəf əlavələr və composer paketləri tərəfindən istifadə edilən vahid keş.', + 'cache_utility_description' => 'Statamik\'ın müxtəlif keşləmə təbəqələri haqqında vacib məlumatları idarə edin və baxın.', + 'cache_utility_image_cache_description' => 'Şəkil keşi bütün dəyişdirilmiş və ölçülmüş şəkillərin nüsxələrini saxlayır.', + 'cache_utility_stache_description' => 'Stache, Statamik\'ın məzmun depolanmasıdır və çox vaxt verilənlər bazası kimi işləyir. O, məzmun fayllarından avtomatik olaraq yaradılır.', + 'cache_utility_static_cache_description' => 'Statik səhifələr Statamik\'ı tamamilə keçib gedir və maksimum performans üçün birbaşa serverdən render edilir.', + 'choose_entry_localization_deletion_behavior' => 'Lokalizasiya edilmiş girişlərdə həyata keçirmək istədiyiniz əməliyyatı seçin.', + 'collection_configure_date_behavior_private' => 'Şəxsi - Siyahılardan gizlənmiş, URL-lər 404', + 'collection_configure_date_behavior_public' => 'Faş - Həmişə görünən', + 'collection_configure_date_behavior_unlisted' => 'Siyahıda olmayan - Siyahılardan gizlənmiş, URL-lər görünən', + 'collection_configure_dated_instructions' => 'Yayım tarixləri məzmunun planlaşdırılması və müddəti keçməsi üçün istifadə edilə bilər.', + 'collection_configure_handle_instructions' => 'Bu kolleksiyaya frontend-də istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətin olacaq.', + 'collection_configure_intro' => 'Kolleksiyalar məqalələr, bloq yazıları, məhsullar, tədbirlər və ya hər hansı digər məzmun növünü təmsil edə bilən girişləri saxlayan konteynerlərdir.', + 'collection_configure_layout_instructions' => 'Bu kolleksiyanın standart düzülüşünü (layout) təyin edin. Girişlər `layout` adlı `template` sahəsi ilə bu parametri ləğv edə bilər. Bu parametri dəyişmək qeyri-adi haldır.', + 'collection_configure_origin_behavior_instructions' => 'Girişi lokalizasiya edərkən, hansı saytdan mənşə kimi istifadə olunmalıdır?', + 'collection_configure_origin_behavior_option_active' => 'Redaktə olunan girişin aktiv saytını istifadə edin', + 'collection_configure_origin_behavior_option_root' => 'Girişin əvvəlcə yaradıldığı saytı istifadə edin', + 'collection_configure_origin_behavior_option_select' => 'İstifadəçiyə mənşəyi seçməyə icazə verin', + 'collection_configure_propagate_instructions' => 'Yeni girişləri avtomatik olaraq bütün konfiqurasiya edilmiş saytlara yaymaq.', + 'collection_configure_require_slugs_instructions' => 'Girişlərin məcburi şəkildə slug olması tələb olunub-olunmadığını göstərir.', + 'collection_configure_template_instructions' => 'Bu kolleksiyanın standart şablonunu təyin edin. Girişlər `template` sahəsi ilə bu parametri ləğv edə bilər.', + 'collection_configure_title_format_instructions' => 'Bu kolleksiyadakı girişlərin başlıqlarını avtomatik olaraq yaratmasını təmin etmək üçün bunu təyin edin. Daha çox məlumatı [sənədlər](https://statamic.dev/collections#titles) bölümündə öyrənin.', + 'collection_configure_title_instructions' => 'Çoxluq isim tövsiyə olunur, məsələn, "Məqalələr" və ya "Məhsullar".', + 'collection_next_steps_blueprints_description' => 'Bu kolleksiya üçün mövcud olan planları və sahələri idarə edin.', + 'collection_next_steps_configure_description' => 'URL-ləri və yolları konfiqurasiya edin, planları, tarix davranışlarını, sıralama və digər seçimləri müəyyənləşdirin.', + 'collection_next_steps_create_entry_description' => 'İlk qeydi yaradın və ya bir neçə yer tutucu qeyd yaradın, bu sizə bağlıdır.', + 'collection_next_steps_scaffold_description' => 'Kolleksiyanın adından tez bir zamanda indeks və detallı görünüşlər yaradın.', + 'collection_revisions_instructions' => 'Bu Kolleksiya üçün yeniləmələri (revisions) aktiv edin.', + 'collection_scaffold_instructions' => 'Hansılardan boş görünüşlərin yaradılacağını seçin. Mövcud fayllar üzərindən yazılmayacaq.', + 'collections_blueprint_instructions' => 'Bu kolleksiyadakı qeydlər bu planlardan hər hansı birini istifadə edə bilər.', + 'collections_default_publish_state_instructions' => 'Bu kolleksiyada yeni qeydlər yaradarkən nəşr edilmiş açar **true** olaraq təyin olunacaq, **false** (qaralama) əvəzinə.', + 'collections_future_date_behavior_instructions' => 'Gələcək tarixli qeydlərin necə davranmalı olduğunu müəyyənləşdirin.', + 'collections_links_instructions' => 'Bu kolleksiyadakı qeydlər digər qeydlərə və ya URL-lərə keçidlər (yenidən yönləndirmələr) ehtiva edə bilər.', + 'collections_mount_instructions' => 'Bu kolleksiyanın montaj ediləcəyi bir qeydi seçin. Daha ətraflı məlumat üçün [sənədlərə](https://statamic.dev/collections-and-entries#mounting) baxın.', + 'collections_orderable_instructions' => 'Sürükleyib buraxma vasitəsilə əllə sıralamağı aktiv edin.', + 'collections_past_date_behavior_instructions' => 'Keçmiş tarixli qeydlərin necə davranmalı olduğunu müəyyənləşdirin.', + 'collections_preview_target_refresh_instructions' => 'Düzəliş edərkən ön görünüşü avtomatik yeniləyin. Bunu deaktiv etmək postMessage istifadə edəcək.', + 'collections_preview_targets_instructions' => 'Canlı Ön Görünüşdə görünə biləcək URL-lər. Daha ətraflı məlumat üçün [sənədlərə](https://statamic.dev/live-preview#preview-targets) baxın.', + 'collections_route_instructions' => 'Yol qeydlərin URL nümunəsini idarə edir. Daha ətraflı məlumat üçün [sənədlərə](https://statamic.dev/collections#routing) baxın.', + 'collections_sort_direction_instructions' => 'Varsayılan sıralama səmti.', + 'collections_taxonomies_instructions' => 'Bu kolleksiyadakı qeydləri taksonomiyalara bağlayın. Sahələr dərc formalarına avtomatik əlavə olunacaq.', + 'dictionaries_countries_region_instructions' => 'Ölkələri regiona görə seçməyə imkan tanıyın.', + 'duplicate_action_localizations_confirmation' => 'Bu hərəkəti həyata keçirmək istəyirsinizmi? Yerli versiyalar da çoxaldılacaq.', + 'duplicate_action_warning_localization' => 'Bu qeyd bir yerli versiyadır. Mənşə qeyd çoxaldılacaq.', + 'duplicate_action_warning_localizations' => 'Seçilmiş qeydlərdən biri və ya bir neçəsi yerli versiyadır. Belə hallarda, mənşə qeyd çoxaldılacaq.', + 'email_utility_configuration_description' => 'Poçt parametrləri :path faylında konfiqurasiya edilmişdir.', + 'email_utility_description' => 'Poçt konfiqurasiya parametrlərini yoxlayın və test e-poçtları göndərin.', + 'entry_origin_instructions' => 'Yeni yerli versiya seçilmiş saytdakı qeyddən dəyərləri miras alacaq.', + 'expect_root_instructions' => 'Ağacdakı ilk səhifəni "root" və ya "ev" səhifəsi olaraq qəbul edin.', + 'field_conditions_always_save_instructions' => 'Sahə gizli olsa belə, sahə dəyərini həmişə saxlayın.', + 'field_conditions_field_instructions' => 'Hər hansı bir sahə tutacağı daxil edə bilərsiniz. Seçimlərə məhdud deyilsiniz.', + 'field_conditions_instructions' => 'Bu sahəni nə vaxt göstərəcəyinizi və ya gizlədəcəyinizi müəyyənləşdirin.', + 'field_desynced_from_origin' => 'Mənşədən ayrılmışdır. Senkronizasiya etmək və mənşə dəyərinə qayıtmaq üçün vurun.', + 'field_synced_with_origin' => 'Mənşə ilə senkronizasiya olunub. Ayrılmaq üçün vurun və ya sahəni redaktə edin.', + 'field_validation_advanced_instructions' => 'Bu sahəyə daha irəliləmiş doğrulama əlavə edin.', + 'field_validation_required_instructions' => 'Bu sahənin tələb olunub-olunmadığını nəzarət edin.', + 'field_validation_sometimes_instructions' => 'Yalnız bu sahə görünəndə və ya təqdim edildikdə doğrulayın.', + 'fields_blueprints_description' => 'Planlar kolleksiyalar, taksonomiyalar, istifadəçilər və formalar kimi məzmun strukturları üçün sahələri müəyyənləşdirir.', + 'fields_default_instructions' => 'Bu sahə boş olduqda bütün dərc formalarında daxil ediləcək dəyər.', + 'fields_display_instructions' => 'Sahənin İdarə Panelində göstərilən etiketi.', + 'fields_duplicate_instructions' => 'Bu sahənin əşyayı çoxaldarkən daxil ediləcəyi.', + 'fields_fieldsets_description' => 'Sahə dəstləri sadə, çevik və tamamilə seçimlik qruplamalardır, təkrar istifadə oluna bilən, əvvəlcədən konfiqurasiya edilmiş sahələri təşkil etməyə kömək edir.', + 'fields_handle_instructions' => 'Sahənin şablon dəyişəni.', + 'fields_instructions_instructions' => 'Bu cür əlavə sahə təlimatları təqdim edin. Markdown formatı dəstəklənir.', + 'fields_instructions_position_instructions' => 'Təlimatları sahənin üstündə və ya altında göstərin.', + 'fields_listable_instructions' => 'Siyahı sütunlarının görünürlüyünü nəzarət edin.', + 'fields_replicator_preview_instructions' => 'Replicator/Bard dəstlərində əvvəlcədən baxış görünürlüğünü nəzarət edin.', + 'fields_sortable_instructions' => 'Sahənin siyahı görünüşlərində sıralanabiləcəyi.', + 'fields_visibility_instructions' => 'Dərc formalarında sahənin görünürlüyünü nəzarət edin.', + 'fieldset_import_fieldset_instructions' => 'İdxal ediləcək sahə dəsti.', + 'fieldset_import_prefix_instructions' => 'İdxal edildikdə hər sahəyə tətbiq olunacaq prefiks. Məsələn: hero_', + 'fieldset_intro' => 'Sahə dəstləri planların əlavə bir köməkçisidir, planlar daxilində istifadə oluna bilən təkrar istifadə edilə bilən hissələr kimi fəaliyyət göstərir.', + 'fieldset_link_fields_prefix_instructions' => 'Bağlı sahə dəstindəki hər sahə bu prefiks ilə başlanacaq. Eyni sahələri birdən çox dəfə idxal etmək istədikdə faydalıdır.', + 'fieldsets_handle_instructions' => 'Bu sahə dəstini digər yerlərdə istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətindir.', + 'fieldsets_title_instructions' => 'Adətən içərisindəki sahələri təsvir edir, məsələn, Şəkil Bloku və ya Meta Məlumat', + 'filters_view_already_exists' => 'Bu adla artıq bir görünüş mövcuddur. Bu görünüşü yaratmaq mövcud görünüşü üstələyəcək.', + 'focal_point_instructions' => 'Fokal nöqtəni təyin etmək, dinamik foto kəsməyə imkan tanıyır ki, mövzu çərçivədə qalsın.', + 'focal_point_previews_are_examples' => 'Kəsmə ön görünüşləri yalnız nümunədir.', + 'forgot_password_enter_email' => 'Şifrəni sıfırlamaq üçün link göndərə bilmək üçün e-poçt ünvanınızı daxil edin.', + 'form_configure_blueprint_instructions' => 'Mövcud planlardan seçin və ya yenisini yaradın.', + 'form_configure_email_attachments_instructions' => 'Yüklənmiş varlıglari bu e-poçta əlavə edin.', + 'form_configure_email_bcc_instructions' => 'BCC alıcısının e-poçt ünvanı - vergüllə (comma) ayrılmış.', + 'form_configure_email_cc_instructions' => 'CC alıcısının e-poçt ünvanı - vergüllə (comma) ayrılmış.', + 'form_configure_email_from_instructions' => 'Saytın defoltuna qayıtmaq üçün boş buraxın.', + 'form_configure_email_html_instructions' => 'Bu e-poçtun HTML versiyasının görünüşü.', + 'form_configure_email_instructions' => 'Yeni forma təqdimatları alındıqda göndəriləcək e-poçtları konfiqurasiya edin.', + 'form_configure_email_markdown_instructions' => 'Bu e-poçtun HTML versiyasını markdown istifadə edərək tərtib edin.', + 'form_configure_email_reply_to_instructions' => 'Göndəriciyə qayıtmaq üçün boş buraxın.', + 'form_configure_email_subject_instructions' => 'E-poçt başlıq xətti.', + 'form_configure_email_text_instructions' => 'Bu e-poçtun mətn versiyasının görünüşü.', + 'form_configure_email_to_instructions' => 'Alıcının e-poçt ünvanı - vergüllə (comma) ayrılmış.', + 'form_configure_handle_instructions' => 'Bu formu frontend-də istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətindir.', + 'form_configure_honeypot_instructions' => 'Tələ (honeypot) olaraq istifadə ediləcək sahə adı. Tələlər botspam-i azaltmaq üçün istifadə edilən xüsusi sahələrdir.', + 'form_configure_intro' => 'Formalar ziyarətçilərdən məlumat toplamaq və yeni təqdimatlar olduqda hadisələr və bildirişlər göndərmək üçün istifadə olunur.', + 'form_configure_mailer_instructions' => 'Bu e-poçtu göndərmək üçün mailer seçin. Defolt mailer-ə qayıtmaq üçün boş buraxın.', + 'form_configure_store_instructions' => 'Təqdimatları saxlamağı dayandırmaq üçün deaktiv edin. Hadisələr və e-poçt bildirişləri hələ də göndəriləcək.', + 'form_configure_title_instructions' => 'Adətən hərəkətə çağırış kimi, məsələn "Bizimlə Əlaqə".', + 'getting_started_widget_blueprints' => 'Planlar məzmun yaratmaq və saxlamaq üçün istifadə olunan xüsusi sahələri müəyyənləşdirir.', + 'getting_started_widget_collections' => 'Kolleksiyalar saytdakı fərqli məzmun növlərini ehtiva edir.', + 'getting_started_widget_docs' => 'Statamikı tanıyın və imkanlarını doğru şəkildə başa düşün.', + 'getting_started_widget_header' => 'Statamik ilə Başlamaq', + 'getting_started_widget_intro' => 'Yeni Statamik saytınızı qurmağa başlamaq üçün bu addımları izləməyi tövsiyə edirik.', + 'getting_started_widget_navigation' => 'Navigasiya çubuqları, altbilgilər və s. üçün istifadə oluna bilən çox səviyyəli keçidlər yaradın.', + 'getting_started_widget_pro' => 'Statamik Pro limitsiz istifadəçi hesabları, rollar, icazələr, git inteqrasiyası, yeniləmələr, çoxsaylı saytlar və daha çoxunu əlavə edir!', + 'git_disabled' => 'Statamik Git inteqrasiyası hazırda deaktivdir.', + 'git_nothing_to_commit' => 'Təqdim edəcək heç nə yoxdur, məzmun yolları təmizdir!', + 'git_utility_description' => 'Git izlənilən məzmunu idarə edin.', + 'global_search_open_using_slash' => 'Ümumi axtarışa / düyməsi ilə fokuslanın', + 'global_set_config_intro' => 'Global Dəstlər bütün saytda mövcud olan məzmunu idarə edir, məsələn, şirkət məlumatları, əlaqə məlumatları və ya ön tərəf parametrləri.', + 'global_set_no_fields_description' => 'Plan-ə sahələr əlavə edə bilərsiniz və ya dəyişənləri dəstə özü üzərində əl ilə əlavə edə bilərsiniz.', + 'globals_blueprint_instructions' => 'Dəyişənləri redaktə edərkən göstəriləcək sahələri idarə edir.', + 'globals_configure_handle_instructions' => 'Bu qlobal dəsti frontend-də istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətindir.', + 'globals_configure_intro' => 'Qlobal dəst bütün ön tərəf səhifələrində mövcud olan dəyişənlər qrupudur.', + 'globals_configure_title_instructions' => 'Dəstin məzmununu təsvir edən bir isim tövsiyə edirik. məsələn: "Marka" və ya "Şirkət"', + 'impersonate_action_confirmation' => 'Bu istifadəçi olaraq daxil olacaqsınız. Hesabınıza avatar menyusundan qayıda bilərsiniz.', + 'licensing_config_cached_warning' => '.env və ya konfiqurasiya fayllarınızda etdiyiniz dəyişikliklər keşlənmişdir və dəyişikliklərinizi görmək üçün keşi təmizləməlisiniz. Burada gözlənilməz lisenziya nəticələri görürsünüzsə, bu səbəbdən ola bilər. Keşi yenidən yaratmaq üçün php artisan config:cache əmri istifadə edə bilərsiniz.', + 'licensing_error_invalid_domain' => 'Yanlış domen', + 'licensing_error_invalid_edition' => 'Lisenziya :edition versiyası üçün', + 'licensing_error_no_domains' => 'Domenlər müəyyən edilməyib', + 'licensing_error_no_site_key' => 'Sayt lisenziya açarı yoxdur', + 'licensing_error_outside_license_range' => 'Lisenziya :start və :end versiyaları üçün etibarlıdır', + 'licensing_error_unknown_site' => 'Naməlum sayt', + 'licensing_error_unlicensed' => 'Lisenziyası yoxdur', + 'licensing_incorrect_key_format_body' => 'Sayt açarınızın doğru formatda olmadığını görünür. Açarı yoxlayın və yenidən cəhd edin. Sayt açarınızı statamic.com-da hesab sahənizdən əldə edə bilərsiniz. Bu alfanumerikdir və 16 xarakterdən ibarətdir. UUID olan köhnə lisenziya açarından istifadə etməyinizə əmin olun.', + 'licensing_incorrect_key_format_heading' => 'Yanlış sayt açarı formatı', + 'licensing_production_alert' => 'Bu sayt Statamik Pro və kommersiya əlavələri istifadə edir. Müvafiq lisenziyaları satın alın.', + 'licensing_production_alert_addons' => 'Bu sayt kommersiya əlavələrini istifadə edir. Müvafiq lisenziyaları satın alın.', + 'licensing_production_alert_statamic' => 'Bu sayt Statamik Pro istifadə edir. Lisenziya satın alın.', + 'licensing_production_alert_renew_statamic' => 'Bu versiyadan istifadə etmək üçün Statamik Pro lisenziyanızın yenilənməsi lazımdır.', + 'licensing_sync_instructions' => 'Statamik.com-dan məlumat hər saat bir dəfə sinkronizasiya edilir. Edilmiş dəyişiklikləri görmək üçün sinkronizasiyanı zorla.', + 'licensing_trial_mode_alert' => 'Bu sayt Statamik Pro və kommersiya əlavələrini istifadə edir. Başlamadan əvvəl lisenziyaları satın almağa əmin olun. Təşəkkürlər!', + 'licensing_trial_mode_alert_addons' => 'Bu sayt kommersiya əlavələrini istifadə edir. Başlamadan əvvəl lisenziyaları satın almağa əmin olun. Təşəkkürlər!', + 'licensing_trial_mode_alert_statamic' => 'Bu sayt Statamik Pro istifadə edir. Başlamadan əvvəl lisenziya satın almağa əmin olun. Təşəkkürlər!', + 'licensing_utility_description' => 'Lisenziya detalları baxın və həll edin.', + 'max_depth_instructions' => 'Səhifənin neçə səviyyə iç içə ola biləcəyini təyin edin. Limit qoymamaq üçün boş buraxın.', + 'max_items_instructions' => 'Seçilə bilən əşyaların maksimum sayını təyin edin.', + 'navigation_configure_blueprint_instructions' => 'Mövcud Planlardan seçin və ya yenisini yaradın.', + 'navigation_configure_collections_instructions' => 'Bu kolleksiyalardakı qeydlərə keçid əlavə edin.', + 'navigation_configure_handle_instructions' => 'Bu navigasiyanı frontend-də istinad etmək üçün istifadə olunur. Sonradan dəyişdirmək çətindir.', + 'navigation_configure_intro' => 'Navigasiyalar çox səviyyəli keçidlərdir ki, bunlar navigasiya çubuqları, altbilgilər, sayt xəritələri və digər ön tərəf navigasiyaları qurmaq üçün istifadə olunur.', + 'navigation_configure_select_across_sites' => 'Digər saytlardan qeydlər seçməyə icazə verin.', + 'navigation_configure_settings_intro' => 'Kolleksiyalara keçid verməyə icazə verin, maksimum dərinliyi təyin edin və digər davranışları müəyyənləşdirin.', + 'navigation_configure_title_instructions' => 'Harada istifadə olunacağını uyğun bir ad tövsiyə edirik, məsələn, "Əsas Naviqasiya" və ya "Altbilgi Naviqasiyası".', + 'navigation_documentation_instructions' => 'Navigasiyaları qurma, konfiqurasiya etmə və render etmə haqqında daha ətraflı məlumat əldə edin.', + 'navigation_link_to_entry_instructions' => 'Bir qeydə keçid əlavə edin. Konfiqurasiya sahəsində əlavə kolleksiyalara keçid verməyə icazə verin.', + 'navigation_link_to_url_instructions' => 'Hər hansı bir daxili və ya xarici URL-ə keçid əlavə edin. Konfiqurasiya sahəsində qeydlərə keçid verməyə icazə verin.', + 'outpost_error_422' => 'statamic.com ilə ünsiyyət qurarkən xəta baş verdi.', + 'outpost_error_429' => 'Statamik.com-a çox sayda sorğu.', + 'outpost_issue_try_later' => 'Statamik.com ilə ünsiyyət qurulmasında bir problem oldu. Zəhmət olmasa, daha sonra yenidən cəhd edin.', + 'outpost_license_key_error' => 'Statamik təqdim olunan lisenziya açarı faylını şifrələyə bilmədi. Zəhmət olmasa, statamic.com-dan yenidən yükləyin.', + 'password_protect_enter_password' => 'Açmaq üçün şifrə daxil edin', + 'password_protect_incorrect_password' => 'Şifrə yanlışdır.', + 'password_protect_token_invalid' => 'Yanlış və ya müddəti bitmiş token.', + 'password_protect_token_missing' => 'Təhlükəsiz token yoxdur. Bu ekrana orijinal, qorunan URL-dən gəlməlisiniz.', + 'phpinfo_utility_description' => 'PHP konfiqurasiya parametrlərini və quraşdırılmış modulları yoxlayın.', + 'preference_favorites_instructions' => 'Qlobal axtarış çubuğunu açdığınızda göstəriləcək qısayollar. Alternativ olaraq, səhifəni ziyarət edərək, yuxarıdakı pin ikonundan istifadə edərək bu siyahıya əlavə edə bilərsiniz.', + 'preference_locale_instructions' => 'İdarə paneli üçün üstünlük verilən dil.', + 'preference_start_page_instructions' => 'İdarə panelinə daxil olduqda göstəriləcək səhifə.', + 'publish_actions_create_revision' => 'İşləyən nüsxədən əsaslanaraq bir təkrar yaradılacaq. Cari təkrar dəyişməyəcək.', + 'publish_actions_current_becomes_draft_because_scheduled' => 'Cari təkrar dərc edilib və siz gələcəkdə bir tarix seçdinizsə, təqdim etdikdən sonra təkrar seçilmiş tarixə qədər qaralama kimi davranacaq.', + 'publish_actions_publish' => 'İşləyən nüsxədəki dəyişikliklər qeydə tətbiq ediləcək və dərhal dərc ediləcək.', + 'publish_actions_schedule' => 'İşləyən nüsxədəki dəyişikliklər qeydə tətbiq ediləcək və seçilmiş tarixdə dərc ediləcək.', + 'publish_actions_unpublish' => 'Cari təkrar dərc edilməyəcək.', + 'reset_password_notification_body' => 'Bu e-poçtu şifrə sıfırlama tələbi aldığımız üçün alırsınız.', + 'reset_password_notification_no_action' => 'Əgər şifrə sıfırlama tələbi etməmisinizsə, heç bir əlavə tədbir görülməlidir.', + 'reset_password_notification_subject' => 'Şifrə Sıfırlama Bildirişi', + 'role_change_handle_warning' => 'Tutacağı dəyişdirmək istifadəçilər və qruplarda olan istinadları yeniləməyəcək.', + 'role_handle_instructions' => 'Tutacaqlar bu rolu ön tərəfdə istinad etmək üçün istifadə olunur. Asanlıqla dəyişdirilə bilmir.', + 'role_intro' => 'Rollar istifadəçilərə və istifadəçi qruplarına təyin edilə bilən giriş və fəaliyyət icazələri qruplarıdır.', + 'role_title_instructions' => 'Adətən bir tək isim, məsələn Redaktor və ya Admin.', + 'search_utility_description' => 'Statamik-ın axtarış indeksləri haqqında əhəmiyyətli məlumatları idarə edin və görün.', + 'session_expiry_enter_password' => 'Harada dayandığınızı davam etdirmək üçün şifrənizi daxil edin', + 'session_expiry_logged_out_for_inactivity' => 'Bir müddət fəaliyyətsiz olduğunuz üçün çıxış etdiniz.', + 'session_expiry_logging_out_in_seconds' => 'Bir müddət fəaliyyətsiz oldunuz və :seconds saniyə sonra çıxış edəcəksiniz. Sessiyanızı uzatmaq üçün klikləyin.', + 'session_expiry_new_window' => 'Yeni pəncərədə açılır. Daxil olduqdan sonra geri dönün.', + 'show_slugs_instructions' => 'Slugların ağac görünüşündə göstərilib-göstərilməyəcəyini müəyyənləşdirin.', + 'site_configure_attributes_instructions' => 'Saytınızın konfiqurasiyasına ixtiyari atributlar əlavə edin ki, bunlara şablonlarınızda giriş əldə edə biləsiniz. [Daha çox öyrənin](https://statamic.dev/multi-site#additional-attributes).', + 'site_configure_handle_instructions' => 'Bu sayt üçün unik bir istinad. Daha sonra dəyişmək çətindir.', + 'site_configure_lang_instructions' => '[Dillər](https://statamic.dev/multi-site#language) haqqında məlumat əldə edin.', + 'site_configure_locale_instructions' => '[Dil mühitləri](https://statamic.dev/multi-site#locale) haqqında öyrənin.', + 'site_configure_name_instructions' => 'İdarə panelində göstərilən istifadəçi qarşılıqlı ad.', + 'site_configure_url_instructions' => '[Sayt URL-ləri](https://statamic.dev/multi-site#urlhttps://statamic.dev/multi-site#url) haqqında öyrənin.', + 'status_expired_with_date' => ':date tarixində müddəti bitmişdir', + 'status_published_with_date' => ':date tarixində dərc edilmişdir', + 'status_scheduled_with_date' => ':date tarixində dərc olunması planlaşdırılıb', + 'tabs_instructions' => 'Hər bölmədəki sahələr tab-lara qruplaşdırılacaq. Yeni sahələr yaradın, mövcud sahələri yenidən istifadə edin və ya mövcud sahə dəstlərindən bütün sahə qruplarını idxal edin.', + 'taxonomies_blueprints_instructions' => 'Bu taksonomiyadakı terminlər bu planlardan hər hansı birini istifadə edə bilər..', + 'taxonomies_collections_instructions' => 'Bu taksonomiyanı istifadə edən kolleksiyalar.', + 'taxonomies_preview_target_refresh_instructions' => 'Redaktə edərkən ön baxışı avtomatik olaraq yeniləyin. Bunu deaktiv etmək postMessage istifadə edəcək.', + 'taxonomies_preview_targets_instructions' => 'Canlı Ön Baxışda görünə biləcək URL-lər. [Sənəddə](https://statamic.dev/live-preview#preview-targets) daha ətraflı öyrənin.', + 'taxonomy_configure_handle_instructions' => 'Bu taksonomiyanı ön tərəfdə istinad etmək üçün istifadə olunur. Daha sonra dəyişdirmək çətindir.', + 'taxonomy_configure_intro' => 'Taksonomiya, məlumatları unikal xüsusiyyətlərə əsaslanaraq təsnif edən bir sistemdir, məsələn, kateqoriyalar, etiketlər və ya rənglər.', + 'taxonomy_configure_layout_instructions' => 'Bu taksonomiyanın defolt düzənini təyin edin. Terminlər bu tənzimləməni `layout` sahəsi ilə üstələyə bilər.', + 'taxonomy_configure_template_instructions' => 'Bu taksonomiyanın defolt şablonunu təyin edin.', + 'taxonomy_configure_term_template_instructions' => 'Bu taksonomiyanın defolt şablonunu təyin edin. Terminlər bu tənzimləməni `template` sahəsi ilə üstələyə bilər.', + 'taxonomy_configure_title_instructions' => 'Çoxlu isim istifadə etməyi tövsiyə edirik, məsələn, "Kateqoriyalar" və ya "Etiketlər".', + 'taxonomy_next_steps_blueprints_description' => 'Bu taksonomiya üçün mövcud planlari və sahələri idarə edin.', + 'taxonomy_next_steps_configure_description' => 'Adları konfiqurasiya edin, kolleksiyaları aidiyyətdirin, planlari təyin edin və daha.', + 'taxonomy_next_steps_create_term_description' => 'İlk termini yaradın və ya bir neçə yer tutucu termini yaradın, sizin seçiminizdir.', + 'try_again_in_seconds' => '{0,1}İndi yenidən cəhd edin.|:count saniyə sonra yenidən cəhd edin.', + 'units.B' => ':count B', + 'units.GB' => ':count GB', + 'units.KB' => ':count KB', + 'units.MB' => ':count MB', + 'units.ms' => ':countms', + 'units.s' => ':counts', + 'updater_require_version_command' => 'Xüsusi bir versiyanı tələb etmək üçün aşağıdakı əmri çalışdırın', + 'updater_update_to_latest_command' => 'Ən son versiyaya yeniləmək üçün aşağıdakı əmri çalışdırın', + 'updates_available' => 'Yeniləmələr mövcuddur!', + 'user_activation_email_not_sent_error' => 'Aktivasiya e-poçtu göndərilə bilmədi. Zəhmət olmasa, e-poçt konfiqurasiyanızı yoxlayın və yenidən cəhd edin.', + 'user_groups_handle_instructions' => 'Bu istifadəçi qrupunu ön tərəfdə istinad etmək üçün istifadə olunur. Daha sonra dəyişdirmək çətindir.', + 'user_groups_intro' => 'İstifadəçi qrupları istifadəçiləri təşkil etməyə və icazə əsaslı rolları topluca tətbiq etməyə imkan verir.', + 'user_groups_role_instructions' => 'İstifadəçilərə bu qrupda bütün müvafiq icazələri vermək üçün rolları təyin edin.', + 'user_groups_title_instructions' => 'Adətən çoxlu isim, məsələn Redaktorlar və ya Fotoqraflar', + 'user_wizard_account_created' => 'İstifadəçi hesabı yaradıldı.', + 'user_wizard_email_instructions' => 'E-poçt ünvanı həm də istifadəçi adı kimi xidmət edir və unikal olmalıdır.', + 'user_wizard_intro' => 'İstifadəçilərə İdarəetmə Panelində icazələrini, girişlərini və bacarıqlarını fərdiləşdirən rollar təyin edilə bilər.', + 'user_wizard_invitation_body' => 'Yeni Statamik hesabınızı :site-da aktivləşdirin və bu veb saytın idarə edilməsinə başlayın. Təhlükəsizliyiniz üçün aşağıdakı link :expiry saat sonra müddəti bitir. Bundan sonra yeni şifrə üçün sayt administratoru ilə əlaqə saxlayın.|Yeni Statamik hesabınızı :site-da aktivləşdirin və bu veb saytın idarə edilməsinə başlayın. Təhlükəsizliyiniz üçün aşağıdakı link :expiry saat sonra müddəti bitir. Bundan sonra yeni şifrə üçün sayt administratoru ilə əlaqə saxlayın.', + 'user_wizard_invitation_intro' => 'Yeni istifadəçiyə hesab aktivləşdirmə detalları ilə xoş gəlmisiniz e-poçtu göndərin.', + 'user_wizard_invitation_share' => ':email ilə seçdiyiniz metodla paylaşmaq üçün bu məlumatları kopyalayın.', + 'user_wizard_invitation_share_before' => 'İstifadəçi yaradıldıqdan sonra, :email ilə seçdiyiniz metodla paylaşmaq üçün detallar təqdim ediləcək.', + 'user_wizard_invitation_subject' => ':site-da yeni Statamik hesabınızı aktivləşdirin', + 'user_wizard_name_instructions' => 'Adı boş qoyun ki, istifadəçi onu doldura bilsin.', + 'user_wizard_roles_groups_intro' => 'İstifadəçilərə İdarəetmə Panelində icazələrini, girişlərini və bacarıqlarını fərdiləşdirən rollar təyin edilə bilər.', + 'user_wizard_super_admin_instructions' => 'Super administratorlar idarə panelində hər şeyə tam nəzarət və giriş imkanı verir. Bu rolu ağılla verin.', + 'view_more_count' => ':count daha çoxunu göstər', + 'width_x_height' => ':width x :height', +]; diff --git a/resources/lang/az/moment.php b/resources/lang/az/moment.php new file mode 100644 index 0000000000..63f77056d4 --- /dev/null +++ b/resources/lang/az/moment.php @@ -0,0 +1,18 @@ + '%s sonra', + 'relativeTime.past' => '%s qabaq', + 'relativeTime.s' => 'bir neçə saniyə', + 'relativeTime.ss' => '%d saniyə', + 'relativeTime.m' => 'bir dəqiqə', + 'relativeTime.mm' => '%d dəqiqə', + 'relativeTime.h' => 'bir saat', + 'relativeTime.hh' => '%d saat', + 'relativeTime.d' => 'bir gün', + 'relativeTime.dd' => '%d gün', + 'relativeTime.M' => 'bir ay', + 'relativeTime.MM' => '%d ay', + 'relativeTime.y' => 'bir il', + 'relativeTime.yy' => '%d il', +]; diff --git a/resources/lang/az/permissions.php b/resources/lang/az/permissions.php new file mode 100644 index 0000000000..c010e1071e --- /dev/null +++ b/resources/lang/az/permissions.php @@ -0,0 +1,88 @@ + 'Super İstifadəçi', + 'super_desc' => 'Super adminlər idarə panelində hər şeyə tam nəzarət və giriş hüququna malikdirlər. Bu rolu ağıllı şəkildə təyin edin.', + 'group_cp' => 'İdarə Paneli', + 'access_cp' => 'İdarə Panelinə Giriş', + 'access_cp_desc' => 'İdarə panelinə giriş imkanı verir, lakin içəridə hər hansı bir şeyin edilməsini təmin etmir.', + 'configure_sites' => 'Saytları Konfiqurasiya Et', + 'configure_sites_desc' => 'Çoxsaylı sayt rejimi aktiv olduqda saytları konfiqurasiya etmək imkanı.', + 'configure_fields' => 'Sahələri Konfiqurasiya Et', + 'configure_fields_desc' => 'Planləri, sahə dəstlərini və onların sahələrini redaktə etmək imkanı.', + 'configure_addons' => 'Əlavələri Konfiqurasiya Et', + 'configure_addons_desc' => 'Əlavələri quraşdırmaq və silmək üçün əlavə sahəyə giriş imkanı.', + 'manage_preferences' => 'Seçimləri İdarə Et', + 'manage_preferences_desc' => 'Qlobal və rol-spesifik seçimləri fərdiləşdirmək imkanı.', + 'group_sites' => 'Saytlar', + 'access_{site}_site' => ':site saytına giriş', + 'group_collections' => 'Kolleksiyalar', + 'configure_collections' => 'Kolleksiyaları Konfiqurasiya Et', + 'configure_collections_desc' => 'Bütün kolleksiya ilə əlaqəli icazələrə giriş imkanı verir', + 'view_{collection}_entries' => ':collection qeydlərinə baxış', + 'edit_{collection}_entries' => 'Qeydləri redaktə et', + 'create_{collection}_entries' => 'Yeni qeydlər yarat', + 'delete_{collection}_entries' => 'Qeydləri sil', + 'publish_{collection}_entries' => 'Yayımlama vəziyyətini idarə et', + 'publish_{collection}_entries_desc' => 'Qaralama və yayım arasında dəyişiklik etmək imkanı', + 'reorder_{collection}_entries' => 'Qeydləri yenidən sıralamaq', + 'reorder_{collection}_entries_desc' => 'Sürükle-burax yenidən sıralama imkanı', + 'edit_other_authors_{collection}_entries' => 'Başqa müəlliflərin qeydlərini redaktə et', + 'publish_other_authors_{collection}_entries' => 'Başqa müəlliflərin qeydlərinin yayım vəziyyətini idarə et', + 'delete_other_authors_{collection}_entries' => 'Başqa müəlliflərin qeydlərini sil', + 'group_taxonomies' => 'Taksonomiyalar', + 'configure_taxonomies' => 'Taksonomiyaları Konfiqurasiya Et', + 'configure_taxonomies_desc' => 'Bütün taksonomiya ilə əlaqəli icazələrə giriş imkanı verir', + 'view_{taxonomy}_terms' => ':taxonomy terminlərinə baxış', + 'edit_{taxonomy}_terms' => 'Terminləri redaktə et', + 'create_{taxonomy}_terms' => 'Yeni terminlər yarat', + 'delete_{taxonomy}_terms' => 'Terminləri sil', + 'publish_{taxonomy}_terms' => 'Yayımlama vəziyyətini idarə et', + 'reorder_{taxonomy}_terms' => 'Terminləri yenidən sıralamaq', + 'group_navigation' => 'Naviqasiya', + 'configure_navs' => 'Naviqasiyanı Konfiqurasiya Et', + 'configure_navs_desc' => 'Bütün naviqasiya ilə əlaqəli icazələrə giriş imkanı verir', + 'view_{nav}_nav' => ':nav naviqasiyasına baxış', + 'edit_{nav}_nav' => 'Naviqasiyanı redaktə et', + 'group_globals' => 'Qloballar', + 'configure_globals' => 'Qlobalları Konfiqurasiya Et', + 'configure_globals_desc' => 'Bütün qlobal ilə əlaqəli icazələrə giriş imkanı verir', + 'edit_{global}_globals' => ':global qloballarını redaktə et', + 'group_assets' => 'Varlığlar', + 'configure_asset_containers' => 'Varlığ Konteynerləri Konfiqurasiya Et', + 'configure_asset_containers_desc' => 'Bütün varlığ ilə əlaqəli icazələrə giriş imkanı verir', + 'view_{container}_assets' => ':container varlığlarinə baxış', + 'upload_{container}_assets' => 'Yeni varlığlar yüklə', + 'edit_{container}_assets' => 'Varlığlari redaktə et', + 'move_{container}_assets' => 'Varlığlari hərəkət etdir', + 'rename_{container}_assets' => 'Varlığlarin adını dəyiş', + 'delete_{container}_assets' => 'Varlığlari sil', + 'group_forms' => 'Formalar', + 'configure_forms' => 'Formalari Konfiqurasiya Et', + 'configure_forms_desc' => 'Bütün forma ilə əlaqəli icazələrə giriş imkanı verir', + 'configure_form_fields' => 'Forma Sahələrini Konfiqurasiya Et', + 'configure_form_fields_desc' => 'Forma planləri, sahə dəstlərini və onların sahələrini redaktə etmək imkanı.', + 'view_{form}_form_submissions' => ':form təqdimatlarına baxış', + 'delete_{form}_form_submissions' => ':form təqdimatlarını sil', + 'group_users' => 'İstifadəçilər', + 'view_users' => 'İstifadəçilərə baxış', + 'edit_users' => 'İstifadəçiləri redaktə et', + 'create_users' => 'İstifadəçilər yarat', + 'delete_users' => 'İstifadəçiləri sil', + 'change_passwords' => 'Şifrələri dəyiş', + 'edit_user_groups' => 'Qrupları redaktə et', + 'edit_roles' => 'Rolları redaktə et', + 'assign_user_groups' => 'Qrupları istifadəçilərə təyin et', + 'assign_roles' => 'Rolları istifadəçilərə təyin et', + 'impersonate_users' => 'İstifadəçiləri təqlid et', + 'group_updates' => 'Yeniləmələr', + 'view_updates' => 'Yeniləmələrə baxış', + 'group_utilities' => 'Utilitlər', + 'access_utility' => ':title', + 'access_utility_desc' => ':title utilitinə giriş imkanı verir', + 'group_misc' => 'Müxtəlif', + 'resolve_duplicate_ids' => 'Təkrar İD-ləri Həll Et', + 'resolve_duplicate_ids_desc' => 'Təkrar İD-ləri görmək və həll etmək imkanı.', + 'view_graphql' => 'GraphQL-ə baxış', + 'view_graphql_desc' => 'GraphQL görüntüləyicisinə giriş imkanı verir', +]; diff --git a/resources/lang/az/validation.php b/resources/lang/az/validation.php new file mode 100644 index 0000000000..073eda3931 --- /dev/null +++ b/resources/lang/az/validation.php @@ -0,0 +1,151 @@ + 'Qəbul edilməlidir.', + 'accepted_if' => ':other :value olduqda qəbul edilməlidir.', + 'active_url' => 'Bu keçərli bir URL deyil.', + 'after' => ':date tarixindən sonra olmalıdır.', + 'after_or_equal' => ':date tarixindən sonra və ya bərabər olmalıdır.', + 'alpha' => 'Yalnız hərf ola bilər.', + 'alpha_dash' => 'Yalnız hərflər, rəqəmlər, tire və alt xətlər ola bilər.', + 'alpha_num' => 'Yalnız hərflər və rəqəmlər ola bilər.', + 'array' => 'Bir array olmalıdır.', + 'ascii' => 'Yalnız tək baytlı hərf-rəqəm simvolları və işarələr ola bilər.', + 'before' => ':date tarixindən əvvəl olmalıdır.', + 'before_or_equal' => ':date tarixindən əvvəl və ya bərabər olmalıdır.', + 'between.array' => ':min və :max arasında maddələr olmalıdır.', + 'between.file' => ':min və :max kilobayt arasında olmalıdır.', + 'between.numeric' => ':min və :max arasında olmalıdır.', + 'between.string' => ':min və :max simvol arasında olmalıdır.', + 'boolean' => 'Doğru və ya yanlış olmalıdır.', + 'can' => 'İcazəsiz dəyər ehtiva edir.', + 'confirmed' => 'Təsdiq uyğun deyil.', + 'current_password' => 'Şifrə yanlışdır.', + 'date' => 'Keçərli bir tarix deyil.', + 'date_equals' => ':date tarixinə bərabər olmalıdır.', + 'date_format' => ':format formatına uyğun deyil.', + 'decimal' => ':decimal onluq yerlər olmalıdır.', + 'declined' => 'Rədd edilməlidir.', + 'declined_if' => ':other :value olduqda rədd edilməlidir.', + 'different' => 'Bu sahə və :other fərqli olmalıdır.', + 'digits' => ':digits rəqəmlər olmalıdır.', + 'digits_between' => ':min və :max rəqəm arasında olmalıdır.', + 'dimensions' => 'Yanlış şəkil ölçüləri.', + 'distinct' => 'Bu sahədə təkrarlanan dəyər var.', + 'doesnt_end_with' => 'Aşağıdakılardan biri ilə bitməməlidir: :values.', + 'doesnt_start_with' => 'Aşağıdakılardan biri ilə başlamamalıdır: :values.', + 'email' => 'Keçərli bir email ünvanı olmalıdır.', + 'ends_with' => ':values ilə bitməlidir.', + 'enum' => 'Seçilmiş :attribute keçərli deyil.', + 'exists' => 'Bu keçərli deyil.', + 'file' => 'Bir fayl olmalıdır.', + 'filled' => 'Bir dəyər olmalıdır.', + 'gt.array' => ':value maddələrdən çox olmalıdır.', + 'gt.file' => ':value kilobaytdan çox olmalıdır.', + 'gt.numeric' => ':value rəqəmlərdən çox olmalıdır.', + 'gt.string' => ':value simvollardan çox olmalıdır.', + 'gte.array' => ':value və ya daha çox maddələr olmalıdır.', + 'gte.file' => ':value kilobayt və ya daha çox olmalıdır.', + 'gte.numeric' => ':value rəqəmlər və ya daha çox olmalıdır.', + 'gte.string' => ':value simvollar və ya daha çox olmalıdır.', + 'image' => 'Bir şəkil olmalıdır.', + 'in' => 'Bu keçərli deyil.', + 'in_array' => 'Bu sahə :other içərisində yoxdur.', + 'integer' => 'Bir tam ədəd olmalıdır.', + 'ip' => 'Keçərli bir IP ünvanı olmalıdır.', + 'ipv4' => 'Keçərli bir IPv4 ünvanı olmalıdır.', + 'ipv6' => 'Keçərli bir IPv6 ünvanı olmalıdır.', + 'json' => 'Keçərli bir JSON string olmalıdır.', + 'lowercase' => 'Kiçik hərflərlə olmalıdır.', + 'lt.array' => ':value maddələrdən az olmalıdır.', + 'lt.file' => ':value kilobaytdan az olmalıdır.', + 'lt.numeric' => ':value rəqəmlərdən az olmalıdır.', + 'lt.string' => ':value simvollardan az olmalıdır.', + 'lte.array' => ':value maddələrdən çox olmamalıdır.', + 'lte.file' => ':value kilobaytdan az və ya bərabər olmalıdır.', + 'lte.numeric' => ':value rəqəmlərdən az və ya bərabər olmalıdır.', + 'lte.string' => ':value simvollardan az və ya bərabər olmalıdır.', + 'mac_address' => 'Keçərli bir MAC ünvanı olmalıdır.', + 'max.array' => ':max maddələrdən çox ola bilməz.', + 'max.file' => ':max kilobaytdan çox ola bilməz.', + 'max.numeric' => ':max rəqəmlərdən çox ola bilməz.', + 'max.string' => ':max simvollardan çox ola bilməz.', + 'max_digits' => ':max rəqəmlərdən çox ola bilməz.', + 'mimes' => ':values tipində bir fayl olmalıdır.', + 'mimetypes' => ':values tipində bir fayl olmalıdır.', + 'min.array' => 'Ən azı :min maddələr olmalıdır.', + 'min.file' => 'Ən azı :min kilobayt olmalıdır.', + 'min.numeric' => 'Ən azı :min rəqəmlər olmalıdır.', + 'min.string' => 'Ən azı :min simvollardan ibarət olmalıdır.', + 'min_digits' => 'Ən azı :min rəqəmlər olmalıdır.', + 'missing' => 'Olmamalıdır.', + 'missing_if' => ':other :value olduqda olmamalıdır.', + 'missing_unless' => ':other :value olmadıqda olmamalıdır.', + 'missing_with' => ':values mövcud olduqda olmamalıdır.', + 'missing_with_all' => ':values mövcud olduqda olmamalıdır.', + 'multiple_of' => ':value-nin bir neçə qat olmalıdır.', + 'not_in' => 'Bu keçərli deyil.', + 'not_regex' => 'Format keçərli deyil.', + 'numeric' => 'Bir rəqəm olmalıdır.', + 'present' => 'Mövcud olmalıdır.', + 'prohibited' => 'Qadağandır.', + 'prohibited_if' => ':other :value olduqda qadağandır.', + 'prohibited_unless' => ':other :values içərisində olmadıqda qadağandır.', + 'prohibits' => ':other-in mövcud olmasını qadağan edir.', + 'regex' => 'Format keçərli deyil.', + 'required' => 'Bu sahə zəruridir.', + 'required_array_keys' => ':values üçün girişlər olmalıdır.', + 'required_if' => ':other :value olduqda bu sahə zəruridir.', + 'required_if_accepted' => ':other qəbul edildikdə bu sahə zəruridir.', + 'required_unless' => ':other :values içərisində olmadıqda bu sahə zəruridir.', + 'required_with' => ':values mövcud olduqda bu sahə zəruridir.', + 'required_with_all' => ':values mövcud olduqda bu sahə zəruridir.', + 'required_without' => ':values mövcud olmadıqda bu sahə zəruridir.', + 'required_without_all' => ':values heç biri mövcud olmadıqda bu sahə zəruridir.', + 'same' => 'Bu sahə və :other uyğun olmalıdır.', + 'size.array' => ':size maddələrdən ibarət olmalıdır.', + 'size.file' => ':size kilobayt olmalıdır.', + 'size.numeric' => ':size olmalıdır.', + 'size.string' => ':size simvollar olmalıdır.', + 'starts_with' => ':values ilə başlamalıdır.', + 'string' => 'Bir string olmalıdır.', + 'timezone' => 'Keçərli bir zona olmalıdır.', + 'ulid' => 'Keçərli bir ULID olmalıdır.', + 'unique' => 'Bu dəyər artıq götürülüb.', + 'uploaded' => 'Yükləmə uğursuz oldu.', + 'uppercase' => 'Böyük hərflərlə olmalıdır.', + 'url' => 'Keçərli bir URL olmalıdır.', + 'uuid' => 'Keçərli bir UUID olmalıdır.', + 'arr_fieldtype' => 'Bu keçərli deyil.', + 'handle' => 'Yalnız kiçik hərflər və alt xətlərlə rəqəmlər ola bilər.', + 'slug' => 'Yalnız hərflər və rəqəmlər tire və ya alt xətlərlə ola bilər.', + 'code_fieldtype_rulers' => 'Bu keçərli deyil.', + 'composer_package' => 'Keçərli bir composer paket adı olmalıdır (məsələn, hasselhoff/kung-fury).', + 'date_fieldtype_date_required' => 'Tarix zəruridir.', + 'date_fieldtype_end_date_invalid' => 'Keçərli bir bitiş tarixi deyil.', + 'date_fieldtype_end_date_required' => 'Bitiş tarixi zəruridir.', + 'date_fieldtype_only_single_mode_allowed' => 'Sahə tutacağı date olduqda yalnız "Tək" rejimində istifadə edilə bilər.', + 'date_fieldtype_start_date_invalid' => 'Keçərli bir başlama tarixi deyil.', + 'date_fieldtype_start_date_required' => 'Başlama tarixi zəruridir.', + 'date_fieldtype_time_required' => 'Vaxt zəruridir.', + 'duplicate_field_handle' => ':handle sahəsi ilə bir sahə artıq mövcuddur.', + 'duplicate_uri' => 'Dublikat URI :value', + 'email_available' => 'Bu email ünvanı ilə bir istifadəçi artıq mövcuddur.', + 'fieldset_imported_recursively' => 'Sahə dəsti :handle rekrursiv olaraq idxal edilir.', + 'one_site_without_origin' => 'Ən azı bir saytın mənşəyi olmamalıdır.', + 'options_require_keys' => 'Bütün seçimlərin açarları olmalıdır.', + 'origin_cannot_be_disabled' => 'Qadağan edilmiş bir mənşəyi seçmək mümkün deyil.', + 'parent_cannot_be_itself' => 'Öz-özünə valideyn ola bilməz.', + 'parent_causes_root_children' => 'Bu kök səhifənin uşaqları olmasına səbəb olar.', + 'parent_exceeds_max_depth' => 'Bu maksimum dərinliyi keçər.', + 'reserved' => 'Bu rezerv edilmiş sözdür.', + 'reserved_field_handle' => ':handle sahəsi ilə sahə rezerv edilmiş sözdür.', + 'unique_entry_value' => 'Bu dəyər artıq götürülüb.', + 'unique_form_handle' => 'Bu dəyər artıq götürülüb.', + 'unique_term_value' => 'Bu dəyər artıq götürülüb.', + 'unique_user_value' => 'Bu dəyər artıq götürülüb.', + 'unique_uri' => 'Bu URI artıq götürülüb.', + 'time' => 'Keçərli bir vaxt deyil.', + 'custom.attribute-name.rule-name' => '', + 'attributes' => [], +]; diff --git a/src/Preferences/CorePreferences.php b/src/Preferences/CorePreferences.php index 8d26f8300d..27006afd4d 100644 --- a/src/Preferences/CorePreferences.php +++ b/src/Preferences/CorePreferences.php @@ -54,6 +54,7 @@ private function localeOptions(): array return collect([ 'ar' => 'Arabic', + 'az' => 'Azerbaijani', 'cs' => 'Czech', 'da' => 'Danish', 'de' => 'German', From 77d6fc6355c755fec08e15eb458823bcbb6401a4 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Mon, 5 Aug 2024 16:29:19 +0200 Subject: [PATCH 044/249] [5.x] Allow hiding border around group fieldtype (#10570) Co-authored-by: Jason Varga --- resources/js/components/fieldtypes/GroupFieldtype.vue | 5 ++--- resources/lang/en/fieldtypes.php | 1 + src/Fieldtypes/Group.php | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/resources/js/components/fieldtypes/GroupFieldtype.vue b/resources/js/components/fieldtypes/GroupFieldtype.vue index aac305a0ba..9814ee0056 100644 --- a/resources/js/components/fieldtypes/GroupFieldtype.vue +++ b/resources/js/components/fieldtypes/GroupFieldtype.vue @@ -37,8 +37,8 @@ />
-
-
+
+
diff --git a/resources/lang/en/fieldtypes.php b/resources/lang/en/fieldtypes.php index 58f8b983b6..604d7029e2 100644 --- a/resources/lang/en/fieldtypes.php +++ b/resources/lang/en/fieldtypes.php @@ -89,6 +89,7 @@ 'grid.config.add_row' => 'Customize the label of the "Add Row" button.', 'grid.config.fields' => 'Each field becomes a column in the grid table.', 'grid.config.fullscreen' => 'Enable toggle for fullscreen mode.', + 'grid.config.border' => 'Show a border and padding around fields in this group.', 'grid.config.max_rows' => 'Set a maximum number of creatable rows.', 'grid.config.min_rows' => 'Set a minimum number of creatable rows.', 'grid.config.mode' => 'Choose your preferred layout style.', diff --git a/src/Fieldtypes/Group.php b/src/Fieldtypes/Group.php index 63be02f601..d9807da6b3 100644 --- a/src/Fieldtypes/Group.php +++ b/src/Fieldtypes/Group.php @@ -37,6 +37,12 @@ protected function configFieldItems(): array 'type' => 'toggle', 'default' => true, ], + 'border' => [ + 'display' => __('Border'), + 'instructions' => __('statamic::fieldtypes.grid.config.border'), + 'type' => 'toggle', + 'default' => true, + ], ], ], ]; From 55fd361821f49638f762cd1c12adcc984c2bed5e Mon Sep 17 00:00:00 2001 From: Rez Bouchabou Date: Mon, 5 Aug 2024 17:29:54 +0300 Subject: [PATCH 045/249] [5.x] Arabic translations (#10563) --- resources/lang/ar.json | 29 +++++++++++++++++------------ resources/lang/ar/fieldtypes.php | 5 +++++ resources/lang/ar/messages.php | 6 ++++-- resources/lang/ar/permissions.php | 8 ++++---- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/resources/lang/ar.json b/resources/lang/ar.json index 67d73526eb..37fb2a0316 100644 --- a/resources/lang/ar.json +++ b/resources/lang/ar.json @@ -204,7 +204,7 @@ "Columns": "أعمدة", "Columns have been reset to their defaults.": "تمت إعادة تعيين الأعمدة إلى القيم الافتراضية.", "Commit": "تأكيد", - "Common": "مشترك", + "Common": "شائع", "Computed": "محسوب", "Conditions": "شروط", "Configuration": "تكوين", @@ -214,7 +214,7 @@ "Configure Blueprints": "تكوين المخططات", "Configure Collection": "تكوين المجموعة", "Configure Form": "تكوين النموذج", - "Configure Global Set": "تكوين مجموعة البيانات العالمية", + "Configure Global Set": "تكوين مجموعة عامة", "Configure Navigation": "تكوين قائمة التنقل", "Configure Role": "تكوين الدور", "Configure Site": "تكوين الموقع", @@ -238,7 +238,7 @@ "Copy password reset email for this user?": "نسخ بريد إعادة تعيين كلمة المرور لهذا المستخدم؟", "Copy Password Reset Link": "نسخ رابط إعادة تعيين كلمة المرور", "Copy URL": "نسخ عنوان URL", - "Core": "أساسي", + "Core": "الجوهر", "Couldn't save entry": "تعذر حفظ الإدخال", "Couldn't save term": "تعذر حفظ المصطلح", "CP Nav Preferences": "تفضيلات التنقل في لوحة التحكم", @@ -260,7 +260,7 @@ "Create Folder": "إنشاء مجلد", "Create Folders": "إنشاء مجلدات", "Create Form": "إنشاء نموذج", - "Create Global Set": "إنشاء مجموعة عموميات", + "Create Global Set": "إنشاء مجموعة عامة", "Create Group": "إنشاء مجموعة", "Create Localization": "إنشاء نسخة محلية", "Create Navigation": "إنشاء تنقل", @@ -322,6 +322,7 @@ "Description of the image": "وصف الصورة", "Deselect option": "إلغاء تحديد الخيار", "Detach": "فصل", + "Dictionary": "قاموس", "Directory": "دليل", "Directory already exists.": "الدليل موجود بالفعل.", "Disabled": "معطل", @@ -361,7 +362,7 @@ "Edit Entry": "تحرير المحتوى", "Edit Fieldset": "تحرير مجموعة الحقول", "Edit Form": "تحرير النموذج", - "Edit Global Set": "تحرير مجموعة البيانات العالمية", + "Edit Global Set": "تحرير المجموعة العامة", "Edit Image": "تحرير الصورة", "Edit Nav Item": "تحرير عنصر التنقل", "Edit Navigation": "تحرير التنقل", @@ -467,7 +468,7 @@ "Global Set saved": "تم حفظ المجموعة العامة", "Global Sets": "المجموعات العامة", "Global Variables": "المتغيرات العامة", - "Globals": "العموميات", + "Globals": "المتغيرات العامة", "Go To Listing": "انتقل إلى القائمة", "Greater than": "أكبر من", "Greater than or equals": "أكبر من أو يساوي", @@ -513,10 +514,10 @@ "Indent Type": "نوع التباعد", "Index": "الفهرس", "Index Template": "قالب الفهرس", - "Inline": "مباشر", - "Inline Code": "كود مباشر", - "Inline Label": "تسمية مباشرة", - "Inline Label when True": "تسمية مباشرة عند الصحة (true)", + "Inline": "مضمّن", + "Inline Code": "كود مضمّن", + "Inline Label": "تسمية مضمّنة", + "Inline Label when True": "تسمية مضمّنة عند القيمة الصحيحة (true)", "Input Behavior": "سلوك الإدخال", "Input Label": "تسمية الإدخال", "Input Type": "نوع الإدخال", @@ -730,6 +731,7 @@ "Regards": "مع التحية", "Regenerate": "إعادة توليد", "Regenerate from: :field": "إعادة توليد من : :field", + "Region": "منطقة", "Registration successful.": "التسجيل ناجح.", "Relationship": "علاقة", "Released on :date": "تم إصدارها في :date", @@ -812,6 +814,7 @@ "Searchables": "قابل للبحث", "Searching in:": "البحث في:", "Select": "اختر", + "Select Across Sites": "اختيار عبر المواقع", "Select asset container": "اختر حاوية الملفات", "Select Collection(s)": "اختر مجموعة(ات)", "Select Dropdown": "قائمة منسدلة", @@ -852,8 +855,10 @@ "Show when": "عرض عند", "Show Word Count": "عرض عدد الكلمات", "Shown by default": "معروض بشكل افتراضي", - "Single": "مفرد", + "Single": "فردي", "Site": "الموقع", + "Site deleted": "تم حذف الموقع", + "Site saved": "تم حفظ الموقع", "Site selected.": "تم اختيار الموقع.", "Sites": "المواقع", "Size": "الحجم", @@ -932,7 +937,7 @@ "This action is unauthorized.": "هذه العملية غير مصرح بها.", "This container is empty": "هذه الحاوية فارغة", "This form is awaiting responses": "هذه النموذج في انتظار الردود", - "This Global Set has no fields.": "تعيين العموميات هذا لا يحتوي على حقول.", + "This Global Set has no fields.": "تعيين المجموعة العامة هذه لا تحتوي على حقول.", "This is now your start page.": "هذه هي الآن صفحتك الرئيسية.", "This is the published version": "هذه هي النسخة المنشورة", "This is the root page": "هذه هي الصفحة الرئيسية", diff --git a/resources/lang/ar/fieldtypes.php b/resources/lang/ar/fieldtypes.php index c15f52c40e..2da08f11ff 100644 --- a/resources/lang/ar/fieldtypes.php +++ b/resources/lang/ar/fieldtypes.php @@ -72,10 +72,15 @@ 'date.config.time_enabled' => 'تمكين محدد الوقت.', 'date.config.time_seconds_enabled' => 'عرض الثواني في محدد الوقت.', 'date.title' => 'تاريخ', + 'dictionary.config.dictionary' => 'القاموس الذي ترغب في استخراج الخيارات منه.', + 'dictionary.file.config.filename' => 'اسم الملف الذي يحتوي على خياراتك، بالنسبة إلى الدليل `resources/dictionaries`.', + 'dictionary.file.config.label' => 'المفتاح الذي يحتوي على تسميات الخيارات. بشكل افتراضي، هو `label`. بدلاً من ذلك، يمكنك استخدام Antlers.', + 'dictionary.file.config.value' => 'المفتاح الذي يحتوي على قيم الخيارات. بشكل افتراضي، هو `value`.', 'entries.config.create' => 'السماح بإنشاء إدخالات جديدة.', 'entries.config.collections' => 'اختر المجموعات التي يمكن للمستخدم الاختيار منها.', 'entries.config.query_scopes' => 'اختر مجالات الاستعلام التي ينبغي تطبيقها عند استرداد الإدخالات القابلة للتحديد.', 'entries.config.search_index' => 'سيتم استخدام فهرس البحث المناسب تلقائيًا حيثما أمكن، ولكن يمكنك تحديد واحد صريح.', + 'entries.config.select_across_sites' => 'السماح باختيار الإدخالات من مواقع أخرى. هذا يعطل أيضًا خيارات التحديد حسب الموقع على الواجهة الأمامية. لمزيد من المعلومات، راجع [الوثائق](https://statamic.dev/fieldtypes/entries#select-across-sites).', 'entries.title' => 'إدخالات', 'float.title' => 'عائم', 'form.config.max_items' => 'حدد الحد الأقصى لعدد النماذج القابلة للتحديد.', diff --git a/resources/lang/ar/messages.php b/resources/lang/ar/messages.php index 6850245b57..41d6b67761 100644 --- a/resources/lang/ar/messages.php +++ b/resources/lang/ar/messages.php @@ -69,6 +69,7 @@ 'collections_sort_direction_instructions' => 'اتجاه الفرز الافتراضي.', 'collections_preview_target_refresh_instructions' => 'تحديث المعاينة تلقائيًا أثناء التحرير. تعطيل ذلك سيستخدم postMessage.', 'collections_taxonomies_instructions' => 'ربط الإدخالات في هذه المجموعة بالتصنيفات. ستتم إضافة الحقول تلقائيًا إلى نماذج النشر.', + 'dictionaries_countries_region_instructions' => 'قم بتصفية البلدان حسب المنطقة إذا لزم الأمر.', 'duplicate_action_warning_localization' => 'هذا الإدخال هو تخصيص محلي. سيتم تكرار المحتوى الأصلي.', 'duplicate_action_warning_localizations' => 'أحد الإدخالات المحددة أو أكثر هي تخصيصات محلية. في هذه الحالات، سيتم تكرار المحتوى الأصلي بدلاً من ذلك.', 'duplicate_action_localizations_confirmation' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟ سيتم أيضًا تكرار التخصيصات.', @@ -134,8 +135,8 @@ 'git_disabled' => 'تكامل Git مع ستاتاميك غير مفعل حاليًا.', 'git_nothing_to_commit' => 'لا يوجد شيء لتسليمه، مسارات المحتوى نظيفة!', 'git_utility_description' => 'إدارة المحتوى الذي تتبعه Git.', - 'global_search_open_using_slash' => 'ركز على البحث العالمي باستخدام مفتاح /', - 'global_set_config_intro' => 'تدير العموميات المحتوى المتاح عبر الموقع بأكمله، مثل تفاصيل الشركة، معلومات الاتصال، أو إعدادات الواجهة الأمامية.', + 'global_search_open_using_slash' => 'ركز على البحث العام باستخدام مفتاح /', + 'global_set_config_intro' => 'تدير المجوعات العامة المحتوى المتاح عبر الموقع بأكمله، مثل تفاصيل الشركة، معلومات الاتصال، أو إعدادات الواجهة الأمامية.', 'global_set_no_fields_description' => 'يمكنك إضافة حقول إلى المخطط، أو يمكنك إضافة المتغيرات يدويًا إلى المجموعة نفسها.', 'globals_blueprint_instructions' => 'يحدد الحقول التي ستُعرض عند تحرير المتغيرات.', 'globals_configure_handle_instructions' => 'يستخدم للإشارة إلى هذه المجموعة العامة على الواجهة الأمامية. من الصعب تغييره لاحقًا.', @@ -167,6 +168,7 @@ 'navigation_configure_collections_instructions' => 'تمكين الربط بالمحتويات في هذه المجموعات.', 'navigation_configure_handle_instructions' => 'يستخدم للإشارة إلى هذه قائمة التنقل على الواجهة الأمامية. من الصعب تغييره لاحقًا.', 'navigation_configure_intro' => 'التنقلات هي قوائم متعددة المستويات من الروابط التي يمكن استخدامها لبناء شريط التنقل، التذييل، خرائط الموقع، وأشكال أخرى من قوائم التنقل الأمامي.', + 'navigation_configure_select_across_sites' => 'السماح باختيار الإدخالات من المواقع الأخرى.', 'navigation_configure_settings_intro' => 'تمكين الربط بالمجموعات، تعيين الحد الأقصى للعمق، وسلوكيات أخرى.', 'navigation_configure_title_instructions' => 'نوصي باسم يتوافق مع المكان الذي سيتم استخدامه فيه، مثل "قائمة التنقل الرئيسي" أو " قائمة تنقل التذييل".', 'navigation_documentation_instructions' => 'تعلم المزيد عن بناء وتكوين وعرض قائمة التنقلات.', diff --git a/resources/lang/ar/permissions.php b/resources/lang/ar/permissions.php index 21ecc3757b..6c30f572c3 100644 --- a/resources/lang/ar/permissions.php +++ b/resources/lang/ar/permissions.php @@ -44,10 +44,10 @@ 'configure_navs_desc' => 'يمنح الوصول إلى جميع الأذونات المتعلقة بالتنقل', 'view_{nav}_nav' => 'عرض تنقل :nav', 'edit_{nav}_nav' => 'تحرير التنقل', - 'group_globals' => 'العموميات', - 'configure_globals' => 'تكوين العموميات', - 'configure_globals_desc' => 'يمنح الوصول إلى جميع الأذونات المتعلقة بالعموميات', - 'edit_{global}_globals' => 'تحرير عموميات :global', + 'group_globals' => 'المتغيرات العامة', + 'configure_globals' => 'تكوين المتغيرات العامة', + 'configure_globals_desc' => 'يمنح الوصول إلى جميع الأذونات المتعلقة بالمتغيرات العامة', + 'edit_{global}_globals' => 'تحرير متغيرات :global', 'group_assets' => 'الأصول', 'configure_asset_containers' => 'تكوين حاويات الأصول', 'configure_asset_containers_desc' => 'يمنح الوصول إلى جميع الأذونات المتعلقة بالأصول', From c074337c4474c418a49d33470b7b19e77647d6f4 Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Mon, 5 Aug 2024 16:31:42 +0200 Subject: [PATCH 046/249] [5.x] Add placeholder option to integer fieldtype (#10566) --- resources/js/components/fieldtypes/IntegerFieldtype.vue | 1 + src/Fieldtypes/Integer.php | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/resources/js/components/fieldtypes/IntegerFieldtype.vue b/resources/js/components/fieldtypes/IntegerFieldtype.vue index e46f1b04bd..5cde8e2b61 100644 --- a/resources/js/components/fieldtypes/IntegerFieldtype.vue +++ b/resources/js/components/fieldtypes/IntegerFieldtype.vue @@ -10,6 +10,7 @@ :min="config.min" :prepend="__(config.prepend)" :append="__(config.append)" + :placeholder="__(config.placeholder)" @input="updateDebounced" @focus="$emit('focus')" @blur="$emit('blur')" diff --git a/src/Fieldtypes/Integer.php b/src/Fieldtypes/Integer.php index a988395107..3aae51a1e8 100644 --- a/src/Fieldtypes/Integer.php +++ b/src/Fieldtypes/Integer.php @@ -17,6 +17,11 @@ protected function configFieldItems(): array [ 'display' => __('Behavior'), 'fields' => [ + 'placeholder' => [ + 'display' => __('Placeholder'), + 'instructions' => __('statamic::fieldtypes.text.config.placeholder'), + 'type' => 'text', + ], 'default' => [ 'display' => __('Default Value'), 'instructions' => __('statamic::messages.fields_default_instructions'), From 68a808e6de6f602283645690c9ffa7baa22f6cfe Mon Sep 17 00:00:00 2001 From: Philipp Daun Date: Mon, 5 Aug 2024 16:34:55 +0200 Subject: [PATCH 047/249] [5.x] Display replicator preview of link fields (#10569) Co-authored-by: Jason Varga --- .../js/components/fieldtypes/LinkFieldtype.vue | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/resources/js/components/fieldtypes/LinkFieldtype.vue b/resources/js/components/fieldtypes/LinkFieldtype.vue index dffacc3fd5..16f09af95a 100644 --- a/resources/js/components/fieldtypes/LinkFieldtype.vue +++ b/resources/js/components/fieldtypes/LinkFieldtype.vue @@ -83,6 +83,23 @@ export default { return this.selectedAssets.length ? `asset::${this.selectedAssets[0]}` : null + }, + + replicatorPreview() { + if (! this.showFieldPreviews || ! this.config.replicator_preview) return; + + switch (this.option) { + case 'url': + return this.urlValue; + case 'first-child': + return __('First child'); + case 'entry': + return data_get(this.meta, 'entry.meta.data.0.title', this.entryValue); + case 'asset': + return data_get(this.meta, 'asset.meta.data.0.basename', this.assetValue); + } + + return this.value; } }, From 3a990e373bd31d6e6e81f2329fdcb3c79c7935ea Mon Sep 17 00:00:00 2001 From: Martin Koch Andersen Date: Mon, 5 Aug 2024 16:38:04 +0200 Subject: [PATCH 048/249] [5.x] Fix NullLockStore (disabling of Stache locking) (#10560) --- src/Stache/NullLockStore.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Stache/NullLockStore.php b/src/Stache/NullLockStore.php index e8122e9254..f25da7fda6 100644 --- a/src/Stache/NullLockStore.php +++ b/src/Stache/NullLockStore.php @@ -7,27 +7,27 @@ class NullLockStore implements BlockingStoreInterface { - public function save(Key $key) + public function save(Key $key): void { // } - public function delete(Key $key) + public function delete(Key $key): void { // } - public function exists(Key $key) + public function exists(Key $key): bool { - // + return false; } - public function putOffExpiration(Key $key, float $ttl) + public function putOffExpiration(Key $key, float $ttl): void { // } - public function waitAndSave(Key $key) + public function waitAndSave(Key $key): void { // } From 82f006830e7ee22a04599c1b602a2c5a6dea9bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Heidk=C3=A4mper?= <10990014+heidkaemper@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:42:42 +0200 Subject: [PATCH 049/249] [5.x] Clean up duplicate tailwind classes (#10562) --- resources/css/elements/buttons.css | 2 +- resources/js/components/inputs/relationship/Selector.vue | 2 +- resources/views/auth/protect/password.antlers.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/css/elements/buttons.css b/resources/css/elements/buttons.css index a42524054e..5c0767a3b6 100644 --- a/resources/css/elements/buttons.css +++ b/resources/css/elements/buttons.css @@ -112,7 +112,7 @@ button { /* Earth isn't flat but these buttons are */ .btn-flat { - @apply text-white text-gray-800 dark:text-dark-150 bg-gray-300 dark:bg-dark-700 flex items-center; + @apply text-gray-800 dark:text-dark-150 bg-gray-300 dark:bg-dark-700 flex items-center; position: inherit; &:hover:not(:disabled), &:active:not(:disabled), &.active { diff --git a/resources/js/components/inputs/relationship/Selector.vue b/resources/js/components/inputs/relationship/Selector.vue index c4903464af..9bb3462ee3 100644 --- a/resources/js/components/inputs/relationship/Selector.vue +++ b/resources/js/components/inputs/relationship/Selector.vue @@ -109,7 +109,7 @@