+
+Inglizcha | [Xitoycha](/zh_CN/README.md)
+
+## Goravel haqida
+
+Goravel - bu Gopherlar o'z ilovalarini tezda qurishlariga yordam berish uchun boshlang'ich qolipni taqdim etadigan, to'liq imkoniyatli, masshtablanadigan veb-ilova freymvorkidir.
+
+Freymvork uslubi [Laravel](https://laravel.com/) bilan mos keladi, shuning uchun PHP dasturchilari yangi reymvorkni o‘rganishga muhtoj emas va Golang bilan ishlashdan zavqlanishlari mumkin, Laravelga hurmat bilan!
+
+Biz yulduzlar, PR-lar va muammolarni qabul qilamiz!
+
+## Hujjatlar
+
+Onlayn hujjatlar [https://www.goravel.dev](https://www.goravel.dev)
+
+Namuna [https://github.com/goravel/example](https://github.com/goravel/example)
+
+> Hujjatni optimallashtirish uchun iltimos, hujjatlar omboriga PR yuboring [https://github.com/goravel/docs](https://github.com/goravel/docs)
+
+## Asosiy belgilari
+
+| Modul nomi | Tavsifi |
+| ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| [Artisan Console](https://www.goravel.dev/digging-deeper/artisan-console.html) | Ilova boshqaruvi va avtomatlashtirish uchun CLI buyruq qatori interfeysi |
+| [Authentication](https://www.goravel.dev/security/authentication.html) | Foydalanuvchi identifikatsiyasini JWT va Session haydovchilari bilan tekshirish |
+| [Authorization](https://www.goravel.dev/security/authorization.html) | Siyosat va darvozalar yordamida ruxsat asosidagi kirish nazorati |
+| [Cache](https://www.goravel.dev/digging-deeper/cache.html) | Ma'lumotlarni xotira, Redis yoki maxsus drayverlar yordamida saqlang va oling |
+| [Carbon](https://www.goravel.dev/digging-deeper/helpers.html) | Sana va vaqt manipulyatsiyasi uchun yordamchi funksiyalar |
+| [Konfiguratsiya](https://www.goravel.dev/getting-started/configuration.html) | Fayllar va muhitdan ilova konfiguratsiyasini boshqarish |
+| [Kriptlash](https://www.goravel.dev/security/encryption.html) | Xavfsiz ma'lumotlarni shifrlash va shifrdan ochish vositalari |
+| [MB](https://www.goravel.dev/database/getting-started.html) | Ma'lumotlar bazasi so'rov quruvchisi |
+| [Hodisa](https://www.goravel.dev/digging-deeper/event.html) | Ilova hodisalarini tarqatish va tinglash tizimi |
+| [Fabrika](https://www.goravel.dev/orm/factories.html) | Test maqsadlari uchun soxta model ma'lumotlarini yaratish |
+| [FileStorage](https://www.goravel.dev/digging-deeper/filesystem.html) | Fayl yuklash, yuklab olish va bir nechta haydovchilar orqali saqlash |
+| [Grpc](https://www.goravel.dev/the-basics/grpc.html) | Yuqori samaradorlikdagi gRPC server va mijoz amalga oshirilishi |
+| [Hash](https://www.goravel.dev/security/hashing.html) | Xavfsiz parol xeshlash |
+| [Http](https://www.goravel.dev/the-basics/routing.html) | HTTP marshrutlash, kontrollerlar va middleware boshqaruv |
+| [Http Client](https://www.goravel.dev/digging-deeper/http-client.html) | Tashqi API va xizmatlarga HTTP so‘rovlarni amalga oshiring |
+| [Lokalizatsiya](https://www.goravel.dev/digging-deeper/localization.html) | Ko'p tilli tarjima va til sozlamalarini boshqarish |
+| [Logger](https://www.goravel.dev/the-basics/logging.html) | Ilovalarni fayllarga, konsolga yoki tashqi xizmatlarga yozish |
+| [Pochta](https://www.goravel.dev/digging-deeper/mail.html) | SMTP or navbatga asoslangan yetkazib berish orqali elektron pochta xabarlarini yuboring |
+| [Mock](https://www.goravel.dev/testing/mock.html) | Fasadlar va qaramliklar uchun sinov namunalarini yarating |
+| [Migrate](https://www.goravel.dev/database/migrations.html) | Ma'lumotlar bazasi sxemasi o'zgarishlari uchun versiyalarni boshqarish |
+| [Orm](https://www.goravel.dev/orm/getting-started.html) | Ma'lumotlar bazasi operatsiyalari uchun nafis Orm amalga oshirilishi |
+| [Paketni Ishlab Chiqish](https://www.goravel.dev/digging-deeper/package-development.html) | Freymvork funksiyalarini kengaytirish uchun qayta ishlatiladigan paketlar yarating |
+| [Jarayon](https://www.goravel.dev/digging-deeper/process.html) | Go standart `os/exec` paketi atrofida ifodali va nafis API |
+| [Navbat](https://www.goravel.dev/digging-deeper/queues.html) | Vaqt talab qiladigan vazifalarni orqa fondagi ish jarayoniga topshirish |
+| [Seeder](https://www.goravel.dev/database/seeding.html) | Ma'lumotlar bazasi jadvallarini sinov yoki boshlang'ich ma'lumotlar bilan to'ldiring |
+| [Sessiya](https://www.goravel.dev/the-basics/session.html) | HTTP so'rovlari bo'ylab foydalanuvchi sessiyasi ma'lumotlarini boshqarish |
+| [Vazifa rejalashtirish](https://www.goravel.dev/digging-deeper/task-scheduling.html) | Cron-ga o'xshash ifodalar yordamida takrorlanuvchi vazifalarni rejalashtiring |
+| [Testlash](https://www.goravel.dev/testing/getting-started.html) | HTTP testlash, mocklash va tasdiqlash vositalari |
+| [Tekshirish](https://www.goravel.dev/the-basics/validation.html) | Qoidalardan foydalanib kiruvchi so'rov ma'lumotlarini tekshirish |
+| [Koʻrish](https://www.goravel.dev/the-basics/views.html) | HTML javoblar uchun shablonlarni ko'rsatish dvigateli |
+
+## Laravel bilan solishtiring
+
+[Batafsil ma'lumot uchun](https://www.goravel.dev/prologue/compare-with-laravel.html)
+
+## Yo'l xaritasi
+
+[Tafsilot uchun](https://github.com/goravel/goravel/issues?q=is%3Aissue+is%3Aopen)
+
+## Ajoyib Kengaytiruvchi Paketlar
+
+[Tafsilotlar uchun](https://www.goravel.dev/getting-started/packages.html)
+
+## Hissa qo'shuvchilar
+
+Bu loyiha har bir hissa qo'shgan insonlar tufayli amalga oshirildi. Hisob qilish uchun, iltimos, [Hisob qilish Qo‘llanmasi](prologue/contributions.md) bilan maslahatlashing.
+
+<0><1>0>
+<2><3>2>
+<4><5>4>
+<6><7>6>
+<8><9>8>
+<10><11>10>
+<12><13>12>
+<14><15>14>
+<16><17>16>
+<18><19>18>
+<20><21>20>
+<22><23>22>
+<24><25>24>
+<26><27>26>
+<28><29>28>
+<30><31>30>
+<32><33>32>
+<34><35>34>
+<36><37>36>
+<38><39>38>
+<40><41>40>
+<42><43>42>
+<44><45>44>
+<46><47>46>
+<48><49>48>
+<50><51>50>
+<52><53>52>
+<54><55>54>
+<56><57>56>
+<58><59>58>
+<60><61>60>
+<62><63>62>
+<64><65>64>
+<66><67>66>
+<68><69>68>
+<70><71>70>
+<72><73>72>
+<74><75>74>
+
+## Homiylar
+
+Loyihaning yaxshi rivojlanishi sizning qo‘llab-quvvatlashingizsiz bo‘lmaydi, bizni [Open Collective](https://opencollective.com/goravel) orqali mukofotlang.
+
+
+
+## Guruh
+
+Discordda ko'proq muhokamani xush ko'ramiz.
+
+[https://discord.gg/cFc5csczzS](https://discord.gg/cFc5csczzS)
+
+## Litsenziya
+
+Goravel frameworki MIT litsenziyasi ostida litsenziyalangan ochiq manbali dasturiy ta'minotdir [MIT litsenziyasi](https://opensource.org/licenses/MIT).
diff --git a/uz_UZ/architecture-concepts/facades.md b/uz_UZ/architecture-concepts/facades.md
new file mode 100644
index 000000000..cd6f4cf12
--- /dev/null
+++ b/uz_UZ/architecture-concepts/facades.md
@@ -0,0 +1,69 @@
+# Fasadlar
+
+[[toc]]
+
+## Kirish
+
+`facades` ilova yadrosining asosiy funksiyalari uchun "static" interfeysni ta'minlaydi va ko'proq moslashuvchan, chiroyli va sinov o'tkazish oson bo'lgan sintaksisni taqdim etadi. Goravel’ning barcha facadelari app/facades papkasi ichida joylashgan:
+
+```go
+import "app/facades"
+
+facades.Config().GetString("app.host")
+
+```
+
+## Fasadlar qanday ishlaydi
+
+Har bir xizmat ko'rsatuvchi o'zining mos bog'lanishlarini xizmat konteynerida ro'yxatdan o'tkazadi, so'ngra xizmat konteyneri bog'lanish namunalarini yaratish uchun turli `Make*` funksiyalarini taqdim etadi. `app/facades` papkasidagi `facades`lar xizmat konteyneridan namunalarni olish uchun ushbu `Make*` funksiyalarini chaqiradi. Keling, `Route` fasadini misol sifatida ishlatamiz:
+
+1. `Route` xizmat provayderi xizmat konteynerida `binding.Route` bog'lanishini ro'yxatdan o'tkazadi:
+
+```go
+type ServiceProvider struct {}
+
+func (r *ServiceProvider) Register(app foundation.Application) {
+ app.Singleton(binding.Route, func(app foundation.Application) (any, error) {
+ return NewRoute(app.MakeConfig())
+ })
+}
+
+func (r *ServiceProvider) Boot(app foundation.Application) {}
+```
+
+2. `Route` fasadı `MakeRoute()` funksiyasini chaqirib, xizmat konteyneridan `Route` vorislarini olish uchun:
+
+```go
+// app/facades/route.go
+package facades
+
+import (
+ "github.com/goravel/framework/contracts/route"
+)
+
+func Route() route.Route {
+ return App().MakeRoute()
+}
+```
+
+> `facades` ilovaga ochiq bo'lganligi sababli, siz o'zingizning `facades`laringizni yaratishingiz yoki mavjud `facades`larni `app/facades` papkasida almashtirishingiz mumkin.
+
+## Fasadlarni o'rnatish/o'chirish
+
+[goravel/goravel](https://github.com/goravel/goravel) standart boʻyicha barcha `facade`larni oʻrnatadi va [goravel/goravel-lite](https://github.com/goravel/goravel-lite) faqat `Artisan`, `Config` kabi muhim `facade`larni oʻrnatadi. Siz "package:install" va "package:uninstall" buyruqlari orqali boshqa `facades`larni kerak bo‘lganda o‘rnatishingiz yoki o‘chirishingiz mumkin.
+
+```shell
+# Muayyan fasadni o'rnatish
+./artisan package:install Route
+
+# Barcha fasadlarni o'rnatish
+./artisan package:install --all
+
+# Standart drayverlar bilan barcha fasadlarni o'rnatish
+./artisan package:install --all --default
+
+# Muayyan fasadni o'chirish
+./artisan package:uninstall Route
+```
+
+> Eslatma: agar siz `./artisan package:install` buyrug'i orqali `facades`ni qo'lda tanlashni istasangiz, o'rnatmoqchi bo'lgan fasadlarni tanlash uchun `x` tugmasini bosing, so'ngra tasdiqlash uchun `Enter` tugmasini bosing. `facades` to'g'ridan-to'g'ri `Enter` tugmasini bosganingizda tanlanmaydi.
diff --git a/uz_UZ/architecture-concepts/request-lifecycle.md b/uz_UZ/architecture-concepts/request-lifecycle.md
new file mode 100644
index 000000000..bdf9b3263
--- /dev/null
+++ b/uz_UZ/architecture-concepts/request-lifecycle.md
@@ -0,0 +1,28 @@
+# So‘rovning ishlash jarayoni
+
+[[toc]]
+
+## Kirish
+
+Har qanday vositadan real hayotda foydalanish, uning qanday ishlashini bilganingizda yanada intuitiv va tushunarli bo‘ladi. Ushbu hujjat sizga Goravel qanday ishlashini aniq va umumiy darajada tushuntirib berishni maqsad qiladi. Agar har bir atamani darhol to'g'ri tushunmasangiz, tashvishlanmang - faqat narsalar qanday ishlashini asosiy ma'noda tushunishga harakat qiling, va siz qo'llanmaning qolgan qismini o'rganayotganda bilimingiz o'sib boradi.
+
+## Ishlash jarayonining umumiy tavsifi
+
+1. `main.go` ilova kirish nuqtasi hisoblanadi, u `bootstrap.Boot()` funksiyasini chaqirib freymvorkni ishga tushiradi va `app.Wait()` yordamida ilovani ishlashda saqlaydi.
+
+2. `bootstrap.Boot()` funksiyasi `foundation.Setup()`ni chaqirib, yangi Goravel ilova namunasini ishga tushiradi, siz bu yerda `With*` funksiyalari orqali xizmat provayderlari, marshrutlar va migratsiyalar, jadvallar kabi boshqa sozlamalarni o‘rnatishingiz mumkin. Oxirida, ilovani ishga tushirish uchun Create() metodini chaqiring.
+
+3. `Create()` usulida, avval konfiguratsiya yuklanadi, so'ngra barcha xizmat provayderlari va boshqa sozlamalar ro'yxatdan o'tkaziladi. Oxirida, barcha service providerlarni ishga tushirib, ilova vorisini qaytaring.
+
+4. Ilova yaratilgandan so'ng, siz ushbu bosqichda barcha fasadlarni odatdagidek ishlatishingiz mumkin, lekin esda tutingki, sizning moslashtirilgan kodingiz `main.go` faylida `app.Start()` dan oldin joylashtirilishi kerak. Yoki ilova yaratilgandan keyin kodingiz bajarilishini ta'minlash uchun `bootstrap/app.go` faylidagi `WithCallback` funksiyasiga kodingizni qo'shishingiz mumkin. app.Start() ishga tushirilganda, agar siz ularni sozlagan bo‘lsangiz, HTTP yoki gRPC server avtomatik tarzda ishga tushadi.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ // Bu yerda sizning maxsus kodingiz, barcha fasadlar bu yerda mavjud.
+ }).
+ Create()
+}
+```
diff --git a/uz_UZ/architecture-concepts/service-container.md b/uz_UZ/architecture-concepts/service-container.md
new file mode 100644
index 000000000..c4f6db47d
--- /dev/null
+++ b/uz_UZ/architecture-concepts/service-container.md
@@ -0,0 +1,97 @@
+# Xizmat Konteyneri
+
+[[toc]]
+
+## Kirish
+
+Goravel xizmat konteyneri sinf bog'liqliklarini boshqarish va bog'liqlik in'ektsiyasini amalga oshirish uchun kuchli vosita hisoblanadi. U Goravelning barcha modullarini o'z ichiga oladi va sizga o'z xizmatlaringizni konteynerga bog'lash va kerak bo'lganda ularni hal qilish imkonini beradi. Xizmat konteyneri Goravel atrofidagi uchinchi tomon paketlari uchun kuchli qo'llab-quvvatlashni ta'minlaydi.
+
+## Bog'lash
+
+### Oddiy bog‘lamalar
+
+Sizning xizmat konteyneringiz bog‘lanishlarining deyarli barchasi [xizmat provayderlari](./service-providers.md) ichida ro‘yxatdan o‘tkaziladi. Xizmat ko'rsatuvchi provayder ichida siz har doim konteynerga `app` parametri orqali kirishingiz mumkin, so'ngra `Bind` metodidan foydalanib bog'lashni ro'yxatdan o'tkazing, ro'yxatdan o'tkazmoqchi bo'lgan `key`ni va sinf namunasini qaytaruvchi yopilishni (closure) o'tkazing:
+
+```go
+package route
+
+import (
+ "github.com/goravel/framework/contracts/foundation"
+)
+
+const Binding = "goravel.route"
+
+type ServiceProvider struct {}
+
+func (route *ServiceProvider) Register(app foundation.Application) {
+ app.Bind(Binding, func(app foundation.Application) (any, error) {
+ return NewRoute(app.MakeConfig()), nil
+ })
+}
+
+func (route *ServiceProvider) Boot(app foundation.Application) {}
+```
+
+Aytilganidek, odatda siz xizmat ko'rsatuvchi provayderlar ichida konteyner bilan ishlaysiz; biroq, agar siz xizmat ko'rsatuvchi provayderdan tashqarida konteyner bilan ishlashni istasangiz, `App` fasad orqali buni amalga oshirishingiz mumkin:
+
+```go
+facades.App().Bind("key", func(app foundation.Application) (any, error) {
+ ...
+})
+```
+
+### Singleton bog'lash
+
+`Singleton` usuli sinf yoki interfeysni konteynerga bir marta hal qilinishi kerak bo'lgan holda bog'laydi. Bir marta singleton bog'lash hal qilingandan so'ng, konteynerga keyingi chaqiruvlarda bir xil ob'ekt namunasi qaytariladi:
+
+```go
+app.Singleton(kalit, func(app foundation.Application) (any, error) {
+ return NewGin(app.MakeConfig()), nil
+})
+```
+
+### Instanslarni bog'lash
+
+Shuningdek, siz `Instance` usuli yordamida mavjud obyekt namunasini konteynerga bog‘lashingiz mumkin. Berilgan instansiya har doim konteynerga keyingi chaqiruvlarda qaytariladi:
+
+```go
+app.Instance(key, instance)
+```
+
+### Parametr bilan bog'lash
+
+Agar xizmat provayderini yaratish uchun qo'shimcha parametrlar kerak bo'lsa, `BindWith` metodidan foydalanib, parametrlarni yopishga o'tkazishingiz mumkin:
+
+```go
+app.BindWith(Binding, func(app foundation.Application, parameters map[string]any) (any, error) {
+ return NewRoute(app.MakeConfig()), nil
+})
+```
+
+## Hal qilish
+
+### `Make` usuli
+
+Siz konteynerdan sinf namunasini hal qilish uchun `Make` metodidan foydalanishingiz mumkin. `Make` usuli siz hal qilmoqchi bo'lgan `key` ni qabul qiladi:
+
+```go
+instance, err := app.Make(key)
+```
+
+Agar siz xizmat ko'rsatuvchi provayderdan tashqarida bo'lsangiz va kod joylashgan joyda `app` o'zgaruvchisiga kirish imkoni bo'lmasa, konteynerdan klass misolini olish uchun `App` fasadidan foydalanishingiz mumkin:
+
+```go
+instance, err := facades.App().Make(key)
+```
+
+### `MakeWith` metodi
+
+Agar sinfingizning ba'zi bog'liqliklari konteyner orqali hal qilinmasa, ularni `BindWith` bog'lash usuliga mos ravishda `MakeWith` usuliga assotsiativ massiv sifatida o'tkazib, ularni kiritishingiz mumkin:
+
+```go
+instance, err := app.MakeWith(key, map[string]any{"id": 1})
+```
+
+### Boshqa uslublar
+
+Framework turli fasadlarni tez hal qilish uchun qulay usullarni taqdim etadi: `MakeArtisan`, `MakeAuth` va boshqalar.
diff --git a/uz_UZ/architecture-concepts/service-providers.md b/uz_UZ/architecture-concepts/service-providers.md
new file mode 100644
index 000000000..98bd8917e
--- /dev/null
+++ b/uz_UZ/architecture-concepts/service-providers.md
@@ -0,0 +1,139 @@
+# Xizmat ko'rsatuvchilar
+
+[[toc]]
+
+## Kirish
+
+The most important thing in the kernel boot operation is to load the `ServiceProvider`. Ilovaning barcha `ServiceProvider`lari `bootstrap/providers.go` faylida sozlanadi.
+
+Avvalo, yadro barcha xizmat ko'rsatuvchilarning `Register` metodini chaqiradi. Barcha xizmat ko'rsatuvchilar ro'yxatdan o'tkazilgandan so'ng, yadro barcha `ServiceProvider`larning `Boot` metodini yana chaqiradi.
+
+`ServiceProvider` Goravel hayot tsiklining kalitidir. Ular freymvorkga turli komponentlarni, masalan, marshrutlash, ma'lumotlar bazasi, navbat, keshlash va hokazolarni o'z ichiga olish imkonini beradi.
+
+## Xizmat ko'rsatuvchini yaratish
+
+Xizmat ko'rsatuvchilar `Register` va `Boot` usullarini o'z ichiga oladi. `Register` usulida siz faqat [xizmat konteyneriga](./service-container.md) narsalarni bog'lashingiz kerak. Siz hech qachon `Register` usulida hech qanday hodisa tinglovchilarini, marshrutlarni yoki boshqa funksionallikni ro'yxatdan o'tkazishga urinmang, buning uchun `Boot` usulidan foydalaning.
+
+```bash
+./artisan make:provider SizningXizmatKo‘rsatuvchiProvayderingizNomi
+```
+
+Artisan CLI `make:provider` buyrug'i orqali yangi provayder yaratish mumkin. Yangi xizmat ko'rsatuvchi provayder `bootstrap/providers.go::Providers()` funksiyasida avtomatik ravishda ro'yxatdan o'tkaziladi va funksiya `WithProviders` tomonidan chaqiriladi.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithProvders(Providers).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Qaramlik munosabati
+
+`ServiceProvider` `Relationship()` ixtiyoriy usulini taqdim etadi `binding.Relationship`, bog'liqlik munosabatini e'lon qilish uchun ishlatiladi, ushbu usulni o'rnatgan `ServiceProvider` ro'yxatga olish tartibiga bog'liq bo'lmaydi, va uni o'rnatmagan `ServiceProvider` oxirgi ro'yxatga olinadi, masalan:
+
+```go
+type ServiceProvider struct {}
+
+func (r *ServiceProvider) Relationship() binding.Relationship {
+ return binding.Relationship{
+ Bindings: []string{
+ "custom",
+ },
+ Dependencies: []string{
+ binding.Config,
+ },
+ ProvideFor: []string{
+ binding.Cache,
+ },
+ }
+}
+
+func (r *ServiceProvider) Register(app foundation.Application) {
+ app.Singleton("custom", func(app foundation.Application) (any, error) {
+ return New()
+ })
+}
+
+func (r *ServiceProvider) Boot(app foundation.Application) {}
+```
+
+## Ishlovchilar
+
+`ServiceProvider` ilovani ishga tushirishda ba'zi kodlarni ishga tushirish uchun `Runners` interfeysini ham amalga oshirishi mumkin. Bu odatda `ServiceProvider` da aniqlangan xizmatni ishga tushirish yoki o'chirish uchun ishlatiladi. Masalan: `Route`, `Schedule`, `Queue`, va boshqalar. Endi siz bu xizmatlarni `main.go` faylidagi `Runners` bilan ishga tushirish/to‘xtatish shart emas, Goravel buning o‘zini qiladi.
+
+`Runner` uchta usulni o'z ichiga oladi: `ShouldRun()`, `Run()`, va `Shutdown()`.
+
+```go
+type Runner interface {
+ // ShouldRun determines whether the runner should be executed.
+ ShouldRun() bool
+ // Run starts the runner.
+ Run() error
+ // Shutdown gracefully stops the runner.
+ Shutdown() error
+}
+```
+
+`ServiceProvider` ichida `Route` xizmatini ishga tushirish va o‘chirish uchun aniqlangan `RouteRunner` misoli mavjud.
+
+```go
+type ServiceProvider struct {}
+
+func (r *ServiceProvider) Register(app foundation.Application) {}
+
+func (r *ServiceProvider) Boot(app foundation.Application) {}
+
+func (r *ServiceProvider) Runners(app foundation.Application) []foundation.Runner {
+ return []foundation.Runner{NewRouteRunner(app.MakeConfig(), app.MakeRoute())}
+}
+```
+
+```go
+package route
+
+import (
+ "github.com/goravel/framework/contracts/config"
+ "github.com/goravel/framework/contracts/route"
+)
+
+type RouteRunner struct {
+ config config.Config
+ route route.Route
+}
+
+func NewRouteRunner(config config.Config, route route.Route) *RouteRunner {
+ return &RouteRunner{
+ config: config,
+ route: route,
+ }
+}
+
+func (r *RouteRunner) ShouldRun() bool {
+ return r.route != nil && r.config.GetString("http.default") != ""
+}
+
+func (r *RouteRunner) Run() error {
+ return r.route.Run()
+}
+
+func (r *RouteRunner) Shutdown() error {
+ return r.route.Shutdown()
+}
+```
+
+Ilovani ishga tushirishda ba'zi kodni ishga tushirish uchun `bootstrap/app.go::WithRunners` funksiyasida o'zingizning `Runner`ingizni ro'yxatdan o'tkazishingiz mumkin.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithRunners(func() []foundation.Runner{
+ return []foundation.Runner{
+ NewYourCustomRunner(),
+ }
+ }).
+ Create()
+}
+```
diff --git a/uz_UZ/database/getting-started.md b/uz_UZ/database/getting-started.md
new file mode 100644
index 000000000..894685198
--- /dev/null
+++ b/uz_UZ/database/getting-started.md
@@ -0,0 +1,184 @@
+# Boshlash
+
+[[toc]]
+
+## Kirish
+
+Deyarli barcha ilovalar ma'lumotlar bazalari bilan o'zaro aloqada bo'lishi kerak, shuning uchun Goravel juda oddiy va qulay ma'lumotlar bazasi o'zaro aloqasini taqdim etadi. Dasturchilar ma'lumotlar bazalari bilan ishlash uchun native SQL, so'rov quruvchi va [Orm](../orm/getting-started) dan foydalanishlari mumkin. Hozirda Goravel quyidagi to'rtta ma'lumotlar bazasini rasmiy qo'llab-quvvatlaydi:
+
+| Ma'lumotlar bazasi | Haydovchi |
+| ------------------ | ------------------------------------------------------------------------------------ |
+| PostgreSQL | [github.com/goravel/postgres](https://github.com/goravel/postgres) |
+| MySQL | [github.com/goravel/mysql](https://github.com/goravel/mysql) |
+| SQL Server | [github.com/goravel/sqlserver](https://github.com/goravel/sqlserver) |
+| SQLite | [github.com/goravel/sqlite](https://github.com/goravel/sqlite) |
+
+## Konfiguratsiya
+
+Ma'lumotlar bazasi konfiguratsiya fayli `config/database.go` faylidir. Siz ushbu faylda barcha ma'lumotlar bazasi ulanishlarini sozlashingiz va standart ma'lumotlar bazasi ulanishini belgilashingiz mumkin. Ushbu fayldagi konfiguratsiyaning aksariyati loyihaning muhit o'zgaruvchilari asosida qurilgan.
+
+### Ulanish havzasi
+
+Siz konfiguratsiya faylida ma'lumotlar bazasi ulanish havzasini sozlashingiz mumkin, bu esa ulanish havzasi parametrlarini to'g'ri sozlash orqali bir vaqtning o'zida ishlash samaradorligini oshirishga yordam beradi:
+
+| Konfiguratsiya kaliti | Tavsif |
+| -------------------------------------------------------------------------------- | --------------------------------- |
+| pool.max_idle_conns | Maksimal bo‘sh ulanishlar |
+| pool.max_open_conns | Maksimal ulanishlar |
+| pool.conn_max_idletime | Ulanishning maksimal ishsiz vaqti |
+| pool.conn_max_lifetime | Ulanishning maksimal umri |
+
+### O‘qish-yozishni ajratish
+
+Ba'zan siz `SELECT` so'rovlarini bajarish uchun ma'lumotlar bazasi ulanishidan foydalanishingiz mumkin, shu bilan birga `INSERT`, `UPDATE` va `DELETE` so'rovlari boshqa ma'lumotlar bazasi ulanishi tomonidan bajarilishi mumkin. Goravelda o'qish-yozishni ajratishni amalga oshirish oson.
+
+```go
+import "github.com/goravel/framework/contracts/database"
+
+// config/database.go
+"connections": map[string]any{
+ "mysql": map[string]any{
+ "driver": "mysql",
+ "read": []database.Config{
+ {Host: "192.168.1.1", Port: 3306, Database: "forge", Username: "root", Password: "123123"},
+ },
+ "write": []database.Config{
+ {Host: "192.168.1.2", Port: 3306, Database: "forge", Username: "root", Password: "123123"},
+ },
+ "host": config.Env("DB_HOST", "127.0.0.1"),
+ "port": config.Env("DB_PORT", 3306),
+ "database": config.Env("DB_DATABASE", "forge"),
+ "username": config.Env("DB_USERNAME", ""),
+ "password": config.Env("DB_PASSWORD", ""),
+ "charset": "utf8mb4",
+ },
+}
+```
+
+Biz ma'lumotlar bazasi konfiguratsiyasida `read` va `write` nomli ikkita kalit qo'shdik. `192.168.1.1` "o'qish" ulanishi uchun xost sifatida ishlatiladi, `192.168.1.2` esa "yozish" ulanishi uchun xost sifatida ishlatiladi. Bu ikki ulanish "mysql" massividagi ma'lumotlar bazasi prefiksi va belgilar kodlash kabi konfiguratsiyalarni baham ko'radi. Agar `read` yoki `write` massivlarida bir nechta qiymatlar bo'lsa, Goravel har bir ulanish uchun ma'lumotlar bazasi xostini tasodifiy tanlaydi.
+
+## Asl SQL so'rovlarini ishga tushirish
+
+Ma'lumotlar bazasi ulanishini sozlashdan so'ng, so'rovlarni bajarish uchun `facades.DB()` dan foydalanishingiz mumkin. `facades.DB()` turli xil so'rovlarni bajarish uchun bir qancha usullarni taqdim etadi: `Select`, `Insert`, `Update`, `Delete` va `Statement`.
+
+### Tanlash
+
+Oddiy so'rovlarni bajarish uchun `facades.DB().Select()` usulidan foydalaning:
+
+```go
+// Get multiple records
+var products []Product
+err := facades.DB().Select(&products, "SELECT * FROM products")
+
+// Get a single record
+var product Product
+err := facades.DB().Select(&product, "SELECT * FROM products WHERE id = ?", 1)
+```
+
+> Eslatma: Turli ma'lumotlar bazasi drayverlari turli joy egallovchilarni talab qiladi. Masalan, `?` belgisi MySQL uchun, `@` belgisi esa PostgreSQL uchun ishlatiladi.
+
+### Kiritish
+
+"facades.DB().Insert()" usulidan foydalanib, kiritish bayonotlarini bajarish uchun:
+
+```go
+result, err := facades.DB().Insert("insert into users (name, email) values (?, ?)", "Goravel", "goravel@example.com")
+```
+
+### Yangilash
+
+Yangilash bayonotlarini bajarish uchun `facades.DB().Update()` usulidan foydalaning:
+
+```go
+result, err := facades.DB().Update("update users set name = ? where id = ?", "Goravel", 1)
+```
+
+### O‘chirish
+
+O'chirish bayonotlarini bajarish uchun `facades.DB().Delete()` usulidan foydalaning:
+
+```go
+result, err := facades.DB().Delete("delete from users where id = ?", 1)
+```
+
+### Bayonot
+
+Umumiy bayonotlarni bajarish uchun `facades.DB().Statement()` usulidan foydalaning:
+
+```go
+err := facades.DB().Statement("drop table users")
+```
+
+### Bir nechta ma'lumotlar bazasi ulanishlaridan foydalanish
+
+Agar konfiguratsiya faylida bir nechta ma'lumotlar bazasi ulanishlarini belgilasangiz, `facades.DB().Connection()` usulini chaqirish orqali foydalaniladigan ulanishni ko'rsatishingiz mumkin:
+
+```go
+var user User
+err := facades.DB().Connection("postgres").Select(&user, "select * from users where id = ?", 1)
+```
+
+## Ma'lumotlar bazasi tranzaksiyalari
+
+Siz ma'lumotlar bazasi transaksiyasida bir qator operatsiyalarni bajarish uchun `facades.DB().Transaction()` usulidan foydalanishingiz mumkin. Agar tranzaksiya yopilishida istisno yuzaga kelsa, tranzaksiya avtomatik ravishda orqaga qaytariladi. Agar yopilish muvaffaqiyatli bajarilsa, tranzaksiya avtomatik ravishda tasdiqlanadi:
+
+```go
+mport "github.com/goravel/framework/contracts/database/db"
+
+err := facades.DB().Transaction(func(tx db.Tx) error {
+ _, err := tx.Table("products").Insert(Product{Name: "transaction product1"})
+
+ return err
+})
+```
+
+### Qo‘lda Tranzaksiyalardan Foydalanish
+
+Agar siz tranzaksiyaning boshlanishi, tasdiqlanishi va bekor qilinishini qo'lda boshqarishni istasangiz, `Begin`, `Commit` va `Rollback` metodlaridan foydalanishingiz mumkin:
+
+```go
+tx, err := facades.DB().BeginTransaction()
+if err != nil {
+ return err
+}
+
+_, err = tx.Insert("insert into users (name) values (?)", "Goravel")
+if err != nil {
+ tx.Rollback()
+ return err
+}
+
+err = tx.Commit()
+if err != nil {
+ return err
+}
+```
+
+## Ma'lumotlar bazalarini tekshirish
+
+### Ma'lumotlar bazasi haqida umumiy ma'lumot
+
+Goravel ma'lumotlar bazasining tuzilishini tushunishga yordam beradigan bir nechta Artisan buyruqlarini taqdim etadi.
+
+Siz ma'lumotlar bazasidagi barcha jadvallarni ko'rish uchun `db:show` buyrug'idan foydalanishingiz mumkin.
+
+```bash
+./artisan db:show
+./artisan db:show --database=postgres
+```
+
+Shuningdek, siz ma'lum bir jadvalning tuzilishini ko'rish uchun `db:table` buyrug'idan foydalanishingiz mumkin.
+
+```bash
+./artisan db:table
+./artisan db:table --database=postgres
+```
+
+### Jadvalga umumiy nazar
+
+Agar ma'lumotlar bazasidagi bitta jadvalni umumiy ko'rinishini olishni istasangiz, `db:table` Artisan buyrug'ini bajarishingiz mumkin. Bu buyruq ma'lumotlar bazasi jadvalining umumiy ko'rinishini taqdim etadi, jumladan uning ustunlari, turlari, atributlari, kalitlari va indekslari:
+
+```bash
+./artisan db:table users
+./artisan db:table users --database=postgres
+```
diff --git a/uz_UZ/database/migrations.md b/uz_UZ/database/migrations.md
new file mode 100644
index 000000000..f9e944146
--- /dev/null
+++ b/uz_UZ/database/migrations.md
@@ -0,0 +1,417 @@
+# Migratsiyalar
+
+[[toc]]
+
+## Kirish
+
+Bir necha odam ilovalarni ishlab chiqishda hamkorlik qilganda, sinxronizatsiya uchun standartlashtirilgan ma'lumotlar bazasi tuzilishiga ega bo'lish juda muhimdir. Bunisiz, har bir kishining individual ma'lumotlari mos kelmasligi sababli tartibsizlik yuzaga kelishi mumkin. Ma'lumotlar bazasi migratsiyasi bu muammoning yechimidir. Ma'lumotlar bazasi tuzilishi versiyalarni boshqarish orqali barcha ishlab chiquvchilar orasida uning izchilligini ta'minlash uchun nazorat qilinadi.
+
+## Konfiguratsiya
+
+Ma'lumotlar bazasi migratsiya fayllari `database/migrations` katalogida saqlanadi. Siz `config/database.go` faylida ma'lumotlar bazasi ulanish ma'lumotlarini sozlashingiz mumkin.
+
+```go
+"migratsiyalar": map[string]any{
+ // Siz migratsiyalar jadvalining nomini o'zgartirishingiz mumkin
+ "table": "migratsiyalar",
+}
+```
+
+## Migratsiyalarni yaratish
+
+Migratsiyani yaratish uchun `make:migration` buyrug'idan foydalaning:
+
+```shell
+./artisan make:migration
+./artisan make:migration create_users_table
+```
+
+Bu buyruq `database/migrations` katalogida migratsiya fayllarini yaratadi. Har bir migratsiya fayli vaqt belgisi bilan boshlanadi, Goravel migratsiya fayllarini bajarish tartibini aniqlash uchun undan foydalanadi.
+
+Shuningdek, siz `-m` yoki `--model` opsiyasidan foydalanib, ma'lum bir model uchun migratsiya yaratishingiz mumkin:
+
+```shell
+./artisan make:migration create_users_table -m User
+```
+
+Model buyrug'ni ishga tushirishdan oldin `bootstrap/app.go` faylida ro'yxatdan o'tkazilishi kerak. Bu buyruq `User` modelida belgilangan tuzilish asosida migratsiya faylini yaratadi.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.Schema().Extend(schema.Extension{
+ Models: []any{models.User{}},
+ })
+ }).
+ Create()
+}
+```
+
+### Tez yaratish
+
+`create_users_table` dan foydalanib, `users` jadvalining infratuzilmasini o'z ichiga olgan jadvalni avtomatik yarating:
+
+```
+^create_(\w+)_table$
+^create_(\w+)$
+```
+
+`users` jadvaliga maydonlar qo'shish uchun tuzilmani avtomatik yaratish uchun `add_avatar_to_users_table` dan foydalaning:
+
+```
+_(to|from|in)_(\w+)_table$
+_(to|from|in)_(\w+)$
+```
+
+Yuqoridagi shartlar bajarilmagan taqdirda, framework bo‘sh migratsiya faylini yaratadi.
+
+## Migratsiya tuzilmasi
+
+### Go Tili Migratsiyasi
+
+Migratsiya strukturasida ikkita metod mavjud: `Up` va `Down`. `Up` usuli ma'lumotlar bazasiga yangi jadvallar, ustunlar yoki indekslar qo'shish uchun ishlatiladi, `Down` usuli esa `Up` usuli tomonidan bajarilgan amallarni bekor qilish uchun ishlatiladi. Ushbu ikki usulda siz `facades.Schema()` yordamida ma'lumotlar bazasi jadvallarini yaratish va boshqarish mumkin. Mavjud usullar uchun [hujjat](#tables)ga qarang. Quyidagi migratsiya `users` jadvalini yaratadi:
+
+```go
+migratsiyalar paketi
+
+import (
+ "github.com/goravel/framework/contracts/database/schema"
+
+ "goravel/app/facades"
+)
+
+type M20241207095921CreateUsersTable struct {
+}
+
+// Imzo Migratsiyaning noyob imzosi.
+func (r *M20241207095921CreateUsersTable) Signature() string {
+ return "20241207095921_create_users_table"
+}
+
+// Yuqoriga Migratsiyalarni ishga tushiring.
+func (r *M20241207095921CreateUsersTable) Up() error {
+ if !facades.Schema().HasTable("users") {
+ return facades.Schema().Create("users", func(table schema.Blueprint) {
+ table.ID()
+ table.String("name").Nullable()
+ table.String("email").Nullable()
+ table.Timestamps()
+ })
+ }
+
+ return nil
+}
+
+// Pastga Migratsiyalarni teskari aylantiring.
+func (r *M20241207095921CreateUsersTable) Down() error {
+ return facades.Schema().DropIfExists("users")
+}
+```
+
+#### Migratsiya ulanishini o'rnatish
+
+Agar migratsiya ilovaning standart ma'lumotlar bazasi ulanishidan boshqa ma'lumotlar bazasi ulanishi bilan o'zaro ta'sirlashsa, siz migratsiyaning `Connection` metodidan foydalanishingiz kerak:
+
+```go
+func (r *M20241207095921CreateUsersTable) Connection() string {
+ return "connection-name"
+}
+```
+
+## Migratsiyalarni ro'yxatdan o'tkazish
+
+`make:migration` tomonidan yaratilgan yangi migratsiya `bootstrap/migrations.go::Migrations()` funksiyasida avtomatik ravishda ro'yxatga olinadi va funksiya `WithMigrations` tomonidan chaqiriladi. Agar siz migratsiya faylini o'zingiz yaratsangiz, qoidani qo'lda ro'yxatdan o'tkazishingiz kerak.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithMigrations(Migrations).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Migratsiyalarni ishga tushirish
+
+Barcha qoldirilgan migratsiyalaringizni ishga tushirish uchun `migrate` Artisan buyrug'ini bajaring:
+
+```shell
+./artisan migrate
+```
+
+Agar hozirgacha qaysi migratsiyalar ishlaganini ko'rmoqchi bo'lsangiz, `migrate:status` Artisan buyrug'idan foydalanishingiz mumkin:
+
+```shell
+./artisan migrate:status
+```
+
+## Migratsiyalarni Orqaga Qaytarish
+
+Oxirgi migratsiya to'plamini orqaga qaytarish uchun `rollback` Artisan buyrug'idan foydalaning:
+
+```shell
+./artisan migrate:rollback
+```
+
+Agar siz bir nechta migratsiya to'plamlarini orqaga qaytarmoqchi bo'lsangiz, `batch` opsiyasini belgilashingiz mumkin, raqam qaysi to'plamni orqaga qaytarish kerakligini ko'rsatadi:
+
+```shell
+./artisan migrate:rollback --batch=2
+```
+
+Siz `rollback` buyrug'iga `step` opsiyasini berib, cheklangan migratsiyalarni qaytarishingiz mumkin. Masalan, quyidagi buyruq oxirgi beshta migratsiyani orqaga qaytaradi:
+
+```shell
+./artisan migrate:rollback --step=5
+```
+
+`migrate:reset` buyrug'u ilovangizning barcha migratsiyalarini orqaga qaytaradi:
+
+```shell
+./artisan migrate:reset
+```
+
+### Bitta buyruq yordamida orqaga qaytarish va migratsiya qilish
+
+`migrate:refresh` buyrug'i barcha migratsiyalaringizni orqaga qaytaradi va keyin `migrate` buyrug'ini bajaradi. Bu buyruq sizning butun ma'lumotlar bazangizni samarali ravishda qayta yaratadi:
+
+```shell
+./artisan migrate:refresh
+```
+
+Siz `refresh` buyrug'iga `step` opsiyasini berib, cheklangan migratsiyalarni orqaga qaytarish va qayta migratsiya qilishingiz mumkin. Masalan, quyidagi buyruq oxirgi besh migratsiyani orqaga qaytaradi va qayta migratsiya qiladi:
+
+```shell
+./artisan migrate:refresh --step=5
+```
+
+### Barcha Jadval va Migratsiyalarni O'chirish
+
+`migrate:fresh` buyrug'i ma'lumotlar bazasidagi barcha jadvallarni o'chirib tashlaydi va keyin `migrate` buyrug'ini bajaradi:
+
+```shell
+./artisan migrate:fresh
+```
+
+## Jadvallar
+
+### Jadval yaratish
+
+```go
+facades.Schema().Create("users", func(table schema.Blueprint) {
+ table.ID()
+ table.String("name").Nullable()
+ table.String("email").Nullable()
+ table.Timestamps()
+})
+```
+
+### Jadval / Ustun Mavjudligini Tekshirish
+
+```go
+if facades.Schema().HasTable("users") {}
+if facades.Schema().HasColumn("users", "email") {}
+if facades.Schema().HasColumns("users", []string{"name", "email"}) {}
+if facades.Schema().HasIndex("users", "email_unique") {}
+```
+
+### Ma'lumotlar bazasi ulanishi
+
+```go
+facades.Schema().Connection("sqlite").Create("users", func(table schema.Blueprint) {
+ table.ID()
+})
+```
+
+### Jadvalni yangilash
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.String("name").Nullable()
+})
+```
+
+### Ustun nomini o'zgartirish
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.RenameColumn("old_name", "new_name")
+})
+```
+
+### Jadval izohini qo'shish
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.Comment("user table")
+})
+```
+
+### Jadvalni qayta nomlash / O‘chirish
+
+```go
+facades.Schema().Rename("users", "new_users")
+facades.Schema().Drop("users")
+facades.Schema().DropIfExists("users")
+```
+
+## Ustunlar
+
+### Mavjud ustun turlari
+
+#### Mantiqiy turlar
+
+Mantiqiy
+
+#### Satr va matn turlari
+
+Char, Json, LongText, MediumText, String, Text, LongText, TinyText, Uuid, Ulid
+
+#### Raqamli turlar
+
+BigIncrements, BigInteger, Decimal, Double, Float, [ID](#id), Increments, Integer, IntegerIncrements, MediumIncrements, MediumInteger, SmallIncrements, SmallInteger, TinyIncrements, TinyInteger, UnsignedBigInteger, UnsignedInteger, UnsignedMediumInteger, UnsignedSmallInteger, UnsignedTinyInteger
+
+#### Sana va Vaqt Turlari
+
+Sana, SanaVaqt, SanaVaqtTz, [YumshoqO'chirishlar](#softdeletes), YumshoqO'chirishlarTz, Vaqt, VaqtTz, VaqtBelgisi, VaqtBelgisiTz, VaqtBelgilari, VaqtBelgilariTz
+
+#### Boshqa turlar
+
+[Enum](#enum), Morflar, NullableMorflar, NumericMorflar, UuidMorflar, UlidMorflar
+
+#### Enum
+
+`[]any` turidagi bo‘yicha `Mysql` da saqlanishi mumkin bo‘lgan `Enum` maydonini yarating, lekin `Postgres`, `Sqlite` va `Sqlserver` ma’lumotlar bazalarida u `String` turidir.
+
+```go
+table.Enum("qiyinlik", []any{"oson", "qiyin"})
+table.Enum("raqam", []any{1, 2})
+```
+
+#### ID
+
+`ID` usuli `BigIncrements` usulining taxallusidir. Standart holda, ushbu usul `id` ustunini yaratadi; ammo, agar siz ustunga boshqa nom berishni istasangiz, ustun nomini o'tkazishingiz mumkin:
+
+```go
+jadval.ID()
+jadval.ID("foydalanuvchi_id")
+```
+
+#### Yumşoq o'chirishlar
+
+`SoftDeletes` usuli `deleted_at` `TIMESTAMP` ustunini qo‘shadi. Bu ustun Orm "yumshoq o'chirish" funksiyasi uchun zarur bo'lgan `deleted_at` vaqt belgisini saqlash uchun mo'ljallangan:
+
+```go
+table.SoftDeletes()
+```
+
+#### Maxsus ustun
+
+Agar siz freymvork hali qo'llab-quvvatlamaydigan ustun turlaridan foydalanayotgan bo'lsangiz, maydon turini sozlash uchun `Column` metodidan foydalanishingiz mumkin:
+
+```go
+table.Column("geometriya", "geometriya")
+```
+
+### Ustun modifikatorlari
+
+Yuqorida keltirilgan ustun turlaridan tashqari, ma'lumotlar bazasi jadvaliga ustun qo'shganda, siz shuningdek, ustunga "modifikatorlar" qo'shishingiz mumkin. Masalan, ustunni "null qiymat qabul qiluvchi" qilish uchun `Nullable` metodidan foydalanishingiz mumkin:
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.String("name").Nullable()
+})
+```
+
+Quyidagi jadvalda barcha mavjud ustun modifikatorlari keltirilgan:
+
+| O'zgartirilgan | Tavsif |
+| ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `.Har doim()` | Ushbu ustunning qiymati har doim ma'lumotlar bazasi tizimi tomonidan yaratiladi va foydalanuvchilar uni to'g'ridan-to'g'ri kiritish yoki o'zgartirishlari mumkin emas (faqat PostgreSQL) |
+| `.AutoIncrement()` | Butun sonli ustunni avtomatik o'sish (asosiy kalit) sifatida belgilaydi |
+| `.After("ustun")` | Belgilangan ustundan keyingi ustunni o‘rnatadi (faqat MySQL) |
+| `.Comment("mening izohim")` | Ustunga izoh qo'shadi (MySQL / PostgreSQL) |
+| \`.Change() | Ustun tuzilishini o'zgartirish (MySQL / PostgreSQL / Sqlserver) |
+| `.Default(value)` | Ustunning standart qiymatini belgilaydi |
+| `.First()` | Ustunni birinchi ustun sifatida belgilaydi (faqat MySQL) |
+| `.GeneratedAs()` | Ushbu ustunning qiymatini ma'lumotlar bazasi tizimi tomonidan yaratilishi uchun belgilaydi (faqat PostgreSQL) |
+| `.Nullable()` | Ustunga NULL qiymatlarni kiritishga ruxsat beradi |
+| `.Unsigned()` | Butun sonli ustunni UNSIGNED qilib belgilaydi (faqat MySQL uchun) |
+| `.UseCurrent()` | Jadval ustuniga standart qiymat sifatida CURRENT_TIMESTAMP ni belgilaydi |
+| `.UseCurrentOnUpdate()` | Yozuv yangilanganda CURRENT_TIMESTAMP dan foydalanish uchun vaqt belgisi ustunini belgilaydi (faqat MySQL) |
+
+### Ustunni tashlash
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.DropColumn("name")
+ table.DropColumn("name", "age")
+})
+```
+
+## Indekslar
+
+### Indeks yaratish
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ // Asosiy kalitni qo'shish
+ table.Primary("id")
+ // Kompozit asosiy kalitni qo'shish
+ table.Primary("id", "name")
+
+ // Yagona indeksni qo'shish
+ table.Unique("name")
+ table.Unique("name", "age")
+
+ // Oddiy indeksni qo'shish
+ table.Index("name")
+ table.Index("name", "age")
+
+ // To'liq matn indeksini qo'shish
+ table.FullText("name")
+ table.FullText("name", "age")
+})
+```
+
+### Indeksni nomini o'zgartirish
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.RenameIndex("users_name_index", "users_name")
+})
+```
+
+### Indeksni tashlash
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.DropPrimary("id")
+ table.DropUnique("name")
+ table.DropUniqueByName("name_unique")
+ table.DropIndex("name")
+ table.DropIndexByName("name_index")
+ table.DropFullText("name")
+ table.DropFullTextByName("name_fulltext")
+})
+```
+
+### Tashqi kalit yaratish
+
+```go
+facades.Schema().Table("posts", func(table schema.Blueprint) {
+ table.UnsignedBigInteger("user_id")
+ table.Foreign("user_id").References("id").On("users")
+})
+```
+
+### Tashqi kalitni olib tashlash
+
+```go
+facades.Schema().Table("users", func(table schema.Blueprint) {
+ table.DropForeign("user_id")
+ table.DropForeignByName("user_id_foreign")
+})
+```
diff --git a/uz_UZ/database/queries.md b/uz_UZ/database/queries.md
new file mode 100644
index 000000000..371e58532
--- /dev/null
+++ b/uz_UZ/database/queries.md
@@ -0,0 +1,667 @@
+# So'rov Quruvchi
+
+[[toc]]
+
+## Kirish
+
+Ma'lumotlar bazasi so'rovlari quruvchisi ma'lumotlar bazasi so'rovlarini yaratish va bajarish uchun qulay interfeysni taqdim etadi. U ilovangizda ko'p ma'lumotlar bazasi operatsiyalarini bajarish uchun ishlatilishi mumkin va barcha qo'llab-quvvatlanadigan ma'lumotlar bazasi tizimlari bilan ishlaydi.
+
+So'rov quruvchisi SQL in'ektsiyasidan himoya qilish uchun parametr bog'lashdan foydalanadi. So'rov quruvchisiga uzatilgan satrlarni tozalash yoki qochishga hojat yo'q.
+
+## So'rovlarni bajarish
+
+Framework turli xil so'rov usullarini taqdim etadi, siz ma'lumotlar bazasidan ma'lumotlarni so'rashingiz, yaratishingiz, yangilashingiz va o'chirishingiz mumkin. E'tibor bering, ma'lumotlarni `struct` yoki [model](../orm/getting-started.md#model-definition) ga bog'lamoqchi bo'lganingizda, maydonga `db` tegnini qo'shishingiz kerak:
+
+```go
+type User struct {
+ ID string `db:"id"`
+ Name string `db:"name"`
+}
+
+type User struct {
+ orm.BaseModel
+ orm.NullableSoftDeletes
+ Name string `db:"name"`
+}
+```
+
+### Barcha qatorlarni olish
+
+Siz so'rovni boshlash uchun `facades.DB()` tomonidan taqdim etilgan `table` usulidan foydalanishingiz mumkin. `table` usuli belgilangan jadval uchun zanjirli so'rov quruvchi namunasini qaytaradi, bu sizga qo'shimcha cheklovlarni zanjirlash va natijalarni olish uchun `Get` usulidan foydalanish imkonini beradi:
+
+```go
+var users []User
+err := facades.DB().Table("users").Get(&users)
+```
+
+### Bitta qator yoki ustunni olish
+
+Agar sizga ma'lumotlar bazasi jadvalidan faqat bitta qator ma'lumotlarni olish kerak bo'lsa, siz "First" usulidan foydalanishingiz mumkin.
+
+```go
+var user User
+err := facades.DB().Table("users").Where("id", 1).First(&user)
+```
+
+Bitta ustunning qiymatini olish uchun `Value` usulidan foydalanishingiz mumkin:
+
+```go
+var name string
+err := facades.DB().Table("users").Where("id", 1).Value("name", &name)
+```
+
+Siz `id` ni o'tkazish orqali ma'lumotlarning bitta qatorini olish uchun `Find` usulidan foydalanishingiz mumkin:
+
+```go
+var user User
+err := facades.DB().Table("users").Find(&user, 1)
+
+// Shuningdek, bir nechta ma'lumot qatorlarini olish uchun id to'plamini o'tkazishingiz mumkin
+var users []User
+err := facades.DB().Table("users").Find(&users, []int{1, 2, 3})
+
+// Find jadvalning asosiy kalitini sukut bo'yicha id deb belgilaydi, agar jadvalning asosiy kaliti id bo'lmasa, id maydon nomini o'tkazishingiz mumkin
+var user User
+err := facades.DB().Table("users").Find(&users, "uuid", "1")
+```
+
+Agar yozuv topilmasa, `FindOrFail` yoki `FirstOrFail` usulidan foydalanishingiz mumkin, u `sql.ErrNoRows` xatosini chiqaradi:
+
+```go
+var user User
+err := facades.DB().Table("users").FindOrFail(&user, 1)
+```
+
+Agar yozuv topilmasa, `FindOr` yoki `FirstOr` usulidan foydalanishingiz mumkin, u holda yopish funksiyasi bajariladi:
+
+```go
+var user *User
+err = facades.DB().Table("users").Where("name", "John").FirstOr(&user, func() error {
+ return errors.New("no rows")
+})
+```
+
+### Bitta ustun qiymatini olish
+
+Agar siz bitta ustun qiymatini o'z ichiga olgan yozuvlar ro'yxatini olishni istasangiz, `Pluck` usulidan foydalanishingiz mumkin:
+
+```go
+var emails []string
+err := facades.DB().Table("users").Pluck("email", &emails)
+```
+
+### Natijalarni o'tish
+
+Siz `Each` metodidan barcha natijalarni aylanib o'tish uchun foydalanishingiz mumkin:
+
+```go
+var products []Product
+err := facades.DB().Table("products").Each(func(rows []db.Row) error {
+ for _, row := range rows {
+ var product Product
+ if err := row.Scan(&product); err != nil {
+ return err
+ }
+
+ products = append(products, product)
+ }
+
+ return nil
+})
+```
+
+### Chunking natijalari
+
+Agar siz minglab ma'lumotlar bazasi yozuvlarini qayta ishlashingiz kerak bo'lsa, `Chunk` usulidan foydalanishni ko'rib chiqing. Bu usul natijalarni bir vaqtning o'zida kichik qismlarga ajratadi va har bir qismni qayta ishlash uchun yopilish funksiyasiga uzatadi:
+
+```go
+var products []Product
+err := facades.DB().Table("products").Chunk(2, func(rows []db.Row) error {
+ for _, row := range rows {
+ var product Product
+ if err := row.Scan(&product); err != nil {
+ return err
+ }
+
+ products = append(products, product)
+ }
+
+ return nil
+})
+```
+
+> Eslatma: Chunk chaqiruvida yozuvlarni o'zgartirish, yozuvlarning chunk natijalariga kiritilmasligiga olib kelishi mumkin.
+
+### Kursor
+
+Kursor barcha ma'lumotlarni bir vaqtning o'zida xotiraga yuklamasdan, katta hajmdagi ma'lumotlarni qayta ishlash uchun ishlatilishi mumkin. U barcha ma'lumotlarni bir vaqtning o'zida yuklash o'rniga, ma'lumotlarni birma-bir qayta ishlaydi.
+
+```go
+rows, err := facades.DB().Table("products").Cursor()
+
+var products []Product
+for row := range rows {
+ var product Product
+ if err := row.Scan(&product); err != nil {
+ return err
+ }
+
+ products = append(products, product)
+}
+```
+
+### Agregatlar
+
+So'rov quruvchisi quyidagi yig'ish usullarini taqdim etadi: `Count`, `Sum`, `Avg`, `Min`, `Max`.
+
+```go
+count, err := facades.DB().Table("users").Count()
+
+var sum int
+err := facades.DB().Table("users").Sum("age", &sum)
+
+var avg float64
+err := facades.DB().Table("users").Avg("age", &avg)
+
+var min int
+err := facades.DB().Table("users").Min("age", &min)
+
+var max int
+err := facades.DB().Table("users").Max("age", &max)
+```
+
+### Yozuv mavjudligini tekshirish
+
+Siz so'rov shartining natijasi mavjudligini aniqlash uchun `Exists` va `DoesntExist` metodlaridan foydalanishingiz mumkin:
+
+```go
+exists, err := facades.DB().Table("users").Where("votes > ?", 100).Exists()
+
+exists, err := facades.DB().Table("users").Where("votes > ?", 100).DoesntExist()
+```
+
+### Sahifalash
+
+So'rov natijalarini sahifalash uchun `Paginate` metodidan foydalanishingiz mumkin:
+
+```go
+var (
+ users []User
+ total int64
+)
+
+err := facades.DB().Table("users").Where("name", "John").Paginate(1, 10, &users, &total)
+```
+
+## Tanlash
+
+Siz har doim ma'lumotlar bazasi jadvalidan barcha ustunlarni olishni xohlamasligingiz mumkin. "Select" so'rov bayonini sozlash uchun `Select` usulidan foydalaning va belgilangan maydonlarni so'rang:
+
+```go
+var users []User
+err := facades.DB().Table("users").Select("name", "email as user_email").Get(&users)
+```
+
+`Distinct` usuli so'rovning noyob natijalarni qaytarishini majbur qiladi:
+
+```go
+var users []User
+err := facades.DB().Table("users").Distinct().Select("name").Get(&users)
+```
+
+## Xom ifodalar
+
+Ba'zan so'rovlaringizda to'g'ridan-to'g'ri ifodalardan foydalanish kerak bo'lishi mumkin. Siz `db.Raw` usulidan foydalanib, xom ifoda yaratishingiz mumkin:
+
+```go
+mport "github.com/goravel/framework/database/db"
+
+res, err := facades.DB().Model(&user).Update("age", db.Raw("age - ?", 1))
+```
+
+## Tanlash
+
+### Select bandini belgilash
+
+Albatta, siz har doim ma'lumotlar bazasi jadvalidan barcha ustunlarni olishni xohlamasligingiz mumkin. So'rovingiz uchun maxsus tanlash bandini belgilash uchun `Select` usulidan foydalaning:
+
+```go
+// Belgilangan maydonlarni tanlash
+err := facades.DB().Select("name", "age").Get(&users)
+
+// Subquery-dan foydalanish
+err := facades.DB().Select("name", db.Raw("(SELECT COUNT(*) FROM posts WHERE users.id = posts.user_id) as post_count")).Get(&users)
+```
+
+### Farqli
+
+`Distinct` usuli so'rovga noyob natijalarni qaytarishni majbur qiladi:
+
+```go
+var users []models.User
+err := facades.DB().Distinct("name").Find(&users)
+```
+
+## Xom usullar
+
+### WhereRaw / OrWhereRaw
+
+`WhereRaw` va `OrWhereRaw` metodlari so'rovga "where" bandlarini bevosita kiritish uchun ishlatilishi mumkin. Ushbu usullar ikkinchi parametr sifatida ixtiyoriy bog'lash massivini qabul qiladi:
+
+```go
+var users []User
+
+err := facades.DB().WhereRaw("age = ? or age = ?", []any{25, 30}).Get(&users)
+
+err := facades.DB().OrWhereRaw("age = ? or age = ?", []any{25, 30}).Get(&users)
+```
+
+### OrderByRaw
+
+`OrderByRaw` usuli "order by" bandining qiymati sifatida xom satrni o'rnatish uchun ishlatilishi mumkin:
+
+```go
+var users []User
+
+err := facades.DB().OrderByRaw("age DESC, id ASC").Get(&users)
+```
+
+## Qo'shiladi
+
+### Ichki qo'shilish
+
+So'rov qurilgichini birlashtirish bayonotlarini yozish uchun ishlatish mumkin. "Ichki join" SQL so‘rovini bajarish uchun so‘rov quruvchi namunasidagi `Join` metodidan foydalanishingiz mumkin:
+
+```go
+var users []User
+
+err := facades.DB().Table("users").Join("posts as p ON users.id = p.user_id AND p.id = ?", 1).Where("age", 25).Get(&users)
+```
+
+### Chap Join / O'ng Join
+
+Agar siz "chap qo'shilish" yoki "o'ng qo'shilish"ni bajarishni istasangiz, `LeftJoin` yoki `RightJoin` usullaridan foydalanishingiz mumkin:
+
+```go
+var users []User
+
+err := facades.DB().Table("users").LeftJoin("posts as p ON users.id = p.user_id AND p.id = ?", 1).Where("age", 25).Get(&users)
+
+err = facades.DB().Table("users").RightJoin("posts as p ON users.id = p.user_id AND p.id = ?", 1).Where("age", 25).Get(&users)
+```
+
+### Cross Join
+
+`CrossJoin` usuli "cross join"ni bajarish uchun ishlatilishi mumkin:
+
+```go
+var users []User
+
+err := facades.DB().Table("users").CrossJoin("posts as p ON users.id = p.user_id AND p.id = ?", 1).Where("age", 25).Get(&users)
+```
+
+## Asosiy Where Shartlari
+
+### Qayerda / Yoki Qayerda
+
+Siz so'rov quruvchi namunasi ustida `Where` usulidan foydalanib, so'rovga where bandlarini qo'shishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/contracts/database/db"
+
+var users []User
+
+err := facades.DB().Where("votes", 100).Get(&users)
+
+err := facades.DB().Where("votes >= ?", 100).Get(&users)
+
+err := facades.DB().Where("votes LIKE ?", "%goravel%").Get(&users)
+
+err := facades.DB().Where("votes", []int{1, 2, 3}).Get(&users)
+
+err := facades.DB().Where(func(query db.Query) db.Query {
+ return query.Where("age", []int{25, 30}).Where("name", "Tom")
+}).OrWhere("name", "John").Get(&users)
+```
+
+### WhereNot / OrWhereNot
+
+`WhereNot` va `OrWhereNot` metodlari berilgan so'rov shartlar to'plamini inkor qilish uchun ishlatilishi mumkin.
+
+```go
+import "github.com/goravel/framework/contracts/database/db"
+
+var users []User
+
+err := facades.DB().WhereNot("votes", 100).Get(&users)
+
+err := facades.DB().WhereNot("votes >= ?", 100).Get(&users)
+
+err := facades.DB().WhereNot("votes LIKE ?", "%goravel%").Get(&users)
+
+err := facades.DB().WhereNot("votes", []int{1, 2, 3}).Get(&users)
+
+err := facades.DB().WhereNot(func(query db.Query) db.Query {
+ return query.Where("age", []int{25, 30}).Where("name", "Tom")
+}).OrWhereNot("name", "John").Get(&users)
+```
+
+### Mavjud bo‘lgan joy / Mavjud bo‘lmagan joy
+
+`WhereExists` usuli sizga mavjud SQL bandlarini yozish imkonini beradi:
+
+```go
+var users []User
+
+err := facades.DB().Table("users").Where("name", "John").WhereExists(func() db.Query {
+ return facades.DB().Table("posts").WhereColumn("posts.user_id", "users.id")
+}).Get(&users)
+```
+
+### WhereAll / WhereAny / WhereNone
+
+```go
+var products []Product
+facades.DB().Table("products").WhereAll([]string{"weight", "height"}, "=", 200).Find(&products)
+// SQL: SELECT * FROM products WHERE weight = ? AND height = ?
+
+var users []User
+facades.DB().Table("users").WhereAny([]string{"name", "email"}, "=", "John").Find(&users)
+// SQL: SELECT * FROM users WHERE (name = ? OR email = ?)
+
+var products []Product
+facades.DB().Table("products").WhereNone([]string{"age", "score"}, ">", 18).Find(&products)
+// SQL: SELECT * FROM products WHERE NOT (age > ?) AND NOT (score > ?)
+```
+
+### Boshqa Where bandlari
+
+**WhereBetween / OrWhereBetween**
+
+`WhereBetween` usuli maydon qiymati berilgan ikki qiymat orasida ekanligini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereBetween("votes", 1, 100)
+```
+
+**WhereNotBetween / OrWhereNotBetween**
+
+`WhereNotBetween` usuli maydon qiymati berilgan ikki qiymat oralig'ida emasligini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereNotBetween("votes", 1, 100)
+```
+
+**WhereIn / WhereNotIn / OrWhereIn / OrWhereNotIn**
+
+`WhereIn` usuli maydon qiymati belgilangan massivda mavjud bo'lishi kerakligini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereIn("id", []any{1, 2, 3})
+```
+
+**WhereNull / WhereNotNull / OrWhereNull / OrWhereNotNull**
+
+`WhereNull` usuli belgilangan maydon `NULL` bo'lishi kerakligini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereNull("updated_at")
+```
+
+**WhereLike / WhereNotLike / OrWhereLike / OrWhereNotLike**
+
+`WhereLike` usuli maydon qiymati berilgan qiymatni o'z ichiga olishini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereLike("name", "%goravel%")
+```
+
+**WhereColumn / OrWhereColumn**
+
+`WhereColumn` usuli ikki maydonning tengligini tekshiradi:
+
+```go
+facades.DB().Table("users").WhereColumn("first_name", "last_name")
+```
+
+### Mantiqiy guruhlash
+
+Ba'zan so'rovingiz uchun zarur bo'lgan mantiqiy guruhlashni amalga oshirish uchun bir nechta "where" bandlarini qavs ichida guruhlashingiz kerak bo'lishi mumkin.
+
+```go
+facades.DB().Table("users").Where("age", 25).Where(func(query db.Query) db.Query {
+ return query.Where("votes", 100).OrWhere("votes", 200)
+})
+```
+
+## Buyurtma berish, Guruhlash, Cheklash va O‘tkazib yuborish
+
+### Tartiblash
+
+**OrderBy / OrderByDesc**
+
+```go
+facades.DB().OrderBy("name")
+
+facades.DB().OrderByDesc("name")
+```
+
+**Oxirgi**
+
+`Latest` usuli natijalarni sana bo'yicha tartiblashni osonlashtiradi. Standart bo‘yicha, natijalar `created_at` ustuni bo‘yicha tartiblanadi:
+
+```go
+err := facades.DB().Table("users").Latest().First(&user)
+
+err := facades.DB().Table("users").Latest("updated_at").First(&user)
+```
+
+**InRandomOrder**
+
+`InRandomOrder` usuli natijalarni tasodifiy tartiblash uchun ishlatiladi:
+
+```go
+err := facades.DB().Table("users").InRandomOrder().First(&user)
+```
+
+### Guruhlash
+
+`GroupBy` va `Having` usullari natijalarni guruhlash uchun ishlatilishi mumkin:
+
+```go
+err := facades.DB().Table("users").Where("age", 25).GroupBy("name").Having("name = ?", "John").OrderBy("name").Get(&users)
+```
+
+### Cheklash va O‘tkazib yuborish
+
+Natijalar sonini cheklash yoki so'rovda belgilangan natijalar sonini o'tkazib yuborish uchun `Limit` va `Offset` metodlaridan foydalanishingiz mumkin:
+
+```go
+err := facades.DB().Table("users").Offset(10).Limit(5).Get(&users)
+```
+
+## Shartli bandlar
+
+Ba'zan siz berilgan shart to'g'ri bo'lganda faqat bir band bajarilishini xohlashingiz mumkin. Masalan, siz faqat so'rovda berilgan qiymat mavjud bo'lganda "where" bandini qo'llashni xohlashingiz mumkin. Buni `When` usuli yordamida amalga oshirishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/contracts/database/db"
+
+err := facades.DB().Table("users").When(1 == 1, func(query db.Query) db.Query {
+ return query.Where("age", 25)
+}).First(&user)
+```
+
+Shuningdek, siz `When` metodining uchinchi parametri sifatida boshqa yopilishni ham o'tkazishingiz mumkin. Agar birinchi parametr yolg‘on bo‘lsa, bu yopilish bajariladi:
+
+```go
+err := facades.DB().Table("users").When(1 != 1, func(query db.Query) db.Query {
+ return query.OrderBy("name")
+}, func(query db.Query) db.Query {
+ return query.OrderBy("id")
+}).First(&user)
+```
+
+## Kiritish
+
+So'rov quruvchisi ma'lumotlar bazasiga yozuvlarni kiritish uchun `Insert` usulini taqdim etadi:
+
+```go
+// Struktura orqali kiritish
+result, err := facades.DB().Table("products").Insert(Product{
+ Name: "goravel",
+})
+
+// Strukturalar qatori orqali kiritish
+result, err := facades.DB().Table("products").Insert([]Product{
+ {
+ Name: "goravel",
+ },
+ {
+ Name: "go",
+ },
+})
+
+// Xarita orqali kiritish
+result, err := facades.DB().Table("products").Insert(map[string]any{
+ "name": "goravel",
+ "created_at": time.Now(),
+ "updated_at": time.Now(),
+})
+
+// Xaritalar qatori orqali kiritish
+result, err := facades.DB().Table("products").Insert([]map[string]any{
+ {
+ "name": "goravel",
+ "created_at": time.Now(),
+ "updated_at": time.Now(),
+ },
+ {
+ "name": "go",
+ "created_at": time.Now(),
+ "updated_at": time.Now(),
+ },
+})
+```
+
+### Avtomatik oshiruvchi ID
+
+Agar jadvalning asosiy kaliti avtomatik oshiriladigan bo'lsa, avtomatik oshirilgan IDni olish uchun `LastInsertID` usulidan foydalanishingiz mumkin, bu faqat `mysql` va `sqlite` ma'lumotlar bazalari uchun qo'llab-quvvatlanadi:
+
+```go
+id, err := facades.DB().Table("products").InsertGetID(Product{
+ Name: "goravel",
+})
+```
+
+## Yangilash
+
+So'rov quruvchisi ma'lumotlar bazasidagi mavjud yozuvlarni yangilash uchun `Update` usulini taqdim etadi:
+
+```go
+// Maydon nomi bo'yicha yangilash
+result, err := facades.DB().Table("products").Where("id", 1).Update("phone", "1234567890")
+
+// Struktura bo'yicha yangilash
+result, err := facades.DB().Table("products").Where("id", 1).Update(Product{
+ Name: "goravel",
+})
+
+// Xarita bo'yicha yangilash
+result, err := facades.DB().Table("products").Where("id", 1).Update(map[string]any{
+ "name": "goravel",
+ "created_at": time.Now(),
+ "updated_at": time.Now(),
+})
+```
+
+### JSON maydonlarini yangilang
+
+```go
+result, err := facades.DB().Table("users").Where("id", 1).Update("options->enabled", true)
+result, err := facades.DB().Table("users").Where("id", 1).Update("options->languages[0]", "en")
+result, err := facades.DB().Table("users").Where("id", 1).Update("options->languages", []string{"en", "de"})
+result, err := facades.DB().Table("users").Where("id", 1).Update(map[string]any{
+ "preferences->dining->meal": "salad",
+ "options->languages[0]": "en",
+ "options->enabled": true,
+})
+```
+
+### Yangilash yoki qo'shish
+
+Ba'zan siz ma'lumotlar bazasidagi yozuvni yangilamoqchi bo'lishingiz mumkin, lekin agar ko'rsatilgan yozuv mavjud bo'lmasa, uni yarating. Bu `UpdateOrInsert` usuli yordamida amalga oshirilishi mumkin. `UpdateOrInsert` usuli ikki parametrni qabul qiladi: yozuvni topish uchun shart va yozuvni yangilash uchun qiymatlarni o'z ichiga olgan kalit-qiymat juftligi.
+
+`UpdateOrInsert` usuli birinchi parametrdagi ustun nomlari va qiymatlari yordamida mos keladigan ma'lumotlar bazasi yozuvini topishga harakat qiladi. Agar yozuv mavjud bo'lsa, uning qiymatlari ikkinchi parametr yordamida yangilanadi. Agar mos yozuv topilmasa, yozuv yaratiladi va uning qiymatlari ikki parametrdan birlashtiriladi:
+
+```go
+// struct-dan foydalanish
+result, err := facades.DB().Table("users").Where("id", 1).UpdateOrInsert(TestUser{
+ Email: "john@example.com",
+}, TestUser{
+ Phone: "1234567890",
+})
+
+// map-dan foydalanish
+result, err := facades.DB().Table("users").Where("id", 1).UpdateOrInsert(map[string]any{
+ "email": "john@example.com",
+}, map[string]any{
+ "phone": "1234567890",
+})
+```
+
+### Oshirish va Kamaytirish
+
+`Increment` va `Decrement` metodlari belgilangan maydon qiymatini oshirish yoki kamaytirish uchun ishlatilishi mumkin:
+
+```go
+err := facades.DB().Table("users").Where("id", 1).Increment("votes")
+
+err := facades.DB().Table("users").Where("id", 1).Increment("votes", 2)
+
+err := facades.DB().Table("users").Where("id", 1).Decrement("votes")
+
+err := facades.DB().Table("users").Where("id", 1).Decrement("votes", 2)
+```
+
+## O‘chirish
+
+So'rov quruvchisi shuningdek, sizning `select` gaplaringizda "pessimistik qulflash"ni amalga oshirishingizga yordam beradigan ba'zi funksiyalarni o'z ichiga oladi:
+
+```go
+natija, xato := facades.DB().Table("users").Where("id", 1).Delete()
+```
+
+## Pessimistik blokirovka
+
+So'rov quruvchisi, shuningdek, sizning `select` bayonotlaringizda "pessimistik qulflash"ni amalga oshirishga yordam beradigan ba'zi funksiyalarni o'z ichiga oladi:
+
+"Umumiy qulflash"dan foydalanish uchun siz `SharedLock` usulidan foydalanishingiz mumkin. "Umumiy qulf" tanlangan qatorlar transaksiya tasdiqlanmaguncha o'zgartirilishiga yo'l qo'ymaydi:
+
+```go
+err := facades.DB().Table("users").Where("ovozlar > ?", 100).SharedLock().Get(&users)
+```
+
+Shuningdek, siz `LockForUpdate` usulidan foydalanishingiz mumkin. "Yangilash" qulfidan foydalanish qatorlarni boshqa umumiy qulf tomonidan o'zgartirilishiga yoki tanlanishiga to'sqinlik qilishi mumkin:
+
+```go
+err := facades.DB().Table("users").Where("votes > ?", 100).LockForUpdate().Get(&users)
+```
+
+## Debuglash
+
+Joriy so'rovni bog'lash va SQLni olish uchun `ToSQL` va `ToRawSql` usullaridan foydalanishingiz mumkin.
+
+SQL joylashtirgich bilan:
+
+```go
+err := facades.DB().Table("users").Where("id", 1).ToSql().Get(models.User{})
+```
+
+SQL bilan bog'langan qiymatlar:
+
+```go
+err := facades.DB().Table("users").Where("id", 1).ToRawSql().Get(models.User{})
+```
+
+`ToSql` va `ToRawSql` dan keyin chaqirilishi mumkin bo'lgan metodlar: `Count`, `Insert`, `Delete`, `First`, `Get`, `Pluck`, `Update`.
diff --git a/uz_UZ/database/seeding.md b/uz_UZ/database/seeding.md
new file mode 100644
index 000000000..c59d18c09
--- /dev/null
+++ b/uz_UZ/database/seeding.md
@@ -0,0 +1,111 @@
+# Ma'lumotlar bazasi: Urg'ochi qo'shish
+
+[[toc]]
+
+## Kirish
+
+Goravel ma'lumotlar bazangizni seed struct yordamida ma'lumotlar bilan to'ldirish imkoniyatini o'z ichiga oladi. Barcha urug' strukturalari `database/seeders` katalogida saqlanadi. Standart bo‘yicha, siz uchun `DatabaseSeeder` struktura belgilangan.
+
+## Seederlarni yozish
+
+Seeder yaratish uchun `make:seeder` [Artisan buyrug'ini](../digging-deeper/artisan-console.md) ishga tushiring. Framework tomonidan yaratilgan barcha urug‘lar `database/seeders` katalogida saqlanadi:
+
+```shell
+./artisan make:seeder UserSeeder
+```
+
+Standart bo'yicha, seeder strukturasida ikkita metod mavjud: `Signature` va `Run`. `Signature` usuli seeder nomini belgilaydi, `Run` usuli esa `db:seed` Artisan buyrug'i bajarilganda ishga tushiriladi. Siz ma'lumotlarni o'zingiz xohlagan tarzda ma'lumotlar bazangizga kiritish uchun `Run` metodidan foydalanishingiz mumkin.
+
+Masalan, biz `DatabaseSeeder` strukturini `Run` metodiga ma'lumotlar bazasiga ma'lumot kiritish bayonotini qo'shish orqali sozlashimiz mumkin.
+
+```go
+paket urug‘chilari
+
+import (
+ "github.com/goravel/framework/contracts/database/seeder"
+
+ "goravel/app/facades"
+ "goravel/app/models"
+)
+
+type DatabaseSeeder struct {
+}
+
+// Imzo Urg‘uchining nomi va imzosi.
+func (s *DatabaseSeeder) Signature() string {
+ return "DatabaseSeeder"
+}
+
+// Run urg‘uchi mantiqini bajaradi.
+func (s *DatabaseSeeder) Run() error {
+ user := models.User{
+ Name: "goravel",
+ }
+ return facades.Orm().Query().Create(&user)
+}
+```
+
+## Qo'shimcha Seederni chaqirish
+
+`DatabaseSeeder` strukturasi ichida, qo'shimcha urug' strukturalarini bajarish uchun `Call` metodidan foydalanishingiz mumkin. `Call` usulidan foydalanish ma'lumotlar bazangizni ko'chirishni bir nechta fayllarga bo'lish imkonini beradi, shunda biron bir ko'chiruvchi struktura juda katta bo'lib qolmaydi. `Call` usuli bajarilishi kerak bo'lgan seeder strukturalari massivini qabul qiladi:
+
+```go
+// Run seeder mantiqini bajaradi.
+func (s *DatabaseSeeder) Run() error {
+ return facades.Seeder().Call([]seeder.Seeder{
+ &UserSeeder{},
+ })
+}
+```
+
+Framework shuningdek `CallOnce` usulini taqdim etadi, bu urug‘lantiruvchi `db:seed` buyrug‘ida faqat bir marta bajariladi:
+
+```go
+// Run seeder mantiqini bajaradi.
+func (s *DatabaseSeeder) Run() error {
+ return facades.Seeder().CallOnce([]seeder.Seeder{
+ &UserSeeder{},
+ })
+}
+```
+
+## Seederlarni ishga tushirish
+
+Siz ma'lumotlar bazangizni to'ldirish uchun `db:seed` Artisan buyrug'ini ishga tushirishingiz mumkin. Standart holatda, `db:seed` buyrug'i `database/seeders/database_seeder.go` faylini ishga tushiradi, bu esa o'z navbatida boshqa urug' sinflarini chaqirishi mumkin. Biroq, siz `--seeder` opsiyasidan foydalanib, alohida ishlatish uchun aniq seeder klassini belgilashingiz mumkin:
+
+```shell
+./artisan db:seed
+```
+
+Agar siz `db:seed` buyrug'ini ishga tushirganda boshqa seederlarni bajarishni istasangiz, seeder-ni `bootstrp/app.go::WithSeeders` funksiyasida ro'yxatdan o'tkazishingiz mumkin. Agar seeder `make:seeder` buyrug'i orqali yaratilgan bo'lsa, framework uni avtomatik ravishda ro'yxatdan o'tkazadi.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithSeeders(Seeders).
+ WithConfig(config.Boot).
+ Create()
+}
+
+./artisan db:seed --seeder=UserSeeder PhotoSeeder // The signature of seeder
+```
+
+Shuningdek, siz ma'lumotlar bazangizni `migrate:fresh` va `migrate:refresh` buyruqlarini `--seed` opsiyasi bilan birgalikda ishlatib, to'ldirishingiz mumkin. Bu barcha jadvallarni o'chirib tashlaydi va barcha migratsiyalaringizni qayta ishga tushiradi. Bu buyruq ma'lumotlar bazangizni to'liq qayta qurish uchun foydalidir. `--seeder` opsiyasi ma'lum bir seeder-ni ishga tushirish uchun ko'rsatish mumkin:
+
+```shell
+./artisan migrate:fresh --seed
+
+./artisan migrate:fresh --seed --seeder=UserSeeder
+
+./artisan migrate:refresh --seed
+
+./artisan migrate:refresh --seed --seeder=UserSeeder
+```
+
+### Ishlab chiqarish muhitida urug‘chilarni majburiy ishga tushirish
+
+Ba'zi urug'lantirish amallari ma'lumotlarni o'zgartirish yoki yo'qotishga olib kelishi mumkin. "production" muhitida urug'lar bajarilishidan oldin tasdiqlash so'raladi, shunda sizning ishlab chiqarish ma'lumotlar bazangizga urug' buyruqlarini ishga tushirishdan himoya qilinishingiz uchun. Seederlarni so'ralsiz ishga tushirish uchun `--force` bayrog'idan foydalaning:
+
+```shell
+./artisan db:seed --force
+```
diff --git a/uz_UZ/digging-deeper/artisan-console.md b/uz_UZ/digging-deeper/artisan-console.md
new file mode 100644
index 000000000..7b7da40c8
--- /dev/null
+++ b/uz_UZ/digging-deeper/artisan-console.md
@@ -0,0 +1,537 @@
+# Artisan Konsoli
+
+[[toc]]
+
+## Kirish
+
+Artisan - Goravel bilan birga keladigan, buyruq qatori bilan ishlash uchun CLI vositasidir. Siz uni `facades.Artisan()` yordamida ochishingiz mumkin. Ushbu vosita sizning ilovangizni rivojlantirishda yordam beradigan bir nechta foydali buyruqlarga ega. Barcha mavjud buyruqlarni ko'rish uchun quyidagi buyruqdan foydalaning.
+
+```shell
+./artisan ro'yxat
+
+# yoki
+go run . artisan ro'yxat
+```
+
+Har bir buyruq shuningdek, buyruq bilan bog'liq argumentlar va opsiyalarni ko'rsatadigan va tushuntiradigan "yordam" bayrog'iga ega:
+
+```shell
+./artisan migrate --yordam
+```
+
+`./artisan ...` buyrug'ini takrorlash o'rniga, quyidagi terminal buyrug'i bilan o'z shell konfiguratsiyangizga taxallus qo'shishingiz mumkin:
+
+```shell
+echo -e "\r\nalias artisan=\"go run . artisan\"" >>~/.zshrc
+```
+
+Keyin siz buyruqlaringizni shunchaki shunday ishga tushirishingiz mumkin:
+
+```shell
+artisan make:controller DemoController
+```
+
+Shuningdek, siz `artisan` shell skriptidan shunday foydalanishingiz mumkin:
+
+### Buyruqlarni yaratish
+
+Siz `make:command` buyrug'idan `app/console/commands` katalogida yangi buyruq yaratish uchun foydalanishingiz mumkin. Agar bu katalog sizning ilovangizda mavjud bo'lmasa, tashvishlanmang, u siz `make:command` buyrug'ini birinchi marta ishga tushirganingizda yaratiladi:
+
+```shell
+./artisan make:command SendEmails
+./artisan make:command user/SendEmails
+```
+
+### Buyruqlarni ro'yxatdan o'tkazish
+
+Barcha buyruqlar `bootstrap/app.go` faylidagi `WithCommands` funksiyasi orqali ro'yxatdan o'tkazilishi kerak:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithCommands(Commands).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+`make:command` tomonidan yaratilgan yangi buyruq `bootstrap/commands.go::Commands()` funksiyasida avtomatik ro'yxatdan o'tkaziladi va funksiya `WithCommands` tomonidan chaqiriladi. Agar buyruq faylini o'zingiz yaratgan bo'lsangiz, buyruqni qo'lda ro'yxatdan o'tkazishingiz kerak.
+
+### Buyruq tuzilmasi
+
+Buyruqni yaratgandan so'ng, structning signature va description xususiyatlariga mos qiymatlarni belgilang. Buyruq bajarilganda `Handle` usuli chaqiriladi. Siz ushbu metodda o'z mantiqingizni amalga oshirishingiz kerak.
+
+```go
+paket buyruqlari
+
+import (
+ "github.com/goravel/framework/contracts/console"
+ "github.com/goravel/framework/contracts/console/command"
+)
+
+type SendEmails struct {
+}
+
+// Imzo Konsol buyrug'ining nomi va imzosi.
+func (receiver *SendEmails) Signature() string {
+ return "send:emails"
+}
+
+// Tavsif Konsol buyrug'ining tavsifi.
+func (receiver *SendEmails) Description() string {
+ return "Elektron pochta xabarlarini yuborish"
+}
+
+// Kengaytma Konsol buyrug'ining kengaytmasi.
+func (receiver *SendEmails) Extend() command.Extend {
+ return command.Extend{}
+}
+
+// Boshqarish Konsol buyrug'ini bajarish.
+func (receiver *SendEmails) Handle(ctx console.Context) error {
+ return nil
+}
+```
+
+## Buyruq kirish/chiqish
+
+### Kirishni olish
+
+Konsol buyruqlarini yozishda, odatda foydalanuvchi kiritimini `argumentlar` yoki `opsiyalar` orqali yigʻish mumkin. Goravel bilan foydalanuvchi taqdim etgan argumentlar va opsiyalarni olish juda oson.
+
+#### Argumentlar
+
+Buyruqdan keyingi argumentlarni kuzating:
+
+```shell
+./artisan send:emails SUBJECT EMAIL_1 EMAIL_2
+```
+
+Ta'rif:
+
+```go
+// send:emails <0> <1>
+func (receiver *SendEmails) Extend() command.Extend {
+ return command.Extend{
+ Arguments: []command.Argument{
+ &command.ArgumentString{
+ Name: "subject",
+ Usage: "elektron pochta mavzusi",
+ Required: true,
+ },
+ &command.ArgumentStringSlice{
+ Name: "emails",
+ Usage: "maqsadli elektron pochta manzillari",
+ Min: 1,
+ Max: -1,
+ },
+ },
+ }
+```
+
+Qo'llab-quvvatlanadigan argument turlari: `ArgumentFloat32`, `ArgumentFloat64`, `ArgumentInt`, `ArgumentInt8`, `ArgumentInt16`, `ArgumentInt32`, `ArgumentInt64`, `ArgumentString`, `ArgumentUint`, `ArgumentUint8`, `ArgumentUint16`, `ArgumentUint32`, `ArgumentUint64`, `ArgumentTimestamp`, `ArgumentFloat32Slice`, `ArgumentFloat64Slice`, `ArgumentIntSlice`, `ArgumentInt8Slice`, `ArgumentInt16Slice`, `ArgumentInt32Slice`, `ArgumentInt64Slice`, `ArgumentStringSlice`, `ArgumentUintSlice`, `ArgumentUint8Slice`, `ArgumentUint16Slice`, `ArgumentUint32Slice`, `ArgumentUint64Slice`, `ArgumentTimestampSlice`
+
+Bitta qiymatni qo‘llab-quvvatlovchi argument turlari quyidagi maydonlarni qo‘llab-quvvatlaydi:
+
+```go
+ Ism string // bu argumentning nomi
+ Qiymat T // bu argumentning standart qiymati
+ Foydalanish string // ko'rsatish uchun foydalanish matni
+ Majburiy bool // agar bu argument majburiy bo'lsa
+```
+
+"Slice" argument turlari maydonlari:
+
+```go
+ Ism string // bu argumentning nomi
+ Qiymat T // bu argumentning standart qiymati
+ Foydalanish string // ko'rsatiladigan foydalanish matni
+ Min int // bu argumentning minimal takrorlanish soni
+ Max int // bu argumentning maksimal takrorlanish soni, cheksiz uchun -1 ga o'rnating
+```
+
+Timestamp argumentlari qo'shimcha ravishda `Layouts []string` maydonini qo'llab-quvvatlaydi, bu [qo'llab-quvvatlanadigan layoutlar](https://pkg.go.dev/time#pkg-constants) bilan to'ldirilishi kerak
+
+Argumentlarni oling:
+
+```go
+func (receiver *SendEmails) Handle(ctx console.Context) error {
+ subject := ctx.ArgumentString("subject")
+ emails := ctx.ArgumentStringSlice("emails")
+
+ return nil
+}
+```
+
+Boshqa yo'l sifatida, argumentlarga to'g'ridan-to'g'ri kirish mumkin:
+
+```go
+func (qabul qiluvchi *EmailYuborish) Boshqarish(ctx console.Context) xato {
+ ism := ctx.Argument(0)
+ email := ctx.Argument(1)
+ hammasi := ctx.Arguments()
+
+ return nil
+}
+```
+
+#### Parametrlar
+
+Opsiyalar, argumentlar singari, foydalanuvchi kiritishining yana bir shaklidir. Parametrlar buyruq qatori orqali taqdim etilganda, ikkita tire (--) bilan boshlanadi.
+
+Ta'rif:
+
+```go
+func (receiver *ListCommand) Extend() command.Extend {
+ return command.Extend{
+ Flags: []command.Flag{
+ &command.StringFlag{
+ Name: "lang",
+ Value: "default",
+ Aliases: []string{"l"},
+ Usage: "salomlashish uchun til",
+ },
+ },
+ }
+}
+```
+
+Oling:
+
+```go
+func (qabul qiluvchi *ListCommand) Handle(ctx console.Context) xato {
+ til := ctx.Option("til")
+
+ return nil
+}
+```
+
+Foydalanish:
+
+```shell
+./artisan emails --lang Xitoy
+./artisan emails -l Xitoy
+```
+
+`command.StringFlag` dan tashqari, biz boshqa turdagi `Flag` va `Option*` lardan ham foydalanishimiz mumkin: `StringSliceFlag`, `BoolFlag`, `Float64Flag`, `Float64SliceFlag`, `IntFlag`, `IntSliceFlag`, `Int64Flag`, `Int64SliceFlag`.
+
+### Kirishni So'rash
+
+#### Savollar berish
+
+Argumentlar va opsiyalardan tashqari, siz buyruq bajarilayotganda foydalanuvchidan kirish so'rashingiz mumkin. `Ask` usuli foydalanuvchiga berilgan savolni ko'rsatadi va ularning javobini qaytaradi:
+
+```go
+func (receiver *SendEmails) Handle(ctx console.Context) error {
+ email, err := ctx.Ask("Elektron pochta manzilingiz nima?")
+
+ return err
+}
+```
+
+Bundan tashqari, `Ask` metodiga opsiyalarni ixtiyoriy ikkinchi argument sifatida o‘tkazishingiz mumkin:
+
+```go
+func (qabul qiluvchi *SendEmails) Handle(ctx console.Context) xato {
+ ism, xato := ctx.Ask("Ismingiz nima?", console.AskOption{
+ Default: "Krishan",
+ })
+
+ return xato
+}
+
+// Mavjud opsiyalar
+type AskOption struct {
+ // Default - kiritish uchun standart qiymat.
+ Default string
+ // Description - kiritish tavsifi.
+ Description string
+ // Lines - kiritish uchun qatorlar soni.(ko'p qatorli matn uchun ishlatiladi)
+ Lines int
+ // Limit - kiritish uchun belgilar chegarasi.
+ Limit int
+ // Multiple - kiritish bitta qator yoki ko'p qatorli matn ekanligini aniqlaydi
+ Multiple bool
+ // Placeholder - kiritish uchun joy egallovchi.
+ Placeholder string
+ // Prompt - so'rov xabari.(bitta qatorli kiritish uchun ishlatiladi)
+ Prompt string
+ // Validate - kiritishni tekshirish funksiyasi.
+ Validate func(string) xato
+}
+```
+
+Ba'zan foydalanuvchi kiritishini yashirish kerak bo'lishi mumkin, masalan, parol so'rashda. Siz foydalanuvchi kiritishini yashirish uchun `Secret` usulidan foydalanishingiz mumkin:
+
+```go
+func (receiver *SendEmails) Handle(ctx console.Context) error {
+ password, err := ctx.Secret("Parol nima?", console.SecretOption{
+ Validate: func (s string) error {
+ if len(s) < 8 {
+ return errors.New("parol uzunligi kamida 8 bo'lishi kerak")
+ }
+ return nil
+ },
+ })
+
+ return err
+}
+
+// Mavjud variantlar
+type SecretOption struct {
+ // Default - kiritish uchun standart qiymat.
+ Default string
+ // Description - kiritish tavsifi.
+ Description string
+ // Limit - kiritish uchun belgilar chegarasi.
+ Limit int
+ // Placeholder - kiritish uchun belgilovchi.
+ Placeholder string
+ // Validate - kiritishni tekshirish funksiyasi.
+ Validate func(string) error
+}
+```
+
+#### Amallarni tasdiqlash
+
+Agar foydalanuvchidan harakatni davom ettirishdan oldin tasdiqlashni so'rashingiz kerak bo'lsa, `Confirm` usulidan foydalanishingiz mumkin. Standart holatda, ushbu metod foydalanuvchi ijobiy variantni tanlamaguncha `false` qiymatini qaytaradi.
+
+```go
+agar ctx.Confirm("Davom etishni xohlaysizmi?") {
+ // ...
+}
+```
+
+Shuningdek, siz `Confirm` usuliga ikkinchi argument berib, standart qiymatni, ijobiy va salbiy tugmalarning yorlig'ini sozlashingiz mumkin:
+
+```go
+if ctx.Confirm("Do you wish to continue?", console.ConfirmOption{
+ Default : true,
+ Affirmative : "Yes",
+ Negative : "No",
+}) {
+ // ...
+}
+
+// Available options
+type ConfirmOption struct {
+ // Affirmative label for the affirmative button.
+ Affirmative string
+ // Default the default value for the input.
+ Default bool
+ // Description the input description.
+ Description string
+ // Negative label for the negative button.
+ Negative string
+}
+```
+
+#### Bitta tanlovli savollar
+
+Agar foydalanuvchidan ro'yxatdan variant tanlashni so'rashingiz kerak bo'lsa, `Choice` usulidan foydalanishingiz mumkin. `Choice` usuli tanlangan variantning qiymatini qaytaradi:
+
+```go
+question := "What is your favorite programming language?"
+options := []console.Choice{
+ {Key: "go", Value: "Go"},
+ {Key: "php", Value: "PHP"},
+ {Key: "python", Value: "Python"},
+ {Key: "cpp", Value: "C++", Selected: true},
+}
+color, err := ctx.Choice(question, options)
+```
+
+Shuningdek, siz `Choice` usuliga ixtiyoriy ikkinchi argument sifatida opsiyalarni o‘tkazishingiz mumkin:
+
+```go
+question := "What is your favorite programming language?"
+options := []console.Choice{
+ {Key: "go", Value: "Go"},
+ {Key: "php", Value: "PHP"},
+ {Key: "python", Value: "Python"},
+ {Key: "cpp", Value: "C++", Selected: true},
+}
+
+color, err := ctx.Choice(question, options, console.ChoiceOption{
+ Default: "go",
+})
+
+// Available options
+type ChoiceOption struct {
+ // Default the default value for the input.
+ Default string
+ // Description the input description.
+ Description string
+ // Validate the input validation function.
+ Validate func(string) error
+}
+```
+
+#### Ko'p tanlovli savollar
+
+Agar foydalanuvchidan ro'yxatdan bir nechta variantlarni tanlashni so'rashingiz kerak bo'lsa, `MultiSelect` usulidan foydalanishingiz mumkin. `MultiSelect` usuli tanlangan variantlarning qiymatlarini qaytaradi:
+
+```go
+question := "What are your favorite programming languages?"
+options := []console.Choice{
+ {Key: "go", Value: "Go"},
+ {Key: "php", Value: "PHP"},
+ {Key: "python", Value: "Python"},
+ {Key: "cpp", Value: "C++", Selected: true},
+}
+colors, err := ctx.MultiSelect(question, options)
+```
+
+Bundan tashqari, siz `MultiSelect` usuliga ixtiyoriy ikkinchi argument sifatida variantlarni o‘tkazishingiz mumkin:
+
+```go
+question := "What are your favorite programming languages?"
+options := []console.Choice{
+ {Key: "go", Value: "Go"},
+ {Key: "php", Value: "PHP"},
+ {Key: "python", Value: "Python"},
+ {Key: "cpp", Value: "C++", Selected: true},
+}
+
+colors, err := ctx.MultiSelect(question, options, console.MultiSelectOption{
+ Default: []string{"go", "php"},
+})
+
+// Available options
+type MultiSelectOption struct {
+ // Default the default value for the input.
+ Default []string
+ // Description the input description.
+ Description string
+ // Filterable determines if the choices can be filtered, type `/` to starting filter.
+ Filterable bool
+ // Limit the number of choices that can be selected.
+ Limit int
+ // Validate the input validation function.
+ Validate func([]string) error
+}
+```
+
+### Chiqish yozish
+
+Ba'zan siz konsolga chiqish yozishingiz kerak bo'lishi mumkin. Goravel sizga konsolga chiqish yozishda yordam beradigan bir nechta usullarni taqdim etadi. Har bir metod o'ziga xos rangli chiqishga ega. Masalan, `Error` matnni qizil rangda ko'rsatadi.
+
+```go
+func (receiver *SendEmails) Handle(ctx console.Context) error {
+ ctx.Comment("Bu izoh xabari")
+ ctx.Info("Bu ma'lumot xabari")
+ ctx.Error("Bu xato xabari")
+ ctx.Line("Bu qator xabari")
+ ctx.Warning("Bu ogohlantirish xabari")
+ return nil
+}
+```
+
+Mos rangga mos yozish uchun bir nechta yordamchilar mavjud:
+
+```go
+ctx.Green("Bu yashil xabar")
+ctx.Greenln("Bu yashil chiziqli xabar")
+ctx.Red("Bu qizil xabar")
+ctx.Redln("Bu qizil chiziqli xabar")
+ctx.Yellow("Bu sariq xabar")
+ctx.Yellowln("Bu sariq chiziqli xabar")
+ctx.Black("Bu qora xabar")
+ctx.Blackln("Bu qora chiziqli xabar")
+```
+
+Siz `NewLine` usulidan foydalanib konsolga yangi qator yozishingiz mumkin:
+
+```go
+// bitta bo'sh qator yozish
+ctx.NewLine()
+
+// bir nechta bo'sh qatorlar yozish
+ctx.NewLine(2)
+```
+
+#### Progress Bars
+
+Uzoq davom etadigan vazifalar uchun, foydalanuvchiga vazifa qancha vaqt oladi haqida ma'lumot berish foydali bo'ladi. Siz taraqqiyot panelini ko'rsatish uchun `WithProgressBar` usulidan foydalanishingiz mumkin.
+
+```go
+items := []any{"item1", "item2", "item3"}
+_, err := ctx.WithProgressBar(items, func(item any) error {
+ // performTask(item)
+ return nil
+})
+```
+
+Ba'zan siz progress bar-ni qo'lda yangilashingiz kerak bo'lishi mumkin. Siz progress bar-ni yangilash uchun `CreateProgressBar` usulidan foydalanishingiz mumkin:
+
+```go
+users := []string{"user1", "user2", "user3"}
+bar := ctx.CreateProgressBar(len(users))
+
+err := bar.Start()
+
+for _, user := range users {
+ // process user
+ bar.Advance()
+
+ // sleep for a while to simulate processing
+ time.Sleep(time.Millisecond * 50)
+}
+
+err = bar.Finish()
+```
+
+#### Aylana
+
+Agar vazifa bajarilayotganda spinner ko'rsatish kerak bo'lsa, `Spinner` metodidan foydalanishingiz mumkin.
+
+```go
+err := ctx.Spinner("Yuklanmoqda...", console.SpinnerOption{
+ Action: func() error {
+ // spinner qachon to'xtatilishi kerak
+ time.Sleep(2 * time.Second)
+ return nil
+ },
+})
+```
+
+### Ajratgich
+
+Terminal kengligidagi ajratuvchini ko'rsatish uchun `Divider` metodidan foydalanishingiz mumkin.
+
+```go
+ctx.Divider() // ----------
+ctx.Divider("=>") // =>=>=>=>=>
+```
+
+## Kategoriya
+
+Siz bir qator buyruqlarni bir xil kategoriyaga o'rnatishingiz mumkin, bu `./artisan list` da qulay:
+
+```go
+// Konsol buyrug'ini kengaytirish.
+func (receiver *ConsoleMakeCommand) Extend() command.Extend {
+ return command.Extend{
+ Category: "make",
+ }
+}
+```
+
+## Dasturiy tarzda buyruqlarni bajarish
+
+Ba'zan siz Artisan buyrug'ini CLI tashqarisida bajarishingiz mumkin, buning uchun `facades.Artisan()` da `Call` metodidan foydalanishingiz mumkin.
+
+```go
+facades.Route().Get("/", func(c *gin.Context) {
+ facades.Artisan().Call("emails")
+ facades.Artisan().Call("emails --lang Chinese name") // With arguments and options
+})
+```
+
+## Chop etish ranglarini o‘chirish
+
+Ba'zi buyruqlar standart ravishda ranglarni chiqaradi, masalan, `list` buyrug'i. Biroq, ba'zi terminal yoki jurnallarda rang qiymatlari noto'g'ri ko'rsatilishi mumkin. Siz chop ranglarini o'chirish uchun `--no-ansi` opsiyasidan foydalanishingiz mumkin:
+
+```shell
+./artisan ro'yxat --no-ansi
+```
diff --git a/uz_UZ/digging-deeper/cache.md b/uz_UZ/digging-deeper/cache.md
new file mode 100644
index 000000000..5ca3d271c
--- /dev/null
+++ b/uz_UZ/digging-deeper/cache.md
@@ -0,0 +1,241 @@
+# Kesh
+
+[[toc]]
+
+## Kirish
+
+Goravel kengaytiriladigan keshlash modulini taqdim etadi, uni `facades.Cache()` yordamida boshqarish mumkin. Goravel "memory" haydovchisi bilan birga keladi, boshqa haydovchilar uchun mos keladigan mustaqil kengaytma paketlarini tekshiring:
+
+| Haydovchi | Havola |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| Redis | [https://github.com/goravel/redis](https://github.com/goravel/redis) |
+
+## Konfiguratsiya
+
+Barcha maxsus konfiguratsiyalarni `config/cache.go` faylida bajarishingiz kerak.
+
+## Keshdan foydalanish
+
+### Kontekstni kiritish
+
+```go
+facades.Cache().WithContext(ctx)
+```
+
+### Bir nechta keshlash do'konlariga kirish
+
+Siz `Store` usuli orqali turli xil keshe do'konlariga kirishingiz mumkin. `Store` usuliga o‘tkazilgan kalit sizning keshlash konfiguratsiya faylingizdagi "stores" konfiguratsiya massivida ko‘rsatilgan do‘konlardan biriga mos kelishi kerak:
+
+```go
+value := facades.Cache().Store("redis").Get("foo")
+```
+
+### Keshdan elementlarni olish
+
+```go
+value := facades.Cache().Get("goravel", "default")
+value := facades.Cache().GetBool("goravel", true)
+value := facades.Cache().GetInt("goravel", 1)
+value := facades.Cache().GetString("goravel", "default")
+```
+
+Siz standart qiymat sifatida `func` ni o'tkazishingiz mumkin. Agar ko'rsatilgan ma'lumotlar keshdagi mavjud bo'lmasa, `func` natijasi qaytariladi. Tranzitiv yopish usuli sizga ma'lumotlar bazasidan yoki boshqa tashqi xizmatlardan standart qiymatlarni olish imkonini beradi. `func() any` yopish tuzilishini esda tuting.
+
+```go
+value := facades.Cache().Get("goravel", func() any {
+ return "default"
+})
+```
+
+### Element Mavjudligini Tekshirish
+
+```go
+bool := facades.Cache().Has("goravel")
+```
+
+### Qiymatlarni oshirish / kamaytirish
+
+`Increment` va `Decrement` metodlari keshdagi butun sonli elementlarning qiymatini sozlash uchun ishlatilishi mumkin. Ikkala usul ham elementning qiymatini oshirish yoki kamaytirish miqdorini ko'rsatuvchi ixtiyoriy ikkinchi argumentni qabul qiladi:
+
+```go
+facades.Cache().Increment("key")
+facades.Cache().Increment("key", amount)
+facades.Cache().Decrement("key")
+facades.Cache().Decrement("key", amount)
+```
+
+### Olish va Saqlash
+
+Ba'zan siz keshdan ma'lumot olishni xohlashingiz mumkin va so'ralgan kesh elementi mavjud bo'lmaganda, dastur siz uchun standart qiymatni saqlashi mumkin.
+
+```go
+value, err := facades.Cache().Remember("goravel", 5*time.Second, func() (any, error) {
+ return "goravel", nil
+})
+```
+
+Agar siz izlayotgan ma'lumot keshda mavjud bo'lmasa, `Remember` metodiga o'tkazilgan yopilish funktsiyasi bajariladi, so'ngra natija qaytariladi va keshga joylanadi.
+
+Siz ma'lumotlarni keshdan olish yoki uni doimiy saqlash uchun `RememberForever` usulidan foydalanishingiz mumkin:
+
+```go
+value, err := facades.Cache().RememberForever("goravel", func() (any, error) {
+ return "default", nil
+})
+```
+
+### Olish va o‘chirish
+
+```go
+qiymat := facades.Cache().Pull("goravel", "default")
+```
+
+### Elementlarni keshdagi saqlash
+
+```go
+err := facades.Cache().Put("goravel", "value", 5*time.Second)
+```
+
+Agar keshing amal qilish muddati `0` ga o'rnatilgan bo'lsa, kesh abadiy amal qiladi:
+
+```go
+err := facades.Cache().Put("goravel", "value", 0)
+```
+
+### Agar mavjud bo‘lmasa, saqlash
+
+`Add` usuli ma'lumotni faqat keshda bo'lmaganda saqlaydi. Agar saqlash muvaffaqiyatli bo'lsa, `true` qaytaradi, aks holda `false` qaytaradi.
+
+```go
+bool := facades.Cache().Add("goravel", "qiymat", 5*time.Second)
+```
+
+### Elementlarni Abadiy Saqlash
+
+`Forever` usuli ma'lumotlarni keshda doimiy saqlash uchun ishlatilishi mumkin. Bu ma'lumotlar muddati tugamaydiganligi sababli, ular keshdan `Forget` metodi orqali qo'lda o'chirilishi kerak:
+
+```go
+bool := facades.Cache().Forever("goravel", "qiymat")
+```
+
+### Keshdan elementlarni olib tashlash
+
+```go
+bool := facades.Cache().Forget("goravel")
+```
+
+Siz barcha keshlarni tozalash uchun `Flush` usulidan foydalanishingiz mumkin:
+
+```go
+bool := facades.Cache().Flush()
+```
+
+## Atomik qulf
+
+### Qulf boshqarish
+
+Atomik qulfar raqobat sharoitlaridan xavotir olmasdan tarqatilgan qulfarni boshqarish imkonini beradi. Siz `Lock` usuli yordamida qulf yaratishingiz va boshqarishingiz mumkin:
+
+```go
+lock := facades.Cache().Lock("foo", 10*time.Second)
+
+agar (lock.Get()) {
+ // 10 soniya uchun qulf olindi...
+
+ lock.Release()
+}
+```
+
+`Get` usuli shuningdek, yopilishni qabul qiladi. Yopilish bajarilgandan so'ng, Goravel avtomatik ravishda qulfni bo'shatadi:
+
+```go
+facades.Cache().Lock("foo").Get(func () {
+ // Qulf 10 soniya davomida olingan va avtomatik ravishda ozod qilingan...
+});
+```
+
+Agar siz so‘ragan vaqtda qulf mavjud bo‘lmasa, Goravelga ma’lum sonli soniya kutishni buyurishingiz mumkin. Agar belgilangan vaqt oralig'ida qulfni olish mumkin bo'lmasa, `false` qaytariladi:
+
+```go
+lock := facades.Cache().Lock("foo", 10*time.Second)
+// 5 soniya maksimal kutishdan so'ng qulf olingan...
+if (lock.Block(5*time.Second)) {
+ lock.Release()
+}
+```
+
+Yuqoridagi misol `Block` metodiga yopilishni uzatish orqali soddalashtirilishi mumkin. Ushbu usulga yopilish berilganda, Goravel belgilangan soniyalar davomida qulfni olishga harakat qiladi va yopilish bajarilgandan so'ng qulfni avtomatik ravishda bo'shatadi:
+
+```go
+facades.Cache().Lock("foo", 10*time.Second).Block(5*time.Second, func () {
+ // 5 soniya maksimal kutishdan so'ng qulf olindi...
+})
+```
+
+Agar siz qulfni uning hozirgi egasiga hurmat qilmasdan bo'shatmoqchi bo'lsangiz, `ForceRelease` usulidan foydalanishingiz mumkin:
+
+```go
+facades.Cache().Lock("processing").ForceRelease();
+```
+
+## Maxsus keshlash haydovchilarini qo'shish
+
+### Konfiguratsiya
+
+Agar siz to'liq maxsus haydovchi aniqlashni istasangiz, `config/cache.go` konfiguratsiya faylida `custom` haydovchi turini ko'rsatishingiz mumkin.
+Keyin `framework/contracts/cache/Driver` interfeysini amalga oshirish uchun `via` opsiyasini qo'shing:
+
+```go
+//config/cache.go
+"stores": map[string]interface{}{
+ "memory": map[string]any{
+ "driver": "memory",
+ },
+ "custom": map[string]interface{}{
+ "driver": "custom",
+ "via": &Logger{},
+ },
+},
+```
+
+### Maxsus haydovchini amalga oshirish
+
+`framework/contracts/cache/Driver` interfeysini amalga oshiring, fayllar `app/extensions` papkasida saqlanishi mumkin (o'zgartirish mumkin).
+
+```go
+// framework/contracts/cache/Driver
+package cache
+
+import "time"
+
+type Driver interface {
+ // Add Driver an item in the cache if the key does not exist.
+ Add(key string, value any, t time.Duration) bool
+ Decrement(key string, value ...int) (int, error)
+ // Forever Driver an item in the cache indefinitely.
+ Forever(key string, value any) bool
+ // Forget Remove an item from the cache.
+ Forget(key string) bool
+ // Flush Remove all items from the cache.
+ Flush() bool
+ // Get Retrieve an item from the cache by key.
+ Get(key string, def ...any) any
+ GetBool(key string, def ...bool) bool
+ GetInt(key string, def ...int) int
+ GetInt64(key string, def ...int64) int64
+ GetString(key string, def ...string) string
+ // Has Check an item exists in the cache.
+ Has(key string) bool
+ Increment(key string, value ...int) (int, error)
+ Lock(key string, t ...time.Duration) Lock
+ // Put Driver an item in the cache for a given time.
+ Put(key string, value any, t time.Duration) error
+ // Pull Retrieve an item from the cache and delete it.
+ Pull(key string, def ...any) any
+ // Remember Get an item from the cache, or execute the given Closure and store the result.
+ Remember(key string, ttl time.Duration, callback func() (any, error)) (any, error)
+ // RememberForever Get an item from the cache, or execute the given Closure and store the result forever.
+ RememberForever(key string, callback func() (any, error)) (any, error)
+ WithContext(ctx context.Context) Driver
+}
+```
diff --git a/uz_UZ/digging-deeper/color.md b/uz_UZ/digging-deeper/color.md
new file mode 100644
index 000000000..14ac1beee
--- /dev/null
+++ b/uz_UZ/digging-deeper/color.md
@@ -0,0 +1,52 @@
+# Rang
+
+[[toc]]
+
+## Kirish
+
+`color` paketi [PTerm](https://github.com/pterm/pterm) kutubxonasi yordamida terminal chiqishini ranglash uchun funksiyalar to'plamini taqdim etadi.
+
+## Maxsus Rang
+
+Paket ma'lum ranglar uchun printerlar yaratish usullarini taqdim etadi. Ushbu usullar terminal chiqishini oson rang berish imkonini beradi.
+
+- `color.Red()`
+- `color.Green()`
+- `color.Yellow()`
+- `color.Blue()`
+- `color.Magenta()`
+- `color.Cyan()`
+- `color.White()`
+- `color.Black()`
+- `color.Gray()`
+- `color.Default()`
+
+### Printer Usullari
+
+`contracts/support.Printer` rangli matnni chop etish yoki formatlash uchun quyidagi usullarni taqdim etadi:
+
+- `Print` - Matnni chop etish
+- `Println` - Matnni yangi qator bilan chop etish
+- `Printf` - Formatlangan matnni chop qilish
+- `Sprint` - Rangli matnni qaytarish
+- `Sprintln` - Yangi qator bilan rangli matn qaytaradi
+- `Sprintf` - Formatlangan rangli matnni qaytarish
+
+```go
+import "github.com/goravel/framework/support/color"
+
+color.Blue().Println("Salom, Goravel!")
+color.Green().Printf("Salom, %s!", "Goravel")
+```
+
+## Maxsus Rang
+
+### `color.New`
+
+`color.New` funksiyasi yangi rang printerini yaratadi. Siz terminal chiqishini ranglash uchun ushbu ob'ektdan foydalanishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/color"
+
+color.New(color.FgRed).Println("Hello, Goravel!")
+```
diff --git a/uz_UZ/digging-deeper/event.md b/uz_UZ/digging-deeper/event.md
new file mode 100644
index 000000000..320cf579e
--- /dev/null
+++ b/uz_UZ/digging-deeper/event.md
@@ -0,0 +1,177 @@
+# Tadbirlar
+
+[[toc]]
+
+## Kirish
+
+Goravel hodisalari oddiy kuzatuvchi naqshini amalga oshiradi, ilovangiz ichida sodir bo'ladigan turli xil hodisalarga obuna bo'lish va tinglash imkonini beradi. Tadbir sinflari odatda `app/events` katalogida saqlanadi, ularning tinglovchilari esa `app/listeners` katalogida saqlanadi. Agar ilovangizda bu kataloglarni ko'rmasangiz, xavotirlanmang, chunki ular siz Artisan konsol buyruqlari yordamida hodisalar va tinglovchilarni yaratayotganda siz uchun yaratiladi.
+
+Tadbirlar ilovangizning turli jihatlarini ajratish uchun ajoyib usul bo'lib xizmat qiladi, chunki bitta tadbir bir-biriga bog'liq bo'lmagan bir nechta tinglovchilarga ega bo'lishi mumkin. Masalan, har safar buyurtma jo'natilganda foydalanuvchingizga Slack bildirishnomasini yuborishni xohlashingiz mumkin. Buyurtmani qayta ishlash kodini Slack bildirishnomalari kodingiz bilan bog'lamasdan, siz `app/events/OrderShipped` hodisasini yaratishingiz mumkin, bu esa tinglovchi tomonidan qabul qilinib, Slack bildirishnomasini yuborish uchun ishlatilishi mumkin.
+
+## Tadbirlar va tinglovchilarni ro'yxatdan o'tkazish
+
+Barcha hodisalar va tinglovchilar `bootstrap/app.go` faylidagi `WithEvents` funksiyasi orqali ro'yxatdan o'tkazilishi kerak:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithEvents(func() map[event.Event][]event.Listener {
+ return map[event.Event][]event.Listener{
+ events.NewOrderShipped(): {
+ listeners.NewSendShipmentNotification(),
+ },
+ }
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+### Voqealarni va Tinglovchilarni Yaratish
+
+Siz `make:event` va `make:listener` Artisan buyruqlaridan foydalanib, alohida hodisalar va tinglovchilarni yaratishingiz mumkin:
+
+```go
+./artisan make:event PodcastProcessed
+./artisan make:event user/PodcastProcessed
+
+./artisan make:listener SendPodcastNotification
+./artisan make:listener user/SendPodcastNotification
+```
+
+## Tadbirlarni aniqlash
+
+Tadbir sinfi asosan tadbir bilan bog'liq ma'lumotlarni o'z ichiga olgan ma'lumotlar konteyneridir, `event` ning `Handle` usuli `[]event.Arg` tuzilmasini kiritadi va qaytaradi, bu ma'lumotlarni qayta ishlash uchun ishlatilishi mumkin. Qayta ishlangan ma'lumotlar keyin barcha bog'langan `listener`larga o'tkaziladi. Masalan, `app\events\OrderShipped` hodisasini faraz qilaylik:
+
+```go
+package events
+
+import "github.com/goravel/framework/contracts/event"
+
+type OrderShipped struct {}
+
+func (receiver *OrderShipped) Handle(args []event.Arg) ([]event.Arg, error) {
+ return args, nil
+}
+```
+
+## Tinglovchilarni belgilash
+
+Keyingi, keling, bizning misol hodisasi uchun tinglovchini ko'rib chiqaylik. Tadbir tinglovchilari `Handle` usulining qaytaradigan `[]event.Arg` tadbirini oladi. `Handle` usulida siz hodisaga javob berish uchun zarur bo'lgan har qanday harakatlarni bajara olasiz:
+
+```go
+package listeners
+
+import (
+ "github.com/goravel/framework/contracts/event"
+)
+
+type SendShipmentNotification struct {}
+
+func (receiver *SendShipmentNotification) Signature() string {
+ return "send_shipment_notification"
+}
+
+func (receiver *SendShipmentNotification) Queue(args ...any) event.Queue {
+ return event.Queue{
+ Enable: false,
+ Connection: "",
+ Queue: "",
+ }
+}
+
+func (receiver *SendShipmentNotification) Handle(args ...any) error {
+ return nil
+}
+```
+
+### Tadbirning tarqalishini to'xtatish
+
+Ba'zan, siz hodisaning boshqa tinglovchilarga tarqalishini to'xtatmoqchi bo'lishingiz mumkin. Buning uchun siz tinglovchingizning `Handle` usulidan xatoni qaytarishingiz mumkin.
+
+## Navbatga qo‘yilgan hodisa tinglovchilari
+
+Eshitingiz sekin vazifani bajaradigan bo'lsa, masalan, elektron pochta yuborish yoki HTTP so'rovini amalga oshirish kabi, navbatdagi tinglovchilar foydali bo'lishi mumkin. Navbatga qo‘yilgan tinglovchilardan foydalanishdan oldin, serveringizda yoki mahalliy ishlab chiqish muhitingizda [navbatni sozlang](queues.md) va navbat ishchisini ishga tushiring.
+
+```go
+package listeners
+
+...
+
+func (receiver *SendShipmentNotification) Queue(args ...any) event.Queue {
+ return event.Queue{
+ Enable: false,
+ Connection: "",
+ Queue: "",
+ }
+}
+
+func (receiver *SendShipmentNotification) Handle(args ...any) error {
+ name := args[0]
+
+ return nil
+}
+```
+
+### Navbatga qo‘yilgan hodisa tinglovchilari va maʼlumotlar bazasi tranzaksiyalari
+
+Navbatga qo‘yilgan tinglovchilar ma’lumotlar bazasi tranzaksiyalari ichida jo‘natilganda, navbat ularni ma’lumotlar bazasi tranzaksiyasi tasdiqlanmaganidan oldin qayta ishlashi mumkin. Bunday bo'lganda, ma'lumotlar bazasi tranzaksiyasi davomida modellar yoki ma'lumotlar bazasi yozuvlariga kiritgan yangilanishlaringiz ma'lumotlar bazasida hali aks ettirilmagan bo'lishi mumkin. Bundan tashqari, tranzaksiya ichida yaratilgan har qanday modellar yoki ma'lumotlar bazasi yozuvlari ma'lumotlar bazasida mavjud bo'lmasligi mumkin. Agar tinglovchingiz ushbu modellarga bog'liq bo'lsa, navbatdagi tinglovchini jo'natadigan ish qayta ishlanganda kutilmagan xatolar yuzaga kelishi mumkin. Bu vaqtda, tadbir ma'lumotlar bazasi tranzaksiyalaridan tashqarida joylashtirilishi kerak.
+
+## Vaqtinchalik hodisalar
+
+Biz hodisalarni `facades.Event().Job().Dispatch()` usuli orqali jo‘nata olamiz.
+
+```go
+package controllers
+
+import (
+ "github.com/goravel/framework/contracts/event"
+ "github.com/goravel/framework/contracts/http"
+
+ "goravel/app/events"
+ "goravel/app/facades"
+)
+
+type UserController struct {
+}
+
+func (r UserController) Show(ctx http.Context) {
+ err := facades.Event().Job(&events.OrderShipped{}, []event.Arg{
+ {Type: "string", Value: "Goravel"},
+ {Type: "int", Value: 1},
+ }).Dispatch()
+}
+```
+
+## `event.Arg.Type` qo‘llab-quvvatlanadigan turlar
+
+```go
+bool
+int
+int8
+int16
+int32
+int64
+uint
+uint8
+uint16
+uint32
+uint64
+float32
+float64
+string
+[]bool
+[]int
+[]int8
+[]int16
+[]int32
+[]int64
+[]uint
+[]uint8
+[]uint16
+[]uint32
+[]uint64
+[]float32
+[]float64
+[]string
+```
diff --git a/uz_UZ/digging-deeper/filesystem.md b/uz_UZ/digging-deeper/filesystem.md
new file mode 100644
index 000000000..d811de10a
--- /dev/null
+++ b/uz_UZ/digging-deeper/filesystem.md
@@ -0,0 +1,340 @@
+# Fayl saqlash
+
+[[toc]]
+
+## Kirish
+
+Goravel mahalliy fayl tizimlari, Amazon S3, Aliyun OSS, Tencent COS, Minio va Cloudinary bilan ishlash uchun oddiy drayverlarni taqdim etadi. Yanada yaxshisi, ushbu saqlash variantlari o'rtasida mahalliy ishlab chiqish mashinangiz va ishlab chiqarish serveringiz o'rtasida o'tish juda oddiy, chunki har bir tizim uchun API bir xil bo'lib qoladi. Goravel `local` haydovchi bilan birga keladi, boshqa haydovchilar uchun iltimos, tegishli mustaqil kengaytma paketini tekshiring:
+
+| Haydovchi | Havola |
+| ----------- | ---------------------------------------------------------------------------------------------------- |
+| S3 | [https://github.com/goravel/s3](https://github.com/goravel/s3) |
+| OSS | [https://github.com/goravel/oss](https://github.com/goravel/oss) |
+| Tencent COS | [https://github.com/goravel/cos](https://github.com/goravel/cos) |
+| Minio | [https://github.com/goravel/minio](https://github.com/goravel/minio) |
+
+## Konfiguratsiya
+
+Goravelning fayl tizimi konfiguratsiya fayli `config/filesystems.go` manzilida joylashgan. Ushbu fayl ichida siz barcha fayl tizimi "disk"laringizni sozlashingiz mumkin, har bir disk ma'lum bir saqlash haydovchisi va saqlash joyini ifodalaydi.
+
+> Siz istagancha diskni sozlashingiz mumkin va hatto bir xil haydovchidan foydalanadigan bir nechta disklarga ham ega bo'lishingiz mumkin.
+
+### Mahalliy haydovchi
+
+`local` haydovchidan foydalanganda, barcha fayl operatsiyalari `filesystems` konfiguratsiya faylingizda belgilangan `root` katalogiga nisbatan amalga oshiriladi. Standart bo'yicha, bu qiymat `storage/app` katalogiga o'rnatilgan. Shuning uchun, quyidagi usul `storage/app/example.txt` fayliga yozadi:
+
+```go
+facades.Storage().Put("example.txt", "Tarkib")
+```
+
+### Ommaviy disk
+
+Ilovangizning `filesystems` konfiguratsiya faylida kiritilgan `public` disk umumiy kirish uchun mo'ljallangan fayllar uchun mo'ljallangan. Standart sozlamalar bo'yicha, `public` disk `local` haydovchidan foydalanadi va fayllarini `storage/app/public` papkasida saqlaydi. Agar siz ushbu fayllarga veb orqali tashrif buyurmoqchi bo'lsangiz, fayl marshrutlash yaratishingiz mumkin:
+
+```go
+fasadlar.Route().Static("storage", "./storage/app/public")
+```
+
+## Disk namunalarini olish
+
+`Storage` fasadasi konfiguratsiya qilingan har qanday disklar bilan o'zaro aloqada foydalanish uchun ishlatilishi mumkin. Masalan, siz fasad ustida `Put` usulidan foydalanib, avatar standart diskda saqlashingiz mumkin. Agar siz `Disk` metodini chaqirmasdan `Storage` fasadida metodlarni chaqirsangiz, metod avtomatik ravishda standart diskka o'tkaziladi:
+
+```go
+facades.Storage().Put("avatars/1.png", "Kontent")
+```
+
+Agar ilovangiz bir nechta disk bilan ishlasa, ma'lum bir diskdagi fayllar bilan ishlash uchun `Storage` fasadidagi `Disk` metodidan foydalanishingiz mumkin:
+
+```go
+facades.Storage().Disk("s3").Put("avatars/1.png", "Contents")
+```
+
+## Kontekstni kiritish
+
+```go
+facades.Storage().WithContext(ctx).Put("avatars/1.png", "Contents")
+```
+
+## Fayllarni olish
+
+`Get` usuli fayl mazmunini olish uchun ishlatilishi mumkin. Faylning xom satr tarkibi usul tomonidan qaytariladi. Eslab qoling, barcha fayl yo'llari diskning `root` joylashuviga nisbatan ko'rsatilishi kerak:
+
+```go
+content := facades.Storage().Get("file.jpg")
+```
+
+`Exists` usuli diskda fayl mavjudligini aniqlash uchun ishlatilishi mumkin:
+
+```go
+if (facades.Storage().Disk("s3").Exists("file.jpg")) {
+ // ...
+}
+```
+
+`Missing` usuli diskda fayl yo'qligini aniqlash uchun ishlatilishi mumkin:
+
+```go
+if (facades.Storage().Disk("s3").Missing("file.jpg")) {
+ // ...
+}
+```
+
+### Fayl URL manzillari
+
+Siz berilgan fayl uchun URL olish uchun `Url` metodidan foydalanishingiz mumkin. Agar siz `local` haydovchisidan foydalanayotgan bo'lsangiz, bu odatda berilgan yo'lni `/storage` bilan boshlab, faylga nisbiy URLni qaytaradi. Agar siz `s3` haydovchisidan foydalanayotgan bo'lsangiz, to'liq masofaviy URL qaytariladi:
+
+```go
+url := facades.Storage().Url("file.jpg")
+```
+
+> `local` haydovchidan foydalanganda, `Url`ning qaytarilgan qiymati URL kodlanmagan. Shu sababdan, fayllaringizni haqiqiy URL'lar yaratadigan nomlar bilan saqlashni har doim tavsiya qilamiz.
+
+#### Vaqtinchalik URL manzillar
+
+`TemporaryUrl` usuli yordamida, Non-local haydovchi yordamida saqlangan fayllarga vaqtinchalik URL-lar yaratishingiz mumkin. Bu usul yo'l va URL qachon muddati tugashi kerakligini belgilaydigan `Time` misolini qabul qiladi:
+
+```go
+url, err := facades.Storage().TemporaryUrl(
+ "file.jpg", time.Now().Add(5*time.Minute)
+)
+```
+
+### Fayl Metadata
+
+Fayllarni o'qish va yozishdan tashqari, Goravel fayllarning o'zlari haqida ma'lumot ham taqdim etishi mumkin:
+
+```go
+size := facades.Storage().Size("file.jpg")
+```
+
+`LastModified` usuli faylning oxirgi o'zgartirilgan vaqtini qaytaradi:
+
+```go
+time, err := facades.Storage().LastModified("file.jpg")
+```
+
+Berilgan faylning MIME turi `MimeType` usuli orqali olinishi mumkin:
+
+```go
+mime, err := facades.Storage().MimeType("file.jpg")
+```
+
+Shuningdek, `NewFile` usulidan foydalanish mumkin:
+
+```go
+"github.com/goravel/framework/filesystem" paketini import qiling
+
+file, err := filesystem.NewFile("./logo.png")
+size, err := file.Size()
+lastModified, err := file.LastModified()
+mime, err := file.MimeType()
+```
+
+### Fayl yo'llari
+
+Muayyan fayl uchun yo'lni olish uchun siz `Path` usulidan foydalanishingiz mumkin. `local` haydovchidan foydalanganda, bu sizga faylning nisbiy yoʻlini taqdim etadi. Biroq, agar siz `s3` kabi haydovchidan foydalanayotgan bo'lsangiz, usul sizga faylning bak ichidagi nisbiy yo'lini beradi:
+
+```go
+path := facades.Storage().Path("file.jpg")
+```
+
+## Fayllarni saqlash
+
+`Put` usuli diskda fayl tarkibini saqlash uchun ishlatilishi mumkin. Esda tuting, barcha fayl yo'llari disk uchun sozlangan "root" joyiga nisbatan ko'rsatilishi kerak:
+
+```go
+err := facades.Storage().Put("file.jpg", contents)
+```
+
+Shuningdek, fayllarni to'g'ridan-to'g'ri diskda saqlash uchun `PutFile` va `PutFileAs` dan foydalanishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/filesystem"
+
+// Fayl nomi uchun avtomatik ravishda noyob ID yaratish...
+file, err := filesystem.NewFile("./logo.png")
+path := facades.Storage().PutFile("photos", file)
+
+// Fayl nomini qo'lda belgilash...
+file, err := filesystem.NewFile("./logo.png")
+path := facades.Storage().PutFileAs("photos", file, "photo.jpg")
+```
+
+`PutFile` usuli haqida bir nechta muhim narsalarni esda tutish kerak. E'tibor bering, biz faqat katalog nomini ko'rsatdik, fayl nomini emas. Standart holatda, `PutFile` metodi fayl nomi sifatida xizmat qilish uchun noyob ID yaratadi. Fayl kengaytmasi faylning MIME turini tekshirish orqali aniqlanadi. Fayl yo'li `PutFile` usuli tomonidan qaytariladi, shuning uchun siz yo'lni, shu jumladan yaratilgan fayl nomini, ma'lumotlar bazangizda saqlashingiz mumkin.
+
+### Fayllarni nusxalash va ko'chirish
+
+`Copy` usuli mavjud faylni diskdagi yangi joyga nusxalash uchun ishlatilishi mumkin, `Move` usuli esa mavjud faylni qayta nomlash yoki yangi joyga ko'chirish uchun ishlatilishi mumkin:
+
+```go
+err := facades.Storage().Copy("old/file.jpg", "new/file.jpg")
+
+err := facades.Storage().Move("old/file.jpg", "new/file.jpg")
+```
+
+### Fayl yuklashlar
+
+Veb-ilovalarda fayllarni saqlashning eng keng tarqalgan qo'llanilishlaridan biri foydalanuvchi tomonidan yuklangan fotosuratlar va hujjatlar kabi fayllarni saqlashdir. Goravel yuklangan fayl namunasida `Store` usulidan foydalanib, yuklangan fayllarni saqlashni juda oson qiladi. Yuklangan faylni saqlamoqchi bo'lgan yo'lingiz bilan `Store` metodini chaqiring:
+
+```go
+func (r *UserController) Show(ctx http.Context) {
+ fayl, xato := ctx.Request().File("avatar")
+ yo'l, xato := fayl.Store("avatars")
+}
+```
+
+Ushbu misol haqida bir nechta muhim narsalarni esda tutish kerak. E'tibor bering, biz faqat katalog nomini ko'rsatdik, fayl nomini emas. Standart holatda, `Store` usuli fayl nomi sifatida xizmat qilish uchun noyob ID yaratadi. Fayl kengaytmasi faylning MIME turini tekshirish orqali aniqlanadi. Fayl yo'li `Store` usuli tomonidan qaytariladi, shuning uchun siz yo'lni, jumladan, yaratilgan fayl nomini, ma'lumotlar bazangizda saqlashingiz mumkin.
+
+Shuningdek, yuqoridagi misolda ko'rsatilgan fayl saqlash operatsiyasini bajarish uchun `Storage` fasadida `PutFile` metodini ham chaqirishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/filesystem"
+
+file, err := filesystem.NewFile("./logo.png")
+path := facades.Storage().PutFile("photos", file)
+```
+
+### Fayl nomini ko'rsatish
+
+Agar saqlangan faylingizga avtomatik ravishda fayl nomi berilmasligini istasangiz, `StoreAs` metodidan foydalanishingiz mumkin, bu metod argument sifatida yo‘l, fayl nomi va (ixtiyoriy) diskni qabul qiladi:
+
+```go
+file, err := ctx.Request().File("avatar")
+path, err := file.StoreAs("avatars", "name")
+```
+
+Shuningdek, siz Storage fasadidagi `PutFileAs` metodidan ham foydalanishingiz mumkin, bu yuqoridagi misoldagi kabi fayl saqlash operatsiyasini bajaradi:
+
+```go
+import "github.com/goravel/framework/filesystem"
+
+file, err := filesystem.NewFile("./logo.png")
+path := facades.Storage().PutFileAs("photos", file, "name")
+```
+
+> Agar `StoreAs` va `PutFileAs` tomonidan belgilangan fayl nomida kengaytma bo'lmasa, faylning MIME turiga asoslanib kengaytma avtomatik ravishda qo'shiladi; aks holda, belgilangan fayl nomi to'g'ridan-to'g'ri ishlatiladi.
+
+### Diskni belgilash
+
+Standart holda, yuklangan ushbu faylning `Store` usuli sizning standart diskingizdan foydalanadi. Agar boshqa diskni belgilamoqchi bo'lsangiz, `Disk` metodidan foydalaning:
+
+```go
+func (r *UserController) Show(ctx http.Context) {
+ file, err := ctx.Request().File("avatar")
+ path, err := file.Disk("s3").Store("avatars")
+}
+```
+
+### Boshqa yuklangan fayl ma'lumotlari
+
+Agar yuklangan faylning asl nomi va kengaytmasini olishni istasangiz, `GetClientOriginalName` va `GetClientOriginalExtension` usullaridan foydalanishingiz mumkin:
+
+```go
+file, err := ctx.Request().File("avatar")
+
+name := file.GetClientOriginalName()
+extension := file.GetClientOriginalExtension()
+```
+
+Biroq, `GetClientOriginalName` va `GetClientOriginalExtension` usullari xavfli hisoblanadi, chunki fayl nomi va kengaytmasi yomon niyatli foydalanuvchi tomonidan o'zgartirilishi mumkinligini yodda tuting. Shu sababli, berilgan fayl yuklash uchun nom va kengaytmani olish uchun odatda `HashName` va `Extension` usullarini afzal ko'rishingiz kerak:
+
+```go
+file, err := ctx.Request().File("avatar")
+
+name := file.HashName() // Yagona, tasodifiy nom hosil qilish...
+extension, err := file.Extension() // Faylning MIME turiga asoslanib, fayl kengaytmasini aniqlash...
+```
+
+## Fayllarni o'chirish
+
+`Delete` usuli bitta fayl nomini yoki o'chirish uchun fayllar massivini qabul qiladi:
+
+```go
+err := facades.Storage().Delete("file.jpg")
+err := facades.Storage().Delete("file.jpg", "file2.jpg")
+```
+
+Agar kerak bo'lsa, fayl o'chirilishi kerak bo'lgan diskni belgilashingiz mumkin:
+
+```go
+err := facades.Storage().Disk("s3").Delete("file.jpg")
+```
+
+## Kataloglar
+
+### Barcha Fayllarni Katalog Ichida Olish
+
+`Files` usuli berilgan katalogdagi barcha fayllarning kesmasini qaytaradi. Agar berilgan katalogdagi barcha fayllar ro'yxatini, shu jumladan barcha pastki kataloglarni olishni istasangiz, `AllFiles` metodidan foydalanishingiz mumkin:
+
+```go
+files, err := facades.Storage().Disk("s3").Files("directory")
+files, err := facades.Storage().Disk("s3").AllFiles("directory")
+```
+
+### Katalog Ichidagi Barcha Kataloglarni Oling
+
+`Directories` usuli berilgan katalog ichidagi barcha kataloglarning kesmasini qaytaradi. Bundan tashqari, siz berilgan katalogdagi barcha kataloglar va uning barcha pastki kataloglari ro'yxatini olish uchun `AllDirectories` usulidan foydalanishingiz mumkin:
+
+```go
+directories, err := facades.Storage().Disk("s3").Directories("directory")
+directories, err := facades.Storage().Disk("s3").AllDirectories("directory")
+```
+
+### Papka yaratish
+
+`MakeDirectory` usuli berilgan katalogni, shu jumladan zarur bo'lgan barcha ichki kataloglarni yaratadi:
+
+```go
+err := facades.Storage().MakeDirectory(directory)
+```
+
+### Katalogni o'chirish
+
+Nihoyat, `DeleteDirectory` usuli katalog va uning barcha fayllarini olib tashlash uchun ishlatilishi mumkin:
+
+```go
+err := facades.Storage().DeleteDirectory(directory)
+```
+
+## Maxsus Fayl Tizimlari
+
+Siz `custom` haydovchini `config/filesystems.go` faylida o'rnatishingiz mumkin.
+
+```go
+"custom": map[string]any{
+ "driver": "custom",
+ "via": filesystems.NewLocal(),
+},
+```
+
+Siz `via` konfiguratsiya elementida `github.com/goravel/framework/contracts/filesystem/Driver` interfeysini amalga oshirishingiz kerak.
+
+```go
+type Driver interface {
+ AllDirectories(path string) ([]string, error)
+ AllFiles(path string) ([]string, error)
+ Copy(oldFile, newFile string) error
+ Delete(file ...string) error
+ DeleteDirectory(directory string) error
+ Directories(path string) ([]string, error)
+ Exists(file string) bool
+ Files(path string) ([]string, error)
+ Get(file string) (string, error)
+ GetBytes(file string) ([]byte, error)
+ LastModified(file string) (time.Time, error)
+ MakeDirectory(directory string) error
+ MimeType(file string) (string, error)
+ Missing(file string) bool
+ Move(oldFile, newFile string) error
+ Path(file string) string
+ Put(file, content string) error
+ PutFile(path string, source File) (string, error)
+ PutFileAs(path string, source File, name string) (string, error)
+ Size(file string) (int64, error)
+ TemporaryUrl(file string, time time.Time) (string, error)
+ WithContext(ctx context.Context) Driver
+ Url(file string) string
+}
+```
+
+> Eslatma: Maxsus drayver ro'yxatdan o'tkazilganda konfiguratsiya yuklanmaganligi sababli, iltimos, maxsus drayverda konfiguratsiyani olish uchun `facades.Config().Env()` dan foydalaning.
diff --git a/uz_UZ/digging-deeper/helpers.md b/uz_UZ/digging-deeper/helpers.md
new file mode 100644
index 000000000..eaa8c0822
--- /dev/null
+++ b/uz_UZ/digging-deeper/helpers.md
@@ -0,0 +1,762 @@
+# Yordamchilar
+
+[[toc]]
+
+## Mavjud usullar
+
+### Yo'llar
+
+| | | |
+| -------------------------------------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------- |
+| [path.App()](#path-app) | [path.Base()](#path-base) | [path.Config()](#path-config) |
+| [path.Database()](#path-database) | [path.Storage()](#path-storage) | [path.Public()](#path-public) |
+| [path.Resource()](#path-resource) | | |
+
+### Karbon
+
+| | | |
+| ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
+| [carbon.Now()](#carbon-now) | [carbon.SetTimezone()](#carbon-settimezone) | [carbon.SetLocale()](#carbon-setlocale) |
+| [carbon.SetTestNow()](#carbon-settestnow) | [carbon.ClearTestNow()](#carbon-cleartestnow) | [carbon.IsTestNow()](#carbon-istestnow) |
+| [carbon.Parse()](#carbon-parse) | [carbon.ParseByLayout()](#carbon-parsebylayout) | [carbon.ParseByFormat()](#carbon-parsebyformat) |
+| [carbon.FromTimestamp()](#carbon-fromtimestamp) | [carbon.FromTimestampMilli()](#carbon-fromtimestampmilli) | [carbon.FromTimestampMicro()](#carbon-fromtimestampmicro) |
+| [carbon.FromTimestampNano()](#carbon-fromtimestampnano) | [carbon.FromDateTime()](#carbon-fromdatetime) | [carbon.FromDateTimeMilli()](#carbon-fromdatetimemilli) |
+| [carbon.FromDateTimeMicro()](#carbon-fromdatetimemicro) | [carbon.FromDateTimeNano()](#carbon-fromdatetimenano) | [carbon.FromDate()](#carbon-fromdate) |
+| [carbon.FromDateMilli()](#carbon-fromdatemilli) | [carbon.FromDateMicro()](#carbon-fromdatemicro) | [carbon.FromDateNano()](#carbon-fromdatenano) |
+| [carbon.FromTime()](#carbon-fromtime) | [carbon.FromTimeMilli()](#carbon-fromtimemilli) | [carbon.FromTimeMicro()](#carbon-fromtimemicro) |
+| [carbon.FromTimeNano()](#carbon-fromtimenano) | [carbon.FromStdTime()](#carbon-fromstdtime) | |
+
+### Debug
+
+| | | |
+| -------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- |
+| [debug.Dump()](#debug-dump) | [debug.SDump()](#debug-sdump) | [debug.FDump()](#debug-fdump) |
+
+### Xaritalar
+
+| | | |
+| -------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- |
+| [maps.Add()](#maps-add) | [maps.Exists()](#maps-exists) | [maps.Forget()](#maps-forget) |
+| [maps.Get()](#maps-get) | [maps.Has()](#maps-has) | [maps.HasAny()](#maps-hasany) |
+| [maps.Only()](#maps-only) | [maps.Pull()](#maps-pull) | [maps.Set()](#maps-set) |
+| [maps.Where()](#maps-where) | | |
+
+### Konvertatsiya qilish
+
+| | | |
+| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------- |
+| [convert.Tap()](#convert-tap) | [convert.With()](#convert-with) | [convert.Transform()](#convert-transform) |
+| [convert.Default()](#convert-default) | [convert.Pointer()](#convert-pointer) | |
+
+### Yig'ish
+
+| | | |
+| ---------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
+| [collect.Count()](#collect-count) | [collect.CountBy()](#collect-countby) | [collect.Each()](#collect-each) |
+| [collect.Filter()](#collect-filter) | [collect.GroupBy()](#collect-groupby) | [collect.Keys()](#collect-keys) |
+| [collect.Map()](#collect-map) | [collect.Max()](#collect-max) | [collect.Merge()](#collect-merge) |
+| [collect.Min()](#collect-min) | [collect.Reverse()](#collect-reverse) | [collect.Shuffle()](#collect-shuffle) |
+| [collect.Split()](#collect-split) | [collect.Sum()](#collect-sum) | [collect.Unique()](#collect-unique) |
+| [collect.Values()](#collect-values) | | |
+
+## Yo'llar
+
+```go
+import "github.com/goravel/framework/support/path"
+```
+
+### `path.App()`
+
+`path.App()` funksiyasi ilovangizning ilova katalogiga mutlaq yo'lni qaytaradi. Ilova katalogiga nisbatan faylga yo'l yaratish uchun `path.App()` funksiyasidan ham foydalanishingiz mumkin:
+
+```go
+path := path.App()
+path := path.App("http/controllers/controller.go")
+```
+
+### `path.Base()`
+
+`path.Base()` funksiyasi ilovangizning asosiy katalogiga mutlaq yo'lni qaytaradi. Loyihaning asosiy katalogiga nisbatan berilgan faylga yo'l yaratish uchun `path.Base()` funksiyasidan ham foydalanishingiz mumkin:
+
+```go
+path := path.Base()
+path := path.Base("vendor/bin")
+```
+
+### `path.Config()`
+
+`path.Config()` funksiyasi ilovangizning konfiguratsiya katalogiga mutlaq yo'lni qaytaradi. Ilova konfiguratsiya katalogida berilgan faylga yo'l yaratish uchun siz shuningdek, `path.Config()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Config()
+path := path.Config("app.go")
+```
+
+### `path.Database()`
+
+`path.Database()` funksiyasi ilovangizning ma'lumotlar bazasi katalogiga mutlaq yo'lni qaytaradi. Shuningdek, `ma'lumotlar bazasi` katalogidagi berilgan faylga yo'l yaratish uchun `path.Database()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Database()
+path := path.Database("factories/user_factory.go")
+```
+
+### `path.Storage()`
+
+`path.Storage()` funksiyasi ilovangizning saqlash katalogiga mutlaq yo'lni qaytaradi. Shuningdek, `storage` katalogidagi berilgan faylga yo'l yaratish uchun `path.Storage()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Storage()
+path := path.Storage("app/file.txt")
+```
+
+### `path.Public()`
+
+`path.Public()` funksiyasi ilovangizning umumiy katalogiga mutlaq yo'lni qaytaradi. Shuningdek, siz `public` katalogidagi berilgan faylga yo'l yaratish uchun `path.Public()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Public()
+path := path.Public("css/app.css")
+```
+
+### `path.Lang()`
+
+`path.Lang()` funksiyasi `lang` katalogiga mutlaq yo'lni qaytaradi. Shuningdek, `lang` katalogidagi berilgan faylga yo'l yaratish uchun `path.Lang()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Lang()
+path := path.Lang("en.json")
+```
+
+### `path.Resource()`
+
+`path.Resource()` funksiyasi `resource` katalogiga mutlaq yo'lni qaytaradi. Shuningdek, `resource` katalogidagi berilgan faylga yo'l yaratish uchun `path.Resource()` funksiyasidan foydalanishingiz mumkin:
+
+```go
+path := path.Resource()
+path := path.Resource("css/app.css")
+```
+
+## Carbon
+
+Goravelning "uglerod" moduli [dromara/carbon] (https://github.com/dromara/carbon) tomonidan kengaytirilgan versiya bo'lib, batafsil ma'lumot uchun rasmiy hujjatlarga qarang.
+
+```go
+import "github.com/goravel/framework/support/carbon"
+```
+
+### `carbon.Now()`
+
+The `carbon.Now()` function gets current time:
+
+```go
+carbon.Now()
+```
+
+### `carbon.SetTimezone()`
+
+`carbon.SetTimezone()` funksiyasi vaqt mintaqasini o'rnatadi:
+
+```go
+carbon.SetTimezone(carbon.UTC)
+```
+
+### `carbon.SetLocale()`
+
+`carbon.SetLocale()` funksiyasi til tilini o'rnatadi, barcha qo'llab-quvvatlanadigan tillar uchun [locales list](https://github.com/dromara/carbon/tree/master/lang) ga qarang:
+
+```go
+carbon.SetLocale("en")
+```
+
+### `carbon.SetTestNow()`
+
+`carbon.SetTestNow()` funksiyasi vaqtni sinov qiymatiga o'rnatadi:
+
+```go
+carbon.SetTestNow(carbon.Now())
+```
+
+### `carbon.CleanTestNow()`
+
+`carbon.CleanTestNow()` funksiyasi testni hozir tozalaydi. Carbon obyekti:
+
+```go
+carbon.CleanTestNow()
+```
+
+### `carbon.IsTestNow()`
+
+`carbon.IsTestNow()` funksiyasi vaqtning sinov qiymati ekanligini aniqlaydi:
+
+```go
+carbon.IsTestNow()
+```
+
+### `carbon.Parse()`
+
+`carbon.Parse()` funksiyasi String orqali `Carbon` obyektini oladi:
+
+```go
+carbon.Parse("2020-08-05 13:14:15")
+```
+
+### `carbon.ParseByLayout()`
+
+`carbon.ParseByLayout()` funksiyasi berilgan qiymat va joylashuv bo'yicha `Carbon` obyektini oladi:
+
+```go
+carbon.ParseByLayout("2020-08-05 13:14:15", carbon.DateTimeLayout)
+carbon.ParseByLayout("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"})
+```
+
+### `carbon.ParseByFormat()`
+
+`carbon.ParseByFormat()` funksiyasi berilgan qiymat va format bo'yicha `Carbon` obyektini oladi:
+
+```go
+carbon.ParseByFormat("2020-08-05 13:14:15", carbon.DateTimeFormat)
+carbon.ParseByFormat("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"})
+```
+
+### `carbon.FromTimestamp()`
+
+`carbon.FromTimestamp()` funksiyasi vaqt tamg'asi bo'yicha ikkinchi aniqlik bilan `Carbon` obyektini oladi:
+
+```go
+carbon.FromTimestamp(1577836800)
+```
+
+### `carbon.FromTimestampMilli()`
+
+`carbon.FromTimestampMilli()` funksiyasi `Carbon` obyektini vaqt tamg'asi orqali millisekund aniqligida oladi:
+
+```go
+carbon.FromTimestampMilli(1649735755999)
+```
+
+### `carbon.FromTimestampMicro()`
+
+`carbon.FromTimestampMicro()` funksiyasi mikrosekund aniqlik bilan vaqt tamg'asi orqali `Carbon` obyektini oladi:
+
+```go
+carbon.FromTimestampMicro(1649735755999999)
+```
+
+### `carbon.FromTimestampNano()`
+
+`carbon.FromTimestampNano()` funksiyasi `Carbon` obyektini vaqt tamg'asi orqali nanosekund aniqlik bilan oladi:
+
+```go
+carbon.FromTimestampNano(1649735755999999999)
+```
+
+### `carbon.FromDateTime()`
+
+`carbon.FromDateTime()` funksiyasi `Carbon` obyektini yil, oy, kun, soat, daqiqa, soniya bo'yicha oladi:
+
+```go
+carbon.FromDateTime(2020, 1, 1, 0, 0, 0)
+```
+
+### `carbon.FromDateTimeMilli()`
+
+`carbon.FromDateTimeMilli()` funksiyasi `Carbon` obyektini yil, oy, kun, soat, daqiqa, soniya, millisekund bo'yicha oladi:
+
+```go
+carbon.FromDateTimeMilli(2020, 1, 1, 0, 0, 0, 999)
+```
+
+### `carbon.FromDateTimeMicro()`
+
+`carbon.FromDateTimeMicro()` funksiyasi `Carbon` obyektini yil, oy, kun, soat, daqiqa, soniya, mikrosekund bo'yicha oladi:
+
+```go
+carbon.FromDateTimeMicro(2020, 1, 1, 0, 0, 0, 999999)
+```
+
+### `carbon.FromDateTimeNano()`
+
+`carbon.FromDateTimeNano()` funksiyasi `Carbon` obyektini yil, oy, kun, soat, daqiqa, soniya, nanosekund bo'yicha oladi:
+
+```go
+carbon.FromDateTimeNano(2020, 1, 1, 0, 0, 0, 999999999)
+```
+
+### `carbon.FromDate()`
+
+`carbon.FromDate()` funksiyasi `Carbon` obyektini yil, oy, kun bo'yicha oladi:
+
+```go
+carbon.FromDate(2020, 1, 1)
+```
+
+### `carbon.FromDateMilli()`
+
+`carbon.FromDateMilli()` funksiyasi `Carbon` obyektini yil, oy, kun, millisekund bo'yicha oladi:
+
+```go
+carbon.FromDateMilli(2020, 1, 1, 999)
+```
+
+### `carbon.FromDateMicro()`
+
+`carbon.FromDateMicro()` funksiyasi `Carbon` obyektini yil, oy, kun, mikrosekund bo'yicha oladi:
+
+```go
+carbon.FromDateMicro(2020, 1, 1, 999999)
+```
+
+### `carbon.FromDateNano()`
+
+`carbon.FromDateNano()` funksiyasi `Carbon` obyektini yil, oy, kun, nanosekund bo'yicha oladi:
+
+```go
+carbon.FromDateNano(2020, 1, 1, 999999999)
+```
+
+### `carbon.FromTime()`
+
+`carbon.FromTime()` funksiyasi `Carbon` obyektini soat, daqiqa, soniya bo'yicha oladi:
+
+```go
+carbon.FromTime(13, 14, 15)
+```
+
+### `carbon.FromTimeMilli()`
+
+`carbon.FromTimeMilli()` funksiyasi `Carbon` obyektini soat, daqiqa, soniya, millisekund bo'yicha oladi:
+
+```go
+carbon.FromTimeMilli(13, 14, 15, 999)
+```
+
+### `carbon.FromTimeMicro()`
+
+`carbon.FromTimeMicro()` funksiyasi `Carbon` obyektini soat, daqiqa, soniya, mikrosekund bo'yicha oladi:
+
+```go
+carbon.FromTimeMicro(13, 14, 15, 999999)
+```
+
+### `carbon.FromTimeNano()`
+
+`carbon.FromTimeNano()` funksiyasi `Carbon` obyektini soat, daqiqa, soniya, nanosekund bo'yicha oladi:
+
+```go
+carbon.FromTimeNano(13, 14, 15, 999999999)
+```
+
+### `carbon.FromStdTime()`
+
+`carbon.FromStdTime()` funksiyasi `time.Time` orqali `Carbon` obyektini oladi:
+
+```go
+carbon.FromStdTime(time.Now())
+```
+
+## Nosozliklarni tuzatish
+
+```go
+import "github.com/goravel/framework/support/debug"
+```
+
+### `debug.Dump()`
+
+`debug.Dump()` funksiyasi istalgan o'zgaruvchini chop etadi:
+
+```go
+debug.Dump(myVar1, myVar2, ...)
+```
+
+### `debug.FDump()`
+
+`debug.FDump()` funksiyasi istalgan o'zgaruvchini `io.Writer` ga chop etadi:
+
+```go
+debug.FDump(someWriter, myVar1, myVar2, ...)
+```
+
+### `debug.SDump()`
+
+`debug.SDump()` funksiyasi istalgan o'zgaruvchini `string` ga yozib chiqaradi:
+
+```go
+debug.SDump(myVar1, myVar2, ...)
+```
+
+## Xaritalar
+
+```go
+import "github.com/goravel/framework/support/maps"
+```
+
+### `maps.Add()`
+
+Agar kalit xaritada mavjud bo'lmasa, `maps.Add()` funksiyasi berilgan xaritaga yangi kalit-qiymat juftligini qo'shadi:
+
+```go
+mp := map[string]any{"name": "Krishan"}
+maps.Add(mp, "age", 22)
+// map[string]any{"name": "Krishan", "age": 22}
+
+mp2 := map[string]string{}
+maps.Add(mp2, "name", "Bowen")
+maps.Add(mp2, "name", "Krishan")
+// map[string]string{"name": "Bowen"}
+```
+
+### `maps.Exists()`
+
+`maps.Exists()` funksiyasi berilgan kalit berilgan xaritada mavjudligini aniqlaydi:
+
+```go
+mp := map[string]any{"name": "Krishan", "age": 22}
+
+maps.Exists(mp, "name") // true
+
+maps.Exists(mp, "email") // false
+```
+
+### `maps.Forget()`
+
+`maps.Forget()` funksiyasi berilgan xaritadan berilgan kalit(lar)ni olib tashlaydi:
+
+```go
+mp := map[string]string{"name": "Krishan", "age": "22"}
+
+maps.Forget(mp, "name", "age")
+// map[string]string{}
+```
+
+### `maps.Get()`
+
+`maps.Get()` funksiyasi berilgan xaritadan berilgan kalitning qiymatini oladi. Agar kalit mavjud bo'lmasa, standart qiymat qaytariladi:
+
+```go
+mp := map[string]any{"name": "Bowen"}
+
+maps.Get(mp, "name", "Krishan") // Bowen
+
+maps.Get(mp, "age", 22) // 22
+```
+
+### `maps.Has()`
+
+`maps.Has()` funksiyasi berilgan kalit(lar)ning berilgan xaritada mavjudligini aniqlaydi:
+
+```go
+mp := map[string]any{"name": "Goravel", "language": "Go"}
+
+maps.Has(mp, "name", "language") // true
+
+maps.Has(mp, "name", "age") // false
+```
+
+### `maps.HasAny()`
+
+`maps.HasAny()` funksiyasi berilgan xaritada berilgan kalit(lar)ning birortasi mavjudligini aniqlaydi:
+
+```go
+mp := map[string]any{"name": "Goravel", "language": "Go"}
+
+maps.HasAny(mp, "name", "age") // true
+
+maps.HasAny(mp, "age", "email") // false
+```
+
+### `maps.Only()`
+
+`maps.Only()` funksiyasi berilgan xaritadan faqat berilgan kalit(lar)ni oladi:
+
+```go
+mp := map[string]any{"name": "Goravel", "language": "Go"}
+
+maps.Only(mp, "name")
+// map[string]any{"name": "Goravel"}
+
+maps.Only(mp, "name", "age")
+// map[string]any{"name": "Goravel"}
+```
+
+### `maps.Pull()`
+
+`maps.Pull()` funksiyasi berilgan xaritadan berilgan kalitni oladi va olib tashlaydi:
+
+```go
+mp := map[string]any{"name": "Goravel", "language": "Go"}
+
+maps.Pull(mp, "name")
+// map[string]any{"language": "Go"}
+```
+
+`maps.Pull()` funksiyasiga uchinchi argument sifatida standart qiymat berilishi mumkin. Agar kalit xaritada mavjud bo'lmasa, bu qiymat qaytariladi:
+
+```go
+mp := map[string]any{"name": "Goravel", "language": "Go"}
+
+maps.Pull(mp, "age", "default")
+// map[string]any{"name": "Goravel", "language": "Go"}
+```
+
+### `maps.Set()`
+
+`maps.Set()` funksiyasi berilgan xaritada berilgan kalit va qiymatni o'rnatadi:
+
+```go
+mp := map[string]any{"name": "Goravel"}
+
+maps.Set(mp, "language", "Go")
+// map[string]any{"name": "Goravel", "language": "Go"}
+```
+
+### `maps.Where()`
+
+`maps.Where()` funksiyasi berilgan xaritani berilgan qayta chaqiruv yordamida filtrlaydi:
+
+```go
+mp := map[string]string{"name": "Goravel", "language": "Go"}
+
+maps.Where(mp, func(key string, value string) bool {
+ return key == "name"
+})
+// map[string]string{"name": "Goravel"}
+```
+
+## Konvertatsiya qilish
+
+```go
+import "github.com/goravel/framework/support/convert"
+```
+
+### `convert.Tap()`
+
+`convert.Tap()` funksiyasi berilgan qiymatni berilgan qayta chaqiruvga uzatadi va qiymatni qaytaradi:
+
+```go
+convert.Tap("Goravel", func(value string) {
+ fmt.Println(value + " Framework")
+})
+// Goravel
+
+mp := map[string]string{"name": "Goravel"}
+convert.Tap(mp, func(value map[string]string) {
+ mp["language"] = "Go"
+})
+// map[string]string{"name": "Goravel", "language": "Go"}
+```
+
+### `convert.Transform()`
+
+`convert.Transform()` berilgan qiymatni berilgan qayta chaqiruv yordamida o'zgartiradi va natijani qaytaradi:
+
+```go
+convert.Transform(1, strconv.Itoa)
+// "1"
+
+convert.Transform("foo", func(s string) *foo {
+ return &foo{Name: s}
+})
+// &foo{Name: "foo"}
+```
+
+### `convert.With()`
+
+`convert.With()` berilgan qiymat bilan qaytariladigan chaqiruvni bajaradi va qaytariladigan chaqiruv natijasini qaytaradi:
+
+```go
+convert.With("Goravel", func(value string) string {
+ return value + " Framework"
+})
+// Goravel Framework
+```
+
+### `convert.Default()`
+
+`convert.Default()` usuli birinchi nolga teng bo'lmagan qiymatni qaytaradi. Agar barcha qiymatlar nolga teng bo'lsa, u nol qiymatni qaytaradi.
+
+```go
+convert.Default("", "foo") // foo
+
+convert.Default("bar", "foo") // bar
+
+convert.Default(0, 1) // 1
+```
+
+### `convert.Pointer()`
+
+`convert.Pointer()` usuli berilgan qiymatning ko'rsatkichini qaytaradi.
+
+```go
+convert.Pointer("foo") // *string("foo")
+
+convert.Pointer(1) // *int(1)
+```
+
+## Yig'ish
+
+```go
+import "github.com/goravel/framework/support/collect"
+```
+
+### `collect.Count()`
+
+`collect.Count()` funksiyasi berilgan to'plamdagi elementlar sonini qaytaradi:
+
+```go
+collect.Count([]string{"Goravel", "Framework"}) // 2
+```
+
+### `collect.CountBy()`
+
+`collect.CountBy()` funksiyasi predikat rost bo'lgan holatlarni hisoblaydi:
+
+```go
+collect.CountBy([]string{"Goravel", "Framework"}, func(value string) bool {
+ return strings.Contains(value, "Goravel")
+})
+// 1
+```
+
+### `collect.Each()`
+
+`collect.Each()` funksiyasi berilgan to'plamdagi elementlar ustida iteratsiya qiladi va har bir elementni berilgan qayta chaqiruvga o'tkazadi:
+
+```go
+collect.Each([]string{"Goravel", "Framework"}, func(value string, index int) {
+ fmt.Println(index + 1, value)
+})
+// 1 Goravel
+// 2 Framework
+```
+
+### `collect.Filter()`
+
+`collect.Filter()` funksiyasi berilgan qayta chaqiruv yordamida to'plamdagi elementlarni filtrlaydi:
+
+```go
+collect.Filter([]string{"Goravel", "Framework"}, func(value string) bool {
+ return strings.Contains(value, "Goravel")
+})
+// []string{"Goravel"}
+```
+
+### `collect.GroupBy()`
+
+`collect.GroupBy()` funksiyasi berilgan qayta chaqiruv natijasi bo'yicha to'plamdagi elementlarni guruhlaydi:
+
+```go
+// use example of complex map slice (use different example)
+collect.GroupBy([]map[string]string{
+ {"class": "1", "Name": "Rohan"},
+ {"class": "2", "Name": "Bowen"},
+ {"class": "2", "Name": "Krishan"},
+}, func(value map[string]string) string {
+ return value["class"]
+})
+// map[string][]map[string]string{
+// "1": []map[string]string{{"class": "1", "Name": "Rohan"}},
+// "2": []map[string]string{{"class": "2", "Name": "Bowen"}, {"class": "2", "Name": "Krishan"}},
+// }
+```
+
+### `collect.Keys()`
+
+`collect.Keys()` funksiyasi to'plamdagi elementlar uchun barcha kalitlarni qaytaradi:
+
+```go
+collect.Keys(map[string]string{"name": "Goravel", "language": "Go"})
+// []string{"name", "language"}
+```
+
+### `collect.Map()`
+
+`collect.Map()` funksiyasi berilgan iterate yordamida bir turdagi to'plamni boshqasiga o'zgartiradi:
+
+```go
+collect.Map([]string{"Goravel", "Framework"}, func(value string, _ int) string {
+ return strings.ToUpper(value)
+})
+// []string{"GORAVEL", "FRAMEWORK"}
+```
+
+### `collect.Max()`
+
+`collect.Max()` funksiyasi berilgan to'plamning maksimal qiymatini qaytaradi:
+
+```go
+collect.Max([]int{1, 2, 3, 4, 5}) // 5
+```
+
+### `collect.Merge()`
+
+`collect.Merge()` funksiyasi berilgan xaritalarni bitta xaritaga birlashtiradi:
+
+```go
+collect.Merge(map[string]string{"name": "Goravel"}, map[string]string{"language": "Go"})
+// map[string]string{"name": "Goravel", "language": "Go"}
+
+collect.Merge(map[string]string{"name": "Goravel"}, map[string]string{"name": "Framework"})
+// map[string]string{"name": "Framework"}
+```
+
+### `collect.Min()`
+
+`collect.Min()` funksiyasi berilgan to'plamning minimal qiymatini qaytaradi:
+
+```go
+collect.Min([]int{1, 2, 3, 4, 5}) // 1
+```
+
+### `collect.Reverse()`
+
+`collect.Reverse()` funksiyasi to'plamdagi elementlarni teskari yo'naltiradi:
+
+```go
+collect.Reverse([]string{"Goravel", "Framework"})
+// []string{"Framework", "Goravel"}
+```
+
+### `collect.Shuffle()`
+
+`collect.Shuffle()` funksiyasi to'plamdagi elementlarni aralashtiradi:
+
+```go
+collect.Shuffle([]int{1, 2, 3, 4, 5})
+// []int{3, 1, 5, 2, 4}(example)
+```
+
+### `collect.Split()`
+
+`collect.Split()` funksiyasi to'plamni berilgan uzunlikdagi guruhlarga ajratadi. Agar to'plamni teng ravishda taqsimlab bo'lmasa, oxirgi qism qolgan elementlarni o'z ichiga oladi:
+
+```go
+collect.Split([]int{1, 2, 3, 4, 5}, 2)
+// [][]int{{1, 2}, {3, 4}, {5}}
+```
+
+### `collect.Sum()`
+
+`collect.Sum()` funksiyasi to'plamdagi barcha elementlarning yig'indisini qaytaradi:
+
+```go
+collect.Sum([]int{1, 2, 3, 4, 5}) // 15
+```
+
+### `collect.Unique()`
+
+`collect.Unique()` usuli takroriy qiymatlar bo'lsa, faqat birinchi holat saqlanib qoladigan takroriy to'plamni qaytaradi:
+
+```go
+collect.Unique([]string{"Goravel", "Framework", "Goravel"})
+// []string{"Goravel", "Framework"}
+```
+
+### `collect.Values()`
+
+`collect.Values()` funksiyasi berilgan to'plamning barcha qiymatlarini qaytaradi:
+
+```go
+collect.Values(map[string]string{"name": "Goravel", "language": "Go"})
+// []string{"Goravel", "Go"}
+```
diff --git a/uz_UZ/digging-deeper/http-client.md b/uz_UZ/digging-deeper/http-client.md
new file mode 100644
index 000000000..ad279250d
--- /dev/null
+++ b/uz_UZ/digging-deeper/http-client.md
@@ -0,0 +1,463 @@
+# HTTP mijozi
+
+[[toc]]
+
+## Kirish
+
+Dasturiy ta'minotni ishlab chiqishda, ma'lumotlarni olish uchun API ni chaqirish kerak bo'lgan ko'p holatlar mavjud — xoh u mikroservisga ulanish bo'lsin, xoh uchinchi tomon API siga kirish bo'lsin. Bunday hollarda,
+Goravel standart "net/http" kutubxonasida yaratilgan, foydalanish oson, ifodali va minimalist API-ni taklif qiladi, bularning barchasi ishlab chiquvchilar tajribasini yaxshilash uchun mo'ljallangan.
+
+## Konfiguratsiya
+
+Goravelning HTTP mijozi HTTP so'rovlarini amalga oshirish uchun `net/http.Client` ustiga qurilgan. Agar uning ichki sozlamalarini o'zgartirishingiz kerak bo'lsa, shunchaki `config/http.go` faylidagi `clients` xususiyatini yangilang.
+
+## So'rovlar berish
+
+Http jabhasi tanish fe'llar yordamida HTTP so'rovlarini amalga oshirishning qulay usulini taqdim etadi: `GET`, `POST`, `PUT`, `DELETE`, `PATCH`, `HEAD` va \`OPTIONS.
+
+**Example: GET Request**
+
+```go
+response, err := facades.Http().Get("https://example.com")
+```
+
+Har bir HTTP fe'l usuli `framework/contracts/http/client.Response` turidagi `javob` va agar so'rov bajarilmasa, `err` qaytaradi.
+
+Qaysi HTTP mijoz konfiguratsiyasidan foydalanishni belgilash uchun `Client` funksiyasidan foydalanishingiz mumkin:
+
+```go
+response, err := facades.Http().Client("github").Get("https://example.com")
+```
+
+### Javob interfeysi
+
+`framework/contracts/http/client.Response` interfeysi HTTP javobi bilan o'zaro ishlashning quyidagi usullarini taqdim etadi:
+
+```go
+type Response interface {
+Bind(value any) xatosi // Javob tanasini strukturaga bog'lash
+Body() (string, error) // Javob tanasini satr sifatida olish
+ClientError() bool // Holat kodi 4xx oralig'ida ekanligini tekshirish
+Cookie(name string) *http.Cookie // Muayyan cookie-faylni olish
+Cookie() []*http.Cookie // Barcha javob cookie-fayllarini olish
+Failed() bool // Holat kodi 2xx oralig'ida emasligini tekshirish
+Header(name string) string // Muayyan sarlavhaning qiymatini olish
+Header() http.Header // Barcha javob sarlavhalarini olish
+Json() (map[string]any, error) // Javob tanasini JSON sifatida xaritaga dekodlash
+Redirect() bool // Javob yo'naltirish ekanligini tekshirish (3xx holat kodi)
+ServerError() bool // Holat kodi 5xx oralig'ida ekanligini tekshirish
+Status() int // HTTP holat kodini olish
+Successful() bool // Holat kodi 2xx oralig'ida ekanligini tekshirish
+
+/* holat kodi bilan bog'liq usullar */
+
+OK() bool // 200 OK
+Yaratilgan() bool // 201 Yaratilgan
+Qabul qilingan() bool // 202 Qabul qilingan
+Kontent yo'q() bool // 204 Kontent yo'q Ko'chirildi Doimiy() bool // 301 Doimiy ko'chirildi
+Topildi() bool // 302 Topildi
+NodRequest() bool // 400 Noto'g'ri so'rov Ruxsatsiz() bool // 401 Ruxsatsiz
+To'lov talab qilinadi() bool // 402 To'lov talab qilinadi Taqiqlangan() bool // 403 Taqiqlangan
+Topilmadi() bool // 404 Topilmadi
+RequestTimeout() bool // 408 So'rov vaqti tugadi
+Conflict() bool // 409 Conflict
+UnprocessableEntity() bool // 422 Ishlov berilmaydigan obyekt TooManyRequests() bool // 429 Juda ko'p so'rovlar
+}
+```
+
+### URI shablonlari
+
+URI shablonlari sizga joy egallovchilaridan foydalanib, dinamik so'rov URL manzillarini yaratish imkonini beradi.
+Siz ushbu joy egallovchilarni URL manzilingizda belgilashingiz va keyin so'rov yuborishdan oldin ularni almashtirish uchun qiymatlarni taqdim etishingiz mumkin.
+Bunga erishish uchun siz bitta parametrlar uchun `WithUrlParameter` yoki bir nechta parametrlar uchun `WithUrlParameters` dan foydalanishingiz mumkin.
+
+```go
+response, err := facades.Http().
+ WithUrlParameter("id", "123").
+ Get("https://api.example.com/users/{id}")
+
+// or
+
+response, err := facades.Http().
+ WithUrlParameters(map[string]string{
+ "bookId": "456",
+ "chapterNumber": "7",
+ }).
+ Get("https://api.example.com/books/{bookId}/chapters/{chapterNumber}")
+```
+
+### So'rov parametrlarini so'rash
+
+Bitta parametrlar uchun `WithQueryParameter` yoki xarita orqali bir nechta parametrlar uchun`WithQueryParameters` dan foydalanib, so'rovlaringizga so'rov parametrlarini qo'shing.
+
+```go
+response1, err1 := facades.Http().
+ WithQueryParameter("sort", "name").
+ Get("https://api.example.com/users")
+// Resulting URL: https://api.example.com/users?sort=name
+
+// or multiple query parameters
+response2, err2 := facades.Http().
+ WithQueryParameters(map[string]string{
+ "page": "2",
+ "pageSize": "10",
+ }).
+ Get("https://api.example.com/products")
+// Resulting URL: https://api.example.com/products?page=2&pageSize=10
+```
+
+Shuningdek, so'rov parametrlarini to'g'ridan-to'g'ri formatlangan satr sifatida `WithQueryString` yordamida qo'shishingiz mumkin:
+
+```go
+response, err := facades.Http().
+ WithQueryString("filter=active&order=price").
+ Get("https://api.example.com/items")
+```
+
+### So'rov matnini yuborish
+
+`POST`, `PUT`, `PATCH` va `DELETE` kabi HTTP fe'llari uchun ikkinchi argument sifatida `io.Reader` ni qabul qiling.
+Bino yuklamalarini soddalashtirish uchun tizim so'rov tanalarini qurish uchun foydali usullarni taqdim etadi.
+
+```go
+import "github.com/goravel/framework/support/http"
+
+builder := http.NewBody().SetField("name", "krishan")
+
+body, err := builder.Build()
+
+response, err := facades.Http().WithHeader("Content-Type", body.ContentType()).Post("https://example.com/users", body.Reader())
+```
+
+### Sarlavhalar
+
+Siz so'rovlaringizga bitta sarlavha uchun `WithHeader` yoki xarita sifatida taqdim etilgan bir nechta sarlavhalar uchun `WithHeaders` dan foydalanib sarlavhalar qo'shishingiz mumkin.
+
+```go
+response, err := facades.Http().
+ WithHeader("X-Custom-Header", "value").
+ Get("https://api.example.com")
+
+// Add multiple headers
+response, err = facades.Http().
+ WithHeaders( map[string]string{
+ "Content-Type": "application/json",
+ "Accept": "application/xml",
+ }).
+ Get("https://api.example.com")
+```
+
+So'rovingizga javoban ilovangiz kutayotgan kontent turini ko'rsatish uchun "Qabul qilish" usulidan foydalanishingiz mumkin:
+
+```go
+response, err := facades.Http().
+ Accept("application/xml").
+ Get("https://api.example.com")
+```
+
+Qulaylik uchun, API javobi `application/json` formatida bo'lishini kutishingizni tezda belgilash uchun `AcceptJson` dan foydalanishingiz mumkin:
+
+```go
+response, err := facades.Http().
+ AcceptJson().
+ Get("https://api.example.com/data")
+```
+
+Mavjud sarlavhalarni yangi to'plam bilan almashtirish uchun "ReplaceHeaders" dan foydalaning:
+
+```go
+response, err := facades.Http().
+ ReplaceHeaders(map[string]string{
+ "Authorization": "Bearer token",
+ }).
+ Get("https://api.example.com")
+```
+
+Siz "WithoutHeader" yordamida ma'lum bir sarlavhani olib tashlashingiz yoki "FlushHeaders" yordamida barcha sarlavhalarni tozalashingiz mumkin.
+
+```go
+javob, xato := facades.Http().
+WithoutHeader("X-Previous-Header").
+Get("https://api.example.com")
+
+// barcha sarlavhalarni tozalash
+javob, xato := facades.Http().
+FlushHeaders().
+Get("https://api.example.com")
+```
+
+### Autentifikatsiya
+
+Siz asosiy autentifikatsiyani `WithBasicAuth` usuli yordamida belgilashingiz mumkin:
+
+```go
+response, err := facades.Http().
+ WithBasicAuth("username", "password").
+ Get("https://api.example.com/protected")
+```
+
+#### Bearer tokenlar
+
+So'rovning "Avtorizatsiya" sarlavhasiga tashuvchi tokenni tezda qo'shish uchun siz "WithToken" usulidan foydalanishingiz mumkin:
+
+```go
+response, err := facades.Http().
+ WithToken("your_bearer_token").
+ Get("https://api.example.com/api/resource")
+```
+
+:::tip
+`WithToken` usuli shuningdek, token turini (masalan, "Bearer", "Token") belgilash uchun ixtiyoriy ikkinchi argumentni ham qabul qiladi.
+Agar hech qanday tur ko'rsatilmagan bo'lsa, u standart holatda "Tashiydigan" ga o'rnatiladi.
+
+```go
+response, err := facades.Http().
+ WithToken("custom_token", "Token").
+ Get("https://api.example.com/api/resource")
+```
+
+:::
+
+So'rovdan tashuvchi tokenni olib tashlash uchun `WithoutToken` usulidan foydalaning:
+
+```go
+response, err := facades.Http().
+ WithoutToken().
+ Get("https://api.example.com/api/resource")
+```
+
+### Kontekst
+
+HTTP so'rovlaringizni kontekstga moslashtirish uchun "WithContext" dan foydalanishingiz mumkin.
+Bu sizga so'rovning hayot aylanishini boshqarish imkonini beradi, masalan, vaqtni belgilash yoki bekor qilishni yoqish orqali.
+
+```go
+ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
+defer cancel()
+
+response, err := facades.Http().WithContext(ctx).Get("https://example.com")
+```
+
+### Bog'lanish javobi
+
+Javob bog'lanishi kerak bo'lgan tuzilmani belgilash uchun siz "Bind" usulidan foydalanishingiz mumkin.
+
+```go
+type User struct {
+ ID int `json:"id"`
+ Name string `json:"name"`
+}
+
+func main() {
+ var user User
+ response, err := facades.Http().AcceptJson().Get("https://jsonplaceholder.typicode.com/users/1")
+ if err != nil {
+ fmt.Println("Error making request:", err)
+ return
+ }
+
+ err = response.Bind(&user)
+ if err != nil {
+ fmt.Println("Error binding response:", err)
+ return
+ }
+
+ fmt.Printf("User ID: %d, Name: %s\n", user.ID, user.Name)
+}
+```
+
+### Cookie
+
+HTTP so'rovlaringiz bilan cookie-fayllarni yuborish uchun bitta cookie-fayl uchun `WithCookie` yoki bir nechta cookie-fayllar uchun `WithCookies` dan foydalanishingiz mumkin.
+
+```go
+response, err := facades.Http().
+ WithCookie(&http.Cookie{Name: "user_id", Value: "123"}).
+ Get("https://example.com/profile")
+
+// multiple cookies
+response, err := facades.Http().
+ WithCookies([]*http.Cookie{
+ {Name: "session_token", Value: "xyz"},
+ {Name: "language", Value: "en"},
+ }).
+ Get("https://example.com/dashboard")
+```
+
+So'rovingiz bilan birga ma'lum cookie-fayllar yuborilishining oldini olish uchun siz "WithoutCookie" dan foydalanishingiz mumkin.
+
+```go
+response, err := facades.Http().
+ WithoutCookie("language").
+ Get("https://example.com")
+```
+
+## Sinov
+
+Ilovangizni sinab ko'rishda ko'pincha tashqi API-larga haqiqiy tarmoq so'rovlarini yuborishdan qochishingiz kerak. Goravel testlarni tezlashtirish, tezlik chegaralaridan qochish yoki muvaffaqiyatsizlik stsenariylarini simulyatsiya qilish uchun bo'ladimi, buni osonlashtiradi. “Http” fasadi HTTP mijoziga soʻrovlar yuborilganda notoʻgʻri (soxta) javoblarni qaytarish boʻyicha koʻrsatma berish imkonini beruvchi kuchli “Soxta” usulini taqdim etadi.
+
+### Soxta javoblar
+
+Soxta so'rovlarni boshlash uchun xaritani "Soxta" usuliga o'tkazing. Kalitlar siz ushlamoqchi bo'lgan URL naqshlarini yoki mijoz nomlarini, qiymatlar esa qaytariladigan javoblarni ifodalaydi. Siz `*` belgisini joker belgi sifatida ishlatishingiz mumkin.
+
+"Http" jabhasi turli xil soxta javoblarni yaratish uchun qulay "Javob" quruvchisini taqdim etadi.
+
+```go
+facades.Http().Fake(map[string]any{
+// Muayyan URL manzilini stubga qo'yish
+"https://github.com/goravel/framework": facades.Http().Response().Json(200, map[string]string{"foo": "bar"}),
+
+// Joker belgili naqshni stubga qo'yish
+"https://google.com/*": facades.Http().Response().String(200, "Salom Dunyo"),
+
+// Muayyan mijozni stubga qo'yish (config/http.go da belgilangan)
+"github": facades.Http().Response().OK(),
+})
+```
+
+**Zaxira URL manzillari**
+
+"Soxta" da belgilangan naqshga mos kelmaydigan har qanday so'rov odatda tarmoq orqali bajariladi. Buning oldini olish uchun, siz barcha mos kelmaydigan URL manzillariga mos keladigan bitta `*` joker belgisidan foydalanib, zaxira nusxasini belgilashingiz mumkin.
+
+```go
+facades.Http().Fake(map[string]any{
+ "https://github.com/*": facades.Http().Response().Json(200, map[string]string{"id": "1"}),
+ "*": facades.Http().Response().Status(404),
+})
+```
+
+**Yashirin konversiyalar**
+
+Qulaylik uchun, siz har doim ham "Javob" konstruktoridan foydalanishingiz shart emas. Siz oddiy `int`, `string` yoki `map` qiymatlarini uzatishingiz mumkin va Goravel ularni avtomatik ravishda javoblarga aylantiradi.
+
+```go
+facades.Http().Fake(map[string]any{
+ "https://goravel.dev/*": "Hello World", // String -> 200 OK with body
+ "https://github.com/*": map[string]string{"a": "b"}, // Map -> 200 OK JSON
+ "https://stripe.com/*": 500, // Int -> Status code only
+})
+```
+
+### Soxta javob quruvchisi
+
+`facades.Http().Response()` usuli maxsus javoblarni osongina yaratish uchun ravon interfeysni ta'minlaydi.
+
+```go
+// Fayl tarkibidan foydalanib javob yarating
+facades.Http().Response().File(200, "./tests/fixtures/user.json")
+
+// JSON javobini yarating
+facades.Http().Response().Json(201, map[string]any{"created": true})
+
+// Maxsus sarlavhalar bilan javob yarating
+sarlavhalar := http.Header{}
+headers.Add("X-Custom", "Value")
+facades.Http().Response().Make(200, "Body Content", sarlavhalar)
+
+// Standart holat yordamchilari
+facades.Http().Response().OK()
+facades.Http().Response().Holat(403)
+```
+
+### Soxta javob ketma-ketliklari
+
+Ba'zan bitta URL bir qator turli xil javoblarni ketma-ket qaytarishi kerakligini belgilashingiz kerak bo'lishi mumkin, masalan, qayta urinishlarni sinab ko'rish yoki tezlikni cheklovchi mantiqni sinab ko'rish paytida. Ushbu oqimni yaratish uchun siz "Ketma-ketlik" usulidan foydalanishingiz mumkin.
+
+```go
+facades.Http().Fake(map[string]any{
+"github": facades.Http().Sequence().
+PushStatus(500). // Birinchi so'rov: Server xatosi
+PushString(429, "Tezlik chegarasi"). // Ikkinchi so'rov: Tezlik chegarasi
+PushStatus(200), // Uchinchi so'rov: Muvaffaqiyatli
+})
+```
+
+**Bo'sh ketma-ketliklar**
+
+Ketma-ketlikdagi barcha javoblar tugagach, keyingi so'rovlar mijozning xato qaytarishiga olib keladi.
+Agar xato qilish o'rniga standart javobni ko'rsatmoqchi bo'lsangiz, `WhenEmpty` usulidan foydalaning:
+
+```go
+facades.Http().Fake(map[string]any{
+ "github": facades.Http().Sequence().
+ PushStatus(200).
+ WhenEmpty(facades.Http().Response().Status(404)),
+})
+```
+
+### Tekshirish so'rovlari
+
+Soxta javoblar berishda, to'g'ri so'rovlar aslida sizning arizangiz tomonidan yuborilganligini tekshirish juda muhimdir.
+Siz so'rovni tekshirish va uning sizning kutganlaringizga mos kelishini ko'rsatuvchi mantiqiy qiymatni qaytarish uchun "AssertSent" usulidan foydalanishingiz mumkin.
+
+```go
+facades.Http().AssertSent(func(req client.Request) bool {
+ return req.Url() == "https://api.example.com/users" &&
+ req.Method() == "POST" &&
+ req.Input("role") == "admin" &&
+ req.Header("Authorization") != ""
+})
+```
+
+**Boshqa tasdiqlar**
+
+Shuningdek, ma'lum bir so'rov _yuborilmagan_ligini tasdiqlashingiz yoki yuborilgan so'rovlarning umumiy sonini tekshirishingiz mumkin:
+
+```go
+// So'rov yuborilmaganligini tasdiqlang
+facades.Http().AssertNotSent(func(req client.Request) bool {
+return req.Url() == "https://api.example.com/legacy-endpoint"
+})
+
+// Hech qanday so'rov yuborilmaganligini tasdiqlang
+facades.Http().AssertNothingSent()
+
+// Aynan 3 ta so'rov yuborilganligini tasdiqlang
+facades.Http().AssertSentCount(3)
+```
+
+### Noto'g'ri so'rovlarning oldini olish
+
+Sinovlaringiz qat'iy izolyatsiya qilinganligiga va tasodifan haqiqiy tashqi API-larga tegmasligiga ishonch hosil qilish uchun siz "PreventStrayRequests" usulidan foydalanishingiz mumkin. Buni chaqirgandan so'ng, belgilangan Fake qoidasiga mos kelmaydigan har qanday so'rov testni istisno bilan vahimaga soladi.
+
+```go
+facades.Http().Fake(map[string]any{
+"github": facades.Http().Response().OK(),
+}).PreventStrayRequests()
+
+// Bu so'rov masxara qilindi va muvaffaqiyatli bajarildi
+facades.Http().Client("github").Get("/")
+
+// Bu so'rov masxara qilinmadi va vahimaga tushadi
+facades.Http().Get("https://google.com")
+```
+
+**Maxsus adashganlarga ruxsat berish**
+
+Agar siz ko'pgina so'rovlarni bloklashingiz kerak bo'lsa, lekin ma'lum ichki xizmatlarga (masalan, mahalliy sinov serveriga) ruxsat berishingiz kerak bo'lsa, siz "AllowStrayRequests" dan foydalanishingiz mumkin:
+
+```go
+facades.Http().PreventStrayRequests().AllowStrayRequests([]string{
+ "http://localhost:8080/*",
+})
+```
+
+### Holatni tiklash
+
+"Http" fasadi singleton bo'lib, ya'ni masxara qilingan javoblar tozalanmaguncha sinov to'plamingizning butun ish vaqtida saqlanib qoladi. Bir testdan ikkinchisiga "oqish" holatlarining oldini olish uchun testni tozalash yoki sozlashda qat'iy ravishda "Qayta tiklash" usulidan foydalanishingiz kerak.
+
+```go
+func TestExternalApi(t *testing.T) {
+fasadlarni kechiktirish.Http().Qayta tiklash()
+
+fasadlar.Http().Soxta(nil)
+
+// ... tasdiqlar
+}
+```
+
+:::warning Global holat va parallel sinovlar
+"Soxta" va "Qayta tiklash" usullari HTTP mijoz fabrikasining global holatini o'zgartiradi. Shu sababli, **siz HTTP mijozini parallel ravishda** (`t.Parallel()` yordamida) soxtalashtiradigan testlarni ishga tushirishdan qochishingiz kerak. Buni qilish poyga sharoitlariga olib kelishi mumkin, bunda bitta sinov modellarni qayta o'rnatadi, boshqasi esa hali ham ishlayapti.
+:::
+
+
diff --git a/uz_UZ/digging-deeper/localization.md b/uz_UZ/digging-deeper/localization.md
new file mode 100644
index 000000000..46fd8a318
--- /dev/null
+++ b/uz_UZ/digging-deeper/localization.md
@@ -0,0 +1,187 @@
+# Mahalliylashtirish
+
+[[toc]]
+
+## Kirish
+
+Goravelning lokalizatsiya xususiyatlari turli tillardagi satrlarni olishning qulay usulini taqdim etadi, bu esa ilovangizda bir nechta tillarni qo'llab-quvvatlashni osonlashtiradi. Til satrlari `lang` katalogidagi fayllarda saqlanadi va Goravel til fayllarini tartibga solishning ikkita usulini qo'llab-quvvatlaydi:
+
+Har bir tilning o'z fayli bor:
+
+```
+/lang
+ en.json
+ cn.json
+```
+
+Yoki juda ko'p tarjimalar bo'lsa, ularni quyidagicha tasniflash mumkin:
+
+```
+/lang
+ /en
+ user.json
+ /cn
+ user.json
+```
+
+## Mahalliy sozlamalarni sozlash
+
+Ilovaning standart tili `config/app.go` konfiguratsiya faylidagi `lokal` konfiguratsiya parametrida saqlanadi. Ushbu qiymatni ilovangiz talablariga mos ravishda o'zgartirishingiz mumkin.
+
+Shuningdek, ish vaqtida bitta "HTTP" so'rovi uchun standart tilni o'zgartirish uchun App Facade tomonidan taqdim etilgan "SetLocale" usulidan foydalanishingiz mumkin:
+
+```go
+facades.Route().Get("/", func(ctx http.Context) http.Response {
+ facades.App().SetLocale(ctx, "en")
+
+ return ctx.Response()
+})
+```
+
+Joriy tilda berilgan tarjima satri mavjud bo'lmaganda ishlatiladigan "zaxira lokalizatsiyasi" ni sozlashingiz mumkin. Standart til singari, zaxira tili ham `config/app.go` konfiguratsiya faylida sozlangan.
+
+```
+"fallback_locale": "en",
+```
+
+### Joriy joylashuvni aniqlash
+
+Joriy "mahalliy" ni aniqlash yoki "mahalliy" berilgan qiymat ekanligini tekshirish uchun "CurrentLocale" va "IsLocale" usullaridan foydalanishingiz mumkin.
+
+```
+locale := facades.App().CurrentLocale(ctx)
+if facades.App().IsLocale(ctx, "en") {}
+```
+
+### Tarjima satrlarini aniqlash
+
+Til fayllarida siz bir darajali yoki ko'p darajali tuzilmalarni belgilashingiz mumkin:
+
+```json
+// lang/en.json
+{
+ "name": "It's your name",
+ "required": {
+ "user_id": "UserID is required"
+ }
+}
+```
+
+### Tarjima satrlarini olish
+
+Til fayllaridan tarjima satrlarini olish uchun `facades.Lang(ctx).Get()` usulidan foydalanishingiz mumkin. Agar til fayli bir nechta darajalarni o'z ichiga olsa, ularni ulash uchun `.` dan foydalanishingiz mumkin, agar til fayli bir nechta papkalar darajasida bo'lsa, ularni ulash uchun `/` dan foydalanishingiz mumkin.
+
+Masalan:
+
+```
+// lang/en.json
+{
+ "name": "It's your name",
+ "required": {
+ "user_id": "UserID is required"
+ }
+}
+
+facades.Lang(ctx).Get("name")
+facades.Lang(ctx).Get("required.user_id")
+
+// lang/en/role/user.json
+{
+ "name": "It's your name",
+ "required": {
+ "user_id": "UserID is required"
+ }
+}
+
+facades.Lang(ctx).Get("role/user.name")
+facades.Lang(ctx).Get("role/user.required.user_id")
+```
+
+#### Tarjima satrlarida parametrlarni almashtirish
+
+Siz tarjima satrlarida joy egalarini belgilashingiz mumkin. Barcha o'rin egalari `:` prefiksiga ega. Masalan, xush kelibsiz xabarini aniqlash uchun joy egasidan foydalanishingiz mumkin:
+
+```json
+{
+ "welcome": "Welcome, :name"
+}
+```
+
+Tarjima satrini olishda to'ldiruvchilarni almashtirish uchun, `facades.Lang(ctx).Get()` usuliga ikkinchi parametr sifatida almashtirish xaritasi bilan tarjima opsiyasini o'tkazishingiz mumkin:
+
+```go
+facades.Lang(ctx).Get("welcome", translation.Option{
+ Replace: map[string]string{
+ "name": "Goravel",
+ },
+})
+```
+
+#### Ko'pliklashtirish
+
+Ko'pliklashtirish murakkab muammodir, chunki turli tillarda turli xil ko'pliklashtirish qoidalari mavjud. Biroq, Goravel siz belgilagan pluralizatsiya qoidalari asosida satrlarni tarjima qilishga yordam berishi mumkin. `|` belgisidan foydalanib, satrning birlik va ko'plik shakllarini farqlashingiz mumkin:
+
+```json
+{
+ "apples": "There is one apple|There are many apples"
+}
+```
+
+Hatto bir nechta qiymat diapazonlari uchun tarjima satrlarini belgilash orqali yanada murakkab plyuralizatsiya qoidalarini yaratishingiz mumkin:
+
+```json
+{
+ "apples": "{0} There are none|[1,19] There are some|[20,*] There are many"
+}
+```
+
+Ko'paytirish parametrlari bilan tarjima satrini aniqlagandan so'ng, berilgan `count` uchun qatorni olish uchun `facades.Lang(ctx).Choice()` usulidan foydalanishingiz mumkin. Bu misolda, son 1 dan katta bo'lgani uchun, tarjima satrining ko'plik shakli qaytariladi:
+
+```go
+facades.Lang(ctx).Choice("messages.apples", 10)
+```
+
+Shuningdek, pluralizatsiya satrlarida joy egallovchi atributlarni ham belgilashingiz mumkin. Massivni `facades.Lang(ctx).Choice()` usuliga uchinchi parametr sifatida o'tkazish orqali siz ushbu o'rinbosarlarni almashtirishingiz mumkin:
+
+```
+"minutes_ago": "{1} :value minute ago|[2,*] :value minutes ago",
+
+facades.Lang(ctx).Choice("time.minutes_ago", 5, translation.Option{
+ Replace: map[string]string{
+ "value": "5",
+ },
+})
+```
+
+## Joylashtirish yuklanmoqda
+
+Embed yuklashdan foydalanilganda, til fayllari ikkilik faylga kompilyatsiya qilinadi va endi ularni joylashtirish shart emas. Mustaqil til fayllari va joylashtirish yuklamasi bir vaqtning o'zida ishlatilishi mumkin, shunchaki `config/app.go` faylida `lang_path` va `lang_fs` ni sozlang. Foydalanishda avval mustaqil til fayli rejimi ishlatiladi va mustaqil til fayli mavjud bo'lmaganda, joylashtirish yuklamasi ishlatiladi.
+
+Til fayllari bilan bir xil katalogda `fs.go` faylini yarating:
+
+```
+/lang
+ en.json
+ cn.json
+ fs.go
+```
+
+```go
+// lang/fs.go
+package lang
+
+import "embed"
+
+//go:embed *
+var FS embed.FS
+```
+
+Keyin `config/app.go` faylida sozlang:
+
+```go
+// config/app.go
+import "lang"
+
+"lang_path": "lang",
+"lang_fs": lang.Fs,
+```
diff --git a/uz_UZ/digging-deeper/mail.md b/uz_UZ/digging-deeper/mail.md
new file mode 100644
index 000000000..4a9a253f9
--- /dev/null
+++ b/uz_UZ/digging-deeper/mail.md
@@ -0,0 +1,200 @@
+# Pochta
+
+[[toc]]
+
+## Kirish
+
+Goravel pochtani mahalliy ravishda osongina yuborish uchun `facades.Mail()` dan foydalanishi mumkin.
+
+## Konfiguratsiya
+
+Elektron pochta xabarini yuborishdan oldin, siz `config/mail.go` konfiguratsiya faylini sozlashingiz kerak.
+
+## Pochta yuborish
+
+```go
+import "github.com/goravel/framework/mail"
+
+err := facades.Mail().To([]string{"example@example.com"}).
+ Cc([]string{"example@example.com"}).
+ Bcc([]string{"example@example.com"}).
+ Attach([]string{"file.png"}).
+ Content(mail.Html("<0>Hello Goravel0>")).
+ Headers(map[string]string{"X-Mailer": "Goravel"}).
+ Subject("Subject").
+ Send()
+```
+
+## Navbat bo'yicha xat yuborish
+
+```go
+import "github.com/goravel/framework/mail"
+
+err := facades.Mail().To([]string{"example@example.com"}).
+ Cc([]string{"example@example.com"}).
+ Bcc([]string{"example@example.com"}).
+ Attach([]string{"file.png"}).
+ Content(mail.Html("
Hello Goravel
")).
+ Headers(map[string]string{"X-Mailer": "Goravel"}).
+ Subject("Subject").
+ Queue()
+```
+
+Siz shuningdek, navbatni sozlashingiz mumkin:
+
+```go
+import "github.com/goravel/framework/mail"
+
+err := facades.Mail().To([]string{"example@example.com"}).
+ Cc([]string{"example@example.com"}).
+ Bcc([]string{"example@example.com"}).
+ Attach([]string{"file.png"}).
+ Content(mail.Html("<0>Hello Goravel0>")).
+ Subject("Subject").
+ Headers(map[string]string{"X-Mailer": "Goravel"}).
+ Queue(mail.Queue().Connection("redis").Queue("mail"))
+```
+
+## Yuboruvchini sozlash
+
+Framework global jo'natuvchilar sifatida `config/mail.go` konfiguratsiya faylida `MAIL_FROM_ ADDRESS` va `MAIL_FROM_ NAME` dan foydalanadi. Siz shuningdek, jo'natuvchini sozlashingiz mumkin, ammo pochta manzili sozlangan STMP bilan mos kelishi kerakligini yodda tutishingiz kerak:
+
+```go
+import "github.com/goravel/framework/mail"
+
+err := facades.Mail().To([]string{"example@example.com"}).
+ From(mail.Address(testFromAddress, testFromName)).
+ Cc([]string{"example@example.com"}).
+ Bcc([]string{"example@example.com"}).
+ Attach([]string{"file.png"}).
+ Content(mail.Html("<0>Hello Goravel0>")).
+ Headers(map[string]string{"X-Mailer": "Goravel"}).
+ Subject("Subject").
+ Queue(mail.Queue().Connection("redis").Queue("mail"))
+```
+
+## Mailable’dan foydalanish
+
+Elektron pochta parametrlarini "Mailable" tuzilmasida o'rnatish mumkin. Ushbu tuzilmalar `app/mails` katalogida saqlanadi. Siz "make:mail" Artisan buyrug'i yordamida tezda "Mailable" yaratishingiz mumkin:
+
+```bash
+yugurishga boring. hunarmand yasash: pochta orqali buyurtma yuborildi
+```
+
+Yaratilgan `OrderShipped` tuzilmasi quyidagicha:
+
+```go
+import "github.com/goravel/framework/contracts/mail"
+
+type OrderShipped struct {
+}
+
+func NewOrderShipped() *OrderShipped {
+ return &OrderShipped{}
+}
+
+func (m *OrderShipped) Headers() map[string]string {
+ return map[string]string{
+ "X-Mailer": "goravel",
+ }
+}
+
+func (m *OrderShipped) Attachments() []string {
+ return []string{"../logo.png"}
+}
+
+func (m *OrderShipped) Content() *mail.Content {
+ return &mail.Content{Html: "<0>Hello Goravel0>"}
+}
+
+func (m *OrderShipped) Envelope() *mail.Envelope {
+ return &mail.Envelope{
+ Bcc: []string{"bcc@goravel.dev"},
+ Cc: []string{"cc@goravel.dev"},
+ From: mail.From{Address: "from@goravel.dev", Name: "from"},
+ Subject: "Goravel",
+ To: []string{"to@goravel.dev"},
+ }
+}
+
+func (m *OrderShipped) Queue() *mail.Queue {
+ return &mail.Queue{
+ Connection: "redis",
+ Queue: "mail",
+ }
+}
+```
+
+Keyin siz "Send" va "Queue" usullarida "Mailalbe" dan foydalanishingiz mumkin:
+
+```go
+err := facades.Mail().Send(mails.NewOrderShipped())
+err := facades.Mail().Queue(mails.NewOrderShipped())
+```
+
+## Shablondan foydalanish
+
+Pochta moduli endi shablonlardan to'g'ridan-to'g'ri `html/template` dvigateli yordamida foydalanishni qo'llab-quvvatlaydi. Bu sizga elektron pochta shablonlarini dinamik ma'lumotlar bilan ko'rsatish imkonini beradi.
+
+### Konfiguratsiya
+
+Andoza qo'llab-quvvatlashini yoqish uchun `config/mail.go` faylini sozlang:
+
+```go
+"template": map[string]any{
+ "default": config.Env("MAIL_TEMPLATE_ENGINE", "html"),
+ "engines": map[string]any{
+ "html": map[string]any{
+ "driver": "html",
+ "path": config.Env("MAIL_VIEWS_PATH", "resources/views/mail"),
+ },
+ },
+}
+```
+
+### Shablonlar yaratish
+
+Belgilangan ko'rinishlar katalogida elektron pochta shablonlaringizni yarating. Masalan:
+
+```html
+
+
Welcome {{.Name}}!
+
Thank you for joining {{.AppName}}.
+```
+
+### Shablonlar yordamida elektron pochta xabarlarini yuborish
+
+Shablonni belgilash va dinamik ma'lumotlarni uzatish uchun siz "Content" usulidan foydalanishingiz mumkin:
+
+```go
+facades.Mail().
+ To([]string{"user@example.com"}).
+ Subject("Welcome").
+ Content(mail.Content{
+ View: "welcome.tmpl",
+ With: map[string]any{
+ "Name": "John",
+ "AppName": "Goravel",
+ },
+ }).
+ Send()
+```
+
+### Maxsus shablon dvigatellari
+
+Siz shuningdek, konfiguratsiyada maxsus shablon dvigatellarini ro'yxatdan o'tkazishingiz mumkin:
+
+```go
+"template": map[string]any{
+ "default": "blade",
+ "engines": map[string]any{
+ "blade": map[string]any{
+ "driver": "custom",
+ "via": func() (mail.Template, error) {
+ return NewBladeTemplateEngine(), nil
+ },
+ },
+ },
+}
+```
+
diff --git a/uz_UZ/digging-deeper/package-development.md b/uz_UZ/digging-deeper/package-development.md
new file mode 100644
index 000000000..deee98070
--- /dev/null
+++ b/uz_UZ/digging-deeper/package-development.md
@@ -0,0 +1,185 @@
+# Paketlarni ishlab chiqish
+
+[[toc]]
+
+## Kirish
+
+Paketlar Goravelga funksiyalarni qo'shishning asosiy usuli hisoblanadi. Ushbu paketlar Goravel dasturini takomillashtirish uchun maxsus ishlab chiqilgan marshrutlar, kontrollerlar va konfiguratsiyalarni o'z ichiga olishi mumkin. Ushbu qo'llanma Goravelga xos paketlarni ishlab chiqishga qaratilgan.
+
+Uchinchi tomon paketini yaratishga misol: [goravel/example-package](https://github.com/goravel/example-package)
+
+## Paket yaratish
+
+Artisan buyrug'i yordamida osongina paket shablonini yaratishingiz mumkin:
+
+```shell
+./artisan make:package sms
+```
+
+Yaratilgan fayllar sukut bo'yicha `packages` asosiy papkasida saqlanadi, siz sozlash uchun `--root` parametridan foydalanishingiz mumkin:
+
+```shell
+./artisan make:package --root=pkg sms
+```
+
+## Xizmat ko'rsatuvchilar
+
+[Xizmat ko'rsatuvchi provayderlar](../architecture-concepts/service-providers.md) sizning paketingiz va Goravel o'rtasida ko'prik vazifasini bajaradi. Ular odatda paketning ildiz qismida `service_provider.go` fayli sifatida joylashgan. Ularning asosiy vazifasi Goravel xizmat konteyneriga narsalarni bog'lash va Goravelga paket resurslarini yuklashda yo'l-yo'riq ko'rsatishdir.
+
+## Paketni o'rnating
+
+Paket yaratishda, agar unda `setup/setup.go` fayli bo'lsa, siz ushbu faylda paketni o'rnatish mantig'ini belgilashingiz mumkin va keyin foydalanuvchilar paketni o'rnatish uchun `package:install` buyrug'idan foydalanishlari mumkin:
+
+```shell
+./artisan to'plami: github.com/goravel/example-package ni o'rnating
+```
+
+Quyida `setup/setup.go` faylida belgilangan o'rnatish jarayonining tushuntirishi keltirilgan, bu sizga o'zingizning paket o'rnatish mantig'ingizni yozishga yordam beradi:
+
+```go
+// setup/setup.go
+package main
+
+import (
+ "os"
+
+ "github.com/goravel/framework/packages"
+ "github.com/goravel/framework/packages/modify"
+ "github.com/goravel/framework/support/file"
+ "github.com/goravel/framework/support/path"
+)
+
+func main() {
+ // Yo'llarni olish uchun sozlashni ishga tushiring, bu boshida chaqirilishi kerak.
+ setup := packages.Setup(os.Args)
+
+ // Shu tarzda o'rnatishda konfiguratsiya fayli avtomatik ravishda loyihaning konfiguratsiya katalogiga nashr etiladi.
+ // Ushbu konfiguratsiya faylini qo'lda ham nashr qilishingiz mumkin: ./artisan vendor:publish --package=github.com/goravel/example-package
+ config, err := file.GetPackageContent(setup.Paths().Module().String(), "setup/config/hello.go")
+ if err != nil {
+ panic(err)
+ }
+
+ serviceProvider := "&hello.ServiceProvider{}"
+ moduleImport := setup.Paths().Module().Import()
+
+ setup.Install(
+ // Xizmat ko'rsatuvchi provayderni bootstrap/providers.go saytidagi provayderlar bo'limida ro'yxatdan o'tkazing
+ modify.RegisterProvider(moduleImport, serviceProvider),
+
+ // Konfiguratsiya faylini konfiguratsiya katalogiga qo'shing
+ modify.File(path.Config("hello.go")).Overwrite(config),
+ ).Uninstall(
+ // Konfiguratsiya faylini konfiguratsiya katalogidan olib tashlang
+ modify.File(path.Config("hello.go")).Remove(),
+
+ // bootstrap/providers.go saytidagi provayderlar bo'limidan xizmat ko'rsatuvchi provayderni ro'yxatdan o'chirish
+ modify.UnregisterProvider(moduleImport, serviceProvider),
+ ).Execute()
+}
+```
+
+## Resurslar
+
+### Konfiguratsiya
+
+Odatda, siz paketingizning konfiguratsiya faylini ilovaning "config" katalogiga nashr qilishingiz kerak bo'ladi. Bu sizning paketingiz foydalanuvchilariga standart konfiguratsiya parametrlarini osongina bekor qilish imkonini beradi. Konfiguratsiya fayllaringizni nashr etishga ruxsat berish uchun xizmat ko'rsatuvchi provayderingizning `Boot` usulidan `Publishes` usulini chaqiring, birinchi parametr paket nomi, ikkinchi parametr esa joriy paket fayl yo'li va loyiha yo'li o'rtasidagi xaritalashdir:
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "config/sms.go": app.ConfigPath("sms.go"),
+ })
+}
+```
+
+### Yo'nalishlar
+
+Agar paketingizda [routes](../the-basics/routing.md) mavjud bo'lsa, `facades.Route()` ni hal qilish uchun `app.MakeRoute()` dan foydalanishingiz mumkin, keyin esa loyihaga marshrutlarni qo'shishingiz mumkin:
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ route := app.MakeRoute()
+ route.Get("sms", ***)
+}
+```
+
+### Migratsiyalar
+
+Agar paketingizda [migrations](../database/migrations.md) mavjud bo'lsa, ularni `Publishes` usuli bilan nashr qilishingiz mumkin:
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "migrations": app.DatabasePath("migrations"),
+ })
+}
+```
+
+### Modellar
+
+Agar paketingizning bir qismi sifatida belgilangan yangi [modellar](../orm/getting-started.md) bo'lsa, ularni `Nashr qilish` usuli yordamida nashr etish mumkin:
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "models": app.ModelPath("models"),
+ })
+}
+```
+
+## Buyruqlar
+
+Siz `Artisan` buyrug'ini `Commands` usuli bilan ro'yxatdan o'tkazishingiz mumkin, buyruqlarni ro'yxatdan o'tkazgandan so'ng ularni [Artisan CLI](../digging-deeper/artisan-console.md) yordamida ishga tushirishingiz mumkin.
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Commands([]console.Command{
+ commands.NewSmsCommand(),
+ })
+}
+```
+
+## Davlat aktivlari
+
+Paketingizda JavaScript, CSS va rasmlar kabi aktivlar bo'lishi mumkin. Ushbu aktivlarni ilovaning "ommaviy" katalogiga nashr qilish uchun xizmat ko'rsatuvchi provayderning "Public" usulidan foydalaning:
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "public": app.PublicPath("vendor"),
+ })
+}
+```
+
+## Fayl guruhlarini nashr qilish
+
+Agar siz paket aktivlari va resurslarining ma'lum guruhlarini alohida nashr qilmoqchi bo'lsangiz, paket xizmat ko'rsatuvchi provayderidan "Nashr qilish" usulini chaqirishda teglardan foydalanishingiz mumkin. Bu sizga foydalanuvchilarga konfiguratsiya fayllari kabi ma'lum fayllarni paketning barcha aktivlarini nashr qilmasdan nashr qilish imkoniyatini berish imkonini beradi. Misol tariqasida, paket xizmat ko'rsatuvchi provayderining "Boot" usulidagi teglar yordamida "sms" paketi uchun ikkita nashr guruhini ("sms-config" va "sms-migrations") belgilashingiz mumkin.
+
+```go
+func (receiver *ServiceProvider) Boot(app foundation.Application) {
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "config/sms.go": app.ConfigPath("sms.go"),
+ }, "sms-config")
+ app.Publishes("github.com/goravel/example-package", map[string]string{
+ "migrations": app.DatabasePath("migrations"),
+ }, "sms-migrations")
+}
+```
+
+## Resurslarni nashr qilish
+
+Loyihada siz "vendor:publish" Artisan buyrug'i yordamida paketda ro'yxatdan o'tgan resurslarni nashr qilishingiz mumkin:
+
+```shell
+./artisan vendor:publish --package={You package name}
+```
+
+Buyruq quyidagi variantlardan foydalanishi mumkin:
+
+| Variant nomi | Taxallus | Harakat |
+| ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| --package | -p | Paket nomi masofaviy paket bo'lishi mumkin: `github.com/goravel/example-package`, shuningdek, mahalliy paket bo'lishi mumkin: `./packages/example-package`, mahalliy paket nomidan foydalanganda u `./` bilan boshlanishi kerakligini unutmang. |
+| --tag | -t | Resurslar guruhi |
+| --force | -f | Mavjud fayllarni qayta yozing |
+| --existing | -e | Faqat allaqachon nashr etilgan fayllarni nashr eting va qayta yozing |
diff --git a/uz_UZ/digging-deeper/pluralization.md b/uz_UZ/digging-deeper/pluralization.md
new file mode 100644
index 000000000..a36c6df09
--- /dev/null
+++ b/uz_UZ/digging-deeper/pluralization.md
@@ -0,0 +1,117 @@
+# Ko'pliklashtirish
+
+[[toc]]
+
+## Kirish
+
+Satrlar har qanday veb-ilova uchun muhimdir. Goravel so'zlarni birlik va ko'plik shakllariga aylantirish uchun oddiy yordamchi dasturlarni taqdim etadi. Sukut bo'yicha **inglizcha** ni qo'llab-quvvatlaydi, lekin siz boshqa tillarni yoki maxsus qoidalarni osongina qo'shishingiz mumkin.
+
+## Asosiy foydalanish
+
+Siz `pluralizer` paketidagi `Ko'plik` va `Yakkalik` usullaridan foydalanishingiz mumkin. Bular ko'pgina inglizcha so'zlarni avtomatik ravishda qayta ishlaydi.
+
+```go
+import "github.com/goravel/framework/support/pluralizer"
+
+// So'zlarni ko'p sonli qilish
+pluralizer.Plural("goose") // "geese"
+pluralizer.Plural("car") // "cars"
+
+// So'zlarni birlashtirish
+pluralizer.Singular("geese") // "goose"
+pluralizer.Singular("cars") // "car"
+```
+
+## Maxsus qoidalar
+
+Ba'zan standart qoidalar ma'lum so'zlar uchun yetarli emas. Goravel lets you add your own rules to handle these cases.
+
+:::warning
+Qoidalarni qo'shish plyuralizatsiyaning global miqyosda qanday ishlashini o'zgartiradi. Buni ilova ishga tushganda qilishingiz kerak, masalan, xizmat ko'rsatuvchi provayderning "Yuklash" usulida.
+:::
+
+### Ingliz tilidagi noto'g'ri fellar
+
+Agar so'z noyob ko'plik shakliga ega bo'lsa, uni "tartibsiz" so'z sifatida ro'yxatdan o'tkazishingiz mumkin. Bu ikkala yo'nalishdagi o'zgarishlarni ham boshqaradi.
+
+```go
+import (
+ "github.com/goravel/framework/support/pluralizer"
+ "github.com/goravel/framework/support/pluralizer/rules"
+)
+
+// Register that "mouse" becomes "mice"
+pluralizer.RegisterIrregular("english", rules.NewSubstitution("mouse", "mice"))
+```
+
+### O'zgartirilmagan so'zlar
+
+"Baliq" yoki "media" kabi ba'zi so'zlar shaklini o'zgartirmaydi yoki har doim ko'plikda bo'ladi. Siz ularni "o'zgartirilmagan" deb belgilashingiz mumkin, shuning uchun pluralizer ularni o'tkazib yuboradi.
+
+```go
+// "sheep" birlik va ko'plikda "sheep" bo'lib qoladi
+pluralizer.RegisterUninflected("english", "sheep")
+
+// "media" har doim ko'plik sifatida qabul qilinadi
+pluralizer.RegisterPluralUninflected("english", "media")
+
+// "data" har doim birlik sifatida qabul qilinadi
+pluralizer.RegisterSingularUninflected("english", "data")
+```
+
+## Til Yordami
+
+Goravel sukut bo'yicha "inglizcha" dan foydalanadi, lekin agar kerak bo'lsa, tillarni almashtirishingiz yoki yangilarini qo'shishingiz mumkin.
+
+### Tillarni almashtirish
+
+Agar sizda boshqa tillar ro'yxatdan o'tgan bo'lsa, faol tilni "UseLanguage" yordamida almashtirishingiz mumkin.
+
+```go
+if err := pluralizer.UseLanguage("spanish"); err != nil {
+ panic(err)
+}
+
+// Joriy til nomini oling
+name := pluralizer.GetLanguage().Name()
+```
+
+### Yangi tillar qo'shish
+
+Til qo'shish uchun siz "Til" interfeysini amalga oshirishingiz kerak. Bu so'zlarning o'sha tilda qanday o'zgarishini belgilaydi.
+
+```go
+import "github.com/goravel/framework/contracts/support/pluralizer"
+
+type Language interface {
+ Name() string
+ SingularRuleset() pluralizer.Ruleset
+ PluralRuleset() pluralizer.Ruleset
+}
+```
+
+Til tuzilmangizni amalga oshirgandan so'ng, uni ro'yxatdan o'tkazing va faol deb o'rnating.
+
+```go
+import "github.com/goravel/framework/support/pluralizer"
+
+func init() {
+ // Yangi tilni ro'yxatdan o'tkazing
+ if err := pluralizer.RegisterLanguage(&MyCustomLanguage{}); err != nil {
+ panic(err)
+ }
+
+ // Uni faol sifatida o'rnating
+ _ = pluralizer.UseLanguage("my_custom_language")
+}
+```
+
+## Qo'llab-quvvatlanadigan tillar
+
+Hozirda pluralizer quyidagi tillarni darhol qo'llab-quvvatlaydi:
+
+| Til | Kod | Manba |
+| :-------- | :---------- | :--------------------------------------------------------------------------------------------- |
+| Inglizcha | `inglizcha` | [Manbani ko'rish](https://github.com/goravel/framework/tree/master/support/pluralizer/english) |
+
+_Kelajakdagi nashrlarda ko'proq tillar qo'shiladi. Pull Request orqali yangi tillarga hissa qo'shishingiz mumkin._
\ No newline at end of file
diff --git a/uz_UZ/digging-deeper/processes.md b/uz_UZ/digging-deeper/processes.md
new file mode 100644
index 000000000..3f5613a4c
--- /dev/null
+++ b/uz_UZ/digging-deeper/processes.md
@@ -0,0 +1,409 @@
+# Jarayonlar
+
+[[toc]]
+
+## Kirish
+
+Goravel Go'ning standart `os/exec` paketi atrofida ifodali va oqlangan API taqdim etadi, bu sizga ilovangizdan tashqi buyruqlarni muammosiz chaqirish imkonini beradi. Odatiy bo'lib, Go'ning jarayonlarni boshqarishi batafsil bo'lishi mumkin; Goravel'ning "Jarayon" jabhasi bu umumiy vazifani soddalashtiradi, buyruqlarni bajarish, chiqishlarni boshqarish va asinxron jarayonlarni boshqarish uchun ravon interfeysni taklif qiladi.
+
+## Jarayonlarni chaqirish
+
+### Ishlayotgan jarayonlar
+
+Jarayonni ishga tushirish uchun siz "Run" yoki "Start" usullaridan foydalanishingiz mumkin. `Run` metodi buyruqni bajaradi va uning tugashini kutadi, `Start` metodi esa jarayonni asinxron ravishda ishga tushiradi va boshqaruvni darhol qaytaradi.
+
+Bloklash buyrug'ini quyidagicha bajarishingiz mumkin:
+
+```go
+import (
+ "fmt"
+
+ "goravel/app/facades"
+)
+
+func main() {
+ result := facades.Process().Run("echo", "Hello, World!")
+ if result.Failed() {
+ panic(result.Error())
+ }
+
+ fmt.Println(result.Output())
+}
+```
+
+Agar siz satr buyrug'ini to'g'ridan-to'g'ri (argumentlarga ajratmasdan) ishga tushirmoqchi bo'lsangiz, uni `Run` ga bitta satr sifatida uzatishingiz mumkin, buning uchun `/bin/sh -c` (Linux/macOS) yoki `cmd/C` (Windows) ishlatiladi. E'tibor bering, mexanizm faqat satr buyrug'i bo'shliqlar yoki `&`, `|`, `-` belgilarini o'z ichiga olganda ishga tushirilishi mumkin.
+
+```go
+result := facades.Process().Run("echo Hello, World!")
+// /bin/sh -c ""echo Hello, World!"" on Linux/macOS
+// cmd /c "echo Hello, World!" on Windows
+```
+
+`Run` usuli `Result` interfeysini qaytaradi. "Result" interfeysi sizga buyruqning chiqishi va holatiga qulay kirish imkonini beradi:
+
+```go
+result := facades.Process().Run("ls", "-la")
+
+result.Command() // string: Asl buyruq
+result.Error() // error: Buyruq bajarilishi natijasida qaytarilgan xato
+result.ErrorOutput() // string:Stderr dan chiqish
+result.ExitCode() // int: Chiqish kodi (masalan, 0, 1)
+result.Failed() // bool: Agar chiqish kodi 0 bo'lmasa, rost
+result.Output() // string: Stdout dan chiqish
+```
+
+### Jarayon parametrlari
+
+Ko'pincha buyruq qanday ishlashini, masalan, qayerda ishlashini yoki qanday muhit o'zgaruvchilarini ko'rishini sozlashingiz kerak bo'ladi. "Process" jabhasi buning uchun ravon API taqdim etadi.
+
+#### Path
+
+Buyruq uchun ishchi katalogni ko'rsatish uchun `Path` usulidan foydalanishingiz mumkin. Agar buni o'rnatmasangiz, jarayon ilovangizning joriy ishchi katalogida bajariladi.
+
+```go
+result := facades.Process().Path("/var/www/html").Run("ls", "-la")
+```
+
+#### Timeout
+
+Jarayonning cheksiz vaqt davomida to'xtab qolishining oldini olish uchun siz tanaffusni amalga oshirishingiz mumkin. Agar jarayon belgilangan vaqtdan uzoqroq davom etsa, u o'chiriladi.
+
+```go
+import "time"
+
+result := facades.Process().Timeout(10 * time.Minute).Run("sleep", "20")
+```
+
+#### Atrof-muhit o'zgaruvchilari
+
+Siz maxsus muhit o'zgaruvchilarini jarayonga `Env` usuli yordamida o'tkazishingiz mumkin. Jarayon shuningdek, tizimning muhit o'zgaruvchilarini meros qilib oladi.
+
+```go
+// FOO=BAR ni mavjud tizim envslari bilan birga o'tkazadi.
+result := facades.Process().Env(map[string]string{
+ "FOO": "BAR",
+ "API_KEY": "secret",
+}).Run("printenv")
+```
+
+#### Kirish (Stdin)
+
+Agar sizning buyrug'ingiz standart inputdan (stdin) kirishni kutsa, uni "Input" usuli yordamida taqdim etishingiz mumkin. Bu "io.Reader" ni qabul qiladi.
+
+```go
+import "strings"
+
+// Cat buyrug'iga "Salom Goravel" deb javob beradi
+result := facades.Process().
+ Input(strings.NewReader("Hello Goravel")).
+ Run("cat")
+```
+
+### Jarayon chiqishi
+
+Jarayon natijasiga natija obyektidagi `Output` (standart chiqish) va `ErrorOutput` (standart xato) usullari yordamida bajarilgandan so'ng kirishingiz mumkin.
+
+```go
+result := facades.Process().Run("ls", "-la")
+
+fmt.Println(result.Output())
+fmt.Println(result.ErrorOutput())
+```
+
+Agar siz chiqishni real vaqt rejimida (oqimli) qayta ishlashingiz kerak bo'lsa, "OnOutput" usuli yordamida qayta qo'ng'iroqni ro'yxatdan o'tkazishingiz mumkin. Qayta qo'ng'iroq ikkita argumentni oladi: chiqish turi (stdout yoki stderr) va chiqish ma'lumotlarini o'z ichiga olgan bayt bo'lagi.
+
+```go
+import (
+ "fmt"
+ "github.com/goravel/framework/contracts/process"
+)
+
+result := facades.Process().OnOutput(func(typ process.OutputType, b []byte) {
+ // Bu yerda real vaqt rejimida translyatsiyani boshqaring
+ fmt.Print(string(b))
+}).Run("ls", "-la")
+```
+
+Agar siz faqat bajarilgandan keyin chiqishda ma'lum bir satr borligini tekshirishingiz kerak bo'lsa, siz `SeeInOutput` yoki `SeeInErrorOutput` yordamchi usullaridan foydalanishingiz mumkin.
+
+```go
+result := facades.Process().Run("ls", "-la")
+
+if result.SeeInOutput("go.mod") {
+ // The file exists
+}
+```
+
+#### Jarayon chiqishini o'chirib qo'yish
+
+Agar jarayoningiz katta hajmdagi ma'lumotlarni yozsa, uni qanday saqlashni boshqarishingiz mumkin.
+
+`Quietly` dan foydalanish chiqish ma'lumotlarining konsolga yoki bajarilish vaqtida jurnallarga pufakchalar bilan chiqishining oldini oladi, ammo ma'lumotlar hali ham to'planadi va `result.Output()` orqali mavjud bo'ladi.
+
+Agar siz yakuniy natijaga umuman kirishingiz shart bo'lmasa va xotirani tejashni istasangiz, "DisableBuffering" dan foydalanishingiz mumkin. Bu natija natija obyektida saqlanishiga to'sqinlik qiladi, garchi siz hali ham oqimni real vaqt rejimida "OnOutput" yordamida tekshirishingiz mumkin.
+
+```go
+// Chiqishni yozib oladi, lekin bajarish paytida chop etmaydi
+facades.Process().Quietly().Run("...")
+
+// Chiqishni yozib olmaydi (xotirani tejaydi), lekin oqimli uzatishga imkon beradi
+facades.Process().DisableBuffering().OnOutput(func(typ process.OutputType, b []byte) {
+ // ...
+}).Run("...")
+```
+
+### Quvurlar
+
+Ba'zan siz bir jarayonning chiqishini boshqa jarayonning kirishiga o'tkazishingiz kerak bo'ladi. `Process` fasadi buni `Pipe` usuli yordamida osonlashtiradi, bu sizga bir nechta buyruqlarni sinxron ravishda birlashtirish imkonini beradi.
+
+```go
+import "github.com/goravel/framework/contracts/process"
+
+result := facades.Process().Pipe(func(pipe process.Pipe) {
+ pipe.Command("echo", "Hello, World!")
+ pipe.Command("grep World") // string command: /bin/sh -c "grep World"
+ pipe.Command("tr", "a-z", "A-Z")
+}).Run()
+```
+
+:::warning
+`Timeout`, `Env` yoki `Input` kabi jarayon parametrlari `Pipe` usuli chaqirilgandan **keyin** sozlanishi kerak.
+`Pipe` chaqiruvidan oldin qo'llanilgan har qanday konfiguratsiya e'tiborga olinmaydi.
+
+```go
+// To'g'ri: Quvurdan keyin konfiguratsiya qo'llanildi
+facades.Process().Pipe(...).Timeout(10 * time.Second).Run()
+
+// Noto'g'ri: Vaqt tugashi e'tiborga olinmaydi
+facades.Process().Timeout(10 * time.Second).Pipe(...).Run()
+```
+
+:::
+
+#### Quvur liniyasi chiqishi va kalitlari
+
+Siz quvur liniyasining chiqishini real vaqt rejimida "OnOutput" usuli yordamida tekshirishingiz mumkin. Quvur bilan ishlatilganda, qayta chaqiruv imzosi `kalit` (satr) ni o'z ichiga oladi, bu sizga qaysi buyruq natijani berganini aniqlash imkonini beradi.
+
+Odatiy bo'lib, `key` buyruqning raqamli indeksidir. Biroq, murakkab quvurlarni nosozliklarni tuzatish uchun juda foydali bo'lgan `As` usuli yordamida har bir buyruqqa o'qiladigan yorliq tayinlashingiz mumkin.
+
+```go
+facades.Process().Pipe(func(pipe process.Pipe) {
+ pipe.Command("cat", "access.log").As("source")
+ pipe.Command("grep", "error").As("filter")
+}).OnOutput(func(typ process.OutputType, line []byte, key string) {
+ // 'key' will be "source" or "filter"
+}).Run()
+```
+
+## Asinxron jarayonlar
+
+`Run` usuli jarayon tugashini kutayotgan bir paytda, `Start` usuli jarayonni asinxron ravishda ishga tushirish uchun ishlatilishi mumkin.
+Bu sizning ilovangiz boshqa vazifalarni bajarishda davom etayotgan paytda jarayonning fonda ishlashiga imkon beradi. `Start` usuli `Running` interfeysini qaytaradi.
+
+```go
+import "time"
+
+running, err := facades.Process().Timeout(10 * time.Second).Start("sleep", "5")
+
+// Boshqa ishlarni davom ettiring...
+
+result := running.Wait()
+```
+
+Jarayon bloklanmasdan tugaganligini tekshirish uchun siz `Done` usulidan foydalanishingiz mumkin. Bu jarayon tugaganda yopiladigan standart Go kanalini qaytaradi, bu esa uni `select` operatorlarida foydalanish uchun ideal qiladi.
+
+```go
+running, err := facades.Process().Start("sleep", "5")
+
+select {
+case <-running.Done():
+ // Jarayon muvaffaqiyatli yakunlandi
+case <-time.After(1 * time.Second):
+ // Agar juda ko'p vaqt talab etilsa, maxsus mantiq
+}
+
+result := running.Wait()
+```
+
+:::warning
+Bajarilganlikni aniqlash uchun `Done` kanalidan foydalansangiz ham, keyinroq `Wait()` funksiyasini chaqirishingiz **kerak**.
+Bu jarayonning operatsion tizim tomonidan to'g'ri "reaped" va asosiy resurslarni tozalashini ta'minlaydi.
+:::
+
+### Jarayon identifikatorlari va signallari
+
+Siz `PID` usuli yordamida ishlayotgan jarayon uchun operatsion tizimning jarayon identifikatorini (PID) olishingiz mumkin.
+
+```go
+running, err := facades.Process().Start("ls", "-la")
+
+println(running.PID())
+```
+
+#### Signallarni yuborish
+
+Goravel jarayonning hayot aylanishi bilan o'zaro ta'sir qilish usullarini taqdim etadi. Siz `Signal` usuli yordamida ma'lum bir OS signalini yuborishingiz yoki `Stop` yordamchisidan foydalanib, nafis o'chirishga harakat qilishingiz mumkin.
+
+`Stop` usuli ayniqsa foydalidir: u avval tugatish signalini yuboradi (standart holatda `SIGTERM` ga o‘rnatiladi).
+Agar jarayon belgilangan vaqt ichida tugamasa, u majburan o'chiriladi (`SIGKILL`).
+
+```go
+import (
+ "os"
+ "time"
+)
+
+running, err := facades.Process().Start("sleep", "60")
+
+// Signalni qo'lda yuborish
+running.Signal(os.Interrupt)
+
+// Nafislik bilan to'xtashga harakat qiling, 5 soniya kuting, keyin majburan o'ldiring
+running.Stop(5 * time.Second)
+```
+
+### Jarayon holatini tekshirish
+
+Jarayonning joriy holatini `Running` usuli yordamida tekshirishingiz mumkin. Bu, birinchi navbatda, nosozliklarni tuzatish yoki sog'liqni tekshirish uchun foydalidir, chunki u jarayon hozirda faol yoki yo'qligini ko'rsatadi.
+
+```go
+// Snapshot tekshiruvi (jurnallar yoki ko'rsatkichlar uchun foydali)
+agar running.Running() {
+fmt.Println("Jarayon hali ham faol...")
+}
+```
+
+:::tip
+Agar jarayon tugashi bilan kodni **ijro etish** kerak bo'lsa, `Running()` funksiyasini so'ramang. Buning o'rniga, holatni qayta-qayta tekshirishdan ko'ra ancha samaraliroq bo'lgan `Done()` kanali yoki `Wait()` usulidan foydalaning.
+:::
+
+## Bir vaqtning o'zida sodir bo'ladigan jarayonlar
+
+Goravel bir vaqtning o'zida bir nechta buyruqlarni bajarish imkonini beruvchi bir vaqtning o'zida bir nechta jarayonlarni boshqarishni osonlashtiradi.
+Bu, ayniqsa, ommaviy ishlov berish yoki mustaqil vazifalarni parallel ravishda bajarish uchun foydalidir.
+
+### Hovuzlarni bajarish
+
+Jarayonlar pulini ishga tushirish uchun siz `Pool` usulidan foydalanishingiz mumkin. Bu siz bajarmoqchi bo'lgan buyruqlarni belgilaydigan yopilishni qabul qiladi.
+
+Odatiy bo'lib, `Pool` usuli barcha jarayonlarning tugashini kutadi va jarayon nomi (yoki indeksi) bilan belgilangan natijalar xaritasini qaytaradi.
+
+```go
+results, err := facades.Process().Pool(func(pool process.Pool) {
+ pool.Command("sleep", "1").As("first")
+ pool.Command("sleep 2").As("second") // string command: /bin/sh -c "sleep 2"
+}).Run()
+
+if err != nil {
+ panic(err)
+}
+
+// Natijalarga tayinlangan kalit orqali kirish
+println(results["first"].Output())
+println(results["second"].Output())
+```
+
+### Nomlash jarayonlari
+
+Odatiy bo'lib, hovuzdagi jarayonlar ularning raqamli indekslari (masalan, "0", "1") bilan belgilanadi. Biroq, natijalarga aniqlik kiritish va osonroq kirish uchun har bir jarayonga `As` usuli yordamida noyob nom berishingiz kerak:
+
+```go
+pool.Command("cat", "system.log").As("system")
+```
+
+### Pool imkoniyatlari
+
+`Pool` quruvchisi butun partiyaning bajarilish xatti-harakatlarini boshqarish uchun bir nechta usullarni taqdim etadi.
+
+#### Concurrency
+
+Siz `Concurrency` usuli yordamida bir vaqtning o'zida ishlaydigan jarayonlarning maksimal sonini boshqarishingiz mumkin.
+
+```go
+facades.Process().Pool(func(pool process.Pool) {
+ // 10 ta buyruqni aniqlang...
+}).Concurrency(2).Run()
+```
+
+#### Umumiy vaqt tugashi (Total Timeout)
+
+Siz `Timeout` usuli yordamida butun hovuz bajarilishi uchun global vaqtni belgilashingiz mumkin. Agar hovuz bu vaqtdan ko'proq vaqt talab qilsa, barcha ishlayotgan jarayonlar to'xtatiladi.
+
+```go
+facades.Process().Pool(...).Timeout(1 * time.Minute).Run()
+```
+
+### Asinxron hovuzlar
+
+Agar ilovangiz boshqa vazifalarni bajarayotgan paytda hovuzni fonda ishga tushirishingiz kerak bo'lsa, `Run` o'rniga "Ishga `Start` usulidan foydalanishingiz mumkin. Bu `RunningPool` deskriptorini qaytaradi.
+
+```go
+runningPool, err := facades.Process().Pool(func(pool process.Pool) {
+ pool.Command("sleep", "5").As("long_task")
+}).Start()
+
+// Hovuz hali ham ishlayotganini tekshiring
+if runningPool.Running() {
+ fmt.Println("Pool is active...")
+}
+
+// Barcha jarayonlar tugashini kuting va natijalarni to'plang
+results := runningPool.Wait()
+```
+
+#### Running Pools bilan o'zaro aloqa
+
+`RunningPool` interfeysi faol hovuzni boshqarishning bir nechta usullarini taqdim etadi:
+
+- **`PIDs()`**: Buyruq nomi bilan belgilangan jarayon identifikatorlari xaritasini qaytaradi.
+- **`Signal(os.Signal)`**: Hovuzdagi barcha ishlayotgan jarayonlarga signal yuboradi.
+- **`Stop(timeout, signal)`**: Barcha jarayonlarni nafislik bilan to'xtatadi.
+- **`Done()`**: Hovuz tugagach yopiladigan kanalni qaytaradi, bu `select` operatorlari uchun foydali.
+
+```go
+select {
+case <-runningPool.Done():
+ // Barcha jarayonlar tugadi
+case <-time.After(10 * time.Second):
+ // Agar barcha jarayonlar juda uzoq davom etsa, ularni majburan to'xtatish
+ runningPool.Stop(1 * time.Second)
+}
+```
+
+### Pool Output
+
+Siz `OnOutput` usuli yordamida real vaqt rejimida hovuzning chiqishini tekshirishingiz mumkin.
+
+:::warning
+`OnOutput` qayta chaqiruvi bir vaqtning o'zida bir nechta goroutinlardan chaqirilishi mumkin. Qayta qo'ng'iroq qilish mantig'ingiz ish zarrachalaridan himoyalanganligiga ishonch hosil qiling.
+:::
+
+```go
+facades.Process().Pool(func(pool process.Pool) {
+ pool.Command("ping", "google.com").As("ping")
+}).OnOutput(func(typ process.OutputType, line []byte, key string) {
+ // kalit "ping" bo'ladi
+ fmt.Printf("[%s] %s", key, string(line))
+}).Run()
+```
+
+### Jarayon bo'yicha konfiguratsiya
+
+Hovuz ta'rifi ichida har bir buyruq yakka jarayonlarga o'xshash individual konfiguratsiya usullarini qo'llab-quvvatlaydi:
+
+- **`Path(string)`**: Ishchi katalogni o'rnatadi.
+- **`Env(map[string]string)`**: Muhit o'zgaruvchilarini o'rnatadi.
+- **`Input(io.Reader)`**: Standart kiritishni o'rnatadi.
+- **`Timeout(time.Duration)`**: Muayyan buyruq uchun vaqtni belgilaydi.
+- **`Quietly()`**: Ushbu maxsus buyruq uchun chiqish yozib olishni o'chiradi.
+- **`DisableBuffering()`**: Xotira buferlashni o'chiradi (yuqori hajmli chiqish uchun foydali).
+
+```go
+facades.Process().Pool(func(pool process.Pool) {
+ pool.Command("find", "/", "-name", "*.log").
+ As("search").
+ Path("/var/www").
+ Timeout(10 * time.Second).
+ DisableBuffering()
+}).Run()
+```
diff --git a/uz_UZ/digging-deeper/queues.md b/uz_UZ/digging-deeper/queues.md
new file mode 100644
index 000000000..34adfbc3d
--- /dev/null
+++ b/uz_UZ/digging-deeper/queues.md
@@ -0,0 +1,304 @@
+# Navbatlar
+
+[[toc]]
+
+## Kirish
+
+Veb-ilovangizni yaratishda, veb-so‘rov davomida bajarish uchun juda uzoq vaqt talab qiladigan, yuklangan CSV faylini tahlil qilish va saqlash kabi vazifalar bo‘lishi mumkin. Xo‘sh, Goravel sizga orqa fonda ishlaydigan navbatga qo‘yilgan ishlarni yaratish imkoniyatini beruvchi yechimni taklif qiladi. Shu tarzda, vaqt talab qiladigan vazifalarni navbatga o‘tkazish orqali, ilovangiz veb-so‘rovlarga ancha tezroq javob bera oladi va mijozlaringiz uchun yaxshi foydalanuvchi tajribasini taqdim etadi. Ushbu xususiyatni amalga oshirish uchun biz `facades.Queue()` dan foydalanamiz.
+
+### Ulanishlar va Navbatlar
+
+Goravel navbatlarini chuqur o‘rganishdan oldin, "ulanishlar" va "navbatlar" o‘rtasidagi farqni tushunish muhimdir. Konfiguratsiya faylida, `config/queue.go` da, `connections` konfiguratsiyasi uchun massivni topasiz. Ushbu parametr Redis kabi orqa fondagi navbat xizmatlariga ulanishlarni belgilaydi. Biroq, har bir navbat ulanishi bir nechta "navbatlarga" ega bo‘lishi mumkin, ular navbatga qo‘yilgan ishlarning turli steklari yoki to‘plamlari deb tushunilishi mumkin.
+
+Navbat konfiguratsiya faylidagi har bir ulanish konfiguratsiyasi misolida `queue` atributi mavjudligini ta‘kidlash muhimdir. Ushbu atribut, ishlar berilgan ulanishga yuborilganda ular yuboriladigan standart navbatdir. Oddiyroq qilib aytganda, agar siz ishni qaysi navbatga yuborilishi kerakligini aniq belgilamasdan yuborsangiz, ish ulanish konfiguratsiyasining queue atributida belgilangan navbatga joylashtiriladi.
+
+```go
+// Bu ish standart ulanishning standart navbatiga yuboriladi
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{
+ {Type: "int", Value: 1},
+}).Dispatch()
+
+// Bu ish standart ulanishning "emails" navbatiga yuboriladi
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{
+ {Type: "int", Value: 1},
+}).OnQueue("emails").Dispatch()
+```
+
+## Haydovchi
+
+Navbat konfiguratsiya fayli `config/queue.go` da saqlanadi va konfiguratsiya faylida turli navbat haydovchilari o‘rnatilishi mumkin.
+
+### Sinxron Haydovchi
+
+Sinxron haydovchi standart haydovchidir, u vazifalarni navbatga qo‘ymaydi, balki joriy jarayonda bevosita bajaradi.
+
+### Ma'lumotlar Bazasi Haydovchisi
+
+`database` haydovchisidan foydalanish uchun avval vazifalarni saqlash uchun ma'lumotlar bazasi jadvalini yaratishingiz kerak: [20210101000002_create_jobs_table.go](https://github.com/goravel/goravel/blob/master/database/migrations/20210101000002_create_jobs_table.go). Migratsiya fayli sukut bo‘yicha `database/migrations` katalogida joylashgan.
+
+### Maxsus Haydovchi
+
+Agar joriy haydovchi sizning ehtiyojlaringizni qondira olmasa, siz haydovchini sozlashingiz mumkin. Siz `contracts/queue/driver.go` dagi [Driver](https://github.com/goravel/framework/blob/master/contracts/queue/driver.go#L14) interfeysini amalga oshirishingiz kerak.
+
+`Redis` drayverining rasmiy amalga oshirilishi, siz o'z maxsus drayveringizni amalga oshirish uchun [Redis Drayveri](https://github.com/goravel/redis) ga murojaat qilishingiz mumkin.
+
+Maxsus haydovchini amalga oshirgandan so‘ng, konfiguratsiyani `config/queue.go` ga qo‘shishingiz mumkin:
+
+```
+...
+"connections": map[string]any{
+ "redis": map[string]any{
+ "driver": "custom",
+ "connection": "default",
+ "queue": "default",
+ "via": func() (queue.Driver, error) {
+ return redisfacades.Queue("redis") // redis qiymati connections kalitidir
+ },
+ },
+},
+```
+
+## Ishlarni Yaratish
+
+### Ish Klasslarini Yaratish
+
+Sukut bo‘yicha, ilovangizning barcha ishlari `app/jobs` katalogida saqlanadi. Agar `app/Jobs` katalogi mavjud bo‘lmasa, u `make:job` Artisan buyrug‘ini ishga tushirganingizda yaratiladi:
+
+```shell
+./artisan make:job ProcessPodcast
+./artisan make:job user/ProcessPodcast
+```
+
+### Ishlarni ro'yxatdan o'tkazish
+
+`make:job` tomonidan yaratilgan yangi ish `bootstrap/jobs.go::Jobs()` funksiyasida avtomatik ro'yxatdan o'tkaziladi va funksiya `WithJobs` tomonidan chaqiriladi. Agar ish faylini o'zingiz yaratgan bo'lsangiz, ishni qo'lda ro'yxatdan o'tkazishingiz kerak.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithJobs(Jobs).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+### Klass Tuzilmasi
+
+Ish klasslari juda oddiy, ikkita usuldan iborat: `Signature` va `Handle`. `Signature` vazifaning o‘ziga xos identifikatori vazifasini bajaradi, `Handle` esa navbat vazifani qayta ishlaganda bajariladi. Bundan tashqari, vazifa bajarilganda uzatilgan `[]queue.Arg{}` `Handle` ga uzatiladi:
+
+```go
+package jobs
+
+type ProcessPodcast struct {
+}
+
+// Signature Ishning nomi va imzosi.
+func (r *ProcessPodcast) Signature() string {
+ return "process_podcast"
+}
+
+// Handle Ishni bajarish.
+func (r *ProcessPodcast) Handle(args ...any) error {
+ return nil
+}
+```
+
+#### Ishni Qayta Urinish
+
+Ish klasslari ishni qayta urinishni boshqarish uchun ishlatiladigan ixtiyoriy `ShouldRetry(err error, attempt int) (retryable bool, delay time.Duration)` usulini qo‘llab-quvvatlaydi.
+
+```go
+// ShouldRetry xatoga asoslanib, ish qayta urinib ko‘rilishini belgilaydi.
+func (r *ProcessPodcast) ShouldRetry(err error, attempt int) (retryable bool, delay time.Duration) {
+ return true, 10 * time.Second
+}
+```
+
+## Navbat Serverini Ishga Tushirish
+
+Standart navbat ishchisi navbat seriver provayderining runneri tomonidan ishga tushiriladi, agar siz turli konfiguratsiyalar bilan bir nechta navbat ishchilarini ishga tushirmoqchi bo'lsangiz, [runner](../architecture-concepts/service-providers.md#runners) yaratishingiz va uni `bootstrap/app.go` faylidagi `WithRunners` funksiyasiga qo'shishingiz mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithRunners(func() []contractsfoundation.Runner {
+ return []contractsfoundation.Runner{
+ YourRunner,
+ }
+ }).
+ Create()
+}
+```
+
+Siz ma'lumot uchun [standart navbat runneri](https://github.com/goravel/framework/blob/master/queue/runners.go) ni tekshirishingiz mumkin.
+
+## Ishlarni Yuborish
+
+Ish klassini yozganingizdan so‘ng, uni ishning o‘zidagi `Dispatch` usuli yordamida yuborishingiz mumkin:
+
+```go
+package controllers
+
+import (
+ "github.com/goravel/framework/contracts/queue"
+ "github.com/goravel/framework/contracts/http"
+
+ "goravel/app/facades"
+ "goravel/app/jobs"
+)
+
+type UserController struct {
+}
+
+func (r *UserController) Show(ctx http.Context) {
+ err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).Dispatch()
+ if err != nil {
+ // do something
+ }
+}
+```
+
+### Sinxron Yuborish
+
+Agar siz ishni darhol (sinxron ravishda) yubormoqchi bo‘lsangiz, `DispatchSync` usulidan foydalanishingiz mumkin. Ushbu usuldan foydalanganda, ish navbatga qo‘yilmaydi va joriy jarayon ichida darhol bajariladi:
+
+```go
+package controllers
+
+import (
+ "github.com/goravel/framework/contracts/queue"
+ "github.com/goravel/framework/contracts/http"
+
+ "goravel/app/facades"
+ "goravel/app/jobs"
+)
+
+type UserController struct {
+}
+
+func (r *UserController) Show(ctx http.Context) {
+ err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).DispatchSync()
+ if err != nil {
+ // do something
+ }
+}
+```
+
+### Ishlar Zanjiri
+
+Ishlar zanjiri sizga ma‘lum tartibda bajarilishi kerak bo‘lgan navbatga qo‘yilgan ishlar ro‘yxatini belgilash imkonini beradi. Agar ketma-ketlikdagi har qanday ish muvaffaqiyatsiz bo‘lsa, qolgan ishlar bajarilmaydi. Navbatga qo‘yilgan ishlar zanjirini ishga tushirish uchun `facades.Queue()` tomonidan taqdim etilgan `Chain` usulidan foydalanishingiz mumkin:
+
+```go
+err := facades.Queue().Chain([]queue.Jobs{
+ {
+ Job: &jobs.Test{},
+ Args: []queue.Arg{
+ {Type: "int", Value: 1},
+ },
+ },
+ {
+ Job: &jobs.Test1{},
+ Args: []queue.Arg{
+ {Type: "int", Value: 2},
+ },
+ },
+}).Dispatch()
+```
+
+### Kechiktirilgan Yuborish
+
+Agar siz ishning navbat ishchisi tomonidan darhol qayta ishlanmasligini belgilamoqchi bo‘lsangiz, ish yuborilayotganda `Delay` usulidan foydalanishingiz mumkin. Misol uchun, ish yuborilgandan 100 soniyadan keyin qayta ishlash uchun mavjud bo‘lmasligini belgilaymiz:
+
+```go
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).Delay(time.Now().Add(100*time.Second)).Dispatch()
+```
+
+### Navbat va Ulanishni Sozlash
+
+#### Muayyan Navbatga Yuborish
+
+Ishlarni turli navbatlarga yuborish orqali, siz navbatga qo‘yilgan ishlaringizni "toifalarga ajratishingiz" va hatto turli navbatlarga qancha ishchi tayinlash ustunligini belgilashingiz mumkin.
+
+```go
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).OnQueue("processing").Dispatch()
+```
+
+#### Muayyan Ulanishga Yuborish
+
+Agar ilovangiz bir nechta navbat ulanishlari bilan ishlayotgan bo‘lsa, vazifa qaysi ulanishga yuborilishini belgilash uchun `OnConnection` usulidan foydalanishingiz mumkin.
+
+```go
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).OnConnection("sync").Dispatch()
+```
+
+Siz ish uchun ulanish va navbatni belgilash uchun `OnConnection` va `OnQueue` usullarini birgalikda zanjirlashingiz mumkin:
+
+```go
+err := facades.Queue().Job(&jobs.Test{}, []queue.Arg{}).OnConnection("sync").OnQueue("processing").Dispatch()
+```
+
+## Muvaffaqiyatsiz Ishlarni Ko‘rish
+
+Muvaffaqiyatsiz ishlarni ko‘rish uchun `queue:failed` buyrug‘idan foydalanishingiz mumkin, bu buyruq ma‘lumotlar bazasidagi `failed_jobs` jadvalidan muvaffaqiyatsiz ishlarni oladi:
+
+```shell
+./artisan queue:failed
+```
+
+## Muvaffaqiyatsiz Ishlarni Qayta Urinish
+
+Agar ish qayta ishlash paytida muvaffaqiyatsiz bo‘lsa, ishni qayta urinish uchun `queue:retry` buyrug‘idan foydalanishingiz mumkin. Ishni qayta urinishdan oldin, ma‘lumotlar bazasidagi `failed_jobs` jadvalidan qayta urinilishi kerak bo‘lgan ishning UUID ni olishingiz kerak:
+
+```shell
+# Bitta ishni qayta urinish
+./artisan queue:retry 4427387e-c75a-4295-afb3-2f3d0e410494
+
+# Bir nechta ishlarni qayta urinish
+./artisan queue:retry 4427387e-c75a-4295-afb3-2f3d0e410494 eafdd963-a8b7-4aca-9421-b376ed9f4382
+
+# Muayyan ulanish uchun muvaffaqiyatsiz ishlarni qayta urinish
+./artisan queue:retry --connection=redis
+
+# Muayyan navbat uchun muvaffaqiyatsiz ishlarni qayta urinish
+./artisan queue:retry --queue=processing
+
+# Muayyan ulanish va navbat uchun muvaffaqiyatsiz ishlarni qayta urinish
+./artisan queue:retry --connection=redis --queue=processing
+
+# Barcha muvaffaqiyatsiz ishlarni qayta urinish
+./artisan queue:retry all
+```
+
+## `queue.Arg.Type` Qo‘llab-quvvatlanadigan Turlar
+
+```go
+bool
+int
+int8
+int16
+int32
+int64
+uint
+uint8
+uint16
+uint32
+uint64
+float32
+float64
+string
+[]bool
+[]int
+[]int8
+[]int16
+[]int32
+[]int64
+[]uint
+[]uint8
+[]uint16
+[]uint32
+[]uint64
+[]float32
+[]float64
+[]string
+```
diff --git a/uz_UZ/digging-deeper/strings.md b/uz_UZ/digging-deeper/strings.md
new file mode 100644
index 000000000..69aa98337
--- /dev/null
+++ b/uz_UZ/digging-deeper/strings.md
@@ -0,0 +1,1073 @@
+# Matnllar
+
+[[toc]]
+
+## Kirish
+
+Goravel sizga satrlarni osongina boshqarish imkonini beruvchi ravon satrlarni boshqarish kutubxonasini taqdim etadi. Ravon Strings sizga bir nechta satr operatsiyalarini usul zanjiri orqali birlashtirish imkonini beradi, bu yerda usullarning aksariyati qo'shimcha usullarni zanjirlash imkonini beruvchi `support/str.String` misolini qaytaradi. Zanjirli operatsiyalarni qo'llagandan so'ng, oxirgi satr qiymatini olish uchun siz asosiy "satr" qiymatini qaytaradigan "String" usulini chaqirishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(" Goravel ").Trim().Lower().UpperFirst().String() // "Goravel"
+```
+
+## Mavjud usullar
+
+### `Of`
+
+`Of` usuli berilgan satrdan yangi ravon satr namunasini yaratadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel")
+```
+
+### `After`
+
+`After` usuli satrdagi belgilangan qiymatdan keyingi qismini qaytaradi. Agar qiymat bo'sh satr bo'lsa yoki asl satr ichida mavjud bo'lmasa, to'liq satr qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World!").After("Hello").String() // " World!"
+```
+
+### `AfterLast`
+
+`AfterLast` usuli satrdagi belgilangan qiymatning oxirgi paydo bo'lishidan keyingi qismini qaytaradi. Agar qiymat bo'sh satr bo'lsa yoki asl satr ichida mavjud bo'lmasa, to'liq satr qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("docs.goravel.dev").AfterLast(".").String() // "dev"
+```
+
+### `Append`
+
+`Append` usuli belgilangan qiymatni satr oxiriga qo'shadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Bowen").Append(" Han").String() // "Bowen Han"
+```
+
+### `Basename`
+
+`Basename` usuli yo'lning oxirgi nom komponentini qaytaradi, ixtiyoriy ravishda asosiy nomdan belgilangan qo'shimchani olib tashlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("framework/support/str").Basename().String() // "str"
+
+str.Of("framework/support/str.go").Basename(".go").String() // "str"
+```
+
+### `Before`
+
+`Before` usuli satrdagi belgilangan qiymatdan oldingi qismini qaytaradi. Agar qiymat bo'sh satr bo'lsa yoki asl satr ichida mavjud bo'lmasa, to'liq satr qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World!").Before("World").String() // "Hello "
+```
+
+### `BeforeLast`
+
+`BeforeLast` usuli satrdagi belgilangan qiymatning oxirgi paydo bo'lishidan oldingi qismini qaytaradi. Agar qiymat bo'sh satr bo'lsa yoki asl satr ichida mavjud bo'lmasa, to'liq satr qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("docs.goravel.dev").BeforeLast(".").String() // "docs.goravel"
+```
+
+### `Between`
+
+`Between` usuli satrning berilgan ikki qiymat orasidagi qismini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("[Hello] World!").Between("[", "]").String() // "Hello"
+```
+
+### `BetweenFirst`
+
+`BetweenFirst` usuli satrning berilgan ikki qiymatning birinchi paydo bo'lishi orasidagi qismini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("[Hello] [World]!").BetweenFirst("[", "]").String() // "Hello"
+```
+
+### `Camel`
+
+`Camel` usuli satrni `camelCase` ga o'zgartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("hello_world").Camel().String() // "helloWorld"
+```
+
+### `CharAt`
+
+`CharAt` usuli berilgan indeksdagi belgini qaytaradi. Agar indeks chegaradan tashqarida bo'lsa, bo'sh satr qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").CharAt(1) // "o"
+```
+
+### `ChopEnd`
+
+`ChopEnd` usuli berilgan qiymat(lar)ni satr oxiridan olib tashlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("https://goravel.com").ChopEnd(".dev", ".com").String() // https://goravel
+```
+
+### `ChopStart`
+
+`ChopStart` usuli berilgan qiymat(lar)ni satr boshidan olib tashlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("https://goravel.dev").ChopStart("http://", "https://").String() // goravel.dev
+```
+
+### `Contains`
+
+`Contains` usuli berilgan satr berilgan qiymatni o'z ichiga olganligini aniqlaydi. Usul registrga sezgir. Agar bir nechta qiymat berilgan bo'lsa, satr qiymatlardan birortasini o'z ichiga olsa, `true` qaytariladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Contains("Gor") // true
+
+str.Of("Hello World").Contains("Gor", "Hello") // true
+```
+
+### `ContainsAll`
+
+`ContainsAll` usuli berilgan satr berilgan barcha qiymatlarni o'z ichiga olganligini aniqlaydi. Usul registrga sezgir.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").ContainsAll("Hello", "World") // true
+
+str.Of("Hello World").ContainsAll("Hello", "Gor") // false
+```
+
+### `Dirname`
+
+`Dirname` usuli yo'lning ota-ona qismini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("framework/support/str").Dirname().String() // "framework/support"
+```
+
+Ixtiyoriy ravishda, yo'ldan kesib tashlash uchun kataloq darajasini ko'rsatishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("framework/support/str").Dirname(2).String() // "framework"
+```
+
+### `EndsWith`
+
+`EndsWith` usuli berilgan satr berilgan qiymat bilan tugaydiganligini aniqlaydi. Usul registrga sezgir.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").EndsWith("vel") // true
+```
+
+Satr qiymatlardan birortasi bilan tugashini aniqlash uchun usulga bir nechta qiymat o'tkazishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").EndsWith("vel", "lie") // true
+```
+
+### `Exactly`
+
+`Exactly` usuli berilgan satr berilgan qiymatga ancha tengligini aniqlaydi. Usul registrga sezgir.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Exactly("Goravel") // true
+```
+
+### `Except`
+
+`Except` usuli satrdan berilgan qiymatning birinchi paydo bo'lishiga mos keladigan parchani ajratib oladi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("This is a beautiful morning").
+ Excerpt("beautiful", str.ExcerptOption{
+ Radius: 5,
+ }).String() // "...is a beautiful morn...
+```
+
+Bundan tashqari, parchoni ko'rsatish uchun ishlatiladigan satrni o'zgartirish uchun `Omission` opsiyasidan foydalanishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("This is a beautiful morning").
+ Excerpt("beautiful", str.ExcerptOption{
+ Radius: 5,
+ Omission: "(...)"
+ }).String() // "(...)is a beautiful morn(...)"
+```
+
+### `Explode`
+
+`Explode` usuli satrni berilgan ajratgich yordamida satrlar massiviga ajratadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Explode(" ") // []string{"Hello", "World"}
+```
+
+### `Finish`
+
+`Finish` usuli berilgan satr berilgan qiymat bilan tugashiga ishonch hosil qiladi. Agar satr allaqachon qiymat bilan tugasa, u qayta qo'shilmaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("framework").Finish("/").String() // "framework/"
+
+str.Of("framework/").Finish("/").String() // "framework/"
+```
+
+### `Headline`
+
+`Headline` usuli satrni sarlavhaga o'zgartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("bowen_han").Headline().String() // "Bowen Han"
+
+str.Of("HelloWorld").Headline().String() // "Hello World"
+```
+
+### `Is`
+
+`Is` usuli berilgan satr berilgan andozaga mos kelishini aniqlaydi. Usul katta-kichik harflarga sezgir.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("foo123").Is("bar*", "baz*", "foo*") // true
+```
+
+### `IsEmpty`
+
+`IsEmpty` usuli berilgan satr bo‘sh ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("").IsEmpty() // true
+```
+
+### `IsNotEmpty`
+
+`IsNotEmpty` usuli berilgan satr bo‘sh emasligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").IsNotEmpty() // true
+```
+
+### `IsAscii`
+
+`IsAscii` usuli berilgan satr faqat ASCII belgilardan iborat ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").IsAscii() // true
+
+str.Of("你好").IsAscii() // false
+```
+
+### `IsSlice`
+
+`IsSlice` usuli berilgan satr kesim (slice) ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(`[{"name": "John"}, {"name": "Alice"}]`).IsSlice() // true
+
+str.Of(`{"name": "John"}`).IsSlice() // false
+```
+
+### `IsMap`
+
+`IsMap` usuli berilgan satr xarita (map) ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(`{"name": "John"}`).IsMap() // true
+
+str.Of(`[{"name": "John"}, {"name": "Alice"}]`).IsMap() // false
+```
+
+### `IsUlid`
+
+`IsUlid` usuli berilgan satr ULID ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("01E5Z6Z1Z6Z1Z6Z1Z6Z1Z6Z1Z6").IsUlid() // true
+
+str.Of("krishan").IsUlid() // false
+```
+
+### `IsUuid`
+
+`IsUuid` usuli berilgan satr UUID ekanligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("550e8400-e29b-41d4-a716-446655440000").IsUuid() // true
+
+str.Of("krishan").IsUuid() // false
+```
+
+### `Kebab`
+
+`Kebab` usuli satrni `kebab-case` ga o‘zgartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("GoravelFramework").Kebab().String() // "goravel-framework"
+```
+
+### `LcFirst`
+
+`LcFirst` usuli satrning birinchi belgisini kichik harfga o‘zgartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel Framework").LcFirst().String() // "goravel Framework"
+```
+
+### `Length`
+
+`Length` usuli satr uzunligini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Length() // 7
+```
+
+### `Limit`
+
+`Limit` usuli satrni berilgan uzunlikka qisqartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("This is a beautiful morning").Limit(7).String() // "This is..."
+```
+
+Ixtiyoriy ravishda, siz qisqartirishni ko‘rsatish uchun ishlatiladigan satrni o‘zgartirish uchun ikkinchi argumentni taqdim etishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("This is a beautiful morning").Limit(7, " (****)").String() // "This is (****)"
+```
+
+### `Lower`
+
+`Lower` usuli satrni kichik harflarga o‘zgartiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("GORAVEL").Lower().String() // "goravel"
+```
+
+### `LTrim`
+
+`LTrim` usuli satrning chap tomonini kesib tashlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(" Goravel ").LTrim().String() // "Goravel "
+
+str.Of("/framework/").LTrim("/").String() // "framework/"
+```
+
+### `Mask`
+
+`Mask` usuli satrni berilgan maska belgisi bilan yashiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("krishan@email.com").Mask("*", 3).String() // "kri**************"
+```
+
+Agar kerak bo‘lsa, siz maska usuliga manfiy sonni taqdim etishingiz mumkin, bu usulga satr oxiridan yashirishni boshlashni ko‘rsatadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("krishan@email.com").Mask("*", -13, 3).String() // "kris***@email.com"
+
+str.Of("krishan@email.com").Mask("*", -13).String() // "kris**************"
+```
+
+### `Match`
+
+`Match` usuli berilgan satr berilgan oddiy ifodaga mos kelishini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("This is a (test) string").Match(`\([^)]+\)`).String() // (test)
+```
+
+### `MatchAll`
+
+`MatchAll` usuli berilgan satr berilgan barcha oddiy ifodalarga mos kelishini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("abc123def456def").MatchAll(`\d+`) // []string{"123", "456"}
+```
+
+### `IsMatch`
+
+`IsMatch` usuli berilgan satr (har qanday) berilgan oddiy ifodaga mos kelishini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello, Goravel!").IsMatch(`(?i)goravel`, `goravel!(.*)`) // true
+```
+
+### `NewLine`
+
+`NewLine` usuli satrga yangi qator belgisini qo‘shadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").NewLine(2).Append("Framework").String() // "Goravel\n\nFramework"
+```
+
+### `PadBoth`
+
+`PadBoth` usuli satrning ikkala tomonini to‘ldiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello").PadBoth(10, "_").String() // "__Hello___"
+```
+
+### `PadLeft`
+
+`PadLeft` usuli satrning chap tomonini to‘ldiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello").PadLeft(10, "_").String() // "_____Hello"
+```
+
+### `PadRight`
+
+`PadRight` usuli satrning o‘ng tomonini to‘ldiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello").PadRight(10, "_").String() // "Hello_____"
+```
+
+### `Pipe`
+
+`Pipe` usuli satrni berilgan yopilish (closure) yordamida o‘zgartirishga imkon beradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Pipe(func(s string) string {
+ return s + " Framework"
+}).String() // "Goravel Framework"
+```
+
+### `Plural`
+
+`Plural` usuli birlik shaklidagi satrni ko‘plik shakliga o‘zgartiradi. Bu funksiya [pluralizer](pluralization.md) tomonidan qo‘llab-quvvatlanadigan har qanday tilni qo‘llab-quvvatlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+plural := str.Of("goose").Plural().String()
+// "geese"
+```
+
+Satrning birlik yoki ko‘plik shaklini olish uchun funksiyaga butun son argumentini taqdim etishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/support/str"
+
+plural := str.Of("goose").Plural(2).String()
+// "geese"
+
+plural = str.Of("goose").Plural(1).String()
+// "goose"
+```
+
+### `Prepend`
+
+`Prepend` usuli berilgan qiymatni satrning boshiga qo‘shadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Framework").Prepend("Goravel ").String() // "Goravel Framework"
+```
+
+### `Remove`
+
+`Remove` usuli berilgan qiymat(lar)ni satrdan olib tashlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Remove("World").String() // "Hello "
+
+str.Of("Hello World").Remove("World", "Hello").String() // " "
+```
+
+### `Takrorlash`
+
+`Takrorlash` metodi matnni berilgan son marta takrorlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("a").Repeat(2).String() // "aa"
+```
+
+### `Almashtirish`
+
+`Almashtirish` metodi matndagi berilgan qiymatni almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Replace("World", "Krishan").String() // "Hello Krishan"
+```
+
+Sukut boʻyicha, `Almashtirish` metodi katta-kichik harflarga sezgir. Agar metod katta-kichik harflarga sezgir boʻlmasligini xohlasangiz, uchinchi argument sifatida `false` ni oʻtkazishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Replace("world", "Krishan", false).String() // "Hello Krishan"
+```
+
+### `Oxirini almashtirish`
+
+`ReplaceEnd` metodi matndagi berilgan qiymatning oxirgi takrorlanishini faqat matn oxirida boʻlsa almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").ReplaceEnd("World", "Goravel").String() // "Hello Goravel"
+
+str.Of("Hello World").ReplaceEnd("Hello", "Goravel").String() // "Hello World"
+```
+
+### `Birinchi takrorlanishni almashtirish`
+
+`ReplaceFirst` metodi matndagi berilgan qiymatning birinchi takrorlanishini almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").ReplaceFirst("World", "Goravel").String() // "Hello Goravel"
+```
+
+### `Oxirgi takrorlanishni almashtirish`
+
+`ReplaceLast` metodi matndagi berilgan qiymatning oxirgi takrorlanishini almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").ReplaceLast("World", "Goravel").String() // "Hello Goravel"
+```
+
+### `Moslamalarni almashtirish`
+
+`ReplaceMatches` metodi matndagi berilgan oddiy ifoda moslamalarini almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello, Goravel!").ReplaceMatches(`goravel!(.*)`, "Krishan") // "Hello, Krishan!"
+```
+
+### `Boshini almashtirish`
+
+`ReplaceStart` metodi matndagi berilgan qiymatning birinchi takrorlanishini faqat matn boshida boʻlsa almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").ReplaceStart("Hello", "Goravel").String() // "Goravel World"
+
+str.Of("Hello World").ReplaceStart("World", "Goravel").String() // "Hello World"
+```
+
+### `Oʻng tomondan kesish`
+
+`RTrim` metodi matnning oʻng tomonini kesadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(" Goravel ").RTrim().String() // " Goravel"
+
+str.Of("/framework/").RTrim("/").String() // "/framework"
+```
+
+### `Singular`
+
+`Singular` usuli satrni uning birlik shakliga o‘zgartiradi. Bu funksiya [pluralizer](pluralization.md) tomonidan qo‘llab-quvvatlanadigan har qanday tilni qo‘llab-quvvatlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+singular := str.Of("heroes").Singular().String()
+// "hero"
+```
+
+### `Iloncha`
+
+`Iloncha` metodi matnni `iloncha_kichik` formatiga oʻtkazadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("GoravelFramework").Snake().String() // "goravel_framework"
+```
+
+### `Ajratish`
+
+`Ajratish` metodi matnni berilgan ajratgich yordamida matnlar massiviga ajratadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Split(" ") // []string{"Hello", "World"}
+```
+
+### `Siquvchan`
+
+`Siquvchan` metodi ketma-ket boʻsh joy belgilarini bitta boʻsh joy bilan almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello World").Squish().String() // "Hello World"
+```
+
+### `Boshlash`
+
+`Boshlash` metodi matn allaqachon berilgan qiymat bilan boshlanmasa, uning boshiga berilgan qiymatning bitta nusxasini qoʻshadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("framework").Start("/").String() // "/framework"
+
+str.Of("/framework").Start("/").String() // "/framework"
+```
+
+### `Bilan boshlanadi`
+
+`Bilan boshlanadi` metodi berilgan matn (har qanday) berilgan qiymat(lar) bilan boshlanadimi yoki yoʻqligini aniqlaydi. Metod katta-kichik harflarga sezgir.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").StartsWith("Gor") // true
+
+str.Of("Hello World").StartsWith("Gor", "Hello") // true
+```
+
+### `Matn`
+
+`Matn` metodi matnni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").String() // "Goravel"
+```
+
+### `Studli`
+
+`Studly` metodi matnni `StudlyCase` formatiga oʻtkazadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("goravel_framework").Studly().String() // "GoravelFramework"
+```
+
+### `Kesma`
+
+`Kesma` metodi matnning berilgan indeksdan boshlab berilgan uzunlikdagi qismini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Substr(1, 3) // "ora"
+```
+
+### `Almashtir`
+
+`Almashtir` metodi matndagi bir nechta qiymatlarni almashtiradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Golang is awesome").Swap(map[string]string{
+ "Golang": "Go",
+ "awesome": "excellent",
+ }).String() // "Go is excellent"
+```
+
+### `Tap`
+
+`Tepish` metodi matnni berilgan yopiq funksiyaga oʻtkazadi va matnni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Tap(func(s string) {
+ fmt.Println(s)
+}).String() // "Goravel"
+```
+
+### `Test`
+
+`Test` metodi berilgan matn berilgan oddiy ifodaga mos keladimi yoki yoʻqligini aniqlaydi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello, Goravel!").Test(`goravel!(.*)`) // true
+```
+
+### `Sarlavha`
+
+`Sarlavha` metodi matnni `Sarlavha Katta` formatiga oʻtkazadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("goravel framework").Title().String() // "Goravel Framework"
+```
+
+### `Kesish`
+
+`Kesish` metodi matnni kesadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of(" Goravel ").Trim().String() // "Goravel"
+
+str.Of("/framework/").Trim("/").String() // "framework"
+```
+
+### `Birinchi harfni katta`
+
+`UcFirst` metodi matnning birinchi belgisini katta harfga oʻtkazadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("goravel framework").UcFirst().String() // "Goravel framework"
+```
+
+### `Katta harflar bilan ajratish`
+
+`UcSplit` metodi matnni katta harflar yordamida matnlar massiviga ajratadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("GoravelFramework").UcSplit() // []string{"Goravel", "Framework"}
+```
+
+### `Agar boʻlmasa`
+
+`Unless` metodi matnni berilgan yopiq funksiyaga oʻtkazadi va agar berilgan shart `false` boʻlsa, matnni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").Unless(func(s *String) bool {
+ return false
+ }, func(s *String) *String {
+ return Of("Fallback Applied")
+ }).String() // "Fallback Applied"
+```
+
+### `Katta`
+
+`Upper` metodi matnni katta harflarga oʻtkazadi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("goravel").Upper().String() // "GORAVEL"
+```
+
+### `Qachonki`
+
+`When` usuli satrni berilgan yopilishga uzatadi va agar berilgan shart `true` bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Bowen").When(true, func(s *str.String) *str.String {
+ return s.Append(" Han")
+}).String() // "Bowen Han"
+```
+
+Agar kerak bo‘lsa, `When` usuliga uchinchi argument sifatida yopilishni taqdim etishingiz mumkin, u shart `false` bo‘lganda bajariladi.
+
+### `WhenContains`
+
+`WhenContains` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan qiymatni o‘z ichiga olsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello Bowen").WhenContains("Hello", func(s *str.String) *str.String {
+ return s.Append(" Han")
+}).String() // "Hello Bowen Han"
+```
+
+Agar kerak bo‘lsa, `WhenContains` usuliga uchinchi argument sifatida yopilishni taqdim etishingiz mumkin, u satr berilgan qiymatni o‘z ichiga olmaganda bajariladi.
+
+### `WhenContainsAll`
+
+`WhenContainsAll` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan barcha qiymatlarni o‘z ichiga olsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello Bowen").WhenContainsAll([]string{"Hello", "Bowen"}, func(s *str.String) *str.String {
+ return s.Append(" Han")
+}).String() // "Hello Bowen Han"
+```
+
+Agar kerak bo‘lsa, `WhenContainsAll` usuliga uchinchi argument sifatida yopilishni taqdim etishingiz mumkin, u satr berilgan barcha qiymatlarni o‘z ichiga olmaganda bajariladi.
+
+### `WhenEmpty`
+
+`WhenEmpty` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr bo‘sh bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("").WhenEmpty(func(s *str.String) *str.String {
+ return s.Append("Goravel")
+}).String() // "Goravel"
+```
+
+### `WhenIsAscii`
+
+`WhenIsAscii` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr faqat ASCII belgilardan iborat bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").WhenIsAscii(func(s *str.String) *str.String {
+ return s.Append(" Framework")
+}).String() // "Goravel Framework"
+
+str.Of("你好").WhenIsAscii(func(s *str.String) *str.String {
+ return s.Append(" Framework")
+}).String() // "你好"
+```
+
+### `WhenNotEmpty`
+
+`WhenNotEmpty` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr bo‘sh bo‘lmasa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").WhenNotEmpty(func(s *str.String) *str.String {
+ return s.Append(" Framework")
+}).String() // "Goravel Framework"
+```
+
+### `WhenStartsWith`
+
+`WhenStartsWith` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan qiymat bilan boshlansa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("hello world").WhenStartsWith("hello", func(s *str.String) *str.String {
+ return s.Title()
+}).String() // "Hello World"
+```
+
+### `WhenEndsWith`
+
+`WhenEndsWith` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan qiymat bilan tugasa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("hello world").WhenEndsWith("world", func(s *str.String) *str.String {
+ return s.Title()
+}).String() // "Hello World"
+```
+
+### `WhenExactly`
+
+`WhenExactly` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan qiymatga aniq teng bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").WhenExactly("Goravel", func(s *str.String) *str.String {
+ return s.Append(" Framework")
+}).String() // "Goravel Framework"
+```
+
+### `WhenNotExactly`
+
+`WhenNotExactly` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan qiymatga aniq teng bo‘lmasa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Goravel").WhenNotExactly("Goravel", func(s *str.String) *str.String {
+ return s.Append(" Framework")
+}).String() // "Goravel"
+```
+
+### `WhenIs`
+
+`WhenIs` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan andozaga mos kelsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("foo/bar").WhenIs("foo/*", func(s *str.String) *str.String {
+ return s.Append("/baz")
+}).String() // "foo/bar/baz"
+```
+
+### `WhenIsUlid`
+
+`WhenIsUlid` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr ULID bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("01E5Z6Z1Z6Z1Z6Z1Z6Z1Z6Z1Z6").WhenIsUlid(func(s *str.String) *str.String {
+ return s.Substr(0, 10)
+}).String() // "01E5Z6Z1Z6"
+```
+
+### `WhenIsUuid`
+
+`WhenIsUuid` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr UUID bo‘lsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("550e8400-e29b-41d4-a716-446655440000").WhenIsUuid(func(s *str.String) *str.String {
+ return s.Substr(0, 8)
+}).String() // "550e8400"
+```
+
+### `WhenTest`
+
+`WhenTest` usuli satrni berilgan yopilishga uzatadi va agar berilgan satr berilgan muntazam ifodaga mos kelsa, satrni qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("goravel framework").WhenTest(`goravel(.*)`, func(s *str.String) *str.String {
+ return s.Append(" is awesome")
+}).String() // "goravel framework is awesome"
+```
+
+### `WordCount`
+
+`WordCount` usuli satrdagi so‘zlar sonini qaytaradi.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello, World!").WordCount() // 2
+```
+
+### `Words`
+
+`Words` usuli satrdagi so‘zlar sonini cheklaydi. Agar kerak bo‘lsa, ikkinchi argument sifatida qisqartirishni ko‘rsatish uchun ishlatiladigan satrni o‘zgartirish mumkin.
+
+```go
+import "github.com/goravel/framework/support/str"
+
+str.Of("Hello, World!").Words(1) // "Hello..."
+
+str.Of("Hello, World!").Words(1, " (****)") // "Hello (****)"
+```
diff --git a/uz_UZ/digging-deeper/task-scheduling.md b/uz_UZ/digging-deeper/task-scheduling.md
new file mode 100644
index 000000000..b2a4c7505
--- /dev/null
+++ b/uz_UZ/digging-deeper/task-scheduling.md
@@ -0,0 +1,136 @@
+# Vazifa rejalashtirish
+
+[[toc]]
+
+## Kirish
+
+Avvalroq, serveringizda rejalashtirilishi kerak bo‘lgan har bir vazifa uchun cron konfiguratsiyasi yozuvini yaratishingiz kerak edi. Biroq, bu yondashuv tezda muammoga aylanadi, chunki vazifa jadvalingiz manba nazoratida emas va cron yozuvlarini ko‘rish yoki qo‘shish/o‘zgartirish uchun serveringizga SSH orqali ulanishingiz kerak.
+
+Goravelning buyruq rejalashtiruvchisi serveringizda rejalashtirilgan vazifalarni boshqarishning yangi yondashuvini taklif etadi. Rejalashtiruvchi yordamida Goravel ilovangiz ichida o‘z buyruq jadvalingizni osongina va aniq belgilashingiz mumkin. Rejalashtiruvchidan foydalangan holda, serveringizda faqat bitta cron yozuvini yaratishingiz kifoya.
+
+## Jadvallarni belgilash
+
+Ilovingiz uchun vazifalarni rejalashtirish uchun ularni `bootstrap/app.go` faylidagi `WithSchedule` funksiyasida aniqlashingiz mumkin. Buni yaxshiroq tushunish uchun bir misolni ko‘rib chiqaylik. Bu holda, har kuni yarim tunda ishlaydigan yopilishni rejalashtirmoqchimiz. Ushbu yopilish ichida jadvalni tozalash uchun maʼlumotlar bazasi so‘rovini bajaramiz:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithSchedule(func() []schedule.Event {
+ return []schedule.Event{
+ facades.Schedule().Call(func() {
+ facades.Orm().Query().Where("1 = 1").Delete(&models.User{})
+ }).Daily(),
+ }
+ }).
+ WithConfig(config.Boot).
+ Start()
+}
+```
+
+### Artisan buyruqlarini rejalashtirish
+
+Yopilishlarni rejalashtirishdan tashqari, siz [Artisan buyruqlarini](./artisan-console.md) ham rejalashtirishingiz mumkin. Misol uchun, Artisan buyrug‘ini uning nomi yoki sinfi yordamida rejalashtirish uchun `Command` usulidan foydalanishingiz mumkin.
+
+```go
+facades.Schedule().Command("send:emails name").Daily(),
+```
+
+### Jurnal darajasi
+
+`app.debug` `true` bo‘lganda, konsol barcha jurnallarni chop etadi. Aks holda, faqat `error` darajasidagi jurnallar chop etiladi.
+
+### Jadval chastotasi variantlari
+
+Biz vazifani belgilangan oraliqlarda qanday sozlashingiz mumkinligining bir nechta misollarini ko‘rdik. Biroq, vazifalarga tayinlash uchun mavjud bo‘lgan yana ko‘plab vazifa jadvali chastotalari mavjud:
+
+| Usul | Tavsif |
+| ------------------------ | ----------------------------------------------------------------- |
+| `.Cron("* * * * *")` | Maxsus Cron jadvali (daqiqalar) |
+| `.Cron("* * * * * *")` | Maxsus Cron jadvali (soniyalar) |
+| `.EverySecond()` | Vazifani har soniyada ishga tushirish |
+| `.EveryTwoSeconds()` | Vazifani har ikki soniyada ishga tushirish |
+| `.EveryFiveSeconds()` | Vazifani har besh soniyada ishga tushirish |
+| `.EveryTenSeconds()` | Vazifani har o‘n soniyada ishga tushirish |
+| `.EveryFifteenSeconds()` | Vazifani har o‘n besh soniyada ishga tushirish |
+| `.EveryTwentySeconds()` | Vazifani har yigirma soniyada ishga tushirish |
+| `.EveryThirtySeconds()` | Vazifani har o‘ttiz soniyada ishga tushirish |
+| `.EveryMinute()` | Vazifani har daqiqada ishga tushirish |
+| `.EveryTwoMinutes()` | Vazifani har ikki daqiqada ishga tushirish |
+| `.EveryThreeMinutes()` | Vazifani har uch daqiqada ishga tushirish |
+| `.EveryFourMinutes()` | Vazifani har to‘rt daqiqada ishga tushirish |
+| `.EveryFiveMinutes()` | Vazifani har besh daqiqada ishga tushirish |
+| `.EveryTenMinutes()` | Vazifani har o‘n daqiqada ishga tushirish |
+| `.EveryFifteenMinutes()` | Vazifani har o‘n besh daqiqada ishga tushirish |
+| `.EveryThirtyMinutes()` | Vazifani har o‘ttiz daqiqada ishga tushirish |
+| `.Hourly()` | Vazifani har soatda ishga tushirish |
+| `.HourlyAt(17)` | Vazifani har soatda, soatdan 17 daqiqa o‘tgach ishga tushirish |
+| `.EveryTwoHours()` | Vazifani har ikki soatda ishga tushirish |
+| `.EveryThreeHours()` | Vazifani har uch soatda ishga tushirish |
+| `.EveryFourHours()` | Vazifani har to‘rt soatda ishga tushirish |
+| `.EverySixHours()` | Vazifani har olti soatda ishga tushirish |
+| `.Daily()` | Vazifani har kuni yarim tunda ishga tushirish |
+| `.DailyAt("13:00")` | Vazifani har kuni soat 13:00 da ishga tushirish |
+| `.Days(1, 3, 5)` | Vazifani har Dushanba, Chorshanba va Juma kunlari ishga tushirish |
+| `.Weekdays()` | Vazifani har Dushanbadan Jumagacha ishga tushirish |
+| `.Weekends()` | Vazifani har Shanba va Yakshanba kunlari ishga tushirish |
+| `.Mondays()` | Vazifani har Dushanba kuni ishga tushirish |
+| `.Tuesdays()` | Vazifani har Seshanba kuni ishga tushirish |
+| `.Wednesdays()` | Vazifani har Chorshanba kuni ishga tushirish |
+| `.Thursdays()` | Vazifani har Payshanba kuni ishga tushirish |
+| `.Fridays()` | Vazifani har Juma kuni ishga tushirish |
+| `.Saturdays()` | Vazifani har shanba kuni bajarish |
+| `.Sundays()` | Vazifani har yakshanba kuni bajarish |
+| `.Weekly()` | Vazifani har hafta bajarish |
+| `.Monthly()` | Vazifani har oy bajarish |
+| `.Quarterly()` | Vazifani har chorakda bajarish |
+| `.Yearly()` | Vazifani har yil bajarish |
+
+### Vazifalarning Ustma-ust Kelishining Oldini Olish
+
+Sukut bo‘yicha, rejalashtirilgan vazifalar oldingi nusxasi hali ishlayotgan bo‘lsa ham bajarilishda davom etadi. Buning oldini olish uchun quyidagi usullardan foydalaning:
+
+| Usul | Tavsif |
+| ------------------------ | ----------------------------------------------- |
+| `.SkipIfStillRunning()` | Agar hali ishlayotgan bo‘lsa, o‘tkazib yuborish |
+| `.DelayIfStillRunning()` | Agar hali ishlayotgan bo‘lsa, kechiktirish |
+
+```go
+facades.Schedule().Command("send:emails name").EveryMinute().SkipIfStillRunning()
+facades.Schedule().Command("send:emails name").EveryMinute().DelayIfStillRunning()
+```
+
+### Vazifalarni Bitta Serverda Bajarish
+
+> Ushbu xususiyatdan foydalanish uchun ilovangiz sukut bo‘yicha kesha haydovchisi sifatida memcached, dynamodb yoki redis kesha haydovchisidan foydalanishi kerak. Bundan tashqari, barcha serverlar bir markaziy kesha serveri bilan aloqa qilishi kerak.
+
+Agar ilovangizning rejalashtiruvchisi bir nechta serverlarda ishlayotgan bo‘lsa, rejalashtirilgan ish faqat bitta serverda bajarilishini taʼminlashingiz mumkin. Misol uchun, har juma kechasi yangi hisobot yaratadigan rejalashtirilgan vazifangiz bor deb faraz qilaylik. Agar vazifa rejalashtiruvchisi uchta ishchi serverda ishlayotgan bo‘lsa, rejalashtirilgan vazifa barcha uchta serverda ishlaydi va hisobotni uch marta yaratadi. Bu maqbul emas!
+
+Buning oldini olish uchun rejalashtirilgan vazifani aniqlashda `OnOneServer` usulidan foydalaning, bu vazifaning faqat bitta serverda ishlashini taʼminlaydi. Vazifani qabul qilgan birinchi server ish bo‘yicha atomik qulfni oladi, bu boshqa serverlarning bir vaqtning o‘zida bir xil vazifani bajarishiga to‘sqinlik qiladi:
+
+```go
+facades.Schedule().Command("report:generate").Daily().OnOneServer()
+```
+
+Agar yopilishlar bitta serverda bajarilishi kerak bo‘lsa, ularga nom berilishi kerak:
+
+```go
+facades.Schedule().Call(func() {
+ fmt.Println("goravel")
+}).Daily().OnOneServer().Name("goravel")
+```
+
+## Rejalashtiruvchini Ishga Tushirish
+
+Rejalashtiruvchi `main.go` faylida `Start()` chaqirilganda avtomatik ravishda ishga tushiriladi. Shuningdek, vazifalarni qo‘lda ishga tushirishingiz mumkin:
+
+```shell
+./artisan schedule:run
+```
+
+## Barcha Vazifalarni Ko‘rish
+
+Barcha vazifalarni ko‘rish uchun `schedule:list` buyrug‘idan foydalanishingiz mumkin:
+
+```shell
+./artisan schedule:list
+```
diff --git a/uz_UZ/getting-started/compile.md b/uz_UZ/getting-started/compile.md
new file mode 100644
index 000000000..e939dad96
--- /dev/null
+++ b/uz_UZ/getting-started/compile.md
@@ -0,0 +1,141 @@
+# Tuzish
+
+[[toc]]
+
+## Tuzish buyrug‘i
+
+Goravel loyihasini quyidagi buyruq orqali tuzish mumkin:
+
+```shell
+# Tuzish uchun tizimni tanlash
+./artisan build
+
+# Tuzish uchun tizimni ko‘rsatish
+./artisan build --os=linux
+./artisan build -o=linux
+
+# Statik tuzish
+./artisan build --static
+./artisan build -s
+
+# Chiqish fayli nomini ko‘rsatish
+./artisan build --name=goravel
+./artisan build -n=goravel
+```
+
+## Qo‘lda tuzish
+
+### Oddiy tuzish
+
+```shell
+go build .
+```
+
+#### Serverga joylash
+
+Joylash vaqtida serverga quyidagi fayl va papkalarni yuklash kerak:
+
+```
+.env
+./main // Tuzish natijasidagi binar fayl
+./public // mavjud bo‘lsa
+./resources // mavjud bo‘lsa
+```
+
+### Statik tuzish
+
+Oddiy tuzish orqali olingan paket joylash muhitining qo‘llab-quvvatlashiga muhtoj bo‘ladi, statik tuzilgan fayllarni esa muayyan platformada muhit sozlamasisiz erkin ishlatish mumkin.
+
+```shell
+go build --ldflags "-extldflags -static" -o main .
+```
+
+### Platformalararo tuzish
+
+Tuzish platformaga qarab farqlanadi, joylash holatiga mos tuzish usulini tanlashingiz kerak.
+
+```shell
+// Linux muhiti uchun tuzish
+CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build .
+
+// Windows muhiti uchun tuzish
+CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build .
+
+// Mac muhiti uchun tuzish
+CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build .
+```
+
+## Docker
+
+Goravelning standart `Dockerfile` va `docker-compose.yml` fayli mavjud, ularni to‘g‘ridan-to‘g‘ri ishlatishingiz mumkin, shu paytda `APP_HOST` `0.0.0.0` bo‘lishi kerakligiga e‘tibor bering.
+
+```shell
+docker build .
+```
+
+Agar bog‘liqliklarni yuklash sekin va vaqt mintaqasi muammolari duch kelsangiz, Dockerfile mazmunini quyidagi skript kabi optimallashtirishingiz mumkin:
+
+```dockerfile
+# Xitoy uchun maxsus
+
+FROM golang:alpine AS builder
+ENV GO111MODULE=on \
+ CGO_ENABLED=0 \
+ GOARCH="amd64" \
+ GOOS=linux \
+ GOPROXY=https://goproxy.cn,direct
+WORKDIR /build
+COPY . .
+RUN go mod tidy
+RUN go build --ldflags "-extldflags -static" -o main .
+FROM alpine:latest
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
+RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
+ && echo "Asia/Shanghai" > /etc/timezone
+WORKDIR /www
+COPY --from=builder /build/.env /www/.env
+COPY --from=builder /build/main /www/
+
+# Mavjud bo‘lsa
+COPY --from=builder /build/database/ /www/database/
+COPY --from=builder /build/public/ /www/public/
+COPY --from=builder /build/storage/ /www/storage/
+COPY --from=builder /build/resources/ /www/resources/
+
+ENTRYPOINT ["/www/main"]
+```
+
+### Docker Compose
+
+Shuningdek, xizmatni quyidagi buyruq orqali tezda ishga tushirishingiz mumkin:
+
+```shell
+docker-compose build
+docker-compose up
+```
+
+> Eslatma: Agar tashqi kirish kerak bo‘lsa, APP_HOST ni 0.0.0.0 ga o‘zgartirishingiz kerak
+
+## Vaqt mintaqasini o‘rnatish
+
+`app.timezone` sozlamasi `UTC` bo‘lmaganda, tuzish vaqtida ilovaga vaqt mintaqasini o‘rnatishingiz kerak. Quyidagi uch usuldan istalgan birini tanlashingiz mumkin:
+
+1. Dockerfile faylida vaqt mintaqasi sozlamalarini qo‘shish
+
+```
+RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
+```
+
+2. Tuzish vaqtida vaqt mintaqasini o‘rnatish
+
+```
+go build -tags timetzdata .
+```
+
+3. `main.go` faylida vaqt mintaqasini import qilish
+
+```shell
+import (
+ _ "time/tzdata"
+)
+```
diff --git a/uz_UZ/getting-started/configuration.md b/uz_UZ/getting-started/configuration.md
new file mode 100644
index 000000000..5fd98a218
--- /dev/null
+++ b/uz_UZ/getting-started/configuration.md
@@ -0,0 +1,72 @@
+# Konfiguratsiya
+
+[[toc]]
+
+## Kirish
+
+Goravel freymvorkining barcha konfiguratsiya fayllari `config` papkasida saqlanadi. Siz aniq ko'rsatmalarni ko'rib chiqishingiz va loyiha ehtiyojlariga mos ravishda ularni moslashuvchan sozlashingiz mumkin.
+
+## Muhit konfiguratsiyasi
+
+Ilovalarni turli muhitlarda ishga tushirish odatda turli konfiguratsiyalarni talab qiladi. Misol uchun, siz mahalliy ravishda Debug rejimini yoqishni xohlashingiz mumkin, lekin ishlab chiqarish muhitida bunga ehtiyoj yo'q.
+
+Shuning uchun, freymvork ildiz papkasida `.env.example` faylini taqdim etadi. Siz ishlab chiqishni boshlashdan oldin ushbu faylni nusxalashingiz, uni `.env` deb nomini o'zgartirishingiz va `.env` faylidagi konfiguratsiya bandlarini loyiha ehtiyojlariga mos ravishda o'zgartirishingiz kerak.
+
+Diqqat qiling, `.env` fayli versiyalarni nazorat qilishga qo'shilmasligi kerak, chunki bir nechta odamlar hamkorlik qilganda, turli dasturchilar turli konfiguratsiyalardan foydalanishlari mumkin va turli joylashtirish muhitlari konfiguratsiyalari har xil bo'ladi.
+
+Bundan tashqari, agar tashqi shaxs sizning kod omboringizga kirish huquqini olgan bo'lsa, sezuvchi konfiguratsiyani oshkor qilish xavfi mavjud bo'ladi. Agar siz yangi konfiguratsiya bandini qo'shmoqchi bo'lsangiz, uni `.env.example` fayliga qo'shishingiz mumkin, shunda barcha dasturchilarning konfiguratsiyasi sinxronlanadi.
+
+### Konfiguratsiyani ro'yxatdan o'tkazish
+
+Barcha konfiguratsiya fayllari `bootstrap/app.go` faylidagi `WithConfig` funksiyasi orqali ro'yxatdan o'tkaziladi. Konfiguratsiya faylidagi `init` funksiyasi ekanligini hisobga olgan holda, siz har bir konfiguratsiya faylini birma-bir ro'yxatdan o'tkazishingiz shart emas. Shunchaki `WithConfig` funksiyasini quyidagicha chaqiring:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Muhit konfiguratsiyasini olish
+
+`.env` faylidagi konfiguratsiya bandlarini olish uchun quyidagi usuldan foydalaning:
+
+```go
+// Birinchi parametr konfiguratsiya kaliti, ikkinchi parametr standart qiymat
+facades.Config().Env("APP_NAME", "goravel")
+```
+
+## Konfiguratsiya qiymatlariga kirish
+
+Siz ilovaning istalgan joyidan `config` papkasidagi konfiguratsiya qiymatlariga kirish uchun global `facades.Config()` funksiyasidan osongina foydalanishingiz mumkin. Konfiguratsiya qiymatiga kirish "." sintaksisidan foydalanishi mumkin. Shuningdek, siz standart qiymatni belgilashingiz mumkin, agar konfiguratsiya opsiyasi mavjud bo'lmasa, standart qiymat qaytariladi:
+
+```go
+// Tasdiq orqali konfiguratsiyani olish
+facades.Config().Get("app.name", "goravel")
+
+// String turidagi konfiguratsiyani olish
+facades.Config().GetString("app.name", "goravel")
+
+// Int turidagi konfiguratsiyani olish
+facades.Config().GetInt("app.int", 1)
+
+// Bool turidagi konfiguratsiyani olish
+facades.Config().GetBool("app.debug", true)
+```
+
+## Konfiguratsiyani sozlash
+
+```go
+facades.Config().Add("path", "value1")
+facades.Config().Add("path.with.dot.case1", "value1")
+facades.Config().Add("path.with.dot", map[string]any{"case3": "value3"})
+```
+
+## Loyiha ma'lumotlarini olish
+
+Siz freymvork versiyasi, konfiguratsiyasi va boshqalarni ko'rish uchun `artisan about` buyrug'idan foydalanishingiz mumkin.
+
+```bash
+./artisan about
+```
diff --git a/uz_UZ/getting-started/directory-structure.md b/uz_UZ/getting-started/directory-structure.md
new file mode 100644
index 000000000..c2383a338
--- /dev/null
+++ b/uz_UZ/getting-started/directory-structure.md
@@ -0,0 +1,55 @@
+# Papka tuzilishi
+
+[[toc]]
+
+## Kirish
+
+Standart fayl tuzilmasi loyihaning rivojlanishini yaxshiroq boshlashingizga yordam beradi, shuningdek, siz yangi papkalarni bemalol qo‘shishingiz mumkin, lekin standart papkalarni o‘zgartirmang.
+
+## Papka daraxti
+
+```
+goravel/
+├── app/ # Asosiy ilova mantiqi
+│ ├── console/ # Artisan konsol buyruqlari
+│ ├── grpc/ # gRPC kontrollerlari va middleware
+│ ├── http/ # HTTP kontrollerlari va middleware
+│ │ ├── controllers/ # HTTP so‘rovlarini boshqaruvchilari
+│ │ ├── middleware/ # HTTP middleware (auth, cors va h.k.)
+│ ├── models/ # ORM modellari
+│ └── providers/ # Xizmat provayderlari
+├── bootstrap/ # Ilovani ishga tushirish
+│ └── app.go # Freymvorkni ishga tushirish
+├── config/ # Ilova konfiguratsiya fayllari
+├── database/ # Maʼlumotlar bazasi bilan bog‘liq fayllar
+│ ├── migrations/ # Maʼlumotlar bazasi migratsiya fayllari
+│ ├── seeders/ # Maʼlumotlar bazasi to‘ldiruvchilari
+├── resources/ # Xom, kompilyatsiya qilinmagan resurslar
+│ └── views/ # Shablon ko‘rinishlari
+├── routes/ # Ilova marshrutlari taʼriflari
+├── storage/ # Ilova saqlash joyi
+├── tests/ # Avtomatlashtirilgan testlar
+├── .air.toml # Air hot reload konfiguratsiyasi
+├── .env.example # Muhit o‘zgaruvchilari namunasi
+├── artisan # Artisan konsol kirish skripti
+├── go.mod # Go modul bog‘liqliklari
+├── go.sum # Go modul checksumlari
+├── main.go # Ilova kirish nuqtasi
+```
+
+## Papka tuzilishini sozlash
+
+Siz papka tuzilishini `bootstrap/app.go` faylidagi `WithPath()` funksiyasini chaqirib sozlashingiz mumkin. Masalan, agar siz standart `app` papkasini `src` ga o‘zgartirmoqchi bo‘lsangiz, `bootstrap/app.go` faylini quyidagicha o‘zgartirishingiz mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithPaths(func(paths configuration.Paths) {
+ paths.App("src")
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+Siz sozlashingiz mumkin bo‘lgan boshqa ko‘plab yo‘llar mavjud, masalan, `Config`, `Database`, `Routes`, `Storage` va `Resources`. Kerakli papkani o‘rnatish uchun `paths` obyektida tegishli metodni chaqirish kifoya.
diff --git a/uz_UZ/getting-started/installation.md b/uz_UZ/getting-started/installation.md
new file mode 100644
index 000000000..b7f44a7ed
--- /dev/null
+++ b/uz_UZ/getting-started/installation.md
@@ -0,0 +1,205 @@
+# O'rnatish
+
+[[toc]]
+
+## Server Talablari
+
+- Golang >= 1.23
+
+## O'rnatish
+
+### Goravel O'rnatuvchisidan Foydalanish
+
+O'rnatuvchini [hujjat](https://github.com/goravel/installer) bo'yicha ishga tushiring va keyin quyidagi buyruq yordamida yangi Goravel loyihasini ishga tushiring:
+
+```shell
+// Goravel o'rnatuvchisining eng so'nggi versiyasini o'rnating
+go install github.com/goravel/installer/goravel@latest
+
+// Loyihani o'rnatmoqchi bo'lgan papkaga kiring
+goravel new blog
+```
+
+### Qo'lda O'rnatish
+
+#### goravel/goravel
+
+To'liq xususiyatlarga ega bo'lgan freymvork.
+
+```shell
+// Freymvorkni yuklab olish
+git clone --depth=1 https://github.com/goravel/goravel.git && rm -rf goravel/.git*
+
+// Bog'liqliklarni o'rnatish
+cd goravel && go mod tidy
+
+// .env muhit konfiguratsiya faylini yaratish
+cp .env.example .env
+
+// Ilova kalitini yaratish
+./artisan key:generate
+```
+
+#### goravel/goravel-lite
+
+Faqat asosiy xususiyatlarga ega bo'lgan yengil freymvork, mikroxizmatlar yoki kichik ilovalar yaratish uchun mos. Siz zarurat bo'yicha qo'shimcha fasadlarni o'rnatishingiz mumkin.
+
+```shell
+// Freymvorkni yuklab olish
+git clone --depth=1 https://github.com/goravel/goravel-lite.git && rm -rf goravel-lite/.git*
+s
+// Bog'liqliklarni o'rnatish
+cd goravel-lite && go mod tidy
+
+// .env muhit konfiguratsiya faylini yaratish
+cp .env.example .env
+
+// Ilova kalitini yaratish
+./artisan key:generate
+
+// Zarurat bo'yicha qo'shimcha fasadlarni o'rnatish, masalan:
+./artisan package:install Cache
+```
+
+> Agar bog'liqliklarni yuklash sekin bo'lsa, iltimos, tarmoq ulanishingizni tekshiring.
+
+## Xizmatlarni Ishga Tushirish
+
+### Ildiz Papkasidagi .env Fayliga Ko'ra Xizmatlarni Ishga Tushirish
+
+```shell
+go run .
+```
+
+### Xizmatlarni Ishga Tushirish Uchun .env Faylini Belgilash
+
+```shell
+go run . --env=./.env
+```
+
+### Muhit O'zgaruvchilaridan Foydalanib Xizmatlarni Ishga Tushirish
+
+```shell
+APP_ENV=production APP_DEBUG=true go run .
+```
+
+### Jonli qayta yuklash
+
+[air-verse/air](https://github.com/air-verse/air) ni o'rnating, Goravel to'g'ridan-to'g'ri ishlatilishi mumkin bo'lgan o'rnatilgan konfiguratsiya fayliga ega:
+
+```
+air
+```
+
+#### 🧰 Air O'rnatilgandan So'ng
+
+Air muvaffaqiyatli o'rnatilgandan so'ng, u muhitingizda to'g'ri bajarilishiga ishonch hosil qilishingiz kerak.
+Sozlashingizga qarab, Air avtomatik ravishda buyruq sifatida mavjud bo'lmasligi mumkin.
+Uning to'g'ri ishlashini ta'minlashning ikkita oddiy usuli:
+
+---
+
+#### 🪄 Variant 1: Yordamchi Skriptdan (`air.sh`) Foydalanish
+
+Agar Air o'rnatilgan bo'lsa, lekin terminal buyrug'i sifatida tan olinmasa, uni avtomatik ravishda topadigan va ishga tushiradigan kichik yordamchi skript yaratishingiz mumkin.
+
+1. Loyiha ildizida yangi fayl yarating:
+
+```bash
+touch air.sh
+chmod +x air.sh
+```
+
+2. air.sh ichiga quyidagi mazmunni qo'shing:
+
+```bash
+#!/bin/bash
+GO_PATH=$(go env GOPATH)
+GO_BIN=$GO_PATH/bin/air
+
+if [ ! -f $GO_BIN ]; then
+ echo "❌ Air topilmadi. Iltimos, avval uni o'rnating:"
+ echo " go install github.com/air-verse/air@latest"
+ exit 1
+fi
+
+echo "🚀 Air ishga tushmoqda..."
+$GO_BIN
+```
+
+3. Loyihangizni ishga tushirish uchun quyidagidan foydalaning:
+
+```bash
+./air.sh
+```
+
+Bu, `$PATH` Go binary fayllarini o'z ichiga olmasa ham, Air ishlashini ta'minlaydi.
+
+#### 💡 Variant 2: Go Bin Papkasini PATH ga Qo'shish (Mac/Linux)
+
+Agar siz skriptsiz Air-ni to'g'ridan-to'g'ri ishga tushirishni afzal ko'rsangiz, Go bin papkasini PATH ga qo'shishingiz mumkin.
+
+Zsh foydalanuvchilari uchun:
+
+```bash
+echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.zshrc
+source ~/.zshrc
+```
+
+Ushbu sozlashdan so'ng, loyihangizni shunchaki ishga tushirish orqali boshlashingiz mumkin:
+
+```bash
+air
+```
+
+#### ✅ Maslahat
+
+Air o'rnatilganligi va kirish mumkinligini tekshirish uchun ishga tushiring:
+
+```bash
+which air
+```
+
+Agar u to'g'ri yo'lni qaytarmasa (masalan, `/Users/yourname/go/bin/air`), bu yordamchi skript yoki yo'l hali sozlanmaganligini anglatadi.
+
+## Konfiguratsiya
+
+### Konfiguratsiya fayllari
+
+Goravel freymvorkining barcha konfiguratsiya fayllari `config` papkasida joylashgan. Barcha konfiguratsiya bandlari izohlangan, siz ularni o'z ehtiyojlaringizga mos ravishda sozlashingiz mumkin.
+
+### Ilova kalitini yaratish
+
+Goravel mahalliy o'rnatilgandan so'ng ilova kalitini yaratishingiz kerak. Quyidagi buyruqni ishga tushirganda, `.env` faylidagi `APP_KEY` kalitida 32-bitli satr yaratiladi. Bu kalit asosan ma'lumotlarni shifrlash va shifrdan ochish uchun ishlatiladi.
+
+```shell
+./artisan key:generate
+```
+
+### JWT Token yaratish
+
+Agar siz [Autentifikatsiya](../security/authentication.md) dan foydalansangiz, JWT Token yaratishingiz kerak.
+
+```shell
+./artisan jwt:secret
+```
+
+### Env faylini shifrlash va shifrdan ochish
+
+Ishlab chiqarish muhiti env faylini versiyalarni boshqarishga qo'shmoqchi bo'lishingiz mumkin, lekin sezuvchi ma'lumotlarni oshkor qilishni istamasangiz, env faylini shifrlash uchun `env:encrypt` buyrug'idan foydalanishingiz mumkin:
+
+```shell
+./artisan env:encrypt
+
+// Fayl nomi va kalitni belgilash
+./artisan env:encrypt --name .env.safe --key BgcELROHL8sAV568T7Fiki7krjLHOkUc
+```
+
+Keyin ishlab chiqarish muhitida env faylini shifrdan ochish uchun `env:decrypt` buyrug'idan foydalaning:
+
+```shell
+GORAVEL_ENV_ENCRYPTION_KEY=BgcELROHL8sAV568T7Fiki7krjLHOkUc ./artisan env:decrypt
+
+// yoki
+./artisan env:decrypt --name .env.safe --key BgcELROHL8sAV568T7Fiki7krjLHOkUc
+```
diff --git a/uz_UZ/getting-started/packages.md b/uz_UZ/getting-started/packages.md
new file mode 100644
index 000000000..2742ee612
--- /dev/null
+++ b/uz_UZ/getting-started/packages.md
@@ -0,0 +1,35 @@
+# Ajoyib Kengaytiruvchi Paketlar
+
+Bu yerda Goravel uchun kengaytirilgan paketlarni topishingiz mumkin, shuningdek, o'zingizning paketingizni joylashtirish uchun [goravel/docs](https://github.com/goravel/docs) repozitoriyasiga PR yaratishingiz mumkin. Iltimos, paketingizning test qamrovini iloji boricha yaxshilang.
+
+| Paket | Tavsifi | Test Qamrovi\* |
+| --------------------------------------------------------------------------------------- | ------------------------------------------------ | --------------------- |
+| [goravel/gin](https://github.com/goravel/gin) | `facades.Route()` uchun Gin haydovchisi | 83.1% |
+| [goravel/fiber](https://github.com/goravel/fiber) | `facades.Route()` uchun Fiber haydovchisi | 81.0% |
+| [goravel/cos](https://github.com/goravel/cos) | `facades.Storage()` uchun COS disk haydovchisi | 80.2% |
+| [goravel/minio](https://github.com/goravel/minio) | `facades.Storage()` uchun Minio disk haydovchisi | 79.6% |
+| [goravel/redis](https://github.com/goravel/redis) | `facades.Cache()` uchun Redis disk haydovchisi | 79.1% |
+| [goravel/s3](https://github.com/goravel/s3) | `facades.Storage()` uchun S3 disk haydovchisi | 77.8% |
+| [goravel/oss](https://github.com/goravel/oss) | `facades.Storage()` uchun OSS disk haydovchisi | 76.5% |
+| [goravel/installer](https://github.com/goravel/installer) | Goravel o'rnatuvchisi | 76.2% |
+| [goravel/postgres](https://github.com/goravel/postgres) | Postgres ma'lumotlar bazasi haydovchisi | 73.7% |
+| [goravel/mysql](https://github.com/goravel/mysql) | MySQL ma'lumotlar bazasi haydovchisi | 73.3% |
+| [goravel/sqlserver](https://github.com/goravel/sqlserver) | SQL Server ma'lumotlar bazasi haydovchisi | 60.6% |
+| [goravel/sqlite](https://github.com/goravel/sqlite) | SQLite ma'lumotlar bazasi haydovchisi | 45.2% |
+| [portofolio-mager/goravel-mongodb](https://github.com/portofolio-mager/goravel-mongodb) | MongoDB paketi | 16.9% |
+| [hulutech-web/goravel-kit-cli](https://github.com/hulutech-web/goravel-kit-cli) | Goravel qolip buyruq qatori vositasi | 15.2% |
+| [hulutech-web/goravel-workflow](https://github.com/hulutech-web/goravel-workflow) | Ish jarayoni paketi | 4.4% |
+| [hulutech-web/goravel-crud](https://github.com/hulutech-web/goravel-crud) | Goravel CRUD paketi | 4.2% |
+| [hulutech-web/tinker](https://github.com/hulutech-web/tinker) | Goravel Tinker paketi | 3.6% |
+| [hulutech-web/goravel-socket](https://github.com/hulutech-web/goravel-socket) | WebSocket paketi | 0% |
+
+\***Eslatma**: Paketlar ularning test darajasi bo'yicha tartiblangan.
+
+💡 Maslahat: Ishingizni ko'proq dasturchilar topishi uchun, repozitoriyangizga tegishli mavzularni qo'shishingiz mumkin.
+Tavsiya etilgan mavzu: [`goravel-package`](https://github.com/topics/goravel-package)
+
+- GitHub-da repozitoriyaning asosiy sahifasiga o'ting.
+- Sahifaning yuqori o'ng burchagida, "Haqida" yozuvining o'ng tomonida, tishli chana belgisini (sozlamalar) bosing.
+- "Mavzular" ostida, repozitoriyangizga qo'shmoqchi bo'lgan mavzuni yozishni boshlang va mos keladigan mavzular ro'yxati paydo bo'ladi.
+- Qo'shmoqchi bo'lgan mavzuni bosing yoki yangi mavzu yaratish uchun yozishni davom eting. Masalan: `goravel-package`, `goravel` va boshqa tegishli kalit so'zlar.
+- `O'zgarishlarni saqlash` tugmasini bosing — bu paketingizni topishni osonlashtiradi.
diff --git a/uz_UZ/index.md b/uz_UZ/index.md
new file mode 100644
index 000000000..e74f492a7
--- /dev/null
+++ b/uz_UZ/index.md
@@ -0,0 +1,200 @@
+---
+layout: home
+title: Goravel — Golang uchun to‘liq imkoniyatlarga ega zamonaviy freymvork
+
+head:
+ - [
+ 'meta',
+ {
+ name: description,
+ content: Goravel - bu to'liq funksiyalarga ega va ajoyib kengaytirish imkoniyatiga ega bo'lgan Golang dasturlash freymvorkidir. Gopherlarning o'z ilovalarini tezda qurishiga yordam berish uchun boshlang'ich ishqalam sifatida.
+ }
+ ]
+ - [
+ 'meta',
+ { property: og:url, content: https://www.goravel.dev }
+ ]
+ - [ 'meta', { property: og:type, content: website } ]
+ - [
+ 'meta',
+ {
+ property: og:title,
+ content: Goravel - To'liq imkoniyatli Golang Dasturlash Frameworki
+ }
+ ]
+ - [
+ 'meta',
+ {
+ property: og:description,
+ content: Goravel - bu to'liq funksiyalar va ajoyib kengaytiriluvchanlikka ega Golang dasturlash ramkasi. Gopherlarning o'z ilovalarini tezda qurishiga yordam berish uchun boshlang'ich qolip sifatida.
+ }
+ ]
+ - [
+ 'meta',
+ {
+ property: meta,
+ content: https://www.goravel.dev/meta.png
+ }
+ ]
+ - [
+ 'meta',
+ { name: twitter:card, content: summary_large_image }
+ ]
+ - [
+ 'meta',
+ { property: twitter:domain, content: www.goravel.dev }
+ ]
+ - [
+ 'meta',
+ { property: twitter:url, content: https://www.goravel.dev }
+ ]
+ - [
+ 'meta',
+ {
+ name: twitter:title,
+ content: Goravel - Veb San'atkorlar Uchun Golang Frameworki
+ }
+ ]
+ - [
+ 'meta',
+ {
+ name: twitter:description,
+ content: Goravel - bu to'liq funksiyalarga ega va ajoyib kengaytiriladigan Golang dasturlash tizimidir. Gopherlarning o'z ilovalarini tezda qurishlariga yordam berish uchun boshlang'ich iskala sifatida.
+ }
+ ]
+ - [
+ 'meta',
+ {
+ name: twitter:image,
+ content: https://www.goravel.dev/meta.png
+ }
+ ]
+
+hero:
+ name: Goravel
+ text: To'liq xususiyatli Golang dasturlash freymvorki
+ tagline: Komponentlashtirish, yuqori samaradorlik, kengaytirish oson, PHP dasturchilarining birinchi tanlovi.
+ # image: /logo.svg
+ actions:
+ - theme: brand
+ text: Tezda boshlash
+ link: /getting-started/installation
+ - theme: alt
+ text: 🌟 Github Star
+ link: https://github.com/goravel/goravel
+ target: _blank
+features:
+ - title: 🧰 Yengil yoki to'liq imkoniyatli
+ details: Siz zaruriy xususiyatlarga ega bo'lgan yengil versiya yoki ORM, HTTP, jurnal, keshlash va boshqa barcha ishlanmalar uchun asosiy vositalarni o'z ichiga olgan to'liq xususiyatli versiya o'rtasida tanlashingiz mumkin.
+ - title: 💻 Komponentlashtirish
+ details: Modul dizayni, har bir modul mustaqil va alohida ishlatilishi mumkin, bu esa ishlab chiqish va texnik xizmat ko'rsatishni qulayroq qiladi.
+ - title: 🚀 Yuqori samaradorlik
+ details: Golang bilan qurilgan, tez va sezgir ilovalar yaratish uchun bir nechta ajoyib kengaytmalarni birlashtiradi.
+ - title: 📈 Kengaytirish oson
+ details: Modul bir nechta haydovchilarni taqdim etadi va ehtiyojlarga qarab kengaytirish paketlarini ishlab chiqishi mumkin, kichik loyihalardan tortib katta tizimlargacha bo'lgan har qanday o'lchamdagi ilovalar uchun mos keladi.
+ - title: 👥 Faol hamjamiyat
+ details: Faol hamjamiyat tomonidan qo'llab-quvvatlanadi, ular uning rivojlanishi, hujjatlashtirilishi va doimiy qo'llab-quvvatlashiga hissa qo'shadi.
+ - title: 🔄 PHP dasturchilarning birinchi tanlovi
+ details: Freymvork uslubi Laravel bilan muvofiq, PHP dasturchilariga yangi framework o'rganmasdan kuchli Golang ilovalarini yaratish imkonini beradi. Laravelga hurmat!
+---
+
+
+
+
diff --git a/uz_UZ/orm/factories.md b/uz_UZ/orm/factories.md
new file mode 100644
index 000000000..9f601b4e1
--- /dev/null
+++ b/uz_UZ/orm/factories.md
@@ -0,0 +1,118 @@
+# Zavodlar
+
+[[toc]]
+
+## Kirish
+
+Ilovingizni sinovdan o‘tkazish yoki ma’lumotlar bazangizni to‘ldirishda, oldindan ma’lumotlar bazangizga bir nechta yozuvlarni kiritish zarur bo‘lishi mumkin. Har bir ustun uchun qo‘lda qiymatlarni kiritish o‘rniga, Goravel sizga model zavodlarini yaratish orqali har bir modelingiz uchun standart atributlar to‘plamini belgilash imkonini beradi.
+
+Zavod qanday yozilishiga misol ko‘rish uchun, ilovingizning `database/factories` papkasida joylashgan `user_factory.go` fayliga qarashingiz mumkin.
+
+```go
+package factories
+
+type UserFactory struct {
+}
+
+// Definition Modelning standart holatini aniqlang.
+func (f *UserFactory) Definition() map[string]any {
+ return map[string]any{
+ "Name": "Goravel",
+ }
+}
+```
+
+Ko‘rib turganingizdek, ularning eng oddiy shaklida, zavodlar `Definition` usuliga ega bo‘lgan strukturalardir. Bu usul zavod yordamida model yaratilganda foydalanish kerak bo‘lgan atribut qiymatlari standart to‘plamini qaytaradi. Tasodifiy ma’lumotlar diapazonini yaratish uchun siz [brianvoe/gofakeit](https://github.com/brianvoe/gofakeit) kutubxonasiga tayanishingiz mumkin.
+
+## Zavodlarni yaratish
+
+Zavod yaratish uchun `make:factory` Artisan buyrug‘ini ishga tushiring:
+
+```
+go run . artisan make:factory PostFactory
+```
+
+Yangi zavod `struct`i sizning `database/factories` papkangizga joylashtiriladi.
+
+### Model va Zavodni Aniqlash Qoidalari
+
+Zavodni aniqlaganingizdan so‘ng, modelga zavodni bog‘lash uchun modeldagi `Factory()` usulidan foydalanishingiz mumkin:
+
+```go
+package models
+
+import (
+ "github.com/goravel/framework/contracts/database/factory"
+ "github.com/goravel/framework/database/orm"
+
+ "goravel/database/factories"
+)
+
+type User struct {
+ orm.Model
+ Name string
+ Avatar string
+ orm.SoftDeletes
+}
+
+func (u *User) Factory() factory.Factory {
+ return &factories.UserFactory{}
+}
+```
+
+## Zavodlar Yordamida Modellarni Yaratish
+
+### Modellarni Yaratish
+
+Biz modellarni ma’lumotlar bazasida saqlamasdan yaratish uchun `Make` usulidan foydalanishimiz mumkin:
+
+```go
+var user models.User
+err := facades.Orm().Factory().Make(&user)
+```
+
+`Count` usuli yordamida ko‘plab modellar to‘plamini yaratishingiz mumkin:
+
+```go
+var users []models.User
+err := facades.Orm().Factory().Count(2).Make(&users)
+```
+
+Agar modellaringizning ba’zi standart qiymatlarini o‘zgartirishni istasangiz, `Make` usuliga `map[string]any` o‘tkazishingiz mumkin. Faqat ko‘rsatilgan atributlar almashtiriladi, qolgan atributlar esa zavod tomonidan belgilanganidek, standart qiymatlarida qoladi:
+
+```go
+var user models.User
+err := facades.Orm().Factory().Make(&user, map[string]any{
+ "Avatar": "avatar",
+})
+```
+
+### Modellarni Saqlash
+
+`Create` usuli model namunalarini yaratadi va Ormning `Save` usuli yordamida ma’lumotlar bazasiga saqlaydi.
+
+```go
+var user models.User
+err := facades.Orm().Factory().Create(&user)
+
+var users []models.User
+err := facades.Orm().Factory().Count(2).Create(&users)
+```
+
+Zavodning standart model atributlarini `Create` usuliga atributlarning `map[string]any` to‘plamini o‘tkazish orqali o‘zgartirishingiz mumkin:
+
+```go
+var user models.User
+err := facades.Orm().Factory().Create(&user, map[string]any{
+ "Avatar": "avatar",
+})
+```
+
+### Model Voqealarini E‘tiborsiz Qoldirish
+
+Modelda [model voqeasi](../orm/getting-started.md#events) aniqlangan bo‘lishi mumkin, siz bu voqealarni `CreateQuietly` usuli bilan e‘tiborsiz qoldirishingiz mumkin:
+
+```go
+var user models.User
+err := facades.Orm().Factory().CreateQuietly(&user)
+```
diff --git a/uz_UZ/orm/getting-started.md b/uz_UZ/orm/getting-started.md
new file mode 100644
index 000000000..9cbd7aa25
--- /dev/null
+++ b/uz_UZ/orm/getting-started.md
@@ -0,0 +1,1120 @@
+# Boshlash
+
+[[toc]]
+
+## Kirish
+
+Goravel juda oddiy va oson ishlatiladigan ma'lumotlar bazasi o'zaro ta'sirini taqdim etadi, dasturchilar `facades.Orm()` yordamida amallarni bajarishlari mumkin. Boshlashdan oldin [Ma'lumotlar bazasini sozlash](../database/getting-started) bo'limiga murojaat qiling.
+
+## Model ta'rifi
+
+Maxsus model yaratish uchun, freymvorkda keltirilgan `app/models/user.go` model fayliga murojaat qiling. `app/models/user.go` faylidagi `struct` ikkita o'rnatilgan freymvorkni o'z ichiga oladi: `orm.Model` va `orm.SoftDeletes`. Ushbu freymvorklar mos ravishda `id`, `created_at`, `updated_at` va `deleted_at` xususiyatlarini aniqlaydi. `orm.SoftDeletes` yordamida model uchun yumshoq o'chirishni yoqishingiz mumkin.
+
+### Model konventsiyasi
+
+1. Model katta orqa qopqoq (PascalCase) bilan nomlanadi;
+2. Modelning ko'plik shakli "iloncha nomlash" (snake_case) jadval nomi sifatida ishlatiladi;
+
+Misol uchun, model nomi `UserOrder` bo'lsa, jadval nomi `user_orders` bo'ladi.
+
+### Model yaratish
+
+Model yaratish uchun `make:model` buyrug'idan foydalaning:
+
+```shell
+./artisan make:model User
+./artisan make:model user/User
+```
+
+Yaratilgan model fayli `app/models/user.go` faylida joylashgan bo'lib, uning tarkibi quyidagicha:
+
+```go
+package models
+
+import (
+ "github.com/goravel/framework/database/orm"
+)
+
+type User struct {
+ orm.Model
+ Name string
+ Avatar string
+ orm.SoftDeletes
+}
+```
+
+Agar model maydonini `any` turiga o'rnatmoqchi bo'lsangiz, qo'shimcha Tag qo'shishingiz kerak: `gorm:"type:text"`:
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Avatar string
+ Detail any `gorm:"type:text"`
+ orm.SoftDeletes
+}
+```
+
+Tag'lardan foydalanishning batafsil ma'lumotlari quyidagi manzilda topiladi: https://gorm.io/docs/models.html.
+
+#### Json maydoni
+
+Agar JSON maydonidan foydalanmoqchi bo'lsangiz, maydon turini `datatypes.JSONMap` yoki maxsus struktura sifatida belgilashingiz va `gorm:"type:json"` tegni qo'shishingiz mumkin:
+
+```go
+package models
+
+import (
+ "database/sql/driver"
+ "encoding/json"
+ "github.com/goravel/framework/database/orm"
+ "gorm.io/datatypes"
+)
+
+type User struct {
+ orm.Model
+ Json1 datatypes.JSONMap `gorm:"type:json" json:"json1"`
+ Json2 *UserData `gorm:"type:json;serializer:json" json:"json2"`
+}
+
+type UserData struct {
+ Name string `json:"name"`
+ Age int `json:"age"`
+}
+
+func (r *UserData) Value() (driver.Value, error) {
+ return json.Marshal(r)
+}
+
+func (r *UserData) Scan(value any) (err error) {
+ if data, ok := value.([]byte); ok && len(data) > 0 {
+ err = json.Unmarshal(data, &r)
+ }
+ return
+}
+```
+
+#### Ma'lumotlar bazasi jadvali asosida model yaratish
+
+```shell
+./artisan make:model --table=users User
+
+// Agar Model allaqachon mavjud bo'lsa, -f opsiyasidan foydalanib majburiy ustidan yozishingiz mumkin
+./artisan make:model --table=users -f User
+```
+
+Agar ma'lumotlar jadvalidada freymvork tanimaydigan maydon turi bo'lsa, `bootstrap/app.go::WithCallback` funksiyasida `facades.Schema().Extend()` metodini chaqirib, maydon turini kengaytirishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/contracts/schema"
+
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.Schema().Extend(&schema.Extension{
+ GoTypes: []schema.GoType{
+ {
+ Pattern: "uuid",
+ Type: "uuid.UUID",
+ NullType: "uuid.NullUUID",
+ Imports: []string{"github.com/google/uuid"},
+ },
+ {
+ Pattern: "point",
+ Type: "geom.Point",
+ NullType: "*geom.Point",
+ Imports: []string{"github.com/twpayne/go-geom"},
+ },
+ },
+ })
+ }).
+ Create()
+}
+```
+
+### Jadval nomini ko'rsatish
+
+```go
+package models
+
+import (
+ "github.com/goravel/framework/database/orm"
+)
+
+type User struct {
+ orm.Model
+ Name string
+ Avatar string
+ orm.SoftDeletes
+}
+
+func (r *User) TableName() string {
+ return "goravel_user"
+}
+```
+
+### Ma'lumotlar bazasi ulanishlari
+
+Sukut bo'yicha, barcha modellar ilovangiz uchun sozlangan sukut bo'yicha ma'lumotlar bazasi ulanishidan foydalanadi. Agar ma'lum bir model bilan ishlashda farqli ulanishni ko'rsatmoqchi bo'lsangiz, modelda `Connection` metodini aniqlashingiz kerak.
+
+```go
+package models
+
+import (
+ "github.com/goravel/framework/database/orm"
+)
+
+type User struct {
+ orm.Model
+ Name string
+ Avatar string
+ orm.SoftDeletes
+}
+
+func (r *User) Connection() string {
+ return "postgres"
+}
+```
+
+### Global doirami sozlash
+
+Model so'rov, yangilash va o'chirish amallari doirasini cheklaydigan `GlobalScopes` metodini sozlashni qo'llab-quvvatlaydi:
+
+```go
+import (
+ contractsorm "github.com/goravel/framework/contracts/database/orm"
+ "github.com/goravel/framework/database/orm"
+)
+
+type User struct {
+ orm.Model
+ Name string
+}
+
+func (r *User) GlobalScopes() map[string]func(contractsorm.Query) contractsorm.Query {
+ return map[string]func(contractsorm.Query) contractsorm.Query{
+ "name": func(query contractsorm.Query) contractsorm.Query {
+ return query.Where("name", "goravel")
+ },
+ }
+}
+```
+
+Agar so'rovda global skoplarni olib tashlamoqchi bo'lsangiz, `WithoutGlobalScopes` funksiyasidan foydalanishingiz mumkin:
+
+```go
+// Barcha global skoplarni olib tashlash
+facades.Orm().Query().WithoutGlobalScopes().Get(&users)
+
+// Belgilangan global skopni olib tashlash
+facades.Orm().Query().WithoutGlobalScopes("name").Get(&users)
+```
+
+## facades.Orm() mavjud funksiyalari
+
+| Nomi | Harakat |
+| ----------- | ------------------------------------------------------------------------------------------------- |
+| Connection | [Ma'lumotlar bazasi ulanishini ko'rsatish](#specify-database-connection) |
+| DB | [Umumiy ma'lumotlar bazasi interfeysi sql.DB](#generic-database-interface-sql-db) |
+| Query | [Ma'lumotlar bazasi instansiyasini olish](#get-database-instance) |
+| Transaction | [Tranzaksiya](#transaction) |
+| WithContext | [Kontekstni kiritish](#inject-context) |
+
+## facades.Orm().Query() mavjud funksiyalari
+
+| Funksiyalar | Harakat |
+| --------------------------- | ------------------------------------------------------------------------------------- |
+| Avg | [Avg](#Avarage) |
+| BeginTransaction | [Tranzaksiyani boshlash](#transaction) |
+| Commit | [Tranzaksiyani tasdiqlash](#transaction) |
+| Count | [Hisoblash](#count) |
+| Create | [Yaratish](#create) |
+| Cursor | [Kursor](#cursor) |
+| Delete | [O‘chirish](#delete) |
+| Distinct | [Takrorlanishni filtrlash](#filter-repetition) |
+| Driver | [Haydovchini olish](#get-driver) |
+| Exec | [Mahalliy yangilash SQL-ni bajarish](#execute-native-update-sql) |
+| Exists | [Mavjudligi](#exists) |
+| Find | [ID bo'yicha bir yoki bir nechta qatorni so'rash](#query-one-or-multiple-lines-by-id) |
+| FindOrFail | [Topilmasa xatoni qaytarish](#not-found-return-error) |
+| First | [Bir qatorni so'rash](#query-one-line) |
+| FirstOr | [So'rash yoki callback orqali ma'lumot qaytarish](#query-one-line) |
+| FirstOrCreate | [Modellarni olish yoki yaratish](#retrieving-or-creating-models) |
+| FirstOrNew | [Modellarni olish yoki yangisini yaratish](#retrieving-or-creating-models) |
+| FirstOrFail | [Topilmagan xatosi](#not-found-error) |
+| ForceDelete | [Majburiy o'chirish](#delete) |
+| Get | [Bir nechta qatorni so'rash](#query-multiple-lines) |
+| Group | [Guruhlash](#group-by--having) |
+| Having | [Having](#group-by-having) |
+| Qo'shiladi | [Join](#join) |
+| Limit | [Limit](#limit) |
+| LockForUpdate | [Pessimistic Locking](#pessimistic-locking) |
+| Max | [Max](#Avarage) |
+| Min | [Min](#Avarage) |
+| Model | [Jadvalni aniqlash](#specify-table-query) |
+| Offset | [Offset](#offset) |
+| Tartiblash | [Order](#order) |
+| OrderBy | [Order](#order) |
+| OrderByDesc | [Order](#order) |
+| InRandomOrder | [Order](#order) |
+| OrWhere | [OrWhere](#where) |
+| OrWhereNotIn | [OrWhereNotIn](#where) |
+| OrWhereNull | [OrWhereNull](#where) |
+| OrWhereIn | [OrWhereIn](#where) |
+| OrWhereJsonContains | [OrWhereJsonContains](#where) |
+| OrWhereJsonContainsKey | [OrWhereJsonContainsKey](#where) |
+| OrWhereJsonDoesntContain | [OrWhereJsonDoesntContain](#where) |
+| OrWhereJsonDoesntContainKey | [OrWhereJsonDoesntContainKey](#where) |
+| OrWhereJsonLength | [OrWhereJsonLength](#where) |
+| Sahifalash | [Paginate](#paginate) |
+| Pluck | [Yagona ustunni so'rov qilish](#query-single-column) |
+| Raw | [Asl SQL-ni bajarish](#execute-native-sql) |
+| Restore | [Restore](#restore) |
+| Rollback | [Tranzaksiyani bekor qilish](#transaction) |
+| Save | [Mavjud modelni yangilash](#update-a-existing-model) |
+| SaveQuietly | [Yagona modelni hodisasiz saqlash](#saving-a-single-model-without-events) |
+| Scan | [Scan struct](#execute-native-sql) |
+| Scopes | [Scopes](#scopes) |
+| Tanlash | [Maydonlarni aniqlash](#specify-fields) |
+| SharedLock | [Pessimistic Locking](#pessimistic-locking) |
+| Sum | [Sum](#Avarage) |
+| Jadval | [Jadvalni aniqlash](#specify-table-query) |
+| ToSql | [SQL olish](#get-sql) |
+| ToRawSql | [SQL olish](#get-sql) |
+| Yangilash | [Yagona ustunni yangilash](#update-a-single-column) |
+| UpdateOrCreate | [Yangilash yoki yaratish](#update-or-create) |
+| Where | [Where](#where) |
+| WhereAll | [WhereAll](#where) |
+| WhereAny | [WhereAny](#where) |
+| WhereBetween | [WhereBetween](#where) |
+| WhereNone | [WhereNone](#where) |
+| WhereNotBetween | [WhereNotBetween](#where) |
+| WhereNotIn | [WhereNotIn](#where) |
+| WhereNull | [WhereNull](#where) |
+| WhereIn | [WhereIn](#where) |
+| WhereJsonContains | [WhereJsonContains](#where) |
+| WhereJsonContainsKey | [WhereJsonContainsKey](#where) |
+| WhereJsonDoesntContain | [WhereJsonDoesntContain](#where) |
+| WhereJsonDoesntContainKey | [WhereJsonDoesntContainKey](#where) |
+| WhereJsonLength | [WhereJsonLength](#where) |
+| WithoutEvents | [Hodisalarni o'chirish](#muting-events) |
+| WithTrashed | [Yumshoq o'chirilgan ma'lumotlarni so'rov qilish](#query-soft-delete-data) |
+
+## So'rov Quruvchi
+
+### Kontekstni kiritish
+
+```go
+facades.Orm().WithContext(ctx)
+```
+
+### Ma'lumotlar bazasi ulanishini aniqlash
+
+Agar `config/database.go` faylida bir nechta ma'lumotlar bazasi ulanishlari aniqlangan bo'lsa, ularni `facades.Orm()` ning `Connection` funksiyasi orqali ishlatishingiz mumkin. `Connection` ga uzatilgan ulanish nomi `config/database.go` faylida sozlangan ulanishlardan biri boʻlishi kerak:
+
+```go
+facades.Orm().Connection("mysql")
+```
+
+### Umumiy Maʼlumotlar Bazasi Interfeysi sql.DB
+
+Umumiy maʼlumotlar bazasi interfeysi sql.DB, soʻngra u taqdim etgan funksionallikdan foydalaning:
+
+```go
+db, err := facades.Orm().DB()
+db, err := facades.Orm().Connection("mysql").DB()
+
+// Ping
+db.Ping()
+
+// Close
+db.Close()
+
+// Maʼlumotlar bazasi statistikasini qaytaradi
+db.Stats()
+
+// SetMaxIdleConns boʻsh ulanishlar hovuzidagi maksimal ulanishlar sonini belgilaydi
+db.SetMaxIdleConns(10)
+
+// SetMaxOpenConns maʼlumotlar bazasiga ochiq ulanishlarning maksimal sonini belgilaydi
+db.SetMaxOpenConns(100)
+
+// SetConnMaxLifetime ulanish qayta ishlatilishi mumkin boʻlgan maksimal vaqtni belgilaydi
+db.SetConnMaxLifetime(time.Hour)
+```
+
+### Maʼlumotlar Bazasi Instansini Olish
+
+Har bir aniq maʼlumotlar bazasi operatsiyasidan oldin, maʼlumotlar bazasi instansini olish kerak.
+
+```go
+facades.Orm().Query()
+facades.Orm().Connection("mysql").Query()
+facades.Orm().WithContext(ctx).Query()
+```
+
+### Tanlash
+
+#### Bitta qatorni soʻrov qilish
+
+```go
+var user models.User
+facades.Orm().Query().First(&user)
+// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1;
+```
+
+Baʼzida natijalar topilmasa, boshqa harakatni amalga oshirishni xohlashingiz mumkin. `FirstOr` metodi bitta model instansini qaytaradi yoki natijalar topilmasa, berilgan yopilishni (closure) bajaradi. Yopilishda modelga qiymatlarni belgilashingiz mumkin:
+
+```go
+facades.Orm().Query().Where("name", "first_user").FirstOr(&user, func() error {
+ user.Name = "goravel"
+
+ return nil
+})
+```
+
+#### ID boʻyicha bitta yoki bir nechta qatorni soʻrov qilish
+
+```go
+var user models.User
+facades.Orm().Query().Find(&user, 1)
+// SELECT * FROM `users` WHERE `users`.`id` = 1;
+
+var users []models.User
+facades.Orm().Query().Find(&users, []int{1,2,3})
+// SELECT * FROM `users` WHERE `users`.`id` IN (1,2,3);
+```
+
+#### Topilmasa xatoni qaytaradi
+
+```go
+var user models.User
+err := facades.Orm().Query().FindOrFail(&user, 1)
+```
+
+#### Foydalanuvchi jadvalining asosiy kaliti `string` turida boʻlsa, `Find` metodini chaqirishda asosiy kalitni koʻrsatishingiz kerak
+
+```go
+var user models.User
+facades.Orm().Query().Find(&user, "uuid=?" ,"a")
+// SELECT * FROM `users` WHERE `users`.`uuid` = "a";
+```
+
+#### Bir nechta qatorni soʻrov qilish
+
+```go
+var users []models.User
+facades.Orm().Query().Where("id in ?", []int{1,2,3}).Get(&users)
+// SELECT * FROM `users` WHERE id in (1,2,3);
+```
+
+#### Modellarni Topish yoki Yaratish
+
+`FirstOrCreate` metodi belgilangan ustun/qiymat juftliklari yordamida maʼlumotlar bazasi yozuvini qidiradi. Agar model maʼlumotlar bazasida topilmasa, u birinchi argumentni ixtiyoriy ikkinchi argument bilan birlashtirish orqali olingan atributlar bilan yangi yozuv yaratadi.
+
+Shunga oʻxshash, `FirstOrNew` metodi ham berilgan atributlarga asoslanib maʼlumotlar bazasida yozuvni topishga harakat qiladi. Biroq, agar topilmasa, modelning yangi instansi qaytariladi. Diqqat qilish kerakki, bu yangi model maʼlumotlar bazasiga saqlanmagan va buni amalga oshirish uchun `Save` metodini qoʻlda chaqirishingiz kerak.
+
+```go
+var user models.User
+facades.Orm().Query().Where("gender", 1).FirstOrCreate(&user, models.User{Name: "tom"})
+// SELECT * FROM `users` WHERE `gender` = 1 AND `users`.`name` = 'tom' ORDER BY `users`.`id` LIMIT 1;
+// INSERT INTO `users` (`created_at`,`updated_at`,`name`) VALUES ('2023-09-18 12:51:32.556','2023-09-18 12:51:32.556','tom');
+
+facades.Orm().Query().Where("gender", 1).FirstOrCreate(&user, models.User{Name: "tom"}, models.User{Avatar: "avatar"})
+// SELECT * FROM `users` WHERE `gender` = 1 AND `users`.`name` = 'tom' ORDER BY `users`.`id` LIMIT 1;
+// INSERT INTO `users` (`created_at`,`updated_at`,`name`,`avatar`) VALUES ('2023-09-18 12:52:59.913','2023-09-18 12:52:59.913','tom','avatar');
+
+var user models.User
+facades.Orm().Query().Where("gender", 1).FirstOrNew(&user, models.User{Name: "tom"})
+// SELECT * FROM `users` WHERE `gender` = 1 AND `users`.`name` = 'tom' ORDER BY `users`.`id` LIMIT 1;
+
+facades.Orm().Query().Where("gender", 1).FirstOrNew(&user, models.User{Name: "tom"}, models.User{Avatar: "avatar"})
+// SELECT * FROM `users` WHERE `gender` = 1 AND `users`.`name` = 'tom' ORDER BY `users`.`id` LIMIT 1;
+```
+
+#### Topilmagan Xatosi
+
+Soʻralgan element topilmasa, `First` metodi xatolik keltirib chiqarmaydi. Xatolik keltirib chiqarish uchun `FirstOrFail` metodidan foydalaning:
+
+```go
+var user models.User
+err := facades.Orm().Query().FirstOrFail(&user)
+
+// import "github.com/goravel/framework/errors"
+// if errors.Is(err, errors.OrmRecordNotFound) {}
+```
+
+### Qayerda
+
+```go
+facades.Orm().Query().Where("name", "tom")
+facades.Orm().Query().Where("name = 'tom'")
+facades.Orm().Query().Where("name = ?", "tom")
+facades.Orm().Query().Where("name", "tom").Where(func(query orm.Query) orm.Query {
+ return query.Where("height", 180).Where("age", 18)
+})
+
+facades.Orm().Query().WhereBetween("age", 1, 10)
+facades.Orm().Query().WhereNotBetween("age", 1, 10)
+facades.Orm().Query().WhereNotIn("name", []any{"a"})
+facades.Orm().Query().WhereNull("name")
+facades.Orm().Query().WhereIn("name", []any{"a"})
+
+facades.Orm().Query().OrWhere("name", "tom")
+facades.Orm().Query().OrWhereNotIn("name", []any{"a"})
+facades.Orm().Query().OrWhereNull("name")
+facades.Orm().Query().OrWhereIn("name", []any{"a"})
+
+var products []Product
+facades.DB().Table("products").WhereAll([]string{"weight", "height"}, "=", 200).Find(&products)
+// SQL: SELECT * FROM products WHERE weight = ? AND height = ?
+
+var users []User
+facades.DB().Table("users").WhereAny([]string{"name", "email"}, "=", "John").Find(&users)
+// SQL: SELECT * FROM users WHERE (name = ? OR email = ?)
+
+var products []Product
+facades.DB().Table("products").WhereNone([]string{"age", "score"}, ">", 18).Find(&products)
+// SQL: SELECT * FROM products WHERE NOT (age > ?) AND NOT (score > ?)
+```
+
+JSON ustunlarini soʻrov qilish
+
+```go
+facades.Orm().Query().Where("preferences->dining->meal", "salad").First(&user)
+facades.Orm().Query().Where("options->languages[0]", "en").First(&user)
+facades.Orm().Query().WhereJsonContainsKey("contacts->personal->email").First(&user)
+facades.Orm().Query().WhereJsonDoesntContainKey("contacts->personal->email").First(&user)
+facades.Orm().Query().WhereJsonContains("options->languages", "en").First(&user)
+facades.Orm().Query().WhereJsonContains("options->languages", []string{"en", "de"}).First(&user)
+facades.Orm().Query().WhereJsonDoesntContain("options->languages", "en").First(&user)
+facades.Orm().Query().WhereJsonDoesntContain("options->languages", []string{"en", "de"}).First(&user)
+facades.Orm().Query().WhereJsonLength('options->languages', 1).First(&user)
+facades.Orm().Query().WhereJsonLength('options->languages > ?', 1).First(&user)
+
+facades.Orm().Query().OrWhere("preferences->dining->meal", "salad").First(&user)
+facades.Orm().Query().OrWhere("options->languages[0]", "en").First(&user)
+facades.Orm().Query().OrWhereJsonContainsKey("contacts->personal->email").First(&user)
+facades.Orm().Query().OrWhereJsonDoesntContainKey("contacts->personal->email").First(&user)
+facades.Orm().Query().OrWhereJsonContains("options->languages", "en").First(&user)
+facades.Orm().Query().OrWhereJsonContains("options->languages", []string{"en", "de"}).First(&user)
+facades.Orm().Query().OrWhereJsonDoesntContain("options->languages", "en").First(&user)
+facades.Orm().Query().OrWhereJsonDoesntContain("options->languages", []string{"en", "de"}).First(&user)
+facades.Orm().Query().OrWhereJsonLength('options->languages', 1).First(&user)
+facades.Orm().Query().OrWhereJsonLength('options->languages > ?', 1).First(&user)
+```
+
+### Limit
+
+```go
+var users []models.User
+facades.Orm().Query().Where("name", "tom").Limit(3).Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' LIMIT 3;
+```
+
+### Ofset
+
+```go
+var users []models.User
+facades.Orm().Query().Where("name", "tom").Offset(5).Limit(3).Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' LIMIT 3 OFFSET 5;
+```
+
+### Tartiblash
+
+```go
+var users []models.User
+facades.Orm().Query().Where("name", "tom").Order("sort asc").Order("id desc").Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' ORDER BY sort asc,id desc;
+
+facades.Orm().Query().Where("name", "tom").OrderBy("sort").Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' ORDER BY sort asc;
+
+facades.Orm().Query().Where("name", "tom").OrderByDesc("sort").Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' ORDER BY sort desc;
+
+facades.Orm().Query().Where("name", "tom").InRandomOrder().Get(&users)
+// SELECT * FROM `users` WHERE name = 'tom' ORDER BY RAND();
+```
+
+### Sahifalash
+
+```go
+var users []models.User
+var total int64
+facades.Orm().Query().Paginate(1, 10, &users, &total)
+// SELECT count(*) FROM `users`;
+// SELECT * FROM `users` LIMIT 10;
+```
+
+### Bitta Ustunni Soʻrov Qilish
+
+```go
+var ages []int64
+facades.Orm().Query().Model(&models.User{}).Pluck("age", &ages)
+// SELECT `age` FROM `users`;
+```
+
+### Jadvalni Belgilash Orqali Soʻrov Qilish
+
+Agar baʼzi agregat maʼlumotlarni soʻrov qilmoqchi boʻlsangiz, aniq bir jadvalni belgilashingiz kerak.
+
+Modelni belgilash
+
+```go
+count, err := facades.Orm().Query().Model(&models.User{}).Count()
+// SELECT count(*) FROM `users` WHERE deleted_at IS NULL;
+```
+
+Jadvalni belgilash
+
+```go
+count, err := facades.Orm().Query().Table("users").Count()
+// SELECT count(*) FROM `users`; // oʻchirilgan yoki oʻchirilmagan barcha yozuvlarni olish
+```
+
+### SQL ni Olish
+
+Belgilovchi bilan SQL ni olish:
+
+```go
+facades.Orm().Query().ToSql().Get(models.User{})
+// SELECT * FROM "users" WHERE "id" = $1 AND "users"."deleted_at" IS NULL
+```
+
+Qiymat bilan SQL ni olish:
+
+```go
+facades.Orm().Query().ToRawSql().Get(models.User{})
+// SELECT * FROM "users" WHERE "id" = 1 AND "users"."deleted_at" IS NULL
+```
+
+`ToSql` va `ToRawSql` dan keyin chaqirilishi mumkin bo'lgan metodlar: `Count`, `Create`, `Delete`, `Find`, `First`, `Get`, `Pluck`, `Save`, `Sum`, `Update`.
+
+### Count
+
+```go
+count, err := facades.Orm().Query().Table("users").Count()
+// SELECT count(*) FROM `users` WHERE name = 'tom';
+```
+
+### Maydonlarni belgilash
+
+`Select` ma'lumotlar bazasidan qaysi maydonlarni olishni belgilash imkonini beradi, sukut bo'yicha ORM barcha maydonlarni oladi.
+
+```go
+facades.Orm().Query().Select("name", "age").Get(&users)
+// SELECT `name`,`age` FROM `users`;
+```
+
+### Guruhlash & Having
+
+```go
+type Result struct {
+ Name string
+ Total int
+}
+
+var result Result
+facades.Orm().Query().Model(&models.User{}).Select("name", "sum(age) as total").Group("name").Having("name = ?", "tom").Get(&result)
+// SELECT name, sum(age) as total FROM `users` GROUP BY `name` HAVING name = "tom";
+```
+
+### Qo'shiladi
+
+```go
+type Result struct {
+ Name string
+ Email string
+}
+
+var result Result
+facades.Orm().Query().Model(&models.User{}).Select("users.name", "emails.email").Join("left join emails on emails.user_id = users.id").Scan(&result)
+// SELECT users.name, emails.email FROM `users` LEFT JOIN emails ON emails.user_id = users.id;
+```
+
+### Create
+
+```go
+user := models.User{Name: "tom", Age: 18}
+err := facades.Orm().Query().Create(&user)
+// INSERT INTO users (name, age, created_at, updated_at) VALUES ("tom", 18, "2022-09-27 22:00:00", "2022-09-27 22:00:00");
+
+// Model hodisalarini ishga tushirmaydi
+err := facades.Orm().Query().Table("users").Create(map[string]any{
+ "name": "Goravel",
+})
+
+// Model hodisalarini ishga tushiradi
+err := facades.Orm().Query().Model(&models.User{}).Create(map[string]any{
+ "name": "Goravel",
+})
+```
+
+### Ko'p yaratish
+
+```go
+users := []models.User{{Name: "tom", Age: 18}, {Name: "tim", Age: 19}}
+err := facades.Orm().Query().Create(&users)
+
+err := facades.Orm().Query().Table("users").Create(&[]map[string]any{
+ {"name": "Goravel"},
+ {"name": "Framework"},
+})
+
+err := facades.Orm().Query().Model(&models.User{}).Create(&[]map[string]any{
+ {"name": "Goravel"},
+ {"name": "Framework"},
+})
+```
+
+> `created_at` va `updated_at` avtomatik ravishda to'ldiriladi.
+
+### Kursor
+
+O'n minglab Eloquent model yozuvlari orqali takrorlashda ilovangizning xotira sarfini sezilarli darajada kamaytirish uchun ishlatilishi mumkin. E'tibor bering, `Cursor` metodi `With` bilan bir vaqtda ishlatilishi mumkin, iltimos, `for` mantiqida bog'lanishni yuklash uchun [Lazy Eager Loading](./relationships.md#lazy-eager-loading) dan foydalaning.
+
+```go
+cursor, err := facades.Orm().Query().Model(models.User{}).Cursor()
+if err != nil {
+ return err
+}
+for row := range cursor {
+ var user models.User
+ if err := row.Scan(&user); err != nil {
+ return err
+ }
+ fmt.Println(user)
+}
+```
+
+### Modelni saqlash
+
+#### Mavjud modelni yangilash
+
+```go
+var user models.User
+facades.Orm().Query().First(&user)
+
+user.Name = "tom"
+user.Age = 100
+facades.Orm().Query().Save(&user)
+// UPDATE `users` SET `created_at`='2023-09-14 16:03:29.454',`updated_at`='2023-09-18 21:05:59.896',`name`='tom',`age`=100,`avatar`='' WHERE `id` = 1;
+```
+
+#### Ustunlarni yangilash
+
+```go
+facades.Orm().Query().Model(&models.User{}).Where("name", "tom").Update("name", "hello")
+// UPDATE `users` SET `name`='hello',`updated_at`='2023-09-18 21:06:30.373' WHERE `name` = 'tom';
+
+facades.Orm().Query().Model(&models.User{}).Where("name", "tom").Update(models.User{Name: "hello", Age: 18})
+facades.Orm().Query().Model(&models.User{}).Where("name", "tom").Update(map[string]any{"name": "hello", "age": 18})
+// UPDATE `users` SET `updated_at`='2023-09-18 21:07:06.489',`name`='hello',`age`=18 WHERE `name` = 'tom';
+```
+
+> `struct` bilan yangilashda, Orm faqat nolga teng bo'lmagan maydonlarni yangilaydi. Siz atributlarni yangilash uchun `map` dan foydalanishingiz yoki yangilash uchun maydonlarni belgilash uchun `Select` dan foydalanishingiz mumkin. E'tibor bering, `struct` faqat `Model` bo'lishi mumkin, agar siz `Model` bo'lmagan narsa bilan yangilamoqchi bo'lsangiz, `.Table("users")` dan foydalanishingiz kerak, ammo bu vaqtda `updated_at` maydoni avtomatik ravishda yangilanmaydi.
+
+#### JSON maydonlarini yangilang
+
+```go
+facades.Orm().Query().Model(&models.User{}).Where("id", 1).Update("options->enabled", true)
+facades.Orm().Query().Model(&models.User{}).Where("id", 1).Update("options->languages[0]", "en")
+facades.Orm().Query().Model(&models.User{}).Where("id", 1).Update("options->languages", []string{"en", "de"})
+facades.Orm().Query().Model(&models.User{}).Where("id", 1).Update(map[string]any{
+ "preferences->dining->meal": "salad",
+ "options->languages[0]": "en",
+ "options->enabled": true,
+})
+```
+
+#### Yangilash yoki yaratish
+
+`name` bo'yicha so'rov bering, agar mavjud bo'lmasa, `name`, `avatar` bo'yicha yarating, agar mavjud bo'lsa, `name` asosida `avatar` ni yangilang:
+
+```go
+facades.Orm().Query().UpdateOrCreate(&user, models.User{Name: "name"}, models.User{Avatar: "avatar"})
+// SELECT * FROM `users` WHERE `users`.`name` = 'name' AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1;
+// INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`avatar`) VALUES ('2023-03-11 10:11:08.869','2023-03-11 10:11:08.869',NULL,'name','avatar');
+// UPDATE `users` SET `name`='name',avatar`='avatar',`updated_at`='2023-03-11 10:11:08.881' WHERE users`.`deleted_at` IS NULL AND `id` = 1;
+```
+
+### O‘chirish
+
+Model bo'yicha o'chirish, bayonot ta'sir qilgan qatorlar soni usul tomonidan qaytariladi:
+
+```go
+var user models.User
+facades.Orm().Query().Find(&user, 1)
+res, err := facades.Orm().Query().Delete(&user)
+res, err := facades.Orm().Query().Model(&models.User{}).Where("id", 1).Delete()
+res, err := facades.Orm().Query().Table("users").Where("id", 1).Delete()
+// DELETE FROM `users` WHERE `users`.`id` = 1;
+
+num := res.RowsAffected
+```
+
+Ko'p o'chirish
+
+```go
+facades.Orm().Query().Where("name", "tom").Delete(&models.User{})
+// DELETE FROM `users` WHERE name = 'tom';
+```
+
+Yumshoq o'chirilgan ma'lumotni majburan o'chirishni xohlaysiz.
+
+```go
+facades.Orm().Query().Where("name", "tom").ForceDelete(&models.User{})
+facades.Orm().Query().Model(&models.User{}).Where("name", "tom").ForceDelete()
+facades.Orm().Query().Table("users").Where("name", "tom").ForceDelete()
+```
+
+Model bog'lanishlari bilan yozuvlarni `Select` orqali o'chirishingiz mumkin:
+
+```go
+// Foydalanuvchini o'chirishda uning Account'ini o'chirish
+facades.Orm().Query().Select("Account").Delete(&user)
+
+// Foydalanuvchini o'chirishda uning Orders va CreditCards'larini o'chirish
+facades.Orm().Query().Select("Orders", "CreditCards").Delete(&user)
+
+// Foydalanuvchini o'chirishda uning barcha farzand bog'lanishlarini o'chirish
+facades.Orm().Query().Select(orm.Associations).Delete(&user)
+
+// Foydalanuvchilarni o'chirishda ularning barcha Account'larini o'chirish
+facades.Orm().Query().Select("Account").Delete(&users)
+```
+
+Eslatma: Bog'lanishlar faqat yozuvning birlamchi kaliti bo'sh bo'lmaganda o'chiriladi va Orm bog'langan yozuvlarni o'chirish shartlari sifatida ushbu birlamchi kalitlardan foydalanadi:
+
+```go
+// name='goravel' bo'lgan foydalanuvchini o'chirish, lekin foydalanuvchining hisobini o'chirmaslik
+facades.Orm().Query().Select("Account").Where("name", "goravel").Delete(&models.User{})
+
+// name='goravel' va id = 1 bo'lgan foydalanuvchini o'chirish va foydalanuvchining hisobini o'chirish
+facades.Orm().Query().Select("Account").Where("name", "goravel").Delete(&models.User{ID: 1})
+
+// id = 1 bo'lgan foydalanuvchini o'chirish va uning hisobini o'chirish
+facades.Orm().Query().Select("Account").Delete(&models.User{ID: 1})
+```
+
+Agar hech qanday shartlarsiz to'plam o'chirish amalga oshirilsa, ORM buni qilmaydi va xatoni qaytaradi. Shuning uchun siz ba'zi shartlarni qo'shishingiz yoki mahalliy SQL dan foydalanishingiz kerak.
+
+### Yumshoq o'chirilgan ma'lumotlarni so'rov bering
+
+```go
+var user models.User
+facades.Orm().Query().WithTrashed().First(&user)
+```
+
+### Takrorlanishni filtrlash
+
+```go
+var users []models.User
+facades.Orm().Query().Distinct("name").Find(&users)
+```
+
+### Haydovchini olish
+
+```go
+driver := facades.Orm().Query().Driver()
+
+// Haydovchini aniqlash
+if driver == orm.DriverMysql {}
+```
+
+### Mahalliy SQL ni bajarish
+
+```go
+type Result struct {
+ ID int
+ Name string
+ Age int
+}
+
+var result Result
+facades.Orm().Query().Raw("SELECT id, name, age FROM users WHERE name = ?", "tom").Scan(&result)
+```
+
+### Mahalliy Update SQL ni bajarish
+
+Bayanot ta'sir qilgan qatorlar soni usul tomonidan qaytariladi:
+
+```go
+res, err := facades.Orm().Query().Exec("DROP TABLE users")
+// DROP TABLE `users`;
+
+num := res.RowsAffected
+```
+
+### Mavjud
+
+```go
+exists, err := facades.Orm().Query().Model(&models.User{}).Where("name", "tom").Exists()
+```
+
+### Tiklash
+
+```go
+facades.Orm().Query().WithTrashed().Restore(&models.User{ID: 1})
+facades.Orm().Query().Model(&models.User{ID: 1}).WithTrashed().Restore()
+// UPDATE `users` SET `deleted_at`=NULL WHERE `id` = 1;
+```
+
+### Tranzaksiya
+
+Siz `Transaction` funksiyasi orqali tranzaksiyani bajarishingiz mumkin.
+
+```go
+import (
+ "github.com/goravel/framework/contracts/database/orm"
+
+ "goravel/app/facades"
+ "goravel/app/models"
+)
+
+...
+
+return facades.Orm().Transaction(func(tx orm.Query) error {
+ var user models.User
+
+ return tx.Find(&user, user.ID)
+})
+```
+
+Shuningdek, siz transaksiya oqimini o'zingiz qo'lda boshqarishingiz mumkin:
+
+```go
+tx, err := facades.Orm().Query().BeginTransaction()
+user := models.User{Name: "Goravel"}
+if err := tx.Create(&user); err != nil {
+ err := tx.Rollback()
+} else {
+ err := tx.Commit()
+}
+```
+
+### Skoplar
+
+Metodlar chaqirilganda murojaat qilish mumkin bo'lgan tez-tez ishlatiladigan so'rovlarni belgilash imkonini beradi.
+
+```go
+func Paginator(page string, limit string) func(methods orm.Query) orm.Query {
+ return func(query orm.Query) orm.Query {
+ page, _ := strconv.Atoi(page)
+ limit, _ := strconv.Atoi(limit)
+ offset := (page - 1) * limit
+
+ return query.Offset(offset).Limit(limit)
+ }
+}
+
+// scopes.Paginator - maxsus funksiya: func(ormcontract.Query) ormcontract.Query
+facades.Orm().Query().Scopes(scopes.Paginator(page, limit)).Find(&entries)
+```
+
+### Xom ifodalar
+
+Maydonlarni yangilash uchun `db.Raw` usulidan foydalanishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/database/db"
+
+facades.Orm().Query().Model(&user).Update("age", db.Raw("age - ?", 1))
+// UPDATE `users` SET `age`=age - 1,`updated_at`='2023-09-14 14:03:20.899' WHERE `users`.`deleted_at` IS NULL AND `id` = 1;
+```
+
+### Pessimistik blokirovka
+
+So'rov quruvchisi, shuningdek, sizning `select` bayonotlaringizni bajarishda "pessimistik blokirovka"ga erishishga yordam beradigan bir nechta funksiyalarni o'z ichiga oladi.
+
+"Umumiy qulf" bilan bayonotni bajarish uchun siz `SharedLock` usulini chaqirishingiz mumkin. "Umumiy qulf" tanlangan qatorlar transaksiya tasdiqlanmaguncha o'zgartirilishiga yo'l qo'ymaydi:
+
+```go
+var users []models.User
+facades.Orm().Query().Where("ovozlar > ?", 100).SharedLock().Get(&users)
+```
+
+Shuningdek, siz `LockForUpdate` usulidan foydalanishingiz mumkin. "Yangilash uchun qulf" tanlangan yozuvlarni o'zgartirish yoki boshqa umumiy qulf bilan tanlashdan himoya qiladi:
+
+```go
+var users []models.User
+facades.Orm().Query().Where("ovozlar > ?", 100).LockForUpdate().Get(&users)
+```
+
+### Oʻrtacha
+
+```go
+var sum int
+err := facades.Orm().Query().Model(models.User{}).Sum("id", &sum)
+
+var avg float64
+err := facades.Orm().Query().Model(models.User{}).Average("age", &avg)
+
+var max int
+err := facades.Orm().Query().Model(models.User{}).Max("age", &max)
+
+var min int
+err := facades.Orm().Query().Model(models.User{}).Min("age", &min)
+```
+
+## Tadbirlar
+
+Orm modellari bir nechta tadbirlarni ishga tushiradi, bu sizga model hayot tsiklining quyidagi momentlariga ulanish imkonini beradi: `Retrieved`, `Creating`, `Created`, `Updating`, `Updated`, `Saving`, `Saved`, `Deleting`, `Deleted`, `ForceDeleting`, `ForceDeleted`, `Restored`, `Restoring`.
+
+`Retrieved` tadbiri mavjud model ma'lumotlar bazasidan olinganda ishga tushadi. Yangi model birinchi marta saqlanganda, `Creating` va `Created` tadbirlari ishga tushadi. Mavjud model o'zgartirilganda va `Save` usuli chaqirilganda `Updating` / `Updated` tadbirlari ishga tushadi. Model yaratilganda yoki yangilanganda - hatto model atributlari o'zgartirilmagan bo'lsa ham, `Saving` / `Saved` tadbirlari ishga tushadi. `-ing` bilan tugaydigan tadbir nomlari modelga o'zgartirishlar kiritilishidan oldin, `-ed` bilan tugaydigan tadbirlar esa modelga o'zgartirishlar kiritilgandan keyin ishga tushadi.
+
+Eslatma: Barcha tadbirlar faqat model ustida amal bajarilganda ishga tushadi. Masalan, `Update` usulini chaqirganda `Updating` va `Updated` tadbirlarini ishga tushirishni xohlasangiz, mavjud modelni `Model` usuliga uzatishingiz kerak: `facades.Orm().Query().Model(&user).Update("name", "Goravel")`.
+
+Model tadbirlarini tinglashni boshlash uchun o'z modelingizda `DispatchesEvents` usulini aniqlang. Bu xususiyat model hayot tsiklining turli nuqtalarini o'z tadbir klasslaringizga bog'laydi.
+
+```go
+import (
+ contractsorm "github.com/goravel/framework/contracts/database/orm"
+ "github.com/goravel/framework/database/orm"
+)
+
+type User struct {
+ orm.Model
+ Name string
+}
+
+func (u *User) DispatchesEvents() map[contractsorm.EventType]func(contractsorm.Event) error {
+ return map[contractsorm.EventType]func(contractsorm.Event) error{
+ contractsorm.EventCreating: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventCreated: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventSaving: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventSaved: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventUpdating: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventUpdated: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventDeleting: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventDeleted: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventForceDeleting: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventForceDeleted: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventRetrieved: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventRestored: func(event contractsorm.Event) error {
+ return nil
+ },
+ contractsorm.EventRestoring: func(event contractsorm.Event) error {
+ return nil
+ },
+ }
+}
+```
+
+> Eslatma: Faqat sizga kerak bo'lgan tadbirlarni ro'yxatdan o'tkazing. Orm orqali partiyali operatsiyalar bajarilayotganda model tadbirlari ishga tushirilmaydi.
+
+### Kuzatuvchilar
+
+#### Kuzatuvchilarni aniqlash
+
+Agar siz berilgan modelda ko'plab tadbirlarni tinglamoqchi bo'lsangiz, barcha tinglovchilaringizni bitta klassga guruhlash uchun kuzatuvchilardan foydalanishingiz mumkin. Kuzatuvchi klasslarida tinglamoqchi bo'lgan Eloquent tadbirlarini aks ettiruvchi usul nomlari mavjud. Bu usullarning har biri ta'sirlangan modelni yagona argument sifatida qabul qiladi. Yangi kuzatuvchi klassini yaratishning eng oson yo'li `make:observer` Artisan buyrug'idir:
+
+```shell
+./artisan make:observer UserObserver
+./artisan make:observer user/UserObserver
+```
+
+Bu buyruq yangi kuzatuvchini sizning `app/observers` katalogingizga joylashtiradi. Agar bu katalog mavjud bo'lmasa, Artisan uni siz uchun yaratadi. Yangi kuzatuvchingiz quyidagicha ko'rinadi:
+
+```go
+package observers
+
+import (
+ "fmt"
+
+ "github.com/goravel/framework/contracts/database/orm"
+)
+
+type UserObserver struct{}
+
+func (u *UserObserver) Created(event orm.Event) error {
+ return nil
+}
+
+func (u *UserObserver) Updated(event orm.Event) error {
+ return nil
+}
+
+func (u *UserObserver) Deleted(event orm.Event) error {
+ return nil
+}
+
+func (u *UserObserver) ForceDeleted(event orm.Event) error {
+ return nil
+}
+```
+
+Namuna kuzatuvchi faqat ba'zi tadbirlarni o'z ichiga oladi, siz ehtiyojlaringizga qarab boshqa tadbirlarni qo'shishingiz mumkin.
+
+Kuzatuvchini ro'yxatdan o'tkazish uchun kuzatmoqchi bo'lgan modelingizda `Observe` usulini chaqirishingiz kerak. Siz kuzatuvchilarni `bootstrap/app.go::WithCallback` funksiyasida ro'yxatdan o'tkazishingiz mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.Orm().Observe(models.User{}, &observers.UserObserver{})
+ }).
+ Create()
+}
+```
+
+> Eslatma: Agar siz `DispatchesEvents` va `Observer` ni bir vaqtning o'zida o'rnatsangiz, faqat `DispatchesEvents` qo'llaniladi.
+
+#### Kuzatuvchidagi parametr
+
+`event` parametri barcha kuzatuvchilarga uzatiladi:
+
+| Usul | Harakat |
+| ------------ | ------------------------------------------------------------------------------------------------------------------------ |
+| Kontekst | `facades.Orm().WithContext()` orqali uzatilgan kontekstni olish |
+| GetAttribute | O'zgartirilgan qiymatni olish, agar o'zgartirilmagan bo'lsa, asl qiymatni olish, agar asl qiymat bo'lmasa, nil qaytarish |
+| GetOriginal | Asl qiymatni olish, agar asl qiymat bo'lmasa, nil qaytarish |
+| IsDirty | Maydon o'zgartirilganligini aniqlash |
+| IsClean | IsDirty ning teskarisi |
+| Query | Transaksiya bilan ishlatish mumkin bo'lgan yangi Query olish |
+| SetAttribute | Maydon uchun yangi qiymat o'rnatish |
+
+### Tadbirlarni o'chirish
+
+Ba'zan siz model tomonidan ishga tushirilgan barcha tadbirlarni vaqtincha "o'chirish" kerak bo'lishi mumkin. Buni `WithoutEvents` usuli yordamida amalga oshirishingiz mumkin:
+
+```go
+var user models.User
+facades.Orm().Query().WithoutEvents().Find(&user, 1)
+```
+
+#### Tadbirlarsiz bitta modelni saqlash
+
+Ba'zan siz berilgan modelni hech qanday tadbirlarni ishga tushirmasdan "saqlash"ni xohlashingiz mumkin. Buni `SaveQuietly` usuli bilan amalga oshirishingiz mumkin:
+
+```go
+var user models.User
+err := facades.Orm().Query().FindOrFail(&user, 1)
+user.Name = "Goravel"
+err := facades.Orm().Query().SaveQuietly(&user)
+```
diff --git a/uz_UZ/orm/relationships.md b/uz_UZ/orm/relationships.md
new file mode 100644
index 000000000..f98f21878
--- /dev/null
+++ b/uz_UZ/orm/relationships.md
@@ -0,0 +1,532 @@
+# Bog'lanishlar
+
+[[toc]]
+
+## Kirish
+
+Ma'lumotlar bazasi jadvallari o'zaro bog'langan bo'lishi odatiy holdir. Masalan, blog postida ko'p sharhlar bo'lishi mumkin yoki buyurtma uni joylagan foydalanuvchiga bog'langan bo'lishi mumkin. `Orm` bunday bog'lanishlarni boshqarish va ular bilan ishlashni osonlashtiradi va u turli keng tarqalgan bog'lanish turlarini qo'llab-quvvatlaydi:
+
+- [Bitta-birga](#One-To-One)
+- [Bitta-ko'pga](#One-To-Many)
+- [Ko'p-ko'pga](#Many-To-Many)
+- [Polimorfik](#Polymorphic)
+
+## Bog'lanishlarni aniqlash
+
+### Bitta-birga
+
+Bitta-birga bog'lanish ma'lumotlar bazasi munosabatlarining juda asosiy turidir. Masalan, `User` modeli bitta `Phone` modeli bilan bog'langan bo'lishi mumkin.
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Phone *Phone
+}
+
+type Phone struct {
+ orm.Model
+ UserID uint
+ Name string
+}
+```
+
+`Orm` dan foydalanganda, u chet kalitni ota model nomiga asoslanib bog'lanishga avtomatik tayinlaydi. Masalan, `Phone` modeli sukut bo'yicha `UserID` chet kalitiga ega deb hisoblanadi. Biroq, agar siz ushbu konventsiyani o'zgartirmoqchi bo'lsangiz, `User` modelidagi `Phone` maydoniga `foreignKey` tegnini qo'shishingiz mumkin. (Bu boshqa bog'lanishlarga ham tegishli.)
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Phone *Phone `gorm:"foreignKey:UserName"`
+}
+
+type Phone struct {
+ orm.Model
+ UserName string
+ Name string
+}
+```
+
+Bundan tashqari, `Orm` dan foydalanganda, chet kalit ota modelning asosiy kalit ustuniga mos kelishi kerak deb hisoblanadi. Bu shuni anglatadiki, `Orm` foydalanuvchining `ID` ustun qiymatini `Phone` yozuvidagi `UserId` ustunida qidiradi. Agar siz `ID` dan boshqa asosiy kalit qiymatidan foydalanmoqchi bo'lsangiz, `User` modelidagi `Phone` maydoniga "Tag" havolasini qo'shishingiz mumkin. Buning uchun `hasOne` metodiga uchinchi argumentni o'tkazishingiz kifoya. (Boshqa bog'lanish sozlamalari ham o'xshash.)
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Phone *Phone `gorm:"foreignKey:UserName;references:name"`
+}
+
+type Phone struct {
+ orm.Model
+ UserName string
+ Name string
+}
+```
+
+#### Bog'lanishning teskari tomonini aniqlash
+
+Biz `User` modelimizdan `Phone` modeliga kirishimiz mumkin. Endi, bizga telefoning egasiga kirish imkonini beruvchi `Phone` modelida bog'lanish o'rnatish kerak. Buning uchun `Phone` modelida `User` maydonini aniqlashimiz mumkin.
+
+```go
+type User struct {
+ orm.Model
+ Name string
+}
+
+type Phone struct {
+ orm.Model
+ UserID uint
+ Name string
+ User *User
+}
+```
+
+### Bitta-ko'pga
+
+Bitta-ko'pga bog'lanish bitta model bir yoki bir nechta bola modellar uchun ota bo'lgan munosabatlarni aniqlash uchun ishlatiladi. Masalan, blog postida cheksiz sonli sharhlar bo'lishi mumkin. Boshqa barcha `Orm` bog'lanishlari singari, bitta-ko'pga bog'lanishlar ham `Orm` modelingizda maydon aniqlash orqali belgilanadi:
+
+```go
+type Post struct {
+ orm.Model
+ Name string
+ Comments []*Comment
+}
+
+type Comment struct {
+ orm.Model
+ PostID uint
+ Name string
+}
+```
+
+Esda tuting, `Orm` `Comment` modeli uchun tegishli chet kalit ustunini avtomatik aniqlaydi. Konventsiyaga ko'ra, Orm ota modelning "tuya yurishi" nomini oladi va unga `ID` qo'shimchasini qo'shadi. Shunday qilib, bu misolda Orm `Comment` modelidagi chet kalit ustuni `PostID` ekanligini taxmin qiladi.
+
+### Bitta-ko'pga (Teskari) / Tegishli
+
+Endi biz postning barcha sharhlariga kirishimiz mumkin bo'lgani uchun, sharhga o'zining ota postiga kirish imkonini beruvchi bog'lanishni aniqlaymiz. `Bitta-ko'pga` bog'lanishning teskari tomonini aniqlash uchun, bola modelda `belongsTo` metodini chaqiradigan bog'lanish metodini aniqlang:
+
+```go
+type Post struct {
+ orm.Model
+ Name string
+ Comments []*Comment
+}
+
+type Comment struct {
+ orm.Model
+ PostID uint
+ Name string
+ Post *Post
+}
+```
+
+## Ko'p-ko'pga bog'lanishlar
+
+Ko'p-ko'pga munosabatlar `Bitta-birga` va `Bitta-ko'pga` bog'lanishlarga qaraganda biroz murakkabroq. Ko'p-ko'pga bog'lanishga misol sifatida ko'p rollarga ega bo'lgan foydalanuvchi va bu rollar ilovadagi boshqa foydalanuvchilar tomonidan ham ulashilishi mumkin. Masalan, foydalanuvchiga "Muallif" va "Tahrirchi" roli tayinlanishi mumkin; biroq, bu rollar boshqa foydalanuvchilarga ham tayinlanishi mumkin. Shunday qilib, foydalanuvchida ko'p rollar bor va rolda ko'p foydalanuvchilar bor.
+
+### Jadval tuzilmasi
+
+Ushbu bog'lanishni aniqlash uchun uchta ma'lumotlar bazasi jadvali kerak: `users`, `roles` va `role_user`. `role_user` jadvalining nomi sozlanishi mumkin va u `user_id` va `role_id` ustunlarini o'z ichiga oladi. Ushbu jadval foydalanuvchilar va rollarni bog'laydigan oraliq jadval sifatida ishlatiladi.
+
+Esda tuting, rol ko'p foydalanuvchilarga tegishli bo'lishi mumkinligi sababli, biz oddiygina `roles` jadvaliga `user_id` ustunini joylashtira olmaymiz. Bu rol faqat bitta foydalanuvchiga tegishli bo'lishi mumkinligini anglatardi. Rollarning bir nechta foydalanuvchilarga tayinlanishini qo'llab-quvvatlash uchun `role_user` jadvali kerak. Biz bog'lanishning jadval tuzilishini quyidagicha umumlashtirishimiz mumkin:
+
+```
+users
+ id - integer
+ name - string
+
+roles
+ id - integer
+ name - string
+
+role_user
+ user_id - integer
+ role_id - integer
+```
+
+### Model tuzilmasi
+
+Biz `User` modelida `Roles` maydonini aniqlashimiz mumkin:
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Roles []*Role `gorm:"many2many:role_user"`
+}
+
+type Role struct {
+ orm.Model
+ Name string
+}
+```
+
+### Bog'lanishning teskari tomonini aniqlash
+
+Bog'lanishning teskari tomonini aniqlash uchun, shunchaki `Role` modelida `Users` maydonini aniqlang va Teg qo'shing.
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Roles []*Role `gorm:"many2many:role_user"`
+}
+
+type Role struct {
+ orm.Model
+ Name string
+ Users []*User `gorm:"many2many:role_user"`
+}
+```
+
+### Maxsus oraliq jadval
+
+Umuman olganda, oraliq jadval chet kaliti ota model nomining "ilon yurishi" bilan nomlanadi, siz ularni `joinForeignKey`, `joinReferences` orqali bekor qilishingiz mumkin:
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Roles []*Role `gorm:"many2many:role_user;joinForeignKey:UserName;joinReferences:RoleName"`
+}
+
+type Role struct {
+ orm.Model
+ Name string
+}
+```
+
+Jadval tuzilmasi:
+
+```
+users
+ id - integer
+ name - string
+
+roles
+ id - integer
+ name - string
+
+role_user
+ user_name - integer
+ role_name - integer
+```
+
+## Polimorfik
+
+Polimorfik bog'lanish bola modelga bitta bog'lanish yordamida bir nechta turdagi modellarga tegishli bo'lish imkonini beradi. Masalan, foydalanuvchilarga blog postlari va videolarni ulashishga imkon beruvchi ilova yaratayotganingizni tasavvur qiling. Bunday ilovada `Comment` modeli ham `Post`, ham `Video` modellariga tegishli bo'lishi mumkin.
+
+### Jadval tuzilmasi
+
+Polimorfik munosabat oddiy munosabatga o'xshaydi; biroq, bola model bitta bog'lanish yordamida bir nechta turdagi modellarga tegishli bo'lishi mumkin. Masalan, blog `Post` va `User` `Image` modeliga polimorfik munosabatda bo'lishi mumkin. Polimorfik munosabatdan foydalanish sizga postlar va foydalanuvchilar bilan bog'lanishi mumkin bo'lgan noyob rasmlarning bitta jadvaliga ega bo'lish imkonini beradi. Birinchidan, jadval tuzilishini ko'rib chiqamiz:
+
+```
+posts
+ id - integer
+ name - string
+
+videos
+ id - integer
+ name - string
+
+images
+ id - integer
+ url - string
+ imageable_id - integer
+ imageable_type - string
+
+comments
+ id - integer
+ body - text
+ commentable_id - integer
+ commentable_type - string
+```
+
+`images` jadvalidagi `imageable_id` va `imageable_type` ustunlariga e'tibor bering. `imageable_id` ustuni post yoki foydalanuvchining ID qiymatini o'z ichiga oladi, `imageable_type` ustuni esa ota modelning sinf nomini o'z ichiga oladi. `imageable_type` ustuni Orm tomonidan `imageable` bog'lanishiga murojaat qilganda qaytariladigan ota modelning "turi"ni aniqlash uchun ishlatiladi. `comments` jadvali ham shunga o'xshash.
+
+### Model tuzilmasi
+
+Keyin, bu bog'lanishni qurish uchun zarur bo'lgan model ta'riflarini ko'rib chiqamiz:
+
+```go
+type Post struct {
+ orm.Model
+ Name string
+ Image *Image `gorm:"polymorphic:Imageable"`
+ Comments []*Comment `gorm:"polymorphic:Commentable"`
+}
+
+type Video struct {
+ orm.Model
+ Name string
+ Image *Image `gorm:"polymorphic:Imageable"`
+ Comments []*Comment `gorm:"polymorphic:Commentable"`
+}
+
+type Image struct {
+ orm.Model
+ Name string
+ ImageableID uint
+ ImageableType string
+}
+
+type Comment struct {
+ orm.Model
+ Name string
+ CommentableID uint
+ CommentableType string
+}
+```
+
+Polimorfik qiymatni `polymorphicValue` tegi orqali o'zgartirishingiz mumkin, masalan:
+
+```go
+type Post struct {
+ orm.Model
+ Name string
+ Image *Image `gorm:"polymorphic:Imageable;polymorphicValue:master"`
+}
+```
+
+## Bog'lanishlarni so'rov qilish
+
+Misol uchun, `User` modeli ko'plab bog'langan `Post` modellariga ega bo'lgan blog ilovasi tasavvur qiling:
+
+```go
+type User struct {
+ orm.Model
+ Name string
+ Posts []*Post
+}
+
+type Post struct {
+ orm.Model
+ UserID uint
+ Name string
+}
+```
+
+### Bog'lanishlarni yaratish yoki yangilash
+
+Bog'lanishlarni yaratish va yangilashni boshqarish uchun `Select`, `Omit` metodlaridan foydalanishingiz mumkin. Bu ikki metodni bir vaqtning o'zida ishlatib bo'lmaydi va bog'lanishni boshqarish funksiyalari faqat `Create`, `Update`, `Save` uchun qo'llaniladi:
+
+```go
+user := models.User{Name: "user", Posts: []*models.Post{{Name: "post"}}}
+
+// User yaratish bilan birga barcha farzand bog'lanishlarini yaratish
+facades.Orm().Query().Select(orm.Associations).Create(&user)
+
+// User yaratishda faqat Post yaratish. Eslatma: Agar `orm.Associations` dan foydalanmasangiz, balki maxsus farzand bog'lanishlarini alohida sozlashingiz kerak bo'lsa, ota modeldagi barcha maydonlar ham ushbu vaqtda ro'yxatga olinishi kerak.
+facades.Orm().Query().Select("Name", "Posts").Create(&user)
+
+// User yaratishda Postni e'tiborsiz qoldirish, lekin boshqa barcha farzand bog'lanishlarini yaratish
+facades.Orm().Query().Omit("Posts").Create(&user)
+
+// User yaratishda Name maydonini e'tiborsiz qoldirish, lekin barcha farzand bog'lanishlarini yaratish
+facades.Orm().Query().Omit("Name").Create(&user)
+
+// User yaratishda Name maydoni va barcha farzand bog'lanishlarini e'tiborsiz qoldirish
+facades.Orm().Query().Omit("Name", orm.Associations).Create(&user)
+```
+
+### Bog'lanishlarni topish
+
+```go
+// Barcha mos keladigan bog'langan yozuvlarni topish
+var posts []models.Post
+facades.Orm().Query().Model(&user).Association("Posts").Find(&posts)
+
+// Shartlar bilan bog'lanishlarni topish
+facades.Orm().Query().Model(&user).Where("name = ?", "goravel").Order("id desc").Association("Posts").Find(&posts)
+```
+
+### Bog'lanishlarni qo'shish
+
+`Many To Many`, `One To Many` uchun yangi bog'lanishlarni qo'shing, `One To One`, `One To One(revers)` uchun joriy bog'lanishni almashtiring:
+
+```go
+facades.Orm().Query().Model(&user).Association("Posts").Append([]*models.Post{Post1, Post2})
+
+facades.Orm().Query().Model(&user).Association("Posts").Append(&models.Post{Name: "goravel"})
+```
+
+### Bog'lanishlarni almashtirish
+
+Joriy bog'lanishlarni yangilari bilan almashtirish:
+
+```go
+facades.Orm().Query().Model(&user).Association("Posts").Replace([]*models.Post{Post1, Post2})
+
+facades.Orm().Query().Model(&user).Association("Posts").Replace(models.Post{Name: "goravel"}, Post2)
+```
+
+### Bog'lanishlarni o'chirish
+
+Agar mavjud bo'lsa, manba va argumentlar o'rtasidagi bog'lanishni olib tashlang, faqat havolani o'chiring, ob'ektlarni DB dan o'chirmaydi, chet kalit NULL bo'lishi kerak:
+
+```go
+facades.Orm().Query().Model(&user).Association("Posts").Delete([]*models.Post{Post1, Post2})
+
+facades.Orm().Query().Model(&user).Association("Posts").Delete(Post1, Post2)
+```
+
+### Bog'lanishlarni tozalash
+
+Manba va bog'lanish o'rtasidagi barcha havolalarni olib tashlang, bog'lanishlarni o'chirmaydi:
+
+```go
+facades.Orm().Query().Model(&user).Association("Posts").Clear()
+```
+
+### Bog'lanishlarni sanash
+
+Joriy bog'lanishlar sonini qaytarish:
+
+```go
+facades.Orm().Query().Model(&user).Association("Posts").Count()
+
+// Shartlar bilan sanash
+facades.Orm().Query().Model(&user).Where("name = ?", "goravel").Association("Posts").Count()
+```
+
+### Paket ma'lumotlar
+
+```go
+// Barcha foydalanuvchilar uchun barcha rollarni topish
+facades.Orm().Query().Model(&users).Association("Posts").Find(&posts)
+
+// Barcha foydalanuvchilarning Postlaridan User A ni o'chirish
+facades.Orm().Query().Model(&users).Association("Posts").Delete(&userA)
+
+// Barcha foydalanuvchilarning Postlarining noyob sonini olish
+facades.Orm().Query().Model(&users).Association("Posts").Count()
+
+// `Append`, `Replace` uchun paket ma'lumotlari bilan, argumentlar uzunligi ma'lumotlar uzunligiga teng bo'lishi kerak, aks holda xatolik qaytariladi
+var users = []models.User{user1, user2, user3}
+
+// Bizda 3 ta foydalanuvchi bor, user1 jamoasiga userA ni qo'shing, user2 jamoasiga userB ni qo'shing, user3 jamoasiga userA, userB va userC ni qo'shing
+facades.Orm().Query().Model(&users).Association("Team").Append(&userA, &userB, &[]models.User{userA, userB, userC})
+
+// user1 jamoasini userA ga, user2 jamoasini userB ga, user3 jamoasini userA, userB va userC ga qayta o'rnating
+facades.Orm().Query().Model(&users).Association("Team").Replace(&userA, &userB, &[]models.User{userA, userB, userC})
+```
+
+## Oldindan yuklash
+
+Oldindan yuklash bir nechta modellarni so'rov qilish uchun qulaylik yaratadi va "N + 1" so'rov muammosini yengillashtiradi. N + 1 so'rov muammosini tasvirlash uchun, `Author` modeliga "tegishli" bo'lgan `Book` modelini ko'rib chiqing:
+
+```go
+type Author struct {
+ orm.Model
+ Name string
+}
+
+type Book struct {
+ orm.Model
+ AuthorID uint
+ Name string
+ Author *Author
+}
+```
+
+Endi, barcha kitoblarni va ularning mualliflarini olishimiz kerak:
+
+```go
+var books []models.Book
+facades.Orm().Query().Find(&books)
+
+for _, book := range books {
+ var author models.Author
+ facades.Orm().Query().Find(&author, book.AuthorID)
+}
+```
+
+Ma'lumotlar bazasi jadvalidagi barcha kitoblarni ularning mualliflari bilan birga olish uchun, tsikl kodi har bir kitob uchun so'rovni bajaradi. Bu 25 ta kitob to'plami uchun tsikl 26 ta so'rovni ishlatishini anglatadi - bittasi kitoblar to'plami uchun va yana 25 tasi har bir kitobning muallifini olish uchun.
+
+Biroq, biz bu jarayonni oldindan yuklash yordamida soddalashtirishimiz mumkin. `With` metodidan foydalanib, qaysi bog'lanishlar oldindan yuklanishi kerakligini belgilashimiz va so'rovlar sonini faqat ikkitaga qisqartirishimiz mumkin.
+
+```go
+var books []models.Book
+facades.Orm().Query().With("Muallif").Find(&books)
+
+for _, book := range books {
+ fmt.Println(book.Author)
+}
+```
+
+Ushbu amal uchun faqat ikkita so'rov bajariladi - barcha kitoblarni olish uchun bitta so'rov va barcha kitoblar uchun mualliflarni olish uchun bitta so'rov:
+
+```sql
+select * from `books`;
+
+select * from `authors` where `id` in (1, 2, 3, 4, 5, ...);
+```
+
+### Bir nechta bog'lanishlarni oldindan yuklash
+
+Ba'zida siz bir nechta turli bog'lanishlarni oldindan yuklashingiz kerak bo'lishi mumkin. Buning uchun, `With` metodini bir necha marta chaqiring:
+
+```go
+var book models.Book
+facades.Orm().Query().With("Author").With("Publisher").Find(&book)
+```
+
+### Ichki oldindan yuklash
+
+Bog'lanishning bog'lanishlarini oldindan yuklash uchun "nuqta" sintaksisidan foydalanishingiz mumkin. Misol uchun, kitobning barcha mualliflarini va muallifning barcha shaxsiy kontaktlarini oldindan yuklaymiz:
+
+```go
+var book models.Book
+facades.Orm().Query().With("Author.Contacts").Find(&book)
+```
+
+### Oldindan yuklashni cheklash
+
+Ba'zida siz bog'lanishni oldindan yuklamoqchi bo'lishingiz mumkin, lekin shu bilan birga oldindan yuklash so'rovi uchun qo'shimcha so'rov shartlarini belgilashingiz kerak bo'ladi. Buni quyidagicha amalga oshirishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/contracts/database/orm"
+
+var book models.Book
+facades.Orm().Query().With("Author", "name = ?", "author").Find(&book)
+
+facades.Orm().Query().With("Author", func(query orm.Query) orm.Query {
+ return query.Where("name = ?", "author")
+}).Find(&book)
+```
+
+Ushbu misolda, Orm faqat postning `name` ustuni `author` so'ziga teng bo'lgan postlarni oldindan yuklaydi.
+
+### Kechiktirilgan oldindan yuklash
+
+Ba'zida siz ota model allaqachon olingandan keyin bog'lanishni oldindan yuklashingiz kerak bo'lishi mumkin. Misol uchun, agar siz bog'langan modellarni yuklashni dinamik ravishda qaror qilishingiz kerak bo'lsa, bu foydali bo'lishi mumkin:
+
+```go
+var books []models.Book
+facades.Orm().Query().Find(&books)
+
+for _, book := range books {
+ if someCondition {
+ err := facades.Orm().Query().Load(&book, "Muallif")
+ }
+}
+```
+
+Agar siz oldindan yuklash so'roviga qo'shimcha so'rov cheklovlarini o'rnatishingiz kerak bo'lsa, quyidagi kodni ishlatishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/contracts/database/orm"
+
+var book models.Book
+facades.Orm().Query().Load(&book, "Author", "name = ?", "author").Find(&book)
+
+facades.Orm().Query().Load(&book, "Author", func(query orm.Query) orm.Query {
+ return query.Where("name = ?", "author")
+}).Find(&book)
+```
+
+Bog'lanish faqat u allaqachon yuklanmagan bo'lsa yuklash uchun `LoadMissing` metodidan foydalaning:
+
+```go
+facades.Orm().Query().LoadMissing(&book, "Muallif")
+```
diff --git a/uz_UZ/prologue/compare-with-laravel.md b/uz_UZ/prologue/compare-with-laravel.md
new file mode 100644
index 000000000..33b296e8d
--- /dev/null
+++ b/uz_UZ/prologue/compare-with-laravel.md
@@ -0,0 +1,40 @@
+# Laravel bilan solishtiring
+
+Goravel asosan Laravel frameworkidan ilhomlanib, Go dasturchilariga shunga o'xshash nafislik va soddalikni olib kelishni maqsad qiladi. Goravelning Laravel xususiyatlari bilan qanday mos kelishini tushunishingizga yordam berish uchun Goravel va Laravel o'rtasidagi ba'zi asosiy taqqoslashlar:
+
+| Xususiyat | Goravel | Laravel | Kod misoli |
+| ----------------------------------------------------------------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [Artisan Console](https://www.goravel.dev/digging-deeper/artisan-console.html) | ✅ | ✅ | ./artisan key:generate php artisan key:generate |
+| [Autentifikatsiya](https://www.goravel.dev/security/authentication.html) | ✅ | ✅ | facades.Auth(ctx).Login(&user) Auth::login($user) |
+| [Avtorizatsiya](https://www.goravel.dev/security/authorization.html) | ✅ | ✅ | facades.Gate().Allows("update", user) Gate::allows('update', $user) |
+| [Kesh](https://www.goravel.dev/digging-deeper/cache.html) | ✅ | ✅ | facades.Cache().Put("key", "value", time.Minute) Cache::put('key', 'value', 60) |
+| [Carbon](https://www.goravel.dev/digging-deeper/helpers.html) | ✅ | ✅ | carbon.Now().AddDays(1) Carbon::now()->addDays(1) |
+| [Konfiguratsiya](https://www.goravel.dev/getting-started/configuration.html) | ✅ | ✅ | facades.Config().GetString("app.name") config('app.name') |
+| [Kriptlash](https://www.goravel.dev/security/encryption.html) | ✅ | ✅ | facades.Crypt().EncryptString("text") Crypt::encryptString('text') |
+| [MB](https://www.goravel.dev/database/getting-started.html) | ✅ | ✅ | facades.DB().Table("users").Get(&users) DB::table('users')->get() |
+| [Hodisa](https://www.goravel.dev/digging-deeper/event.html) | ✅ | ✅ | facades.Event().Job(&events.Order{}).Dispatch() Order::dispatch() |
+| [Fabrika](https://www.goravel.dev/orm/factories.html) | ✅ | ✅ | facades.Orm().Factory().Make(&user) User::factory()->make() |
+| [Fayl Tizimi](https://www.goravel.dev/digging-deeper/filesystem.html) | ✅ | ✅ | facades.Storage().Put("file.txt", "content") Storage::put('file.txt', 'content') |
+| [Hashlash](https://www.goravel.dev/security/hashing.html) | ✅ | ✅ | facades.Hash().Make("password") Hash::make('password') |
+| [HTTP](https://www.goravel.dev/the-basics/routing.html) | ✅ | ✅ | facades.Route().Get("/", controller.Index) Route::get('/', [Controller::class, 'index']) |
+| [HTTP Klienti](https://www.goravel.dev/digging-deeper/http-client.html) | ✅ | ✅ | facades.Http().Get("https://api.com") Http::get('https://api.com') |
+| [Lokalizatsiya](https://www.goravel.dev/digging-deeper/localization.html) | ✅ | ✅ | facades.Lang(ctx).Get("messages.welcome") __('messages.welcome') |
+| [Log Yozuvchi](https://www.goravel.dev/the-basics/logging.html) | ✅ | ✅ | facades.Log().Info("message") Log::info('message') |
+| [Pochta](https://www.goravel.dev/digging-deeper/mail.html) | ✅ | ✅ | facades.Mail().To("user@example.com").Send() Mail::to('user@example.com')->send(new Order()) |
+| [Mocklash](https://www.goravel.dev/testing/mock.html) | ✅ | ✅ | |
+| [Migratsiya](https://www.goravel.dev/database/migrations.html) | ✅ | ✅ | ./artisan migrate php artisan migrate |
+| [ORM](https://www.goravel.dev/orm/getting-started.html) | ✅ | ✅ | facades.Orm().Query().Find(&user, 1) User::find(1) |
+| [Paketni Ishlab Chiqish](https://www.goravel.dev/digging-deeper/package-development.html) | ✅ | ✅ | |
+| [Jarayon](https://www.goravel.dev/digging-deeper/process.html) | ✅ | ✅ | facades.Process().Run("ls", "-la") \`Process::run('ls -la') |
+| [Navbat](https://www.goravel.dev/digging-deeper/queues.html) | ✅ | ✅ | facades.Queue().Job(&jobs.Process{}).Dispatch() Process::dispatch() |
+| [Tezlikni Cheklash](https://www.goravel.dev/digging-deeper/process.html) | ✅ | ✅ | facades.RateLimiter().For("global", ...) RateLimiter::for('global', ...) |
+| [Seeder](https://www.goravel.dev/database/seeding.html) | ✅ | ✅ | facades.Seeder().Call([]seeder.Seeder{&User{}}) $this->call([User::class]) |
+| [Sessiya](https://www.goravel.dev/the-basics/session.html) | ✅ | ✅ | ctx.Request().Session().Put("key", "value") session(['key' => 'value']) |
+| [Vazifa rejalashtirish](https://www.goravel.dev/digging-deeper/task-scheduling.html) | ✅ | ✅ | facades.Schedule().Command("emails:send").Daily() Schedule::command('emails:send')->daily() |
+| [Testlash](https://www.goravel.dev/testing/getting-started.html) | ✅ | ✅ | |
+| [Tekshirish](https://www.goravel.dev/the-basics/validation.html) | ✅ | ✅ | ctx.Request().ValidateRequest() $request->validate() |
+| [Koʻrish](https://www.goravel.dev/the-basics/views.html) | ✅ | ✅ | ctx.Response().View().Make("welcome.tmpl") view('welcome') |
+| [Grpc](https://www.goravel.dev/the-basics/grpc.html) | ✅ | 🚧 | |
+| Bildirishnomalar | 🚧 | ✅ | |
+| Efirga uzatish | 🚧 | ✅ | |
+| Livewire | 🚧 | ✅ | |
diff --git a/uz_UZ/prologue/contributions.md b/uz_UZ/prologue/contributions.md
new file mode 100644
index 000000000..7995ba4b9
--- /dev/null
+++ b/uz_UZ/prologue/contributions.md
@@ -0,0 +1,153 @@
+# Hissa qo‘shish bo‘yicha qo‘llanma
+
+[[toc]]
+
+Goravel turli isteʼdodlardan, masalan, kodlash, tarjima, maqola, o‘quv qo‘llanmalari va boshqalardan boy va xilma-xil hissalarni kutib oladi. Ikki xususiyatni (5 ta "Yaxshi birinchi muammo" == 1 ta "Xususiyat") bajarganingizdan so‘ng, siz asosiy hissa qo‘shuvchi sifatida tan olinasiz. Har uch oyda bitta xususiyatni bajarish orqali siz bu maqomni saqlab turishingiz mumkin.
+
+Keling, Goravelni birgalikda yanada samaraliroq qilaylik!
+
+## Mukofot
+
+- Asosiy ishlab chiquvchilar Goravel kelajakda foyda ko‘rganida imtiyozlarga ega bo‘lish huquqiga ega bo‘ladilar.
+- "Xususiyat"ni bajarganingizdan so‘ng, siz rasmiy Goravel futbolkasini olasiz, har bir asosiy versiya chiqarish tsikli uchun maksimal 1 ta. (Eslatma: Mamlakat farqi tufayli, siz bizga mos yetkazib beruvchini topishda yordam berishingiz kerak bo‘lishi mumkin.)
+
+
+
+## Xato haqida bildirish
+
+Siz Xato haqida bildirishni [bu yerda](https://github.com/goravel/goravel/issues/new?assignees=&labels=%E2%98%A2%EF%B8%8F+Bug%2Cbug&projects=&template=bug_report.yml&title=%F0%9F%90%9B+%5BBug%5D+) topshirishingiz mumkin, iltimos, yuborishdan oldin [Muammolar ro‘yxati](https://github.com/goravel/goravel/issues?q=is%3Aissue) bo‘yicha shunga o‘xshash savollarni qidiring. Hisobot sarlavha va muammoning aniq tavsifini, iloji boricha ko‘proq tegishli ma’lumotni va muammoni namoyish etuvchi kod namunasini o‘z ichiga olishi kerak. Xato haqida bildirishning maqsadi - sizga va boshqalarga xatoni qayta tiklash va tuzatishlar ishlab chiqishni osonlashtirishdir. Goravel ishtirokchilarni xatoni tuzatish uchun bir vaqtning o‘zida PR yaratishga rag‘batlantiradi, bu ochiq manbali loyihani faolroq rivojlantirishga xizmat qiladi.
+
+## Yordam savollari
+
+Goravelning GitHub muammo kuzatuvchilari Goravel yordami yoki qo‘llab-quvvatlashini ta’minlash uchun mo‘ljallanmagan. Buning o‘rniga quyidagi kanallardan birini ishlating:
+
+- [GitHub Muhokamalari](https://github.com/goravel/goravel/discussions)
+- [Discord](https://github.com/goravel/goravel/tree/master#group)
+- [WeChat](https://github.com/goravel/goravel/blob/master/README_zh.md#%E7%BE%A4%E7%BB%84)
+
+## Rivojlanish bo‘yicha muhokama
+
+Siz Goravel framework omborining [GitHub muhokama doskasida](https://github.com/goravel/goravel/discussions) mavjud Goravel xatti-harakatlari uchun yangi xususiyatlar yoki takomillashtirishlarni taklif qilishingiz mumkin. Xatolar, yangi xususiyatlar va mavjud xususiyatlarni amalga oshirish bo‘yicha norasmiy muhokamalar Discord yoki WeChat-da olib boriladi. Goravelning asoschisi Bowen odatda dushanbadan jumagacha soat 9:00 dan 18:00 gacha (UTC+08:00) guruhda bo‘ladi va boshqa vaqtlarda guruhda tasodifiy bo‘ladi.
+
+## Yangi Til Qo‘shish
+
+Goravel hujjatlariga yangi til qo‘shishga xush kelibsiz, siz `[Til] Tilini Qo‘shish` sarlavhasi va [Crowdin](https://crowdin.com/) hisobingiz bilan muammoni [goravel/goravel](https://github.com/goravel/goravel/issues/new) ga yuborishingiz mumkin. Biz sizni Crowdin loyihasiga taklif qilamiz.
+
+## Mavjud Tillarni O‘zgartirish
+
+Goravel hujjatlari i18n-ni qo‘llab-quvvatlaydi, faqat ingliz tilini PR orqali o‘zgartirish mumkin; boshqa tillar [Crowdin](https://crowdin.com/) orqali o‘zgartirilishi kerak. Siz `[Til] Tilini O‘zgartirish` sarlavhasi va [Crowdin](https://crowdin.com/) hisobingiz bilan muammoni [goravel/goravel](https://github.com/goravel/goravel/issues/new) ga yuborishingiz mumkin. Biz sizni Crowdin loyihasiga taklif qilamiz.
+
+## Hissa qo‘shish
+
+### Muammo Topish/Yaratish
+
+Siz [Muammolar ro‘yxati](https://github.com/goravel/goravel/issues) da muammo topishingiz yoki yaratishingiz mumkin, muammoni hal qilish istagingizni bildirish uchun xabar qoldiring, ombor asoschisi tomonidan tasdiqlangandan so‘ng, jarayonni boshlash mumkin.
+
+### PR Yaratish
+
+- Agar siz bu jarayonda yangi bo‘lsangiz, [ushbu maqolani](https://docs.github.com/en/get-started/quickstart/contributing-to-projects) tekshirishingiz mumkin;
+- Rivojlanish jarayonida, agar siz muammoga duch kelsangiz, kelajakdagi muloqot uchun har qanday vaqtda muammoni batafsil tasvirlashingiz mumkin, ammo bundan oldin, muammoni Google va boshqa usullar orqali iloji boricha hal qilishga harakat qilganingizga ishonch hosil qiling;
+- PR yaratishdan oldin, iloji boricha birlik test qamrovini yaxshilang, barqarorroq funktsiyalarni ta’minlash uchun;
+- Agar siz `contracts` papkasidagi har qanday faylni oʻzgartirsangiz, mock faylini yaratish uchun ildiz katalogida `go tool mockery` buyrugʻini ishga tushiring;
+- PR ishlab chiqilganda, iltimos, "Ko‘rib chiqishga tayyor" yorlig‘ini qo‘shing, asoschi uni o‘z vaqtida ko‘rib chiqadi.
+- PR birlashtirilgandan so‘ng, agar PR dagi tavsif to‘g‘ri o‘rnatilgan bo‘lsa, muammo avtomatik ravishda yopiladi;
+- Goravel sizning hissangizni juda qadrlaydi va sizni keyingi relizda asosiy hissa qo‘shuvchilar ro‘yxatiga qo‘shadi; ❤️
+
+## Qaysi Tarmoq?
+
+**Barcha** xato tuzatishlari xatolarni tuzatishni qo‘llab-quvvatlaydigan eng so‘nggi versiyaga yuborilishi kerak, agar ular faqat kelgusi relizda mavjud bo‘lgan xususiyatlarni tuzatmasa.
+
+**Yangi xususiyatlar** yoki buzilishli o‘zgarishlarga ega bo‘lgan xususiyatlar har doim "master" tarmog‘iga yuborilishi kerak.
+
+## Goravel Ombori
+
+| Ombor | Harakat |
+| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| [goravel/goravel](https://github.com/goravel/goravel) | Goravel ustalari |
+| [goravel/goravel-lite](https://github.com/goravel/goravel-lite) | Goravelning lite ustalari |
+| [goravel/framework](https://github.com/goravel/framework) | Goravel asosiy ombori |
+| [goravel/example](https://github.com/goravel/example) | Goravel namuna |
+| [goravel/example-proto](https://github.com/goravel/example-proto) | Namunaning proto bog‘liqligi |
+| [goravel/example-package](https://github.com/goravel/example-package) | Paket uchun namuna |
+| [goravel/installer](https://github.com/goravel/installer) | Goravel frameworkini oʻrnatishda yordam beradigan buyruq qatori vositasi |
+| [goravel/release](https://github.com/goravel/release) | Framework va paketlar versiyasini chiqarishning oddiy usulini taqdim etadi |
+| [goravel/docs](https://github.com/goravel/docs) | Hujjat |
+| [goravel/s3](https://github.com/goravel/s3) | Saqlash modulining S3 drayveri |
+| [goravel/oss](https://github.com/goravel/oss) | Saqlash modulining OSS drayveri |
+| [goravel/cos](https://github.com/goravel/cos) | Saqlash modulining COS drayveri |
+| [goravel/minio](https://github.com/goravel/minio) | Saqlash modulining Minio drayveri |
+| [goravel/redis](https://github.com/goravel/redis) | Kesh modulining Redis drayveri |
+| [goravel/gin](https://github.com/goravel/gin) | Marshrut modulining Gin drayveri |
+| [goravel/fiber](https://github.com/goravel/fiber) | Route modulining Fiber drayveri |
+| [goravel/postgres](https://github.com/goravel/postgres) | Database modulining Postgres drayveri |
+| [goravel/mysql](https://github.com/goravel/mysql) | Database modulining MySQL drayveri |
+| [goravel/sqlserver](https://github.com/goravel/sqlserver) | Database modulining SQLServer drayveri |
+| [goravel/sqlite](https://github.com/goravel/sqlite) | Database modulining SQLite drayveri |
+| [goravel/file-rotatelogs](https://github.com/goravel/file-rotatelogs) | Log moduli uchun jurnalni boʻlish funksionalligini taqdim etadi |
+| [goravel/.github](https://github.com/goravel/.github) | [Jamiyat sogʻligʻi fayli](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/creating-a-default-community-health-file) |
+
+## Xulq qoidalari
+
+Goravelning xulq qoidalari Laravelning xulq qoidalaridan olingan. Xulq qoidalarining har qanday buzilishi Bowen'ga xabar berilishi mumkin.
+
+- Ishtirokchilar qarama-qarshi qarashlarga bagʻrikeng boʻlishadi.
+- Ishtirokchilar oʻzlarining til va harakatlari shaxsiy hujumlar va shaxsiy haqoratlardan xoli ekanligiga ishonch hosil qilishlari kerak.
+- Boshqalarning soʻz va harakatlarini talqin qilishda, ishtirokchilar har doim yaxshi niyat bor deb hisoblashlari kerak.
+- Oqilona ravishda bezovtalik deb hisoblanishi mumkin boʻlgan xatti-harakatlarga yoʻl qoʻyilmaydi.
+
+
diff --git a/uz_UZ/prologue/privacy.md b/uz_UZ/prologue/privacy.md
new file mode 100644
index 000000000..5d0ab5b40
--- /dev/null
+++ b/uz_UZ/prologue/privacy.md
@@ -0,0 +1,32 @@
+# Maxfiylik siyosati
+
+## Ma'lumot to'plash
+
+Siz goravel.dev saytiga tashrif buyurganingizda, biz siz haqingizda ma'lum ma'lumotlarni to'playmiz. Bu ma'lumotlarga quyidagilar kiradi:
+
+- Veb-saytimizda tashrif buyurgan sahifalaringiz haqida ma'lumot
+- Ixtiyoriy ravishda taqdim etgan boshqa har qanday ma'lumot
+
+## Ma'lumotlardan foydalanish
+
+To'plangan ma'lumotlarni turli maqsadlarda, jumladan, quyidagilar uchun ishlatishimiz mumkin:
+
+- Veb-saytimizdagi tajribangizni shaxsiylashtirish
+- Veb-saytimiz va xizmatlarimizni takomillashtirish
+- So'rovingiz yoki iltimoslaringiz bo'yicha siz bilan bog'lanish
+
+## Ma'lumotlar xavfsizligi
+
+Biz ma'lumotlaringiz xavfsizligini jiddiy qabul qilamiz. Ma'lumotlaringizni ruxsatsiz kirish, oshkor qilish, o'zgartirish yoki yo'q qilishdan himoya qilish uchun tegishli texnik va tashkiliy choralarni amalga oshiramiz.
+
+## Uchinchi tomonlarga oshkor qilish
+
+Biz ma'lumotlaringizni veb-saytimizni boshqarishda yoki sizga xizmat ko'rsatishda bizga yordam beradigan ishonchli uchinchi tomonlar bilan baham ko'rishimiz mumkin. Ushbu uchinchi tomonlar ma'lumotlaringizni maxfiy va xavfsiz saqlash majburiyatini shartnoma asosida olgan.
+
+## Cookie-fayllar
+
+Veb-saytimiz sizning ko'rish tajribangizni yaxshilash uchun cookies-lardan foydalanishi mumkin. Cookies - bu qurilmangizda saqlanadigan va ma'lum funksiyalar va imkoniyatlarni ta'minlaydigan kichik fayllardir. Siz brauzer sozlamalaringizda cookies-larni o'chirib qo'yishni tanlashingiz mumkin, ammo e'tibor bering, veb-saytimizning ba'zi qismlari to'g'ri ishlamasligi mumkin.
+
+## Ushbu siyosatga o'zgartirishlar
+
+Biz ushbu Maxfiylik siyosatini vaqti-vaqti bilan yangilashimiz mumkin. Har qanday o'zgartirishlar ushbu sahifada joylashtiriladi va qayta ko'rib chiqilgan siyosat joylashtirilgandan so'ng darhol kuchga kiradi.
diff --git a/uz_UZ/prologue/releases.md b/uz_UZ/prologue/releases.md
new file mode 100644
index 000000000..4d0400cc2
--- /dev/null
+++ b/uz_UZ/prologue/releases.md
@@ -0,0 +1,17 @@
+# Chiqarish eslatmalari
+
+## Versiyalash sxemasi
+
+Goravel relizlari har yarim yilda bir marta (~Q1 va ~Q3) chiqariladi, patch relizlari esa har hafta chiqarilishi mumkin. Patch relizlari hech qachon buziluvchi o'zgartirishlarni o'z ichiga olmasligi kerak.
+
+## Qo'llab-quvvatlash siyosati
+
+Barcha Goravel relizlari uchun xatolar tuzatmalari 12 oy davomida taqdim etiladi.
+
+| Versiya | Golang | Reliz | Xatolar tuzatilguncha |
+| -------------------- | -------------------- | ----------------- | --------------------- |
+| 1.18 | 1.25 | 2026-yil 3-chorak | 2027-yil 3-chorak |
+| 1.17 | 1.24 | 3-fevral, 2026 | 3-fevral, 2027 |
+| 1.16 | 1.23 | 20-iyul, 2025 | 20-iyul, 2026 |
+| 1.15 | 1.22 | 31-dekabr, 2024 | 31-dekabr, 2025 |
+| 1.14 | 1.21 | 8-iyun, 2024 | 8-iyun, 2025 |
diff --git a/uz_UZ/security/authentication.md b/uz_UZ/security/authentication.md
new file mode 100644
index 000000000..0137e326b
--- /dev/null
+++ b/uz_UZ/security/authentication.md
@@ -0,0 +1,177 @@
+# Autentifikatsiya
+
+[[toc]]
+
+## Kirish
+
+Autentifikatsiya veb-ilovalarda ajralmas xususiyatdir. Goravelning `facades.Auth()` moduli JWT va Session drayverlarini qo‘llab-quvvatlaydi va siz drayver va foydalanuvchi provayderini sozlashingiz mumkin.
+
+## Konfiguratsiya
+
+Ilovada turli foydalanuvchi identifikatorlarini almashtirish uchun `config/auth.go` faylida `defaults` guard va bir nechta `guards` ni sozlashingiz mumkin.
+
+JWT parametrlarini, masalan, `secret`, `ttl`, `refresh_ttl` ni `config/jwt.go` faylida sozlashingiz mumkin.
+
+### Har xil JWT Guard har xil konfiguratsiyalarni qo‘llab-quvvatlaydi
+
+Har bir Guard uchun TTL, Secret va RefreshTTL ni alohida `config/auth.go` faylida sozlashingiz mumkin. Agar sozlanmagan bo‘lsa, ushbu uchta konfiguratsiya standart sifatida `config/jwt.go` fayli tomonidan ishlatiladi.
+
+```go
+// config/auth.go
+"guards": map[string]any{
+ "user": map[string]any{
+ "driver": "jwt",
+++ "ttl": 60,
+++ "refresh_ttl": 0,
+++ "secret": "your-secret",
+ },
+},
+```
+
+## JWT Token Yaratish
+
+```shell
+./artisan jwt:secret
+```
+
+## Foydalanuvchi Yordamida Token Yaratish
+
+Model orqali token yaratishingiz mumkin. Agar model `orm.Model` dan foydalansa, qo‘shimcha sozlash talab qilinmaydi, aks holda modelning asosiy kalit maydonida Tag ni sozlashingiz kerak, masalan:
+
+```go
+type User struct {
+ ID uint `gorm:"primaryKey"`
+ Name string
+}
+
+var user models.User
+user.ID = 1
+
+token, err := facades.Auth(ctx).Login(&user)
+```
+
+## ID Yordamida Token Yaratish
+
+```go
+token, err := facades.Auth(ctx).LoginUsingID(1)
+```
+
+## Tokenni Tahlil Qilish
+
+```go
+payload, err := facades.Auth(ctx).Parse(token)
+```
+
+`payload` orqali quyidagilarni olishingiz mumkin:
+
+1. `Guard`: Joriy Guard;
+2. `Key`: Foydalanuvchi belgisi;
+3. `ExpireAt`: Muddati tugash vaqti;
+4. `IssuedAt`: Berilgan vaqt;
+
+> Agar `err` `ErrorTokenExpired` dan boshqa bo‘lsa va nolga teng bo‘lmasa, payload nolga teng bo‘lishi kerak.
+
+Tokenni muddati o‘tganligini err orqali aniqlashingiz mumkin:
+
+```go
+"errors"
+"github.com/goravel/framework/auth"
+
+errors.Is(err, auth.ErrorTokenExpired)
+```
+
+> Token Bearer prefiksi bilan yoki undan holi normal tahlil qilinishi mumkin.
+
+## Foydalanuvchini Olish
+
+Foydalanuvchini olishdan oldin `Parse` orqali Token yaratishingiz kerak, bu jarayon HTTP middleware orqali boshqarilishi mumkin.
+
+```go
+var user models.User
+err := facades.Auth(ctx).User(&user) // Ko‘rsatkich bo‘lishi kerak
+id, err := facades.Auth(ctx).ID()
+```
+
+## Tokenni Yangilash
+
+Foydalanuvchini yangilashdan oldin `Parse` orqali Token yaratishingiz kerak.
+
+```go
+token, err := facades.Auth(ctx).Refresh()
+```
+
+## Chiqish
+
+```go
+err := facades.Auth(ctx).Logout()
+```
+
+## Bir Nechta Guardlar
+
+```go
+token, err := facades.Auth(ctx).Guard("admin").LoginUsingID(1)
+err := facades.Auth(ctx).Guard("admin").Parse(token)
+token, err := facades.Auth(ctx).Guard("admin").User(&user)
+```
+
+> Standart guard ishlatilmaganda, yuqoridagi metodlarni chaqirishdan oldin `Guard` metodini chaqirish shart.
+
+## Maxsus Drayver
+
+### Maxsus Guard Qo‘shish
+
+O‘zingizning autentifikatsiya guard drayveringizni aniqlash uchun `facades.Auth().Extend()` metodidan foydalanishingiz mumkin, bu metod `AuthServiceProvider` ning `Boot` metodida chaqirilishi mumkin.
+
+```go
+import "github.com/goravel/framework/contracts/auth"
+
+func (receiver *AuthServiceProvider) Boot(app foundation.Application) {
+ facades.Auth().Extend("custom-driver", func(ctx http.Context, name string, userProvider auth.UserProvider) (auth.GuardDriver, error) {
+ return &CustomGuard{}, nil
+ })
+}
+```
+
+Maxsus guardni aniqlaganingizdan so‘ng, uni `auth.go` faylining `guards` konfiguratsiyasida ko‘rsatishingiz mumkin:
+
+```go
+"guards": map[string]any{
+ "api": map[string]any{
+ "driver": "custom-driver",
+ "provider": "users",
+ },
+},
+```
+
+### Maxsus UserProvider Qo‘shish
+
+O‘zingizning foydalanuvchi provayderingizni aniqlash uchun `facades.Auth().Provider()` metodidan foydalanishingiz mumkin, bu metod ham `AuthServiceProvider` ning `Boot` metodida chaqirilishi mumkin.
+
+```go
+import "github.com/goravel/framework/contracts/auth"
+
+facades.Auth().Provider("custom-provider", func(ctx http.Context) (auth.UserProvider, error) {
+ return &UserProvider{}, nil
+})
+```
+
+`Provider` metodi yordamida provayder ro‘yxatdan o‘tkazilgandan so‘ng, `auth.go` konfiguratsiya faylida maxsus foydalanuvchi provayderidan foydalanishingiz mumkin. Birinchidan, yangi drayverdan foydalanadigan `provider` ni aniqlang:
+
+```go
+"providers": map[string]any{
+ "users": map[string]any{
+ "driver": "custom-provider",
+ },
+},
+```
+
+Nihoyat, ushbu provayderga `guards` konfiguratsiyasida murojaat qilishingiz mumkin:
+
+```go
+"guards": map[string]any{
+ "api": map[string]any{
+ "driver": "custom-provider",
+ "provider": "users",
+ },
+},
+```
diff --git a/uz_UZ/security/authorization.md b/uz_UZ/security/authorization.md
new file mode 100644
index 000000000..5b84e30b0
--- /dev/null
+++ b/uz_UZ/security/authorization.md
@@ -0,0 +1,196 @@
+# Avtorizatsiya
+
+[[toc]]
+
+## Kirish
+
+Goravel foydalanuvchilarning resurslar ustidagi amallarini boshqarish uchun o‘rnatilgan [autentifikatsiya](./authentication.md) xizmatlari va oson foydalaniladigan avtorizatsiya xususiyatini taklif etadi. Foydalanuvchi autentifikatsiyadan o‘tgan bo‘lsa ham, u ma’lum Eloquent modellarini yoki ma’lumotlar bazasi yozuvlarini o‘zgartirish yoki o‘chirish huquqiga ega bo‘lmasligi mumkin. Goravelning avtorizatsiya xususiyati bu avtorizatsiya tekshiruvlarini tizimli boshqarish usulini taqdim etadi.
+
+Goravelda amallarni avtorizatsiya qilishning ikkita usuli mavjud: [darvoza](#Gates) va [siyosatlar](#Policies). Darvoza va siyosatlarni marshrut va kontrollerlarga o‘xshash deb tasavvur qiling. Darvozalar yopilishlar asosida bo‘lib, oddiy avtorizatsiya yondashuvini taqdim etadi, siyosatlar esa kontrollerlarga o‘xshab, ma’lum bir resurs atrofidagi mantiqni guruhlaydi. Ushbu hujjat avval darvozalarni, keyin esa siyosatlarni batafsil yoritadi.
+
+Ilova yaratishda faqat darvoza yoki faqat siyosatlardan foydalanish shart emas. Ko‘pgina ilovalar ikkalasining kombinatsiyasidan foydalanadi va bu mutlaqo qabul qilinadi!
+
+## Darvozalar
+
+### Darvozalarni yozish
+
+Darvozalar foydalanuvchi ma’lum bir amalni bajarishga ruxsat berilganligini tekshiruvchi yopilishlar vazifasini bajaradi. Ular odatda Gate fasadidan foydalanib, `bootstrap/app.go::WithCallback` funksiyasida o‘rnatiladi.
+
+Bu holatda, biz foydalanuvchi ma’lum bir Post modelini o‘zgartirishga ruxsat berilganligini tekshirish uchun darvoza o‘rnatamiz, buning uchun uning ID sini post muallifining user_id si bilan solishtiramiz.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.Gate().Define("update-post",
+ func(ctx context.Context, arguments map[string]any) contractsaccess.Response {
+ user := ctx.Value("user").(models.User)
+ post := arguments["post"].(models.Post)
+
+ if user.ID == post.UserID {
+ return access.NewAllowResponse()
+ } else {
+ return access.NewDenyResponse("error")
+ }
+ },
+ )
+ }).
+ Create()
+}
+```
+
+### Amallarni avtorizatsiya qilish
+
+Darvozalar yordamida amalni avtorizatsiya qilish uchun Gate fasadining `Allows` yoki `Denies` metodlaridan foydalanish kerak:
+
+```go
+package controllers
+
+import (
+ "goravel/app/facades"
+)
+
+type UserController struct {
+
+func (r *UserController) Show(ctx http.Context) http.Response {
+ var post models.Post
+ if facades.Gate().Allows("update-post", map[string]any{
+ "post": post,
+ }) {
+
+ }
+}
+```
+
+`Any` yoki `None` metodlaridan foydalanib, bir vaqtning o‘zida bir nechta amallarni avtorizatsiya qilishingiz mumkin.
+
+```go
+if facades.Gate().Any([]string{"update-post", "delete-post"}, map[string]any{
+ "post": post,
+}) {
+ // Foydalanuvchi postni yangilashi yoki o‘chirishi mumkin...
+}
+
+if facades.Gate().None([]string{"update-post", "delete-post"}, map[string]any{
+ "post": post,
+}) {
+ // Foydalanuvchi postni yangilay olmaydi yoki o‘chirolmaydi...
+}
+```
+
+### Darvoza javoblari
+
+`Allows` metodi mantiqiy qiymat qaytaradi. To‘liq avtorizatsiya javobini olish uchun `Inspect` metodidan foydalaning.
+
+```go
+response := facades.Gate().Inspect("edit-settings", nil);
+
+if response.Allowed() {
+ // Amalga ruxsat berilgan...
+} else {
+ fmt.Println(response.Message())
+}
+```
+
+### Darvoza tekshiruvlarini to‘sib qo‘yish
+
+Ba’zan, ma’lum bir foydalanuvchiga barcha imkoniyatlarni berishni xohlashingiz mumkin. Boshqa barcha avtorizatsiya tekshiruvlaridan oldin ishlaydigan `Before` metodidan foydalanib, yopilish aniqlashingiz mumkin:
+
+```go
+facades.Gate().Before(func(ctx context.Context, ability string, arguments map[string]any) contractsaccess.Response {
+ user := ctx.Value("user").(models.User)
+ if isAdministrator(user) {
+ return access.NewAllowResponse()
+ }
+
+ return nil
+})
+```
+
+Agar `Before` yopilishi nolga teng bo‘lmagan natija qaytarsa, bu natija avtorizatsiya tekshiruvining natijasi deb hisoblanadi.
+
+`After` metodi boshqa barcha avtorizatsiya tekshiruvlari bajarilgandan keyin ijro etiladigan yopilishni aniqlash uchun ishlatilishi mumkin.
+
+```go
+facades.Gate().After(func(ctx context.Context, ability string, arguments map[string]any, result contractsaccess.Response) contractsaccess.Response {
+ user := ctx.Value("user").(models.User)
+ if isAdministrator(user) {
+ return access.NewAllowResponse()
+ }
+
+ return nil
+})
+```
+
+> Eslatma: `After` ning qaytarish natijasi faqat `facades.Gate().Define` nol qaytarganda qo‘llaniladi.
+
+### Kontekstni kiritish
+
+`context` `Before`, `After` va `Define` metodlariga uzatiladi.
+
+```go
+facades.Gate().WithContext(ctx).Allows("update-post", map[string]any{
+ "post": post,
+})
+```
+
+## Siyosatlar
+
+### Siyosatlarni yaratish
+
+Siyosat yaratish uchun `make:policy` Artisan buyrug‘idan foydalanishingiz mumkin. Yaratilgan siyosat `app/policies` katalogiga saqlanadi. Agar bu katalog ilovangizda mavjud bo‘lmasa, Goravel uni siz uchun yaratadi.
+
+```shell
+./artisan make:policy PostPolicy
+./artisan make:policy user/PostPolicy
+```
+
+### Siyosatlarni yozish
+
+Keling, `PostPolicy` da `User` `Post` ni yangilashi mumkinligini tekshirish uchun `Update` metodini aniqlaymiz.
+
+```go
+package policies
+
+import (
+ "context"
+ "goravel/app/models"
+
+ "github.com/goravel/framework/auth/access"
+ contractsaccess "github.com/goravel/framework/contracts/auth/access"
+)
+
+type PostPolicy struct {
+}
+
+func NewPostPolicy() *PostPolicy {
+ return &PostPolicy{}
+}
+
+func (r *PostPolicy) Update(ctx context.Context, arguments map[string]any) contractsaccess.Response {
+ user := ctx.Value("user").(models.User)
+ post := arguments["post"].(models.Post)
+
+ if user.ID == post.UserID {
+ return access.NewAllowResponse()
+ } else {
+ return access.NewDenyResponse("You do not own this post.")
+ }
+}
+```
+
+Keyin siyosatni `bootstrap/app.go::WithCallback` funksiyasiga ro‘yxatdan o‘tkazishimiz mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.Gate().Define("update-post", policies.NewPostPolicy().Update)
+ }).
+ Create()
+}
+```
+
+Turli amallarni avtorizatsiya qilish jarayonida siyosatingizga ko‘proq metodlar qo‘shishingiz mumkin. Masalan, turli modelga oid amallarni avtorizatsiya qilish uchun `View` yoki `Delete` metodlarini yaratishingiz mumkin. Siyosat metodlaringizni o‘zingiz xohlagancha nomlang.
diff --git a/uz_UZ/security/encryption.md b/uz_UZ/security/encryption.md
new file mode 100644
index 000000000..fd1a9b2ea
--- /dev/null
+++ b/uz_UZ/security/encryption.md
@@ -0,0 +1,29 @@
+# Shifrlash
+
+[[toc]]
+
+## Kirish
+
+Goravelning shifrlash xizmatlari OpenSSL yordamida AES-256 shifrlash orqali matnni shifrlash va ochish uchun oddiy, qulay interfeysni taqdim etadi. Goravelning barcha shifrlangan qiymatlari xabar autentifikatsiya kodi (GMAC) yordamida imzolangan, shuning uchun ularning asosiy qiymati shifrlanganidan keyin o‘zgartirilishi yoki buzilishi mumkin emas.
+
+## Konfiguratsiya
+
+Goravel shifrlovchisidan foydalanishdan oldin, `config/app.go` konfiguratsiya faylida `key` konfiguratsiya parametrini o‘rnatishingiz kerak. Bu parametr `APP_KEY` muhit o‘zgaruvchisi tomonidan boshqariladi. Ushbu o‘zgaruvchining qiymatini yaratish uchun `./artisan key:generate` buyrug‘idan foydalaning, chunki `key:generate` buyrug‘i ilovangiz uchun xavfsiz kriptografik kalit yaratishda Golangning xavfsiz tasodifiy baytlar generatoridan foydalanadi.
+
+## Shifrlovchidan Foydalanish
+
+### Qiymatni Shifrlash
+
+Qiymatni shifrlash uchun `facades.Crypt()` dagi `EncryptString` usulidan foydalanishingiz mumkin. Bu usul qiymatlarni OpenSSL va AES-256-GCM shifri yordamida shifrlaydi. Bundan tashqari, barcha shifrlangan qiymatlar ma'lumotlarni buzishga urinayotgan zararli foydalanuvchilar tomonidan ochilishining oldini olish uchun xabar autentifikatsiya kodi (GMAC) bilan imzolanadi.
+
+```go
+secret, err := facades.Crypt().EncryptString("goravel")
+```
+
+### Qiymatni Ochish
+
+Qiymatlarni ochish uchun `facades.Crypt()` dan `DecryptString` usulidan foydalanishingiz mumkin. Agar qiymat to‘g‘ri ochilmasa, masalan, xabar autentifikatsiya kodi noto‘g‘ri bo‘lsa, xato qaytariladi.
+
+```go
+str, err := facades.Crypt().DecryptString(secret)
+```
diff --git a/uz_UZ/security/hashing.md b/uz_UZ/security/hashing.md
new file mode 100644
index 000000000..f22bd7e40
--- /dev/null
+++ b/uz_UZ/security/hashing.md
@@ -0,0 +1,41 @@
+# Xeshlash
+
+[[toc]]
+
+## Kirish
+
+Goravel `facades.Hash()` foydalanuvchi parollarini saqlash uchun xavfsiz Argon2id va Bcrypt xeshlashni taqdim etadi. Agar siz Goravel ilova boshlangʻich toʻplamlaridan birini ishlatayotgan boʻlsangiz, sukut boʻyicha roʻyxatdan oʻtish va autentifikatsiya uchun Argon2id ishlatiladi.
+
+## Konfiguratsiya
+
+Ilovangiz uchun sukut boʻyicha xeshlash haydovchisi ilovangizning `config/hashing.go` konfiguratsiya faylida sozlanadi. Hozirda bir nechta qoʻllab-quvvatlanadigan haydovchilar mavjud: Argon2id va Bcrypt.
+
+## Asosiy foydalanish
+
+### Parollarni xeshlash
+
+Siz `facades.Hash()` da `Make` metodini chaqirib parolni xeshlashingiz mumkin:
+
+```go
+password, err := facades.Hash().Make(password)
+```
+
+### Parol Xeshga Mos Kelishini Tekshirish
+
+Hash fasad tomonidan taqdim etilgan `Check` metodi berilgan oddiy matnli satr berilgan xeshga mos kelishini tekshirish imkonini beradi:
+
+```go
+if facades.Hash().Check('plain-text', hashedPassword) {
+ // Parollar mos keladi...
+}
+```
+
+### Parolni Qayta Xeshlash Kerakligini Aniqlash
+
+Hash fasad tomonidan taqdim etilgan `NeedsRehash` metodi parol xeshlanganidan beri xesher tomonidan ishlatilgan ish omili oʻzgarganligini aniqlash imkonini beradi. Baʼzi ilovalar ushbu tekshiruvni ilovaning autentifikatsiya jarayoni davomida bajarishni tanlaydi:
+
+```go
+if facades.Hash().NeedsRehash(hashed) {
+ hashed = facades.Hash().Make('plain-text');
+}
+```
diff --git a/uz_UZ/testing/getting-started.md b/uz_UZ/testing/getting-started.md
new file mode 100644
index 000000000..0271a05e6
--- /dev/null
+++ b/uz_UZ/testing/getting-started.md
@@ -0,0 +1,295 @@
+# Boshlash
+
+[[toc]]
+
+## Kirish
+
+Goravelning testlash funksiyasi Golangning rasmiy test komponentiga tayanadi, birlik testlarini kengaytirib, integratsion testlarni qo‘llab-quvvatlaydi va ilova mustahkamligini oshiradi.
+
+## Muhit
+
+### Maxsus Muhit Fayli
+
+Standart bo‘yicha, testlash paytida konfiguratsiya ma’lumotlarini kiritish uchun ildiz katalogidagi `.env` fayli ishlatiladi. Agar turli paketlar uchun turli `.env` fayllaridan foydalanmoqchi bo‘lsangiz, paket katalogida `.env` faylini yaratishingiz mumkin va test avval bu faylni o‘qiydi.
+
+```
+- /app
+- /config
+- ...
+- /test
+ - /feature
+ - .env
+ - user_test.go
+- .env
+```
+
+Bundan tashqari, loyihangizning ildizida `.env.testing` faylini yaratishingiz mumkin. Bu fayl `go test` buyrug‘ini `--env` opsiyasi bilan ishga tushirganda `.env` fayli o‘rniga ishlatiladi, eslatma, bu opsiya test katalogini kuzatishi kerak, masalan:
+
+```shell
+go test ./... --env=.env.testing
+go test ./... -e=.env.testing
+```
+
+### `TestCase` Strukturasi
+
+Goravelda `TestCase` Strukturasi mavjud va bu Struktura kelajakda qulay test usullarini taqdim etadi, bundan tashqari, bir xil faylda `init` usuli mavjud, bu usul testni ishga tushirishdan oldin Goravel ilovasini ro‘yxatdan o‘tkazishni yo‘naltiradi. Siz testdan oldin bajarilishi kerak bo‘lgan har qanday zarur mantiqni ushbu usulga kiritishingiz mumkin.
+
+## Testlarni Yaratish
+
+Yangi test holatini yaratish uchun `make:test` Artisan buyrug‘idan foydalaning:
+
+```shell
+./artisan make:test feature/UserTest
+```
+
+Bizning test holatlarimiz standart bo‘yicha [stretchr/testify](https://github.com/stretchr/testify) paketining `suite` funksiyasidan foydalanib yozilgan. Bu funksiya bizga testdan oldingi, testdan keyingi, kichik test va tasdiqlash kabi narsalarni sozlash imkonini beradi, bu esa yaxshi tashkil etilgan test holatlariga olib keladi. Qo‘shimcha ma’lumot uchun iltimos, rasmiy hujjatlarga murojaat qiling.
+
+```go
+package feature
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "goravel/tests"
+)
+
+type ExampleTestSuite struct {
+ suite.Suite
+ tests.TestCase
+}
+
+func TestExampleTestSuite(t *testing.T) {
+ suite.Run(t, new(ExampleTestSuite))
+}
+
+// SetupTest will run before each test in the suite.
+func (s *ExampleTestSuite) SetupTest() {
+}
+
+// TearDownTest will run after each test in the suite.
+func (s *ExampleTestSuite) TearDownTest() {
+}
+
+func (s *ExampleTestSuite) TestIndex() {
+ s.True(true)
+}
+```
+
+## Ma'lumotlar Bazasi Testi
+
+Goravel model zavodlari va Seeders ilova modeli uchun test ma'lumotlar bazasi yozuvlarini osonlik bilan yaratishi mumkin.
+
+### Zavodlar
+
+Agar siz testlar o‘tkazayotgan bo‘lsangiz, testni ishga tushirishdan oldin ma'lumotlar bazangizga ba’zi yozuvlar qo‘shish kerak bo‘lishi mumkin. Test ma’lumotlarini yaratish uchun har bir ustunning qiymatlarini qo‘lda kiritishingiz shart emas. Goravel bilan siz [zavodlar](../orm/factories.md) orqali modellaringiz uchun standart atributlarni o‘rnatishingiz mumkin.
+
+```go
+var user models.User
+err := facades.Orm().Factory().Create(&user)
+```
+
+### Seederlarni Ishga Tushirish
+
+Agar xususiyat testi davomida ma'lumotlar bazangizni to‘ldirish uchun [ma'lumotlar bazasi seeders](../database/seeding.md) dan foydalanmoqchi bo‘lsangiz, `Seed` usulini chaqirishingiz mumkin. Standart bo‘yicha, `Seed` usuli `DatabaseSeeder` ni bajaradi, bu esa boshqa barcha seederlaringizni bajarishi kerak. Yoki, `Seed` usuliga aniq bir seeder strukturasini o‘tkazishingiz mumkin:
+
+```go
+package feature
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "goravel/database/seeders"
+ "goravel/tests"
+)
+
+type ExampleTestSuite struct {
+ suite.Suite
+ tests.TestCase
+}
+
+func TestExampleTestSuite(t *testing.T) {
+ suite.Run(t, new(ExampleTestSuite))
+}
+
+// SetupTest will run before each test in the suite.
+func (s *ExampleTestSuite) SetupTest() {
+}
+
+// TearDownTest will run after each test in the suite.
+func (s *ExampleTestSuite) TearDownTest() {
+}
+
+func (s *ExampleTestSuite) TestIndex() {
+ // Run the DatabaseSeeder...
+ s.Seed()
+
+ // Run multiple specific seeders...
+ s.Seed(&seeders.UserSeeder{}, &seeders.PhotoSeeder{})
+}
+```
+
+### Docker-dan Foydalanish
+
+`go test` dan foydalanganda, bir nechta paketlar parallel ravishda testlanadi. Natijada, mahalliy ma'lumotlar bazasi yoki keshdagi test holatida ma'lumotlar bazasi yoki keshlarni yangilash boshqa parallel test holatlariga ta’sir qilishi mumkin. Buni hal qilish uchun Goravel Docker asosidagi testlarni taklif qiladi. Docker bilan, ma'lumotlar bazasi yoki keshlash tasviri yaratilishi va turli paketlar orasida mustaqil ravishda ishlatilishi mumkin.
+
+> Windows tizimi uchun Docker tasvirining cheklangan qo‘llab-quvvatlanishi tufayli, hozirda Docker testi faqat Windows bo‘lmagan muhitlarda ishga tushirilishi mumkin.
+
+#### Docker-ni Ishlatish
+
+Siz tasvir yaratish uchun `Database` yoki `Cache` usulidan foydalanishingiz mumkin yoki ushbu usulga ulanish nomini o‘tkazishingiz mumkin:
+
+```go
+database, err := facades.Testing().Docker().Database()
+database, err := facades.Testing().Docker().Database("postgres")
+
+cache, err := facades.Testing().Docker().Cache()
+cache, err := facades.Testing().Docker().Cache("redis")
+```
+
+Shuningdek, siz tasvirni sozlash uchun `Image` usulidan foydalanishingiz mumkin:
+
+```go
+import contractstesting "github.com/goravel/framework/contracts/testing"
+
+image, err := facades.Testing().Docker().Image(contractstesting.Image{
+ Repository: "mysql",
+ Tag: "5.7",
+ Env: []string{
+ "MYSQL_ROOT_PASSWORD=123123",
+ "MYSQL_DATABASE=goravel",
+ },
+ ExposedPorts: []string{"3306"},
+})
+```
+
+#### Tasvirni Yaratish
+
+Tasvir ishga tushirilgandan so‘ng, tasvirni yaratish uchun `Build` usulidan foydalanishingiz mumkin:
+
+```go
+err := database.Build()
+err := cache.Build()
+```
+
+Bu vaqtda siz `docker ps` buyrug‘i yordamida tasvir tizimda allaqachon ishlayotganini ko‘rishingiz mumkin va `Config` usuli orqali ma'lumotlar bazasining konfiguratsiya ma’lumotlarini olishingiz mumkin, bu ulanishni sozlashni osonlashtiradi:
+
+```go
+config := database.Config()
+config := cache.Config()
+```
+
+#### Seederlarni Ishga Tushirish
+
+Agar testlash davomida ma'lumotlar bazasini to‘ldirish uchun [seeder](../database/seeding.md) dan foydalanmoqchi bo‘lsangiz, `Seed` usulini chaqirishingiz mumkin. Standart bo‘yicha, `Seed` usuli `DatabaseSeeder` ni bajaradi, bu esa boshqa barcha seederlaringizni bajarishi kerak. Yoki, `Seed` usuliga aniq bir seeder strukturasini o‘tkazishingiz mumkin:
+
+```go
+err := database.Seed()
+err := database.Seed(&seeders.UserSeeder{})
+```
+
+#### Ma'lumotlar Bazasi yoki Keshlashni Yangilash
+
+Bir xil paketdagi test holatlari ketma-ket bajarilganligi sababli, bitta test holati ishlagandan keyin ma'lumotlar bazasi yoki keshlashni yangilash salbiy ta’sir ko‘rsatmaydi, biz `Fresh` usulidan foydalanishimiz mumkin:
+
+```go
+err := database.Fresh()
+err := cache.Fresh()
+```
+
+Ma'lumotlar bazasi uchun, shuningdek, `RefreshDatabase` usulidan foydalanishingiz mumkin:
+
+```go
+package feature
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "goravel/tests"
+)
+
+type ExampleTestSuite struct {
+ suite.Suite
+ tests.TestCase
+}
+
+func TestExampleTestSuite(t *testing.T) {
+ suite.Run(t, new(ExampleTestSuite))
+}
+
+// SetupTest will run before each test in the suite.
+func (s *ExampleTestSuite) SetupTest() {
+ s.RefreshDatabase()
+}
+
+// TearDownTest will run after each test in the suite.
+func (s *ExampleTestSuite) TearDownTest() {
+}
+
+func (s *ExampleTestSuite) TestIndex() {
+}
+```
+
+#### Tasvirni O‘chirish
+
+Kichik paketdagi test holatlari bajarilgandan so‘ng, tasvir bir soat ichida avtomatik ravishda o‘chiriladi, shuningdek, tasvirni qo‘lda o‘chirish uchun `Shutdown` usulidan foydalanishingiz mumkin.
+
+```go
+err := database.Shutdown()
+```
+
+#### Misol
+
+Biz kichik paketda `TestMain` usulini yaratishimiz va test holatining oldingi mantiqini qo‘shishimiz mumkin:
+
+```go
+// tests/feature/main_test.go
+package feature
+
+import (
+ "fmt"
+ "os"
+ "testing"
+
+ "goravel/app/facades"
+ "goravel/database/seeders"
+)
+
+func TestMain(m *testing.M) {
+ database, err := facades.Testing().Docker().Database()
+ if err != nil {
+ panic(err)
+ }
+
+ if err := database.Build(); err != nil {
+ panic(err)
+ }
+ if err := database.Ready(); err != nil {
+ panic(err)
+ }
+ if err := database.Migrate(); err != nil {
+ panic(err)
+ }
+
+ if err := facades.App().Restart(); err != nil {
+ panic(err)
+ }
+
+ // Execute test cases
+ exit := m.Run()
+
+ // Uninstall the image after all test cases have been run
+ if err := database.Shutdown(); err != nil {
+ panic(err)
+ }
+
+ os.Exit(exit)
+}
+```
+
+> TestMain usulining ko‘proq qo‘llanilishi uchun [Rasmiy Hujjat](https://pkg.go.dev/testing#hdr-Main) ga qarang.
diff --git a/uz_UZ/testing/http-tests.md b/uz_UZ/testing/http-tests.md
new file mode 100644
index 000000000..19656fae2
--- /dev/null
+++ b/uz_UZ/testing/http-tests.md
@@ -0,0 +1,588 @@
+# HTTP Testlari
+
+[[toc]]
+
+## Kirish
+
+Veb-ilovalarni yaratishda, siz tez-tez HTTP so'rovlaringiz boshidan oxirigacha to'g'ri ishlayotganligini sinab ko'rishingiz kerak bo'ladi. Goravelning test vositalari buni oddiy qiladi - siz murakkab test muhitlarini sozlashsiz so'rovlarni simulyatsiya qilishingiz va javoblarni tekshirishingiz mumkin.
+
+## So'rovlar berish
+
+Goravel-da HTTP nuqtalarini test qilish oddiy naqshdan foydalanadi. O'zingizning `TestCase` dan `Http` usuli bilan boshlang, u tasdiqlashlar uchun `*testing.T` parametrini talab qiladi. Bu sizga `Get`, `Post` va `Put` kabi barcha umumiy HTTP fe'llarini boshqaradigan so'rov ob'ektini (`framework/contracts/testing.TestRequest`) beradi.
+
+Haqiqiy HTTP chaqiruvlarini amalga oshirish o'rniga, bu usullar ilovangizning so'rov tsikli ichki simulyatsiyasini amalga oshiradi. Har bir so'rov natijalarni tekshirish uchun usullarga ega bo'lgan javob ob'ektini (`framework/contracts/testing.TestResponse`) qaytaradi.
+
+Bu yerda oddiy misol:
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).Get("/users/1")
+ s.Nil(err)
+ response.AssertStatus(200)
+}
+```
+
+### So'rov sarlavhalarini sozlash
+
+So'rov sarlavhalarini sozlash uchun bitta sarlavha uchun `WithHeader` yoki bir nechta sarlavhalar uchun `WithHeaders` dan foydalanishingiz mumkin:
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ // Bitta sarlavha
+ response, err := s.Http(s.T()).WithHeader("X-Custom-Header", "Value").Get("/users/1")
+
+ // Bir nechta sarlavhalar
+ response, err := s.Http(s.T()).WithHeaders(map[string]string{
+ "X-Custom-Header": "Value",
+ "Accept": "application/json",
+ }).Get("/users/1")
+}
+```
+
+### Cookie
+
+So'rov berishdan oldin cookie qiymatlarini o'rnatish uchun `WithCookie` yoki `WithCookies` usulidan foydalanishingiz mumkin.
+
+```go
+import "github.com/goravel/framework/testing/http"
+
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).WithCookie(http.Cookie("name", "krishan")).Get("/users/1")
+
+ // yoki bir nechta Cookie lar uchun WithCookies dan foydalaning
+ response, err := s.Http(s.T()).WithCookies(http.Cookies(map[string]string{
+ "name": "krishan",
+ "lang": "en",
+ })).Get("/users/1")
+}
+```
+
+### WithSession
+
+Ma'lumotlarni sessiyaga `WithSession` usuli yordamida o'rnatishingiz mumkin:
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")
+}
+```
+
+### Javoblarni tuzatish
+
+So'rov berilgandan so'ng, so'rovdan qaytarilgan ma'lumotlarni tekshirish uchun `Session`, `Headers`, `Content`, `Cookies` yoki `Json` usulidan foydalanishingiz mumkin.
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")
+
+ content, err := response.Content()
+
+ cookies := response.Cookies()
+
+ headers := response.Headers()
+
+ json, err := response.Json() // javob tanasi json (map[string]any) sifatida tahlil qilinadi
+
+ session, err := response.Session() // joriy so'rov sessiyasida saqlangan barcha qiymatlarni qaytaradi
+}
+```
+
+## Tana qurish
+
+`Post`, `Put`, `Delete` va hokazo usullar uchun. Goravel `io.Reader` ni ikkinchi argument sifatida qabul qiladi. Yuklamalarni qurishni soddalashtirish uchun tizim so'rov tanalarini qurish uchun foydali usullarni taqdim etadi.
+
+```go
+import "github.com/goravel/framework/support/http"
+
+func (s *ExampleTestSuite) TestIndex() {
+ builder := http.NewBody().SetField("name", "krishan")
+
+ body, err := builder.Build()
+
+ response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", body)
+}
+```
+
+## JSON API larini test qilish
+
+Goravel JSON API javoblarini samarali test qilish uchun bir nechta yordamchilarni taqdim etadi. U javob tanasini Go `map[string]any` ga o'tkazishga harakat qiladi. Agar o'tkazish muvaffaqiyatsiz bo'lsa, bog'liq tasdiqlar ham muvaffaqiyatsiz bo'ladi.
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
+ s.Nil(err)
+
+ response.AssertStatus(201).
+ AssertJson(map[string]any{
+ "created": true,
+ })
+}
+```
+
+O'tkazilgan JSON ga to'g'ridan-to'g'ri kirish uchun `TestResponse` dagi `Json` usulidan foydalaning. Bu sizga javob tanasining alohida elementlarini tekshirish imkonini beradi.
+
+```go
+json, err := response.Json()
+s.Nil(err)
+s.True(json["created"])
+```
+
+:::tip
+`AssertJson` usuli javobda qo'shimcha maydonlar bo'lsa ham, javobda ko'rsatilgan barcha qiymatlar mavjudligini tekshiradi. `AssertExactJson` dan foydalanmaguningizcha, u aniq mos kelishni talab qilmaydi.
+:::
+
+### Aniq JSON mosliklarini tasdiqlash
+
+Agar javobingiz kutilgan JSON bilan aniq mos kelishini (qo'shimcha yoki etishmayotgan maydonlarsiz) tekshirish kerak bo'lsa, `AssertExactJson` usulidan foydalaning.
+
+```go
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
+ s.Nil(err)
+
+ response.AssertStatus(201).
+ AssertExactJson(map[string]any{
+ "created": true,
+ })
+}
+```
+
+### Oqimli JSON test qilish
+
+Goravel JSON javoblarida oqimli tasdiqlarni amalga oshirishni osonlashtiradi. `AssertFluentJson` usulidan foydalangan holda, siz `framework/contracts/testing.AssertableJSON` ning namunasi bilan ta'minlaydigan yopilishni o'tkazishingiz mumkin. Bu namun sizga so'rovingiz tomonidan qaytarilgan JSON javobidagi aniq qiymatlar yoki shartlarni tekshirish imkonini beradi.
+
+Masalan, JSON javobida ma'lum bir qiymat mavjudligini tasdiqlash uchun `Where` usulidan, va atribut mavjud emasligiga ishonch hosil qilish uchun `Missing` usulidan foydalanishingiz mumkin.
+
+```go
+import contractstesting "github.com/goravel/framework/contracts/testing"
+
+func (s *ExampleTestSuite) TestIndex() {
+ response, err := s.Http(s.T()).Get("/users/1")
+ s.Nil(err)
+
+ response.AssertStatus(201).
+ AssertFluentJson(func (json contractstesting.AssertableJSON) {
+ json.Where("id", float64(1)).
+ Where("name", "bowen").
+ WhereNot("lang", "en").
+ Missing("password")
+ })
+}
+```
+
+### Atribut mavjudligi / yo'qligini tasdiqlash
+
+Agar atribut mavjud yoki yo'qligini tekshirishni istasangiz, Goravel buni `Has` va `Missing` usullari bilan soddalashtiradi.
+
+```go
+response.AssertStatus(201).
+ AssertFluentJson(func (json contractstesting.AssertableJSON) {
+ json.Has("username").
+ Missing("password")
+ })
+```
+
+Shuningdek, bir vaqtning o'zida bir nechta atributlarning mavjudligi yoki yo'qligini `HasAll` va `MissingAll` yordamida tasdiqlashingiz mumkin.
+
+```go
+response.AssertStatus(201).
+ AssertFluentJson(func (json contractstesting.AssertableJSON) {
+ json.Has([]string{"username", "email"}).
+ MissingAll([]string{"verified", "password"})
+ })
+```
+
+Agar sizga ro'yxatdan kamida bitta atributning mavjudligini tekshirish kerak bo'lsa, `HasAny` usulidan foydalaning.
+
+```go
+response.AssertStatus(201).
+ AssertFluentJson(func (json contractstesting.AssertableJSON) {
+ json.HasAny([]string{"username", "email"})
+ })
+```
+
+### JSON kollektsiyasi tasdiqlarini qamrab olish
+
+Javobda nomlangan kalit ostida ob'ektlar to'plami mavjud bo'lsa, uning tuzilishi va tarkibini tasdiqlash uchun turli usullardan foydalanishingiz mumkin.
+
+```go
+type Item struct {
+ ID int `json:"id"`
+}
+
+facades.Route().Get("/", func(ctx http.Context) http.Response {
+ items := []Item{
+ {ID: 1},
+ {ID: 2},
+ }
+ return ctx.Response().Json(200, map[string]{
+ "items": items,
+ })
+}
+```
+
+Kolleksiyadagi elementlar sonini tekshirish uchun `Count` usulidan foydalanishingiz mumkin. Birinchi elementning xususiyatlarini tasdiqlash uchun `AssertableJson` namunasi bilan ta'minlaydigan `First` usulidan foydalaning. Xuddi shunday, `Each` usuli sizga barcha elementlar ustida aylanish va ularning xususiyatlarini alohida tasdiqlash imkonini beradi. Boshqa tomondan, `HasWithScope` usuli `First` va `Count` funksionalligini birlashtiradi, bu sizga birinchi elementni va uning tarkibini tasdiqlash imkonini beradi, shu bilan birga qamrovli tasdiqlar uchun `AssertableJson` namunasi bilan ta'minlaydi.
+
+```go
+// Count va First
+response.AssertStatus(200).
+ AssertFluentJson(func(json contractstesting.AssertableJSON) {
+ json.Count("items", 2).
+ First("items", func(json contractstesting.AssertableJSON) {
+ json.Where("id", 1)
+ })
+ })
+
+// Each
+response.AssertStatus(200).
+ AssertFluentJson(func(json contractstesting.AssertableJSON) {
+ json.Count("items", 2).
+ Each("items", func(json contractstesting.AssertableJSON) {
+ json.Has("id")
+ })
+ })
+
+// HasWithScope
+response.AssertStatus(200).
+ AssertFluentJson(func(json contractstesting.AssertableJSON) {
+ json.HasWithScope("items", 2, func(json contractstesting.AssertableJSON) {
+ json.Where("id", 1)
+ })
+ })
+```
+
+## Mavjud tasdiqlar
+
+### Javob tasdiqlari
+
+| | | |
+| ------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- |
+| [AssertAccepted](#assertaccepted) | [AssertBadRequest](#assertbadrequest) | [AssertConflict](#assertconflict) |
+| [AssertCookie](#assertcookie) | [AssertCookieExpired](#assertcookieexpired) | [AssertCookieMissing](#assertcookiemissing) |
+| [AssertCookieNotExpired](#assertcookienotexpired) | [AssertCreated](#assertcreated) | [AssertDontSee](#assertdontsee) |
+| [AssertExactJson](#assertexactjson) | [AssertFluentJson](#assertfluentjson) | [AssertForbidden](#assertforbidden) |
+| [AssertFound](#assertfound) | [AssertGone](#assertgone) | [AssertHeader](#assertheader) |
+| [AssertHeaderMissing](#assertheadermissing) | [AssertInternalServerError](#assertinternalservererror) | [AssertJson](#assertjson) |
+| [AssertJsonMissing](#assertjsonmissing) | [AssertMethodNotAllowed](#assertmethodnotallowed) | [AssertMovedPermanently](#assertmovedpermanently) |
+| [AssertNoContent](#assertnocontent) | [AssertNotAcceptable](#assertnotacceptable) | [AssertNotFound](#assertnotfound) |
+| [AssertNotModified](#assertnotmodified) | [AssertOk](#assertok) | [AssertPartialContent](#assertpartialcontent) |
+| [AssertPaymentRequired](#assertpaymentrequired) | [AssertRequestTimeout](#assertrequesttimeout) | [AssertSee](#assertsee) |
+| [AssertSeeInOrder](#assertseeinorder) | [AssertServerError](#assertservererror) | [AssertServiceUnavailable](#assertserviceunavailable) |
+| [AssertStatus](#assertstatus) | [AssertSuccessful](#assertsuccessful) | [AssertTemporaryRedirect](#asserttemporaryredirect) |
+| [AssertTooManyRequests](#asserttoomanyrequests) | [AssertUnauthorized](#assertunauthorized) | [AssertUnprocessableEntity](#assertunprocessableentity) |
+
+### AssertAccepted
+
+Javobning `202 Qabul qilindi` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertAccepted()
+```
+
+### AssertBadRequest
+
+Javobning `400 Noto‘g‘ri so‘rov` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertBadRequest()
+```
+
+### AssertConflict
+
+Javobning `409 Ziddiyat` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertConflict()
+```
+
+### AssertCookie
+
+Javobda belgilangan nom va qiymatga ega cookie borligini tasdiqlaydi:
+
+```go
+response.AssertCookie("name", "value")
+```
+
+### AssertCookieExpired
+
+Belgilangan cookie muddati o‘tganligini tasdiqlaydi:
+
+```go
+response.AssertCookieExpired("name")
+```
+
+### AssertCookieMissing
+
+Javobda belgilangan nomga ega cookie yo‘qligini tasdiqlaydi:
+
+```go
+response.AssertCookieMissing("name")
+```
+
+### AssertCookieNotExpired
+
+Belgilangan cookie muddati o‘tmaganligini tasdiqlaydi:
+
+```go
+response.AssertCookieNotExpired("name")
+```
+
+### AssertCreated
+
+Javobning `201 Yaratildi` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertCreated()
+```
+
+### AssertDontSee
+
+Javobda belgilangan qiymatlar yo‘qligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) qiymatlardagi maxsus belgilarni tekshirishdan oldin ekranlash kerakligini aniqlaydi. Agar ko‘rsatilmagan bo‘lsa, standart holatda true ga o‘rnatiladi.
+
+```go
+response.AssertDontSee([]string{"
"}, false) // Maxsus belgilarni ekranlamang
+```
+
+### AssertExactJson
+
+Javob JSONi taqdim etilgan `map[string]any` bilan aniq mos kelishini tasdiqlaydi:
+
+```go
+response.AssertExactJson(map[string]any{"created": true})
+```
+
+### AssertFluentJson
+
+Javob JSONini oqim interfeysi yordamida tasdiqlaydi:
+
+```go
+import contractstesting "github.com/goravel/framework/contracts/testing"
+
+response.AssertFluentJson(func(json contractstesting.AssertableJSON) {
+ json.Where("created", true)
+})
+```
+
+### AssertForbidden
+
+Javobning `403 Taqiqlangan` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertForbidden()
+```
+
+### AssertFound
+
+Javobning `302 Topildi` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertFound()
+```
+
+### AssertGone
+
+Javobning `410 Yo‘qolgan` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertGone()
+```
+
+### AssertHeader
+
+Javobda belgilangan sarlavha berilgan qiymat bilan borligini tasdiqlaydi:
+
+```go
+response.AssertHeader("Content-Type", "application/json")
+```
+
+### AssertHeaderMissing
+
+Javobda belgilangan sarlavha yo‘qligini tasdiqlaydi:
+
+```go
+response.AssertHeaderMissing("X-Custom-Header")
+```
+
+### AssertInternalServerError
+
+Javobning `500 Ichki server` xatosi HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertInternalServerError()
+```
+
+### AssertJson
+
+Javob JSONida taqdim etilgan fragment borligini tasdiqlaydi:
+
+```go
+response.AssertJson(map[string]any{"created": true})
+```
+
+### AssertJsonMissing
+
+Javob JSONida belgilangan kalitlar yoki qiymatlar yo'qligini tasdiqlaydi:
+
+```go
+response.AssertJsonMissing(map[string]any{"created": false})
+```
+
+### AssertMethodNotAllowed
+
+Javobning `405 Method Not Allowed` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertMethodNotAllowed()
+```
+
+### AssertMovedPermanently
+
+Javobning `301 Moved Permanently` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertMovedPermanently()
+```
+
+### AssertNoContent
+
+Javobning `204 No Content` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertNoContent()
+```
+
+### AssertNotAcceptable
+
+Javobning `406 Not Acceptable` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertNotAcceptable()
+```
+
+### AssertNotFound
+
+Javobning `404 Not Found` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertNotFound()
+```
+
+### AssertNotModified
+
+Javobning `304 Not Modified` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertNotModified()
+```
+
+### AssertOk
+
+Javobning `200 OK` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertOk()
+```
+
+### AssertPartialContent
+
+Javobning `206 Partial Content` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertPartialContent()
+```
+
+### AssertPaymentRequired
+
+Javobning `402 Payment Required` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertPaymentRequired()
+```
+
+### AssertRequestTimeout
+
+Javobning `408 Request Timeout` HTTP holat kodiga ega ekanligini tasdiqlaydi:
+
+```go
+response.AssertRequestTimeout()
+```
+
+### AssertSee
+
+Javobda belgilangan qiymatlar mavjudligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) tekshirishdan oldin qiymatlardagi maxsus belgilarni ekranlash kerakligini aniqlaydi. Agar ko'rsatilmagan bo'lsa, standart holatda `true` ga o'rnatiladi.
+
+```go
+response.AssertSee([]string{"
"}).Return(mockMail)
+ mockMail.On("Send").Return(nil)
+
+ assert.Nil(t, Mail())
+
+ mockMail.AssertExpectations(t)
+}
+```
+
+## Mock facades.Orm
+
+```go
+import "github.com/goravel/framework/testing/mock"
+
+func Orm() error {
+ if err := facades.Orm().Query().Create(&Test{}); err != nil {
+ return err
+ }
+
+ var test Test
+ return facades.Orm().Query().Where("id = ?", 1).Find(&test)
+}
+
+func TestOrm(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockOrm := mockFactory.Orm()
+ mockOrmQuery := mockFactory.OrmQuery()
+ mockOrm.On("Query").Return(mockOrmQuery)
+
+ mockOrmQuery.On("Create", mock.Anything).Return(nil).Once()
+ mockOrmQuery.On("Where", "id = ?", 1).Return(mockOrmDB).Once()
+ mockOrmQuery.On("Find", mock.Anything).Return(nil).Once()
+
+ assert.Nil(t, Orm())
+
+ mockOrm.AssertExpectations(t)
+ mockOrmQuery.AssertExpectations(t)
+}
+
+func Transaction() error {
+ return facades.Orm().Transaction(func(tx contractorm.Transaction) error {
+ var test Test
+ if err := tx.Create(&test); err != nil {
+ return err
+ }
+
+ var test1 Test
+ return tx.Where("id = ?", test.ID).Find(&test1)
+ })
+}
+
+func TestTransaction(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockOrm := mockFactory.Orm()
+ mockOrmTransaction := mockFactory.OrmTransaction()
+ mockOrm.On("Transaction", mock.Anything).Return(func(txFunc func(tx orm.Transaction) error) error {
+ return txFunc(mockOrmTransaction)
+ })
+
+ var test Test
+ mockOrmTransaction.On("Create", &test).Return(func(test2 interface{}) error {
+ test2.(*Test).ID = 1
+
+ return nil
+ }).Once()
+ mockOrmTransaction.On("Where", "id = ?", uint(1)).Return(mockOrmTransaction).Once()
+ mockOrmTransaction.On("Find", mock.Anything).Return(nil).Once()
+
+ assert.Nil(t, Transaction())
+
+ mockOrm.AssertExpectations(t)
+ mockOrmTransaction.AssertExpectations(t)
+}
+
+func Begin() error {
+ tx, _ := facades.Orm().Query().Begin()
+ user := models.User{Name: "Goravel"}
+ if err := tx.Create(&user); err != nil {
+ return tx.Rollback()
+ } else {
+ return tx.Commit()
+ }
+}
+```
+
+## Mock facades.Queue
+
+```go
+import "github.com/goravel/framework/testing/mock"
+
+func Queue() error {
+ return facades.Queue().Job(&jobs.TestSyncJob{}, []queue.Arg{}).Dispatch()
+}
+
+func TestQueue(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockQueue := mockFactory.Queue()
+ mockTask := mockFactory.QueueTask()
+ mockQueue.On("Job", mock.Anything, mock.Anything).Return(mockTask).Once()
+ mockTask.On("Dispatch").Return(nil).Once()
+
+ assert.Nil(t, Queue())
+
+ mockQueue.AssertExpectations(t)
+ mockTask.AssertExpectations(t)
+}
+```
+
+## Mock facades.Storage
+
+```go
+import (
+ "context"
+ "testing"
+
+ "github.com/goravel/framework/filesystem"
+ "github.com/goravel/framework/testing/mock"
+
+ "goravel/app/facades"
+)
+
+func Storage() (string, error) {
+ file, _ := filesystem.NewFile("1.txt")
+
+ return facades.Storage().WithContext(context.Background()).PutFile("file", file)
+}
+
+func TestStorage(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockStorage := mockFactory.Storage()
+ mockDriver := mockFactory.StorageDriver()
+ mockStorage.On("WithContext", context.Background()).Return(mockDriver).Once()
+ file, _ := filesystem.NewFile("1.txt")
+ mockDriver.On("PutFile", "file", file).Return("", nil).Once()
+ path, err := Storage()
+
+ assert.Equal(t, "", path)
+ assert.Nil(t, err)
+
+ mockStorage.AssertExpectations(t)
+ mockDriver.AssertExpectations(t)
+}
+
+```
+
+## Mock facades.Validation
+
+```go
+import (
+ "testing"
+
+ "github.com/goravel/framework/testing/mock"
+ "github.com/stretchr/testify/assert"
+
+ "goravel/app/facades"
+)
+
+func Validation() string {
+ validator, _ := facades.Validation().Make(map[string]string{
+ "a": "b",
+ }, map[string]string{
+ "a": "required",
+ })
+ errors := validator.Errors()
+
+ return errors.One("a")
+}
+
+func TestValidation(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockValidation := mockFactory.Validation()
+ mockValidator := mockFactory.ValidationValidator()
+ mockErrors := mockFactory.ValidationErrors()
+ mockValidation.On("Make", map[string]string{
+ "a": "b",
+ }, map[string]string{
+ "a": "required",
+ }).Return(mockValidator, nil).Once()
+ mockValidator.On("Errors").Return(mockErrors).Once()
+ mockErrors.On("One", "a").Return("error").Once()
+ err := Validation()
+
+ assert.Equal(t, "error", err)
+
+ mockValidation.AssertExpectations(t)
+ mockValidator.AssertExpectations(t)
+ mockErrors.AssertExpectations(t)
+}
+```
+
+## Mock facades.View
+
+```go
+import (
+ "testing"
+
+ "github.com/goravel/framework/testing/mock"
+ "github.com/stretchr/testify/assert"
+
+ "goravel/app/facades"
+)
+
+func View() bool {
+ return facades.View().Exists("welcome.tmpl")
+}
+
+func TestView(t *testing.T) {
+ mockFactory := mock.Factory()
+ mockView := mockFactory.View()
+ mockView.On("Exists", "welcome.tmpl").Return(true).Once()
+
+ assert.True(t, View())
+
+ mockView.AssertExpectations(t)
+}
+```
diff --git a/uz_UZ/the-basics/controllers.md b/uz_UZ/the-basics/controllers.md
new file mode 100644
index 000000000..2f2d94315
--- /dev/null
+++ b/uz_UZ/the-basics/controllers.md
@@ -0,0 +1,84 @@
+# Kontrollerlar
+
+[[toc]]
+
+## Kirish
+
+Alohida marshrutda barcha so‘rovni qayta ishlash mantiqini yopish (closure) shaklida belgilash o‘rniga, birlashtirish uchun kontrollerdan foydalanish mumkin. Kontrollerlar `app/http/controllers` katalogida saqlanadi.
+
+## Kontrollerlarni belgilash
+
+Quyida oddiy kontrollerning namunasi keltirilgan:
+
+```go
+package controllers
+
+import (
+ "github.com/goravel/framework/contracts/http"
+
+ "goravel/app/facades"
+)
+
+type UserController struct {
+ // Dependent services
+}
+
+func NewUserController() *UserController {
+ return &UserController{
+ // Inject services
+ }
+}
+
+func (r *UserController) Show(ctx http.Context) http.Response {
+ return ctx.Response().Success().Json(http.Json{
+ "Hello": "Goravel",
+ })
+}
+```
+
+Marshrut belgilash:
+
+```go
+package routes
+
+import (
+ "goravel/app/facades"
+ "goravel/app/http/controllers"
+)
+
+func Api() {
+ userController := controllers.NewUserController()
+ facades.Route().Get("/{id}", userController.Show)
+}
+```
+
+### Kontroller yaratish
+
+```shell
+./artisan make:controller UserController
+./artisan make:controller user/UserController
+```
+
+## Resurs kontrollerlari
+
+Agar ilovangizdagi har bir Eloquent modelini "resurs" deb hisoblasangiz, ilovangizdagi har bir resursga nisbatan bir xil harakatlar to‘plamini bajarish odatiy holdir. Misol uchun, ilovangizda `Photo` modeli va `Movie` modeli bor deb tasavvur qiling. Foydalanuvchilar ushbu resurslarni yaratishi, o‘qishi, yangilashi yoki o‘chirishi mumkin.
+
+Ushbu umumiy foydalanish holati tufayli, Goravel resurs marshrutlash odatiy yaratish, o‘qish, yangilash va o‘chirish ("CRUD") marshrutlarini bitta kod satri bilan kontrollerga tayinlaydi. Boshlash uchun, biz ushbu harakatlarni boshqarish uchun tezda kontroller yaratish uchun `make:controller` Artisan buyrug‘ining `--resource` opsiyasidan foydalanishimiz mumkin:
+
+```shell
+./artisan make:controller --resource PhotoController
+```
+
+Ushbu buyruq `app/http/controllers/photo_controller.go` faylida kontroller yaratadi. Kontrollerda mavjud bo‘lgan har bir resurs operatsiyasi uchun usul bo‘ladi. Keyin, siz kontrollerga yo‘naltirilgan resurs marshrutini ro‘yxatdan o‘tkazishingiz mumkin:
+
+```go
+facades.Route().Resource("photos", controllers.NewPhotoController())
+```
+
+| Fe’l | URI | Harakat |
+| --------- | ----------------- | ---------- |
+| GET | `/photos` | Indeks |
+| POST | `/photos` | Saqlash |
+| GET | `/photos/{photo}` | Ko‘rsatish |
+| PUT/PATCH | `/photos/{photo}` | Yangilash |
+| DELETE | `/photos/{photo}` | O‘chirish |
diff --git a/uz_UZ/the-basics/grpc.md b/uz_UZ/the-basics/grpc.md
new file mode 100644
index 000000000..fd5609e59
--- /dev/null
+++ b/uz_UZ/the-basics/grpc.md
@@ -0,0 +1,388 @@
+# Grpc
+
+[[toc]]
+
+## Kirish
+
+Grpc moduli `facades.Grpc()` orqali boshqarilishi mumkin. Goravel gRPC xizmatlarini yaratish va ulardan foydalanishning nafis usulini taqdim etadi, ham server, ham mijoz tomonlarini qo'llab-quvvatlaydi.
+
+## Konfiguratsiya
+
+`config/grpc.go` faylida Grpc modulini sozlashingiz mumkin, bu yerda `grpc.host` server domen nomini, `grpc.servers` esa mijoz ulanadigan serverlarni sozlaydi.
+
+## Kontrollerlar
+
+Kontrollerlar `app/grpc/controllers` katalogida aniqlanishi mumkin.
+
+```go
+// app/grpc/controllers/user_controller.go
+package controllers
+
+import (
+ "context"
+ "net/http"
+
+ proto "github.com/goravel/example-proto"
+)
+
+type UserController struct {}
+
+func NewUserController() *UserController {
+ return &UserController{}
+}
+
+func (r *UserController) GetUser(ctx context.Context, req *proto.UserRequest) (*proto.UserResponse, error) {
+ return &proto.UserResponse{
+ Code: http.StatusOK,
+ Data: &proto.User{
+ Id: 1,
+ Name: "Goravel",
+ Token: req.GetToken(),
+ },
+ }, nil
+}
+```
+
+## Marshrutlashni aniqlash
+
+Barcha marshrutlash fayllari `routes` katalogida, masalan `routes/grpc.go` kabi aniqlanishi mumkin.
+
+```go
+// routes/grpc.go
+package routes
+
+import (
+ proto "github.com/goravel/example-proto"
+
+ "goravel/app/facades"
+ "goravel/app/grpc/controllers"
+)
+
+func Grpc() {
+ proto.RegisterUserServiceServer(facades.Grpc().Server(), controllers.NewUserController())
+}
+```
+
+### Marshrutlashni ro'yxatdan o'tkazish
+
+Marshrutlash aniqlangandan so'ng, uni `bootstrap/app.go::WithRouting` funksiyasida ro'yxatdan o'tkazing.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithRouting(func() {
+ routes.Grpc()
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Interceptor
+
+Interceptorlar gRPC so'rovlari va javoblarini to'xtatish va o'zgartirish imkoniyatini beradi. Ular jurnalga yozish, autentifikatsiya, metrikalar va boshqalar uchun ishlatilishi mumkin.
+
+### Interceptorlarni aniqlash
+
+Interceptorlar `app/grpc/interceptors` papkasida aniqlanishi mumkin.
+
+**Server Interceptor misoli:**
+
+```go
+// app/grpc/interceptors/test_server.go
+package interceptors
+
+import (
+ "context"
+
+ "google.golang.org/grpc"
+)
+
+func TestServer(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
+ // So'rov boshqarilishidan oldin mantiqingizni qo'shing
+ // Masalan: jurnalga yozish, autentifikatsiya va hokazo.
+
+ return handler(ctx, req)
+}
+```
+
+**Mijoz Interceptor misoli:**
+
+```go
+// app/grpc/interceptors/test_client.go
+package interceptors
+
+import (
+ "context"
+
+ "google.golang.org/grpc"
+)
+
+func TestClient(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
+ // So'rov yuborilishidan oldin mantiqingizni qo'shing
+ // Masalan: jurnalga yozish, metadata qo'shish va hokazo.
+
+ return invoker(ctx, method, req, reply, cc, opts...)
+}
+```
+
+### Interceptorlarni ro'yxatdan o'tkazish
+
+Interceptorlarni `bootstrap/app.go` faylida `WithGrpcServerInterceptors`, `WithGrpcClientInterceptors`, `WithGrpcServerStatsHandlers` va `WithGrpcClientStatsHandlers` funksiyalari yordamida ro'yxatdan o'tkazing.
+
+```go
+import (
+ "github.com/goravel/framework/contracts/foundation"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/stats"
+
+ "goravel/app/grpc/interceptors"
+)
+
+func Boot() foundation.Application {
+ return foundation.Setup().
+ WithGrpcServerInterceptors(func() []grpc.UnaryServerInterceptor {
+ return []grpc.UnaryServerInterceptor{
+ interceptors.TestServer,
+ }
+ }).
+ WithGrpcClientInterceptors(func() map[string][]grpc.UnaryClientInterceptor {
+ return map[string][]grpc.UnaryClientInterceptor{
+ "default": {
+ interceptors.TestClient,
+ },
+ }
+ }).
+ WithGrpcServerStatsHandlers(func() []stats.Handler {
+ return []stats.Handler{}
+ }).
+ WithGrpcClientStatsHandlers(func() map[string][]stats.Handler {
+ return map[string][]stats.Handler{}
+ }).
+ Create()
+}
+```
+
+### Interceptorlarni Serverlarga qo'llash
+
+Yuqoridagi misoldagi `default` - bu `grpc.servers.interceptors` konfiguratsiya bandiga qo'llanilishi mumkin bo'lgan guruh nomi. Shu tarzda, mijoz guruh ostidagi barcha interceptorlarga qo'llaniladi.
+
+```go
+package config
+
+import (
+ "goravel/app/facades"
+)
+
+func init() {
+ config := facades.Config()
+ config.Add("grpc", map[string]any{
+ "host": config.Env("GRPC_HOST", ""),
+ "port": config.Env("GRPC_PORT", ""),
+
+ "servers": map[string]any{
+ "user": map[string]any{
+ "host": config.Env("GRPC_USER_HOST", ""),
+ "port": config.Env("GRPC_USER_PORT", ""),
+ "interceptors": []string{"default"},
+ "stats_handlers": []string{},
+ },
+ },
+ })
+}
+```
+
+## Stats Handlers
+
+Stats handlerlar RPC chaqiruvlarini monitoring qilish va metrikalarni yig'ish uchun gRPC mexanizmidir. Ular ham mijoz, ham server RPC'larining hayot tsikliga kirish imkoniyatini beradi, bu ularni quyidagilar uchun ideal qiladi:
+
+- So'rov/javob monitoringi
+- Ishlash metrikalarini yig'ish
+- Maxsus kuzatish integratsiyalari
+- Jurnalga yozish va tuzatish
+
+### Stats Handlerlarni ro'yxatdan o'tkazish
+
+Stats handlerlar `bootstrap/app.go` faylida `WithGrpcServerStatsHandlers` va `WithGrpcClientStatsHandlers` funksiyalari yordamida ro'yxatdan o'tkazilishi mumkin.
+
+**Server Stats Handler misoli:**
+
+```go
+// app/grpc/stats/server_handler.go
+package stats
+
+import (
+ "context"
+
+ "google.golang.org/grpc/stats"
+)
+
+type ServerStatsHandler struct{}
+
+func NewServerStatsHandler() stats.Handler {
+ return &ServerStatsHandler{}
+}
+
+func (h *ServerStatsHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context {
+ // Har bir RPC boshida chaqiriladi
+ return ctx
+}
+
+func (h *ServerStatsHandler) HandleRPC(ctx context.Context, s stats.RPCStats) {
+ // Har bir RPC hodisasi uchun chaqiriladi
+}
+
+func (h *ServerStatsHandler) TagConn(ctx context.Context, info *stats.ConnTagInfo) context.Context {
+ // Ulanish o'rnatilganda chaqiriladi
+ return ctx
+}
+
+func (h *ServerStatsHandler) HandleConn(ctx context.Context, s stats.ConnStats) {
+ // Ulanish hodisalari uchun chaqiriladi
+}
+```
+
+**Mijoz Stats Handler misoli:**
+
+```go
+// app/grpc/stats/client_handler.go
+package stats
+
+import (
+ "context"
+
+ "google.golang.org/grpc/stats"
+)
+
+type ClientStatsHandler struct{}
+
+func NewClientStatsHandler() stats.Handler {
+ return &ClientStatsHandler{}
+}
+
+func (h *ClientStatsHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context {
+ return ctx
+}
+
+func (h *ClientStatsHandler) HandleRPC(ctx context.Context, s stats.RPCStats) {
+ // Begin, End, InPayload, OutPayload kabi RPC hodisalarini boshqaring
+}
+
+func (h *ClientStatsHandler) TagConn(ctx context.Context, info *stats.ConnTagInfo) context.Context {
+ return ctx
+}
+
+func (h *ClientStatsHandler) HandleConn(ctx context.Context, s stats.ConnStats) {
+ // Ulanish hodisalarini boshqaring
+}
+```
+
+### Bootstrap'da ro'yxatdan o'tkazish
+
+Stats handlerlaringizni `bootstrap/app.go` faylida ro'yxatdan o'tkazing:
+
+```go
+import (
+ "google.golang.org/grpc/stats"
+
+ grpcstats "goravel/app/grpc/stats"
+)
+
+func Boot() foundation.Application {
+ return foundation.Setup().
+ WithGrpcServerStatsHandlers(func() []stats.Handler {
+ return []stats.Handler{
+ grpcstats.NewServerStatsHandler(),
+ }
+ }).
+ WithGrpcClientStatsHandlers(func() map[string][]stats.Handler {
+ return map[string][]stats.Handler{
+ "user": {
+ grpcstats.NewClientStatsHandler(),
+ },
+ }
+ }).
+ Create()
+}
+```
+
+### Stats Handlerlarni Mijozlarga qo'llash
+
+Guruh nomi (masalan, `"user"`) `config/grpc.go` faylida mijozning `stats_handlers` massivida ko'rsatilishi kerak:
+
+```go
+package config
+
+import (
+ "goravel/app/facades"
+)
+
+func init() {
+ config := facades.Config()
+ config.Add("grpc", map[string]any{
+ "host": config.Env("GRPC_HOST", ""),
+ "port": config.Env("GRPC_PORT", ""),
+
+ "servers": map[string]any{
+ "user": map[string]any{
+ "host": config.Env("GRPC_USER_HOST", ""),
+ "port": config.Env("GRPC_USER_PORT", ""),
+ "interceptors": []string{"default"},
+ "stats_handlers": []string{"user"}, // "user" stats handler guruhini qo'llash
+ },
+ },
+ })
+}
+```
+
+## gRPC Mijozi
+
+Goravel gRPC xizmatlaridan foydalanish uchun gRPC mijozlarini yaratishning oson usulini taqdim etadi.
+
+### gRPC Serveriga ulanish
+
+Siz `facades.Grpc().Connect()` usuli yordamida gRPC serveriga ulanishingiz mumkin. Ulanish nomi `config/grpc.go` faylida aniqlangan kalitga mos kelishi kerak.
+
+```go
+// app/http/controllers/grpc_controller.go
+package controllers
+
+import (
+ "fmt"
+
+ proto "github.com/goravel/example-proto"
+ "github.com/goravel/framework/contracts/http"
+
+ "goravel/app/facades"
+)
+
+type GrpcController struct {
+ userService proto.UserServiceClient
+}
+
+func NewGrpcController() *GrpcController {
+ // Initsializatsiya jarayoni app/services/*.go fayliga ko‘chirilishi mumkin
+ client, err := facades.Grpc().Connect("user")
+ if err != nil {
+ facades.Log().Error(fmt.Sprintf("foydalanuvchi serveriga ulanish muvaffaqiyatsiz: %+v", err))
+ }
+
+ return &GrpcController{
+ userService: proto.NewUserServiceClient(client),
+ }
+}
+
+func (r *GrpcController) User(ctx http.Context) http.Response {
+ resp, err := r.userService.GetUser(ctx, &proto.UserRequest{
+ Token: ctx.Request().Input("token"),
+ })
+ if err != nil {
+ return ctx.Response().String(http.StatusInternalServerError, fmt.Sprintf("UserService.GetUser chaqiruvi xatosi: %+v", err))
+ }
+ if resp.Code != http.StatusOK {
+ return ctx.Response().String(http.StatusInternalServerError, fmt.Sprintf("foydalanuvchi xizmati xatoni qaytardi, kod: %d, xabar: %s", resp.Code, resp.Message))
+ }
+
+ return ctx.Response().Success().Json(resp.GetData())
+}
+```
diff --git a/uz_UZ/the-basics/logging.md b/uz_UZ/the-basics/logging.md
new file mode 100644
index 000000000..680509778
--- /dev/null
+++ b/uz_UZ/the-basics/logging.md
@@ -0,0 +1,114 @@
+# Loglash
+
+[[toc]]
+
+## Kirish
+
+Ilovaning ishlash holatini tushunish uchun Goravel kuchli log xizmatini taqdim etadi, u log xabarlari va tizim xatolarini `facades.Log()` orqali fayl yoki boshqa kanallarga yozishi mumkin.
+
+## Konfiguratsiya
+
+Turli log kanallarini sozlash uchun `config/logging.go` faylida maxsus konfiguratsiyalar amalga oshirilishi mumkin.
+
+`Goravel` sukut bo'yicha loglarni yozish uchun `stack` kanalidan foydalanadi, `stack` loglarni bir nechta kanallarga yo'naltirish imkonini beradi.
+
+`single` va `daily` haydovchilaridagi `print` konfiguratsiyasi log chiqishini konsolga boshqarishi mumkin.
+
+## Mavjud kanal haydovchilari
+
+| Nomi | Tavsifi |
+| -------- | ----------------------------------- |
+| `stack` | Bir nechta kanallarga ruxsat berish |
+| `single` | Yagona log fayli |
+| `daily` | Kuniga bitta log fayli |
+| `custom` | Maxsus haydovchi |
+
+### Kontekstni kiritish
+
+```go
+facades.Log().WithContext(ctx)
+```
+
+## Log xabarlarini yozish
+
+```go
+facades.Log().Debug(message)
+facades.Log().Debugf(message, args)
+facades.Log().Info(message)
+facades.Log().Infof(message, args)
+facades.Log().Warning(message)
+facades.Log().Warningf(message, args)
+facades.Log().Error(message)
+facades.Log().Errorf(message, args)
+facades.Log().Fatal(message)
+facades.Log().Fatalf(message, args)
+facades.Log().Panic(message)
+facades.Log().Panicf(message, args)
+```
+
+### Muayyan kanalga yozish
+
+Ba'zan, siz xabarlarni ilovaning sukut bo'yicha kanalidan boshqa kanalga yozishni xohlashingiz mumkin:
+
+```go
+facades.Log().Channel("single").Info(message)
+```
+
+Agar siz bir vaqtning o'zida bir nechta kanallarga yozishni istasangiz, `Stack` usulidan foydalanishingiz mumkin:
+
+```go
+facades.Log().Stack([]string{"single", "slack"}).Info(message)
+```
+
+## Zanjir usullari
+
+Goravel qulay zanjir usullarini taqdim etadi, ular logga foydali ma'lumotlarni qo'shishni osonlashtiradi:
+
+```go
+facades.Log().User("John").Debug(message)
+```
+
+| Usul | Harakat |
+| ------------- | ----------------------------------------------------------------------------------------- |
+| Kod | Logni tavsiflovchi kod yoki slug'ni o'rnating. |
+| Maslahat | Tezroq tuzatish uchun maslahat o'rnating. |
+| Ichida | Log yozuvining tegishli bo'lgan funksiya toifasi yoki domenini o'rnating. |
+| Egasi | Ogohlantirish maqsadlari uchun foydali. |
+| Request | Http.Request'ni ta'minlaydi. |
+| Response | Http.Response'ni ta'minlaydi. |
+| Teglar | Xatoni qaytaradigan funksiyani tavsiflovchi bir nechta teglarni qo'shing. |
+| Foydalanuvchi | Log yozuvi bilan bog'liq foydalanuvchini o'rnating. |
+| Bilan | Log yozuvi kontekstiga kalit-qiymat juftliklarini qo'shing. |
+| WithTrace | Log yozuviga stack ma'lumotlarini qo'shing. |
+
+## Maxsus kanal yaratish
+
+Agar siz to'liq maxsus kanal aniqlashni istasangiz, `config/logging.go` konfiguratsiya faylida `custom` haydovchi turini ko'rsatishingiz mumkin.
+Keyin `framework\contracts\log\Logger` strukturini amalga oshirish uchun `via` opsiyasini qo'shing:
+
+```go
+// config/logging.go
+"custom": map[string]interface{}{
+ "driver": "custom",
+ "via": &CustomLogger{},
+},
+```
+
+### Haydovchini amalga oshirish
+
+`framework\contracts\log\Logger` interfeysini amalga oshiring.
+
+```go
+// framework/contracts/log/Logger
+package log
+
+type Logger interface {
+ // Handle pass channel config path here
+ Handle(channel string) (Handler, error)
+}
+```
+
+Siz ma'lumot uchun daily va single log haydovchilarini tekshirishingiz mumkin:
+
+- [Kunlik](https://github.com/goravel/framework/blob/master/log/logger/daily.go)
+- [Yagona](https://github.com/goravel/framework/blob/master/log/logger/single.go)
diff --git a/uz_UZ/the-basics/middleware.md b/uz_UZ/the-basics/middleware.md
new file mode 100644
index 000000000..2a0ce7e84
--- /dev/null
+++ b/uz_UZ/the-basics/middleware.md
@@ -0,0 +1,82 @@
+# Middleware
+
+[[toc]]
+
+## Kirish
+
+Middleware sizning ilovangizga kiruvchi HTTP so‘rovlarini tekshirish va filtrlash uchun qulay mexanizmni taqdim etadi.
+
+## Middleware'ni aniqlash
+
+Siz o‘zingizning middleware'ingizni `app/http/middleware` katalogida yaratishingiz mumkin, strukturasi quyidagicha.
+
+```go
+package middleware
+
+import (
+ "github.com/goravel/framework/contracts/http"
+)
+
+func Auth() http.Middleware {
+ return func(ctx http.Context) {
+ ctx.Request().Next()
+ }
+}
+```
+
+### Middleware'ni buyruq orqali yaratish
+
+```
+./artisan make:middleware Auth
+
+// Ichki papkalarni qo‘llab-quvvatlaydi
+./artisan make:middleware user/Auth
+```
+
+## Middleware'ni ro‘yxatdan o‘tkazish
+
+### Global Middleware
+
+Agar siz middleware'ni ilovangizning har bir HTTP so‘rovi uchun qo‘llamoqchi bo‘lsangiz, faqat `bootstrap/app.go` faylidagi `WithMiddleware` funksiyasida middleware'ni ro‘yxatdan o‘tkazishingiz kifoya.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithMiddleware(func(handler configuration.Middleware) {
+ handler.Append(
+ middleware.Custom(),
+ )
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+`handler` middleware'ni boshqarish uchun bir nechta funksiyalarni taqdim etadi:
+
+- `Append(middlewares ...http.Middleware)`: Middleware'ni middleware stekining oxiriga qo‘shish.
+- `GetGlobalMiddleware() []http.Middleware`: Barcha global middleware'larni olish.
+- `GetRecover() func(ctx http.Context, err any)`: Maxsus tiklash funksiyasini olish.
+- `Prepend(middlewares ...http.Middleware)`: Middleware'ni middleware stekining boshiga qo‘shish.
+- `Recover(fn func(ctx http.Context, err any)) Middleware`: Panikalarni boshqarish uchun maxsus tiklash funksiyasini o‘rnatish.
+- `Use(middleware ...http.Middleware) Middleware`: Joriy middleware stekini berilgan middleware bilan almashtirish.
+
+### Routing uchun Middleware'ni tayinlash
+
+Siz middleware'ni ba‘zi routinglar uchun alohida ro‘yxatdan o‘tkazishingiz mumkin:
+
+```go
+import "github.com/goravel/framework/http/middleware"
+
+facades.Route().Middleware(middleware.Auth()).Get("users", userController.Show)
+```
+
+## So‘rovni to‘xtatish
+
+Middleware'da, agar so‘rovni to‘xtatish zarur bo‘lsa, `Abort` metodidan foydalanishingiz mumkin.
+
+```go
+ctx.Request().Abort()
+ctx.Request().Abort(http.StatusNotFound)
+ctx.Response().String(http.StatusNotFound, "Not Found").Abort()
+```
diff --git a/uz_UZ/the-basics/request.md b/uz_UZ/the-basics/request.md
new file mode 100644
index 000000000..03ab6bdd2
--- /dev/null
+++ b/uz_UZ/the-basics/request.md
@@ -0,0 +1,231 @@
+# HTTP So‘rovlari
+
+[[toc]]
+
+## Kirish
+
+Goravelning `contracts/http/Request` metodi ilova tomonidan qayta ishlangan joriy HTTP so‘rovi bilan o‘zaro aloqada bo‘lishi va birga yuborilgan kiritish ma’lumotlari va fayllarni olishi mumkin.
+
+## So‘rov Bilan O‘zaro Aloqa
+
+`http.Context` namunasi kontrollerga avtomatik ravishda kiritiladi:
+
+```go
+import "github.com/goravel/framework/contracts/http"
+
+facades.Route().Get("/", func(ctx http.Context) http.Response {})
+```
+
+### So‘rov Yo‘lini Olish
+
+```go
+path := ctx.Request().Path() // /users/1
+
+originPath := ctx.Request().OriginPath() // /users/{id}
+```
+
+### So‘rov URL Manzilini Olish
+
+```go
+url := ctx.Request().Url() // /users?name=Goravel
+```
+
+### So‘rov HOST Manzilini Olish
+
+```go
+url := ctx.Request().Host()
+```
+
+### To‘liq So‘rov URL Manzilini Olish
+
+```go
+url := ctx.Request().FullUrl() // http://**/users?name=Goravel
+```
+
+### So‘rov Metodini Olish
+
+```go
+method := ctx.Request().Method()
+```
+
+### So‘rov Yo‘li Ma’lumotlarini Olish
+
+```go
+info := ctx.Request().Info()
+```
+
+### So‘rov Yo‘li Nomini Olish
+
+```go
+name := ctx.Request().Name()
+```
+
+### So‘rov Sarlavhalari
+
+```go
+header := ctx.Request().Header("X-Header-Name", "default")
+headers := ctx.Request().Headers()
+```
+
+### So‘rov IP Manzili
+
+```go
+ip := ctx.Request().Ip()
+```
+
+## Kiritish
+
+### Barcha Kiritish Ma’lumotlarini Olish
+
+Siz kelayotgan so‘rovning barcha kiritish ma’lumotlarini `All` metodi yordamida `map[string]any` sifatida olishingiz mumkin, bu `json`, `form` va `query` (oldindan orqaga ustuvorlik) to‘plamidir.
+
+```go
+data := ctx.Request().All()
+```
+
+### Yo‘l Qiymatini Olish
+
+```go
+// /users/{id}
+id := ctx.Request().Route("id")
+id := ctx.Request().RouteInt("id")
+id := ctx.Request().RouteInt64("id")
+```
+
+### So‘rov Qatori Orqali Kiritishni Olish
+
+```go
+// /users?name=goravel
+name := ctx.Request().Query("name")
+name := ctx.Request().Query("name", "default")
+
+// /users?id=1
+name := ctx.Request().QueryInt("id")
+name := ctx.Request().QueryInt64("id")
+name := ctx.Request().QueryBool("id")
+
+// /users?names=goravel1&names=goravel2
+names := ctx.Request().QueryArray("names")
+
+// /users?names[a]=goravel1&names[b]=goravel2
+names := ctx.Request().QueryMap("names")
+
+queries := ctx.Request().Queries()
+```
+
+> Eslatma: Faqat bir o‘lchamli Json ma’lumotlari olinishi mumkin, aks holda bo‘sh qaytariladi.
+
+### Kiritish Qiymatini Olish
+
+So‘rov qaysi HTTP fe’li uchun ishlatilganidan qat’iy nazar, foydalanuvchi kiritishining barchasiga kirish. Olish tartibi: `json`, `form`.
+
+```go
+name := ctx.Request().Input("name")
+name := ctx.Request().Input("name", "goravel")
+name := ctx.Request().InputInt("name")
+name := ctx.Request().InputInt64("name")
+name := ctx.Request().InputBool("name")
+name := ctx.Request().InputArray("name")
+name := ctx.Request().InputMap("name")
+name := ctx.Request().InputMapArray("name")
+```
+
+### Json/Form-ni Bog‘lash
+
+```go
+type User struct {
+ Name string `form:"code" json:"code"`
+}
+
+var user User
+err := ctx.Request().Bind(&user)
+```
+
+```go
+var user map[string]any
+err := ctx.Request().Bind(&user)
+```
+
+### So‘rovni Bog‘lash
+
+Faqat struct-ga Query-ni bog‘lash qo‘llab-quvvatlanadi:
+
+```go
+type Test struct {
+ ID string `form:"id"`
+}
+var test Test
+err := ctx.Request().BindQuery(&test)
+```
+
+## Cookie
+
+### Cookie Qiymatini Olish
+
+Goravel `cookie` bilan ishlashning oddiy usulini taqdim etadi. `cookie` qiymatini olish uchun `Request` namunasidagi `Cookie` metodidan foydalaning, agar `cookie` mavjud bo‘lmasa, bo‘sh satr qaytariladi. Shuningdek, ikkinchi argumentda standart qiymatni belgilashingiz mumkin.
+
+```go
+value := ctx.Request().Cookie("name")
+value := ctx.Request().Cookie("name", "default")
+```
+
+## Fayl
+
+### Faylni Olish
+
+```go
+file, err := ctx.Request().File("file")
+files, err := ctx.Request().Files("file")
+```
+
+### Faylni Saqlash
+
+```go
+file, err := ctx.Request().File("file")
+file.Store("./public")
+```
+
+### Asl So‘rovni Olish
+
+```go
+request := ctx.Request().Origin()
+```
+
+### Ma’lumot Qo‘shish
+
+```go
+ctx.WithValue("user", "Goravel")
+```
+
+### Ma’lumot Olish
+
+```go
+user := ctx.Value("user")
+```
+
+### Kontekstni Olish
+
+```go
+ctx := ctx.Context()
+```
+
+## Maxsus Tiklash
+
+Siz `bootstrap/app.go::WithMiddleware` funksiyasida maxsus `recovery` ni o‘rnatishingiz mumkin.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithMiddleware(func(handler configuration.Middleware) {
+ handler.Append(
+ httpmiddleware.Throttle("global"),
+ sessionmiddleware.StartSession(),
+ ).Recover(func(ctx http.Context, err any) {
+ facades.Log().Error(err)
+ _ = ctx.Response().String(contractshttp.StatusInternalServerError, "recover").Abort()
+ })
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
diff --git a/uz_UZ/the-basics/response.md b/uz_UZ/the-basics/response.md
new file mode 100644
index 000000000..782221973
--- /dev/null
+++ b/uz_UZ/the-basics/response.md
@@ -0,0 +1,164 @@
+# HTTP Javobi
+
+[[toc]]
+
+## Kirish
+
+Controllerda HTTP javobi uchun `ctx.Response()` dan foydalanishingiz mumkin.
+
+## Matn
+
+```go
+import "github.com/goravel/framework/contracts/http"
+
+ctx.Response().String(http.StatusOK, "Hello Goravel")
+```
+
+## JSON
+
+```go
+import (
+ "github.com/goravel/framework/contracts/http"
+)
+
+ctx.Response().Json(http.StatusOK, http.Json{
+ "Hello": "Goravel",
+})
+
+ctx.Response().Json(http.StatusOK, struct {
+ ID uint `json:"id"`
+ Name string `json:"name"`
+}{
+ Id: 1,
+ Front: "Goravel",
+})
+```
+
+## Maxsus Qaytarish
+
+```go
+ctx.Response().Data(http.StatusOK, "text/html; charset=utf-8", []byte("Goravel"))
+```
+
+## Javob Fayli
+
+```go
+import "net/http"
+
+ctx.Response().File("./public/logo.png")
+```
+
+## Faylni Yuklab Olish
+
+```go
+import "net/http"
+
+ctx.Response().Download("./public/logo.png", "1.png")
+```
+
+## Sarlavha Qo‘shish
+
+```go
+import "github.com/goravel/framework/contracts/http"
+
+ctx.Response().Header("Content", "Goravel").String(http.StatusOK, "Hello Goravel")
+```
+
+## Cookie
+
+### Cookie O‘rnatish
+
+Cookie o‘rnatish uchun `response` namunasi ustidagi `Cookie` metodidan foydalaning. `Cookie` metodi `http.Cookie` namunasi qabul qiladi, bu sizga turli cookie parametrlarini o‘rnatish imkonini beradi.
+
+```go
+import (
+ "time"
+ "github.com/goravel/framework/contracts/http"
+)
+
+ctx.Response().Cookie(http.Cookie{
+ Name: "name",
+ Value: "Goravel",
+ Path: "/",
+ Domain: "goravel.dev",
+ Expires: time.Now().Add(24 * time.Hour),
+ Secure: true,
+ HttpOnly: true,
+})
+```
+
+### Cookie Muddatini Tugatish
+
+Cookie-ni o‘chirish uchun `WithoutCookie` metodidan foydalaning.
+
+```go
+ctx.Response().WithoutCookie("name")
+```
+
+## Muvaffaqiyatli Javob Qaytarish
+
+```go
+ctx.Response().Success().String("Hello Goravel")
+ctx.Response().Success().Json(http.Json{
+ "Hello": "Goravel",
+})
+```
+
+## Maxsus Kod
+
+```go
+ctx.Response().Status(http.StatusOK).Json(http.Json{
+ "hello": "Goravel",
+})
+```
+
+## Oqim Javobi Qaytarish
+
+```go
+ctx.Response().Stream(http.StatusCreated, func(w http.StreamWriter) error {
+ data := []string{"a", "b", "c"}
+ for _, item := range data {
+ if _, err := w.Write([]byte(item + "\n")); err != nil {
+ return err
+ }
+
+ if err := w.Flush(); err != nil {
+ return err
+ }
+
+ time.Sleep(1 * time.Second)
+ }
+
+ return nil
+})
+```
+
+## Qayta Yo‘naltirish
+
+```go
+ctx.Response().Redirect(http.StatusMovedPermanently, "https://goravel.dev")
+```
+
+## Kontent Yo‘q
+
+```go
+ctx.Response().NoContent()
+ctx.Response().NoContent(http.StatusOk)
+```
+
+## Javobni Olish
+
+Siz `ctx.Response()` dan barcha ma’lumotni olishingiz mumkin, bu odatda HTTP middleware’ida ishlatiladi:
+
+```go
+origin := ctx.Response().Origin()
+```
+
+`origin` quyida ko‘rsatilganidek ba’zi metodlarni o‘z ichiga oladi:
+
+| Metod | Harakat |
+| -------- | -------------------------- |
+| Tana | Javob ma’lumotlarini olish |
+| Sarlavha | Javob sarlavhasini olish |
+| Hajm | Javob hajmini olish |
+| Holat | Javob holatini olish |
diff --git a/uz_UZ/the-basics/routing.md b/uz_UZ/the-basics/routing.md
new file mode 100644
index 000000000..23e31ccb8
--- /dev/null
+++ b/uz_UZ/the-basics/routing.md
@@ -0,0 +1,283 @@
+# Marshrutlash
+
+[[toc]]
+
+## Kirish
+
+Goravel marshrutlash moduli `facades.Route()` orqali boshqarilishi mumkin.
+
+## HTTP haydovchisi
+
+Goravel sukut boʻyicha HTTP haydovchisi sifatida [gin](https://github.com/gin-gonic/gin) dan foydalanadi. Boshqa haydovchilardan foydalanish uchun ularni `config/http.go` faylida sozlang. Rasmiy sukut boʻyicha [gin](https://github.com/gin-gonic/gin) va [fiber](https://github.com/gofiber/fiber) qoʻllab-quvvatlanadi.
+
+| Haydovchi | Havola |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| Gin | [https://github.com/goravel/gin](https://github.com/goravel/gin) |
+| Fiber | [https://github.com/goravel/fiber](https://github.com/goravel/fiber) |
+
+## Sukut boʻyicha marshrutlash fayli
+
+Marshrutlash fayllarini aniqlash uchun oddiygina `routes` katalogiga o‘ting. Sukut bo‘yicha, framework `routes/web.go` faylida joylashgan namunaviy marshrutdan foydalanadi va u `bootstrap/app.go::WithRouting` funksiyasida ro‘yxatdan o‘tkaziladi.
+
+Agar sizga aniqroq boshqaruv kerak bo‘lsa, `routes` katalogiga marshrutlash fayllarini qo‘shishingiz va ularni ham `bootstrap/app.go::WithRouting` funksiyasida ro‘yxatdan o‘tkazishingiz mumkin.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithRouting(func() {
+ routes.Web()
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Marshrutlar Ro‘yxatini Olish
+
+Marshrutlar ro‘yxatini ko‘rish uchun `route:list` buyrug‘idan foydalaning:
+
+```shell
+./artisan route:list
+```
+
+### Marshrutlash usullari
+
+| Usullar | Harakat |
+| ----------- | --------------------------------------------- |
+| Guruh | [Guruh marshrutlash](#group-routing) |
+| Prefiks | [Marshrut prefiksi](#routing-prefix) |
+| ServeHTTP | [Marshrutlarni testlash](#testing-routing) |
+| Oling | [Asosiy marshrutlash](#basic-routing) |
+| Post | [Asosiy marshrutlash](#basic-routing) |
+| Put | [Asosiy marshrutlash](#basic-routing) |
+| O‘chirish | [Asosiy marshrutlash](#basic-routing) |
+| Patch | [Asosiy marshrutlash](#basic-routing) |
+| Parametrlar | [Asosiy marshrutlash](#basic-routing) |
+| Any | [Asosiy Marshrutlash](#basic-routing) |
+| Resurs | [Resurs marshrutlash](#resource-routing) |
+| Static | [Fayl marshrutlash](#file-routing) |
+| StaticFile | [Fayl marshrutlash](#file-routing) |
+| StaticFS | [Fayl marshrutlash](#file-routing) |
+| Middleware | [Middleware](#middleware) |
+| GetRoutes | [Barcha marshrutlarni olish](#get-all-routes) |
+| Name | [Marshrut nomini belgilash](#set-route-name) |
+| Info | [Marshrut maʼlumotini olish](#get-route-info) |
+
+## Asosiy marshrutlash
+
+```go
+facades.Route().Get("/", func(ctx http.Context) http.Response {
+ return ctx.Response().Json(http.StatusOK, http.Json{
+ "Hello": "Goravel",
+ })
+})
+facades.Route().Post("/", userController.Show)
+facades.Route().Put("/", userController.Show)
+facades.Route().Delete("/", userController.Show)
+facades.Route().Patch("/", userController.Show)
+facades.Route().Options("/", userController.Show)
+facades.Route().Any("/", userController.Show)
+```
+
+## Resurs marshrutlash
+
+```go
+import "github.com/goravel/framework/contracts/http"
+
+resourceController := NewResourceController()
+facades.Route().Resource("/resource", resourceController)
+
+type ResourceController struct{}
+func NewResourceController () *ResourceController {
+ return &ResourceController{}
+}
+// GET /resource
+func (c *ResourceController) Index(ctx http.Context) {}
+// GET /resource/{id}
+func (c *ResourceController) Show(ctx http.Context) {}
+// POST /resource
+func (c *ResourceController) Store(ctx http.Context) {}
+// PUT /resource/{id}
+func (c *ResourceController) Update(ctx http.Context) {}
+// DELETE /resource/{id}
+func (c *ResourceController) Destroy(ctx http.Context) {}
+```
+
+## Guruh marshrutlash
+
+```go
+facades.Route().Group(func(router route.Router) {
+ router.Get("group/{id}", func(ctx http.Context) http.Response {
+ return ctx.Response().Success().String(ctx.Request().Query("id", "1"))
+ })
+})
+```
+
+## Marshrut prefiksi
+
+```go
+facades.Route().Prefix("users").Get("/", userController.Show)
+```
+
+## Fayl marshrutlash
+
+```go
+import "net/http"
+
+facades.Route().Static("static", "./public")
+facades.Route().StaticFile("static-file", "./public/logo.png")
+facades.Route().StaticFS("static-fs", http.Dir("./public"))
+```
+
+## Marshrut parametrlari
+
+```go
+facades.Route().Get("/input/{id}", func(ctx http.Context) http.Response {
+ return ctx.Response().Success().Json(http.Json{
+ "id": ctx.Request().Input("id"),
+ })
+})
+```
+
+Batafsil [Soʻrov](./request.md)
+
+## Middleware
+
+```go
+import "github.com/goravel/framework/http/middleware"
+
+facades.Route().Middleware(middleware.Cors()).Get("users", userController.Show)
+```
+
+Batafsil [Middleware](./middleware.md)
+
+## Barcha marshrutlarni olish
+
+```go
+routes := facades.Route().GetRoutes()
+```
+
+## Marshrut nomini belgilash
+
+```go
+facades.Route().Get("users", userController.Index).Name("users.index")
+```
+
+## Marshrut maʼlumotini olish
+
+```go
+route := facades.Route().Info("users.index")
+```
+
+## Zaxira marshrutlar
+
+`Fallback` usulidan foydalanib, kiruvchi soʻrovga boshqa hech qanday marshrut mos kelmasa bajariladigan marshrutni belgilashingiz mumkin.
+
+```go
+facades.Route().Fallback(func(ctx http.Context) http.Response {
+ return ctx.Response().String(404, "not found")
+})
+```
+
+## Cheklov tezligi
+
+### Cheklov tezligi limitlarini belgilash
+
+Goravel berilgan marshrut yoki marshrutlar guruhi uchun trafik miqdorini cheklash uchun foydalanishingiz mumkin boʻlgan kuchli va sozlanishi mumkin boʻlgan cheklov tezligi xizmatlarini oʻz ichiga oladi. Boshlash uchun siz ilovangiz ehtiyojlariga javob beradigan cheklov konfiguratsiyalarini aniqlashingiz kerak, so‘ngra ularni `bootstrap/app.go::WithCallback` funksiyasida ro‘yxatdan o‘tkazishingiz kerak.
+
+Cheklov tezligi limitlari `facades.RateLimiter()` ning `For` usuli yordamida belgilanadi. `For` usuli cheklov tezligi limiti nomini va cheklov tezligi limitiga tayinlangan marshrutlarga qoʻllanilishi kerak boʻlgan limit konfiguratsiyasini qaytaradigan yopilishni qabul qiladi. Cheklov tezligi limiti nomi siz xohlagan har qanday satr boʻlishi mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
+ return limit.PerMinute(1000)
+ })
+ }).
+ Create()
+}
+```
+
+Agar kiruvchi soʻrov belgilangan tezlik chegarasidan oshib ketgan boʻlsa, Goravel tomonidan 429 HTTP holat kodi bilan javob avtomatik ravishda qaytariladi. Agar siz cheklov tezligi tomonidan qaytarilishi kerak boʻlgan oʻz javobingizni belgilamoqchi boʻlsangiz, javob usulidan foydalanishingiz mumkin:
+
+```go
+facades.RateLimiter().For("global", func(ctx http.Context) http.Limit {
+ return limit.PerMinute(1000).Response(func(ctx http.Context) {
+ ctx.Request().AbortWithStatus(http.StatusTooManyRequests)
+ })
+})
+```
+
+Cheklovli so‘rovlar chaqiruvlari kiruvchi HTTP so‘rov namunasini qabul qilganligi sababli, siz kiruvchi so‘rov yoki autentifikatsiyadan o‘tgan foydalanuvchiga asoslanib, tegishli cheklovni dinamik tarzda yaratishingiz mumkin:
+
+```go
+facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
+ // Faraz qilaylik
+ if is_vip() {
+ return limit.PerMinute(100)
+ }
+
+ return nil
+})
+```
+
+#### Cheklovlarni Segmentlash
+
+Ba‘zan siz cheklovlarni ixtiyoriy qiymat bo‘yicha segmentlarga ajratmoqchi bo‘lishingiz mumkin. Masalan, siz foydalanuvchilarga har bir IP manzili uchun daqiqada 100 marta ma‘lum marshrutga kirish imkoniyatini berishni xohlashingiz mumkin. Buni amalga oshirish uchun cheklovni yaratishda `By` metodidan foydalanishingiz mumkin:
+
+```go
+facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
+ if is_vip() {
+ return limit.PerMinute(100).By(ctx.Request().Ip())
+ }
+
+ return nil
+})
+```
+
+Ushbu xususiyatni yana bir misol bilan tushuntirish uchun, marshrutga kirishni autentifikatsiyadan o‘tgan foydalanuvchi IDsi uchun daqiqada 100 marta yoki mehmonlar uchun har bir IP manzili uchun daqiqada 10 marta cheklashimiz mumkin:
+
+```go
+facades.RateLimiter().For("global", func(ctx contractshttp.Context) contractshttp.Limit {
+ if userID != 0 {
+ return limit.PerMinute(100).By(userID)
+ }
+
+ return limit.PerMinute(10).By(ctx.Request().Ip())
+})
+```
+
+#### Bir Nechta Cheklovlar
+
+Agar kerak bo‘lsa, siz berilgan cheklov konfiguratsiyasi uchun cheklovlar massivini qaytarishingiz mumkin. Har bir cheklov marshrut uchun massiv ichida joylashgan tartibda baholanadi:
+
+```go
+facades.RateLimiter().ForWithLimits("login", func(ctx contractshttp.Context) []contractshttp.Limit {
+ return []contractshttp.Limit{
+ limit.PerMinute(500),
+ limit.PerMinute(100).By(ctx.Request().Ip()),
+ }
+})
+```
+
+### Cheklovlarni Marshrutlarga Biriktirish
+
+Cheklovlarni marshrutlarga yoki marshrut guruhlariga throttle middleware’i yordamida biriktirish mumkin. Throttle middleware’i marshrutga tayinlamoqchi bo‘lgan cheklov nomini qabul qiladi:
+
+```go
+import github.com/goravel/framework/http/middleware
+
+facades.Route().Middleware(middleware.Throttle("global")).Get("/", func(ctx http.Context) http.Response {
+ return ctx.Response().Json(200, http.Json{
+ "Hello": "Goravel",
+ })
+})
+```
+
+## Cross-Origin Resource Sharing (CORS)
+
+Goravel sukut bo‘yicha CORS’ni yoqilgan holda keladi, konfiguratsiyani `config/cors.go` faylida o‘zgartirish mumkin.
+
+> CORS va CORS sarlavhalari haqida qo‘shimcha ma‘lumot olish uchun iltimos, [CORS bo‘yicha MDN veb hujjatlari](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#The_HTTP_response_headers) bilan tanishib chiqing.
diff --git a/uz_UZ/the-basics/session.md b/uz_UZ/the-basics/session.md
new file mode 100644
index 000000000..988c657fd
--- /dev/null
+++ b/uz_UZ/the-basics/session.md
@@ -0,0 +1,261 @@
+# Session
+
+[[toc]]
+
+## Kirish
+
+Seans sizga bir nechta so‘rovlar bo‘yicha foydalanuvchi ma’lumotlarini saqlash imkonini beradi, bu esa tabiatan stateless HTTP protokolida holatli tajribani ta’minlaydi. Ushbu foydalanuvchi ma’lumotlari server tomonida doimiy ravishda saqlanadi. Goravel turli doimiy saqlash haydovchilari bilan o‘zaro aloqada bo‘lish uchun birlashtirilgan interfeysni taklif qiladi.
+
+## Konfiguratsiya
+
+`session` konfiguratsiya fayli `config/session.go` manzilida joylashgan. Standart haydovchi `file` bo‘lib, seanslarni `storage/framework/sessions` katalogida saqlaydi. Goravel sizga `contracts/session/driver` interfeysini amalga oshirish orqali maxsus `session` haydovchisini yaratish imkonini beradi.
+
+### Middleware-ni ro‘yxatdan o‘tkazish
+
+Standart bo‘yicha, Goravel seansni avtomatik ravishda boshlab bermaydi. Biroq, u seansni boshlash uchun middleware-ni taqdim etadi. Siz middleware-ni `bootstrap/app.go` faylidagi `WithMiddleware` funksiyasida ro‘yxatdan o‘tkazishingiz yoki uni ma’lum yo‘nalishlarga qo‘shishingiz mumkin:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithMiddleware(func(handler configuration.Middleware) {
+ handler.Append(
+ middleware.StartSession(),
+ )
+ }).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Seans bilan ishlash
+
+### Ma’lumotlarni olish
+
+Seansdan ma’lumotlarni olish uchun `Get` usulidan foydalanishingiz mumkin. Agar qiymat mavjud bo‘lmasa, `nil` qaytariladi.
+
+```go
+value := ctx.Request().Session().Get("key")
+```
+
+Shuningdek, siz `Get` usulining ikkinchi argumenti sifatida standart qiymatni ham o‘tkazishingiz mumkin. Agar belgilangan kalit seansda mavjud bo‘lmasa, bu qiymat qaytariladi:
+
+```go
+value := ctx.Request().Session().Get("key", "default")
+```
+
+### Barcha ma’lumotlarni olish
+
+Agar siz seansdan barcha ma’lumotlarni olishni istasangiz, `All` usulidan foydalanishingiz mumkin:
+
+```go
+data := ctx.Request().Session().All()
+```
+
+### Ma’lumotlarning kichik to‘plamini olish
+
+Agar siz seans ma’lumotlarining kichik to‘plamini olishni istasangiz, `Only` usulidan foydalanishingiz mumkin:
+
+```go
+data := ctx.Request().Session().Only([]string{"username", "email"})
+```
+
+### Elementning seansda mavjudligini aniqlash
+
+Elementning seansda mavjudligini aniqlash uchun `Has` usulidan foydalanishingiz mumkin. `Has` usuli element mavjud va `nil` bo‘lmasa, `true` qaytaradi:
+
+```go
+if ctx.Request().Session().Has("user") {
+ //
+}
+```
+
+Element mavjud va hatto `nil` bo‘lsa ham, mavjudligini aniqlash uchun `Exists` usulidan foydalanishingiz mumkin:
+
+```go
+if ctx.Request().Session().Exists("user") {
+ //
+}
+```
+
+Elementning seansda mavjud emasligini aniqlash uchun `Missing` usulidan foydalanishingiz mumkin:
+
+```go
+if ctx.Request().Session().Missing("user") {
+ //
+}
+```
+
+### Ma’lumotlarni saqlash
+
+Ma’lumotlarni seansda saqlash uchun `Put` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Put("key", "value")
+```
+
+### Ma’lumotlarni olish va o‘chirish
+
+Agar siz elementni seansdan olishni va keyin uni o‘chirishni istasangiz, `Pull` usulidan foydalanishingiz mumkin:
+
+```go
+value := ctx.Request().Session().Pull("key")
+```
+
+### Ma’lumotlarni o‘chirish
+
+`Forget` usuli seansdan bir qism ma’lumotni olib tashlash uchun ishlatilishi mumkin. Agar siz seansdan barcha ma’lumotlarni olib tashlashni istasangiz, `Flush` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Forget("username", "email")
+
+ctx.Request().Session().Flush()
+```
+
+### Seans ID-sini qayta yaratish
+
+Seans ID-sini qayta yaratish ko‘pincha zararli foydalanuvchilarning ilovangizda seans fiksatsiya hujumidan foydalanishining oldini olish uchun amalga oshiriladi. Seans ID-sini `Regenerate` usuli yordamida qayta yaratishingiz mumkin:
+
+```go
+ctx.Request().Session().Regenerate()
+```
+
+Agar siz seans ID-sini qayta yaratishni va seansda bo‘lgan barcha ma’lumotlarni unutishni istasangiz, `Invalidate` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Invalidate()
+```
+
+Keyin, yangi seansni cookie-ga saqlashingiz kerak:
+
+```go
+ctx.Response().Cookie(http.Cookie{
+ Name: ctx.Request().Session().GetName(),
+ Value: ctx.Request().Session().GetID(),
+ MaxAge: facades.Config().GetInt("session.lifetime") * 60,
+ Path: facades.Config().GetString("session.path"),
+ Domain: facades.Config().GetString("session.domain"),
+ Secure: facades.Config().GetBool("session.secure"),
+ HttpOnly: facades.Config().GetBool("session.http_only"),
+ SameSite: facades.Config().GetString("session.same_site"),
+})
+```
+
+### Flash ma’lumotlar
+
+Flash ma’lumotlar faqat keyingi HTTP so‘rovi davomida mavjud bo‘ladigan va keyin o‘chiriladigan seans ma’lumotlaridir. Flash ma’lumotlar holat xabarlari kabi vaqtincha xabarlarni saqlash uchun foydalidir. Flash ma’lumotlarni seansda saqlash uchun `Flash` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Flash("status", "Task was successful!")
+```
+
+Agar siz flash ma’lumotlaringizni qo‘shimcha so‘rov uchun saqlamoqchi bo‘lsangiz, `Reflash` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Reflash()
+```
+
+Agar siz ma’lum flash ma’lumotlarni qo‘shimcha so‘rov uchun saqlamoqchi bo‘lsangiz, `Keep` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Keep("status", "username")
+```
+
+Agar siz ma’lum ma’lumotlarni darhol foydalanish uchun saqlamoqchi bo‘lsangiz, `Now` usulidan foydalanishingiz mumkin:
+
+```go
+ctx.Request().Session().Now("status", "Task was successful!")
+```
+
+## Seans menejeri bilan ishlash
+
+### Maxsus seans yaratish
+
+Maxsus seans yaratish uchun `Session` fasadidan foydalaning. `Session` fasad `BuildSession` usulini taqdim etadi, u haydovchi namunasini va agar siz maxsus seans ID-sini belgilamoqchi bo‘lsangiz, ixtiyoriy seans ID-sini qabul qiladi:
+
+```go
+session := facades.Session().BuildSession(driver, "sessionID")
+```
+
+### Maxsus seans haydovchilarini qo‘shish
+
+#### Haydovchini amalga oshirish
+
+Maxsus seans haydovchisini amalga oshirish uchun, haydovchi `contracts/session/driver` interfeysini amalga oshirishi kerak.
+
+```go
+// Driver is the interface for Session handlers.
+type Driver interface {
+ // Close closes the session handler.
+ Close() error
+ // Destroy destroys the session with the given ID.
+ Destroy(id string) error
+ // Gc performs garbage collection on the session handler with the given maximum lifetime.
+ Gc(maxLifetime int) error
+ // Open opens a session with the given path and name.
+ Open(path string, name string) error
+ // Read reads the session data associated with the given ID.
+ Read(id string) (string, error)
+ // Write writes the session data associated with the given ID.
+ Write(id string, data string) error
+}
+```
+
+#### Haydovchini ro‘yxatdan o‘tkazish
+
+Haydovchini amalga oshirgandan so‘ng, uni faqat `config/session.go` konfiguratsiya fayliga qo‘shishingiz kerak:
+
+```go
+// config/session.go
+"default": "new",
+
+"drivers": map[string]any{
+ "file": map[string]any{
+ "driver": "file",
+ },
+ "new": map[string]any{
+ "driver": "custom",
+ "via": func() (session.Driver, error) {
+ return &CustomDriver{}, nil
+ },
+ }
+},
+```
+
+### Haydovchi namunasini olish
+
+Haydovchi namunasini seans menejeridan olish uchun `Driver` usulidan foydalaning. U ixtiyoriy haydovchi nomini qabul qiladi, agar berilmasa, standart haydovchi namunasini qaytaradi:
+
+```go
+driver, err := facades.Session().Driver("file")
+```
+
+### Yangi seansni boshlash
+
+```go
+session := facades.Session().BuildSession(driver)
+session.Start()
+```
+
+### Seans ma’lumotlarini saqlash
+
+```go
+session := facades.Session().BuildSession(driver)
+session.Start()
+session.Save()
+```
+
+### Seansni so‘rovga biriktirish
+
+```go
+session := facades.Session().BuildSession(driver)
+session.Start()
+ctx.Request().SetSession(session)
+```
+
+### So‘rovda seans mavjudligini tekshirish
+
+```go
+if ctx.Request().HasSession() {
+ //
+}
+```
diff --git a/uz_UZ/the-basics/validation.md b/uz_UZ/the-basics/validation.md
new file mode 100644
index 000000000..9fe964b65
--- /dev/null
+++ b/uz_UZ/the-basics/validation.md
@@ -0,0 +1,567 @@
+# Tekshirish
+
+[[toc]]
+
+## Kirish
+
+Goravel ilovangizning kiruvchi ma'lumotlarini tekshirish uchun bir nechta turli yondashuvlarni taqdim etadi. Barcha kiruvchi HTTP so'rovlarida mavjud bo'lgan `Validate` usulidan foydalanish eng keng tarqalgan usuldir. Goravel qulay tekshirish qoidalarining keng turlarini o'z ichiga oladi.
+
+## Tekshirishni Tez Boshlash
+
+Keling, formani qanday tekshirish va foydalanuvchiga xato xabarlarini qaytarishning to'liq misolini batafsil ko'rib chiqaylik. Ushbu umumiy ma'lumot sizga Goravel yordamida kiruvchi so'rov ma'lumotlarini qanday tekshirish haqida umumiy tushuncha beradi.
+
+### Marshrutlarni Aniqlash
+
+Birinchidan, `routes/web.go` faylimizda quyidagi marshrutlar aniqlangan deb faraz qilaylik:
+
+```go
+import "goravel/app/http/controllers"
+
+postController := controllers.NewPostController()
+facades.Route().Get("/post/create", postController.Create)
+facades.Route().Post("/post", postController.Store)
+```
+
+`GET` marshruti yangi blog postini yaratish uchun shaklni ko'rsatadi. `POST` marshruti yangi postni ma'lumotlar bazasiga saqlaydi.
+
+### Kontrollerni Yaratish
+
+Keyinchalik, ushbu marshrutlarga kiruvchi so'rovlarni boshqaradigan oddiy kontrollerni ko'rib chiqamiz. Biz hozircha `Store` usulini bo'sh qoldiramiz:
+
+```go
+package controllers
+
+import (
+ "github.com/goravel/framework/contracts/http"
+)
+
+type PostController struct {}
+
+func NewPostController() *PostController {
+ return &PostController{}
+}
+
+func (r *PostController) Store(ctx http.Context) {}
+```
+
+### Tekshirish Mantiqini Yozish
+
+Endi biz `Store` usulini yangi blog postini tekshirish mantiqi bilan to'ldirishga tayyormiz.
+
+```go
+func (r *PostController) Store(ctx http.Context) {
+ validator, err := ctx.Request().Validate(map[string]string{
+ "title": "required|max_len:255",
+ "body": "required",
+ "code": "required|regex:^\d{4,6}$",
+ })
+}
+```
+
+### Ichki Atributlar
+
+Agar kiruvchi HTTP so'rovi "ichki" maydon ma'lumotlarini o'z ichiga olsa, siz ushbu maydonlarni tekshirish qoidalaringizda "nuqta" sintaksisidan foydalanib belgilashingiz mumkin:
+
+```go
+validator, err := ctx.Request().Validate(map[string]string{
+ "title": "required|max_len:255",
+ "author.name": "required",
+ "author.description": "required",
+})
+```
+
+### Massiv (Slice) tekshiruvi
+
+Agar kiruvchi HTTP so'rovi "massiv" maydon ma'lumotlarini o'z ichiga olsa, siz ushbu maydonlarni tekshirish qoidalaringizda `*` sintaksisidan foydalanib belgilashingiz mumkin:
+
+```go
+validator, err := ctx.Request().Validate(map[string]string{
+ "tags.*": "required",
+})
+```
+
+## Forma So'rovi Tekshiruvi
+
+### Forma So'rovlarini Yaratish
+
+Murakkabroq tekshirish stsenariylari uchun siz "forma so'rovi" yaratishingiz mumkin. Forma so'rovlari - bu o'z tekshirish va avtorizatsiya mantiqini o'z ichiga olgan maxsus so'rov sinflari. Forma so'rovi sinfini yaratish uchun siz `make:request` Artisan CLI buyrug'idan foydalanishingiz mumkin:
+
+```go
+./artisan make:request StorePostRequest
+./artisan make:request user/StorePostRequest
+```
+
+Yaratilgan forma so'rovi sinfi `app/http/requests` katalogiga joylashtiriladi. Agar bu katalog mavjud bo'lmasa, u siz `make:request` buyrug'ini ishga tushirganingizda yaratiladi. Goravel tomonidan yaratilgan har bir forma so'rovida oltita usul mavjud: `Authorize`, `Rules`. Bundan tashqari, qo'shimcha amallar uchun `Filters`, `Messages`, `Attributes` va `PrepareForValidation` usullarini sozlashingiz mumkin.
+
+`Authorize` usuli joriy autentifikatsiyadan o'tgan foydalanuvchi so'rov bilan ifodalangan harakatni bajarishga qodir yoki yo'qligini aniqlash uchun mas'ul, `Rules` usuli esa so'rov ma'lumotlariga qo'llanilishi kerak bo'lgan tekshirish qoidalarini qaytaradi:
+
+```go
+package requests
+
+import (
+ "mime/multipart"
+
+ "github.com/goravel/framework/contracts/http"
+ "github.com/goravel/framework/contracts/validation"
+)
+
+type StorePostRequest struct {
+ Name string `form:"name" json:"name"`
+ File *multipart.FileHeader `form:"file" json:"file"`
+ Files []*multipart.FileHeader `form:"files" json:"files"`
+}
+
+func (r *StorePostRequest) Authorize(ctx http.Context) error {
+ return nil
+}
+
+func (r *StorePostRequest) Rules(ctx http.Context) map[string]string {
+ return map[string]string{
+ // Kalitlar kiruvchi kalitlar bilan mos keladi.
+ "name": "required|max_len:255",
+ "file": "required|file",
+ "files": "required|array",
+ "files.*": "required|file",
+ }
+}
+```
+
+Keyin kontrollerda so'rovni tekshirish uchun `ValidateRequest` usulidan foydalanishingiz mumkin:
+
+```go
+func (r *PostController) Store(ctx http.Context) {
+ var storePost requests.StorePostRequest
+ errors, err := ctx.Request().ValidateRequest(&storePost)
+}
+```
+
+Ko'proq qoidalarni [Mavjud Tekshirish Qoidalari](#available-validation-rules) bo'limida tekshiring.
+
+> E'tibor bering, `form` orqali uzatilgan qiymatlar sukut bo'yicha `string` turiga ega bo'lgani uchun, so'rovdagi barcha maydonlar ham `string` turida bo'lishi kerak, aks holda qiymatlarni uzatish uchun `JSON` dan foydalaning.
+
+### Forma So'rovlarini Avtorizatsiya Qilish
+
+Forma so'rovi sinfi shuningdek `Authorize` usulini o'z ichiga oladi. Ushbu usul ichida siz autentifikatsiyadan o'tgan foydalanuvchi haqiqatan ham berilgan resursni yangilash huquqiga ega ekanligini aniqlashingiz mumkin. Misol uchun, siz foydalanuvchi yangilashga urinayotgan blog sharhining haqiqiy egasi ekanligini aniqlashingiz mumkin. Eng ehtimol, siz ushbu usul ichida [avtorizatsiya darvozalari va siyosatlari](../security/authorization.md) bilan o'zaro munosabatda bo'lasiz:
+
+```go
+func (r *StorePostRequest) Authorize(ctx http.Context) error {
+ var comment models.Comment
+ facades.Orm().Query().First(&comment)
+ if comment.ID == 0 {
+ return errors.New("hech qanday sharh topilmadi")
+ }
+
+ if !facades.Gate().Allows("update", map[string]any{
+ "comment": comment,
+ }) {
+ return errors.New("sharhni yangilash mumkin emas")
+ }
+
+ return nil
+}
+```
+
+`error` `ctx.Request().ValidateRequest` ning qaytarish qiymatiga o'tkaziladi.
+
+### Kiruvchi Ma'lumotlarni Filtrlash
+
+Siz forma so'rovining `Filters` usulini takomillashtirish orqali kiruvchi ma'lumotlarni formatlashingiz mumkin. Ushbu usul `attribute/filter` xaritasini qaytarishi kerak:
+
+```go
+func (r *StorePostRequest) Filters(ctx http.Context) map[string]string {
+ return map[string]string{
+ "name": "trim",
+ }
+}
+```
+
+### Xato Xabarlarini Sozlash
+
+Siz forma so'rovi tomonidan ishlatiladigan xato xabarlarini `Messages` usulini bekor qilish orqali sozlashingiz mumkin. Ushbu usul atribut / qoida juftlari va ularning mos keladigan xato xabarlaridan iborat massivni qaytarishi kerak:
+
+```go
+func (r *StorePostRequest) Messages() map[string]string {
+ return map[string]string{
+ "title.required": "Sarlavha talab qilinadi",
+ "body.required": "Xabar talab qilinadi",
+ }
+}
+```
+
+### Tekshirish Atributlarini Sozlash
+
+Goravelning ko'plab o'rnatilgan tekshirish qoidasi xato xabarlari `:attribute` joy egasini o'z ichiga oladi. Agar siz tekshirish xabaringizning `:attribute` joy egasi maxsus atribut nomi bilan almashtirilishini istasangiz, `Attributes` usulini bekor qilish orqali maxsus nomlarni belgilashingiz mumkin. Ushbu usul atribut / nom juftlaridan iborat massivni qaytarishi kerak:
+
+```go
+func (r *StorePostRequest) Attributes() map[string]string {
+ return map[string]string{
+ "email": "elektron pochta manzili",
+ }
+}
+```
+
+### Tekshirish Uchun Kiruvchi Ma'lumotlarni Tayyorlash
+
+Agar tekshirish qoidalaringizni qo'llashdan oldin so'rovdan har qanday ma'lumotni tayyorlash yoki tozalash zarur bo'lsa, `PrepareForValidation` usulidan foydalanishingiz mumkin:
+
+```go
+func (r *StorePostRequest) PrepareForValidation(ctx http.Context, data validation.Data) error {
+ if name, exist := data.Get("name"); exist {
+ return data.Set("name", name.(string)+"1")
+ }
+ return nil
+}
+```
+
+## Validatorni Qo'lda Yaratish
+
+Agar siz so'rovdagi `Validate` usulidan foydalanmasangiz, `facades.Validator` yordamida validatori namunasi qo'lda yaratishingiz mumkin. Fasadning `Make` usuli yangi validatori namunasi yaratadi:
+
+```go
+func (r *PostController) Store(ctx http.Context) http.Response {
+ validator, _ := facades.Validation().Make(
+ ctx,
+ map[string]any{
+ "name": "Goravel",
+ },
+ map[string]string{
+ "title": "required|max_len:255",
+ "body": "required",
+ })
+
+ if validator.Fails() {
+ // Return fail
+ }
+
+ var user models.User
+ err := validator.Bind(&user)
+ ...
+}
+```
+
+`Make` usuliga uzatilgan birinchi argument tekshirilayotgan ma'lumot bo'lib, u `map[string]any` yoki `struct` bo'lishi mumkin. Ikkinchi argument ma'lumotga qo'llanilishi kerak bo'lgan tekshirish qoidalari massividir.
+
+### Xato Xabarlarini Sozlash
+
+Agar kerak bo'lsa, siz Goravel tomonidan taqdim etilgan sukut bo'yicha xato xabarlari o'rniga validatori namunasi ishlatishi kerak bo'lgan maxsus xato xabarlarini taqdim etishingiz mumkin. Siz maxsus xabarlarni `Make` usulining uchinchi argumenti sifatida o'tkazishingiz mumkin (`ctx.Request().Validate()` uchun ham qo'llaniladi):
+
+```go
+validator, err := facades.Validation().Make(ctx, input, rules, validation.Messages(map[string]string{
+ "required": "The :attribute field is required.",
+}))
+```
+
+### Berilgan Atribut Uchun Maxsus Xabar Belgilash
+
+Ba'zan siz faqat ma'lum bir atribut uchun maxsus xato xabarini belgilashni xohlashingiz mumkin. Siz buni "nuqta" belgisi yordamida qilishingiz mumkin. Avval atribut nomini, keyin qoidani belgilang (`ctx.Request().Validate()` uchun ham qo'llaniladi):
+
+```go
+validator, err := facades.Validation().Make(ctx, input, rules, validation.Messages(map[string]string{
+ "email.required": "Biz sizning elektron manzilingizni bilishimiz kerak!",
+}))
+```
+
+### Maxsus Atribut Qiymatlarini Belgilash
+
+Goravelning ko'pgina o'rnatilgan xato xabarlarida `:attribute` belgisi mavjud bo'lib, u tekshirilayotgan maydon yoki atribut nomi bilan almashtiriladi. Ushbu belgilarni almashtirish uchun ishlatiladigan qiymatlarni maxsus maydonlar uchun sozlash uchun siz maxsus atributlar massivini `Make` metodining uchinchi argumenti sifatida o'tkazishingiz mumkin (shuningdek, `ctx.Request().Validate()` uchun ham qo'llaniladi):
+
+```go
+validator, err := facades.Validation().Make(ctx, input, rules, validation.Attributes(map[string]string{
+ "email": "elektron manzil",
+}))
+```
+
+### Tekshirishdan Oldin Ma'lumotlarni Formatlash
+
+Ma'lumotlarni tekshirishdan oldin ularni formatlash orqali yanada moslashuvchan tekshirishni amalga oshirishingiz mumkin. Ma'lumotlarni formatlash metodini `Make` metodining uchinchi parametri sifatida o'tkazishingiz mumkin (shuningdek, `ctx.Request().Validate()` uchun ham qo'llaniladi):
+
+```go
+import (
+ validationcontract "github.com/goravel/framework/contracts/validation"
+ "github.com/goravel/framework/validation"
+)
+
+func (r *PostController) Store(ctx http.Context) http.Response {
+ validator, err := facades.Validation().Make(ctx, input, rules,
+ validation.PrepareForValidation(func(ctx http.Context, data validationcontract.Data) error {
+ if name, exist := data.Get("name"); exist {
+ return data.Set("name", name)
+ }
+
+ return nil
+ }))
+
+ ...
+}
+```
+
+## Tekshirilgan Kirish Ma'lumotlari bilan Ishlash
+
+Forma so'rovlari yoki qo'lda yaratilgan tekshiruvchi namunalari yordamida kiruvchi so'rov ma'lumotlarini tekshirgandan so'ng, so'rov ma'lumotlarini `struct` ga bog'lashni istasangiz, buning ikki usuli mavjud:
+
+1. `Bind` metodidan foydalaning, bu barcha kiruvchi ma'lumotlarni, shu jumladan tekshirilmagan ma'lumotlarni ham bog'laydi:
+
+```go
+validator, err := ctx.Request().Validate(rules)
+var user models.User
+err := validator.Bind(&user)
+
+validator, err := facades.Validation().Make(ctx, input, rules)
+var user models.User
+err := validator.Bind(&user)
+```
+
+2. Tekshirish uchun so'rovdan foydalanganda kiruvchi ma'lumotlar avtomatik ravishda formaga bog'lanadi:
+
+```go
+var storePost requests.StorePostRequest
+errors, err := ctx.Request().ValidateRequest(&storePost)
+fmt.Println(storePost.Name)
+```
+
+## Xato Xabarlari bilan Ishlash
+
+### Maydon Uchun Bitta Xato Xabarini Olish (Tasodifiy)
+
+```go
+validator, err := ctx.Request().Validate(rules)
+validator, err := facades.Validation().Make(ctx, input, rules)
+
+message := validator.Errors().One("email")
+```
+
+### Maydon Uchun Barcha Xato Xabarlarini Olish
+
+```go
+messages := validator.Errors().Get("email")
+```
+
+### Barcha Maydonlar Uchun Barcha Xato Xabarlarini Olish
+
+```go
+messages := validator.Errors().All()
+```
+
+### Maydon Uchun Xato Xabarlari Mavjudligini Aniqlash
+
+```go
+if validator.Errors().Has("email") {
+ //
+}
+```
+
+## Mavjud Tekshirish Qoidalari
+
+Quyida barcha mavjud tekshirish qoidalari va ularning funktsiyalari ro'yxati keltirilgan:
+
+| Nomi | Tavsifi |
+| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `required` | Qiymat talab qilinadi va nol qiymat bo'lishi mumkin emasligini tekshiradi. Misol uchun, maydon turi `bool` bo'lsa va o'tkazilgan qiymat `false` bo'lsa, u tekshiruvdan o'ta olmaydi. |
+| `required_if` | `required_if:anotherfield,value,...` Tekshirilayotgan maydon mavjud va bo'sh bo'lmasligi kerak, agar anotherField maydoni har qanday qiymatga teng bo'lsa. |
+| `required_unless` | `required_unless:anotherfield,value,...` Tekshirilayotgan maydon mavjud va bo'sh bo'lmasligi kerak, agar anotherField maydoni har qanday qiymatga teng bo'lmasa. |
+| `required_with` | `required_with:foo,bar,...` Tekshirilayotgan maydon faqat boshqa ko'rsatilgan maydonlardan har qanday biri mavjud bo'lganda mavjud va bo'sh bo'lmasligi kerak. |
+| `required_with_all` | `required_with_all:foo,bar,...` Tekshirilayotgan maydon faqat boshqa ko'rsatilgan barcha maydonlar mavjud bo'lganda mavjud va bo'sh bo'lmasligi kerak. |
+| `required_without` | `required_without:foo,bar,...` Tekshirilayotgan maydon faqat boshqa ko'rsatilgan maydonlardan har qanday biri mavjud bo'lmaganda mavjud va bo'sh bo'lmasligi kerak. |
+| `required_without_all` | `required_without_all:foo,bar,...` Tekshirilayotgan maydon faqat boshqa ko'rsatilgan barcha maydonlar mavjud bo'lmaganda mavjud va bo'sh bo'lmasligi kerak. |
+| `int` | Qiymat `intX` yoki `uintX` turida ekanligini tekshiradi va o'lcham tekshiruvini qo'llab-quvvatlaydi. masalan: `int` `int:2` `int:2,12`. Eslatma: [Qoidalardan foydalanish nuqtalari](#int) |
+| `uint` | Qiymat `uint(uintX)` turida ekanligini tekshiradi, `value >= 0` |
+| `bool` | Qiymat bool matni ekanligini tekshiradi (`true`: "1", "on", "yes", "true", `false`: "0", "off", "no", "false"). |
+| `string` | Qiymat matn turida ekanligini tekshiradi va o'lcham tekshiruvini qo'llab-quvvatlaydi. masalan:`string` `string:2` `string:2,12` |
+| `float` | Qiymat `float(floatX)` turida ekanligini tekshiradi |
+| `slice` | Qiymat slice turida ekanligini tekshiradi(`[]intX` `[]uintX` `[]byte` `[]string`) |
+| `in` | `in:foo,bar,…` Qiymat berilgan ro'yxatda borligini tekshiradi |
+| `not_in` | `not_in:foo,bar,…` Qiymat berilgan ro'yxatda yo'qligini tekshiradi |
+| `starts_with` | `starts_with:foo` Kiruvchi matn qiymati berilgan pastki matn bilan boshlanishini tekshiradi |
+| `ends_with` | `ends_with:foo` Kiruvchi matn qiymati berilgan pastki matn bilan tugashini tekshiradi |
+| `between` | `between:min,max` Qiymat raqam ekanligini va berilgan oralikda ekanligini tekshiradi |
+| `max` | `max:value` Qiymat berilgan qiymatdan kichik yoki tengligini tekshiradi(`intX` `uintX` `floatX`) |
+| `min` | `min:value` Qiymat berilgan qiymatdan katta yoki tengligini tekshiradi(`intX` `uintX` `floatX`) |
+| `eq` | `eq:value` Kiruvchi qiymat berilgan qiymatga tengligini tekshiradi |
+| `ne` | `ne:value` Kiruvchi qiymat berilgan qiymatga teng emasligini tekshiradi |
+| `lt` | `lt:value` Qiymat berilgan qiymatdan kichikligini tekshiradi(`intX` `uintX` `floatX`) |
+| `gt` | `gt:value` Qiymat berilgan qiymatdan katta ekanligini tekshiradi(`intX` `uintX` `floatX`) |
+| `len` | `len:value` Qiymat uzunligi berilgan o'lchamga tengligini tekshiradi(`string` `array` `slice` `map`) |
+| `min_len` | `min_len:value` Qiymatning minimal uzunligi berilgan o'lcham ekanligini tekshiradi(`string` `array` `slice` `map`) |
+| `max_len` | `max_len:value` Qiymatning maksimal uzunligi berilgan o'lcham ekanligini tekshiradi(`string` `array` `slice` `map`) |
+| `email` | Qiymat elektron pochta manzili satri ekanligini tekshirish |
+| `array` | Qiymat massiv, kesma turi ekanligini tekshirish |
+| `map` | Qiymat MAP turi ekanligini tekshirish |
+| `eq_field` | `eq_field:field` Maydon qiymati boshqa maydon qiymatiga teng ekanligini tekshirish |
+| `ne_field` | `ne_field:field` Maydon qiymati boshqa maydon qiymatiga teng emasligini tekshirish |
+| `gt_field` | `gt_field:field` Maydon qiymati boshqa maydon qiymatidan katta ekanligini tekshirish |
+| `gte_field` | `gte_field:field` Maydon qiymati boshqa maydon qiymatidan katta yoki unga teng ekanligini tekshirish |
+| `lt_field` | `lt_field:field` Maydon qiymati boshqa maydon qiymatidan kichik ekanligini tekshirish |
+| `lte_field` | `lte_field:field` Maydon qiymati boshqa maydon qiymatidan kichik yoki unga teng ekanligini tekshirish |
+| `file` | Yuklangan fayl ekanligini tekshirish |
+| `image` | Yuklangan rasm fayli ekanligini va kengaytmani tekshirishni qo‘llab-quvvatlashni tekshirish |
+| `date` | Maydon qiymati sana satri ekanligini tekshirish |
+| `gt_date` | `gt_date:value` Kirish qiymati berilgan sana satridan katta ekanligini tekshirish |
+| `lt_date` | `lt_date:value` Kirish qiymati berilgan sana satridan kichik ekanligini tekshirish |
+| `gte_date` | `gte_date:value` Kirish qiymati berilgan sana satridan katta yoki unga teng ekanligini tekshirish |
+| `lte_date` | `lte_date:value` Kirish qiymati berilgan sana satridan kichik yoki unga teng ekanligini tekshirish |
+| `alpha` | Qiymat faqat alifbo belgilaridan iborat ekanligini tekshirish |
+| `alpha_num` | Faqat harflar va raqamlar kiritilganligini tekshirish |
+| `alpha_dash` | Faqat harflar, raqamlar, tire ( - ) va pastki chiziq ( \_ ) kiritilganligini tekshirish |
+| `json` | Qiymat JSON satri ekanligini tekshirish |
+| `number` | Qiymat raqamli satr `>= 0` ekanligini tekshirish |
+| `full_url` | Qiymat to‘liq URL satri ekanligini tekshirish (http,https bilan boshlanishi kerak) |
+| `ip` | Qiymat IP(v4 yoki v6) satri ekanligini tekshirish |
+| `ipv4` | Qiymat IPv4 satri ekanligini tekshirish |
+| `ipv6` | Qiymat IPv6 satri ekanligini tekshirish |
+| `regex` | Qiymat muntazam tekshiruvdan o‘tishi mumkinligini tekshirish |
+| `uuid` | Qiymat UUID satri ekanligini tekshirish |
+| `uuid3` | Qiymat UUID3 satri ekanligini tekshirish |
+| `uuid4` | Qiymat UUID4 satri ekanligini tekshirish |
+| `uuid5` | Qiymat UUID5 satri ekanligini tekshirish |
+
+### Qoidalardan Foydalanish Bo‘yicha Ko‘rsatmalar
+
+#### int
+
+`ctx.Request().Validate(rules)` yordamida tekshiruvni amalga oshirishda, kiruvchi `int` turidagi ma’lumotlar `json.Unmarshal` tomonidan `float64` turiga o‘tkaziladi, bu esa int qoidasi tekshiruvini muvaffaqiyatsiz yakunlanishiga olib keladi.
+
+**Yechimlar**
+
+Variant 1: Ma’lumotlarni tekshirishdan oldin [`validation.PrepareForValidation`](#Format-Data-Before-Validation) qo‘shish, ma’lumotlarni formatlash;
+
+Variant 2: Qoidalarni tekshirish uchun `facades.Validation().Make()` dan foydalanish;
+
+## Maxsus Tekshiruv Qoidalari
+
+Goravel foydali tekshiruv qoidalarining keng assortimentini taqdim etadi; ammo, siz o‘zingizning ba’zi qoidalaringizni belgilamoqchi bo‘lishingiz mumkin. Maxsus tekshiruv qoidalarini ro‘yxatdan o‘tkazishning bir usuli qoida ob’yektlaridan foydalanishdir. Yangi qoida ob’yektini yaratish uchun siz oddiygina `make:rule` Artisan buyrug‘idan foydalanishingiz mumkin.
+
+### Maxsus Qoidalarni Yaratish
+
+Masalan, agar siz satr katta harflarda ekanligini tekshirishni istasangiz, ushbu buyruq yordamida qoida yaratishingiz mumkin. Goravel keyin ushbu yangi qoidani `app/rules` katalogida saqlaydi. Agar bu katalog mavjud bo‘lmasa, Goravel siz qoidangizni yaratish uchun Artisan buyrug‘ini ishga tushirganingizda uni yaratadi.
+
+```go
+./artisan make:rule Uppercase
+./artisan make:rule user/Uppercase
+```
+
+### Maxsus Qoidalarni Belgilash
+
+Qoidani yaratgandan so‘ng, uning xatti-harakatlarini aniqlashimiz kerak. Qoida ob’yektida ikkita usul mavjud: `Passes` va `Message`. Passes usuli tekshirilishi kerak bo‘lgan ma’lumot va tekshiruv parametrlarini o‘z ichiga olgan barcha ma’lumotlarni qabul qiladi. U atribut qiymatining haqiqiyligiga qarab `true` yoki `false` qaytarishi kerak. `Message` usuli tekshiruv muvaffaqiyatsiz tugaganda foydalanish kerak bo‘lgan tekshiruv xato xabarini qaytarishi kerak.
+
+```go
+package rules
+
+import (
+ "strings"
+
+ "github.com/goravel/framework/contracts/validation"
+)
+
+type Uppercase struct {
+}
+
+// Signature The name of the rule.
+func (receiver *Uppercase) Signature() string {
+ return "uppercase"
+}
+
+// Passes Determine if the validation rule passes.
+func (receiver *Uppercase) Passes(ctx context.Context, data validation.Data, val any, options ...any) bool {
+ return strings.ToUpper(val.(string)) == val.(string)
+}
+
+// Message Get the validation error message.
+func (receiver *Uppercase) Message(ctx context.Context) string {
+ return "The :attribute must be uppercase."
+}
+```
+
+### Maxsus Qoidalarni Ro‘yxatdan O‘tkazish
+
+`make:rule` tomonidan yaratilgan yangi qoida `bootstrap/rules.go::Rules()` funksiyasida avtomatik ro‘yxatdan o‘tkaziladi va funksiya `WithRules` tomonidan chaqiriladi. Agar siz qoida faylini o‘zingiz yaratsangiz, qoidani qo‘lda ro‘yxatdan o‘tkazishingiz kerak.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithRules(Rules).
+ WithConfig(config.Boot).
+ Create()
+}
+```
+
+## Mavjud Tekshiruv Filtrlari
+
+| Nomi | Tavsifi |
+| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `int/toInt` | Qiymatni(string/intX/floatX) `int` turiga o‘tkazish `v.FilterRule("id", "int")` |
+| `uint/toUint` | Qiymatni(string/intX/floatX) `uint` turiga o‘tkazish `v.FilterRule("id", "uint")` |
+| `int64/toInt64` | Qiymatni (string/intX/floatX) `int64` turiga o‘tkazish `v.FilterRule("id", "int64")` |
+| `float/toFloat` | Qiymatni (string/intX/floatX) `float` turiga o‘tkazish |
+| `bool/toBool` | Satr qiymatini bool ga o‘tkazish. (`true`: "1", "on", "yes", "true", `false`: "0", "off", "no", "false") |
+| `trim/trimSpace` | Satrning ikkala tomonidagi bo‘sh joy belgilarini tozalash |
+| `ltrim/trimLeft` | Satrning chap tomonidagi bo‘sh joy belgilarini tozalash |
+| `rtrim/trimRight` | Satrning o‘ng tomonidagi bo‘sh joy belgilarini tozalash |
+| `int/integer` | Qiymatni (string/intX/floatX) `int` turiga o‘tkazish `v.FilterRule("id", "int")` |
+| `lower/lowercase` | Satrni kichik harflarga o‘tkazish |
+| `upper/uppercase` | Satrni katta harflarga o‘tkazish |
+| `lcFirst/lowerFirst` | Satrning birinchi belgisini kichik harfga o‘tkazish |
+| `ucFirst/upperFirst` | Satrning birinchi belgisini katta harfga o‘tkazish |
+| `ucWord/upperWord` | Har bir so‘zning birinchi belgisini katta harfga o‘tkazish |
+| `camel/camelCase` | Satrni camel nomlash uslubiga o‘tkazish |
+| `snake/snakeCase` | Satrni snake nomlash uslubiga o‘tkazish |
+| `escapeJs/escapeJS` | JS satrini ekranlash. |
+| `escapeHtml/escapeHTML` | HTML satrini ekranlash. |
+| `str2ints/strToInts` | Satrni int kesimiga `[]int` o‘tkazish |
+| `str2time/strToTime` | Sana satrini `time.Time` ga o‘tkazish. |
+| `str2arr/str2array/strToArray` | Satrni string kesimiga `[]string` o‘tkazish |
+
+## Maxsus filtr
+
+Goravel foydali filtrlarning keng assortimentini taqdim etadi, ammo siz o‘zingizning ba’zilaringizni belgilashni xohlashingiz mumkin.
+
+### Maxsus Filtrlarni Yaratish
+
+Yangi qoida obyektini yaratish uchun siz oddiygina `make:filter` Artisan buyrug‘idan foydalanishingiz mumkin. Keling, satrni butun songa o‘tkazadigan qoidani yaratish uchun ushbu buyruqdan foydalanaylik. Bu qoida allaqachon freymvorkga kiritilgan, biz uni faqat misol sifatida yaratamiz. Goravel ushbu yangi filtri `app/filters` katalogiga saqlaydi. Agar bu katalog mavjud bo‘lmasa, Goravel qoidani yaratish uchun Artisan buyrug‘ini ishga tushirganingizda uni yaratadi:
+
+```go
+./artisan make:filter ToInt
+./artisan make:filter user/ToInt
+```
+
+### Maxsus Filtrlarni Belgilash
+
+Bitta filtr ikkita usulni o‘z ichiga oladi: `Signature` va `Handle`. `Signature` usuli filtr nomini belgilaydi. `Handle` usuli aniq filtr mantiqini bajaradi:
+
+```go
+package filters
+
+import (
+ "strings"
+
+ "github.com/spf13/cast"
+ "github.com/goravel/framework/contracts/validation"
+)
+
+type ToInt struct {
+}
+
+// Signature The signature of the filter.
+func (receiver *ToInt) Signature() string {
+ return "ToInt"
+}
+
+// Handle defines the filter function to apply.
+func (receiver *ToInt) Handle(ctx context.Context) any {
+ return func (val any) int {
+ return cast.ToString(val)
+ }
+}
+```
+
+### Maxsus Filtrlarni Ro‘yxatdan O‘tkazish
+
+`make:filter` tomonidan yaratilgan yangi qoida `bootstrap/filters.go::Filters()` funksiyasida avtomatik ro‘yxatdan o‘tkaziladi va funksiya `WithFilters` tomonidan chaqiriladi. Agar siz qoida faylini o‘zingiz yaratsangiz, qoidani qo‘lda ro‘yxatdan o‘tkazishingiz kerak.
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithFilters(Filters).
+ WithConfig(config.Boot).
+ Create()
+}
+```
diff --git a/uz_UZ/the-basics/views.md b/uz_UZ/the-basics/views.md
new file mode 100644
index 000000000..47ce74cab
--- /dev/null
+++ b/uz_UZ/the-basics/views.md
@@ -0,0 +1,172 @@
+# Ko‘rishlar
+
+[[toc]]
+
+## Kirish
+
+Albatta, marshrutlaringiz va kontrollerlaringizdan to‘liq HTML hujjatlarini to‘g‘ridan-to‘g‘ri qaytarish amaliy emas. Yaxshiyamki, ko‘rishlar barcha HTML kodimizni alohida fayllarga joylashtirishning qulay usulini taqdim etadi. Ko‘rishlar kontroller/dastur mantiqini taqdimot mantiqidan ajratadi va ular `resources/views` katalogida saqlanadi.
+
+## Ko‘rishlarni Yaratish & Ko‘rsatish
+
+Goravelning standart `html/template` shablonidan foydalanganda, dastur `resources/views` katalogida `.tmpl` kengaytmali fayl qo‘shib ko‘rishlarni yaratishingiz mumkin.
+
+```
+// resources/views/welcome.tmpl
+{{ define "welcome.tmpl" }}
+
+
+
Salom, {{ .name }}
+
+
+{{ end }}
+```
+
+Ko‘rishni yaratgandan so‘ng, dasturdagi marshrut yoki kontrollerdan ko‘rishni qaytarish uchun `View` metodidan foydalanishingiz mumkin:
+
+```go
+facades.Route().Get("/", func(ctx http.Context) http.Response {
+ return ctx.Response().View().Make("welcome.tmpl", map[string]any{
+ "name": "Goravel",
+ })
+})
+```
+
+### Ichki Ko‘rish Kataloglari
+
+Ko‘rishlar, shuningdek, `resources/views` katalogining ichki kataloglarida joylashgan bo‘lishi mumkin. Masalan, agar ko‘rishingiz `resources/views/admin/profile.tmpl` manzilida saqlangan bo‘lsa, uni dasturingizning marshrutlari yoki kontrollerlaridan biridan qaytarishingiz mumkin. E‘tibor bering, ko‘rish quyidagicha `define "admin/profile.tmpl"` sifatida aniqlanishi kerak:
+
+```go
+// resources/views/admin/profile.tmpl
+{{ define "admin/profile.tmpl" }}
+
Admin paneliga xush kelibsiz
+{{ end }}
+
+ctx.Response().View().Make("admin/profile.tmpl", map[string]any{
+ "name": "Goravel",
+})
+```
+
+### Mavjud Birinchi Ko‘rishni Yaratish
+
+`First` metodidan foydalanib, berilgan ko‘rishlar massividagi mavjud birinchi ko‘rishdan foydalanishingiz mumkin. Bu, agar dasturingiz yoki paketingiz ko‘rishlarni sozlash yoki ustidan yozishga imkon bersa, foydali bo‘lishi mumkin:
+
+```go
+ctx.Response().View().First([]string{"custom/admin.tmpl", "admin.tmpl"}, map[string]any{
+ "name": "Goravel",
+})
+```
+
+### Ko‘rish Mavjudligini Aniqlash
+
+Agar ko‘rish mavjudligini aniqlash kerak bo‘lsa, `facades.View()` metodidan foydalanishingiz mumkin:
+
+```go
+if facades.View().Exist("welcome.tmpl") {
+ // ...
+}
+```
+
+## Ko‘rishlarga Ma'lumot O‘tkazish
+
+Oldingi misollarda ko‘rganingizdek, ko‘rishlarga ma'lumot massivini o‘tkazib, bu ma'lumotni ko‘rish uchun mavjud qilishingiz mumkin. Iltimos, o‘tkazilgan ma'lumot formati ishlatiladigan shablon haydovchisiga qarab o‘zgarishi kerakligini unutmang. Quyidagi misolda standart `html/template` haydovchisi ishlatilmoqda:
+
+```go
+facades.Route().Get("/", func(ctx http.Context) http.Response {
+ return ctx.Response().View().Make("welcome.tmpl", map[string]any{
+ "name": "Goravel",
+ })
+})
+```
+
+### Barcha Ko‘rishlar bilan Ma'lumot Ulashish
+
+Ba'zan, dasturingiz tomonidan ko‘rsatiladigan barcha ko‘rishlar bilan ma'lumot ulashishingiz kerak bo‘lishi mumkin. Buni `facades.View()` dagi `Share` funksiyasidan foydalanib amalga oshirishingiz mumkin. Odatda, `Share` funksiyasiga chaqiruvlarni `bootstrap/app.go::WithCallback` funksiyasiga joylashtirishingiz kerak:
+
+```go
+func Boot() contractsfoundation.Application {
+ return foundation.Setup().
+ WithConfig(config.Boot).
+ WithCallback(func() {
+ facades.View().Share("key", "value")
+ }).
+ Create()
+}
+```
+
+## CSRF Token Middleware
+
+Bu middleware marshrutlarga qo‘llanilishi mumkin, bu esa so‘rovlar autentifikatsiyadan o‘tgan manbalardan kelayotganligini va Saytlararo So‘rov Soxtalashtirish (CSRF) hujumlariga qarshi himoyani ta'minlaydi.
+
+::: v-pre
+
+1. Middleware'ni (`github.com/goravel/framework/http/middleware::VerifyCsrfToken(exceptPaths)`) global yoki ma'lum bir marshrutga ro‘yxatdan o‘tkazing.
+2. CSRF tokenini o‘z ichiga olish uchun ko‘rish faylidagi formangizga `` qo‘shing yoki so‘rov sarlavhangizga `X-CSRF-TOKEN={{ .csrf_token }}` qo‘shing.
+3. Middleware forma topshirilganda tokenni avtomatik tekshiradi.
+ :::
+
+## Maxsus Delims va Funksiyalarni Ro‘yxatdan O‘tkazish
+
+Ko‘rishlaringiz ichida ishlatilishi uchun maxsus Delims va funksiyalarni ro‘yxatdan o‘tkazishingiz mumkin, ular `http.drivers.*.template` konfiguratsiyasida ro‘yxatdan o‘tkazilishi mumkin.
+
+Gin haydovchisi uchun:
+
+```go
+// config/http.go
+import (
+ "html/template"
+
+ "github.com/gin-gonic/gin/render"
+ "github.com/goravel/gin"
+)
+
+"template": func() (render.HTMLRender, error) {
+ return gin.NewTemplate(gin.RenderOptions{
+ Delims: &gin.Delims{
+ Left: "{{",
+ Right: "}}",
+ },
+ FuncMap: template.FuncMap{
+ // Maxsus shablon funksiyalarini shu yerda qo‘shing
+ },
+ })
+},
+```
+
+Fiber haydovchisi uchun:
+
+```go
+// config/http.go
+import (
+ "github.com/gofiber/fiber/v2"
+ "github.com/gofiber/template"
+ "github.com/gofiber/template/html/v2"
+ "github.com/goravel/framework/support/path"
+)
+
+"template": func() (fiber.Views, error) {
+ engine := &html.Engine{
+ Engine: template.Engine{
+ Left: "{{",
+ Right: "}}",
+ Directory: path.Resource("views"),
+ Extension: ".tmpl",
+ LayoutName: "embed",
+ // Maxsus shablon funksiyalarini shu yerda qo‘shing
+ Funcmap: make(map[string]interface{}),
+ },
+ }
+
+ engine.AddFunc(engine.LayoutName, func() error {
+ return fmt.Errorf("layoutName called unexpectedly")
+ })
+ return engine, nil
+},
+```
+
+## Maxsus Shablon Dvigatellari
+
+Ginning `render.HTMLRender` interfeysi yoki fiberning `fiber.Views` interfeysini amalga oshirib, o‘zingizning maxsus shablon dvigatellaringizni yaratishingiz mumkin. Maxsus dvigatelni yaratgandan so‘ng, uni `http.drivers.*.template` konfiguratsiyasiga ro‘yxatdan o‘tkazishingiz mumkin.
+
+## Ilg‘or Xususiyatlar
+
+`http/template` standart shablon dvigatelidir, ilg‘or xususiyatlar uchun rasmiy hujjatga murojaat qilishingiz mumkin: https://pkg.go.dev/html/template.
diff --git a/uz_UZ/upgrade/history.md b/uz_UZ/upgrade/history.md
new file mode 100644
index 000000000..13aa751ab
--- /dev/null
+++ b/uz_UZ/upgrade/history.md
@@ -0,0 +1,17 @@
+# Yangilash tarixi
+
+- [v1.14 dan v1.15 ga yangilash](v1.15.md)
+- [v1.13 dan v1.14 ga yangilash](v1.14.md)
+- [v1.12 dan v1.13 ga yangilash](v1.13.md)
+- [v1.11 dan v1.12 ga yangilash](v1.12.md)
+- [v1.10 dan v1.11 ga yangilash](v1.11.md)
+- [v1.9 dan v1.10 ga yangilash](v1.10.md)
+- [v1.8 dan v1.9 ga yangilash](v1.9.md)
+- [v1.7 dan v1.8 ga yangilash](v1.8.md)
+- [v1.6 dan v1.7 ga yangilash](v1.7.md)
+- [v1.5 dan v1.6 ga yangilash](v1.6.md)
+- [v1.4 dan v1.5 ga yangilash](v1.5.md)
+- [v1.3 dan v1.4 ga yangilash](v1.4.md)
+- [v1.2 dan v1.3 ga yangilash](v1.3.md)
+- [v1.1 dan v1.2 ga yangilash](v1.2.md)
+- [v1.0 dan v1.1 ga yangilash](v1.1.md)
diff --git a/uz_UZ/upgrade/v1.1.md b/uz_UZ/upgrade/v1.1.md
new file mode 100644
index 000000000..35b476b56
--- /dev/null
+++ b/uz_UZ/upgrade/v1.1.md
@@ -0,0 +1,76 @@
+# v1.0 dan v1.1 ga yangilash
+
+[[toc]]
+
+## Yuqori ta'sirli o'zgarishlar
+
+- [Bog'liqliklarni yangilash](#updating-dependencies)
+- [Provayderlarni yangilash](#update-providers)
+- [Konfiguratsiya qo'shish](#add-config)
+
+## O'rtacha ta'sirli o'zgarishlar
+
+- [facades.Cache usullarini qo'shish](#facades-cache-add-methods)
+
+## Past ta'sirli o'zgarishlar
+
+- [facades.Auth qo'shish](#add-facades-auth)
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+**Ta'sir ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.1.1
+```
+
+### Provayderlarni yangilash
+
+**Ta'sir ehtimoli: Yuqori**
+
+`config.app.go` faylida Auth provayderini qo'shing:
+
+```go
+"github.com/goravel/framework/auth"
+
+"providers": []contracts.ServiceProvider{
+ ...
+ &mail.ServiceProvider{},
+ &auth.ServiceProvider{},
+ &providers.AppServiceProvider{},
+ ...
+}
+```
+
+### Konfiguratsiya qo'shish
+
+**Ta'sir ehtimoli: Yuqori**
+
+`config` katalogida fayl qo'shing:
+
+1. [auth.go](https://github.com/goravel/goravel/blob/v1.1.1/config/auth.go)
+2. [jwt.go](https://github.com/goravel/goravel/blob/v1.1.1/config/jwt.go)
+
+### facades.Cache usullarini qo'shish
+
+**Ta'sir ehtimoli: O'rtacha**
+
+Usullarni qo'shing:
+
+1. [facades.Cache.GetBool](https://github.com/goravel/framework/blob/87c7fa9b95e45fcf4f88a502f1a1adc213527ae1/contracts/cache/store.go#L9)
+2. [facades.Cache.GetInt](https://github.com/goravel/framework/blob/87c7fa9b95e45fcf4f88a502f1a1adc213527ae1/contracts/cache/store.go#L10)
+3. [facades.Cache.GetString](https://github.com/goravel/framework/blob/87c7fa9b95e45fcf4f88a502f1a1adc213527ae1/contracts/cache/store.go#L11)
+
+Agar siz [Maxsus keshlash drayverlarini qo'shish](https://github.com/goravel/docs/blob/master/digging-deeper/cache.md#adding-custom-cache-drivers) dan foydalanayotgan bo'lsangiz, ushbu uchta yangi interfeysni amalga oshirishingiz kerak.
+
+### facades.Auth qo'shish
+
+**Ta'sir ehtimoli: Past**
+
+Autentifikatsiya uchun [facades.Auth](../security/authentication.md) ni qo'shing。
diff --git a/uz_UZ/upgrade/v1.10.md b/uz_UZ/upgrade/v1.10.md
new file mode 100644
index 000000000..2e7c2709d
--- /dev/null
+++ b/uz_UZ/upgrade/v1.10.md
@@ -0,0 +1,226 @@
+# v1.9 dan v1.10 ga yangilash
+
+[[toc]]
+
+## Qiziqarli Yangi Imkoniyatlar 🎉
+
+- [facades.Crypt qo'shish(1.10.0)](#encryption)
+- [facades.Hash qo'shish(1.10.0)](#hashing)
+- [Marshrutlash uchun tezlik cheklovini qo'shish(1.10.0)](#add-rate-limiting-for-routing)
+
+## Yaxshilanishlar 🚀
+
+- [HTTP ishga tushish rejimini optimallashtirish(1.10.0)](#optimize-http-startup-mode)
+- [GRPC ishga tushish rejimini optimallashtirish(1.10.0)](#optimize-grpc-startup-mode)
+- [Konsolga log chiqishini boshqarish uchun konfiguratsiya qo'shish(1.10.0)](#add-configuration-to-control-log-output-to-console)
+- [So'rovni o'zgartirish va yangi metodlar qo'shish(1.10.0)](#request-modify-and-add-methods)
+- [Navbat kechiktirilgan jo'natishni qo'llab-quvvatlaydi(1.10.0)](#queue-support-delayed-dispatching)
+- [ORM dagi Connection jadval prefiksi va birlikni o'rnatishni qo'llab-quvvatlaydi(1.10.0)](#the-connection-in-orm-supports-set-table-prefix-and-singular)
+- [docker-compose.yml faylini qo'shish(1.10.0)](#add-docker-compose-yml-file)
+- [ORM ni optimallashtirish(1.10.0)](#optimize-orm)
+- [Migratsiya faylida bir nechta SQL ni qo'llab-quvvatlash(1.10.0)](#support-multiple-sql-in-migration-file)
+- [Fayl saqlash uchun minio drayverini qo'shish(1.10.0)](#add-minio-driver-for-file-storage)
+- [contracts/http ga net/http ning holat xaritasini qo'shish(1.10.0)](#contracts-http-add-status-mapping-of-net-http)
+
+## Muhim O'zgarishlar 🛠
+
+- [APP_KEY talab qilinadi(1.10.0)](#app-key-required)
+- [Form Request ostidagi metodlarga ctx parametrini qo'shish(1.10.0)](#add-ctx-parameter-to-the-methods-under-form-request)
+- [facades.Auth.Parse payload qaytarishni qo'shadi(1.10.0)](#facades-auth-parse-add-payload-returns)
+- [ORM ning ba'zi metodlari yangi qaytish qiymatlarini qo'shadi(1.10.0)](#some-methods-of-orm-add-new-return-values)
+
+## Yangilash Qo'llanmasi
+
+**Taxminiy Yangilash Vaqti: 20 Daqiqa**
+
+### Bog'liqliklarni Yangilash
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.10.0 && go mod tidy
+```
+
+### Shifrlash
+
+Versiya: v1.10.0
+
+`facades.Crypt` qo'shing:
+
+1. [config/app.go](https://github.com/goravel/goravel/blob/v1.10.x/config/app.go) faylidagi `providers` bandiga `&crypt.ServiceProvider{}` ni qo'shing;
+
+[Tafsilotlar uchun](../security/encryption.md)
+
+### Xeshlash
+
+Versiya: v1.10.0
+
+`facades.Hash` qo'shing:
+
+1. [config/app.go](https://github.com/goravel/goravel/blob/v1.10.x/config/app.go) faylidagi `providers` bandiga `&hash.ServiceProvider{}` ni qo'shing;
+
+2. [config/hashing.go](https://github.com/goravel/goravel/blob/v1.10.x/config/hashing.go) faylini qo'shing;
+
+[Tafsilotlar uchun](../security/hashing.md)
+
+### Marshrutlash uchun tezlik cheklovini qo'shish
+
+Versiya: v1.10.0
+
+[Tafsilotlar uchun](../the-basics/routing.md#Rate-Limiting)
+
+### HTTP ishga tushish rejimini optimallashtirish
+
+Versiya: v1.10.0
+
+1. `config/http.go` konfiguratsiyasini qo'shing, [Tafsilotlar uchun](https://github.com/goravel/goravel/blob/v1.10.x/config/http.go);
+2. `facades.Route.Run` metodi endi parametr o'tkazishni talab qilmaydi, sukut bo'yicha `http.host` va `http.port` dan foydalanadi (kodni o'zgartirish shart emas, orqaga mos keladi);
+3. `facades.Route.RunTLS` metodi endi parametr o'tkazishni talab qilmaydi, sukut bo'yicha `http.tls.host`, `http.tls.port`, `http.tls.ssl.cert` va `http.tls.ssl.key` dan foydalanadi, agar siz undan foydalanayotgan bo'lsangiz, kodni o'zgartirishingiz kerak;
+4. `facades.Route.RunTLSWithCert` metodini qo'shing, [Tafsilotlar uchun](../the-basics/routing.md#start-server);
+5. `app.url`, `app.host` ni `http.url`, `http.host` ga ko'chiring;
+
+### GRPC ishga tushish rejimini optimallashtirish
+
+Versiya: v1.10.0
+
+`facades.Grpc.Run` metodi endi parametr o'tkazishni talab qilmaydi, sukut bo'yicha `grpc.host` va `grpc.port` dan foydalanadi (kodni o'zgartirish shart emas, orqaga mos keladi);
+
+### Konsolga log chiqishini boshqarish uchun konfiguratsiya qo'shish
+
+Versiya: v1.10.0
+
+`config/logging.go` faylidagi `single`, `daily` kanallariga `print` konfiguratsiyasini qo'shing, u log konsolga chiqishini boshqarishi mumkin, [Tafsilotlar uchun](https://github.com/goravel/goravel/blob/v1.10.x/config/logging.go);
+
+### So'rovni o'zgartirish va yangi metodlar qo'shish
+
+Versiya: v1.10.0
+
+1. `Input` metodi faqat marshrut parametrlarini olishdan quyidagi tartibda ma'lumot olishga o'zgartirildi: `json`, `form`, `query`, `route`. Eslatma: `json` faqat bir o'lchovli ma'lumotlarni olishi mumkin, aks holda bo'sh qaytaradi;
+2. Asl `Input` metodini almashtirish uchun `Route` metodini qo'shing;
+3. `Query` va `Form` metodlarining sukut bo'yicha qiymati kerak emas deb o'zgartirildi;
+4. Quyidagicha yangi metodlar qo'shildi:
+
+| Metod | Harakat |
+| ---------- | ------------------------------------------------------------------------------------------------- |
+| Route | [Marshrut Qiymatini Olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| RouteInt | [Marshrut Qiymatini Olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| RouteInt64 | [Marshrut Qiymatini Olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| QueryInt | [So'rov Satridan Kirishni Olish](../the-basics/request.md#Retrieving-Input-From-The-Query-String) |
+| QueryInt64 | [So'rov Satridan Kirishni Olish](../the-basics/request.md#Retrieving-Input-From-The-Query-String) |
+| QueryBool | [So'rov Satridan Kirishni Olish](../the-basics/request.md#Retrieving-Input-From-The-Query-String) |
+| InputInt | [Kirish Qiymatini Olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| InputInt64 | [Kirish qiymatini olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| InputBool | [Kirish qiymatini olish](../the-basics/request.md#Retrieving-An-Input-Value) |
+| Json | [Json olish](../the-basics/request.md#Retrieving-Json) |
+
+### Navbat kechiktirilgan jo‘natishni qo‘llab-quvvatlaydi
+
+Versiya: v1.10.0
+
+`Delay` usulini qo‘shing, [Batafsil](../digging-deeper/queues.md#Delayed-Dispatching)
+
+### ORM-dagi Ulanish jadval prefiksi va birlikni o‘rnatishni qo‘llab-quvvatlaydi
+
+Versiya: v1.10.0
+
+1. `Model` jadval nomini ko‘rsatishni qo‘llab-quvvatlaydi, [Batafsil](../orm/getting-started.md#指定表名);
+2. `config/database.go` faylidagi `connection` uchun yangi kalitlarni qo‘shing:
+
+`prefix`: Jadval nomi uchun prefiksni o‘rnating;
+`singular`: Jadval nomi uchun birlik yoki ko‘plikni o‘rnating;
+
+[Batafsil](https://github.com/goravel/goravel/blob/v1.10.x/config/database.go)
+
+### docker-compose.yml faylini qo‘shing
+
+Versiya: v1.10.0
+
+Xizmatni quyidagi buyruq bilan tezda ishga tushirishingiz mumkin:
+
+```
+docker-compose build
+docker-compose up
+```
+
+### ORM-ni optimallashtirish
+
+Versiya: v1.10.0
+
+1. Quyidagi usullarni qo‘shing:
+
+| Funksiyalar | Harakat |
+| -------------- | ------------------------------------------------------------------------- |
+| FirstOr | [So‘rov yoki qayta chaqiruv orqali ma’lumotni qaytarish](#Query-one-line) |
+| FirstOrNew | [Mavjud yoki yangi modellarni olish](#Retrieving-Or-Creating-Models) |
+| FirstOrFail | [Topilmagan xatosi](#Not-Found-Error) |
+| UpdateOrCreate | [Yangilash yoki yaratish](#Update-or-create) |
+
+2. Ilgari shunga o‘xshash xato bildirilgan edi, ammo hozir qo‘llab-quvvatlanadi:
+
+```go
+query := facades.Orm.Query()
+query = query.Where()
+```
+
+### Migratsiya faylida bir nechta SQLni qo‘llab-quvvatlash
+
+Versiya: v1.10.0
+
+Ilgari migratsiya faylida faqat bitta SQL bayoni qo‘llab-quvvatlangan, ammo hozir bir nechta bayonlar qo‘llab-quvvatlanadi.
+
+### Fayl saqlash uchun minio drayverini qo‘shing
+
+Versiya: v1.10.0
+
+Minio konfiguratsiyasini qo‘shing, [Batafsil](https://github.com/goravel/goravel/blob/v1.10.x/config/filesystems.go).
+
+### contracts/http ga net/http ning holat xaritalashini qo‘shing
+
+Versiya: v1.10.0
+
+Siz `net/http` ni import qilmasdan, kontrollerda `http.StatusOK` kabi holat kodlaridan to‘g‘ridan-to‘g‘ri foydalanishingiz mumkin.
+
+[Batafsil](https://github.com/goravel/framework/blob/v1.10.0/contracts/http/status.go)
+
+### APP_KEY talab qilinadi
+
+Versiya: v1.10.0
+
+`.env` faylidagi `APP_KEY` talab qilinadigan qilib o‘zgartirildi, APP_KEY ni yaratish uchun buyruqni ishga tushirishingiz mumkin: `go run . artisan key:generate`.
+
+### Form Request ostidagi usullarga ctx parametrini qo‘shing
+
+Versiya: v1.10.0
+
+Form Request ostidagi usullarga `ctx http.Context` parametrini qo‘shing: `Rules`, `Messages`, `Attributes`, `PrepareForValidation`, bu sizga ko‘proq maxsus konfiguratsiyalarni amalga oshirish imkonini beradi.
+
+[Batafsil](../the-basics/validation.md#creating-form-requests)
+
+### facades.Auth.Parse payload qaytarishni qo‘shadi
+
+Versiya: v1.10.0
+
+`err := facades.Auth.Parse(ctx, token)` `payload, err := facades.Auth.Parse(ctx, token)` ga o‘zgartirildi, `payload` orqali siz quyidagilarni olishingiz mumkin:
+
+1. `Guard`: Joriy Guard;
+2. `Key`: Foydalanuvchi belgisi;
+3. `ExpireAt`: Muddati tugash vaqti;
+4. `IssuedAt`: Berilgan vaqt;
+
+[Batafsil](../security/authentication.md#parse-token)
+
+### ORM ning ba’zi usullari yangi qaytish qiymatlarini qo‘shadi
+
+Versiya: v1.10.0
+
+Quyidagi usullar ta’sirlangan qatorlar sonini olish uchun `*Result` qaytish qiymatini qo‘shadi:
+
+```go
+res, err := query.Delete(&user)
+res, err := query.Exec(fmt.Sprintf("DELETE FROM users where id = %d", user.ID))
+res, err := query.ForceDelete(&User{})
+res, err := query.Updates(User{Avatar: "avatar"})
+
+// Ta’sirlangan qatorlar
+num := res.RowsAffected
+```
diff --git a/uz_UZ/upgrade/v1.11.md b/uz_UZ/upgrade/v1.11.md
new file mode 100644
index 000000000..8f1bdbb70
--- /dev/null
+++ b/uz_UZ/upgrade/v1.11.md
@@ -0,0 +1,245 @@
+# v1.10 dan v1.11 ga yangilash
+
+[[toc]]
+
+## v1.11.3
+
+### Xatolik tuzatishlar 🐛
+
+- [Schedule'dagi panic tufayli jarayon to'xtatilishi muammosi](#the-problem-of-process-interruption-caused-by-panic-in-schedule)
+- [Schedule'dagi DailyAt har daqiqa bajarilishi muammosi](#the-problem-that-dailyat-in-schedule-will-be-executed-every-minute)
+
+## v1.11.2
+
+### Xatolik tuzatishlar 🐛
+
+- [Request.Input() va Request.Bind() ni bir vaqtda ishlatishda ma'lumot xatosi tuzatildi](#fix-the-data-error-of-using-request-input\(\)-and-request-bind\(\)-at-the-same-time)
+
+## v1.11.1
+
+### Qiziqarli yangi xususiyatlar 🎉
+
+- [Route resurs marshrutlash qo'shdi](#route-add-resource-routing)
+- [Request yangi usullar qo'shdi](#request-add-new-methods)
+- [Storage yangi usullar qo'shdi](#storage-add-new-methods)
+- [File yangi usullar qo'shdi](#file-add-new-methods)
+
+### Xatolik tuzatishlar 🐛
+
+- [Filesystem uchun noto'g'ri Windows yo'li xatosi tuzatildi](#fix-the-error-of-incorrect-windows-path-for-filesystem)
+- [Request uchun Header usulining panic xatosi tuzatildi](#fix-the-panic-of-the-header-method-for-request)
+
+## v1.11.0
+
+## Qiziqarli yangi xususiyatlar 🎉
+
+- [Orm model voqealari qo'shdi (1.11.0)](#orm-add-model-events)
+
+## Takomillashtirishlar 🚀
+
+- [Cache usullar qo'shdi va optimallashtirdi (1.11.0)](#cache-add-and-optimize-methods)
+- [Route Fallback marshrutini qo'llab-quvvatlaydi (1.11.0)](#route-supports-fallback-route)
+- [Orm yangi usullar qo'shdi (1.11.0)](#orm-adds-new-methods)
+- [facades.Config.Add() optimallashtirildi (1.11.0)](#optimize-facades-config-add)
+- [Sqlite haydovchi o'zgartirildi (1.11.0)](#change-sqlite-driver)
+- [contracts/http net/http usul xaritalashini qo'shdi (1.11.0)](#contracts-http-add-method-mapping-of-net-http)
+
+### O'zgarishlar 🛠
+
+- [Orm usullarni olib tashladi (1.11.0)](#_2-remove-deprecated-methods)
+
+### Xatolik tuzatishlar 🐛
+
+- Ba'zi holatlarda hesh konfiguratsiyasi amalga oshmasligi muammosi (1.11.0)
+- RateLimiter'dagi mavjud bo'lmagan thread xavfsizligi muammolari (1.11.0)
+
+## Yangilash bo'yicha ko'rsatma
+
+Iltimos, ushbu bo'limdagi mazmunga muvofiq freymvorkni bosqichma-bosqich yangilang.
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### 1. Bog'liqliklarni yangilash
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.11.0 && go mod tidy
+```
+
+### 2. Eskirgan usullarni olib tashlash
+
+```
+import (
+ "github.com/goravel/framework/database"
+ "github.com/goravel/framework/database/gorm"
+)
+
+// Eskirgan
+database.NewGormInstance()
+// Almashtirish (Eslatma: Bu usul tavsiya etilmaydi, iltimos uni ishlatmang)
+gorm.New()
+
+// Eskirgan
+facades.Orm.Query().Updates()
+// Almashtirish (Faqat usul nomini o'zgartirish kifoya, parametrlarni o'zgartirish shart emas)
+facades.Orm.Query().Update()
+
+// Update usuli qaytish qiymatini o'zgartiradi
+// Oldin
+err := facades.Orm.Query().Update()
+// Keyin
+res, err := facades.Orm.Query().Update()
+```
+
+## Yangi mazmun
+
+Ushbu bo'lim kod o'zgarishlarini o'z ichiga olmaydi, faqat takomillashtirishlar.
+
+### Orm model voqealari qo'shdi
+
+Versiya: v1.11.1
+
+Orm modellari bir nechta voqealarni ishga tushiradi, bu sizga model hayot tsiklining quyidagi bosqichlariga kirish imkonini beradi: `Retrieved`, `Creating`, `Created`, `Updating`, `Updated`, `Saving`, `Saved`, `Deleting`, `Deleted`, `ForceDeleting`, `ForceDeleted`.
+
+[Tafsilotlar uchun](../orm/getting-started.md#events)
+
+### Cache usullar qo'shdi va optimallashtirdi
+
+Versiya: v1.11.1
+
+#### Yangi usullar
+
+| Usullar | Harakat |
+| ----------- | ----------------------------------------------------------------------------------------------------- |
+| Kamaytirish | [Kamaytirish](../digging-deeper/cache.md#incrementing--decrementing-values) |
+| Oshirish | [Oshirish](../digging-deeper/cache.md#incrementing--decrementing-values) |
+| Qulflash | [Atomik qulf](../digging-deeper/cache.md#atomic-locks) |
+| Do'kon | [Bir nechta keshlash do'konlariga kirish](../digging-deeper/cache.md#accessing-multiple-cache-stores) |
+
+#### Optimallashtirilgan usullar
+
+`Get`, `GetBool`, `GetInt`, `GetInt64`, `GetString`, `Pull` endi standart qiymat berish shart emas (Orqaga moslik saqlangan).
+
+### Route Fallback marshrutini qo'llab-quvvatlaydi
+
+Versiya: v1.11.1
+
+Kiruvchi so'rovga boshqa marshrut mos kelmasa bajariladigan marshrutni belgilashingiz mumkin.
+
+```go
+facades.Route.Fallback(func(ctx http.Context) http.Response {
+ return ctx.Response().String(404, "topilmadi")
+})
+```
+
+### Orm yangi usullar qo'shdi
+
+Versiya: v1.11.1
+
+| Usul | Harakat |
+| ---------------------- | ----------------------------------------------------------------- |
+| db.Raw | [Xom ifodalar](../orm/getting-started.md#raw-expressions) |
+| LockForUpdate | [Pessimistik qulf](../orm/getting-started.md#pessimistic-locking) |
+| SharedLock | [Pessimistik qulf](../orm/getting-started.md#pessimistic-locking) |
+
+### facades.Config.Add() optimallashtirildi
+
+Versiya: v1.11.0
+
+`facades.Config.Add()` ning `configuration` parametri `map[string]any` dan `any` ga o'zgartirildi, bu konfiguratsiyani yanada moslashuvchan qiladi.
+
+[Tafsilotlar uchun](../getting-started/configuration.md#set-configuration)
+
+### Sqlite haydovchi o'zgartirildi
+
+`github.com/mattn/go-sqlite3` `CGO` ni talab qilganligi sababli, `CGO` talab qilmaydigan uchinchi tomon paketi bilan almashtirildi: `github.com/glebarez/go-sqlite`.
+
+### contracts/http net/http usul xaritalashini qo'shdi
+
+Versiya: v1.11.0
+
+`net/http` import qilish o‘rniga, `http.MethodGet` ni kontrollerda to‘g‘ridan-to‘g‘ri ishlatishingiz mumkin.
+
+[Tafsilot uchun](https://github.com/goravel/framework/blob/v1.11.0/contracts/http/method.go)
+
+### Marshrut Resurs Marshrutlash Qo‘shish
+
+Versiya: v1.11.1
+
+```go
+facades.Route.Resource("/resource", resourceController)
+```
+
+[Tafsilotlar uchun](../the-basics/routing.md#resource-routing)
+
+### So‘rov Yangi Usullarni Qo‘shadi
+
+Versiya: v1.11.1
+
+| Usul | Harakat |
+| --------- | ------------------------------------------------------------------------------------------------------------------- |
+| Hammasi | [Barcha kiritilgan ma’lumotlarni olish](../the-basics/request.md#retrieving-all-input-data) |
+| Xost | [So‘rov XOSTini olish](../the-basics/request.md#retrieving-the-request-host) |
+| So‘rovlar | [So‘rov qatori orqali kiritilgan ma’lumotni olish](../the-basics/request.md#retrieving-input-from-the-query-string) |
+
+`Form`, `Json` usullari tez orada bekor qilinadi, iltimos, o‘rniga `Input` dan foydalaning.
+
+### Saqlash Yangi Usullarni Qo‘shadi
+
+Versiya: v1.11.1
+
+| Usul | Harakat |
+| ------------ | --------------------------------------------------------------------------------------------- |
+| LastModified | [Faylning oxirgi o‘zgartirilgan vaqtini olish](../digging-deeper/filesystem.md#file-metadata) |
+| MimeType | [Faylning mime turini olish](../digging-deeper/filesystem.md#file-metadata) |
+
+### Fayl Yangi Usullarni Qo‘shadi
+
+Versiya: v1.11.1
+
+| Usul | Harakat |
+| ------------ | --------------------------------------------------------------------------------------------- |
+| LastModified | [Faylning oxirgi o‘zgartirilgan vaqtini olish](../digging-deeper/filesystem.md#file-metadata) |
+| MimeType | [Faylning mime turini olish](../digging-deeper/filesystem.md#file-metadata) |
+| Hajmi | [Fayl hajmini olish](../digging-deeper/filesystem.md#file-metadata) |
+
+### Fayl Tizimi Uchun Noto‘g‘ri Windows Yo‘li Xatosini Tuzatish
+
+Versiya: v1.11.1
+
+Windows tizimida noto‘g‘ri chiziqcha mavjud.
+
+### So‘rov Uchun Header Usuli Panikasini Tuzatish
+
+Versiya: v1.11.1
+
+`ctx.Request().Header( key: "token")` panikaga sabab bo‘ladi.
+
+### Request.Input() va Request.Bind() ni Bir Vaqtda Ishlatishda Ma’lumot Xatosini Tuzatish
+
+Versiya: v1.11.2
+
+`Request.Input()` `Request.Body` ni tozalaydi, agar shundan keyin `Request.Bind()` dan foydalansangiz, ma’lumotni to‘g‘ri ola olmaysiz.
+
+### Schedule’da Panika Sababli Jarayon To‘xtashi Muammosi
+
+Versiya: v1.11.3
+
+Panika sodir bo‘lganda Schedule jarayoni to‘xtaydi, barcha vazifalar ta’sirlanadi.
+
+### Schedule’dagi DailyAt Har Minut Bajarilishi Muammosi
+
+Versiya: v1.11.3
+
+`DailyAt` har minut bajarilishi muammosini tuzatish:
+
+```go
+func (kernel *Kernel) Schedule() []schedule.Event {
+ return []schedule.Event{
+ facades.Schedule.Call(func() {
+ fmt.Print("1")
+ }).DailyAt("18:00"),
+ }
+}
+```
diff --git a/uz_UZ/upgrade/v1.12.md b/uz_UZ/upgrade/v1.12.md
new file mode 100644
index 000000000..510ab2068
--- /dev/null
+++ b/uz_UZ/upgrade/v1.12.md
@@ -0,0 +1,329 @@
+# v1.11 dan v1.12 ga yangilash
+
+## v1.12.6
+
+### Xatolarni tuzatish 🐛
+
+- [JWT muammosini tuzatish](#fix-the-problem-of-jwt)
+
+## v1.12.5
+
+### Xatolarni tuzatish 🐛
+
+- [facades.Orm().Query().Load() muammosini tuzatish](#fix-the-problem-of-facades-orm-query-load)
+
+## v1.12.4
+
+### Xatolarni tuzatish 🐛
+
+- [Throttle middleware'ining panic otishi muammosi](#the-problem-of-the-throttle-middleware-throw-panic)
+
+## v1.12.3
+
+### Xatolarni tuzatish 🐛
+
+- [Windows ostida make:package buyrug'i muammosi](#the-problem-of-make-package-command-under-windows)
+
+## v1.12.2
+
+### Xatolarni tuzatish 🐛
+
+- [facades.Gate() ning nil qaytarishi muammosi](#the-problem-of-facades-gate-return-nil)
+
+## v1.12.1
+
+### Xatolarni tuzatish 🐛
+
+- [Windows ostida fayl yo'li sabab bo'lgan panic muammosi](#the-panic-problem-caused-by-file-path-under-windows)
+
+## v1.12.0
+
+### Hayajonli yangi xususiyatlar 🎉
+
+- [Service Container(1.12.0)](#service-container)
+- [Paketni Ishlab Chiqish(1.12.0)](#package-development)
+- [Carbon modulini qo'shish](#add-helpers-methods)
+
+## Yaxshilanishlar 🚀
+
+- [Artisan flag'iga yangi metodlar qo'shildi](#artisan-flag-adds-new-methods)
+- [Yordamchi metodlar qo'shildi](#add-helpers-methods)
+- [Bog'liqliklarni yangilash](#upgrade-dependencies)
+- [Migration'ga yangi metodlar qo'shildi](#migration-adds-new-methods)
+- [Ba'zi `make` buyruqlari kichik kataloglarni qo'llab-quvvatlaydi](#some-make-commands-support-subdirectories)
+
+## O'zgartirishlar 🛠
+
+- [Facades chaqiruv turini o'zgartirish(1.12.0)](#_3-modify-facades)
+- [Artisan Flag'ni optimallashtirish(1.12.0)](#_6-modify-flag-in-the-artisan-command-if-using)
+- [Filesystem moduli S3, OSS, COS, Minio uchun standart qo'llab-quvvatlashni bekor qiladi](#_7-filesystem-module-cancels-default-support-for-s3-oss-cos-minio)
+- [Cache moduli Redis uchun standart qo'llab-quvvatlashni bekor qiladi](#_8-cache-module-cancels-default-support-for-redis)
+- [Modeldagi CreatedAt, UpdatedAt turlarini o'zgartirish](#_9-change-the-type-of-createdat-updatedat-in-model)
+- [Validation moduli qoidasini optimallashtirish](#_10-optimize-the-rule-of-validation-module)
+
+## Yangilash bo'yicha ko'rsatma
+
+Iltimos, frameworkni ushbu bo'limdagi mazmunga muvofiq bosqichma-bosqich yangilang.
+
+**Taxminiy yangilash vaqti: 30 daqiqa**
+
+### 1. Bog'liqliklarni yangilash
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.12.0 && go mod tidy
+```
+
+`go mod tidy` ni ishga tushirgandan keyin xatolik bo'lsa, quyidagi yangilash bosqichlarini bajarganingizdan keyin xatolik hal bo'ladi.
+
+### 2. `bootstrap/app.go` ni o'zgartirish
+
+```go
+// Oldin
+app := foundation.Application{}
+
+// Keyin
+app := foundation.NewApplication()
+```
+
+### 3. facades.\* ni o'zgartirish
+
+| Oldin | Keyin |
+| --------------------- | ----------------------- |
+| `facades.Artisan` | `facades.Artisan()` |
+| `facades.Auth` | `facades.Auth()` |
+| `facades.Cache` | `facades.Cache()` |
+| `facades.Config` | `facades.Config()` |
+| `facades.Crypt` | `facades.Crypt()` |
+| `facades.Event` | `facades.Event()` |
+| `facades.Gate` | `facades.Gate()` |
+| `facades.Grpc` | `facades.Grpc()` |
+| `facades.Hash` | `facades.Hash()` |
+| `facades.Log` | `facades.Log()` |
+| `facades.Mail` | `facades.Mail()` |
+| `facades.Orm` | `facades.Orm()` |
+| `facades.Queue` | `facades.Queue()` |
+| `facades.RateLimiter` | `facades.RateLimiter()` |
+| `facades.Route` | `facades.Route()` |
+| `facades.Schedule` | `facades.Schedule()` |
+| `facades.Storage` | `facades.Storage()` |
+| `facades.Validation` | `facades.Validation()` |
+
+### 4. `app/providers/*` ni o'zgartirish
+
+Barcha fayllar uchun import qo‘shish:
+
+```go
+import (
+ "github.com/goravel/framework/contracts/foundation"
+)
+```
+
+`Register`, `Boot` metodlarining barchasiga `app foundation.Application` kirish parametrini qo‘shing:
+
+```go
+func (receiver *AppServiceProvider) Register(app foundation.Application) {}
+
+func (receiver *AppServiceProvider) Boot(app foundation.Application) {}
+```
+
+### 5. `app/config/app.go` faylini o‘zgartirish
+
+Importni o‘zgartirish:
+
+```go
+// Oldin
+"github.com/goravel/framework/contracts"
+
+"providers": []contracts.ServiceProvider{
+
+// Keyin
+"github.com/goravel/framework/contracts/foundation"
+
+"providers": []foundation.ServiceProvider{
+```
+
+### 6. Artisan buyrug‘idagi Flagni o‘zgartirish (Agar ishlatilsa)
+
+`[]command.Flag` dagi elementlarga `&command.StringFlag` turini qo‘shing:
+
+```go
+// Oldin
+func (receiver *VendorPublishCommand) Extend() command.Extend {
+ return command.Extend{
+ Category: "test",
+ Flags: []command.Flag{
+ {
+ Name: "test",
+ },
+ },
+ }
+}
+
+// Keyin
+func (receiver *VendorPublishCommand) Extend() command.Extend {
+ return command.Extend{
+ Category: "test",
+ Flags: []command.Flag{
+ &command.StringFlag{
+ Name: "test",
+ },
+ },
+ }
+}
+```
+
+### 7. Fayl Tizimi Moduli S3, OSS, COS, Minio uchun Standart Qo‘llab-quvvatlashni Bekor Qiladi
+
+Keraksiz uchinchi to‘plamlarni yuklashni kamaytirish, paket hajmini qisqartirish va kompilyatsiya samaradorligini oshirish maqsadida, Goravel har bir modul haydovchisini bosqichma-bosqich mustaqil kengaytma paketlariga ajirata boshlaydi. Ushbu yangilanishda, `Fayl Tizimi` moduli `S3`, `OSS`, `COS`, `Minio` haydovchilari uchun standart qo‘llab-quvvatlashni bekor qiladi va qo‘llab-quvvatlashni mustaqil kengaytma paketlariga o‘tkazadi.
+
+`config/filesystems.go::disks` dagi kalitlardan `local` va foydalanilayotgan haydovchilardan tashqarilarini olib tashlang:
+
+```go
+// O‘zgartirilgan
+"disks": map[string]any{
+ "local": map[string]any{
+ "driver": "local",
+ "root": "storage/app",
+ "url": config.Env("APP_URL", "").(string) + "/storage",
+ },
+},
+```
+
+Agar `local` dan tashqari boshqa haydovchilardan foydalanayotgan bo‘lsangiz, iltimos, o‘rnatish uchun tegishli haydovchi hujjatlariga murojaat qiling:
+
+| Haydovchi | Havola |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| S3 | [https://github.com/goravel/s3](https://github.com/goravel/s3) |
+| OSS | [https://github.com/goravel/oss](https://github.com/goravel/oss) |
+| COS | [https://github.com/goravel/cos](https://github.com/goravel/cos) |
+| Minio | [https://github.com/goravel/minio](https://github.com/goravel/minio) |
+
+### 8. Kesh Moduli Redis uchun Standart Qo‘llab-quvvatlashni Bekor Qiladi
+
+Agar foydalanmayotgan bo‘lsangiz, `config/cache.go::stores` dagi `redis` kalitini olib tashlang:
+
+```go
+// O‘zgartirilgan
+"stores": map[string]any{
+ "memory": map[string]any{
+ "driver": "memory",
+ },
+},
+```
+
+Agar `redis` haydovchisidan foydalanayotgan bo‘lsangiz, iltimos, o‘rnatish uchun `redis` haydovchi hujjatlariga murojaat qiling:
+
+| Haydovchi | Havola |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| Redis | [https://github.com/goravel/redis](https://github.com/goravel/redis) |
+
+### 9. Modeldagi CreatedAt, UpdatedAt maydonlarining turini o‘zgartirish (Agar ishlatilsa)
+
+API chiqishida vaqt turini yanada standart qilish maqsadida, `Model` dagi `CreatedAt`, `UpdatedAt` maydonlarining turi `time.Time` dan `carbon.DateTime` ga o‘zgartirildi. Agar ushbu ikki maydon uchun qo‘shimcha ishlov berishingiz bo‘lsa, asl `time.Time` turini `CreatedAt.ToStdTime()` metodi orqali olishingiz mumkin.
+
+### 10. Tekshirish Moduli Qoidasini Optimallashtirish (Agar ishlatilsa)
+
+Asl tekshirish qoidasidagi nol qiymatni tekshiring, masalan, agar qoida `date` deb belgilangan va `required` o‘rnatilmagan bo‘lsa, maydon bo‘sh yoki uzatilmagan taqdirda, tekshirish moduli maydon talab qilinayotganini bildiradi. Optimallashtirilgandan so‘ng, tekshirish moduli tekshiruvdan o‘tadi, bu foydalanishda yanada aniqroqdir. Agar tegishli tekshirishdan foydalanayotgan bo‘lsangiz, iltimos, yangilash kutilganidek amalga oshirilganligiga ishonch hosil qiling.
+
+### 11. Bog‘liqliklarni qayta o‘rnatish
+
+`go mod tidy` buyrug‘ini ishga tushiring
+
+## Funksiya Tavsifi
+
+### Xizmat Konteyneri
+
+Versiya: v1.12.0
+
+Goraveldagi barcha xizmatlar xizmat konteynerida ro‘yxatdan o‘tkazilgan bo‘lib, paket ishlab chiqish uchun kuchli qo‘llab-quvvatlashni ta’minlaydi, [Batafsil](../architecture-concepts/service-container.md)
+
+### Paketlarni ishlab chiqish
+
+Versiya: v1.12.0
+
+Paketlar Goravelga funksionallik qo‘shishning asosiy usuli bo‘lib, Goravel ekologiyasini boyitishi mumkin, [Batafsil](../digging-deeper/package-development.md)
+
+### Artisan Flag yangi Metodlar qo‘shadi
+
+Versiya: v1.12.0
+
+Turli xil `Flag` turlarini olish uchun Artisan moduliga metodlar qo‘shildi, [Batafsil](../digging-deeper/artisan-console.md#options)
+
+### Yordamchi Metodlar qo‘shish
+
+Versiya: v1.12.0
+
+`path` va `carbon` yordamchi metodlari qo‘shildi, loyihada yo‘l ma’lumotlarini osonlikcha olish va vaqt bilan ishlash imkoniyati mavjud, [Batafsil](../digging-deeper/helpers.md)。
+
+### Bog‘liqliklarni Yangilash
+
+Versiya: v1.12.0
+
+Yaxshi funksionallik qo‘llab-quvvatlashni ta’minlash uchun, Goravel bog‘liq bo‘lgan barcha paketlar versiyalari yangilandi.
+
+### Migratsiya yangi Metodlar qo‘shadi
+
+Versiya: v1.12.0
+
+| Buyruqlar | Harakat |
+| ------------------------------- | ---------------------------------------------------------------------------- |
+| migrate:fresh | Barcha jadvallarni o‘chirish va barcha migratsiyalarni qayta ishga tushirish |
+| migrate:refresh | Barcha migratsiyalarni qayta tiklash va qayta ishga tushirish |
+| migrate:reset | Barcha ma’lumotlar bazasi migratsiyalarini orqaga qaytarish |
+| migrate:status | Har bir migratsiyaning holatini ko‘rsatish |
+
+### Ba’zi `make` Buyruqlari Pastki Kataloglarni Qo‘llab-quvvatlaydi
+
+Versiya: v1.12.0
+
+| Buyruq | Yaratilgan fayl |
+| --------------------------------------------------- | --------------------------------------------------------------------------------- |
+| make:policy User/AuthPolicy | app/policies/User/auth_policy.go |
+| make:command Goravel/CleanCache | app/console/commands/Goravel/clean_cache.go |
+| make:model User/Phone | app/models/User/phone.go |
+| make:observer User/PhoneObserver | app/observers/User/phone_observer.go |
+| make:event User/GoravelEvent | app/events/User/goravel_event.go |
+| make:listener User/GoravelListen | app/listeners/User/goravel_listen.go |
+| make:controller User/AuthController | app/http/controllers/User/auth_controller.go |
+| make:middleware User/Auth | app/http/middleware/User/auth.go |
+| make:request User/Auth | app/http/requests/User/auth.go |
+| make:job Goravel/Job | app/jobs/Goravel/job.go |
+| make:rule User/Phone | app/rules/User/phone.go |
+
+### Windows ostida Fayl Yo'li Sabab Bo'lgan Panika Muammosi
+
+Versiya: v1.12.1
+
+Windows ostida `make` buyrug'i avtomatik ravishda papkalarni yaratganda teskari chiziqcha (backslash) sabab bo'lgan panika muammosini tuzatish.
+
+### facades.Gate() ning nil qaytarishi muammosi
+
+Versiya: v1.12.2
+
+`facades.Gate()` ning nil qaytarish muammosini tuzatish.
+
+### Windows ostida make:package Buyrug'i Muammosi
+
+Versiya: v1.12.3
+
+`make:package` buyrug'i tomonidan yaratilgan fayl Windows ostida noto'g'ri yo'lga ega.
+
+### Throttle Middleware ning Panika Otishi Muammosi
+
+Versiya: v1.12.4
+
+Throttle middleware ning panika otish muammosini tuzatish.
+
+### facades.Orm().Query().Load() muammosini tuzatish
+
+Versiya: v1.12.5
+
+Ba'zi hollarda `facades.Orm().Query().Load()` modelni to'g'ri yuklay olmasligi muammosini tuzatish.
+
+### JWT Muammosini Tuzatish
+
+Versiya: v1.12.6
+
+JWT Token muddati tugagan va yaroqsiz bo'lganda, muddat tugash xatosi qaytarilishi, birinchi navbatda yaroqsizlik xatosi qaytarilishi kutilgan muammoni tuzatish.
diff --git a/uz_UZ/upgrade/v1.13.md b/uz_UZ/upgrade/v1.13.md
new file mode 100644
index 000000000..cec702aa3
--- /dev/null
+++ b/uz_UZ/upgrade/v1.13.md
@@ -0,0 +1,509 @@
+# v1.12 dan v1.13 ga yangilash
+
+### Qiziqarli Yangi Imkoniyatlar 🎉
+
+- [Seeding](#seeding)
+- [Factories](#factories)
+- [Testing](#testing)
+- [Views](#views)
+
+## Yaxshilanishlar 🚀
+
+- [Golangning Standart Versiyasini 1.20 ga Yangilash](#upgrade-the-default-version-of-golang-to-1-20)
+- [Vazifa Rejalashtirish Gorizontal Masshtablashni Qo‘llab-quvvatlaydi](#task-scheduling-supports-scale-horizontally)
+- [Debug Usullarini Qo‘shish](#add-debug-methods)
+- [make:controller Buyrug‘i Parametr Qo‘shadi](#make-controller-command-adds-parameter)
+- [Javob Uchun Status Usulini Qo‘shish](#add-status-method-for-response)
+- [ORM uchun Sum va Cursor Usullarini Qo‘shish](#add-sum-and-cursor-methods-for-orm)
+- [Yo‘nalish Moduli Haydovchini Sozlashni Qo‘llab-quvvatlaydi](#the-route-module-supports-configure-driver)
+- [So‘rov Uchun InputArray Va InputMap Usullarini Qo‘shish](#add-inputarray-and-inputmap-methods-for-request)
+- [ORM Modeli Maxsus Ulanishni Qo‘llab-quvvatlaydi](#the-model-of-orm-supports-custom-connection)
+- [Fayl Tizimi Uchun Cloudinary Haydovchisini Qo‘shish](#add-cloudinary-driver-for-filesystem)
+- [Log Uchun Yangi Zanjir Usullarini Qo‘shish](#add-new-chain-methods-for-log)
+
+### v1.13.4
+
+- [Xizmatni Ishga Tushirish Muhit O‘zgaruvchilarini Qo‘llab-quvvatlaydi](#the-service-startup-supports-environment-variables)
+
+## O‘zgartirishlar Kerak Bo‘lgan O‘zgarishlar 🛠
+
+- [Standart Yukiangan Global HTTP Middlewareni Olib Tashlash](#_5-remove-the-global-http-middleware-loaded-by-default)
+- [Controller Qaytarishini Optimallashtirish](#_6-optimize-the-return-of-controller)
+- [facades.Route() dagi Group Usulining Parametrini O‘zgartirish](#_7-change-the-parameter-of-the-group-method-in-facades-route)
+- [facades.Cache() dagi Remember Va RememberForever Usullarini Optimallashtirish (Agar ishlatilsa)](#_8-optimize-remember-and-rememberforever-methods-in-facades-cache-if-using)
+- [access.NewAllowResponse va access.NewDenyResponse Paket Nomi O‘zgartiriladi (Agar ishlatilsa)](#_9-change-the-package-name-of-access-newallowresponse-and-access-newdenyresponse-if-using)
+- [Eskirgan Usullarni Olib Tashlash (Agar ishlatilsa)](#_10-remove-deprecated-methods-if-using)
+
+### Xatolarni Tuzatishlar 🐛
+
+- [facades.Auth().User() ni Tuzatish](#fix-facades-auth-user)
+- [Maxsus .env Yo‘li Ba‘zi Hollarda Ta‘sir Ko‘rsatmasligini Tuzatish](#fix-custom-env-path-does-not-take-effect-in-some-cases)
+- [JWT da ttl == 0 O‘rnatilganda Token Darhol Muddatini Tugatishini Tuzatish](#fix-token-expires-immediately-when-ttl-0-is-set-in-jwt)
+
+#### v1.13.2
+
+- [facades.Storage().Url() Windows Ostida Noto‘g‘ri Yo‘l Qaytarishini Tuzatish](#fix-facades-storage-url-returns-wrong-path-under-windows)
+- [Postgres Paroli Bo‘sh Bo‘lganda G‘ayritabiiy Ulanishni Tuzatish](#fix-abnormal-connection-when-the-postgres-password-is-empty)
+- [ORM ning Cursor Usulidan Foydalanilganda With Usulining Ishlamasligini Tuzatish](#fix-the-with-method-is-invalid-when-using-the-cursor-method-of-orm)
+
+#### v1.13.4
+
+- [Validatsiya Moduli Yo‘nalish Parametrlarini Tekshira Olmasligini Tuzatish](#fix-the-validation-module-cant-verify-the-route-params)
+- [Fiber Haydovchisi Fayl Qaytara Olmasligini Tuzatish](#fix-the-fiber-driver-cant-return-file)
+- [Fiber Haydovchisining Global Middleware Panicini Tuzatish](#fix-the-global-middleware-of-fiber-driver-panic)
+- [Fiber Haydovchisining ContentType Sozlamasi Gin Haydovchisidan Farq Qilishini Tuzatish](#fix-the-contenttype-setting-of-fiber-driver-is-different-from-gin-driver)
+
+#### v1.13.5
+
+- [Model Ulanishi Ishlamasligini Tuzatish](#fix-the-connection-of-model-does-not-work)
+- [Mock Log Xatosini Tuzatish](#fix-the-error-of-mock-log)
+
+#### v1.13.6 v1.13.7
+
+- [So‘rov Zanjirining Chiziqli Bo‘lmagan Bajarilishi Muammosini Tuzatish](#fix-the-problem-of-nonlinear-execution-of-query-chain)
+
+#### v1.13.8
+
+- [facades.Auth().Parse() Muammosini Tuzatish](#fix-the-problem-of-facades-auth-parse)
+- [facades.Orm().WithContext() Muammosini Tuzatish](#fix-the-problem-of-facades-orm-withcontext)
+- [Navbat Logi APP_DEBUG Tomonidan Nazorat Qilinadi](#the-queue-log-is-controlled-by-app-debug)
+
+#### v1.13.9
+
+- [Log Yangi Qator Chop Etish Muammosini Tuzatish](#fix-the-problem-of-the-new-line-print-of-log-is-incorrect)
+- [vendor:publish Buyrug‘i Katalogni Nashr Eta Olmasligi Muammosini Tuzatish](#fix-the-problem-of-the-vendor-publish-commabnd-can-not-publish-directory)
+
+### v1.13.10
+
+- [Log.Error dan Keyin Log.Info Chaqirilganda Izlar Tozalanmasligini Tuzatish](#fix-the-traces-do-not-cleaned-when-calling-log-info-after-log-error)
+- [ORM Hodisasining GetAttribute Noto‘g‘ri Ma’lumot Qaytarishini Tuzatish](#fix-the-getattribute-of-orm-event-returns-error-data)
+- [ORM uchun ToSql, ToRawSql Usullarini Qo‘shish](#add-tosql-torawsql-methods-for-orm)
+
+## Yangilash Qo‘llanmasi
+
+Iltimos, ushbu bo‘limdagi mazmunga muvofiq freymvorkni bosqichma-bosqich yangilang.
+
+**Taxminiy Yangilash Vaqti: 10 Daqiqa**
+
+### 1. Bog‘liqliklarni Yangilash
+
+`go.mod` faylidagi bog‘liqliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.13.9 && go get -u github.com/goravel/gin
+```
+
+### 2. Yangi Fayllarni Qo‘shish
+
+[tests](https://github.com/goravel/goravel/tree/v1.13.x/tests)
+
+[database/seeders/database_seeder.go](https://github.com/goravel/goravel/tree/v1.13.x/database/seeders/database_seeder.go)
+
+[app/providers/database_service_provider.go](https://github.com/goravel/goravel/tree/v1.13.x/app/providers/database_service_provider.go)
+
+### 3. Yangi Provayderlarni Ro‘yxatdan O‘tkazish
+
+Tartibga e‘tibor bering:
+
+```go
+import (
+ "github.com/goravel/framework/testing"
+ "github.com/goravel/gin"
+)
+
+// config/app.go
+"providers": []foundation.ServiceProvider{
+ ...
+ &validation.ServiceProvider{},
+ // Yangi
+ &testing.ServiceProvider{},
+ &providers.AppServiceProvider{},
+ ...
+ &providers.ValidationServiceProvider{},
+ // Yangi
+ &providers.DatabaseServiceProvider{},
+ // Yangi
+ &gin.ServiceProvider{},
+}
+```
+
+### 4. Konfiguratsiya Qo‘shish
+
+[config/http.go](https://github.com/goravel/goravel/tree/v1.13.x/config/http.go) ni o‘zgartiring
+
+```go
+import (
+ "github.com/goravel/framework/contracts/route"
+ "github.com/goravel/framework/facades"
+ ginfacades "github.com/goravel/gin/facades"
+)
+
+config.Add("http", map[string]any{
+ // HTTP Haydovchisi
+ "default": "gin",
+ // HTTP Haydovchilari
+ "drivers": map[string]any{
+ "gin": map[string]any{
+ "route": func() (route.Route, error) {
+ return ginfacades.Route("gin"), nil
+ },
+ },
+ },
+ ...
+}
+```
+
+[config/cors.go](https://github.com/goravel/goravel/tree/v1.13.x/config/cors.go) faylini o'zgartiring
+
+```go
+config.Add("cors", map[string]any{
+ ...
+ // Yangi
+ "paths": []string{"*"},
+ "allowed_methods": []string{"*"},
+ ...
+}
+```
+
+### 5. Sukut bo'yicha Yuklangan Global HTTP Middleware-ni O'chirish
+
+1. `tls` va `cors` middleware-lari sukut bo'yicha HTTP haydovchisiga integratsiya qilingan, shuning uchun `app/http/kernel.go` faylidagi `middleware.Cors()` va `middleware.Tls()` metodlarini o'chirish kerak.
+
+2. `app/providers/route_service_provider.go` faylidagi `facades.Route().GlobalMiddleware(http.Kernel{}.Middleware()...)` metodi `Register`dan `Boot`ga ko'chiriladi:
+
+```go
+package providers
+
+...
+
+type RouteServiceProvider struct {
+}
+
+func (receiver *RouteServiceProvider) Register(app foundation.Application) {
+}
+
+func (receiver *RouteServiceProvider) Boot(app foundation.Application) {
+ //HTTP middleware qo'shing
+ facades.Route().GlobalMiddleware(http.Kernel{}.Middleware()...)
+
+ receiver.configureRateLimiting()
+
+ routes.Web()
+}
+
+func (receiver *RouteServiceProvider) configureRateLimiting() {
+
+}
+```
+
+### 6. Controller Qaytaruvini Optimallashtirish
+
+`Controller` qaytish qiymati sifatida `http.Response`ni qo'shadi, `ctx.Response()` to'g'ridan-to'g'ri qaytarilishi mumkin, mantiqni silliqroq qilish uchun alohida `return` ishlatish shart emas.
+
+```go
+// Oldin
+func (r *UserController) Show(ctx http.Context) {
+ ctx.Response().Success().Json(http.Json{
+ "Hello": "Goravel",
+ })
+ return
+}
+
+// Keyin
+func (r *UserController) Show(ctx http.Context) http.Response {
+ return ctx.Response().Success().Json(http.Json{
+ "Hello": "Goravel",
+ })
+}
+```
+
+### 7. facades.Route() dagi Group Metodi Parametrini O'zgartirish
+
+`route.Route`ni `route.Router`ga o'zgartiring:
+
+```go
+// Oldin
+facades.Route().Group(func(route route.Route)
+
+// Keyin
+facades.Route().Group(func(route route.Router)
+```
+
+### 8. facades.Cache() dagi Remember Va RememberForever Metodlarini Optimallashtirish (Agar ishlatilsa)
+
+`callback` turi `func() any`dan `func() (any, error)`ga o'zgaradi:
+
+```go
+// Oldin
+Remember(key string, ttl time.Duration, callback func() any) (any, error)
+RememberForever(key string, callback func() any) (any, error)
+
+// Keyin
+Remember(key string, ttl time.Duration, callback func() (any, error)) (any, error)
+RememberForever(key string, callback func() (any, error)) (any, error)
+```
+
+### 9. access.NewAllowResponse va access.NewDenyResponse Paket Nomi O'zgartirish (Agar ishlatilsa)
+
+`/contracts/auth/access`ni `/auth/access`ga o'zgartiring:
+
+```go
+// Oldin
+import "github.com/goravel/framework/contracts/auth/access"
+
+access.NewAllowResponse()
+access.NewDenyResponse()
+
+// Keyin
+import "github.com/goravel/framework/auth/access"
+
+access.NewAllowResponse()
+access.NewDenyResponse()
+```
+
+### 10. Eskirgan Metodlarni O'chirish (Agar ishlatilsa)
+
+1. `ctx.Request().Form()` va `ctx.Request().Json()` metodlarini o'chiring, o'rniga `ctx.Request().Input()` metodidan foydalaning;
+
+2. `Log` maxsus haydovchisining `GetLevel`, `GetTime`, `GetMessage` metodlarini o'chiring, o'rniga `Level`, `Time`, `Message` metodlaridan foydalaning;
+
+3. `gorm.New` metodini o'chiring, bu metod `gorm` instansiyasini to'g'ridan-to'g'ri olish uchun ishlatiladi, endi tavsiya etilmaydi. agar kerak bo'lsa, o'rniga `gorm.NewGormImpl` metodidan foydalaning;
+
+## Funksiya Tavsifi
+
+### Urg'ochish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../database/seeding.md)
+
+### Zavodlar
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../orm/factories.md)
+
+### Sinov
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../testing/getting-started.md)
+
+### Ko‘rishlar
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../the-basics/views.md)
+
+### Sukut bo'yicha Golang Versiyasini 1.20 ga Yangilash
+
+Versiya: v1.13.1
+
+Golang 1.18 va 1.19 to'xtatilgan va framework shunga mos ravishda 1.20 ga yangilangan, [tafsilotlar uchun](https://endoflife.date/go). Agar 1.18 yoki 1.19 dan foydalanishni davom ettirmoqchi bo'lsangiz, `go.mod` dagi versiya raqamini o'zgartiring, ular hozirda to'liq mos keladi.
+
+### Vazifa Rejalashtirish Gorizontal Masshtabni Qo'llab-quvvatlaydi
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../digging-deeper/task-scheduling.md#running-tasks-on-one-server)
+
+### debug Metodlarini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../digging-deeper/helpers.md#debug)
+
+### make:controller Buyrug'iga Parametr Qo'shish
+
+Versiya: v1.13.1
+
+`make:controller` buyrug'iga `--resource` parametri qo'shildi, CURD strukturasini osongina yaratish mumkin:
+
+```
+go run . artisan make:controller --resource UserController
+```
+
+### Response uchun Status Metodini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../the-basics/response.md#custom-code)
+
+### Orm uchun Sum va Cursor Metodlarini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../orm/getting-started.md#facades-orm-query-facades-orm-transaction-available-functions)
+
+### Route Moduli Haydovchini Sozlashni Qo'llab-quvvatlaydi
+
+Versiya: v1.13.1
+
+Route moduli asosiy sukut bo'yicha haydovchisi Gin ni paketga ajratdi, u Goravel ga sozlash orqali kiritilishi mumkin. bu optimallashtirishdan so'ng, boshqa HTTP paketlarini Goravel ga kiritish uchun qulay kanal taqdim etadi, hozirda rasmiy ravishda ikkita HTTP paketi qo'llab-quvvatlanadi:
+
+| Haydovchi | Havola |
+| --------- | ---------------------------------------------------------------------------------------------------- |
+| Gin | [https://github.com/goravel/gin](https://github.com/goravel/gin) |
+| Fiber | [https://github.com/goravel/fiber](https://github.com/goravel/fiber) |
+
+### Request uchun InputArray Va InputMap Metodlarini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../the-basics/request.md#retrieving-an-input-value)
+
+### Orm Modeli Maxsus Ulanishni Qo'llab-quvvatlaydi
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../orm/getting-started.md#database-connections)
+
+### Filesystem uchun Cloudinary Haydovchisini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilot uchun](https://github.com/goravel/cloudinary)
+
+### Log uchun Yangi Chain Metodlarini Qo'shish
+
+Versiya: v1.13.1
+
+[Tafsilotlar uchun](../the-basics/logging.md#chain-methods)
+
+### facades.Auth().User() ni tuzatish
+
+Versiya: v1.13.1
+
+1. `facades.Auth().User(ctx, &user)` usuli ishlatilganda foydalanuvchi mavjud bo‘lmaganda xato chiqmasligi muammosini tuzatish.
+
+2. Asosiy kalbut `int` bo‘lmaganda ham `user` topilishi mumkin bo‘lgan muammoni tuzatish;
+
+### Ba‘zi hollarda maxsus .env yo‘li ishlamasligi muammosini tuzatish
+
+Versiya: v1.13.1
+
+Ba‘zi hollarda maxsus .env yo‘li ishlamasligi muammosini tuzatish.
+
+### JWT da ttl == 0 o‘rnatilganda token darhol muddati tugashi muammosini tuzatish
+
+Versiya: v1.13.1
+
+`ttl == 0` bo‘lganda token hech qachon muddati tugamasligini kutish.
+
+### facades.Storage().Url() Windows ostida noto‘g‘ri yo‘l qaytarishi muammosini tuzatish
+
+Versiya: v1.13.2
+
+[Muammo #263](https://github.com/goravel/goravel/issues/263)
+
+### Postgres paroli bo‘sh bo‘lganda g‘ayritabiiy ulanish muammosini tuzatish
+
+Versiya: v1.13.2
+
+[Muammo #270](https://github.com/goravel/goravel/issues/270)
+
+### Orm ning Cursor usuli ishlatilganda With usuli ishlamasligi muammosini tuzatish
+
+Versiya: v1.13.2
+
+[Muammo #253](https://github.com/goravel/goravel/issues/253)
+
+### Xizmatni ishga tushirish muhit o‘zgaruvchilarini qo‘llab-quvvatlaydi
+
+Versiya: v1.13.4
+
+[Muammo #265](https://github.com/goravel/goravel/issues/265)
+
+### Validatsiya moduli marshrut parametrlarini tekshira olmasligi muammosini tuzatish
+
+goravel/gin: v1.1.6
+
+goravel/fiber: v1.1.11
+
+[Muammo #294](https://github.com/goravel/goravel/issues/294)
+
+### Fiber haydovchisi fayl qaytara olmasligi muammosini tuzatish
+
+goravel/fiber: v1.1.11
+
+[Muammo #299](https://github.com/goravel/goravel/issues/299)
+
+### Fiber haydovchisining global middleware panikasi muammosini tuzatish
+
+goravel/fiber: v1.1.11
+
+[Muammo #300](https://github.com/goravel/goravel/issues/300)
+
+### Fiber haydovchisining ContentType sozlamasi Gin haydovchisidan farq qilishi muammosini tuzatish
+
+goravel/fiber: v1.1.11
+
+[Muammo #296](https://github.com/goravel/goravel/issues/296)
+
+### Modelning ulanishi ishlamasligi muammosini tuzatish
+
+goravel/framework: v1.13.5
+
+[Muammo #312](https://github.com/goravel/goravel/issues/312)
+
+### Mock Log xatosini tuzatish
+
+goravel/framework: v1.13.5
+
+[Muammo #320](https://github.com/goravel/goravel/issues/320)
+
+### So‘rov zanjirining chiziqli bo‘lmagan bajarilishi muammosini tuzatish
+
+goravel/framework: v1.13.6 v1.13.7
+
+[Muammo #341](https://github.com/goravel/goravel/issues/341)
+
+### facades.Auth().Parse() muammosini tuzatish
+
+goravel/framework: v1.13.8
+
+[Muammo #388](https://github.com/goravel/goravel/issues/388)
+
+### facades.Orm().WithContext() muammosini tuzatish
+
+goravel/framework: v1.13.8
+
+[Muammo #390](https://github.com/goravel/goravel/issues/390)
+
+### Navbat jurnali APP_DEBUG tomonidan boshqariladi
+
+goravel/framework: v1.13.8
+
+`APP_DEBUG=false` bo‘lganda `Debug` va `Info` darajalari chop etilmaydi
+
+[Muammo #389](https://github.com/goravel/goravel/issues/389)
+
+### Log ning yangi qator chop etilishi noto‘g‘ri bo‘lishi muammosini tuzatish
+
+goravel/framework: v1.13.9
+
+[Muammo #395](https://github.com/goravel/goravel/issues/395)
+
+### vendor:publish buyrug‘i katalogni nashr eta olmasligi muammosini tuzatish
+
+goravel/framework: v1.13.9
+
+[Muammo #345](https://github.com/goravel/goravel/issues/345)
+
+### Log.Error dan keyin Log.Info chaqirilganda izlar tozalanmasligi muammosini tuzatish
+
+goravel/framework: v1.13.10
+
+[Muammo #402](https://github.com/goravel/goravel/issues/402)
+
+### Orm hodisasi GetAttribute noto‘g‘ri ma’lumot qaytarishi muammosini tuzatish
+
+goravel/framework: v1.13.10
+
+[Muammo #405](https://github.com/goravel/goravel/issues/405)
+
+### ORM uchun ToSql, ToRawSql usullarini qo‘shish
+
+goravel/framework: v1.13.10
+
+[Muammo #411](https://github.com/goravel/goravel/issues/411)
diff --git a/uz_UZ/upgrade/v1.14.md b/uz_UZ/upgrade/v1.14.md
new file mode 100644
index 000000000..97d409dac
--- /dev/null
+++ b/uz_UZ/upgrade/v1.14.md
@@ -0,0 +1,542 @@
+# v1.13 dan v1.14 ga yangilash
+
+### Qiziqarli Yangi Imkoniyatlar 🎉
+
+- [Lokallashtirish](#localization)
+- [Oʻrnatuvchi](#installer)
+- [Cookie](#cookie)
+- [Sessiya](#session)
+
+### Takomillashtirishlar 🚀
+
+- [Gin va Fiber drayverlarida body_limit va header_limit ni sozlashni qoʻllab-quvvatlash](#support-for-setting-body-limit-and-header-limit-in-gin-and-fiber-drivers)
+- [Log yangi metodlar qoʻshadi](#log-adds-new-methods)
+- [Orm yangi metodlar qoʻshadi](#orm-adds-new-methods)
+- [Console yangi metodlar qoʻshadi](#console-adds-new-methods)
+- [Response yangi metodlar qoʻshadi](#response-adds-new-methods)
+- [Build buyrugʻini qoʻshish](#add-build-command)
+- [Yordamchi metodlarni qoʻshish](#add-helper-methods)
+- [Redis drayveri TLS ni qoʻllab-quvvatlaydi](#redis-driver-supports-tls)
+
+### Muhim Oʻzgarishlar 🛠
+
+- [Tekshiruv muvaffaqiyatsiz boʻlsa, Validation maʼlumotlarni bogʻlamaydi](#validation-will-not-bind-data-if-validation-fails)
+- [Testing moduli uchun yangi metodlar qoʻshish va metodlarni oʻzgartirish](#add-new-methods-and-modify-methods-for-testing-module)
+- [Mail modulining Queue metodini optimallashtirish](#optimize-the-queue-method-of-mail)
+- [Auth moduli ctx ning sozlash metodini optimallashtirish](#optimize-the-setting-method-of-the-auth-module-ctx)
+- [Mock fasadlar usulini optimallashtirish](#optimize-the-way-of-mock-facades)
+- [Framework Orm modeli json tegnini qoʻshadi](#framework-orm-model-adds-json-tag)
+
+### v1.14.1
+
+- [Gin drayverida sessiya muvaffaqiyatli oʻrnatilmayotgan muammoni tuzatish](#fix-the-session-is-not-set-successfully-in-the-gin-driver)
+- [Lokallashtirish modulida til faylini oʻqib boʻlmayotgan muammoni tuzatish](#fix-the-language-file-cannot-be-read-in-the-localization-module)
+
+### v1.14.2
+
+- [Rasm va fayl tekshiruvi muvaffaqiyatsiz boʻlgan Validation tekshiruvini tuzatish](#fix-validation-verification-of-image-and-file-failed)
+- [goravel/gin drayveri tomonidan oʻrnatilgan cookie Expires ning yaroqsiz boʻlgan muammosini tuzatish](#fix-the-cookie-expires-set-by-the-goravel-gin-driver-is-invalid)
+
+### v1.14.3
+
+Tegishli paketlarni yangilash: goravel/gin: v1.2.2, goravel/fiber: v1.2.2
+
+- [Validation slice ni bogʻlay olmayotgan muammoni tuzatish](#fix-validation-cannot-bind-slice)
+- [Validation carbon ni bogʻlashni qoʻllab-quvvatlaydi](#validation-supports-bind-carbon)
+
+### v1.14.4
+
+Tegishli paketlarni yangilash: goravel/gin: v1.2.3
+
+- [Sessiya konkurent muammosini tuzatish](#fix-session-concurrent-problem)
+- [Gin Sessiya same_site ni yaroqsiz oʻrnatayotgan muammoni tuzatish](#fix-gin-sets-session-same_site-invalid)
+
+### v1.14.5
+
+Tegishli paketlarni yangilash: goravel/gin: v1.2.4, goravel/fiber: v1.2.3
+
+- [Route uchun Shutdown metodini qoʻshish](#add-shutdown-method-for-route)
+
+### v1.14.7
+
+Tegishli paketlarni yangilash: goravel/gin: v1.2.5, goravel/fiber: v1.2.4
+
+- [HTTP ning ctx.WithValue metodini optimallashtirish](#optimize-the-ctx-withvalue-method-of-http)
+
+### v1.14.8
+
+- [Tinglovchini roʻyxatdan oʻtkazishdagi ziddiyat muammosini tuzatish](#fix-the-problem-of-conflicting-listener-registration)
+
+### v1.14.9
+
+- [Maxsus Log drayveri console takroriy chop etish muammosini tuzatish](#fix-the-problem-of-custom-log-driver-console-repeatedly-printing)
+- [HTTP JSON Soʻrovi koʻp darajali tuzilishni oʻz ichiga olganda maʼlumotlarni bogʻlash xatosi muammosini tuzatish](#fix-the-problem-of-data-binding-error-when-http-json-request-contains-multi-level-structure)
+
+## Yangilash Qoʻllanmasi
+
+Goravel v1.14 Golang 1.21 asosida ishlab chiqilgan va sinovdan oʻtkazilgan boʻlib, odatda boshqa pastroq Golang versiyalari bilan mos keladi. Iltimos, ushbu boʻlimdagi mazmunga muvofiq freymvorkni bosqichma-bosqich yangilang.
+
+**Taxminiy Yangilash Vaqti: 10 Daqiqa**
+
+### 1. Bogʻliqliklarni Yangilash
+
+```
+go get -u github.com/goravel/framework@v1.14.7
+
+// Agar gin ishlatilsa
+go get -u github.com/goravel/gin@v1.2.5
+
+// Agar fiber ishlatilsa
+go get -u github.com/goravel/fiber@v1.2.4
+
+// Agar redis ishlatilsa
+go get -u github.com/goravel/redis@v1.2.1
+
+// Agar s3 ishlatilsa
+go get -u github.com/goravel/s3@v1.2.0
+
+// Agar oss ishlatilsa
+go get -u github.com/goravel/oss@v1.2.0
+
+// Agar cos ishlatilsa
+go get -u github.com/goravel/cos@v1.2.0
+
+// Agar minio ishlatilsa
+go get -u github.com/goravel/minio@v1.2.0
+
+// Agar cloudinary ishlatilsa
+go get -u github.com/goravel/cloudinary@v1.2.0
+
+go mod tidy
+```
+
+### 2. Konfiguratsiya Elementlarini Qoʻshish
+
+1. `config/app.go` ga lokallashtirish moduli konfiguratsiya elementlarini qoʻshing:
+
+```go
+"locale": "en",
+"fallback_locale": "en",
+"providers": []foundation.ServiceProvider{
+ ...
+ &session.ServiceProvider{},
+ &translation.ServiceProvider{},
+ ...
+}
+```
+
+2. Agar `session` funksiyasidan foydalanmoqchi boʻlsangiz, [config/session.go](https://github.com/goravel/goravel/blob/master/config/session.go) faylini qoʻshing;
+
+### 3) Agar Validation moduli ishlatilsa
+
+Maʼlumotlar tekshiruvi muvaffaqiyatsiz boʻlsa ham, bogʻlangan qiymatni oʻqishga urinayotganingizni tasdiqlang. Agar shunday boʻlsa, mantiqni optimallashtirishingiz kerak, chunki yangilashdan keyin qiymat boʻsh boʻladi. Qarang: [Tekshiruv muvaffaqiyatsiz boʻlsa, Validation maʼlumotlarni bogʻlamaydi](#validation-will-not-bind-data-if-validation-fails).
+
+### 4. Agar Testing moduli ishlatilsa
+
+`Clear`, `Image` metodlaridan foydalanayotganingizni tekshiring, agar shunday boʻlsa, mos ravishda oʻzgartirishingiz kerak: [Testing moduli uchun yangi metodlar qoʻshish va metodlarni oʻzgartirish](#add-new-methods-and-modify-methods-for-testing-module)
+
+### 5. agar Mail moduli ishlatilsa
+
+`Queue` metodidan foydalanayotganingizni tekshiring, agar shunday boʻlsa, mos ravishda oʻzgartirishingiz kerak: [Mail modulining Queue metodini optimallashtirish](#optimize-the-queue-method-of-mail)
+
+### 6. Agar Auth moduli ishlatilsa
+
+Mos ravishda oʻzgartirishingiz kerak: [Auth moduli ctx ning sozlash metodini optimallashtirish](#optimize-the-setting-method-of-the-auth-module-ctx)
+
+### 7. Agar mock fasadlar ishlatilsa
+
+Mos ravishda oʻzgartirishingiz kerak: [Mock fasadlar usulini optimallashtirish](#optimize-the-way-of-mock-facades)
+
+### 8. Agar framework Orm modeli ishlatilsa va maʼlumotlar toʻgʻridan-toʻgʻri endpoint orqali qaytarilsa
+
+Mos ravishda oʻzgartirishingiz kerak: [Framework Orm modeli json tegnini qoʻshadi](#framework-orm-model-adds-json-tag)
+
+## Imkoniyatlar Tavsifi
+
+### Mahalliylashtirish
+
+Versiya: v1.14.0
+
+[Hujjatni ko‘rish](../digging-deeper/localization.md)
+
+### O‘rnatuvchi
+
+Versiya: v1.14.0
+
+O‘rnatuvchi sizga yangi Goravel loyihasini oson yuklab olish va ishga tushirish imkonini beradi.
+
+[Hujjatni ko‘rish](http://github.com/goravel/installer)
+
+### Cookie
+
+Versiya: v1.14.0
+
+[So‘rov hujjatini ko‘rish](../the-basics/request.md#cookie)
+
+[Javob hujjatini ko‘rish](../the-basics/response.md#cookie)
+
+### Seans
+
+Versiya: v1.14.0
+
+[Hujjatni ko‘rish](../the-basics/session.md)
+
+### Gin va Fiber haydovchilarida body_limit va header_limit ni o‘rnatish uchun qo‘llab-quvvatlash
+
+Versiya: v1.14.0
+
+HTTP haydovchilari body_limit ni o‘rnatish orqali tana hajmini cheklashni qo‘llab-quvvatlaydi, qarang: [goravel/gin](https://github.com/goravel/gin/blob/c9d7706a6a04c05c8c33af5c97877a1ad2ea6362/README.md?plain=1#L54) va [goravel/fiber](https://github.com/goravel/fiber/blob/aa63ab657cd2b371fcda4df0090a41226f6c0704/README.md?plain=1#L56).
+
+### Log yangi usullarni qo‘shadi
+
+Versiya: v1.14.0
+
+| Usul | Tavsif |
+| ----------- | ------------------------------------------------------ |
+| `Stack` | Bir vaqtning o‘zida bir nechta kanallardan foydalanish |
+| `Channel` | Aniq bir kanalni belgilash |
+| `WithTrace` | Izni chop etish |
+
+[Hujjatni ko‘rish](../the-basics/logging.md#write-to-a-specific-channel)
+
+### Orm yangi usullarni qo‘shadi
+
+Versiya: v1.14.0
+
+`WhereIn`, `OrWhereIn`, `OrWhereNotIn`, `WhereNotIn`, `WhereBetween`, `WhereNotBetween`, `WhereNull`, `OrWhereNull`, `OrderByDesc`, `OrderBy`, `InRandomOrder`, `Exists` usullarini qo‘shish.
+
+### Console yangi usullarni qo‘shadi
+
+Versiya: v1.14.0
+
+[Hujjatni ko‘rish](../digging-deeper/artisan-console.md#prompting-for-input)
+
+### Response yangi usullarni qo‘shadi
+
+Versiya: v1.14.0
+
+[Hujjatni ko‘rish](../the-basics/response.md#no-content)
+
+### Build buyrug‘ini qo‘shish
+
+Versiya: v1.14.0
+
+Goravel loyihasi quyidagi buyruq orqali kompilyatsiya qilinishi mumkin: `go run . artisan build`.
+
+[Hujjatni ko‘rish](../getting-started/compile.md#compile-command)
+
+### Yordamchi usullarni qo‘shish
+
+Versiya: v1.14.0
+
+- [Str](../digging-deeper/strings.md)
+- [Map](../digging-deeper/helpers.md#maps)
+- [Color](../digging-deeper/color.md)
+- [Convert](../digging-deeper/helpers.md#convert)
+- [Collect](../digging-deeper/helpers.md#collect)
+
+### Redis haydovchisi TLS ni qo‘llab-quvvatlaydi
+
+Versiya: v1.14.0
+
+[Hujjatni ko‘rish](https://github.com/goravel/redis)
+
+### Tekshiruv muvaffaqiyatsiz bo‘lsa, ma’lumotlarni bog‘lamaydi
+
+Versiya: v1.14.0
+
+Ilgari quyidagi usullarni chaqirganda, xatolik qaytarilgan bo‘lsa ham, `userRequest` qiymatni bog‘lab qo‘ygan edi. Yangilashdan so‘ng, u endi bog‘lamaydi.
+
+```go
+var userRequest requests.UserRequest
+errors, err := ctx.Request().ValidateRequest(&userRequest)
+
+// yoki
+validator, err := validation.Make(***)
+err = validator.Bind(&userRequest)
+```
+
+### Testing moduli uchun yangi usullarni qo‘shish va usullarni o‘zgartirish
+
+Versiya: v1.14.0
+
+1. [Fresh](../testing/getting-started.md#refresh-database) usulini qo‘shish;
+2. `Clear` usulini [Stop](../testing/getting-started.md#uninstall-image) usuliga o‘zgartirish;
+3. `Image` usuli `ExposedPorts` o‘zgaruvchisini qo‘shadi va `Timeout` o‘zgaruvchisini olib tashlaydi;
+
+```go
+database, err := facades.Testing().Docker().Database()
+database.Image(testingcontract.Image{
+ Repository: "mysql",
+ Tag: "5.7",
+ Env: []string{
+ "MYSQL_ROOT_PASSWORD=123123",
+ "MYSQL_DATABASE=goravel",
+ },
+ -- Timeout: 1000,
+ ++ ExposedPorts: []string{"3306"},
+})
+```
+
+### Mail modulining Queue usulini optimallashtirish
+
+Versiya: v1.14.0
+
+`Queue` usulining kirish parametri `queue *mail.Queue` dan `queue ...mail.Queue` ga o‘zgartirildi.
+
+```diff
+-- facades.Mail().Queue(nil)
+++ facades.Mail().Queue()
+
+-- facades.Mail().Queue(&mail.Queue{})
+++ facades.Mail().Queue(mail.Queue{})
+```
+
+### Auth moduli ctx ning sozlash usulini optimallashtirish
+
+Versiya: v1.14.0
+
+Ilgari `Parse`, `User`, `Login`, `LoginUsingID`, `Refresh`, `Logout` usullarini chaqirganda, `ctx` ni uzatish kerak edi. Yangilashdan so‘ng, `ctx` ni uzatish shart emas, uni to‘g‘ridan-to‘g‘ri `facades.Auth(ctx)` da o‘rnatishingiz mumkin.
+
+```diff
+-- facades.Auth().Parse(ctx, token)
+++ facades.Auth(ctx).Parse(token)
+
+-- facades.Auth().User(ctx, &user)
+++ facades.Auth(ctx).User(&user)
+
+-- facades.Auth().Login(ctx, &user)
+++ facades.Auth(ctx).Login(&user)
+
+-- facades.Auth().LoginUsingID(ctx, id)
+++ facades.Auth(ctx).LoginUsingID(id)
+
+-- facades.Auth().Refresh(ctx)
+++ facades.Auth(ctx).Refresh()
+
+-- facades.Auth().Logout(ctx)
+++ facades.Auth(ctx).Logout()
+```
+
+### Mock facades usulini optimallashtirish
+
+Versiya: v1.14.0
+
+```diff
+import github.com/goravel/framework/testing/mock
+
+++ mockFactory := mock.Factory()
+
+-- app := mock.App()
+++ app := mockFactory.App()
+
+-- artisan := mock.Artisan()
+++ artisan := mockFactory.Artisan()
+
+-- auth := mock.Auth()
+++ auth := mockFactory.Auth()
+
+-- artisan := mock.Artisan()
+++ artisan := mockFactory.Artisan()
+
+-- cache, driver, lock := mock.Cache()
+++ cache := mockFactory.Cache()
+++ driver := mockFactory.CacheDriver()
+++ lock := mockFactory.CacheLock()
+
+-- config := mock.Config()
+++ config := mockFactory.Config()
+
+-- crypt := mock.Crypt()
+++ crypt := mockFactory.Crypt()
+
+-- event, task := mock.Event()
+++ event := mockFactory.Event()
+++ event := mockFactory.EventTask()
+
+-- gate := mock.Gate()
+++ gate := mockFactory.Gate()
+
+-- grpc := mock.Grpc()
+++ grpc := mockFactory.Grpc()
+
+-- hash := mock.Hash()
+++ hash := mockFactory.Hash()
+
+-- mock.Log()
+++ mockFactory.Log()
+
+-- mail := mock.Mail()
+++ mail := mockFactory.Mail()
+
+-- orm, query, transaction, association := mock.Orm()
+++ orm := mockFactory.Orm()
+++ query := mockFactory.OrmQuery()
+++ transaction := mockFactory.OrmTransaction()
+++ association := mockFactory.OrmAssociation()
+
+-- queue, task := mock.Queue()
+++ queue := mockFactory.Queue()
+++ task := mockFactory.QueueTask()
+
+-- rateLimiter := mock.RateLimiter()
+++ rateLimiter := mockFactory.RateLimiter()
+
+-- storage, driver, file := mock.Storage()
+++ storage := mockFactory.Storage()
+++ driver := mockFactory.StorageDriver()
+++ file := mockFactory.StorageFile()
+
+-- seeder := mock.Seeder()
+++ seeder := mockFactory.Seeder()
+
+-- validation, validator, errors := mock.Validation()
+++ validation := mockFactory.Validation()
+++ validator := mockFactory.ValidationValidator()
+++ errors := mockFactory.ValidationErrors()
+
+-- view := mock.View()
+++ view := mockFactory.View()
+```
+
+### Framework Orm modeli json tegini qo‘shadi
+
+Versiya: v1.14.0
+
+Agar siz freymvorkning Orm modelidan foydalanayotgan bo‘lsangiz va ma’lumotlarni to‘g‘ridan-to‘g‘ri endpoint orqali qaytarmoqchi bo‘lsangiz, eski modelga ko‘ra yangi model yaratib, eskisini almashtirishingiz yoki frontend json tegi bo‘yicha maydon nomini o‘zgartirishi kerak.
+
+```go
+type Model struct {
+ -- ID uint `gorm:"primaryKey"`
+ ++ ID uint `gorm:"primaryKey" json:"id"`
+ Timestamps
+}
+
+type SoftDeletes struct {
+ -- DeletedAt gorm.DeletedAt `gorm:"column:deleted_at"`
+ ++ DeletedAt gorm.DeletedAt `gorm:"column:deleted_at" json:"deleted_at"`
+}
+
+type Timestamps struct {
+ -- CreatedAt carbon.DateTime `gorm:"autoCreateTime;column:created_at"`
+ -- UpdatedAt carbon.DateTime `gorm:"autoUpdateTime;column:updated_at"`
+ ++ CreatedAt carbon.DateTime `gorm:"autoCreateTime;column:created_at" json:"created_at"`
+ ++ UpdatedAt carbon.DateTime `gorm:"autoUpdateTime;column:updated_at" json:"updated_at"`
+}
+```
+
+### Gin haydovchisida sessiya muvaffaqiyatli o‘rnatilmagan muammosini tuzatish
+
+goravel/framework: v1.14.1
+
+### Lokalizatsiya modulida til faylini o‘qib bo‘lmaydigan muammosini tuzatish
+
+goravel/framework: v1.14.1
+
+### Tasdiqlash (Validation) tasvir va fayl tekshiruvi muvaffaqiyatsiz tugagan muammosini tuzatish
+
+goravel/framework: v1.14.2
+
+goravel/gin: v1.2.2
+
+goravel/fiber: v1.2.2
+
+[Muammo #450](https://github.com/goravel/goravel/issues/450)
+
+### goravel/gin haydovchisi tomonidan o‘rnatilgan cookie Expires yaroqsiz bo‘lgan muammosini tuzatish
+
+goravel/gin: v1.2.2
+
+### Tasdiqlash (Validation) kesim (slice) bog‘lay olmaydigan muammosini tuzatish
+
+goravel/framework: v1.14.3
+
+```go
+type User struct {
+ Tags []string `form:"tags" json:"tags"`
+}
+```
+
+### Tasdiqlash (Validation) carbon bog‘lashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.14.3
+
+```go
+// Carbon maydonini aniqlash
+type User struct {
+ Date carbon.Carbon `form:"date" json:"date"`
+}
+var user requests.User
+
+// ValidateRequest yordamida ma’lumotlarni bog‘lash
+errors, err := ctx.Request().ValidateRequest(&user)
+
+// yoki Validate yordamida ma’lumotlarni bog‘lash
+validator, err := ctx.Request().Validate(map[string]string{
+ "date": "required|date",
+})
+err := validator.Bind(&user)
+
+// sana vaqtni olish
+user.Date.ToDateTimeString()
+```
+
+### Sessiya konkurent muammosini tuzatish
+
+goravel/framework: v1.14.4
+
+Sessiya juda yuqori konkurentlikda bo‘lganda, sessiyani o‘qish va yozishda ziddiyat yuzaga kelishi mumkin
+
+### Gin Sessiya same_site parametrini noto‘g‘ri o‘rnatgan muammosini tuzatish
+
+goravel/gin: v1.2.3
+
+[Muammo #455](https://github.com/goravel/goravel/issues/455)
+
+### Route uchun Shutdown metodini qo‘shish
+
+goravel/framework: v1.14.5
+
+goravel/gin: v1.2.4
+
+goravel/fiber: v1.2.3
+
+[Hujjatni ko‘rish](../the-basics/routing.md#close-http-https-server)
+
+### HTTP ning ctx.WithValue metodini optimallashtirish
+
+goravel/framework: v1.14.7
+
+goravel/gin: v1.2.5
+
+goravel/fiber: v1.2.4
+
+`ctx.WithValue` metodining `kaliti` faqat `string` turini qo‘llab-quvvatlashdan `har qanday` (`any`) turini qo‘llab-quvvatlashga o‘zgartirildi
+
+```go
+ctx.WithValue("Hello", "world")
+ctx.WithValue(1, "hi")
+
+var key struct{}
+ctx.WithValue(key, "hola")
+```
+
+### Eshituvchini ro‘yxatdan o‘tkazish ziddiyati muammosini tuzatish
+
+goravel/framework: v1.14.8
+
+Bir nechta hodisalar bir xil eshituvchidan foydalansa, ro‘yxatdan o‘tkazishda eshituvchi ziddiyati haqida ogohlantirish chiqariladi.
+
+[Muammo #523](https://github.com/goravel/goravel/issues/523)
+
+### Maxsus Log haydovchisi konsolida takroriy chop etish muammosini tuzatish
+
+goravel/framework: v1.14.9
+
+[Muammo #531](https://github.com/goravel/goravel/issues/531)
+
+### HTTP JSON So‘rovi ko‘p darajali tuzilishni o‘z ichiga olganda ma’lumotlarni bog‘lash xatosi muammosini tuzatish
+
+goravel/framework: v1.14.9
+
+[Muammo #533](https://github.com/goravel/goravel/issues/533)
diff --git a/uz_UZ/upgrade/v1.15.md b/uz_UZ/upgrade/v1.15.md
new file mode 100644
index 000000000..346b3dc5f
--- /dev/null
+++ b/uz_UZ/upgrade/v1.15.md
@@ -0,0 +1,849 @@
+# v1.14 dan v1.15 ga yangilash
+
+## Qiziqarli yangi xususiyatlar 🎉
+
+- [Migratsiya Go tilidagi migratsiyadan foydalanishni qo‘llab-quvvatlaydi](#migration-supports-using-go-language-migration)
+- [Testlash HTTP testlashni qo‘llab-quvvatlaydi](#testing-supports-http-testing)
+
+## Yaxshilanishlar 🚀
+
+- [HTTP oqimni qaytarishni qo‘llab-quvvatlaydi](#http-supports-return-stream)
+- [HTTP vaqt chegarasini o‘rnatishni qo‘llab-quvvatlaydi](#http-supports-setting-timeout)
+- [HTTP maxsus tiklash usulini o‘rnatishni qo‘llab-quvvatlaydi](#http-supports-setting-custom-recovery-method)
+- [So‘rov Filterni sozlashni qo‘llab-quvvatlaydi](#request-supports-configure-filter)
+- [So‘rov BindQuery usulini qo‘shadi](#request-adds-the-bindquery-method)
+- [Tekshirish Regex qoidalarini qo‘llab-quvvatlaydi](#validation-supports-regex-rules)
+- [Jadval log chiqishini boshqarishni qo‘llab-quvvatlaydi](#schedule-supports-control-log-output)
+- [Jadval Shutdown usulini qo‘shadi](#schedule-adds-the-shutdown-method)
+- [Pochta Mailable shablonni qo‘llab-quvvatlaydi](#mail-supports-mailable-template)
+- [Xato log chiqishidagi iz o‘tishni qo‘llab-quvvatlaydi](#the-trace-in-error-log-output-supports-jumping)
+- [Log Context ichidagi kalit-qiymat juftliklarini chop etishni qo‘llab-quvvatlaydi](#log-supports-printing-key-value-pairs-in-context)
+- [Ma’lumotlar bazasiga ulanish uchun DSN ni bevosita o‘rnatishni qo‘llab-quvvatlaydi](#support-directly-setting-dsn-to-connect-to-the-database)
+- [Orm ning Create usuli map yordamida yaratishni qo‘llab-quvvatlaydi](#the-create-method-of-orm-supports-using-map-to-create)
+- [Orm sozlash elementlarini qo‘shadi](#orm-adds-configuration-items)
+- [Orm Restore usulini qo‘shadi](#orm-adds-restore-method)
+- [Orm ning Log moduli Log moduli bilan birlashtirildi](#orm-s-log-integrated-log-module)
+- [Postgres va Sqlserver drayverlari Schemani qo‘llab-quvvatlaydi](#postgres-and-sqlserver-drivers-support-schema)
+- [about buyrug‘ini qo‘shish](#add-about-command)
+- [db:show buyrug‘ini qo‘shish](#add-db-show-command)
+- [db:table buyrug‘ini qo‘shish](#add-db-table-command)
+- [Artisan chiqish uslubini optimallashtirish](#optimize-artisan-output-style)
+- [Auth Id usulini qo‘shadi](#auth-adds-the-id-method)
+- [Bir nechta Auth.Guard o‘zining TTL ni o‘rnatishi mumkin](#multiple-auth-guard-can-set-their-own-ttl)
+
+## O‘zgarishlar 🛠
+
+- [Postgresql drayverining nomi Postgres ga o‘zgartirildi](#the-name-of-postgresql-driver-changes-to-postgres)
+- [Orm.Transaction usulining qayta chaqiruv parametr turini o‘zgartirish](#modify-the-orm-transaction-method-callback-parameter-type)
+- [Orm ning Delete va ForceDelete usullarini optimallashtirish](#optimize-the-delete-and-forcedelete-methods-of-orm)
+- [Cache ning Decrement va Increment usullarini optimallashtirish](#optimize-the-decrement-and-increment-methods-of-cache)
+- [Artisan ning Call usulini optimallashtirish](#optimize-the-call-method-of-artisan)
+- [Testing.Database ning Clear usuli Shutdown ga nomlandi](#rename-the-clear-method-of-testing-database-to-shutdown)
+- [Testing.Database ning Build usulini optimallashtirish](#optimize-the-build-method-of-testing-database)
+- [Request.Input\* usulini optimallashtirish](#optimize-the-request-input-method)
+- [validation.PrepareForValidation usulini optimallashtirish](#optimize-the-validation-prepareforvalidation-method)
+- [Queue modulining Worker usulini optimallashtirish](#optimize-the-worker-method-of-the-queue-module)
+
+## v1.15.3
+
+- [Go Migratsiya Boolean maydonini qo‘llab-quvvatlaydi](#go-migration-supports-boolean-field)
+- [Go Migratsiya maxsus maydonni qo‘llab-quvvatlaydi](#go-migration-supports-custom-field)
+- [Artisan log chiqish qoidalarini optimallashtirish](#optimize-artisan-log-output-rules)
+
+## v1.15.4
+
+Tegishli paketlarni yangilash: goravel/gin: v1.3.3, goravel/fiber: v1.3.3
+
+- [PrepareForValidation da ctx ning nil bo‘lishi muammosini tuzatish](#fix-the-problem-that-ctx-is-nil-in-prepareforvalidation)
+- [Orm WithContext usuli Fiber drayverida yuqori konkurentlik ostida xatolik haqida xabar berishi muammosini tuzatish](#fix-the-problem-that-the-orm-withcontext-method-reports-an-error-in-fiber-driver-under-high-concurrency)
+- [Paket hajmini optimallashtirish](#optimize-the-packaging-volume)
+- [Model ID ning bir necha marta ichma-ich joylashishi muammosini optimallashtirish](#optimize-the-problem-that-the-model-id-is-nested-multiple-times)
+- [artisan buyrug‘i taxallusini qo‘shish](#add-artisan-command-alias)
+
+## v1.15.5
+
+Tegishli paketlarni yangilash: goravel/redis: v1.3.1, goravel/fiber: v1.3.4
+
+- [Throttle ning Redis drayverida saqlanib qolmasligi muammosini tuzatish](#fix-the-problem-that-throttle-fails-to-store-in-redis-driver)
+- [Fallback ning Fiber drayverida ishlamasligi muammosini tuzatish](#fix-the-problem-that-fallback-fails-to-work-in-fiber-driver)
+
+## v1.15.6
+
+- [Orm WithContext usuli parallel bajarilganda xatolik haqida xabar berishi muammosini tuzatish](#fix-the-problem-that-the-orm-withcontext-method-reports-an-error-in-concurrent-execution)
+
+## v1.15.7
+
+- [Carbon ni yangilash](#upgrade-carbon)
+
+## v1.15.8
+
+Tegishli paketlarni yangilash: goravel/fiber: v1.3.6
+
+- [facades.Testing().Docker().Database() xatolik haqida xabar berishi muammosini tuzatish](#fix-the-problem-that-facades-testing-docker-database-reports-an-error)
+- [Fiber drayveridagi ctx.Request().Ip() usuli to‘g‘ri ishlamasligi muammosini tuzatish](#fix-the-problem-that-the-ctx-request-ip-method-in-the-fiber-driver-does-not-work-properly)
+- [Orm dagi WhereBetween usuli satrlarni qo‘llab-quvvatlamaydi](#the-wherebetween-method-in-orm-does-not-support-strings)
+
+## v1.15.9
+
+- [Orm dagi Cursor usuli ba’zi hollarda xotira sizib chiqishi muammosini tuzatish](#fix-the-problem-that-the-cursor-method-in-orm-leaks-memory-in-some-cases)
+- [Schedule da ikkinchi darajali vazifalardan foydalanganda OnOneServer ishlamasligi muammosini tuzatish](#fix-the-problem-that-ononeserver-fails-to-work-when-using-second-level-tasks-in-schedule)
+- [Yaratilgan migratsiya faylidagi standart Timestamps ni TimestampsTz ga o‘zgartirish](#make-the-default-timestamps-in-the-generated-migration-file-change-to-timestampstz)
+
+## v1.15.10
+
+- [Orm Query qayta ishlatilganda Where sharti aralashishi mumkin bo‘lgan muammoni tuzatish](#fix-the-problem-that-the-where-condition-may-be-mixed-when-orm-query-is-reused)
+
+## v1.15.11
+
+- [Xat yuborilganda bcc va cc-ni to'g'ri o'rnatib bo'lmasligini tuzatish](#fix-bcc-and-cc-cannot-be-set-expectly-when-sending-mail)
+- [Navbat orqali xat yuborilganda noto'g'ri xatoni qaytarishni tuzatish](#fix-sending-mail-via-queue-returns-incorrect-error)
+- [Bir nechta yozuvlar yaratilganda orm yaratish hodisalari ishga tushirilishi mumkinligini tuzatish](#fix-the-orm-create-events-can-be-triggered-when-creating-multiple-records)
+
+## v1.15.12
+
+- [Yopish ichida panic sodir bo'lganda Transaction orqaga qaytmasligini tuzatish](#fix-transaction-does-not-rollback-when-panic-in-closure)
+
+## Yangilash bo‘yicha ko‘rsatma
+
+**Taxminiy yangilash vaqti: 10 daqiqa**
+
+[Golang v1.21 endi qo‘llab-quvvatlanmaydi](https://endoflife.date/go) sababli, Goravel ning qo‘llab-quvvatlaydigan Golang versiyasi 1.21 dan 1.22 ga yangilandi. Iltimos, go.mod faylidagi versiyani yangilang.
+
+### 1. Bog‘liqliklarni yangilash
+
+```
+go get github.com/goravel/framework@v1.15.9
+
+// Agar gin ishlatilsa
+go get github.com/goravel/gin@v1.3.3
+
+// Agar fiber ishlatilsa
+go get github.com/goravel/fiber@v1.3.6
+
+// Agar redis ishlatilsa
+go get github.com/goravel/redis@v1.3.1
+
+// Agar S3 ishlatilsa
+go get github.com/goravel/s3@v1.3.2
+
+// Agar Oss ishlatilsa
+go get github.com/goravel/oss@v1.3.2
+
+// Agar Cos ishlatilsa
+go get github.com/goravel/cos@v1.3.2
+
+// Agar Minio ishlatilsa
+go get github.com/goravel/minio@v1.3.2
+
+// Agar Cloudinary ishlatilsa
+go get github.com/goravel/cloudinary@v1.3.1
+```
+
+```
+go mod tidy
+```
+
+### 2. Agar Postgresql drayveridan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Postgresql drayverining nomi Postgresga o‘zgartirildi](#the-name-of-postgresql-driver-changes-to-postgres)
+
+### 3. Agar Orm.Transaction usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Orm.Transaction usulining chaqiruv parametri turini o‘zgartirish](#modify-the-ormtransaction-method-callback-parameter-type)
+
+### 4. Agar Ormning Delete yoki ForceDelete usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Ormning Delete va ForceDelete usullarini optimallashtirish](#optimize-the-delete-and-forcedelete-methods-of-orm)
+
+### 5. Agar Cachening Decrement va Increment usullaridan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Cachening Decrement va Increment usullarini optimallashtirish](#optimize-the-decrement-and-increment-methods-of-cache)
+
+### 6. Agar Navbat modulining Worker usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Navbat modulining Worker usulini optimallashtirish](#optimize-the-worker-method-of-the-queue-module)
+
+### 7. Agar Artisanni Call usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Artisanni Call usulini optimallashtirish](#optimize-the-call-method-of-artisan)
+
+### 8. Agar Testing.Database modulining Clear usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Testing.Database modulining Clear usuli Shutdown deb nomlandi](#rename-the-clear-method-of-testing-database-to-shutdown)
+
+### 9. Agar Testing.Database modulining Build usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Testing.Database modulining Build usulini optimallashtirish](#optimize-the-build-method-of-testing-database)
+
+### 10. Agar Migratsiya modulidan foydalanayotgan bo‘lsangiz
+
+`config/database.go` faylidagi konfiguratsiyani o‘zgartiring:
+
+```go
+-- "migrations": "migrations",
+++ "migrations": map[string]any{
+++ "driver": "sql",
+++ "table": "migrations",
+++ },
+```
+
+### 11. Agar Request.Input\* usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Request.Input\* usulini optimallashtirish](#optimize-the-request-input-method)
+
+### 12. Agar validation.PrepareForValidation usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [validation.PrepareForValidation usulini optimallashtirish](#optimize-the-validation-prepareforvalidation-method)
+
+### 13. Agar Pochta modulidan foydalanayotgan bo‘lsangiz
+
+`Subject`ni o‘rnatish usulini o‘zgartiring:
+
+```go
+-- import "github.com/goravel/framework/contracts/mail"
+++ import "github.com/goravel/framework/mail"
+
+-- Content(mail.Content{Subject: "Subject", Html: "
Hello Goravel
"})
+++ Content(mail.Html("
Hello Goravel
")).Subject("Subject")
+```
+
+Agar `From` usulidan foydalanayotgan bo‘lsangiz:
+
+```go
+-- import "github.com/goravel/framework/contracts/mail"
+++ import "github.com/goravel/framework/mail"
+
+-- From(mail.From{Address: testFromAddress, Name: testFromName}
+++ From(mail.Address(testFromAddress, testFromName)
+```
+
+Agar `Queue` usulidan foydalanayotgan bo‘lsangiz:
+
+```go
+-- import "github.com/goravel/framework/contracts/mail"
+++ import "github.com/goravel/framework/mail"
+
+-- Queue(mail.Queue{Connection: "high", Queue: "mail"})
+++ Queue(mail.Queue().Connection("high").Queue("mail"))
+```
+
+### 14. Agar validation.PrepareForValidation usulidan foydalanayotgan bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [validation.PrepareForValidation usulini optimallashtirish](#optimize-the-validation-prepareforvalidation-method)
+
+## Xususiyatlar kirishi
+
+### Migratsiya Go tilida migratsiyani qo‘llashni qo‘llab-quvvatlaydi
+
+Ilgari freymvork faqat SQL migratsiyasini qo‘llab-quvvatlagan. Ma’lumotlar bazasini o‘zgartirmoqchi bo‘lganingizda, turli ma’lumotlar bazalari o‘rtasidagi SQL sintaksisi farqlari migratsiya jarayonini juda qiyinlashtirgan. Bundan tashqari, migratsiya fayllarida kodni bajarish mumkin emas edi, bu ma’lumotlarni tuzatishda mantiqiy qarorlar qabul qilishni imkonsiz qilgan.
+
+Endi freymvork Go tilidan to‘g‘ridan-to‘g‘ri migratsiya fayllarini yaratishni qo‘llab-quvvatlaydi, bu ishlab chiquvchilarga murakkab migratsiya mantiqini yozishni osonlashtiradi. Biroq, joriy versiyada jadvallar maydonlarini o‘zgartirish amalga oshirilmagan, faqat jadval yaratish, jadvallarni o‘chirish va indeks yaratish kabi amallarni qo‘llab-quvvatlaydi. Agar o‘zgartirishlar kiritmoqchi bo‘lsangiz, SQL bayonotlarini to‘g‘ridan-to‘g‘ri bajarish uchun `Sql` usulidan foydalanishingiz kerak. Jadval maydonlarini o‘zgartirish imkoniyati kelajakdagi versiyalarda qo‘llab-quvvatlanadi.
+
+V1.15 versiyasida freymvork Go tilida migratsiya (standart) va SQL migratsiyasini qo‘llab-quvvatlaydi, lekin SQL migratsiyasi v1.16 versiyasida olib tashlanadi.
+
+#### SQL migratsiyasidan Go tilida migratsiyaga o‘tish
+
+Agar SQL migratsiyasidan foydalanayotgan bo‘lsangiz, quyidagi qadamlarni bajarib Go tilida migratsiyaga o‘tishingiz mumkin:
+
+1. `config/database.go` faylidagi konfiguratsiyani o‘zgartiring;
+
+```go
+-- "migrations": "migrations",
+++ "migrations": map[string]any{
+++ "driver": "default",
+++ "table": "migrations",
+++ },
+```
+
+2. `go run . artisan make:migration {NAME}` buyrug‘idan foydalanib migratsiya faylini yarating;
+
+Asl SQL migratsiya faylidagi migratsiya va orqaga qaytarish bayonotlarini yaratilgan faylning `Up` va `Down` usullarida bajaring va jadval mavjudligini tekshirish uchun `facades.Schema().HasTable` usulidan foydalaning:
+
+```go
+func (r *M20241207095921CreateUsersTable) Up() error {
+ if !facades.Schema().HasTable("users") {
+ return facades.Schema().Sql({SQL})
+ }
+
+ return nil
+}
+```
+
+3. Migratsiya faylini `database/kernel.go` faylida ro‘yxatdan o‘tkazing;
+
+Yangi `database/kernel.go` faylini yarating va migratsiya fayllari va Seederslarni ro‘yxatdan o‘tkazing:
+
+```go
+package database
+
+import (
+ "github.com/goravel/framework/contracts/database/schema"
+ "github.com/goravel/framework/contracts/database/seeder"
+
+ "goravel/database/migrations"
+ "goravel/database/seeders"
+)
+
+type Kernel struct {
+}
+
+func (kernel Kernel) Migrations() []schema.Migration {
+ return []schema.Migration{
+ &migrations.M20241207095921CreateUsersTable{},
+ }
+}
+
+func (kernel Kernel) Seeders() []seeder.Seeder {
+ return []seeder.Seeder{
+ &seeders.DatabaseSeeder{},
+ }
+}
+```
+
+4. `app/providers/database_service_provider.go` faylini ro‘yxatdan o‘tkazishni yakunlash uchun o‘zgartiring va bu yerda dastlab ro‘yxatdan o‘tkazilgan `Seeder`ni `database/kernel.go::Seeders`ga ko‘chiring;
+
+```go
+-- func (receiver *DatabaseServiceProvider) Boot(app foundation.Application) {
+-- facades.Seeder().Register([]seeder.Seeder{
+-- &seeders.DatabaseSeeder{},
+-- })
+-- }
+++ func (receiver *DatabaseServiceProvider) Boot(app foundation.Application) {
+++ kernel := database.Kernel{}
+++ facades.Schema().Register(kernel.Migrations())
+++ facades.Seeder().Register(kernel.Seeders())
+++ }
+```
+
+5. Mavjud `migrations` jadvali ma’lumotlarini zaxiralang, so‘ngra `migrations` jadvalini o‘chiring;
+
+6. `go run . artisan migrate` buyrug‘ini migratsiyani amalga oshirish uchun bajaring, migratsiya tugagandan so‘ng yangi `migrations` jadvali yaratiladi.
+
+[Hujjatni ko‘rish](../database/migrations.md)
+
+### Testing HTTP testlashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+Framework `Testing.Http` modulini qo‘shdi, u HTTP so‘rovlarini testlashni qo‘llab-quvvatlaydi, so‘rovlarni simulyatsiya qilish, javoblarni olish va javoblarni tekshirish imkonini beradi.
+
+[Hujjatni ko‘rish](../testing/http-tests.md)
+
+### HTTP oqim qaytarishni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../the-basics/response.md#return-stream)
+
+### HTTP taym-aut sozlashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+`config/http.go` faylidagi `http.request_timeout` ni sozlab taym-aut vaqtini belgilashingiz mumkin, standart qiymati 3 soniya.
+
+### HTTP maxsus tiklash usulini sozlashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../the-basics/request.md#custom-recovery)
+
+### So‘rov Filter sozlashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../the-basics/validation.md#filter-input-data)
+
+### So‘rov BindQuery usulini qo‘shadi
+
+goravel/framework: v1.15.0
+
+Parametrlarni to‘g‘ridan-to‘g‘ri havoladan bog‘lash uchun `ctx.Request().BindQuery()` dan foydalanish qo‘llab-quvvatlanadi.
+
+[Hujjatni ko‘rish](../the-basics/request.md#bind-query)
+
+### Validatsiya Regex qoidalarini qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+```go
+validator, err := ctx.Request().Validate(map[string]string{
+ "code": `required|regex:^\d{4,6}$`,
+})
+```
+
+### Jadval log chiqishini boshqarishni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+`app.debug` `false` bo‘lganda, faqat `error` darajadagi loglar chiqariladi.
+
+### Jadval Shutdown usulini qo‘shadi
+
+goravel/framework: v1.15.0
+
+`Shutdown` usuli Jadvalni muloyim ravishda to‘xtatish uchun ishlatilishi mumkin.
+
+[Hujjatni ko‘rish](../digging-deeper/task-scheduling.md#stopping-the-scheduler)
+
+### Pochta Mailable shablonini qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../digging-deeper/mail.md#using-mailable)
+
+### Xato log chiqishidagi iz sakrashni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+Xato log chiqishida, iz ustiga bosilganda, xato yuz bergan kod qatoriga sakraniladi.
+
+### Log Context ichidagi kalit-qiymat juftliklarini chop etishni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+```go
+ctx.WithValue("a", "b")
+facades.Log().WithContext(ctx).Info("Hello Goravel")
+
+// Chiqish:
+[2024-12-15 16:36:58] local.info: Hello Goravel
+Context: map[a:b]
+```
+
+### Ma'lumotlar bazasiga ulanish uchun to‘g‘ridan-to‘g‘ri DSN sozlash qo‘llab-quvvatlanadi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../orm/getting-started.md#dsn)
+
+### Orm ning Create usuli yaratish uchun map dan foydalanishni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../orm/getting-started.md#create)
+
+### Orm sozlov elementlarini qo‘shadi
+
+goravel/framework: v1.15.0
+
+Sozlamalar maxsus holatlar uchun bo‘lib, oddiy foydalanishda talab qilinmaydi, standart holda ular konfiguratsiya fayliga qo‘shilmaydi.
+
+```go
+// config/database.go
+"{driver_name}": map[string]any{
+ "driver": "{driver_name}",
+ "host": config.Env("DB_HOST", "127.0.0.1"),
+ ...
+++ "schema": "goravel",// Ulanish uchun standart sxemani o‘rnating, faqat Postgres va Sqlserver uchun
+++ "no_lower_case": false,// Jadval nomini kichik harflarga o‘tkazishni sozlang
+++ "name_replacer": strings.NewReplacer("id", "ID"),// Ustunlar nomini almashtirishni sozlang
+},
+```
+
+### Orm Restore usulini qo‘shadi
+
+goravel/framework: v1.15.0
+
+`Orm` moduliga `Restore` usuli qo‘shildi, u yumshoq o‘chirilgan ma'lumotlarni tiklash uchun ishlatilishi mumkin va `Restored`, `Restoring` hodisalarini qo‘shadi.
+
+[Hujjatni ko‘rish](../orm/getting-started.md#restore)
+
+### Orm ning Log moduli Log moduliga integratsiya qilindi
+
+goravel/framework: v1.15.0
+
+Ilgari, Orm ning log chiqishi to‘g‘ridan-to‘g‘ri konsolga chiqarilgan, endi Orm ning log chiqishi Log moduliga integratsiya qilinadi va bir vaqtning o‘zida konsolga va log fayliga chop etilishi mumkin.
+
+### Postgres va Sqlserver drayverlari Schemani qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.0
+
+[Hujjatni ko‘rish](../orm/getting-started.md#schema)
+
+### About buyrug‘ini qo‘shing
+
+goravel/framework: v1.15.0
+
+`about` buyrug‘i qo‘shildi, u framework versiyasi, konfiguratsiyasi va boshqalarni ko‘rish uchun ishlatilishi mumkin.
+
+```bash
+go run . artisan about
+```
+
+### Db:show buyrug‘ini qo‘shing
+
+goravel/framework: v1.15.0
+
+`db:show` buyrug‘i qo‘shildi, u ma'lumotlar bazasi ulanish ma'lumotlarini ko‘rish uchun ishlatilishi mumkin.
+
+```bash
+go run . artisan db:show
+```
+
+### Db:table buyrug‘ini qo‘shing
+
+goravel/framework: v1.15.0
+
+`db:table` buyrug‘i qo‘shildi, u jadval tuzilishini ko‘rish uchun ishlatilishi mumkin.
+
+```bash
+go run . artisan db:table
+go run . artisan db:table users
+```
+
+### Artisan chiqish uslubini optimallashtiring
+
+goravel/framework: v1.15.0
+
+Artisan chiqish uslubi optimallashtirildi, rang qo‘shildi, chiqish ko‘proq chiroyli bo‘ldi.
+
+### Auth Id usulini qo‘shadi
+
+goravel/framework: v1.15.0
+
+```go
+id, err := facades.Auth(ctx).ID()
+```
+
+### Bir nechta Auth.Guard o‘z TTL ni sozlashi mumkin
+
+goravel/framework: v1.15.0
+
+Ilgari, bir nechta Guard `jwt.ttl` konfiguratsiyasini baham ko‘rardi. Endi siz har bir Guard uchun TTL ni `config/auth.go` faylida sozlab alohida belgilashingiz mumkin. Agar sozlanmagan bo‘lsa, standart holda `jwt.ttl` konfiguratsiyasi ishlatiladi.
+
+```go
+// config/auth.go
+"guards": map[string]any{
+ "user": map[string]any{
+ "driver": "jwt",
+++ "ttl": 60,
+ },
+},
+```
+
+### Postgresql drayveri nomi Postgres ga o‘zgartirildi
+
+goravel/framework: v1.15.0
+
+Postgresql drayveri nomi `postgres` ga o‘zgartirildi. Agar siz Postgresql drayveridan foydalanayotgan bo‘lsangiz, konfiguratsiya faylini o‘zgartirishingiz kerak:
+
+```go
+// config/database.go
+"postgres": map[string]any{
+ -- "driver": "postgresql",
+ ++ "driver": "postgres",
+ "host": config.Env("DB_HOST", "127.0.0.1"),
+}
+```
+
+### Orm.Transaction usuli chaqiruv parametri turini o‘zgartiring
+
+goravel/framework: v1.15.0
+
+`facades.Orm().Transaction()` usuli chaqiruv parametri turi `func(tx orm.Transaction) error` dan `func(tx orm.Query) error` ga o‘zgartirildi, agar siz ushbu usuldan foydalanayotgan bo‘lsangiz, iltimos, shunga mos ravishda o‘zgartiring.
+
+```go
+-- facades.Orm().Transaction(func(tx orm.Transaction) error {
+++ facades.Orm().Transaction(func(tx orm.Query) error {
+ var user models.User
+
+ return tx.Find(&user, user.ID)
+})
+```
+
+### Orm ning Delete va ForceDelete usullarini optimallashtiring
+
+goravel/framework: v1.15.0
+
+Agar siz ma'lumotlarni o‘chirish uchun `Delete` yoki `ForceDelete` usuliga ID uzatayotgan bo‘lsangiz, buning o‘rniga `Where` usulidan foydalaning:
+
+```go
+-- facades.Orm().Query().Delete(&models.User{}, 10)
+++ facades.Orm().Query().Where("id", 10).Delete(&models.User{})
+
+-- facades.Orm().Query().Delete(&models.User{}, []uint{1, 2, 3})
+++ facades.Orm().Query().WhereIn("id", []uint{1, 2, 3}).Delete(&models.User{})
+
+-- facades.Orm().Query().ForceDelete(&models.User{}, 10)
+++ facades.Orm().Query().ForceDelete("id", 10).Delete(&models.User{})
+```
+
+`Delete` va `ForceDelete` metodlari parametrlarni o‘tkazmasdan ma'lumotlarni o‘chirishni qo‘llab-quvvatlaydi:
+
+```go
+res, err := facades.Orm().Query().Model(&models.User{}).Where("id", 1).Delete()
+res, err := facades.Orm().Query().Table("users").Where("id", 1).Delete()
+```
+
+### Cache modulining Decrement va Increment metodlarini optimallashtirish
+
+goravel/framework: v1.15.0
+
+`Decrement` va `Increment` metodlarining kirish va chiqish turlari `int` dan `int64` ga o‘zgartirildi:
+
+```go
+-- Decrement(key string, value ...int) (int, error)
+++ Decrement(key string, value ...int64) (int64, error)
+
+-- Increment(key string, value ...int) (int, error)
+++ Increment(key string, value ...int64) (int64, error)
+```
+
+### Artisan modulining Call metodini optimallashtirish
+
+goravel/framework: v1.15.0
+
+`facades.Artisan().Call()` metodi bajarish paytida xatolikka uchrasa, panic qiladi. Endi u xatoni qaytaradi, shuning uchun ushbu metoddan foydalanayotgan bo‘lsangiz, xatoni boshqaring.
+
+```go
+err := facades.Artisan().Call("command:name")
+```
+
+### Testing.Database modulining Clear metodini Shutdown deb nomlash
+
+goravel/framework: v1.15.0
+
+Metod nomini boshqa modullar bilan izchil saqlash uchun `Clear` metodini `Shutdown` deb nomladik.
+
+```go
+database, err := facades.Testing().Docker().Database()
+-- err := database.Clear()
+++ err := database.Shutdown()
+```
+
+### Testing.Database modulining Build metodini optimallashtirish
+
+goravel/framework: v1.15.0
+
+Ilgari `Build` metodini chaqirganda, ma'lumotlar bazasi migratsiyasi avtomatik ravishda bajarilar edi. Yangilashdan so‘ng, migratsiyani bajarish uchun `Migrate` metodini qo‘lda chaqirishingiz kerak bo‘ladi, bu ma'lumotlar bazasini boshqarishni yanada moslashuvchan qiladi.
+
+```go
+database, err := facades.Testing().Docker().Database()
+err := database.Build()
+++ err := database.Migrate()
+```
+
+### Request.Input\* metodini optimallashtirish
+
+goravel/framework: v1.15.0
+
+goravel/gin: v1.3.0
+
+goravel/fiber: v1.3.0
+
+Ilgari `Request.Input*` metodi faqat `Body` dan ma'lumot olishi mumkin edi, endi u `Body`, `Query` va `Param` da ketma-ket ma'lumot qidiradi. Ilgari `Request.Input*` metodiga ikkinchi parametr (standart qiymat) o‘tkazilganda, agar `key` mavjud bo‘lsa lekin bo‘sh bo‘lsa, standart qiymat qaytarilar edi. Endi bo‘sh satr qaytariladi, chunki bo‘sh satr ham amaldagi qiymatdir, faqat `key` mavjud bo‘lmaganda standart qiymat qaytariladi.
+
+`Request.Input*` metodining qo‘llaniladigan barcha joylarini tekshirishingiz kerak, o‘tkazilgan parametrlar to‘g‘ri va qaytish qiymatlari kutilganidek ekanligiga ishonch hosil qiling.
+
+### Validation.PrepareForValidation metodini optimallashtirish
+
+goravel/framework: v1.15.0
+
+Kirish parametri turini o‘zgartirish va `http.Context` parametrini qo‘shish:
+
+```go
+import github.com/goravel/framework/validation
+
+-- validator, err := facades.Validation().Make(input, rules, validation.PrepareForValidation(func(data validationcontract.Data) error {
+++ validator, err := facades.Validation().Make(input, rules, validation.PrepareForValidation(func(ctx http.Context, data validationcontract.Data) error {
+ if name, exist := data.Get("name"); exist {
+ return data.Set("name", name)
+ }
+
+ return nil
+}))
+```
+
+### Queue modulining Worker metodini optimallashtirish
+
+goravel/framework: v1.15.0
+
+`Worker` metodi parametrlarni o‘rnatishni talab qilmasa, uni bo‘sh qoldirish mumkin:
+
+```go
+-- facades.Queue().Worker(nil).Run()
+++ facades.Queue().Worker().Run()
+```
+
+Parametrlarni o‘rnatish zarur bo‘lsa, parametrlar ko‘rsatkichlardan instansiyalarga o‘zgartirildi:
+
+```go
+-- facades.Queue().Worker(&queue.Args{Connection: "redis").Run()
+++ facades.Queue().Worker(queue.Args{Connection: "redis").Run()
+```
+
+### Go Migration Boolean maydonini qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.3
+
+```go
+table.Boolean("is_admin")
+```
+
+### Go Migration maxsus maydonni qo‘llab-quvvatlaydi
+
+goravel/framework: v1.15.3
+
+Agar siz freymvork hali qo‘llab-quvvatlamaydigan ustun turlaridan foydalanayotgan bo‘lsangiz, maydon turini sozlash uchun `Column` metodidan foydalanishingiz mumkin:
+
+```go
+table.Column("geometriya", "geometriya")
+```
+
+### Artisan log chiqish qoidalarini optimallashtirish
+
+goravel/framework: v1.15.3
+
+Ilgari Artisan log faqat xato darajali loglarni chiqarar edi, endi barcha darajadagi loglar chiqariladi. Agar konsol loglarni chop etishni o‘chirib qo‘ymoqchi bo‘lsangiz va `single` yoki `daily` log haydovchisidan foydalanayotgan bo‘lsangiz, `logging.channels.single.print` yoki `logging.channels.daily.print` konfiguratsiyasini `false` ga o‘rnating.
+
+### PrepareForValidation metodida ctx ning nil bo‘lish muammosini tuzatish
+
+goravel/framework: v1.15.4
+
+goravel/gin: v1.3.3
+
+goravel/fiber: v1.3.3
+
+Tuzatishdan oldin `PrepareForValidation` metodida `ctx` har doim `nil` edi, endi u parametr sifatida to‘g‘ri o‘tkaziladi. Agar `validation.PrepareForValidation` metodidan foydalanayotgan bo‘lsangiz, shunga mos ravishda o‘zgartiring.
+
+```go
+import (
+ github.com/goravel/framework/validation
+ contarctsvalidate "github.com/goravel/framework/contracts/validation"
+)
+
+-- validation.PrepareForValidation(func(ctx http.Context, data contarctsvalidate.Data) error {
+++ validation.PrepareForValidation(ctx, func(ctx http.Context, data contarctsvalidate.Data) error {
+```
+
+### Fiber haydovchisida yuqori konkurentlik ostida Orm WithContext metodining xato xabar berish muammosini tuzatish
+
+goravel/framework: v1.15.4
+
+goravel/fiber: v1.3.3
+
+Tafsilotlar uchun: [#866](https://github.com/goravel/framework/pull/866)
+
+### Paket hajmini optimallashtirish
+
+goravel/framework: v1.15.4
+
+Tafsilotlar uchun: [#865](https://github.com/goravel/framework/pull/865)
+
+### Model ID ning bir necha marta ichma-ich joylashishi muammosini optimallashtirish
+
+goravel/framework: v1.15.4
+
+Tafsilotlar uchun: [#898](https://github.com/goravel/framework/pull/898)
+
+### Artisan buyrug‘i taxallusini qo‘shish
+
+goravel/framework: v1.15.4
+
+```
+// Ilgari
+go run . artisan key:generate
+
+// Keyin
+./artisan key:generate
+```
+
+### Redis haydovchisida Throttle ning saqlashda muvaffaqiyatsiz bo‘lish muammosini tuzatish
+
+goravel/framework: v1.15.5
+
+goravel/redis: v1.3.1
+
+Redis haydovchisidan foydalanganda, `Throttle` normal saqlay olmaydi, bu cheklovning ishlamasligiga olib keladi.
+
+Muammo: [#625](https://github.com/goravel/goravel/issues/625)
+
+### Fiber haydovchisida Fallback ning ishlamasligi muammosini tuzatish
+
+goravel/framework: v1.15.5
+
+goravel/fiber: v1.3.4
+
+Fiber haydovchisidan foydalanganda, agar `Fallback` o‘rnatilgan bo‘lsa, boshqa marshrutlar ishlamay qoladi.
+
+Muammo: [#624](https://github.com/goravel/goravel/issues/624)
+
+### Konkurent bajarishda Orm WithContext metodining xato xabar berish muammosini tuzatish
+
+goravel/framework: v1.15.6
+
+`WithContext` metodidan foydalanib `Context` ni o‘rnatganda, konkurent bajarishda xato xabar berilardi.
+
+### Carbon ni yangilash
+
+goravel/framework: v1.15.7
+
+[dromara/carbon](https://github.com/dromara/carbon) v2.5.5 yoki undan keyingi versiyalar yangi funksiyalarni joriy qildi, bu ba‘zi freymvork funksiyalarining noto‘g‘ri ishlashiga olib keldi. Eslatma: dromara/carbon v2.6 yoki undan keyingi versiyalar hali qo‘llab-quvvatlanmaydi, Goravel v1.16 da qo‘llab-quvvatlanadi.
+
+### Facades.Testing().Docker().Database() ning xato xabar berish muammosini tuzatish
+
+goravel/framework: v1.15.8
+
+Muammo: [#672](https://github.com/goravel/goravel/issues/672)
+
+### Fiber drayveridagi ctx.Request().Ip() metodining to'g'ri ishlamaslik muammosini tuzatish
+
+goravel/fiber: v1.3.6
+
+Avval, `ctx.Request().Ip()` metodi har doim `127.0.0.1` qiymatini qaytarardi. Tuzatishdan so'ng, proksi sarlavhasini va ishonchli proksi IP manzillarini o'rnatish uchun yangi `http.drivers.fiber.proxy_header`, `http.drivers.fiber.enable_trusted_proxy_check` va `http.drivers.fiber.trusted_proxies` konfiguratsiya elementlari qo'shildi.
+
+Muammo: [#678](https://github.com/goravel/goravel/issues/678)
+
+### Orm-dagi WhereBetween metodi satrlarni qo'llab-quvvatlamaydi
+
+goravel/framework: v1.15.8
+
+Muammo: [#1036](https://github.com/goravel/goravel/issues/1036)
+
+### Orm-dagi Cursor metodining ba'zi hollarda xotira oqizish muammosini tuzatish
+
+goravel/framework: v1.15.9
+
+`rows` olinganda, `chan` to'g'ri yopilmaydi, bu esa xotira oqizishiga olib keladi.
+
+### Schedule-da ikkinchi darajali vazifalardan foydalanganda OnOneServer ishlamaslik muammosini tuzatish
+
+goravel/framework: v1.15.9
+
+Muammo: [#690](https://github.com/goravel/goravel/issues/690)
+
+### Yaratilgan migratsiya faylidagi standart Timestamps-ni TimestampsTz-ga o'zgartirish
+
+goravel/framework: v1.15.9
+
+Muammo: [#699](https://github.com/goravel/goravel/issues/699)
+
+### Orm Query qayta ishlatilganda Where sharti aralashishi mumkin bo'lgan muammoni tuzatish
+
+goravel/framework: v1.15.10
+
+Muammo: [#732](https://github.com/goravel/goravel/issues/732)
+
+### Xat yuborilganda bcc va cc-ni to'g'ri o'rnatib bo'lmasligini tuzatish
+
+goravel/framework: v1.15.11
+
+Muammo: [#737](https://github.com/goravel/goravel/issues/737)
+
+### Navbat orqali xat yuborilganda noto'g'ri xatoni qaytarishni tuzatish
+
+goravel/framework: v1.15.11
+
+PR: [#1148](https://github.com/goravel/framework/pull/1148)
+
+### Bir nechta yozuvlar yaratilganda orm yaratish hodisalari ishga tushirilishi mumkinligini tuzatish
+
+goravel/framework: v1.15.11
+
+Muammo: [#738](https://github.com/goravel/goravel/issues/738)
+
+### Yopish ichida panic sodir bo'lganda Transaction orqaga qaytmasligini tuzatish
+
+goravel/framework: v1.15.12
+
+Muammo: [#762](https://github.com/goravel/goravel/issues/762)
diff --git a/uz_UZ/upgrade/v1.16.md b/uz_UZ/upgrade/v1.16.md
new file mode 100644
index 000000000..449d37f54
--- /dev/null
+++ b/uz_UZ/upgrade/v1.16.md
@@ -0,0 +1,985 @@
+# v1.15 dan v1.16 ga yangilash
+
+## Qiziqarli Yangi Imkoniyatlar 🎉
+
+- [facades.DB() qo'shish](#add-facades-db)
+- [facades.Http() qo'shish](#add-facades-http)
+- [facades.Queue() ni qayta qurish](#reconstruct-facades-queue)
+- [facades.Auth() maxsus haydovchini qo'llab-quvvatlaydi](#facades-auth-supports-custom-driver)
+- [make:\* buyruqlari avtomatik ro'yxatdan o'tkazishni qo'llab-quvvatlaydi](#make-commands-support-automatic-registration)
+- [Goravel o'rnatuvchisi haydovchini tanlashni qo'llab-quvvatlaydi](#goravel-installer-supports-selecting-driver)
+
+## Yaxshilanishlar 🚀
+
+- [Ma'lumotlar bazasi haydovchini ajratish](#split-database-driver)
+- [Orm imkoniyatlar qo'shadi](#orm-adds-features)
+- [Ma'lumotlar jadvali asosida Model yaratishni qo'llab-quvvatlash](#support-creating-model-based-on-data-table)
+- [Ish vaqtida dinamik SQL bayonotini qo'llab-quvvatlash](#support-runtime-dynamic-sql-statement)
+- [Migratsiya imkoniyatlar qo'shadi](#migration-adds-features)
+- [Grpc Shutdown usulini qo'shadi](#grpc-adds-shutdown-method)
+- [Artisan ranglarni chop etishni o'chirish variantini qo'shadi](#artisan-adds-disable-print-colors-option)
+- [Env faylini shifrlash va shifrdan ochish](#encrypt-and-decrypt-env-file)
+- [Elektron pochta yuborish Header ni sozlashni qo'llab-quvvatlaydi](#send-email-supports-setting-header)
+- [O'rnatuvchi o'zini yangilashni qo'llab-quvvatlaydi](#installer-supports-self-upgrade)
+- [Lokalizatsiya embed yuklashni qo'llab-quvvatlaydi](#localization-supports-embed-loading)
+- [Jadval imkoniyatlar qo'shadi](#schedule-adds-features)
+- [So'rov imkoniyatlar qo'shadi](#request-adds-features)
+- [Marshrut imkoniyatlar qo'shadi](#route-adds-features)
+- [Testing Cache tasvirini yaratishni qo'llab-quvvatlaydi](#testing-supports-creating-cache-image)
+- [Turli JWT Guard turli konfiguratsiyalarni qo'llab-quvvatlaydi](#different-jwt-guard-supports-different-configurations)
+- [ServiceProvider endi tartibga bog'liq emas](#serviceprovider-no-longer-depends-on-order)
+
+## O'zgartirishlar (Breaking Changes) 🛠
+
+- [SQL Migratsiyani olib tashlash](#remove-sql-migration)
+- [Config moduli usullari standart qiymat turini optimallashtirish](#optimize-config-module-methods-default-value-type)
+- [Orm usullarini optimallashtirish](#optimize-orm-methods)
+- [Path usullarini optimallashtirish](#optimize-path-methods)
+- [Request usullarini optimallashtirish](#optimize-request-methods)
+- [console Confirm usullarini optimallashtirish](#optimize-console-confirm-methods)
+- [Session maxsus haydovchini optimallashtirish](#optimize-session-custom-driver)
+- [Testing.Request usullarini optimallashtirish](#optimize-testing-request-methods)
+- [Carbon usullarini optimallashtirish](#optimize-carbon-methods)
+- [str.Snake usullarini optimallashtirish](#optimize-str-snake-methods)
+- [goravel/cloudinary endi qo'llab-quvvatlanmaydi](#goravelcloudinary-is-no-longer-maintained)
+
+## v1.16.1
+
+- [Elektron pochta yuborishda bcc va cc ni kutilganidek o‘rnatib bo‘lmasligini tuzatish](#fix-bcc-and-cc-cannot-be-set-expectly-when-sending-mail)
+- [Navbat orqali elektron pochta yuborish noto‘g‘ri xatoni qaytarishini tuzatish](#fix-sending-mail-via-queue-returns-incorrect-error)
+- [ORM yaratish hodisalari bir nechta yozuv yaratishda ishga tushirilishi mumkinligini tuzatish](#fix-the-orm-create-events-can-be-triggered-when-creating-multiple-records)
+- [make:package buyrug‘i noto‘g‘ri kod generatsiya qilishini tuzatish](#fix-the-make-package-command-generates-incorrect-code)
+- [Paket fayllarini nashr qilishda yo‘l noto‘g‘ri ekanligini tuzatish](#fix-the-path-is-incorrect-when-publishing-package-files)
+
+## v1.16.3
+
+- [Yopilishda panic sodir bo‘lsa, Transaction orqaga qaytarilmasligini tuzatish](#fix-transaction-does-not-rollback-when-panic-in-closure)
+- [Alohida migratsiya skripti bilan ustun qo‘shish yoki o‘chirishda xatoliklar yuzaga kelishini tuzatish](#fix-errors-if-adding-or-removing-a-column-with-a-separate-migration-script)
+- [ORM Select metodining buziluvchi o‘zgarishini tuzatish](#fix-the-breaking-change-of-orm-select-method)
+
+## v1.16.4
+
+- [Buyruqlarni bir vaqtda ishga tushirib bo‘lmasligini tuzatish](#fix-commands-cannot-be-run-concurrently)
+
+## v1.16.5
+
+- [Navbat kutilganidek to‘xtatilmasligini tuzatish](#fix-queue-cannot-be-shut-down-as-expected)
+
+## v1.16.6
+
+- [Yangilangan ormda DB keshi qayta o‘rnatilmasligini tuzatish](#fix-db-cache-is-not-reset-when-fresh-orm)
+- [Kundalik loggerda log fayl aylanishi muammosini tuzatish](#fix-log-file-rotation-issue-in-daily-logger)
+- [Faqat bitta ustunni tanlab va nomini o‘zgartirganda paginate metodi xatolik xabar qilishini tuzatish](#fix-the-paginate-method-will-report-an-error-when-selecting-and-renaming-only-one-column)
+- [Cursor json ustunini skaner qilolmasligini tuzatish](#fix-cursor-cannot-scan-json-column)
+
+## v1.16.7
+
+- [Distinct Count bilan ishlatilganda ta’sir ko‘rsatmasligini tuzatish](#fix-distinct-has-no-effect-when-using-with-count)
+- [DB.Insert kutilganidek null ustunlar bilan ishlay olmasligi](#db-insert-can-not-operate-nil-columns-as-expected)
+- [Noto‘g‘ri orm ichki bog‘lanishlarni yuklashni tuzatish](#fix-incorrect-orm-nested-relationships-load)
+
+## v1.16.8
+
+- [Navbat konkurensiyasi 1 dan katta bo‘lganda kechiktirilgan vazifa muammosini tuzatish](#fix-delay-task-issue-when-queue-concurrency-is-greater-than-1)
+
+## Yangilash Qo'llanmasi
+
+[Golang v1.22 endi qo'llab-quvvatlanmayganligi sababli](https://endoflife.date/go), Goravelning qo'llab-quvvatlaydigan Golang versiyasi 1.22 dan 1.23 ga yangilandi.
+
+goravel/example loyihasini v1.15 dan v1.16 ga o'tkazish PR yangilash uchun namuna sifatida foydalanish mumkin: [goravel/example#68](https://github.com/goravel/example/pull/68).
+
+### 1. Bog'liqliklarni Yangilash
+
+```shell
+go get github.com/goravel/framework@latest
+
+// Agar gin ishlatilsa
+go get github.com/goravel/gin@latest
+
+// Agar fiber ishlatilsa
+go get github.com/goravel/fiber@latest
+
+// Agar redis ishlatilsa
+go get github.com/goravel/redis@latest
+
+// Agar S3 ishlatilsa
+go get github.com/goravel/s3@latest
+
+// Agar Oss ishlatilsa
+go get github.com/goravel/oss@latest
+
+// Agar Cos ishlatilsa
+go get github.com/goravel/cos@latest
+
+// Agar Minio ishlatilsa
+go get github.com/goravel/minio@latest
+
+go mod tidy
+```
+
+### 2. Ma'lumotlar Bazasi Konfiguratsiyasini O'zgartirish
+
+Ma'lumotlar bazasi konfiguratsiya fayli `config/database.go` dagi kerak bo'lmagan `connections` larni o'chiring va sizga kerak bo'lgan ma'lumotlar bazasi haydovchisini o'rnating.
+
+Masalan, Postgres:
+
+1. Haydovchi paketini o'rnating
+
+```shell
+go get github.com/goravel/postgres
+```
+
+2. `config/app.go` fayliga `postgres.ServiceProvider` ni qo'shing
+
+```go
+// config/app.go
+import "github.com/goravel/postgres"
+
+"providers": []foundation.ServiceProvider{
+ ...
+ &postgres.ServiceProvider{},
+},
+```
+
+3. `config/database.go` faylidagi konfiguratsiyani o'zgartiring
+
+```diff
+// config/database.go
+import (
+ "github.com/goravel/framework/contracts/database/driver"
+ postgresfacades "github.com/goravel/postgres/facades"
+)
+
+"connections": map[string]any{
+ "postgres": map[string]any{
+ ...
+++ "via": func() (driver.Driver, error) {
+++ return postgresfacades.Postgres("postgres")
+++ },
+ },
+},
+```
+
+### 3. auth.go konfiguratsiya faylini o'zgartirish
+
+```diff
+// config/auth.go
+
+// Qo'llab-quvvatlanadi: "jwt"
+"guards": map[string]any{
+ "user": map[string]any{
+ "driver": "jwt",
+++ "provider": "user",
+ },
+},
+
+++ // Qo'llab-quvvatlanadi: "orm"
+++ "providers": map[string]any{
+++ "user": map[string]any{
+++ "driver": "orm",
+++ },
+++ },
+```
+
+### 4. session.go konfiguratsiya faylini o'zgartirish
+
+```diff
+// config/session.go
+
+-- "driver": config.Env("SESSION_DRIVER", "file"),
+++ "default": config.Env("SESSION_DRIVER", "file"),
+++ "drivers": map[string]any{
+++ "file": map[string]any{
+++ "driver": "file",
+++ },
+++ },
+```
+
+### 5. queue.go konfiguratsiya faylini o'zgartirish
+
+- Agar Queue modulining Redis haydovchisidan foydalanayotgan bo'lsangiz, shunga mos ravishda o'zgartirishingiz kerak: [Queue moduli konfiguratsiyasini optimallashtirish](#optimize-queue-module-configuration).
+
+- Agar foydalanmayotgan bo'lsangiz yoki kelajakda ma'lumotlar bazasi haydovchisidan foydalanishni istasangiz, `config/queue.go` faylidagi konfiguratsiyani o'zgartirishingiz kerak:
+
+```diff
+// config/queue.go
+
+-- // Haydovchilar: "sync", "redis"
+++ // Haydovchilar: "sync", "database", "custom"
+"connections": map[string]any{
+ "sync": map[string]any{
+ "driver": "sync",
+ },
+-- "redis": map[string]any{
+-- "driver": "redis",
+-- "connection": "default",
+-- "queue": config.Env("REDIS_QUEUE", "default"),
+-- },
+++ "database": map[string]any{
+++ "driver": "database",
+++ "connection": "postgres",
+++ "queue": "default",
+++ "concurrent": 1,
+++ },
+},
+
+++ "failed": map[string]any{
+++ "database": config.Env("DB_CONNECTION", "postgres"),
+++ "table": "failed_jobs",
+++ },
+```
+
+Ma'lumotlar bazasi haydovchisi uchun talab qilinadigan migratsiya faylini qo'shing: [database/migrations/20210101000002_create_jobs_table.go](https://github.com/goravel/goravel/blob/master/database/migrations/20210101000002_create_jobs_table.go), va migratsiya faylini `database/kernel.go` faylida ro'yxatdan o'tkazing.
+
+### 6. Agar HTTP Client dan foydalanish kerak bo'lsa
+
+`config/http.go` faylida HTTP Client konfiguratsiya bandini qo'shing:
+
+```diff
+// config/http.go
+++ "client": map[string]any{
+++ "base_url": config.GetString("HTTP_CLIENT_BASE_URL"),
+++ "timeout": config.GetDuration("HTTP_CLIENT_TIMEOUT"),
+++ "max_idle_conns": config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS"),
+++ "max_idle_conns_per_host": config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS_PER_HOST"),
+++ "max_conns_per_host": config.GetInt("HTTP_CLIENT_MAX_CONN_PER_HOST"),
+++ "idle_conn_timeout": config.GetDuration("HTTP_CLIENT_IDLE_CONN_TIMEOUT"),
+++ },
+```
+
+### 7. Agar goravel/redis drayveridan foydalanilsa
+
+`config/cache.go` faylidagi konfiguratsiyani o'zgartirish kerak:
+
+```diff
+// config/cache.go
+"redis": map[string]any{
+ "driver": "custom",
+ "connection": "default",
+ "via": func() (cache.Driver, error) {
+-- return redisfacades.Redis("redis"), nil
+++ return redisfacades.Cache("redis")
+ },
+},
+```
+
+### 8. Agar carbon.DateTime va boshqa usullardan foydalanilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Carbon usullarini optimallashtirish](#optimize-carbon-methods)
+
+### 9. Agar sessiyaning maxsus drayveridan foydalanilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Sessiya maxsus drayverini optimallashtirish](#optimize-session-custom-driver)
+
+### 10. Agar facades.Config() usullaridan foydalanilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Config moduli usullarining standart qiymat turini o'zgartirish](#modify-config-module-methods-default-value-type)
+
+### 11. Agar SQL Migratsiyalari ishlatilsa
+
+Shunga mos ravishda o'zgartirish kerak: [SQL Migratsiyasini olib tashlash](#remove-sql-migration)
+
+### 12. Agar Orm ishlatilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Orm usullarini optimallashtirish](#optimize-orm-methods)
+
+### 13. Agar Path usuli ishlatilsa
+
+`path` usuli mutlaq yo'lni qaytaradi, agar siz undan foydalanayotgan bo'lsangiz, o'zgartirish kerakligini tekshirishingiz kerak: [Path usulini optimallashtirish](#optimize-path-method)
+
+### 14. Agar `ctx.Request().InputMap` usuli ishlatilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Request usulini optimallashtirish](#optimize-request-method)
+
+### 15. Agar `console.Confirm` usuli ishlatilsa
+
+Shunga mos ravishda o'zgartirish kerak: [console Confirm usulini optimallashtirish](#optimize-console-confirm-method)
+
+### 16. Agar Testing.Request usuli ishlatilsa
+
+Shunga mos ravishda o'zgartirish kerak: [Testing.Request usulini optimallashtirish](#optimize-testing-request-method)
+
+## Xususiyatlar tanitimi
+
+### facades.DB() qo'shildi
+
+`facades.DB()` moduli qo'shildi, bu mahalliy ma'lumotlar bazasi operatsiyalarini bajarish uchun qulay, ORM dan tezroq.
+
+[Hujjatni ko'rish](../database/getting-started.md)
+
+### facades.Http() qo'shildi
+
+`facades.Http()` moduli qo'shildi, bu HTTP operatsiyalarini bajarish uchun qulay.
+
+[Hujjatni ko'rish](../digging-deeper/http-client.md)
+
+### facades.Queue() qayta qurildi
+
+- v1.15 dan oldin Queue faqat sinxron va Redis drayverlarini qo'llab-quvvatlagan, v1.16 dan boshlab u ma'lumotlar bazasi va maxsus drayverni qo'llab-quvvatlaydi.
+
+- `jobs` va `failed_jobs` jadvali qo'shildi, vazifalar va muvaffaqiyatsiz vazifalarni saqlash uchun ishlatiladi.
+
+- `queue:retry` buyrug'i qo'shildi, muvaffaqiyatsiz vazifalarni qayta urinish uchun ishlatiladi.
+
+- `queue:failed` buyrug'i qo'shildi, muvaffaqiyatsiz vazifalarni ko'rish uchun ishlatiladi.
+
+- Navbat vazifasini ishga tushirishda qayta urinishlar sonini sozlash qo'llab-quvvatlanadi.
+
+[Hujjatni ko'rish](../digging-deeper/queues.md)
+
+### facades.Auth() maxsus drayverni qo'llab-quvvatlaydi
+
+v1.15 dan oldin Auth faqat JWT drayverini qo'llab-quvvatlagan, v1.16 dan boshlab u Sessiya va maxsus drayverni qo'llab-quvvatlaydi, iltimos [hujjatni ko'ring](../security/authentication.md#custom-driver).
+
+### make:\* buyruqlari avtomatik ro'yxatdan o'tishni qo'llab-quvvatlaydi
+
+`make:migration` va `make:seeder` va hokazo buyruqlar tomonidan yaratilgan fayllar yaratilgandan so'ng avtomatik ravishda freymvorkga ro'yxatdan o'tkaziladi, endi avvalgidek qo'lda ro'yxatdan o'tkazish shart emas.
+
+### Goravel Installer drayver tanlashni qo'llab-quvvatlaydi
+
+Goravel Installer yordamida yangi loyiha o'rnatayotganda, turli drayverlarni tanlashingiz mumkin, masalan: goravel/gin yoki goravel/fiber va hokazolarni o'rnatishni tanlashingiz mumkin.
+
+### Ma'lumotlar bazasi drayveri ajratildi
+
+Ilgari bir nechta ma'lumotlar bazasi drayverlari freymvorkda birlashtirilgan edi, bu dastur to'plami hajmini oshirdi. v1.16 dan boshlab, ma'lumotlar bazasi drayveri alohida paket bo'ladi, shuning uchun sizga faqat kerakli ma'lumotlar bazasi drayverini o'rnatish kerak.
+
+| Ma'lumotlar bazasi turi | Drayver paketi |
+| ----------------------- | ------------------------------------------------------------------------------------ |
+| Postgres | [github.com/goravel/postgres](https://github.com/goravel/postgres) |
+| MySQL | [github.com/goravel/mysql](https://github.com/goravel/mysql) |
+| Sqlserver | [github.com/goravel/sqlserver](https://github.com/goravel/sqlserver) |
+| SQLite | [github.com/goravel/sqlite](https://github.com/goravel/sqlite) |
+
+### Orm ga xususiyatlar qo'shildi
+
+- JSON maydonlarini so'rov qilish qo'llab-quvvatlanadi, [hujjatni ko'ring](../orm/getting-started.md#where).
+
+- JSON maydonlarini yangilash qo'llab-quvvatlanadi, [hujjatni ko'ring](../orm/getting-started.md#update-json-fields).
+
+- Model `GlobalScope` usulini sozlashni qo'llab-quvvatlaydi, bu so'rov, yangilash va o'chirish operatsiyalarining doirasini cheklaydi:
+
+```go
+import "github.com/goravel/framework/contracts/orm"
+
+type User struct {
+ orm.Model
+ Name string
+}
+
+func (r *User) GlobalScopes() []func(orm.Query) orm.Query {
+ return []func(orm.Query) orm.Query{
+ func(query orm.Query) orm.Query {
+ return query.Where("name", "goravel")
+ },
+ }
+}
+```
+
+### Ma'lumotlar jadvali asosida Model yaratish qo'llab-quvvatlanadi
+
+`make:model` buyrug'iga `--table` opsiyasi qo'shildi, ma'lumotlar jadvali asosida Model yaratish uchun ishlatiladi:
+
+```shell
+./artisan make:model --table=users User
+
+// Agar Model allaqachon mavjud bo'lsa, -f opsiyasidan foydalanib majburan ustidan yozishingiz mumkin
+./artisan make:model --table=users -f User
+```
+
+### Ish vaqtida dinamik SQL bayonotini qo'llab-quvvatlash
+
+`EnableQueryLog` usuli qo'shildi, so'rov jurnalini yoqish uchun ishlatiladi:
+
+```go
+ctx := db.EnableQueryLog(ctx)
+
+facades.Orm().WithContext(ctx).Query()
+facades.DB().WithContext(ctx).Table()
+
+queryLogs := db.GetQueryLog(ctx)
+ctx := db.DisableQueryLog(ctx)
+```
+
+### Migratsiyaga xususiyatlar qo'shildi
+
+- Jadval tuzilishini o'zgartirish uchun `Change` usuli qo'shildi (Postgres, MySQL, Sqlserver uchun qo'llaniladi):
+
+```go
+table.String("name").Change()
+```
+
+- Jadval ustunini nomini o'zgartirish uchun `RenameColumn` usuli qo'shildi:
+
+```go
+table.RenameColumn("old_name", "new_name")
+```
+
+- Jadvalga izoh qo'shish uchun `Comment` usuli qo'shildi (Postgres, MySQL uchun qo'llaniladi):
+
+```go
+table.Comment("user table")
+```
+
+- Maydonni jadvalning birinchi maydoni sifatida belgilash uchun `First` usuli qo'shildi (MySQL uchun qo'llaniladi):
+
+```go
+table.String("name").First()
+```
+
+- `After` usulini qo'shing, maydonni jadvalning oxirgi maydoni sifatida o'rnatish uchun (MySQL uchun qo'llaniladi):
+
+```go
+table.String("name").After("id")
+```
+
+- `Morphs`, `NullableMorphs`, `NumericMorphs`, `UuidMorphs`, `UlidMorphs` usullarini qo'shing, polimorfik bog'lanish maydonlarini yaratish uchun ishlatiladi:
+
+```go
+table.Morphs("morphable")
+// morphable_type, morphable_id
+```
+
+- `Uuid`, `Ulid` usullarini qo'shing, UUID va ULID maydonlarini yaratish uchun ishlatiladi:
+
+```go
+table.Uuid("uuid")
+table.Ulid("ulid")
+```
+
+- `GeneratedAs` va `Always` usullarini qo'shing, generatsiyalangan ustunlarni yaratish uchun ishlatiladi (faqat PostgreSQL):
+
+```go
+table.String("name").GeneratedAs().Always()
+```
+
+### Grpc Shutdown usulini qo'shadi
+
+Grpc-ni yumshatib o'chirish uchun `Shutdown` usulini qo'shing, [Hujjatni ko'ring](../the-basics/grpc.md#shutdown-grpc).
+
+### Artisan ranglarni chop etishni o'chirish opsiyasini qo'shadi
+
+Ba'zi buyruqlar standart ravishda ranglarni chiqaradi, masalan, `list` buyrug'i. Biroq, ba'zi terminal yoki jurnallarda rang qiymatlari noto'g'ri ko'rsatilishi mumkin. Siz chop ranglarini o'chirish uchun `--no-ansi` opsiyasidan foydalanishingiz mumkin:
+
+```shell
+go run . artisan list --no-ansi
+```
+
+### Env faylini shifrlash va shifrdan ochish
+
+Ishlab chiqarish muhiti env faylini versiya nazoratiga qo'shmoqchi bo'lishingiz mumkin, lekin sezuvchi ma'lumotlarni ochib bermaslik uchun, siz env faylini shifrlashingiz va shifrdan ochishingiz mumkin:
+
+[Hujjatni ko'ring](../getting-started/installation.md#encrypt-and-decrypt-env-file)
+
+### Elektron pochta yuborish Header-ni o'rnatishni qo'llab-quvvatlaydi
+
+Elektron pochta Header-ni o'rnatish uchun ishlatiladigan `Headers` usulini qo'shing.
+
+```go
+facades.Mail().Headers(map[string]string{"X-Mailer": "Goravel"})
+```
+
+### O'rnatuvchi o'zini yangilashni qo'llab-quvvatlaydi
+
+goravel/installer `upgrade` buyrug'ini qo'shadi, bu o'rnatuvchini o'zini yangilash uchun ishlatiladi:
+
+```shell
+goravel upgrade
+goravel upgrade v1.1.1
+```
+
+### Lokalizatsiya embed yuklashni qo'llab-quvvatlaydi
+
+Embed yuklashdan foydalanilganda, til fayllari ikkilik faylga kompilyatsiya qilinadi va endi ularni joylashtirish shart emas.
+
+[Hujjatni ko'ring](../digging-deeper/localization.md#embed-loading)
+
+### Jadval xususiyatlarni qo'shadi
+
+- `EverySecond` usulini va boshqalarni qo'shing, iltimos [hujjatni ko'ring](../digging-deeper/task-scheduling.md#schedule-frequency-options).
+
+- Vazifalarni qo'lda ishga tushirish uchun ishlatiladigan `schedule:run` buyrug'ini qo'shing.
+
+- Barcha vazifalarni ko'rish uchun ishlatiladigan `schedule:list` usulini qo'shing.
+
+### So'rov xususiyatlarni qo'shadi
+
+- v1.15 dan oldin, quyidagi `Request` bog'lash xatolikni bildiradi, v1.16 dan boshlab, u bir nechta fayllarni bog'lashni qo'llab-quvvatlaydi:
+
+```go
+type StoreMediaRequest struct {
+ Files []*multipart.FileHeader `form:"files" json:"files"`
+}
+```
+
+- Asl marshrut yo'lini olish uchun ishlatiladigan `OriginPath` usulini qo'shing:
+
+```go
+ctx.Request().OriginPath()
+```
+
+- Marshrut ma'lumotlarini olish uchun ishlatiladigan `Info` usulini qo'shing:
+
+```go
+info := ctx.Request().Info()
+```
+
+- Marshrut nomini olish uchun ishlatiladigan `Name` usulini qo'shing:
+
+```go
+name := ctx.Request().Name()
+```
+
+- `http.request_timeout` konfiguratsiya elementi `0` ga o'rnatilganda, so'rov vaqt chegarasiz bo'ladi.
+
+### Marshrut xususiyatlarni qo'shadi
+
+- Barcha marshrutlarni olish uchun ishlatiladigan `GetRoutes` usulini qo'shing:
+
+```go
+routes := facades.Route().GetRoutes()
+```
+
+- Marshrut nomini o'rnatish uchun ishlatiladigan `Name` usulini qo'shing:
+
+```go
+facades.Route().Get("users", usersController.Index).Name("users.index")
+```
+
+Keyin siz marshrut ma'lumotlarini olish uchun `Info` usulidan foydalanishingiz mumkin:
+
+```go
+route := facades.Route().Info("users.index")
+```
+
+- Barcha marshrutlarni ko'rish uchun ishlatiladigan `route:list` buyrug'ini qo'shing:
+
+```shell
+./artisan route:list
+```
+
+### Testing Cache tasvirini yaratishni qo'llab-quvvatlaydi
+
+Cache tasvirini yaratish uchun ishlatiladigan `Cache` usulini qo'shing:
+
+```go
+cache, err := facades.Testing().Docker().Cache()
+```
+
+### Har xil JWT Guard har xil konfiguratsiyalarni qo'llab-quvvatlaydi
+
+v1.15 dan oldin, JWT Guard ning `ttl` va `secret` konfiguratsiya elementlari global konfiguratsiyalar edi, v1.16 dan boshlab, siz har xil JWT Guardlar uchun har xil `ttl` va `secret` o'rnatishingiz mumkin, [Hujjatni ko'ring](../security/authentication.md#different-jwt-guard-supports-different-configurations).
+
+### ServiceProvider endi tartibga bog'liq emas
+
+ServiceProvider joriy ServicerProvider ning bog'liqlik munosabatini e'lon qilish uchun ishlatiladigan ixtiyoriy usul `Relationship() binding.Relationship` ni qo'shadi, ushbu usulni o'rnatgan ServiceProvider ro'yxatga olish tartibiga bog'liq bo'lmaydi, va uni o'rnatmagan ServiceProvider oxirgi ro'yxatga olinadi, masalan:
+
+```go
+type ServiceProvider struct {
+}
+
+func (r *ServiceProvider) Relationship() binding.Relationship {
+ return binding.Relationship{
+ Bindings: []string{
+ BindingSession,
+ },
+ Dependencies: []string{
+ binding.Config,
+ },
+ ProvideFor: []string{
+ binding.Cache,
+ },
+ }
+}
+
+func (r *ServiceProvider) Register(app foundation.Application) {}
+
+func (r *ServiceProvider) Boot(app foundation.Application) {}
+```
+
+### SQL Migratsiyasini olib tashlash
+
+SQL migratsiyalari butunlay olib tashlandi, iltimos Go tilidagi migratsiyalardan foydalaning. Migratsiya qadamları:
+
+1. `config/database.go` dagi `migrations.driver` kalitini olib tashlang;
+
+```go
+// config/database.go
+"migrations": map[string]any{
+-- "driver": "sql",
+ "table": "migrations",
+},
+```
+
+2. `database/migrations` katalogidagi SQL migratsiya fayllarini Go tilidagi migratsiya fayllariga aylantiring:
+
+```go
+// Up Migratsiyalarni ishga tushiring.
+func (r *M20241207095921CreateUsersTable) Up() error {
+ return facades.Schema().Sql({Original SQL})
+}
+
+// Down Migratsiyalarni teskari aylantiring.
+func (r *M20241207095921CreateUsersTable) Down() error {
+ return facades.Schema().Sql({Original SQL})
+}
+```
+
+3. Migratsiya fayllarini `database/kernel.go` faylida ro'yxatdan o'tkazing;
+
+### Config moduli usullari standart qiymat turini optimallashtirish
+
+`Config` modulining `GetString`、`GetInt`、`GetBool` usullari oldin standart qiymat turi `any` edi, v1.16 dan boshlab, standart qiymat turi `string`、`int`、`bool` ga o'zgartirildi, tur xavfsizligini ta'minlash uchun.
+
+```diff
+-- GetString(path string, defaultValue ...any) string
+++ GetString(path string, defaultValue ...string) string
+
+-- GetInt(path string, defaultValue ...any) int
+++ GetInt(path string, defaultValue ...int) int
+
+-- GetBool(path string, defaultValue ...any) bool
+++ GetBool(path string, defaultValue ...bool) bool
+```
+
+### Orm usullarini optimallashtirish
+
+- `Count`, `Exists` usullarining qaytariladigan qiymatini optimallashtirish:
+
+```diff
+-- Count(count *int64) error
+++ Count() (int64, error)
+
+-- Distinct(args ...any) Query
+++ Distinct(columns ...string) Query
+
+-- Exists(exists *bool) error
+++ Exists() (bool, error)
+
+-- Select(query any, args ...any) Query
+++ Select(columns ...string) Query
+
+-- Sum(column string, dest any) error
+++ Sum(column string) (int64, error)
+```
+
+- `Where` usuli yopilishlarni qo'llab-quvvatlaydi:
+
+```go
+facades.Orm().Query().Where(func(query orm.Query) orm.Query {
+ return query.Where("height", 180).Where("age", 18)
+}).FindOrFail(&user, 100)
+// SELECT * FROM users WHERE id = 100 AND (height = 180 AND age = 18);
+```
+
+### Path usullarini optimallashtirish
+
+- `Resource` usulini qo'shing
+
+```go
+path.Resource("views/welcome.tmpl")
+```
+
+- `path` usuli mutlaq yo'lni qaytaradi
+
+Ilgari `path` usuli ildiz katalogining nisbiy yo'lini qaytarar edi, masalan, `path.Config("app.go") == config/app.go`. v1.16 dan boshlab, `path` usuli mutlaq yo'lni qaytaradi, masalan, `path.Config("app.go") == /Users/goravel/workspace/goravel/config/app.go`.
+
+### So'rov usullarini optimallashtirish
+
+1. `InputMap` usulining standart qiymat turini o'zgartirish:
+
+```diff
+-- ctx.Request().InputMap(key string, defaultValue ...map[string]string) map[string]string
+++ ctx.Request().InputMap(key string, defaultValue ...map[string]any) map[string]any
+```
+
+2. `InputMapArray` usulini qo'shish, bu Mapning massiv turini olish uchun ishlatiladi:
+
+```go
+ctx.Request().InputMapArray(key string, defaultValue ...[]map[string]any) []map[string]any
+```
+
+3. `Files` usulini qo'shish, bu bir nechta fayllarni olish uchun ishlatiladi:
+
+```go
+ctx.Request().Files(name string) ([]filesystem.File, error)
+```
+
+### Konsol Confirm usullarini optimallashtirish
+
+`Confirm` usulining qaytarish qiymatini o'zgartirish, aniqlash mantiqini soddalashtirish:
+
+```diff
+-- Confirm(question string, option ...ConfirmOption) (bool, error)
+++ Confirm(question string, option ...ConfirmOption) bool
+```
+
+### Session maxsus haydovchisini optimallashtirish
+
+Ilgari siz haydovchini `facades.Session().Extend` usuli orqali ro'yxatdan o'tkazishingiz kerak edi. v1.16 dan boshlab, siz uni faqat `config/session.go` konfiguratsiya fayliga qo‘shishingiz kerak:
+
+```diff
+// app/providers/app_service_provider.go
+-- facades.Session().Extend("custom", func() session.Driver {
+-- return &CustomDriver{}
+-- })
+
+// config/session.go
+"drivers": map[string]any{
+ "custom": map[string]any{
+ "driver": "custom",
+ "via": func() (session.Driver, error) {
+ return &CustomDriver{}, nil
+ },
+ }
+},
+```
+
+[Hujjatni ko'rish](../the-basics/session.md#add-custom-session-driver)
+
+### Testing.Request usullarini optimallashtirish
+
+`WithCookies` va `WithCookie` usullarining parametrlarini optimallashtirish:
+
+```diff
+-- WithCookies(cookies map[string]string) Request
+++ WithCookies(cookies []*http.Cookie) Request
+
+-- WithCookie(key, value string) Request
+++ WithCookie(cookie *http.Cookie) Request
+```
+
+### Carbon usullarini optimallashtirish
+
+Ilgari `carbon.NewDateTime` va boshqa usullar struktura namunasi qaytarar edi, v1.16 dan boshlab, ular ko'rsatkich qaytaradi, agar siz `carbon.DateTime` turini va boshqalarni aniqlagan bo'lsangiz, uni `*carbon.DateTime` va boshqa ko'rsatkich turiga o'zgartirishingiz kerak.
+
+### str.Snake usullarini optimallashtirish
+
+`str.Snake` usuli ilgari `userID` ni `user_i_d` ga o'zgartiradi edi, v1.16 dan boshlab, u `user_id` ga o'zgartiriladi.
+
+### goravel/cloudinary endi qo'llab-quvvatlanmaydi
+
+[goravel/cloudinary](https://github.com/goravel/cloudinary) endi qo'llab-quvvatlanmaydi, iltimos, [goravel/s3](https://github.com/goravel/s3) yoki boshqa haydovchilardan foydalaning.
+
+### Navbat moduli konfiguratsiyasini optimallashtirish
+
+v1.15 dan oldin, Navbat modulining Redis haydovchisi [RichardKnop/machinery](https://github.com/RichardKnop/machinery) yordamida amalga oshirilgan edi. v1.16 dan boshlab, Redis haydovchisi rasmiy ravishda [goravel/redis](https://github.com/goravel/redis) da qo‘llab-quvvatlanadi.
+
+Siz v1.16 da hali ham Machinery haydovchisidan foydalanishingiz mumkin, lekin u v1.17 da olib tashlanadi, Redis haydovchisidan foydalanish tavsiya etiladi. Quyida ikkita yangilash usuli taqdim etilgan:
+
+#### Machinery haydovchisidan foydalanishni davom ettirish
+
+`config/queue.go` faylidagi konfiguratsiyani o'zgartirish:
+
+```diff
+// config/queue.go
+"connections": map[string]any{
+...
+ "redis": map[string]any{
+-- "driver": "redis",
+++ "driver": "machinery",
+ "connection": "default",
+ "queue": config.Env("REDIS_QUEUE", "default"),
+ }
+},
+```
+
+#### Redis navbat haydovchisidan foydalanish
+
+`config/queue.go` faylidagi konfiguratsiyani o'zgartirish:
+
+```diff
+// config/queue.go
+import (
+ "github.com/goravel/framework/contracts/queue"
+ redisfacades "github.com/goravel/redis/facades"
+)
+
+"connections": map[string]any{
+...
+ "redis": map[string]any{
+-- "driver": "redis",
+++ "driver": "custom",
+ "connection": "default",
+ "queue": config.Env("REDIS_QUEUE", "default"),
+++ "via": func() (queue.Driver, error) {
+++ return redisfacades.Queue("redis") // ` + "`redis`" + ` qiymati ` + "`connections`" + ` ning kalitidir
+++ },
+ },
+},
+```
+
+Yangi Redis navbat haydovchisi va asl Machinery navbat haydovchisi vazifalari bir xil Redisda saqlanadi, lekin turli navbat nomlaridan foydalanadi. Yangi Redis navbat haydovchisiga o‘tsangiz ham, framework Machinerydagi barcha vazifalar tugaguncha asl Machinery navbat haydovchisi vazifalarini o‘qishni davom ettiradi. Shu bilan birga, yangi navbat vazifalari endi Machinery navbatiga yozilmaydi, balki yangi Redis navbatiga yoziladi va yangi Redis navbat haydovchisi tomonidan iste’mol qilinadi. Ikki haydovchi o‘rtasida uzluksiz o‘tishni amalga oshirish uchun.
+
+Ikkala haydovchi ma’lumotlarini Redisdan tekshirib, ularning to‘g‘ri yozilgan va iste’mol qilinganligini ko‘rishingiz mumkin:
+
+```shell
+redis-cli
+
+# Redisdagi barcha kalitlarni olish
+keys
+
+# Machinery navbat haydovchisi ma’lumotlarini ko‘rish ({} ni qiymat bilan almashtiring)
+LRANGE {app_name}_queues:{queue_name} 0 -1
+
+# Redis navbat haydovchisi ma’lumotlarini ko‘rish ({} ni qiymat bilan almashtiring)
+LRANGE {app_name}_queues:{connection}_{queue} 0 -1
+```
+
+### Elektron pochta yuborishda bcc va cc ni kutilganidek o‘rnatib bo‘lmasligini tuzatish
+
+goravel/framework: v1.16.1
+
+Muammo: [#737](https://github.com/goravel/goravel/issues/737)
+
+### Navbat orqali elektron pochta yuborish noto‘g‘ri xatoni qaytarishini tuzatish
+
+goravel/framework: v1.16.1
+
+PR: [#1148](https://github.com/goravel/framework/pull/1148)
+
+### ORM yaratish hodisalari bir nechta yozuv yaratishda ishga tushirilishi mumkinligini tuzatish
+
+goravel/framework: v1.16.1
+
+Muammo: [#738](https://github.com/goravel/goravel/issues/738)
+
+### make:package buyrug‘i noto‘g‘ri kod generatsiya qilishini tuzatish
+
+goravel/framework: v1.16.1
+
+Muammo: [#743](https://github.com/goravel/goravel/issues/743)
+
+### Paket fayllarini nashr qilishda yo‘l noto‘g‘ri ekanligini tuzatish
+
+goravel/framework: v1.16.1
+
+Muammo: [#749](https://github.com/goravel/goravel/issues/749)
+
+### Yopilishda panic sodir bo‘lsa, Transaction orqaga qaytarilmasligini tuzatish
+
+goravel/framework: v1.16.3
+
+Muammo: [#762](https://github.com/goravel/goravel/issues/762)
+
+### Alohida migratsiya skripti bilan ustun qo‘shish yoki o‘chirishda xatoliklar yuzaga kelishini tuzatish
+
+goravel/framework: v1.16.3
+
+goravel/postgres: v1.4.1
+
+Agar alohida migratsiya skripti orqali ustun qo‘shilsa yoki o‘chirilsa va ilova qayta ishga tushmasa, quyidagi ikkita xato yuzaga keladi:
+
+1. DB fasadida panic yuzaga keladi.
+2. Postgres haydovchisi xatolikni xabar qiladi: `cached plan must not change result type`.
+
+Muammo: [#768](https://github.com/goravel/goravel/issues/768)
+
+### Orm Select metodidagi buziluvchi o‘zgartirishni tuzatish
+
+goravel/framework: v1.16.3
+
+Orm Select metodini v1.15 dan v1.16 ga yangilashda buziluvchi o‘zgartirish mavjud. `Select` endi `db.Raw()` ni qo‘llab-quvvatlamaydi, shuning uchun buziluvchi o‘zgartirishdan qochish uchun yangi `SelectRaw` metodi qo‘shildi.
+
+Muammo: [#770](https://github.com/goravel/goravel/issues/770)
+
+### Buyruqlarni bir vaqtda ishga tushirib bo‘lmasligini tuzatish
+
+goravel/framework: v1.16.4
+
+Schedule modulida buyruqlarni bir vaqtda ishga tushirganda, bir vaqtda yozishlar tufayli tartibsizlik yoki panic yuzaga kelishi mumkin.
+
+### Navbat kutilganidek to‘xtatilmasligini tuzatish
+
+goravel/framework: v1.16.5
+
+Ilgari, Navbat ishchisi ishlayotganda, SIGTERM signalini yuborish ishchini darhol to‘xtatardi. Hozir joriy vazifa tugagunicha kutib, keyin to‘xtatilishi tuzatildi.
+
+Muammo: [#807](https://github.com/goravel/goravel/issues/807)
+
+### Yangilangan ormda DB keshi qayta o‘rnatilmasligini tuzatish
+
+goravel/framework: v1.16.6
+
+`facades.Orm().Fresh()` chaqirilganda ma’lumotlar bazasi ulanishi keshi to‘g‘ri qayta o‘rnatilmasligi muammosini tuzatish, bu ORM yangilangandan so‘ng eskirgan ulanishlardan foydalanishga olib kelishi mumkin edi.
+
+Muammo: [#840](https://github.com/goravel/goravel/issues/840)
+
+### Kundalik loggerda log fayl aylanishi muammosini tuzatish
+
+goravel/framework: v1.16.6
+
+Kundalik log aylanishi to‘g‘ri ishlamasligi muammosini tuzatish, chunki ilovani qayta ishga tushirmasdan kun uchun yangi log fayli yaratilmasdi.
+
+Muammo: [#847](https://github.com/goravel/goravel/issues/847)
+
+### Faqat bitta ustunni tanlab va nomini o‘zgartirganda paginate metodi xatolik xabar qilishini tuzatish
+
+goravel/framework: v1.16.6
+
+Faqat bitta ustunni tanlab va nomini o‘zgartirganda `Paginate` metodi xatolik xabar qilish muammosini tuzatish. Tuzatish paginatsiya paytida maxsus tanlangan ustunlar hisoblash amallariga xalaqit bermasligini ta’minlaydi.
+
+Muammo: [#842](https://github.com/goravel/goravel/issues/842)
+
+### Cursor json ustunini skaner qilolmasligini tuzatish
+
+goravel/framework: v1.16.6
+
+Ma’lumotlar bazasi kursori JSON ustunlarini skaner qilolmasligi muammosini qatorlarni skaner qilish funksionalligini yaxshilash orqali tuzatish. Bu o‘zgartirish JSON ustunlarini to‘g‘ri qayta ishlashni qo‘llab-quvvatlaydi va `map[string]any`, massivlar (`[]string`, `[]int`) va maxsus strukturalarga avtomatik JSON-dan Go‘ga konvertatsiya qilish uchun yangi dekodlash ilmoqlarini qo‘shadi.
+
+Muammo: [#818](https://github.com/goravel/goravel/issues/818)
+
+### Distinct Count bilan ishlatilganda ta’sir ko‘rsatmasligini tuzatish
+
+goravel/framework: v1.16.7
+
+`Distinct` ni `Count` bilan birgalikda ishlatganda kutilgan alohida hisoblash natijalarini bermasligi muammosini tuzatish. Tuzatish yozuvlarni hisoblashda `Distinct` bandi to‘g‘ri qo‘llanilishini ta’minlaydi.
+
+Muammo: [#856](https://github.com/goravel/goravel/issues/856)
+
+### DB.Insert kutilganidek null ustunlar bilan ishlay olmasligi
+
+goravel/framework: v1.16.7
+
+`facades.DB().Insert()` kutilganidek null ustunlar bilan ishlay olmasligi muammosini tuzatish.
+
+```go
+type Product struct {
+ Model
+ SoftDeletes
+ Name string `db:"name"`
+ Weight *int `db:"weight"` // Ko‘rsatkich
+ Height *int `db:"height"`
+}
+
+// Agar birinchi ma’lumotda Weight bo‘lmasa, Weight e‘tiborga olinmaydi
+facades.DB().Table("products").Insert([]Product{
+ {Name: "count_product1"},
+ {Name: "count_product2", Weight: convert.Pointer(1)},
+})
+
+// Normal
+facades.DB().Table("products").Insert([]Product{
+ {Name: "count_product2", Weight: convert.Pointer(1)},
+ {Name: "count_product1"},
+})
+```
+
+Muammo: [#858](https://github.com/goravel/goravel/issues/858)
+
+### Noto‘g‘ri orm ichki bog‘lanishlarni yuklashni tuzatish
+
+goravel/framework: v1.16.7
+
+Orm `Load()` dan foydalanganda ichki bog‘lanishlarni qayta ishlay olmaydi.
+
+```go
+facades.Orm().Query().Load(&model, "Author.Contacts")
+```
+
+### Navbat konkurensiyasi 1 dan katta bo‘lganda kechiktirilgan vazifa muammosini tuzatish
+
+goravel/framework: v1.16.8
+
+goravel/redis: v1.4.1
+
+Navbat ishchisi konkurensiyasi 1 dan katta bo‘lganda, kechiktirilgan vazifalar bir necha marta bajariladi. Buning sababi, bir nechta ishchilar bir xil kechiktirilgan vazifa mavjud bo‘lganda uni olishi mumkin. Endi bir vaqtda faqat bitta ishchi kechiktirilgan vazifani bajarishi uchun tarqatilgan qulf ishlatiladi.
diff --git a/uz_UZ/upgrade/v1.17.md b/uz_UZ/upgrade/v1.17.md
new file mode 100644
index 000000000..ecb19e069
--- /dev/null
+++ b/uz_UZ/upgrade/v1.17.md
@@ -0,0 +1,569 @@
+# v1.16-dan v1.17-ga yangilash
+
+## Qiziqarli yangi xususiyatlar 🎉
+
+- [Goravel Lite](#goravel-lite)
+- [Soddalashtirilgan kod tuzilmasi](#simplified-code-structure)
+- [Process Facade](#process-facade)
+- [Pluralizer Paketi](#pluralizer-package)
+- [Xizmat ko'rsatuvchi ishga tushiruvchilar](#service-provider-runners)
+
+## Yaxshilanishlar 🚀
+
+- [facades kerak bo'lganda o'rnatilishi va o'chirilishi mumkin](#facades-can-be-installed-and-uninstalled-as-needed)
+- [Pochta andozalar orqali yuborilishi mumkin](#mail-can-be-sent-via-template)
+- [build buyrug'i ko'proq bayroqlarni qo'llab-quvvatlaydi](#the-build-command-supports-more-flags)
+- [DB va Orm uchun funksiyalar qo'shish va o'zgartirish](#add-and-modify-functions-for-db-and-orm)
+- [Schema uchun yangi funksiyalar qo'shish](#add-new-functions-for-schema)
+- [Yangi buyruqlar qo'shish](#add-new-commands)
+- [CSRF token middleware qo‘shish](#add-csrf-token-middleware)
+- [Buyruq Argumentlarni sozlashni qo'llab-quvvatlaydi](#command-supports-configure-arguments)
+- [make:migration model orqali migratsiya yaratishni qo'llab-quvvatlaydi](#make-migration-supports-create-migration-via-model)
+- [gRPC mijoz ulanishlarini optimallashtirish](#optimize-grpc-connections)
+- [Log json formatda chop etishni qo'llab-quvvatlaydi](#log-supports-print-json-format)
+- [Http bir nechta mijozlarni qo'llab-quvvatlaydi](#http-supports-multiple-clients)
+- [Validation kontekstni uzatishni qo'llab-quvvatlaydi](#validation-supports-pass-context)
+- [Orm uchun WithoutGlobalScopes funksiyasini qo'shish](#add-withoutglobalscopes-function-for-orm)
+
+## O'zgarishlar 🛠
+
+- [machinery navbat haydovchisi olib tashlandi](#remove-machinery-queue-driver)
+- [gRPC konfiguratsiyasini o‘zgartirish](#modify-grpc-configuration)
+- [Log haydovchisi almashtirildi](#switch-log-driver)
+- [migrate:rollback buyrug'ini optimallashtirish](#optimize-migrate-rollback-command)
+- [Http.Request.Bind funksiyasi olib tashlandi](#remove-http-request-bind-function)
+- [Paket sozlash metodini o‘zgartirish](#modify-package-setup-method)
+
+## v1.17.1
+
+- [Statik bayroq bilan build buyrug‘i xatosini tuzatish](#fix-the-build-command-with-static-flag-failure)
+- [Ba‘zi make buyruqlari eski kod tuzilmasiga mos kelmasligini tuzatish](#fix-some-make-commands-do-not-adapt-the-old-code-structure)
+- [Eski versiya loyihasida paket o‘rnatishda sozlamani optimallashtirish](#optimize-setup-when-installing-package-in-old-version-project)
+- [Navbat konkurentligi 1 dan katta bo‘lganda kechiktirilgan vazifa muammosini tuzatish](#fix-delay-task-issue-when-queue-concurrency-is-greater-than-1)
+
+## v1.17.2
+
+- [Migrate:rollback buyrug‘ini tuzatish](#fix-the-migrate-rollback-command)
+
+## Yangilash bo'yicha ko'rsatma
+
+[Golang v1.23 endi qo'llab-quvvatlanmaydi](https://endoflife.date/go) sababli, Goravel tomonidan qo'llab-quvvatlanadigan Golang versiyasi 1.23 dan 1.24 ga yangilandi.
+
+goravel/example loyihasini v1.16 dan v1.17 ga yangilash PRi yangilash uchun namuna sifatida ishlatilishi mumkin: [goravel/example#93](https://github.com/goravel/example/pull/93).
+
+### 1. Bog'liqliklarni yangilash
+
+```shell
+go get github.com/goravel/framework@latest
+
+// Agar gin ishlatilsa
+go get github.com/goravel/gin@latest
+
+// Agar fiber ishlatilsa
+go get github.com/goravel/fiber@latest
+
+// Agar redis ishlatilsa
+go get github.com/goravel/redis@latest
+
+// Agar S3 ishlatilsa
+go get github.com/goravel/s3@latest
+
+// Agar Oss ishlatilsa
+go get github.com/goravel/oss@latest
+
+// Agar Cos ishlatilsa
+go get github.com/goravel/cos@latest
+
+// Agar Minio ishlatilsa
+go get github.com/goravel/minio@latest
+
+go mod tidy
+
+// Agar installer ishlatilsa
+goravel upgrade
+```
+
+### 2. Yangi xizmat ko'rsatuvchilarni qo'shish
+
+```go
+// config/app.go
+import (
+ ...
+ "github.com/goravel/framework/process"
+ "github.com/goravel/framework/view"
+)
+
+"providers": []foundation.ServiceProvider{
+ ...
+ &process.ServiceProvider{}, // [!code ++]
+ &view.ServiceProvider{}, // [!code ++]
+},
+```
+
+### 3. Http mijoz konfiguratsiyasini o'zgartirish
+
+`config/http.go` faylida yangi konfiguratsiya qo'shing:
+
+```go
+"client": map[string]any{ // [!code --]
+ "base_url": config.GetString("HTTP_CLIENT_BASE_URL"), // [!code --]
+ "timeout": config.GetDuration("HTTP_CLIENT_TIMEOUT"), // [!code --]
+ "max_idle_conns": config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS"), // [!code --]
+ "max_idle_conns_per_host": config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS_PER_HOST"), // [!code --]
+ "max_conns_per_host": config.GetInt("HTTP_CLIENT_MAX_CONN_PER_HOST"), // [!code --]
+ "idle_conn_timeout": config.GetDuration("HTTP_CLIENT_IDLE_CONN_TIMEOUT"), // [!code --]
+}, // [!code --]
+"default_client": config.Env("HTTP_CLIENT_DEFAULT", "default"), // [!code ++]
+"clients": map[string]any{ // [!code ++]
+ "default": map[string]any{ // [!code ++]
+ "base_url": config.Env("HTTP_CLIENT_BASE_URL", ""), // [!code ++]
+ "timeout": config.Env("HTTP_CLIENT_TIMEOUT", "30s"), // [!code ++]
+ "max_idle_conns": config.Env("HTTP_CLIENT_MAX_IDLE_CONNS", 100), // [!code ++]
+ "max_idle_conns_per_host": config.Env("HTTP_CLIENT_MAX_IDLE_CONNS_PER_HOST", 2), // [!code ++]
+ "max_conns_per_host": config.Env("HTTP_CLIENT_MAX_CONN_PER_HOST", 0), // [!code ++]
+ "idle_conn_timeout": config.Env("HTTP_CLIENT_IDLE_CONN_TIMEOUT", "90s"), // [!code ++]
+ }, // [!code ++]
+}, // [!code ++]
+```
+
+### 4. gRPC konfiguratsiyasini o‘zgartirish
+
+Shunga muvofiq o‘zgartirish kerak: [gRPC konfiguratsiyasini o‘zgartirish](#modify-grpc-configuration)
+
+### 5. Agar siz pochta andoza orqali yubormoqchi bo'lsangiz
+
+`config/mail.go` faylida yangi konfiguratsiya qo'shing:
+
+```go
+// Andoza Konfiguratsiyasi
+//
+// Bu elektron pochta ko'rinishlari uchun andoza renderlashni boshqaradi. Andoza dvigatellari global miqyosda keshlanadi va o'rnatilgan haydovchilar ham, fabrikalar orqali maxsus amalga oshirishlar ham qo'llab-quvvatlanadi.
+//
+// Mavjud Haydovchilar: "html", "custom"
+"template": map[string]any{
+ "default": config.Env("MAIL_TEMPLATE_ENGINE", "html"),
+ "engines": map[string]any{
+ "html": map[string]any{
+ "driver": "html",
+ "path": config.Env("MAIL_VIEWS_PATH", "resources/views/mail"),
+ },
+ },
+},
+```
+
+### 6. Agar siz maxsus paket ishlab chiqqan bo‘lsangiz va uni `package:install` buyrug‘i orqali o‘rnatmoqchi bo‘lsangiz
+
+Shunga muvofiq o‘zgartirish kerak: [Paket sozlash metodini o‘zgartirish](#modify-package-setup-method)
+
+### 7. Agar siz machinery navbat haydovchisidan foydalanayotgan bo'lsangiz
+
+Shunga mos ravishda o'zgartirish kerak: [machinery navbat haydovchisi olib tashlandi](#remove-machinery-queue-driver)
+
+### 8. Agar siz maxsus log haydovchisi yaratgan bo'lsangiz
+
+Shunga mos ravishda o'zgartirish kerak: [Log haydovchisi almashtirildi](#switch-log-driver)
+
+### 9. Agar siz Http.Request.Bind funksiyasidan foydalanayotgan bo'lsangiz
+
+Shunga mos ravishda o'zgartirish kerak: [Http.Request.Bind funksiyasi olib tashlandi](#remove-http-request-bind-function)
+
+### 10. Agar siz validation.Make funksiyasi yoki maxsus qoidalar/filtrlardan foydalanayotgan bo'lsangiz
+
+Shunga mos ravishda o'zgartirish kerak: [Validation kontekstni uzatishni qo'llab-quvvatlaydi](#validation-supports-pass-context)
+
+### 11. Agar siz Orm-da global scopes-lardan foydalanayotgan bo'lsangiz
+
+Shunga mos ravishda o'zgartirish kerak: [Orm uchun WithoutGlobalScopes funksiyasini qo'shish](#add-withoutglobalscopes-function-for-orm)
+
+## Xususiyatlar tanishtiruvi
+
+### Goravel Lite
+
+Biz minimal bog'liqliklar va kichikroq hajm bilan ilovalar yaratmoqchi bo'lgan dasturchilar uchun mo'ljallangan, Goravel frameworkining engil versiyasi - [Goravel Lite](https://github.com/goravel/goravel-lite) ni tanishtirishdan xursandmiz. U Goravelning asosiy xususiyatlarini taqdim etadi, shu bilan birga dasturchilarga faqat kerakli komponentlarni qo'shish imkonini beradi.
+
+- Faqat zaruriy facades-larni o'z ichiga oladi: `Artisan`, `Config`, bu ortiqcha yukni kamaytiradi va ishlashni yaxshilaydi.
+- Boshqa facades-larni `package:install` va `package:uninstall` buyruqlari orqali kerak bo'lganda o'rnatish va o'chirish mumkin.
+- `goravel/goravel` == `goravel/goravel-lite` + barcha facades-lar. `goravel/goravel` uchun har qanday yaxshilanishlar `goravel/goravel-lite` ga yuborilishi kerak, so'ngra maxsus github action o'zgarishlarni `goravel/goravel` ga sinxronlashtiradi. Va `goravel/goravel` foydalanuvchilar uchun Goravel frameworkidan foydalanishning asosiy ombori bo'lib qoladi.
+
+### Soddalashtirilgan kod tuzilmasi
+
+Kod tuzilmasi Laravel bilan muvofiqlashtirish, saqlash va o'qilish imkoniyatini yaxshilash uchun soddalashtirildi. Eski tuzilma hali ham ishlatilishi mumkin, bu orqaga mos keladigan o'zgarishdir. Eski tuzilmadan yangi tuzilmaga o'tish biroz murakkab, agar kerak bo'lsa, misol uchun PR mavjud: [goravel/example#91](https://github.com/goravel/example/pull/91).
+
+1. Barcha `kenel.go` va standart `*_service_providers.go` fayllarini olib tashlang. `*_service_providers.go` fayllaridagi konfiguratsiyalarni `bootstrap` papkasiga ko'chiring.
+2. Barcha facades-larni framework ichkarisidan `app/facades` papkasiga ko'chiring, foydalanuvchilar ularni kerak bo'lganda moslashtirishi yoki kengaytirishi mumkin.
+3. Facades-larni ishga tushirish jarayonini soddalashtiring, endi `main.go` faylida facades-larni ishga tushirish shart emas, batafsil ma'lumot uchun [Xizmat ko'rsatuvchi ishga tushiruvchilar](../architecture-concepts/service-providers.md#runners) ga qarang.
+4. `WithPath()` funksiyasi orqali katalog tuzilishini sozlashni qo'llab-quvvatlash, batafsil ma'lumot uchun [Katalog Tuzilishini Sozlash](../getting-started/directory-structure.md#customize-directory-structure) ga murojaat qiling.
+
+### Jarayon Fasad
+
+Goravel endi Go'ning standart `os/exec` paketi atrofida ifodali va oqlangan API taqdim etadi, bu sizga ilovangizdan tashqi buyruqlarni muammosiz chaqirish imkonini beradi.
+
+[Hujjatni Ko'rish](../digging-deeper/processes.md)
+
+### Pluralizer paketi
+
+Goravel endi so'zlarni birlik va ko'plik shakllari o'rtasida til qoidalariga asoslanib o'zgartirishga yordam beradigan pluralizer paketini o'z ichiga oladi. Bu turli tillar va ularning grammatik qoidalarini boshqarishni talab qiladigan ilovalar uchun foydalidir.
+
+[Hujjatni Ko'rish](../digging-deeper/pluralization.md)
+
+### Xizmat ko'rsatuvchi ishga tushiruvchilar
+
+Xizmat ko'rsatuvchilar endi ilova ishga tushganda kodni ishga tushirish uchun `Runners` interfeysini amalga oshirishi mumkin. Bu odatda Xizmat ko'rsatuvchida aniqlangan xizmatlarni, masalan, Route, Schedule, Queue va boshqalarni ishga tushirish yoki o'chirish uchun ishlatiladi. Endi siz ushbu xizmatlarni `main.go` faylida qo'lda ishga tushirish yoki o'chirishga muhtoj emassiz, chunki Goravel buni siz uchun boshqaradi.
+
+Bu xususiyat faqat [yangi soddalashtirilgan kod tuzilmasi](#simplified-code-structure) dan foydalanganda mavjud.
+
+[Hujjatni Ko'rish](../architecture-concepts/service-providers.md#runners)
+
+### Log json formatda chop etishni qo'llab-quvvatlaydi
+
+Goravel-ning jurnal tizimi endi JSON formatida jurnallarni chiqarishni qo'llab-quvvatlaydi, bu jurnal boshqaruv tizimlari bilan integratsiyalashishni va tuzilgan jurnal yozishni osonlashtiradi.
+
+```go
+"channels": map[string]any{
+ "daily": map[string]any{
+ "driver": "daily",
+ "path": "storage/logs/goravel.log",
+ "level": config.Env("LOG_LEVEL", "debug"),
+ "days": 7,
+ "print": true,
+ // qiymat "text" yoki "json" bo'lishi mumkin
+ "formatter": "json", // [!code ++]
+ },
+},
+```
+
+### Http bir nechta klientlarni qo'llab-quvvatlaydi
+
+Goravel-ning HTTP klient moduli endi bir nechta klientlarni qo'llab-quvvatlaydi, bu sizga ilovangiz ichida turli maqsadlar uchun o'z konfiguratsiyalari bilan turli HTTP klientlarini aniqlash va ulardan foydalanish imkonini beradi.
+
+[Hujjatni Ko'rish](../digging-deeper/http-client.md#making-requests)
+
+### Validatsiya kontekstni uzatishni qo'llab-quvvatlaydi
+
+Goravel-ning validatsiya moduli endi validatsiya funksiyalariga kontekstni uzatishni qo'llab-quvvatlaydi, bu so'rov yoki operatsiya kontekstiga asoslangan yanada moslashuvchan va dinamik validatsiya stsenariylarini imkoniyatini beradi.
+
+```go
+validator, err := facades.Validation().Make(input, rules) // [!code --]
+validator, err := facades.Validation().Make(ctx, input, rules) // [!code ++]
+```
+
+Maxsus qoidalar va filtrlari ham kontekst parametrini qo'llab-quvvatlaydi:
+
+```go
+type Rule interface {
+ Signature() string
+ Passes(data Data, val any, options ...any) bool // [!code --]
+ Message() string // [!code --]
+ Passes(ctx context.Context, data Data, val any, options ...any) bool // [!code ++]
+ Message(ctx context.Context) string // [!code ++]
+}
+
+type Filter interface {
+ Signature() string
+ Handle() any // [!code --]
+ Handle(ctx context.Context) any // [!code ++]
+}
+```
+
+### Orm uchun WithoutGlobalScopes funksiyasi qo'shildi
+
+Orm paketiga yangi `WithoutGlobalScopes` funksiyasi qo'shildi, bu sizga so'rovdan barcha global skoplarni chiqarib tashlash imkonini beradi. Bu global skoplar tomonidan qo'yilgan cheklovlarsiz yozuvlarni olishni istaganingizda foydalidir.
+
+```go
+var user []User
+err := facades.Orm().Model(&User{}).WithoutGlobalScopes().Get(&user)
+err := facades.Orm().Model(&User{}).WithoutGlobalScopes("name").Get(&user)
+```
+
+Global skop nomini o'rnatishni qo'llab-quvvatlash uchun modelning `GlobalScope` interfeysi o'zgartirildi:
+
+```go
+import "github.com/goravel/framework/contracts/orm"
+
+type User struct {
+ orm.Model
+ Name string
+}
+
+func (r *User) GlobalScopes() []func(orm.Query) orm.Query { // [!code --]
+func (r *User) GlobalScopes() map[string]func(orm.Query) orm.Query { // [!code ++]
+ return map[string]func(orm.Query) orm.Query{
+ "name": func(query orm.Query) orm.Query {
+ return query.Where("name", "goravel")
+ },
+ }
+}
+```
+
+### fasadlar kerak bo'lganda o'rnatilishi va o'chirilishi mumkin
+
+[Goravel Lite](#goravel-lite) ning chiqarilishi bilan birga, endi fasadlar `package:install` va `package:uninstall` buyruqlari orqali kerak bo'lganda o'rnatilishi va o'chirilishi mumkin. Eslatma: bu xususiyat faqat sizning loyihangiz Goravel Lite bilan qurilgan yoki [yangi soddalashtirilgan kod tuzilmasi](#simplified-code-structure) ga yangilangan bo'lsagina mavjud.
+
+[Hujjatni Ko'rish](../architecture-concepts/facades.md#install-uninstall-facades)
+
+### Pochta shablon orqali yuborilishi mumkin
+
+Pochta yuborish endi shablonlarni qo'llab-quvvatlaydi, bu sizga yaxshi izchillik va oson boshqarish uchun oldindan belgilangan shablonlardan foydalanib elektron pochta xabarlarini yuborish imkonini beradi. Shablon http/template va maxsus drayverlarni qo‘llab-quvvatlaydi.
+
+[Hujjatni Ko'rish](../digging-deeper/mail.md#using-template)
+
+### Build buyrug'i ko'proq bayroqlarni qo'llab-quvvatlaydi
+
+`build` buyrug'iga yangi `--arch` va `--static` bayroqlari qo'shildi, bu sizga nishon arxitekturasini va statik binar qurish kerakligini belgilash imkonini beradi.
+
+### DB va Orm uchun funksiyalar qo'shildi va o'zgartirildi
+
+Yangi funksiyalar:
+
+- `Avg(column string, dest any) error`: Ustunning o'rtacha qiymatini hisoblaydi.
+- `Min(column string, dest any) error`: Ustunning minimal qiymatini topadi.
+- `Max(column string, dest any) error`: Ustunning maksimal qiymatini topadi.
+- `WhereAll(columns []string, args ...any) Query`: So'rovga "barcha ustunlar mos keladi" bandini qo'shadi.
+- `WhereAny(columns []string, args ...any) Query`: So'rovga "har qanday ustun mos keladi" bandini qo'shadi.
+- `WhereNone(columns []string, args ...any) Query`: So'rovga "hech qanday ustun mos kelmaydi" bandini qo'shadi.
+
+O'zgartirilgan funksiyalar:
+
+```go
+// Oldin
+Sum(column string) (int64, error)
+
+// Keyin
+Sum(column string, dest any) error
+```
+
+### Schema uchun yangi funksiyalar qo'shildi
+
+Ma'lumotlar bazasi sxema boshqaruv imkoniyatlarini kengaytirish uchun Schema paketiga yangi funksiyalar qo'shildi.
+
+- `DateTimes`: Jadvalda `created_at` va `updated_at` ustunlarini yaratadi.
+- `ForeignID`: Chet el kalitlari uchun imzosiz katta butun son ustunini yaratadi.
+- `ForeignUlid`: Chet el kalitlari uchun ULID ustunini yaratadi.
+- `ForeignUuid`: Chet el kalitlari uchun UUID ustunini yaratadi.
+
+### Yangi buyruqlar qo'shildi
+
+- `make:provider`: Yangi xizmat ko'rsatuvchi sinfini yaratadi.
+- `make:view`: Yangi ko'rinish shablon faylini yaratadi.
+
+### CSRF token middleware qo‘shish
+
+Saytlararo so'rov soxtalashtirish (CSRF) hujumlaridan himoya qilish uchun yangi middleware qo'shildi. Bu middleware autentifikatsiyadan o'tgan manbalardan kelayotgan so'rovlarni ta'minlash uchun yo'llarga qo'llanilishi mumkin.
+
+[Hujjatni Ko'rish](../the-basics/views.md#csrf-token-middleware)
+
+### Buyruq Argumentlarni sozlashni qo'llab-quvvatlaydi
+
+Buyruqlar endi argumentlarni sozlashni qo'llab-quvvatlaydi, bu sizga maxsus buyruqlaringiz ichida buyruq qatori argumentlarini samaraliroq aniqlash va boshqarish imkonini beradi.
+
+[Hujjatni Ko'rish](../digging-deeper/artisan-console.md#arguments)
+
+### make:migration model orqali migratsiya yaratishni qo'llab-quvvatlaydi
+
+`make:migration` buyrug'i mavjud modellarga asoslangan migratsiyalarni yaratishni qo'llab-quvvatlash uchun takomillashtirildi. Bu modellaringizda aniqlangan tuzilishdan foydalanib migratsiya yaratishni tezlashtiradi.
+
+[Hujjatni Ko'rish](../database/migrations.md#create-migrations)
+
+### gRPC klient ulanishlari optimallashtirildi
+
+gRPC klientlari uchun ishlash va resurslardan foydalanishni optimallashtirish uchun klient ulanishlar havuzi amalga oshirildi. Bu har bir so'rov uchun yangi ulanishlar yaratish o'rniga mavjud ulanishlarni qayta ishlatish imkonini beradi, kechikishni kamaytiradi va samaradorlikni oshiradi.
+
+### Machinery navbat haydovchisi olib tashlandi
+
+Machinery navbat haydovchi v1.16 da eskirganligi sababli butunlay olib tashlandi. Agar siz hali ham undan foydalanayotgan bo'lsangiz, boshqa navbat haydovchilariga o'tish uchun [v1.16 yangilash hujjati](./v1.16.md#optimize-queue-module-configuration) dagi ko'rsatmalarga amal qiling.
+
+### gRPC konfiguratsiyasini o‘zgartirish
+
+grpc konfiguratsiyasi `grpc.clients` dan `grpc.servers` ga o'zgartirildi va `facades.Grpc().Client()` funksiyasi eskirgan deb belgilandi va v1.18 da olib tashlanadi, iltimos, uning o'rniga `facades.Grpc().Connect()` funksiyasidan foydalaning.
+
+```go
+// config/grpc.go
+"clients": map[string]any{ // [!code --]
+"servers": map[string]any{ // [!code ++]
+```
+
+```go
+facades.Grpc().Client(ctx, "name") // [!code --]
+facades.Grpc().Connect("name") // [!code ++]
+```
+
+### Log drayverini almashtirish
+
+Yaxshilangan ishlash va tuzilgan log yozish imkoniyatlari uchun log drayveri `logrus` dan `log/slog` ga o‘zgartirildi.
+
+Maxsus log drayver interfeysi o‘zgartirildi:
+
+```go
+// framework/contracts/log/Logger
+package log
+
+type Logger interface {
+ // Handle pass channel config path here
+ Handle(channel string) (Hook, error) // [!code --]
+ Handle(channel string) (Handler, error) // [!code ++]
+}
+```
+
+Eski maxsus log drayverlarini moslashtirish uchun `log.HookToHandler` funksiyasidan foydalanishingiz mumkin:
+
+```go
+type CustomLogger struct {}
+
+func (logger *CustomLogger) Handle(channel string) (log.Handler, error) {
+ hook := /* your old custom log driver logic */
+
+ return log.HookToHandler(hook), nil
+}
+```
+
+### Migrate:rollback buyrug‘ini optimallashtirish
+
+Ilgari `migrate:rollback` buyrug‘i bir vaqtning o‘zida faqat bitta migratsiyani orqaga qaytarar edi, bu Laravel xatti-harakatiga mos kelmaydi. Endi bu buyruq standart bo‘yicha oxirgi to‘plamdagi barcha migratsiyalarni orqaga qaytaradi. Orqaga qaytariladigan to‘plamlar sonini belgilash uchun `--step` opsiyasidan foydalanishingiz mumkin.
+
+### Http.Request.Bind funksiyasini olib tashlash
+
+`Http.Request` interfeysidagi `Bind` funksiyasi olib tashlandi. Endi siz `response` orqali `Bind` metodidan foydalanishingiz mumkin.
+
+```go
+var user User
+response, err := facades.Http().Bind(&user).Get("https://github.com") // [!code --]
+response, err := facades.Http().Get("https://github.com") // [!code ++]
+err = response.Bind(&user) // [!code ++]
+```
+
+### Paket sozlash metodini o‘zgartirish
+
+Ilgari, `package:install` buyrug‘i ishga tushirilganda, paket xizmat provayderi `setup.go` fayli orqali `config/app.go` ga o‘rnatilishi mumkin edi. Endi, [Soddalashtirilgan Kod Tuzilmasi](#simplified-code-structure) ishga tushirilganligi sababli, xizmat provayderi `bootstrap/providers.go` fayliga o‘rnatilishi qo‘llab-quvvatlanadi.
+
+Agar siz faqat yangi kod tuzilmasini qo‘llab-quvvatlamoqchi bo‘lsangiz:
+
+```go
+// setup/setup.go
+package main
+
+import (
+ "os"
+
+ "github.com/goravel/framework/packages"
+ "github.com/goravel/framework/packages/match"
+ "github.com/goravel/framework/packages/modify"
+ "github.com/goravel/framework/support/path"
+)
+
+func main() {
+ // Yo‘llarni olish uchun sozlamani boshlang, bu boshida chaqirilishi kerak.
+ setup := packages.Setup(os.Args) // [!code ++]
+
+ appConfigPath := path.Config("app.go")
+ postgresServiceProvider := "&postgres.ServiceProvider{}"
+
+ // Yangi kod tuzilmalarida GetModulePath funksiyasi olib tashlandi, uning o‘rniga setup.Paths().Module().Import() dan foydalaning
+ modulePath := packages.GetModulePath() // [!code --]
+ moduleImport := setup.Paths().Module().Import() // [!code ++]
+
+ packages.Setup(os.Args).Install( // [!code --]
+ setup.Install( // [!code ++]
+ // Postgres xizmat provayderini qo‘shish
+ modify.GoFile(appConfigPath). // [!code --]
+ Find(match.Imports()).Modify(modify.AddImport(modulePath)). // [!code --]
+ Find(match.Providers()).Modify(modify.Register(postgresServiceProvider)), // [!code --]
+ modify.RegisterProvider(moduleImport, postgresServiceProvider), // [!code ++]
+ ...
+ ).
+ Uninstall(
+ // Postgres xizmat provayderini olib tashlash
+ modify.GoFile(appConfigPath). // [!code --]
+ Find(match.Providers()).Modify(modify.Unregister(postgresServiceProvider)). // [!code --]
+ Find(match.Imports()).Modify(modify.RemoveImport(modulePath)), // [!code --]
+ modify.UnregisterProvider(moduleImport, postgresServiceProvider), // [!code ++]
+ ...
+ ).
+ Execute()
+}
+```
+
+Agar siz paketingizda eski va yangi kod tuzilmalarini bir vaqtda qo‘llab-quvvatlamoqchi bo‘lsangiz, quyidagi sozlash metodidan foydalaning. Xulosa qilib aytganda, `env.IsBootstrapSetup()` funksiyasi orqali loyiha yangi kod tuzilmasidan foydalanayotganligini tekshirishingiz, so‘ngra tegishli o‘zgarishlarni qo‘llashingiz kerak. Diqqat: Eski kod tuzilmasiga moslashtirishda `match.Providers()` ni `match.ProvidersInConfig()` bilan almashtirish kerak.
+
+```go
+package main
+
+import (
+ "os"
+
+ "github.com/goravel/framework/packages"
+ "github.com/goravel/framework/packages/match"
+ "github.com/goravel/framework/packages/modify"
+ "github.com/goravel/framework/support/env"
+ "github.com/goravel/framework/support/path"
+)
+
+func main() {
+ // Yo‘llarni olish uchun sozlamani boshlang, bu boshida chaqirilishi kerak.
+ setup := packages.Setup(os.Args)
+
+ appConfigPath := path.Config("app.go")
+ postgresServiceProvider := "&postgres.ServiceProvider{}"
+
+ // Modul import yo‘lini olish uchun yangi setup.Paths().Module().Import() metodidan foydalaning
+ moduleImport := setup.Paths().Module().Import()
+
+ setup.Install(
+ // Agar eski kod tuzilmasi ishlatilsa, postgres xizmat provayderini app.go ga qo‘shish
+ modify.When(func(_ map[string]any) bool {
+ return !env.IsBootstrapSetup()
+ }, modify.GoFile(appConfigPath).
+ Find(match.Imports()).Modify(modify.AddImport(moduleImport)).
+ Find(match.ProvidersInConfig()).Modify(modify.Register(postgresServiceProvider))),
+
+ // Agar yangi kod tuzilmasi ishlatilsa, postgres xizmat provayderini providers.go ga qo‘shish
+ modify.When(func(_ map[string]any) bool {
+ return env.IsBootstrapSetup()
+ }, modify.RegisterProvider(moduleImport, postgresServiceProvider)),
+
+ ).Uninstall(
+ // Agar eski kod tuzilmasi ishlatilsa, postgres xizmat provayderini app.go dan olib tashlash
+ modify.When(func(_ map[string]any) bool {
+ return !env.IsBootstrapSetup()
+ }, modify.GoFile(appConfigPath).
+ Find(match.ProvidersInConfig()).Modify(modify.Unregister(postgresServiceProvider)).
+ Find(match.Imports()).Modify(modify.RemoveImport(moduleImport))),
+
+ // Agar yangi kod tuzilmasi ishlatilsa, postgres xizmat provayderini providers.go dan olib tashlash
+ modify.When(func(_ map[string]any) bool {
+ return env.IsBootstrapSetup()
+ }, modify.UnregisterProvider(moduleImport, postgresServiceProvider)),
+ ).Execute()
+}
+```
+
+### Statik bayroq bilan build buyrug‘i xatosini tuzatish
+
+goravel/framework: v1.17.1
+
+Go versiyasi 1.24 ga yangilanganligi sababli `./artisan build -s` buyrug‘i `--static` bayrog‘i bilan ishlamadi.
+
+### Ba‘zi make buyruqlari eski kod tuzilmasiga mos kelmasligini tuzatish
+
+goravel/framework: v1.17.1
+
+`make:rule`, `make:filter`, `make:migration`, `make:package` va boshqa buyruqlar fayllarni yaratishda eski kod tuzilmasiga mos kelmaydi. Endi bu buyruqlar `env.IsBootstrapSetup()` funksiyasi orqali loyiha yangi soddalashtirilgan kod tuzilmasidan foydalanayotganligini aniqlay oladi va fayllarni to‘g‘ri kataloglarga yaratadi.
+
+### Eski versiya loyihasida paket o‘rnatishda sozlamani optimallashtirish
+
+goravel/framework: v1.17.1
+
+Agar siz maxsus paket yaratgan bo‘lsangiz, `setup.go` faylidagi `Providers` funksiyasi yangi kod tuzilmasiga moslashishi uchun o‘zgartirildi. Shuning uchun, agar siz eski kod tuzilmasini qo‘llab-quvvatlamoqchi bo‘lsangiz, uni `ProvidersInConfig` funksiyasi bilan almashtirishingiz kerak. Batafsil ma‘lumot uchun [Paket sozlash metodini o‘zgartirish](#modify-package-setup-method) ga qarang.
+
+### Navbat konkurentligi 1 dan katta bo‘lganda kechiktirilgan vazifa muammosini tuzatish
+
+goravel/framework: v1.17.1
+
+goravel/redis: v1.17.1
+
+Navbat ishchisi konkurentligi 1 dan katta bo‘lganda, kechiktirilgan vazifalar bir necha marta bajariladi. Buning sababi, bir nechta ishchilar kechiktirilgan vazifa mavjud bo‘lganda uni bir vaqtning o‘zida olishi mumkin. Endi kechiktirilgan vazifani bir vaqtning o‘zida faqat bitta ishchi bajarishini ta’minlash uchun tarqatilgan qulf ishlatiladi.
+
+### Migrate:rollback buyrug‘ini tuzatish
+
+goravel/framework: v1.17.2
+
+Avvalroq, `migrate:rollback` buyrug‘i orqaga qaytarilgan migratsiyalarning partiya raqamini sukut bo‘yicha 1 ga o‘rnatgan, bu orqaga qaytarishda muammolarga sabab bo‘lgan. Endi esa buyruq partiya raqamini 1 o‘rniga oxirgi partiya raqamiga o‘rnatadi.
diff --git a/uz_UZ/upgrade/v1.2.md b/uz_UZ/upgrade/v1.2.md
new file mode 100644
index 000000000..cc94246d5
--- /dev/null
+++ b/uz_UZ/upgrade/v1.2.md
@@ -0,0 +1,74 @@
+# v1.1 dan v1.2 ga yangilash
+
+## Yuqori ta'sirli o'zgarishlar
+
+- [Bog'liqliklarni yangilash](#updating-dependencies)
+- [Auth yordam konteksti](#auth-support-context)
+
+## Yangilash bo'yicha qo'llanma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+**Ta'sir ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.2.1
+```
+
+### Auth yordam konteksti
+
+**Ta'sir ehtimoli: Yuqori**
+
+```
+// Eski
+facades.Auth.Parse(token string) error
+
+// Yangi
+facades.Auth.Parse(ctx http.Context, token string) error
+```
+
+```
+// Eski
+facades.Auth.User(ctx http.Context, user interface{}) error
+
+// Yangi
+facades.Auth.User(ctx http.Context, user interface{}) error
+```
+
+```
+// Eski
+facades.Auth.facades.Auth.Login(user interface{}) (token string, err error)
+
+// Yangi
+facades.Auth.facades.Auth.Login(ctx http.Context, user interface{}) (token string, err error)
+```
+
+```
+// Eski
+facades.Auth.LoginUsingID(id interface{}) (token string, err error)
+
+// Yangi
+facades.Auth.LoginUsingID(ctx http.Context, id interface{}) (token string, err error)
+```
+
+```
+// Eski
+facades.Auth.Refresh() (token string, err error)
+
+// Yangi
+facades.Auth.Refresh(ctx http.Context) (token string, err error)
+```
+
+```
+// Eski
+facades.Auth.Logout() error
+
+// Yangi
+facades.Auth.Logout(ctx http.Context) error
+```
+
+Batafsil ma'lumot uchun [facades.Auth](../security/authentication.md)。
diff --git a/uz_UZ/upgrade/v1.3.md b/uz_UZ/upgrade/v1.3.md
new file mode 100644
index 000000000..dc29549ca
--- /dev/null
+++ b/uz_UZ/upgrade/v1.3.md
@@ -0,0 +1,39 @@
+# v1.2 dan v1.3 ga yangilash
+
+## O‘rtacha ta'sirga ega o'zgarishlar
+
+- [CORS konfiguratsiyasini qo‘shish](#add-cors-configuration)
+
+## Past ta'sirga ega o'zgarishlar
+
+- [Dockerfile qo‘shish](#add-dockerfile)
+
+## Yangilash bo‘yicha ko‘rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog‘liqliklarni yangilash
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog‘liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.3.1
+```
+
+### CORS konfiguratsiyasini qo‘shish
+
+**Ta'sir qilish ehtimoli: O‘rtacha**
+
+[config/cors.go](https://github.com/goravel/goravel/blob/v1.3.1/config/cors.go)
+
+[Tafsilotlar uchun](../the-basics/routing.md#cross-origin-resource-sharing-cors)
+
+### Dockerfile qo‘shish
+
+**Ta'sir qilish ehtimoli: Past**
+
+[Dockerfile](https://github.com/goravel/goravel/blob/v1.3.1/Dockerfile)
+
+[Tafsilotlar uchun](../getting-started/compile.md#docker)
diff --git a/uz_UZ/upgrade/v1.4.md b/uz_UZ/upgrade/v1.4.md
new file mode 100644
index 000000000..9be038974
--- /dev/null
+++ b/uz_UZ/upgrade/v1.4.md
@@ -0,0 +1,62 @@
+# v1.3 dan v1.4 ga yangilash
+
+[[toc]]
+
+## Yuqori ta'sirli o'zgarishlar
+
+- [Grpc modulini optimallashtirish](#optimize-grpc-module)
+- [Marshrut ro'yxatini optimallashtirish](#optimize-route-register)
+
+## Past ta'sirli o'zgarishlar
+
+- [http.Context metodini qo'shish](#add-http-context-method)
+- [So'rov metodini qo'shish](#add-request-method)
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.4.0
+```
+
+### Grpc modulini optimallashtirish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+1. [app/grpc/kernel.go](https://github.com/goravel/goravel/blob/v1.4.0/app/grpc/kernel.go) faylini qo'shing;
+2. [app/grpc/interceptors](https://github.com/goravel/goravel/tree/v1.4.0/app/grpc/interceptors) papkasini qo'shing;
+3. [config/grpc.go](https://github.com/goravel/goravel/blob/v1.4.0/config/grpc.go) faylini qo'shing;
+4. [routes/grpc.go](https://github.com/goravel/goravel/blob/v1.4.0/routes/grpc.go) faylini qo'shing;
+5. [app/providers/grpc_service_provider.go](https://github.com/goravel/goravel/blob/v1.4.0/app/providers/grpc_service_provider.go) faylida interceptorlarni ro'yxatdan o'tkazish mantiqini qo'shing;
+6. [config/app.go](https://github.com/goravel/goravel/blob/v1.4.0/config/app.go) faylidan `grpc_host` ni olib tashlang;
+
+[Tafsilotlar uchun](../the-basics/grpc.md)
+
+### Marshrut ro'yxatini optimallashtirish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+[app/providers/route_service_provider.go](https://github.com/goravel/goravel/blob/v1.4.0/app/providers/route_service_provider.go) faylida `routes.Web()` ni `Register()` dan `Boot()` ga o'tkazing;
+
+### http.Context metodini qo'shish
+
+**Ta'sir qilish ehtimoli: Past**
+
+`ctx.Context()` metodini qo'shing.
+
+[Tafsilotlar uchun](../the-basics/request.md#get-context)
+
+### So'rov metodini qo'shish
+
+**Ta'sir qilish ehtimoli: Past**
+
+`ctx.Request().AbortWithStatusJson` metodini qo'shing.
+
+[Tafsilotlar uchun](../the-basics/request.md#abort-request)
diff --git a/uz_UZ/upgrade/v1.5.md b/uz_UZ/upgrade/v1.5.md
new file mode 100644
index 000000000..8946cc20d
--- /dev/null
+++ b/uz_UZ/upgrade/v1.5.md
@@ -0,0 +1,30 @@
+# v1.4 dan v1.5 ga yangilash
+
+[[toc]]
+
+## Yuqori Ta'sirli O'zgarishlar
+
+- [Fayl Saqlash Modulini Qo'shish](#add-file-storage-module)
+
+## Yangilash Qo'llanmasi
+
+**Taxminiy Yangilash Vaqti: 1 Daqiqa**
+
+### Bog'liqliklarni Yangilash
+
+**Ta'sir Ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.5.0
+```
+
+### Fayl Saqlash Modulini Qo'shish
+
+**Ta'sir Ehtimoli: Yuqori**
+
+1. [config/filesystems.go](https://github.com/goravel/goravel/blob/v1.5.0/config/filesystems.go) faylini qo'shing;
+2. [config/app.go](https://github.com/goravel/goravel/blob/v1.5.0/config/app.go) faylidagi `providers` bandiga `&filesystem.ServiceProvider{}` ni qo'shing;
+
+[Tafsilotlar uchun](../digging-deeper/filesystem.md)
diff --git a/uz_UZ/upgrade/v1.6.md b/uz_UZ/upgrade/v1.6.md
new file mode 100644
index 000000000..41a97618c
--- /dev/null
+++ b/uz_UZ/upgrade/v1.6.md
@@ -0,0 +1,30 @@
+# v1.5 dan v1.6 ga yangilash
+
+[[toc]]
+
+## Yuqori ta'sirli o'zgarishlar
+
+- [Avtorizatsiya modulini qo'shish](#add-authorization-module)
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+**Ta'sir etish ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.6.3
+```
+
+### Avtorizatsiya modulini qo'shish
+
+**Ta'sir etish ehtimoli: Yuqori**
+
+1. [app/providers/auth_service_provider.go](https://github.com/goravel/goravel/blob/v1.6.0/app/providers/auth_service_provider.go) faylini qo'shing;
+2. [config/app.go](https://github.com/goravel/goravel/blob/v1.6.0/config/app.go) faylidagi `providers` bandiga `&providers.AuthServiceProvider{}` ni qo'shing;
+
+[Tafsilotlar uchun](../security/authorization.md)
diff --git a/uz_UZ/upgrade/v1.7.md b/uz_UZ/upgrade/v1.7.md
new file mode 100644
index 000000000..e788551db
--- /dev/null
+++ b/uz_UZ/upgrade/v1.7.md
@@ -0,0 +1,72 @@
+# v1.6 dan v1.7 ga yangilash
+
+[[toc]]
+
+## Yuqori ta'sirli o'zgarishlar
+
+- [Validatsiya modulini qo'shish(v1.7.0)](#add-validation-module)
+- [So'rov shablonidagi XATOni tuzatish(v1.7.1)](#fix-request-template-bug)
+- [Validatsiya modulidagi XATOni tuzatish(v1.7.2)](#fix-Validation-module-big)
+- [Auth modulidagi XATOni tuzatish(v1.7.3)](#fix-auth-module-bug)
+
+## Past ta'sirli o'zgarishlar
+
+- [Navbat modulining navbat nomini optimallashtirish(v1.7.2)](#optimize-the-queue-name-of-the-queue-module)
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```go
+github.com/goravel/framework v1.7.3
+```
+
+### Validatsiya modulini qo'shish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+Versiya: v1.7.0
+
+1. [app/providers/validation_service_provider.go](https://github.com/goravel/goravel/blob/v1.7.0/app/providers/validation_service_provider.go) faylini qo'shing;
+2. [config/app.go](https://github.com/goravel/goravel/blob/v1.7.0/config/app.go) faylidagi `providers` bandiga `&validation.ServiceProvider{}`, `&providers.ValidationServiceProvider{},` ni qo'shing;
+
+[Tafsilotlar uchun](../the-basics/validation.md)
+
+### So'rov shablonidagi XATOni tuzatish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+Versiya: v1.7.1
+
+1. `go run . artisan make:request Test` buyrug'i bilan yaratilgan so'rov shablonidagi import yo'li XATOsini tuzatish. artisan make:request Test\`;
+
+### Validatsiya modulidagi XATOni tuzatish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+Versiya: v1.7.2
+
+1. `facades.Validation` moduli bir nechta maxsus Qoidani ro'yxatdan o'tkazganda ishlamay qoladigan XATOni tuzatish;
+
+### Navbat modulining navbat nomini optimallashtirish
+
+**Ta'sir qilish ehtimoli: Past**
+
+Versiya: v1.7.2
+
+1. `facades.Queue` modulining navbat nomiga amalda bajarilganda prefiks qo'shish, bir nechta loyihalarni farqlash uchun, prefiks qoidasi: ${app_name}_queues:${queue};
+2. Yashirin optimallashtirish, siz hech qanday kodni o'zgartirishingiz shart emas;
+
+### Auth modulidagi XATOni tuzatish
+
+**Ta'sir qilish ehtimoli: Yuqori**
+
+Versiya: v1.7.3
+
+1. Foydalanuvchi jadvalining asosiy kaliti `string` turida bo'lganda, `facades.Auth.User` usulini chaqirganda `Unknown column` xatosini qaytaradigan XATOni tuzatish;
diff --git a/uz_UZ/upgrade/v1.8.md b/uz_UZ/upgrade/v1.8.md
new file mode 100644
index 000000000..74354337a
--- /dev/null
+++ b/uz_UZ/upgrade/v1.8.md
@@ -0,0 +1,178 @@
+# v1.7 dan v1.8 ga yangilash
+
+[[toc]]
+
+## Qiziqarli yangi imkoniyatlar 🎉
+
+- [Orm uchun model assotsiatsiyasini qo'shish (1.8.0)](#add-model-association-for-orm)
+
+## Yaxshilanishlar 🚀
+
+- [Request uchun metodlarni qo'shish (1.8.0)](#add-methods-for-request)
+- [Response uchun metodlarni qo'shish (1.8.0)](#add-methods-for-response)
+- [Ma'lumotlar bazasi migratsiyasini optimallashtirish (1.8.0)](#optimize-database-migrate)
+- [Route HTTPS ni qo'llab-quvvatlaydi (1.8.3)](#route-supports-https)
+
+## O'zgartirishlar talab qiladigan o'zgarishlar 🛠
+
+- [Import tartibini optimallashtirish (1.8.0)](#optimize-import-order)
+- [mock.Validator nomini o'zgartirish (1.8.0)](#mock-validator-change-Name)
+- [support.Mysql nomini o'zgartirish (1.8.0)](#support-mysql-change-name)
+- [database.NewGormInstance iste'moldan chiqarilishi kutilmoqda (1.8.0)](#database-newgorminstance-is-about-to-be-deprecated)
+
+## Xatoliklarni tuzatishlar 🐛
+
+- [Orm konkurentlik xavfsizligi muammosini tuzatish (1.8.1)](#fix-Orm-concurrency-safety-issue)
+- [Mail moduli 25 va 465 portlari orqali pochta yubora olmasligini tuzatish (1.8.2)](#fix-mail-module-can-t-send-mail-by-25-and-465-ports)
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 1 daqiqa**
+
+### Bog'liqliklarni yangilash
+
+`go.mod` faylidagi bog'liqliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.8.3
+```
+
+### Orm uchun model assotsiatsiyasini qo'shish
+
+Versiya: v1.8.0
+
+Model assotsiatsiyasini boshqarish uchun Orm ga metodlar qo'shildi:
+
+| Metod | Harakat |
+| ------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| Assotsiatsiya | [Assotsiatsiya](../orm/relationships.md#querying-associations) |
+| DB | [Umumiy ma'lumotlar bazasi interfeysi sql.DB](../orm/getting-started.md#generic-database-interface-sqldb) |
+| Load | [Lazy Eager Loading](../orm/relationships.md#lazy-eager-loading) |
+| LoadMissing | [Lazy Eager Loading (mavjud emas)](../orm/relationships.md#lazy-eager-loading) |
+| Omit | [Assotsiatsiyalarni chetlab o'tish](../orm/relationships.md#create-or-update-associations) |
+| With | [Eager Loading](../orm/relationships.md#Eager-Loading) |
+
+### Request uchun metodlarni qo'shish
+
+Versiya: v1.8.0
+
+`Query` parametrlarining formatini boyitish uchun `ctx.Request()` ga metodlar qo'shildi:
+
+| Metod | Harakat |
+| ------------ | ---------------------------------------------------------------------------------------------- |
+| `QueryArray` | [Massiv parametrlarini olish](../the-basics/request.md#Retrieving-Input-From-The-Query-String) |
+| `QueryMap` | [Xarita parametrlarini olish](../the-basics/request.md#Retrieving-Input-From-The-Query-String) |
+
+### Response-uchun-metodlarni-qo'shish
+
+Versiya: v1.8.0
+
+`ctx.Response()` ga `Origin` metodi qo'shildi, HTTP middleware da `Response` ning barcha ma'lumotlarini olishingiz mumkin.
+
+[Tafsilotlar](../the-basics/response.md#Get-Response)
+
+### Import tartibini optimallashtirish
+
+Versiya: v1.8.0
+
+`bootstrap/app.go` faylidagi import tartibi quyidagicha o'zgartirildi:
+
+```go
+package bootstrap
+
+import (
+ "github.com/goravel/framework/foundation"
+
+ "goravel/config"
+)
+```
+
+[Fayl](https://github.com/goravel/goravel/blob/v1.8.0/bootstrap/app.go)
+
+### Ma'lumotlar bazasi migratsiyasini optimallashtirish
+
+Versiya: v1.8.0
+
+Migratsiya faylini yaratadigan buyruqni ishga tushiring: `go run . artisan make:migration create_users_table`, tegishli migratsiya fayli hozirda ishlatilayotgan standart ma'lumotlar bazasi haydovchisi asosida (`facades.Config.GetString("database.default")`) yaratiladi.
+
+### mock.Validator nomini o'zgartirish
+
+Versiya: v1.8.0
+
+Agar birlik testlarini yozish uchun `mock.Validator` dan foydalansangiz, quyidagi o'zgartirishlar talab qilinadi:
+
+```
+import "github.com/goravel/framework/testing/mock"
+
+mock.Validator
+
+// O'zgartirish
+
+import "github.com/goravel/framework/testing/mock"
+
+mock.Validation
+```
+
+[Tafsilotlar](../testing/mock.md#Mock-facades.Validation)
+
+### support.Mysql nomini o'zgartirish
+
+Versiya: v1.8.0
+
+Agar ma'lumotlar bazasi haydovchisini aniqlash uchun `support.Mysql` kabi framework konstantalaridan foydalansangiz, quyidagi o'zgartirishlarni amalga oshirishingiz kerak:
+
+```go
+import "github.com/goravel/framework/database/support"
+
+support.Mysql
+support.Postgresql
+support.Sqlite
+support.Sqlserver
+
+// O'zgartirish
+
+import "github.com/goravel/framework/contracts/database/orm"
+
+orm.Mysql
+orm.Postgresql
+orm.Sqlite
+orm.Sqlserver
+```
+
+`orm.Mysql` kabi yangi konstantalar `orm.Driver` turiga ega va `orm.Mysql.String()` metodi yordamida satr turiga aylantirilishi mumkin.
+
+### database.NewGormInstance iste'moldan chiqarilishi kutilmoqda
+
+Versiya: v1.8.0
+
+`database.NewGormInstance` metodi v1.9.0 versiyasida iste'moldan chiqariladi, hozirgi versiyada foydalanish mumkin, agar ushbu metod orqali `gorm` instansiyasini olsangiz, quyidagi o'zgartirishlar talab qilinadi:
+
+```go
+import "github.com/goravel/framework/database"
+
+gorm, err := database.NewGormInstance(connection)
+
+// O'zgartirish
+
+import "github.com/goravel/framework/database/gorm"
+
+gorm, err := gorm.New(connection)
+```
+
+### Orm konkurentlik xavfsizligi muammosini tuzatish
+
+Versiya: v1.8.1
+
+Yuqori konkurentlik bilan kirishda, `facades.Orm` ni birinchi marta o'qish natijasida nil qaytarilishi mumkin edi.
+
+### Mail moduli 25 va 465 portlari orqali pochta yubora olmasligini tuzatish
+
+Versiya: v1.8.2
+
+Endi 25, 465, 587 portlari orqali pochta yuborishingiz mumkin.
+
+### Route HTTPS ni qo'llab-quvvatlaydi
+
+Versiya: v1.8.3
+
+`facades.Route` ga `RunTLS` metodi qo'shildi, HTTPS serverini ishga tushirishni qo'llab-quvvatlaydi, [Tafsilotlar uchun](../the-basics/routing.md#start-https-server).
diff --git a/uz_UZ/upgrade/v1.9.md b/uz_UZ/upgrade/v1.9.md
new file mode 100644
index 000000000..19a7e7dc8
--- /dev/null
+++ b/uz_UZ/upgrade/v1.9.md
@@ -0,0 +1,139 @@
+# v1.8 dan v1.9 ga yangilash
+
+[[toc]]
+
+## Yaxshilanishlar 🚀
+
+- [Ma'lumotlar bazasini o'qish-yozish ajratishini qo'shish (1.9.0)](#add-database-read-write-separation)
+- [Ma'lumotlar bazasi havuzi konfiguratsiyasini qo'shish (1.9.0)](#add-database-pool-configuration)
+- [Maxsus .env yo'li (1.9.0)](#custom--env-path)
+- [Keshga xotira drayverini qo'shish (1.9.0)](#cache-add-memory-driver)
+- [Orm uchun Paginate metodini qo'shish (1.9.0)](#orm-add-paginate-method)
+- [Make buyrug'ini qo'shish (1.9.0)](#add-make-command)
+- [Response uchun yangi metodlarni qo'shish (1.9.0)](#add-new-methods-for-Response)
+
+## Qayta ko'rib chiqish talab qiladigan o'zgarishlar 🛠
+
+- [Request PrepareForValidation metodi uchun qaytarish qiymatini qo'shish (1.9.0)](#add-return-for-request-prepareforvalidation-method)
+
+## Xatolarni tuzatish 🐛
+
+- [Fayl noto'g'ri fayl turini olishi (1.9.0)](#file-gets-the-wrong-file-type)
+- [make:event va make:listener buyrug'idagi shablon xatosini tuzatish (1.9.0)](#fix-template-error-on-make-event-and-make-listener-command)
+- [Ba'zi turlar faylni saqlaganda kengaytmani ola olmasligini tuzatish (1.9.1)](#fix-some-types-cannot-obtain-suffixes-when-save-file)
+
+## Qaramliklarni yangilash ⬆️
+
+- build(deps): bump github.com/gin-gonic/gin from v1.7.3 to v1.8.2
+
+## Yangilash bo'yicha ko'rsatma
+
+**Taxminiy yangilash vaqti: 10 daqiqa**
+
+### Qaramliklarni yangilash
+
+`go.mod` faylidagi qaramliklarni yangilang:
+
+```
+go get -u github.com/goravel/framework@v1.9.0
+```
+
+### Ma'lumotlar bazasini o'qish-yozish ajratishini qo'shish
+
+Versiya: v1.9.0
+
+Ma'lumotlar bazasi o'qish-yozish ajratishni qo'llab-quvvatlaydi, [Batafsil](../orm/getting-started.md#read--write-connections).
+
+### Ma'lumotlar bazasi havuzi konfiguratsiyasini qo'shish
+
+Versiya: v1.9.0
+
+Ma'lumotlar bazasi konfiguratsiya fayliga havuz konfiguratsiyasini qo'shing: `config/database.go`, [Batafsil](https://github.com/goravel/goravel/blob/v1.9.x/config/database.go).
+
+### Maxsus .env yo'li
+
+Versiya: v1.9.0
+
+```
+// Ishlab chiqish
+go run . --env=../.env
+
+// Kompilyatsiya qilingan
+./main --env=../.env
+```
+
+### Keshga xotira drayverini qo'shish
+
+Versiya: v1.9.0
+
+`config/cache.go` ga `memory` konfiguratsiyasini qo'shing:
+
+```
+"stores": map[string]any{
+ // Yangi
+ "memory": map[string]any{
+ "driver": "memory",
+ },
+},
+```
+
+[Batafsil](https://github.com/goravel/goravel/blob/v1.9.x/config/cache.go)
+
+### Orm uchun Paginate metodini qo'shish
+
+Versiya: v1.9.0
+
+`facades.Orm` ga `Paginate` metodini qo'shdi, [Batafsil](../orm/getting-started.md#Paginate).
+
+### Make buyrug'ini qo'shish
+
+Versiya: v1.9.0
+
+```
+// Controller yaratish
+go run . artisan make:controller UserController
+
+// Middleware yaratish
+go run . artisan make:middleware Cors
+
+// Model yaratish
+go run . artisan make:model User
+```
+
+### Response uchun yangi metodlarni qo'shish
+
+Versiya: v1.9.0
+
+| Metod | Harakat |
+| ------------------ | ----------------------------------------------------------- |
+| Ma'lumot | [Maxsus qaytarish](../the-basics/response.md#custom-return) |
+| Qayta yo'naltirish | [Qayta yo'naltirish](../the-basics/response.md#redirect) |
+
+### Request PrepareForValidation metodi uchun qaytarish qiymatini qo'shish
+
+Versiya: v1.9.0
+
+Agar siz [Tekshiruvdan oldin ma'lumotlarni formatlash](../the-basics/validation.md#format-data-before-validation) bo'limidagi PrepareForValidation metodidan foydalanayotgan bo'lsangiz, iltimos, qaytarish qiymatini qo'shing: `PrepareForValidation(data validation.Data) error`.
+
+### Fayl noto'g'ri fayl turini olishi
+
+Versiya: v1.9.0
+
+`.docx`, `.xlsx` va boshqalar noto'g'ri `.zip` deb aniqlangan muammoni tuzatish.
+
+### make:event va make:listener buyrug'idagi shablon xatosini tuzatish
+
+Versiya: v1.9.0
+
+`import "github.com/goravel/framework/contracts/events"` ni `import "github.com/goravel/framework/contracts/event"` ga o'zgartiring
+
+### Ba'zi turlar faylni saqlaganda kengaytmani ola olmasligini tuzatish
+
+Versiya: v1.9.1
+
+Ba'zi turlar quyidagi kod orqali kengaytmani olishi mumkin emas:
+
+```go
+file, err := ctx.Request().File()
+file.Store("upload")
+```