From 47a72620ea21ddd63682aa80419b70d113771df9 Mon Sep 17 00:00:00 2001 From: xiaoyu2er Date: Mon, 2 Jun 2025 20:18:38 +0000 Subject: [PATCH] docs: update documentation translations --- .../01-getting-started/01-installation.mdx | 341 ++++ .../02-project-structure.mdx | 407 ++++ .../03-layouts-and-pages.mdx | 294 +++ .../01-app/01-getting-started/04-images.mdx | 199 ++ .../01-app/01-getting-started/05-fonts.mdx | 203 ++ .../docs/01-app/01-getting-started/06-css.mdx | 295 +++ .../07-server-and-client-components.mdx | 568 ++++++ .../01-getting-started/08-fetching-data.mdx | 658 +++++++ .../09-caching-and-revalidating.mdx | 252 +++ .../01-getting-started/10-updating-data.mdx | 352 ++++ .../01-getting-started/11-error-handling.mdx | 317 ++++ .../12-partial-prerendering.mdx | 283 +++ .../13-metadata-and-og-images.mdx | 322 ++++ .../01-getting-started/14-deploying.mdx | 82 + .../01-getting-started/15-upgrading.mdx | 54 + .../docs/01-app/01-getting-started/index.mdx | 23 + .../ar/docs/01-app/02-guides/analytics.mdx | 234 +++ .../docs/01-app/02-guides/authentication.mdx | 1653 +++++++++++++++++ .../01-app/02-guides/ci-build-caching.mdx | 171 ++ .../02-guides/content-security-policy.mdx | 299 +++ .../ar/docs/01-app/02-guides/css-in-js.mdx | 324 ++++ .../docs/01-app/02-guides/custom-server.mdx | 123 ++ .../ar/docs/01-app/02-guides/debugging.mdx | 181 ++ .../ar/docs/01-app/02-guides/draft-mode.mdx | 217 +++ .../02-guides/environment-variables.mdx | 280 +++ .../ar/docs/01-app/02-guides/forms.mdx | 493 +++++ .../incremental-static-regeneration.mdx | 614 ++++++ .../ar/docs/01-app/02-guides/index.mdx | 65 + .../docs/01-app/02-guides/instrumentation.mdx | 98 + .../01-app/02-guides/internationalization.mdx | 218 +++ .../ar/docs/01-app/02-guides/json-ld.mdx | 87 + .../ar/docs/01-app/02-guides/lazy-loading.mdx | 259 +++ .../01-app/02-guides/local-development.mdx | 188 ++ .../content/ar/docs/01-app/02-guides/mdx.mdx | 896 +++++++++ .../ar/docs/01-app/02-guides/memory-usage.mdx | 139 ++ .../migrating/app-router-migration.mdx | 936 ++++++++++ .../migrating/from-create-react-app.mdx | 583 ++++++ .../01-app/02-guides/migrating/from-vite.mdx | 552 ++++++ .../docs/01-app/02-guides/migrating/index.mdx | 6 + .../ar/docs/01-app/02-guides/multi-tenant.mdx | 9 + .../ar/docs/01-app/02-guides/multi-zones.mdx | 144 ++ .../docs/01-app/02-guides/open-telemetry.mdx | 371 ++++ .../01-app/02-guides/package-bundling.mdx | 140 ++ .../01-app/02-guides/production-checklist.mdx | 152 ++ .../01-app/02-guides/progressive-web-apps.mdx | 659 +++++++ .../ar/docs/01-app/02-guides/redirecting.mdx | 649 +++++++ .../content/ar/docs/01-app/02-guides/sass.mdx | 126 ++ .../ar/docs/01-app/02-guides/scripts.mdx | 424 +++++ .../ar/docs/01-app/02-guides/self-hosting.mdx | 271 +++ .../02-guides/single-page-applications.mdx | 426 +++++ .../docs/01-app/02-guides/static-exports.mdx | 369 ++++ .../ar/docs/01-app/02-guides/tailwind-css.mdx | 163 ++ .../docs/01-app/02-guides/testing/cypress.mdx | 289 +++ .../docs/01-app/02-guides/testing/index.mdx | 28 + .../ar/docs/01-app/02-guides/testing/jest.mdx | 389 ++++ .../01-app/02-guides/testing/playwright.mdx | 132 ++ .../docs/01-app/02-guides/testing/vitest.mdx | 206 ++ .../02-guides/third-party-libraries.mdx | 435 +++++ .../01-app/02-guides/upgrading/codemods.mdx | 554 ++++++ .../docs/01-app/02-guides/upgrading/index.mdx | 9 + .../01-app/02-guides/upgrading/version-14.mdx | 39 + .../01-app/02-guides/upgrading/version-15.mdx | 605 ++++++ .../ar/docs/01-app/02-guides/videos.mdx | 272 +++ .../01-routing/04-linking-and-navigating.mdx | 322 ++++ .../06-loading-ui-and-streaming.mdx | 197 ++ .../01-routing/13-route-handlers.mdx | 617 ++++++ .../01-routing/14-middleware.mdx | 663 +++++++ .../01-routing/index.mdx | 7 + .../03-server-actions-and-mutations.mdx | 562 ++++++ .../02-data-fetching/index.mdx | 6 + .../03-building-your-application/index.mdx | 8 + .../ar/docs/01-app/04-deep-dive/caching.mdx | 594 ++++++ .../ar/docs/01-app/04-deep-dive/index.mdx | 6 + .../05-api-reference/01-directives/index.mdx | 8 + .../01-directives/use-cache.mdx | 377 ++++ .../01-directives/use-client.mdx | 125 ++ .../01-directives/use-server.mdx | 163 ++ .../05-api-reference/02-components/font.mdx | 1074 +++++++++++ .../05-api-reference/02-components/form.mdx | 408 ++++ .../05-api-reference/02-components/image.mdx | 1252 +++++++++++++ .../05-api-reference/02-components/index.mdx | 8 + .../05-api-reference/02-components/link.mdx | 1523 +++++++++++++++ .../05-api-reference/02-components/script.mdx | 470 +++++ .../01-metadata/app-icons.mdx | 261 +++ .../03-file-conventions/01-metadata/index.mdx | 18 + .../01-metadata/manifest.mdx | 74 + .../01-metadata/opengraph-image.mdx | 463 +++++ .../01-metadata/robots.mdx | 150 ++ .../01-metadata/sitemap.mdx | 427 +++++ .../03-file-conventions/default.mdx | 60 + .../03-file-conventions/dynamic-routes.mdx | 115 ++ .../03-file-conventions/error.mdx | 324 ++++ .../03-file-conventions/forbidden.mdx | 52 + .../03-file-conventions/index.mdx | 6 + .../instrumentation-client.mdx | 48 + .../03-file-conventions/instrumentation.mdx | 141 ++ .../intercepting-routes.mdx | 85 + .../03-file-conventions/layout.mdx | 657 +++++++ .../03-file-conventions/loading.mdx | 36 + .../03-file-conventions/mdx-components.mdx | 73 + .../03-file-conventions/middleware.mdx | 137 ++ .../03-file-conventions/not-found.mdx | 99 + .../03-file-conventions/page.mdx | 198 ++ .../03-file-conventions/parallel-routes.mdx | 482 +++++ .../03-file-conventions/public-folder.mdx | 47 + .../03-file-conventions/route-groups.mdx | 34 + .../route-segment-config.mdx | 226 +++ .../03-file-conventions/route.mdx | 141 ++ .../03-file-conventions/src-folder.mdx | 37 + .../03-file-conventions/template.mdx | 74 + .../03-file-conventions/unauthorized.mdx | 116 ++ .../05-api-reference/04-functions/after.mdx | 184 ++ .../04-functions/cacheLife.mdx | 256 +++ .../04-functions/cacheTag.mdx | 204 ++ .../04-functions/connection.mdx | 60 + .../05-api-reference/04-functions/cookies.mdx | 292 +++ .../04-functions/draft-mode.mdx | 139 ++ .../05-api-reference/04-functions/fetch.mdx | 101 + .../04-functions/forbidden.mdx | 174 ++ .../04-functions/generate-image-metadata.mdx | 228 +++ .../04-functions/generate-metadata.mdx | 1309 +++++++++++++ .../04-functions/generate-sitemaps.mdx | 81 + .../04-functions/generate-static-params.mdx | 447 +++++ .../04-functions/generate-viewport.mdx | 239 +++ .../05-api-reference/04-functions/headers.mdx | 75 + .../04-functions/image-response.mdx | 214 +++ .../05-api-reference/04-functions/index.mdx | 8 + .../04-functions/next-request.mdx | 125 ++ .../04-functions/next-response.mdx | 148 ++ .../04-functions/not-found.mdx | 41 + .../04-functions/permanentRedirect.mdx | 64 + .../04-functions/redirect.mdx | 208 +++ .../04-functions/revalidatePath.mdx | 124 ++ .../04-functions/revalidateTag.mdx | 79 + .../04-functions/unauthorized.mdx | 236 +++ .../04-functions/unstable_cache.mdx | 98 + .../04-functions/unstable_noStore.mdx | 49 + .../04-functions/unstable_rethrow.mdx | 66 + .../04-functions/use-link-status.mdx | 228 +++ .../04-functions/use-params.mdx | 75 + .../04-functions/use-pathname.mdx | 97 + .../04-functions/use-report-web-vitals.mdx | 246 +++ .../04-functions/use-router.mdx | 164 ++ .../04-functions/use-search-params.mdx | 373 ++++ .../use-selected-layout-segment.mdx | 174 ++ .../use-selected-layout-segments.mdx | 79 + .../04-functions/userAgent.mdx | 81 + .../01-next-config-js/allowedDevOrigins.mdx | 20 + .../05-config/01-next-config-js/appDir.mdx | 13 + .../01-next-config-js/assetPrefix.mdx | 77 + .../01-next-config-js/authInterrupts.mdx | 35 + .../05-config/01-next-config-js/basePath.mdx | 81 + .../05-config/01-next-config-js/cacheLife.mdx | 81 + .../05-config/01-next-config-js/compress.mdx | 24 + .../01-next-config-js/crossOrigin.mdx | 21 + .../01-next-config-js/cssChunking.mdx | 44 + .../01-next-config-js/devIndicators.mdx | 60 + .../05-config/01-next-config-js/distDir.mdx | 22 + .../05-config/01-next-config-js/dynamicIO.mdx | 39 + .../05-config/01-next-config-js/env.mdx | 67 + .../05-config/01-next-config-js/eslint.mdx | 24 + .../01-next-config-js/expireTime.mdx | 23 + .../01-next-config-js/exportPathMap.mdx | 89 + .../01-next-config-js/generateBuildId.mdx | 21 + .../01-next-config-js/generateEtags.mdx | 18 + .../05-config/01-next-config-js/headers.mdx | 586 ++++++ .../01-next-config-js/htmlLimitedBots.mdx | 36 + .../01-next-config-js/httpAgentOptions.mdx | 20 + .../05-config/01-next-config-js/images.mdx | 273 +++ .../incrementalCacheHandlerPath.mdx | 78 + .../05-config/01-next-config-js/index.mdx | 148 ++ .../05-config/01-next-config-js/inlineCss.mdx | 69 + .../05-config/01-next-config-js/logging.mdx | 73 + .../05-config/01-next-config-js/mdxRs.mdx | 23 + .../01-next-config-js/onDemandEntries.mdx | 23 + .../optimizePackageImports.mdx | 48 + .../05-config/01-next-config-js/output.mdx | 136 ++ .../01-next-config-js/pageExtensions.mdx | 59 + .../01-next-config-js/poweredByHeader.mdx | 16 + .../05-config/01-next-config-js/ppr.mdx | 89 + .../productionBrowserSourceMaps.mdx | 23 + .../01-next-config-js/reactCompiler.mdx | 97 + .../reactMaxHeadersLength.mdx | 18 + .../01-next-config-js/reactStrictMode.mdx | 24 + .../05-config/01-next-config-js/redirects.mdx | 324 ++++ .../05-config/01-next-config-js/rewrites.mdx | 472 +++++ .../01-next-config-js/sassOptions.mdx | 48 + .../01-next-config-js/serverActions.mdx | 57 + .../serverComponentsHmrCache.mdx | 38 + .../serverExternalPackages.mdx | 96 + .../01-next-config-js/staleTimes.mdx | 47 + .../01-next-config-js/staticGeneration.mdx | 43 + .../05-config/01-next-config-js/taint.mdx | 228 +++ .../01-next-config-js/trailingSlash.mdx | 35 + .../01-next-config-js/transpilePackages.mdx | 25 + .../05-config/01-next-config-js/turbopack.mdx | 160 ++ .../01-next-config-js/typedRoutes.mdx | 20 + .../01-next-config-js/typescript.mdx | 28 + .../01-next-config-js/urlImports.mdx | 94 + .../05-config/01-next-config-js/useCache.mdx | 31 + .../01-next-config-js/useLightningcss.mdx | 32 + .../01-next-config-js/viewTransition.mdx | 41 + .../webVitalsAttribution.mdx | 29 + .../05-config/01-next-config-js/webpack.mdx | 90 + .../05-config/02-typescript.mdx | 300 +++ .../05-api-reference/05-config/03-eslint.mdx | 331 ++++ .../05-api-reference/05-config/index.mdx | 6 + .../06-cli/create-next-app.mdx | 88 + .../01-app/05-api-reference/06-cli/index.mdx | 13 + .../01-app/05-api-reference/06-cli/next.mdx | 240 +++ .../docs/01-app/05-api-reference/07-edge.mdx | 179 ++ .../01-app/05-api-reference/08-turbopack.mdx | 175 ++ .../ar/docs/01-app/05-api-reference/index.mdx | 8 + apps/docs/content/ar/docs/01-app/index.mdx | 13 + .../01-getting-started/01-installation.mdx | 10 + .../02-project-structure.mdx | 10 + .../02-pages/01-getting-started/04-images.mdx | 15 + .../02-pages/01-getting-started/05-fonts.mdx | 15 + .../02-pages/01-getting-started/06-css.mdx | 17 + .../01-getting-started/11-deploying.mdx | 8 + .../02-pages/01-getting-started/index.mdx | 7 + .../ar/docs/02-pages/02-guides/amp.mdx | 159 ++ .../ar/docs/02-pages/02-guides/analytics.mdx | 10 + .../02-pages/02-guides/authentication.mdx | 10 + .../ar/docs/02-pages/02-guides/babel.mdx | 68 + .../02-pages/02-guides/ci-build-caching.mdx | 10 + .../02-guides/content-security-policy.mdx | 10 + .../ar/docs/02-pages/02-guides/css-in-js.mdx | 10 + .../docs/02-pages/02-guides/custom-server.mdx | 10 + .../ar/docs/02-pages/02-guides/debugging.mdx | 10 + .../ar/docs/02-pages/02-guides/draft-mode.mdx | 184 ++ .../02-guides/environment-variables.mdx | 10 + .../ar/docs/02-pages/02-guides/forms.mdx | 338 ++++ .../incremental-static-regeneration.mdx | 10 + .../ar/docs/02-pages/02-guides/index.mdx | 6 + .../02-pages/02-guides/instrumentation.mdx | 10 + .../02-guides/internationalization.mdx | 356 ++++ .../docs/02-pages/02-guides/lazy-loading.mdx | 10 + .../ar/docs/02-pages/02-guides/mdx.mdx | 10 + .../migrating/app-router-migration.mdx | 10 + .../migrating/from-create-react-app.mdx | 10 + .../02-guides/migrating/from-vite.mdx | 10 + .../02-pages/02-guides/migrating/index.mdx | 6 + .../docs/02-pages/02-guides/multi-zones.mdx | 10 + .../02-pages/02-guides/open-telemetry.mdx | 10 + .../02-pages/02-guides/package-bundling.mdx | 14 + .../ar/docs/02-pages/02-guides/post-css.mdx | 165 ++ .../docs/02-pages/02-guides/preview-mode.mdx | 253 +++ .../02-guides/production-checklist.mdx | 10 + .../docs/02-pages/02-guides/redirecting.mdx | 10 + .../ar/docs/02-pages/02-guides/sass.mdx | 10 + .../ar/docs/02-pages/02-guides/scripts.mdx | 10 + .../docs/02-pages/02-guides/self-hosting.mdx | 10 + .../02-pages/02-guides/static-exports.mdx | 10 + .../docs/02-pages/02-guides/tailwind-css.mdx | 9 + .../02-pages/02-guides/testing/cypress.mdx | 10 + .../docs/02-pages/02-guides/testing/index.mdx | 9 + .../docs/02-pages/02-guides/testing/jest.mdx | 10 + .../02-pages/02-guides/testing/playwright.mdx | 10 + .../02-pages/02-guides/testing/vitest.mdx | 10 + .../02-guides/third-party-libraries.mdx | 10 + .../02-pages/02-guides/upgrading/codemods.mdx | 9 + .../02-pages/02-guides/upgrading/index.mdx | 8 + .../02-guides/upgrading/version-10.mdx | 29 + .../02-guides/upgrading/version-11.mdx | 152 ++ .../02-guides/upgrading/version-12.mdx | 155 ++ .../02-guides/upgrading/version-13.mdx | 90 + .../02-guides/upgrading/version-14.mdx | 10 + .../02-guides/upgrading/version-9.mdx | 228 +++ .../01-routing/01-pages-and-layouts.mdx | 215 +++ .../01-routing/02-dynamic-routes.mdx | 66 + .../01-routing/03-linking-and-navigating.mdx | 186 ++ .../01-routing/05-custom-app.mdx | 91 + .../01-routing/06-custom-document.mdx | 149 ++ .../01-routing/07-api-routes.mdx | 445 +++++ .../01-routing/08-custom-error.mdx | 100 + .../01-routing/11-middleware.mdx | 9 + .../01-routing/index.mdx | 8 + .../02-rendering/01-server-side-rendering.mdx | 34 + .../02-static-site-generation.mdx | 185 ++ .../04-automatic-static-optimization.mdx | 50 + .../02-rendering/05-client-side-rendering.mdx | 74 + .../02-rendering/index.mdx | 23 + .../03-data-fetching/01-get-static-props.mdx | 204 ++ .../03-data-fetching/02-get-static-paths.mdx | 143 ++ .../03-forms-and-mutations.mdx | 109 ++ .../03-get-server-side-props.mdx | 109 ++ .../03-data-fetching/05-client-side.mdx | 72 + .../03-data-fetching/index.mdx | 39 + .../06-configuring/12-error-handling.mdx | 106 ++ .../06-configuring/index.mdx | 8 + .../03-building-your-application/index.mdx | 9 + .../04-api-reference/01-components/font.mdx | 10 + .../04-api-reference/01-components/form.mdx | 9 + .../04-api-reference/01-components/head.mdx | 69 + .../01-components/image-legacy.mdx | 629 +++++++ .../04-api-reference/01-components/image.mdx | 9 + .../04-api-reference/01-components/index.mdx | 9 + .../04-api-reference/01-components/link.mdx | 9 + .../04-api-reference/01-components/script.mdx | 9 + .../02-file-conventions/index.mdx | 6 + .../02-file-conventions/instrumentation.mdx | 9 + .../02-file-conventions/public-folder.mdx | 10 + .../02-file-conventions/src-folder.mdx | 9 + .../03-functions/get-initial-props.mdx | 60 + .../03-functions/get-server-side-props.mdx | 142 ++ .../03-functions/get-static-paths.mdx | 261 +++ .../03-functions/get-static-props.mdx | 231 +++ .../04-api-reference/03-functions/index.mdx | 9 + .../03-functions/next-request.mdx | 9 + .../03-functions/next-response.mdx | 9 + .../04-api-reference/03-functions/use-amp.mdx | 88 + .../03-functions/use-report-web-vitals.mdx | 9 + .../03-functions/use-router.mdx | 590 ++++++ .../03-functions/userAgent.mdx | 9 + .../01-next-config-js/allowedDevOrigins.mdx | 9 + .../01-next-config-js/assetPrefix.mdx | 9 + .../04-config/01-next-config-js/basePath.mdx | 9 + .../bundlePagesRouterDependencies.mdx | 25 + .../04-config/01-next-config-js/compress.mdx | 9 + .../01-next-config-js/crossOrigin.mdx | 9 + .../01-next-config-js/devIndicators.mdx | 9 + .../04-config/01-next-config-js/distDir.mdx | 9 + .../04-config/01-next-config-js/env.mdx | 9 + .../04-config/01-next-config-js/eslint.mdx | 9 + .../01-next-config-js/exportPathMap.mdx | 9 + .../01-next-config-js/generateBuildId.mdx | 9 + .../01-next-config-js/generateEtags.mdx | 9 + .../04-config/01-next-config-js/headers.mdx | 9 + .../01-next-config-js/httpAgentOptions.mdx | 9 + .../04-config/01-next-config-js/images.mdx | 9 + .../04-config/01-next-config-js/index.mdx | 9 + .../01-next-config-js/onDemandEntries.mdx | 9 + .../optimizePackageImports.mdx | 9 + .../04-config/01-next-config-js/output.mdx | 9 + .../01-next-config-js/pageExtensions.mdx | 9 + .../01-next-config-js/poweredByHeader.mdx | 9 + .../productionBrowserSourceMaps.mdx | 9 + .../01-next-config-js/reactStrictMode.mdx | 9 + .../04-config/01-next-config-js/redirects.mdx | 9 + .../04-config/01-next-config-js/rewrites.mdx | 9 + .../runtime-configuration.mdx | 62 + .../serverExternalPackages.mdx | 92 + .../01-next-config-js/trailingSlash.mdx | 9 + .../01-next-config-js/transpilePackages.mdx | 9 + .../04-config/01-next-config-js/turbo.mdx | 10 + .../01-next-config-js/typescript.mdx | 9 + .../01-next-config-js/urlImports.mdx | 10 + .../01-next-config-js/useLightningcss.mdx | 10 + .../webVitalsAttribution.mdx | 9 + .../04-config/01-next-config-js/webpack.mdx | 10 + .../04-config/01-typescript.mdx | 9 + .../04-api-reference/04-config/02-eslint.mdx | 9 + .../04-api-reference/04-config/index.mdx | 6 + .../05-cli/create-next-app.mdx | 9 + .../04-api-reference/05-cli/index.mdx | 9 + .../02-pages/04-api-reference/05-cli/next.mdx | 9 + .../02-pages/04-api-reference/06-edge.mdx | 9 + .../04-api-reference/08-turbopack.mdx | 7 + .../docs/02-pages/04-api-reference/index.mdx | 6 + apps/docs/content/ar/docs/02-pages/index.mdx | 12 + .../ar/docs/03-architecture/accessibility.mdx | 36 + .../ar/docs/03-architecture/fast-refresh.mdx | 58 + .../content/ar/docs/03-architecture/index.mdx | 8 + .../docs/03-architecture/nextjs-compiler.mdx | 361 ++++ .../03-architecture/supported-browsers.mdx | 68 + .../04-community/01-contribution-guide.mdx | 417 +++++ apps/docs/content/ar/docs/index.mdx | 60 + 368 files changed, 54574 insertions(+) create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/01-installation.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/02-project-structure.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/03-layouts-and-pages.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/04-images.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/05-fonts.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/06-css.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/07-server-and-client-components.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/08-fetching-data.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/09-caching-and-revalidating.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/10-updating-data.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/11-error-handling.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/12-partial-prerendering.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/13-metadata-and-og-images.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/14-deploying.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/15-upgrading.mdx create mode 100644 apps/docs/content/ar/docs/01-app/01-getting-started/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/analytics.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/authentication.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/ci-build-caching.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/content-security-policy.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/css-in-js.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/custom-server.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/debugging.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/draft-mode.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/environment-variables.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/forms.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/incremental-static-regeneration.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/instrumentation.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/internationalization.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/json-ld.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/lazy-loading.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/local-development.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/mdx.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/memory-usage.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/migrating/app-router-migration.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/migrating/from-create-react-app.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/migrating/from-vite.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/migrating/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/multi-tenant.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/multi-zones.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/open-telemetry.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/package-bundling.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/production-checklist.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/progressive-web-apps.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/redirecting.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/sass.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/scripts.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/self-hosting.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/single-page-applications.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/static-exports.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/tailwind-css.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/testing/cypress.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/testing/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/testing/jest.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/testing/playwright.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/testing/vitest.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/third-party-libraries.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/upgrading/codemods.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/upgrading/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/upgrading/version-14.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/upgrading/version-15.mdx create mode 100644 apps/docs/content/ar/docs/01-app/02-guides/videos.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/01-routing/04-linking-and-navigating.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/01-routing/06-loading-ui-and-streaming.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/01-routing/13-route-handlers.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/01-routing/14-middleware.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/01-routing/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/02-data-fetching/03-server-actions-and-mutations.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/02-data-fetching/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/03-building-your-application/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/04-deep-dive/caching.mdx create mode 100644 apps/docs/content/ar/docs/01-app/04-deep-dive/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/01-directives/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/01-directives/use-cache.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/01-directives/use-client.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/01-directives/use-server.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/font.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/form.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/image.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/link.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/02-components/script.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/app-icons.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/manifest.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/opengraph-image.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/robots.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/01-metadata/sitemap.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/default.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/dynamic-routes.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/error.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/forbidden.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/instrumentation-client.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/instrumentation.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/intercepting-routes.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/layout.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/loading.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/mdx-components.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/middleware.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/not-found.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/page.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/parallel-routes.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/public-folder.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/route-groups.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/route-segment-config.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/route.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/src-folder.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/template.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/03-file-conventions/unauthorized.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/after.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/cacheLife.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/cacheTag.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/connection.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/cookies.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/draft-mode.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/fetch.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/forbidden.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/generate-image-metadata.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/generate-metadata.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/generate-sitemaps.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/generate-static-params.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/generate-viewport.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/headers.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/image-response.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/next-request.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/next-response.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/not-found.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/permanentRedirect.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/redirect.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/revalidatePath.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/revalidateTag.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/unauthorized.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/unstable_cache.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/unstable_noStore.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/unstable_rethrow.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-link-status.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-params.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-pathname.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-report-web-vitals.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-router.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-search-params.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-selected-layout-segment.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/use-selected-layout-segments.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/04-functions/userAgent.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/allowedDevOrigins.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/appDir.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/assetPrefix.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/authInterrupts.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/basePath.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/cacheLife.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/compress.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/crossOrigin.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/cssChunking.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/devIndicators.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/distDir.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/dynamicIO.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/env.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/eslint.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/expireTime.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/exportPathMap.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/generateBuildId.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/generateEtags.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/headers.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/htmlLimitedBots.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/httpAgentOptions.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/images.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/incrementalCacheHandlerPath.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/inlineCss.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/logging.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/mdxRs.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/onDemandEntries.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/optimizePackageImports.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/output.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/pageExtensions.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/poweredByHeader.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/ppr.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/productionBrowserSourceMaps.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/reactCompiler.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/reactMaxHeadersLength.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/reactStrictMode.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/redirects.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/rewrites.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/sassOptions.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/serverActions.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/serverComponentsHmrCache.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/serverExternalPackages.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/staleTimes.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/staticGeneration.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/taint.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/trailingSlash.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/transpilePackages.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/turbopack.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/typedRoutes.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/typescript.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/urlImports.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/useCache.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/useLightningcss.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/viewTransition.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/webVitalsAttribution.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/01-next-config-js/webpack.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/02-typescript.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/03-eslint.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/05-config/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/06-cli/create-next-app.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/06-cli/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/06-cli/next.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/07-edge.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/08-turbopack.mdx create mode 100644 apps/docs/content/ar/docs/01-app/05-api-reference/index.mdx create mode 100644 apps/docs/content/ar/docs/01-app/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/01-installation.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/02-project-structure.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/04-images.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/05-fonts.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/06-css.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/11-deploying.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/01-getting-started/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/amp.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/analytics.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/authentication.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/babel.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/ci-build-caching.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/content-security-policy.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/css-in-js.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/custom-server.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/debugging.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/draft-mode.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/environment-variables.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/forms.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/incremental-static-regeneration.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/instrumentation.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/internationalization.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/lazy-loading.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/mdx.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/migrating/app-router-migration.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/migrating/from-create-react-app.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/migrating/from-vite.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/migrating/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/multi-zones.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/open-telemetry.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/package-bundling.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/post-css.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/preview-mode.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/production-checklist.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/redirecting.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/sass.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/scripts.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/self-hosting.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/static-exports.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/tailwind-css.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/testing/cypress.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/testing/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/testing/jest.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/testing/playwright.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/testing/vitest.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/third-party-libraries.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/codemods.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-10.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-11.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-12.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-13.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-14.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/02-guides/upgrading/version-9.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/01-pages-and-layouts.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/02-dynamic-routes.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/03-linking-and-navigating.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/05-custom-app.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/06-custom-document.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/07-api-routes.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/08-custom-error.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/11-middleware.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/01-routing/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/02-rendering/01-server-side-rendering.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/02-rendering/02-static-site-generation.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/02-rendering/04-automatic-static-optimization.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/02-rendering/05-client-side-rendering.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/02-rendering/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/01-get-static-props.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/02-get-static-paths.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/03-forms-and-mutations.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/03-get-server-side-props.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/05-client-side.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/03-data-fetching/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/06-configuring/12-error-handling.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/06-configuring/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/03-building-your-application/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/font.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/form.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/head.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/image-legacy.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/image.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/link.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/01-components/script.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/02-file-conventions/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/02-file-conventions/instrumentation.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/02-file-conventions/public-folder.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/02-file-conventions/src-folder.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/get-initial-props.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/get-server-side-props.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/get-static-paths.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/get-static-props.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/next-request.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/next-response.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/use-amp.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/use-report-web-vitals.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/use-router.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/03-functions/userAgent.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/allowedDevOrigins.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/assetPrefix.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/basePath.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/bundlePagesRouterDependencies.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/compress.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/crossOrigin.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/devIndicators.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/distDir.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/env.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/eslint.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/exportPathMap.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/generateBuildId.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/generateEtags.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/headers.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/httpAgentOptions.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/images.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/onDemandEntries.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/optimizePackageImports.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/output.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/pageExtensions.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/poweredByHeader.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/productionBrowserSourceMaps.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/reactStrictMode.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/redirects.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/rewrites.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/runtime-configuration.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/serverExternalPackages.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/trailingSlash.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/transpilePackages.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/turbo.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/typescript.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/urlImports.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/useLightningcss.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/webVitalsAttribution.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-next-config-js/webpack.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/01-typescript.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/02-eslint.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/04-config/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/05-cli/create-next-app.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/05-cli/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/05-cli/next.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/06-edge.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/08-turbopack.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/04-api-reference/index.mdx create mode 100644 apps/docs/content/ar/docs/02-pages/index.mdx create mode 100644 apps/docs/content/ar/docs/03-architecture/accessibility.mdx create mode 100644 apps/docs/content/ar/docs/03-architecture/fast-refresh.mdx create mode 100644 apps/docs/content/ar/docs/03-architecture/index.mdx create mode 100644 apps/docs/content/ar/docs/03-architecture/nextjs-compiler.mdx create mode 100644 apps/docs/content/ar/docs/03-architecture/supported-browsers.mdx create mode 100644 apps/docs/content/ar/docs/04-community/01-contribution-guide.mdx create mode 100644 apps/docs/content/ar/docs/index.mdx diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/01-installation.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/01-installation.mdx new file mode 100644 index 00000000..fd49cdd5 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/01-installation.mdx @@ -0,0 +1,341 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:04:07.604Z +title: كيفية إعداد مشروع Next.js جديد +nav_title: التثبيت +description: إنشاء تطبيق Next.js جديد باستخدام واجهة سطر الأوامر `create-next-app`، وإعداد TypeScript و ESLint و Module Path Aliases. +--- + +{/* محتوى هذا المستند مشترك بين موجه التطبيق وموجه الصفحات. يمكنك استخدام مكون `محتوى` لإضافة محتوى خاص بموجه الصفحات. أي محتوى مشترك يجب عدم تضمينه في مكون. */} + +## متطلبات النظام + +قبل البدء، تأكد من أن نظامك يستوفي المتطلبات التالية: + +- [Node.js 18.18](https://nodejs.org/) أو أحدث. +- نظام macOS أو Windows (بما في ذلك WSL) أو Linux. + +## التثبيت التلقائي + +أسرع طريقة لإنشاء تطبيق Next.js جديد هي استخدام [`create-next-app`](/docs/app/api-reference/cli/create-next-app)، والذي يقوم بإعداد كل شيء تلقائيًا لك. لإنشاء مشروع، قم بتنفيذ: + +```bash filename="Terminal" +npx create-next-app@latest +``` + +عند التثبيت، سترى المطالبات التالية: + +```txt filename="Terminal" +ما هو اسم مشروعك؟ my-app +هل ترغب في استخدام TypeScript؟ لا / نعم +هل ترغب في استخدام ESLint؟ لا / نعم +هل ترغب في استخدام Tailwind CSS؟ لا / نعم +هل ترغب في وضع الكود داخل مجلد `src/`؟ لا / نعم +هل ترغب في استخدام App Router؟ (موصى به) لا / نعم +هل ترغب في استخدام Turbopack لـ `next dev`؟ لا / نعم +هل ترغب في تخصيص Import Alias (الافتراضي `@/*`)؟ لا / نعم +ما Import Alias الذي ترغب في تكوينه؟ @/* +``` + +بعد المطالبات، سيقوم [`create-next-app`](/docs/app/api-reference/cli/create-next-app) بإنشاء مجلد باسم مشروعك وتثبيت التبعيات المطلوبة. + +## التثبيت اليدوي + +لإنشاء تطبيق Next.js جديد يدويًا، قم بتثبيت الحزم المطلوبة: + +```bash filename="Terminal" +npm install next@latest react@latest react-dom@latest +``` + +ثم أضف السكربتات التالية إلى ملف `package.json` الخاص بك: + +```json filename="package.json" +{ + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + } +} +``` + +تشير هذه السكربتات إلى مراحل مختلفة من تطوير التطبيق: + +- `next dev`: يبدأ خادم التطوير. +- `next build`: يقوم ببناء التطبيق للإنتاج. +- `next start`: يبدأ خادم الإنتاج. +- `next lint`: يقوم بتشغيل ESLint. + + + +### إنشاء مجلد `app` + +يستخدم Next.js توجيه نظام الملفات، مما يعني أن المسارات في تطبيقك يتم تحديدها من خلال كيفية تنظيم ملفاتك. + +قم بإنشاء مجلد `app`. ثم، داخل `app`، قم بإنشاء ملف `layout.tsx`. هذا الملف هو [تخطيط الجذر](/docs/app/api-reference/file-conventions/layout#root-layout). وهو مطلوب ويجب أن يحتوي على وسمي `` و ``. + +```tsx filename="app/layout.tsx" switcher +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" switcher +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +قم بإنشاء صفحة رئيسية `app/page.tsx` مع بعض المحتوى الأولي: + +```tsx filename="app/page.tsx" switcher +export default function Page() { + return

Hello, Next.js!

+} +``` + +```jsx filename="app/page.js" switcher +export default function Page() { + return

Hello, Next.js!

+} +``` + +سيتم عرض كل من `layout.tsx` و `page.tsx` عندما يزور المستخدم جذر تطبيقك (`/`). + +هيكل مجلد التطبيق + +> **معلومة مفيدة**: +> +> - إذا نسيت إنشاء تخطيط الجذر، سيقوم Next.js تلقائيًا بإنشاء هذا الملف عند تشغيل خادم التطوير باستخدام `next dev`. +> - يمكنك اختياريًا استخدام مجلد [`src`](/docs/app/api-reference/file-conventions/src-folder) في جذر مشروعك لفصل كود التطبيق عن ملفات التكوين. + +
+ + + +### إنشاء مجلد `pages` + +يستخدم Next.js توجيه نظام الملفات، مما يعني أن المسارات في تطبيقك يتم تحديدها من خلال كيفية تنظيم ملفاتك. + +قم بإنشاء مجلد `pages` في جذر مشروعك. ثم أضف ملف `index.tsx` داخل مجلد `pages` الخاص بك. سيكون هذا صفحتك الرئيسية (`/`): + +```tsx filename="pages/index.tsx" switcher +export default function Page() { + return

Hello, Next.js!

+} +``` + +```jsx filename="pages/index.js" switcher +export default function Page() { + return

Hello, Next.js!

+} +``` + +بعد ذلك، أضف ملف `_app.tsx` داخل `pages/` لتحديد التخطيط العام. تعلم المزيد حول [ملف App المخصص](/docs/pages/building-your-application/routing/custom-app). + +```tsx filename="pages/_app.tsx" switcher +import type { AppProps } from 'next/app' + +export default function App({ Component, pageProps }: AppProps) { + return +} +``` + +```jsx filename="pages/_app.js" switcher +export default function App({ Component, pageProps }) { + return +} +``` + +أخيرًا، أضف ملف `_document.tsx` داخل `pages/` للتحكم في الاستجابة الأولية من الخادم. تعلم المزيد حول [ملف Document المخصص](/docs/pages/building-your-application/routing/custom-document). + +```tsx filename="pages/_document.tsx" switcher +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + +
+ + + + ) +} +``` + +```jsx filename="pages/_document.js" switcher +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + +
+ + + + ) +} +``` + + + +### إنشاء مجلد `public` (اختياري) + +قم بإنشاء مجلد [`public`](/docs/app/api-reference/file-conventions/public-folder) في جذر مشروعك لتخزين الأصول الثابتة مثل الصور والخطوط وما إلى ذلك. يمكن بعد ذلك الإشارة إلى الملفات داخل `public` من خلال الكود الخاص بك بدءًا من عنوان URL الأساسي (`/`). + +يمكنك بعد ذلك الإشارة إلى هذه الأصول باستخدام المسار الجذري (`/`). على سبيل المثال، يمكن الإشارة إلى `public/profile.png` كـ `/profile.png`: + +```tsx filename="app/page.tsx" highlight={4} switcher +import Image from 'next/image' + +export default function Page() { + return Profile +} +``` + +```jsx filename="app/page.js" highlight={4} switcher +import Image from 'next/image' + +export default function Page() { + return Profile +} +``` + +## تشغيل خادم التطوير + +1. قم بتشغيل `npm run dev` لبدء خادم التطوير. +2. قم بزيارة `http://localhost:3000` لعرض تطبيقك. +3. قم بتحرير ملف `app/page.tsx``pages/index.tsx` واحفظه لرؤية النتيجة المحدثة في متصفحك. + +## إعداد TypeScript + +> الحد الأدنى لإصدار TypeScript: `v4.5.2` + +يأتي Next.js مع دعم مدمج لـ TypeScript. لإضافة TypeScript إلى مشروعك، قم بإعادة تسمية ملف إلى `.ts` / `.tsx` وقم بتشغيل `next dev`. سيقوم Next.js تلقائيًا بتثبيت التبعيات الضرورية وإضافة ملف `tsconfig.json` مع خيارات التكوين الموصى بها. + + + +### ملحق IDE + +يتضمن Next.js ملحق TypeScript مخصصًا ومدقق نوع، والذي يمكن أن تستخدمه VSCode ومحررات الأكواد الأخرى للتحقق المتقدم من الأنواع والإكمال التلقائي. + +يمكنك تمكين الملحق في VS Code عن طريق: + +1. فتح لوحة الأوامر (`Ctrl/⌘` + `Shift` + `P`) +2. البحث عن "TypeScript: Select TypeScript Version" +3. اختيار "Use Workspace Version" + +لوحة أوامر TypeScript + + + +راجع صفحة [مرجع TypeScript](/docs/app/api-reference/config/next-config-js/typescript) لمزيد من المعلومات. + +## إعداد ESLint + +يأتي Next.js مع ESLint مدمج. يقوم تلقائيًا بتثبيت الحزم الضرورية وتكوين الإعدادات المناسبة عند إنشاء مشروع جديد باستخدام `create-next-app`. + +لإضافة ESLint يدويًا إلى مشروع موجود، أضف `next lint` كسكربت إلى `package.json`: + +```json filename="package.json" +{ + "scripts": { + "lint": "next lint" + } +} +``` + +ثم قم بتشغيل `npm run lint` وسيتم توجيهك خلال عملية التثبيت والتكوين. + +```bash filename="Terminal" +npm run lint +``` + +سترى مطالبة مثل هذه: + +> ? كيف ترغب في تكوين ESLint؟ +> +> ❯ صارم (موصى به) +> أساسي +> إلغاء + +- **صارم**: يتضمن تكوين ESLint الأساسي لـ Next.js مع مجموعة قواعد أكثر صرامة لـ Core Web Vitals. هذا هو التكوين الموصى به للمطورين الذين يقومون بإعداد ESLint لأول مرة. +- **أساسي**: يتضمن تكوين ESLint الأساسي لـ Next.js. +- **إلغاء**: تخطي التكوين. اختر هذا الخيار إذا كنت تخطط لإعداد تكوين ESLint مخصص خاص بك. + +إذا تم اختيار **صارم** أو **أساسي**، سيقوم Next.js تلقائيًا بتثبيت `eslint` و `eslint-config-next` كتبعيات في تطبيقك وإنشاء ملف `.eslintrc.json` في جذر مشروعك يتضمن التكوين الذي اخترته. + +يمكنك الآن تشغيل `next lint` في أي وقت تريد تشغيل ESLint للكشف عن الأخطاء. بمجرد إعداد ESLint، سيتم تشغيله تلقائيًا أيضًا خلال كل بناء (`next build`). ستؤدي الأخطاء إلى فشل البناء، بينما لن تؤدي التحذيرات إلى ذلك. + +راجع صفحة [ملحق ESLint](/docs/app/api-reference/config/next-config-js/eslint) لمزيد من المعلومات. + +## إعداد الاستيراد المطلق و Module Path Aliases + +يحتوي Next.js على دعم مدمج لخيارات `"paths"` و `"baseUrl"` لملفات `tsconfig.json` و `jsconfig.json`. + +تتيح لك هذه الخيارات تعيين مسارات المجلدات في المشروع إلى مسارات مطلقة، مما يجعل استيراد الوحدات أسهل وأنظف. على سبيل المثال: + +```jsx +// قبل +import { Button } from '../../../components/button' + +// بعد +import { Button } from '@/components/button' +``` + +لتكوين الاستيراد المطلق، أضف خيار `baseUrl` إلى ملف `tsconfig.json` أو `jsconfig.json` الخاص بك. على سبيل المثال: + +```json filename="tsconfig.json or jsconfig.json" +{ + "compilerOptions": { + "baseUrl": "src/" + } +} +``` + +بالإضافة إلى تكوين مسار `baseUrl`، يمكنك استخدام خيار `"paths"` لـ `"alias"` مسارات الوحدات. + +على سبيل المثال، يقوم التكوين التالي بتعيين `@/components/*` إلى `components/*`: + +```json filename="tsconfig.json or jsconfig.json" +{ + "compilerOptions": { + "baseUrl": "src/", + "paths": { + "@/styles/*": ["styles/*"], + "@/components/*": ["components/*"] + } + } +} +``` + +كل من `"paths"` مرتبطة بموقع `baseUrl`. \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/02-project-structure.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/02-project-structure.mdx new file mode 100644 index 00000000..e84b7644 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/02-project-structure.mdx @@ -0,0 +1,407 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:05:50.792Z +title: هيكل وتنظيم المشروع +nav_title: هيكل المشروع +description: نظرة عامة على اصطلاحات المجلدات والملفات في Next.js، وكيفية تنظيم مشروعك. +--- + +توفر هذه الصفحة نظرة عامة على **جميع** اصطلاحات المجلدات والملفات في Next.js، وتوصيات لتنظيم مشروعك. + +## اصطلاحات المجلدات والملفات + +### المجلدات الرئيسية + +تُستخدم المجلدات الرئيسية لتنظيم كود التطبيق والأصول الثابتة. + +Route segments to path segments + +| | | +| ------------------------------------------------------------------ | ---------------------------------- | +| [`app`](/docs/app/building-your-application/routing) | موجه التطبيق (App Router) | +| [`pages`](/docs/pages/building-your-application/routing) | موجه الصفحات (Pages Router) | +| [`public`](/docs/app/api-reference/file-conventions/public-folder) | الأصول الثابتة التي سيتم تقديمها | +| [`src`](/docs/app/api-reference/file-conventions/src-folder) | مجلد مصدر التطبيق الاختياري | + +### الملفات الرئيسية + +تُستخدم الملفات الرئيسية لتكوين التطبيق، وإدارة التبعيات، وتشغيل middleware، ودمج أدوات المراقبة، وتحديد متغيرات البيئة. + +| | | +| ---------------------------------------------------------------------------- | --------------------------------------- | +| **Next.js** | | +| [`next.config.js`](/docs/app/api-reference/config/next-config-js) | ملف تكوين Next.js | +| [`package.json`](/docs/app/getting-started/installation#manual-installation) | تبعيات المشروع والنصوص البرمجية | +| [`instrumentation.ts`](/docs/app/guides/instrumentation) | ملف OpenTelemetry والأدوات (Instrumentation) | +| [`middleware.ts`](/docs/app/building-your-application/routing/middleware) | middleware لطلبات Next.js | +| [`.env`](/docs/app/guides/environment-variables) | متغيرات البيئة | +| [`.env.local`](/docs/app/guides/environment-variables) | متغيرات البيئة المحلية | +| [`.env.production`](/docs/app/guides/environment-variables) | متغيرات بيئة الإنتاج | +| [`.env.development`](/docs/app/guides/environment-variables) | متغيرات بيئة التطوير | +| [`.eslintrc.json`](/docs/app/api-reference/config/eslint) | ملف تكوين ESLint | +| `.gitignore` | الملفات والمجلدات التي يتجاهلها Git | +| `next-env.d.ts` | ملف تعريف TypeScript لـ Next.js | +| `tsconfig.json` | ملف تكوين TypeScript | +| `jsconfig.json` | ملف تكوين JavaScript | + + + +### ملفات التوجيه (Routing) + +| | | | +| ----------------------------------------------------------------------------- | ------------------- | ---------------------------- | +| [`layout`](/docs/app/api-reference/file-conventions/layout) | `.js` `.jsx` `.tsx` | التخطيط (Layout) | +| [`page`](/docs/app/api-reference/file-conventions/page) | `.js` `.jsx` `.tsx` | الصفحة (Page) | +| [`loading`](/docs/app/api-reference/file-conventions/loading) | `.js` `.jsx` `.tsx` | واجهة التحميل (Loading UI) | +| [`not-found`](/docs/app/api-reference/file-conventions/not-found) | `.js` `.jsx` `.tsx` | واجهة غير موجود (Not found UI) | +| [`error`](/docs/app/api-reference/file-conventions/error) | `.js` `.jsx` `.tsx` | واجهة الخطأ (Error UI) | +| [`global-error`](/docs/app/api-reference/file-conventions/error#global-error) | `.js` `.jsx` `.tsx` | واجهة الخطأ العامة (Global error UI) | +| [`route`](/docs/app/api-reference/file-conventions/route) | `.js` `.ts` | نقطة نهاية API | +| [`template`](/docs/app/api-reference/file-conventions/template) | `.js` `.jsx` `.tsx` | التخطيط المعاد تصييره | +| [`default`](/docs/app/api-reference/file-conventions/default) | `.js` `.jsx` `.tsx` | صفحة الاحتياطي للطرق المتوازية | + +### الطرق المتداخلة (Nested routes) + +| | | +| --------------- | -------------------- | +| `folder` | مقطع الطريق (Route segment) | +| `folder/folder` | مقطع طريق متداخل (Nested route segment) | + +### الطرق الديناميكية (Dynamic routes) + +| | | +| ------------------------------------------------------------------------------------------------------ | -------------------------------- | +| [`[folder]`](/docs/app/api-reference/file-conventions/dynamic-routes#convention) | مقطع طريق ديناميكي (Dynamic route segment) | +| [`[...folder]`](/docs/app/api-reference/file-conventions/dynamic-routes#catch-all-segments) | مقطع طريق شامل (Catch-all route segment) | +| [`[[...folder]]`](/docs/app/api-reference/file-conventions/dynamic-routes#optional-catch-all-segments) | مقطع طريق شامل اختياري (Optional catch-all route segment) | + +### مجموعات الطرق والمجلدات الخاصة (Route Groups and private folders) + +| | | +| ------------------------------------------------------------------------------ | ------------------------------------------------ | +| [`(folder)`](/docs/app/api-reference/file-conventions/route-groups#convention) | تجميع الطرق دون التأثير على التوجيه | +| [`_folder`](#private-folders) | استبعاد المجلد وجميع المقاطع الفرعية من التوجيه | + +### الطرق المتوازية والمقاطعة (Parallel and Intercepted Routes) + +| | | +| ------------------------------------------------------------------------------------------- | -------------------------- | +| [`@folder`](/docs/app/api-reference/file-conventions/parallel-routes#slots) | فتحة مسماه (Named slot) | +| [`(.)folder`](/docs/app/api-reference/file-conventions/intercepting-routes#convention) | اعتراض نفس المستوى | +| [`(..)folder`](/docs/app/api-reference/file-conventions/intercepting-routes#convention) | اعتراض مستوى واحد أعلى | +| [`(..)(..)folder`](/docs/app/api-reference/file-conventions/intercepting-routes#convention) | اعتراض مستويين أعلى | +| [`(...)folder`](/docs/app/api-reference/file-conventions/intercepting-routes#convention) | اعتراض من الجذر (root) | + +### اصطلاحات ملفات البيانات الوصفية (Metadata) + +#### أيقونات التطبيق + +| | | | +| --------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------ | +| [`favicon`](/docs/app/api-reference/file-conventions/metadata/app-icons#favicon) | `.ico` | ملف الأيقونة المفضلة (Favicon) | +| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#icon) | `.ico` `.jpg` `.jpeg` `.png` `.svg` | ملف أيقونة التطبيق | +| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | أيقونة التطبيق المولدة | +| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#apple-icon) | `.jpg` `.jpeg`, `.png` | ملف أيقونة Apple | +| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | أيقونة Apple المولدة | + +#### صور Open Graph و Twitter + +| | | | +| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------- | +| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#opengraph-image) | `.jpg` `.jpeg` `.png` `.gif` | ملف صورة Open Graph | +| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | صورة Open Graph المولدة | +| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#twitter-image) | `.jpg` `.jpeg` `.png` `.gif` | ملف صورة Twitter | +| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | صورة Twitter المولدة | + +#### تحسين محركات البحث (SEO) + +| | | | +| ------------------------------------------------------------------------------------------------------------ | ----------- | --------------------- | +| [`sitemap`](/docs/app/api-reference/file-conventions/metadata/sitemap#sitemap-files-xml) | `.xml` | ملف خريطة الموقع (Sitemap) | +| [`sitemap`](/docs/app/api-reference/file-conventions/metadata/sitemap#generating-a-sitemap-using-code-js-ts) | `.js` `.ts` | خريطة الموقع المولدة | +| [`robots`](/docs/app/api-reference/file-conventions/metadata/robots#static-robotstxt) | `.txt` | ملف robots.txt | +| [`robots`](/docs/app/api-reference/file-conventions/metadata/robots#generate-a-robots-file) | `.js` `.ts` | ملف robots المولد | + + + + + +### اصطلاحات الملفات + +| | | | +| ----------------------------------------------------------------------------------------------------------- | ------------------- | ----------------- | +| [`_app`](/docs/pages/building-your-application/routing/custom-app) | `.js` `.jsx` `.tsx` | تطبيق مخصص | +| [`_document`](/docs/pages/building-your-application/routing/custom-document) | `.js` `.jsx` `.tsx` | مستند مخصص | +| [`_error`](/docs/pages/building-your-application/routing/custom-error#more-advanced-error-page-customizing) | `.js` `.jsx` `.tsx` | صفحة خطأ مخصصة | +| [`404`](/docs/pages/building-your-application/routing/custom-error#404-page) | `.js` `.jsx` `.tsx` | صفحة خطأ 404 | +| [`500`](/docs/pages/building-your-application/routing/custom-error#500-page) | `.js` `.jsx` `.tsx` | صفحة خطأ 500 | + +### الطرق (Routes) + +| | | | +| ---------------------------------------------------------------------------------------------- | ------------------- | ----------- | +| **اصطلاح المجلد** | | | +| [`index`](/docs/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | الصفحة الرئيسية | +| [`folder/index`](/docs/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | صفحة متداخلة | +| **اصطلاح الملف** | | | +| [`index`](/docs/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | الصفحة الرئيسية | +| [`file`](/docs/pages/building-your-application/routing/pages-and-layouts) | `.js` `.jsx` `.tsx` | صفحة متداخلة | + +### الطرق الديناميكية (Dynamic routes) + +| | | | +| ----------------------------------------------------------------------------------------------------------------- | ------------------- | -------------------------------- | +| **اصطلاح المجلد** | | | +| [`[folder]/index`](/docs/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | مقطع طريق ديناميكي | +| [`[...folder]/index`](/docs/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | مقطع طريق شامل | +| [`[[...folder]]/index`](/docs/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | مقطع طريق شامل اختياري | +| **اصطلاح الملف** | | | +| [`[file]`](/docs/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | مقطع طريق ديناميكي | +| [`[...file]`](/docs/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | مقطع طريق شامل | +| [`[[...file]]`](/docs/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | مقطع طريق شامل اختياري | + + + + + +## تنظيم مشروعك + +Next.js **غير متحيز** بشأن كيفية تنظيم وترتيب ملفات مشروعك. ولكنه يوفر عدة ميزات لمساعدتك في تنظيم مشروعك. + +### تسلسل المكونات (Component hierarchy) + +يتم عرض المكونات المحددة في الملفات الخاصة بتسلسل معين: + +- `layout.js` +- `template.js` +- `error.js` (حدود خطأ React) +- `loading.js` (حدود تعليق React) +- `not-found.js` (حدود خطأ React) +- `page.js` أو `layout.js` متداخل + +Component Hierarchy for File Conventions + +يتم عرض المكونات بشكل متكرر في الطرق المتداخلة، مما يعني أن مكونات مقطع الطريق ستكون متداخلة **داخل** مكونات المقطع الأب. + +Nested File Conventions Component Hierarchy + + + +### التنسيق المشترك (Colocation) + +في دليل `app`، تحدد المجلدات المتداخلة بنية المسار (route). كل مجلد يمثل جزءًا من المسار (route segment) يتم تعيينه إلى جزء مقابل في مسار URL. + +ومع ذلك، على الرغم من أن بنية المسار تُحدد من خلال المجلدات، إلا أن المسار **غير متاح للجمهور** حتى يتم إضافة ملف `page.js` أو `route.js` إلى جزء المسار. + +مخطط يوضح كيف أن المسار غير متاح للجمهور حتى يتم إضافة ملف page.js أو route.js إلى جزء المسار. + +وحتى عندما يصبح المسار متاحًا للجمهور، يتم إرسال **المحتوى المُعاد** بواسطة `page.js` أو `route.js` فقط إلى العميل. + +مخطط يوضح كيف أن ملفات page.js و route.js تجعل المسارات متاحة للجمهور. + +هذا يعني أنه يمكن **تنسيق ملفات المشروع بشكل آمن** داخل أجزاء المسار في دليل `app` دون أن تصبح قابلة للتوجيه بالخطأ. + +مخطط يوضح أن ملفات المشروع المنسقة معًا ليست قابلة للتوجيه حتى عندما يحتوي الجزء على ملف page.js أو route.js. + +> **معلومة مفيدة**: بينما يمكنك تنسيق ملفات مشروعك في `app`، إلا أنك **لست مضطرًا** لذلك. إذا كنت تفضل، يمكنك [إبقاؤها خارج دليل `app`](#store-project-files-outside-of-app). + +### المجلدات الخاصة (Private Folders) + +يمكن إنشاء مجلدات خاصة عن طريق إضافة شرطة سفلية كبادئة لاسم المجلد: `_folderName` + +هذا يشير إلى أن المجلد هو تفصيل تنفيذي خاص ولا يجب أن يؤخذ في الاعتبار من قبل نظام التوجيه، مما **يستثني المجلد وجميع مجلداته الفرعية** من التوجيه. + +مثال على هيكل مجلدات باستخدام مجلدات خاصة + +بما أن الملفات في دليل `app` يمكن [تنسيقها بشكل آمن افتراضيًا](#colocation)، فإن المجلدات الخاصة ليست مطلوبة للتنسيق المشترك. ومع ذلك، يمكن أن تكون مفيدة لـ: + +- فصل منطق واجهة المستخدم عن منطق التوجيه. +- تنظيم الملفات الداخلية بشكل متسق عبر المشروع وبيئة Next.js. +- فرز وتجميع الملفات في محررات الأكواد. +- تجنب التعارض المحتمل في الأسماء مع اصطلاحات ملفات Next.js المستقبلية. + +> **معلومة مفيدة**: +> - على الرغم من أنها ليست اصطلاحًا في الإطار، يمكنك أيضًا التفكير في تمييز الملفات خارج المجلدات الخاصة كـ "خاصة" باستخدام نفس نمط الشرطة السفلية. +> - يمكنك إنشاء أجزاء URL تبدأ بشرطة سفلية عن طريق إضافة `%5F` (الشكل المشفر لـ URL للشرطة السفلية) كبادئة لاسم المجلد: `%5FfolderName`. +> - إذا كنت لا تستخدم المجلدات الخاصة، سيكون من المفيد معرفة [اصطلاحات الملفات الخاصة](/docs/app/getting-started/project-structure#routing-files) في Next.js لتجنب التعارض غير المتوقع في الأسماء. + +### مجموعات المسارات (Route Groups) + +يمكن إنشاء مجموعات المسارات عن طريق وضع مجلد بين قوسين: `(folderName)` + +هذا يشير إلى أن المجلد هو لأغراض تنظيمية ويجب **ألا يُدرج** في مسار URL. + +مثال على هيكل مجلدات باستخدام مجموعات المسارات + +مجموعات المسارات مفيدة لـ: + +- تنظيم المسارات حسب قسم الموقع، الغرض، أو الفريق. مثل صفحات التسويق، صفحات الإدارة، إلخ. +- تمكين التخطيطات المتداخلة في نفس مستوى جزء المسار: + - [إنشاء تخطيطات متداخلة متعددة في نفس الجزء، بما في ذلك تخطيطات جذر متعددة](#creating-multiple-root-layouts) + - [إضافة تخطيط إلى مجموعة فرعية من المسارات في جزء مشترك](#opting-specific-segments-into-a-layout) + +### مجلد `src` + +يدعم Next.js تخزين كود التطبيق (بما في ذلك `app`) داخل مجلد [`src` اختياري](/docs/app/api-reference/file-conventions/src-folder). هذا يفصل كود التطبيق عن ملفات تكوين المشروع التي توجد غالبًا في جذر المشروع. + +مثال على هيكل مجلدات مع مجلد `src` + +## أمثلة + +يقدم القسم التالي نظرة عامة عالية المستوى على الاستراتيجيات الشائعة. النقطة الأساسية هي اختيار استراتيجية تناسبك وفريقك والالتزام بها عبر المشروع. + +> **معلومة مفيدة**: في الأمثلة أدناه، نستخدم مجلدات `components` و `lib` كعناصر نائبة عامة، أسماؤها لا تحمل أي دلالة خاصة في الإطار وقد يستخدم مشروعك مجلدات أخرى مثل `ui`، `utils`، `hooks`، `styles`، إلخ. + +### تخزين ملفات المشروع خارج `app` + +تخزن هذه الاستراتيجية جميع أكواد التطبيق في مجلدات مشتركة في **جذر مشروعك** وتحافظ على دليل `app` لأغراض التوجيه فقط. + +مثال على هيكل مجلدات مع ملفات المشروع خارج app + +### تخزين ملفات المشروع في مجلدات رئيسية داخل `app` + +تخزن هذه الاستراتيجية جميع أكواد التطبيق في مجلدات مشتركة في **جذر دليل `app`**. + +مثال على هيكل مجلدات مع ملفات المشروع داخل app + +### تقسيم ملفات المشروع حسب الميزة أو المسار + +تخزن هذه الاستراتيجية أكواد التطبيق المشتركة عالميًا في دليل `app` الرئيسي وتقسم أكواد التطبيق الأكثر تحديدًا إلى أجزاء المسار التي تستخدمها. + +مثال على هيكل مجلدات مع ملفات المشروع مقسمة حسب الميزة أو المسار + +### تنظيم المسارات دون التأثير على مسار URL + +لتنظيم المسارات دون التأثير على URL، أنشئ مجموعة لإبقاء المسارات ذات الصلة معًا. سيتم حذف المجلدات بين القوسين من URL (مثل `(marketing)` أو `(shop)`). + +تنظيم المسارات مع مجموعات المسارات + +على الرغم من أن المسارات داخل `(marketing)` و `(shop)` تشترك في نفس التسلسل الهرمي لـ URL، يمكنك إنشاء تخطيط مختلف لكل مجموعة عن طريق إضافة ملف `layout.js` داخل مجلداتها. + +مجموعات المسارات مع تخطيطات متعددة + +### اختيار أجزاء محددة لتطبيق تخطيط عليها + +لاختيار مسارات محددة لتطبيق تخطيط عليها، أنشئ مجموعة مسارات جديدة (مثل `(shop)`) وانقل المسارات التي تشترك في نفس التخطيط إلى المجموعة (مثل `account` و `cart`). المسارات خارج المجموعة لن تشترك في التخطيط (مثل `checkout`). + +مجموعات المسارات مع تخطيطات اختيارية + +### اختيار هياكل التحميل (Loading Skeletons) لمسار محدد + +لتطبيق [هيكل تحميل](/docs/app/building-your-application/routing/loading-ui-and-streaming) عبر ملف `loading.js` على مسار محدد، أنشئ مجموعة مسارات جديدة (مثل `/(overview)`) ثم انقل ملف `loading.tsx` داخل مجموعة المسارات هذه. + +هيكل مجلدات يوضح ملف loading.tsx و page.tsx داخل مجموعة المسارات + +الآن، سيتم تطبيق ملف `loading.tsx` فقط على صفحة dashboard → overview بدلاً من جميع صفحات dashboard دون التأثير على هيكل مسار URL. + +### إنشاء تخطيطات جذر متعددة + +لإنشاء عدة [تخطيطات جذر](/docs/app/api-reference/file-conventions/layout#root-layout)، احذف ملف `layout.js` الرئيسي، وأضف ملف `layout.js` داخل كل مجموعة مسارات. هذا مفيد لتقسيم التطبيق إلى أقسام لها واجهة مستخدم أو تجربة مختلفة تمامًا. يجب إضافة العلامات `` و `` إلى كل تخطيط جذر. + +مجموعات المسارات مع تخطيطات جذر متعددة + +في المثال أعلاه، لكل من `(marketing)` و `(shop)` تخطيط جذر خاص به. + + diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/03-layouts-and-pages.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/03-layouts-and-pages.mdx new file mode 100644 index 00000000..0a80bca8 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/03-layouts-and-pages.mdx @@ -0,0 +1,294 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:03:36.299Z +title: كيفية إنشاء التخطيطات والصفحات +nav_title: التخطيطات والصفحات +description: إنشاء أول صفحاتك وتخطيطاتك، والربط بينها. +related: + title: مرجع API + description: تعلم المزيد عن الميزات المذكورة في هذه الصفحة من خلال قراءة مرجع API. + links: + - app/api-reference/file-conventions/layout + - app/api-reference/file-conventions/page + - app/api-reference/components/link + - app/api-reference/file-conventions/dynamic-routes +--- + +يستخدم Next.js **التوجيه القائم على نظام الملفات**، مما يعني أنه يمكنك استخدام المجلدات والملفات لتحديد المسارات. سترشدك هذه الصفحة حول كيفية إنشاء التخطيطات والصفحات، والربط بينها. + +## إنشاء صفحة + +**الصفحة** هي واجهة مستخدم يتم عرضها على مسار معين. لإنشاء صفحة، أضف ملف [`page`](/docs/app/api-reference/file-conventions/page) داخل مجلد `app` وقم بتصدير مكون React افتراضيًا. على سبيل المثال، لإنشاء صفحة رئيسية (`/`): + +ملف page.js الخاص + +```tsx filename="app/page.tsx" switcher +export default function Page() { + return

Hello Next.js!

+} +``` + +```jsx filename="app/page.js" switcher +export default function Page() { + return

Hello Next.js!

+} +``` + +## إنشاء تخطيط + +التخطيط هو واجهة مستخدم **مشتركة** بين عدة صفحات. أثناء التنقل، تحافظ التخطيطات على الحالة، تبقى تفاعلية، ولا يتم إعادة عرضها. + +يمكنك تعريف تخطيط عن طريق تصدير مكون React افتراضيًا من ملف [`layout`](/docs/app/api-reference/file-conventions/layout). يجب أن يقبل المكون خاصية `children` والتي يمكن أن تكون صفحة أو [تخطيط آخر](#nesting-layouts). + +على سبيل المثال، لإنشاء تخطيط يقبل صفحتك الرئيسية كطفل، أضف ملف `layout` داخل مجلد `app`: + +ملف layout.js الخاص + +```tsx filename="app/layout.tsx" switcher +export default function DashboardLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + {/* واجهة التخطيط */} + {/* ضع children حيث تريد عرض صفحة أو تخطيط متداخل */} +
{children}
+ + + ) +} +``` + +```jsx filename="app/layout.js" switcher +export default function DashboardLayout({ children }) { + return ( + + + {/* واجهة التخطيط */} + {/* ضع children حيث تريد عرض صفحة أو تخطيط متداخل */} +
{children}
+ + + ) +} +``` + +يسمى التخطيط أعلاه [تخطيط الجذر](/docs/app/api-reference/file-conventions/layout#root-layout) لأنه محدد في جذر مجلد `app`. تخطيط الجذر **مطلوب** ويجب أن يحتوي على علامات `html` و `body`. + +## إنشاء مسار متداخل + +المسار المتداخل هو مسار يتكون من عدة أجزاء URL. على سبيل المثال، يتكون مسار `/blog/[slug]` من ثلاثة أجزاء: + +- `/` (جزء الجذر) +- `blog` (جزء) +- `[slug]` (جزء ورقي) + +في Next.js: + +- تُستخدم **المجلدات** لتحديد أجزاء المسار التي تعين إلى أجزاء URL. +- تُستخدم **الملفات** (مثل `page` و `layout`) لإنشاء واجهة مستخدم تعرض لجزء معين. + +لإنشاء مسارات متداخلة، يمكنك تداخل المجلدات داخل بعضها البعض. على سبيل المثال، لإضافة مسار لـ `/blog`، أنشئ مجلدًا يسمى `blog` في مجلد `app`. ثم، لجعل `/blog` متاحًا للجمهور، أضف ملف `page.tsx`: + +تسلسل هرمي للملفات يظهر مجلد blog وملف page.js + +```tsx filename="app/blog/page.tsx" switcher +// استيرادات وهمية +import { getPosts } from '@/lib/posts' +import { Post } from '@/ui/post' + +export default async function Page() { + const posts = await getPosts() + + return ( +
    + {posts.map((post) => ( + + ))} +
+ ) +} +``` + +```jsx filename="app/blog/[slug]/page.js" switcher +// استيرادات وهمية +import { getPosts } from '@/lib/posts' +import { Post } from '@/ui/post' + +export default async function Page() { + const posts = await getPosts() + + return ( +
    + {posts.map((post) => ( + + ))} +
+ ) +} +``` + +يمكنك الاستمرار في تداخل المجلدات لإنشاء مسارات متداخلة. على سبيل المثال، لإنشاء مسار لمنشور مدونة معين، أنشئ مجلد `[slug]` جديد داخل `blog` وأضف ملف `page`: + +تسلسل هرمي للملفات يظهر مجلد blog مع مجلد slug متداخل وملف page.js + +```tsx filename="app/blog/[slug]/page.tsx" switcher +function generateStaticParams() {} + +export default function Page() { + return

Hello, Blog Post Page!

+} +``` + +```jsx filename="app/blog/[slug]/page.js" switcher +function generateStaticParams() {} + +export default function Page() { + return

Hello, Blog Post Page!

+} +``` + +يؤدي تغليف اسم مجلد بين أقواس مربعة (مثل `[slug]`) إلى إنشاء [جزء مسار ديناميكي](/docs/app/api-reference/file-conventions/dynamic-routes) يُستخدم لإنشاء صفحات متعددة من البيانات. مثل منشورات المدونة، صفحات المنتجات، إلخ. + +## تداخل التخطيطات + +بشكل افتراضي، تكون التخطيطات في التسلسل الهرمي للمجلدات متداخلة أيضًا، مما يعني أنها تغلف التخطيطات الفرعية عبر خاصية `children`. يمكنك تداخل التخطيطات عن طريق إضافة `layout` داخل أجزاء مسار معينة (مجلدات). + +على سبيل المثال، لإنشاء تخطيط لمسار `/blog`، أضف ملف `layout` جديد داخل مجلد `blog`. + +تسلسل هرمي للملفات يظهر تخطيط الجذر يغلف تخطيط المدونة + +```tsx filename="app/blog/layout.tsx" switcher +export default function BlogLayout({ + children, +}: { + children: React.ReactNode +}) { + return
{children}
+} +``` + +```jsx filename="app/blog/layout.js" switcher +export default function BlogLayout({ children }) { + return
{children}
+} +``` + +إذا قمت بدمج التخطيطين أعلاه، فإن تخطيط الجذر (`app/layout.js`) سيغلف تخطيط المدونة (`app/blog/layout.js`)، والذي بدوره سيغلف صفحة المدونة (`app/blog/page.js`) وصفحة منشور المدونة (`app/blog/[slug]/page.js`). + +## إنشاء جزء ديناميكي + +تسمح لك [الأجزاء الديناميكية](/docs/app/api-reference/file-conventions/dynamic-routes) بإنشاء مسارات يتم إنشاؤها من البيانات. على سبيل المثال، بدلاً من إنشاء مسار يدويًا لكل منشور مدونة فردي، يمكنك إنشاء جزء ديناميكي لإنشاء المسارات بناءً على بيانات منشور المدونة. + +لإنشاء جزء ديناميكي، قم بتغليف اسم الجزء (المجلد) بين أقواس مربعة: `[segmentName]`. على سبيل المثال، في مسار `app/blog/[slug]/page.tsx`، `[slug]` هو الجزء الديناميكي. + +```tsx filename="app/blog/[slug]/page.tsx" switcher +export default async function BlogPostPage({ + params, +}: { + params: Promise<{ slug: string }> +}) { + const { slug } = await params + const post = await getPost(slug) + + return ( +
+

{post.title}

+

{post.content}

+
+ ) +} +``` + +```jsx filename="app/blog/[slug]/page.js" switcher +export default async function BlogPostPage({ params }) { + const { slug } = await params + const post = await getPost(slug) + + return ( +
+

{post.title}

+

{post.content}

+
+ ) +} +``` + +تعلم المزيد عن [الأجزاء الديناميكية](/docs/app/api-reference/file-conventions/dynamic-routes). + +## الربط بين الصفحات + +يمكنك استخدام مكون [``](/docs/app/api-reference/components/link) للتنقل بين المسارات. `` هو مكون مضمن في Next.js يمتد علامة HTML `` لتوفير [الجلب المسبق](/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching) و[التنقل من جانب العميل](/docs/app/building-your-application/routing/linking-and-navigating#5-soft-navigation). + +على سبيل المثال، لإنشاء قائمة بمنشورات المدونة، استورد `` من `next/link` ومرر خاصية `href` إلى المكون: + +```tsx filename="app/ui/post.tsx" highlight={1,10} switcher +import Link from 'next/link' + +export default async function Post({ post }) { + const posts = await getPosts() + + return ( +
    + {posts.map((post) => ( +
  • + {post.title} +
  • + ))} +
+ ) +} +``` + +```jsx filename="app/ui/post.js" highlight={1,10} switcher +import Link from 'next/link' + +export default async function Post({ post }) { + const posts = await getPosts() + + return ( +
    + {posts.map((post) => ( +
  • + {post.title} +
  • + ))} +
+ ) +} +``` + +`` هو الطريقة الأساسية والمفضلة للتنقل بين المسارات في تطبيق Next.js الخاص بك. ومع ذلك، يمكنك أيضًا استخدام [خطاف `useRouter`](/docs/app/api-reference/functions/use-router) للتنقل المتقدم. \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/04-images.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/04-images.mdx new file mode 100644 index 00000000..bfed2b90 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/04-images.mdx @@ -0,0 +1,199 @@ +--- +source-updated-at: 2025-06-02T15:30:01.000Z +translation-updated-at: 2025-06-02T20:02:40.002Z +title: كيفية تحسين الصور +nav_title: الصور +description: تعلم كيفية تحسين الصور في Next.js +related: + title: مرجع API + description: راجع مرجع API لمجموعة الميزات الكاملة لـ Next.js Image. + links: + - app/api-reference/components/image +--- + +مكون [``](/docs/app/api-reference/components/image) في Next.js يمتد لعنصر HTML `` لتوفير: + +- **تحسين الحجم:** تقديم الصور بالحجم الصحيح تلقائيًا لكل جهاز، باستخدام صيغ الصور الحديثة مثل WebP. +- **الاستقرار المرئي:** منع [انزياح التخطيط (layout shift)](https://web.dev/articles/cls) تلقائيًا عند تحميل الصور. +- **تحميل أسرع للصفحات:** تحميل الصور فقط عند دخولها نطاق الرؤية باستخدام التحميل المتكاسل (lazy loading) للمتصفح، مع وجود عناصر نائبة ضبابية اختيارية. +- **مرونة الأصول:** تغيير حجم الصور عند الطلب، حتى الصور المخزنة على خوادم بعيدة. + +للبدء باستخدام ``، قم باستيرادها من `next/image` وعرضها داخل مكونك. + +```tsx filename="app/page.tsx" switcher +import Image from 'next/image' + +export default function Page() { + return +} +``` + +```jsx filename="app/page.js" switcher +import Image from 'next/image' + +export default function Page() { + return +} +``` + +خاصية `src` يمكن أن تكون صورة [محلية](#local-images) أو [بعيدة](#remote-images). + +> **🎥 شاهد:** تعلم المزيد عن كيفية استخدام `next/image` → [YouTube (9 دقائق)](https://youtu.be/IU_qq_c_lKA). + +## الصور المحلية + +يمكنك تخزين الملفات الثابتة، مثل الصور والخطوط، داخل مجلد يسمى [`public`](/docs/app/api-reference/file-conventions/public-folder) في الدليل الجذري. يمكن بعد ذلك الإشارة إلى الملفات داخل `public` بواسطة الكود الخاص بك بدءًا من عنوان URL الأساسي (`/`). + +هيكل المجلد يظهر مجلدات app و public + +```tsx filename="app/page.tsx" switcher +import Image from 'next/image' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +```jsx filename="app/page.js" switcher +import Image from 'next/image' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +### الصور المستوردة بشكل ثابت + +يمكنك أيضًا استيراد واستخدام ملفات الصور المحلية. سيقوم Next.js تلقائيًا بتحديد [`العرض`](/docs/app/api-reference/components/image#width-and-height) و[`الارتفاع`](/docs/app/api-reference/components/image#width-and-height) الجوهريين لصورتك بناءً على الملف المستورد. تُستخدم هذه القيم لتحديد نسبة الصورة ومنع [انزياح التخطيط التراكمي (Cumulative Layout Shift)](https://web.dev/articles/cls) أثناء تحميل صورتك. + +```tsx filename="app/page.tsx" switcher +import Image from 'next/image' +import ProfileImage from './profile.png' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +```jsx filename="app/page.js" switcher +import Image from 'next/image' +import ProfileImage from './profile.png' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +في هذه الحالة، يتوقع Next.js أن يكون ملف `app/profile.png` متاحًا. + +## الصور البعيدة + +لاستخدام صورة بعيدة، يمكنك توفير سلسلة عنوان URL لخاصية `src`. + +```tsx filename="app/page.tsx" switcher +import Image from 'next/image' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +```jsx filename="app/page.js" switcher +import Image from 'next/image' + +export default function Page() { + return ( + صورة المؤلف + ) +} +``` + +بما أن Next.js لا يمكنه الوصول إلى الملفات البعيدة أثناء عملية البناء، ستحتاج إلى توفير خصائص [`العرض`](/docs/app/api-reference/components/image#width-and-height)، [`الارتفاع`](/docs/app/api-reference/components/image#width-and-height) و [`blurDataURL`](/docs/app/api-reference/components/image#blurdataurl) الاختيارية يدويًا. يتم استخدام `العرض` و `الارتفاع` لاستنتاج نسبة العرض إلى الارتفاع الصحيحة للصورة وتجنب الانزياح التخطيطي أثناء تحميل الصورة. + +للسماح بأمان للصور من الخوادم البعيدة، تحتاج إلى تحديد قائمة بأنماط عناوين URL المدعومة في [`next.config.js`](/docs/app/api-reference/config/next-config-js). كن محددًا قدر الإمكان لمنع الاستخدام الضار. على سبيل المثال، التكوين التالي سيسمح فقط بالصور من دلو AWS S3 معين: + +```ts filename="next.config.ts" switcher +import type { NextConfig } from 'next' + +const config: NextConfig = { + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 's3.amazonaws.com', + port: '', + pathname: '/my-bucket/**', + search: '', + }, + ], + }, +} + +export default config +``` + +```js filename="next.config.js" switcher +module.exports = { + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 's3.amazonaws.com', + port: '', + pathname: '/my-bucket/**', + search: '', + }, + ], + }, +} +``` \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/05-fonts.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/05-fonts.mdx new file mode 100644 index 00000000..602c8833 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/05-fonts.mdx @@ -0,0 +1,203 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:02:27.277Z +title: كيفية استخدام الخطوط +nav_title: الخطوط +description: تعلم كيفية استخدام الخطوط في Next.js +related: + title: مرجع API + description: راجع مرجع API لمجموعة الميزات الكاملة لـ Next.js Font + links: + - app/api-reference/components/font +--- + +وحدة [`next/font`](/docs/app/api-reference/components/font) تقوم بتحسين خطوطك تلقائيًا وإزالة طلبات الشبكة الخارجية لتحسين الخصوصية والأداء. + +تتضمن **استضافة ذاتية مدمجة** لأي ملف خط. هذا يعني أنه يمكنك تحميل خطوط الويب بشكل مثالي دون حدوث تغيير في التخطيط. + +للبدء في استخدام `next/font`، قم باستيرادها من [`next/font/local`](#local-fonts) أو [`next/font/google`](#google-fonts)، واستدعها كدالة مع الخيارات المناسبة، ثم قم بتعيين `className` للعنصر الذي تريد تطبيق الخط عليه. على سبيل المثال: + +```tsx filename="app/layout.tsx" highlight={1,3-5,9} switcher +import { Geist } from 'next/font/google' + +const geist = Geist({ + subsets: ['latin'], +}) + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" highlight={1,3-5,9} switcher +import { Geist } from 'next/font/google' + +const geist = Geist({ + subsets: ['latin'], +}) + +export default function Layout({ children }) { + return ( + + {children} + + ) +} +``` + +الخطوط محدودة بالمكون الذي تستخدم فيه. لتطبيق خط على تطبيقك بالكامل، أضفه إلى [تخطيط الجذر (Root Layout)](/docs/app/api-reference/file-conventions/layout#root-layout). + +## خطوط جوجل + +يمكنك استضافة أي خط من خطوط جوجل تلقائيًا. يتم تخزين الخطوط كموارد ثابتة وتقديمها من نفس النطاق الذي يتم فيه نشر تطبيقك، مما يعني عدم إرسال أي طلبات إلى جوجل من قبل المتصفح عندما يزور المستخدم موقعك. + +للبدء في استخدام خط جوجل، قم باستيراد الخط المختار من `next/font/google`: + +```tsx filename="app/layout.tsx" switcher +import { Geist } from 'next/font/google' + +const geist = Geist({ + subsets: ['latin'], +}) + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" switcher +import { Geist } from 'next/font/google' + +const geist = Geist({ + subsets: ['latin'], +}) + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +نوصي باستخدام [الخطوط المتغيرة (variable fonts)](https://fonts.google.com/variablefonts) للحصول على أفضل أداء ومرونة. ولكن إذا لم تتمكن من استخدام خط متغير، فستحتاج إلى تحديد وزن: + +```tsx filename="app/layout.tsx" highlight={4} switcher +import { Roboto } from 'next/font/google' + +const roboto = Roboto({ + weight: '400', + subsets: ['latin'], +}) + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" highlight={4} switcher +import { Roboto } from 'next/font/google' + +const roboto = Roboto({ + weight: '400', + subsets: ['latin'], +}) + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +## الخطوط المحلية + +لاستخدام خط محلي، قم باستيراد الخط من `next/font/local` وحدد [`src`](/docs/app/api-reference/components/font#src) لملف الخط المحلي الخاص بك. يمكن تخزين الخطوط في مجلد [`public`](/docs/app/api-reference/file-conventions/public-folder). على سبيل المثال: + +```tsx filename="app/layout.tsx" switcher +import localFont from 'next/font/local' + +const myFont = localFont({ + src: './my-font.woff2', +}) + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" switcher +import localFont from 'next/font/local' + +const myFont = localFont({ + src: './my-font.woff2', +}) + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +إذا كنت تريد استخدام ملفات متعددة لعائلة خط واحدة، يمكن أن يكون `src` مصفوفة: + +```js +const roboto = localFont({ + src: [ + { + path: './Roboto-Regular.woff2', + weight: '400', + style: 'normal', + }, + { + path: './Roboto-Italic.woff2', + weight: '400', + style: 'italic', + }, + { + path: './Roboto-Bold.woff2', + weight: '700', + style: 'normal', + }, + { + path: './Roboto-BoldItalic.woff2', + weight: '700', + style: 'italic', + }, + ], +}) +``` \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/06-css.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/06-css.mdx new file mode 100644 index 00000000..71c103ec --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/06-css.mdx @@ -0,0 +1,295 @@ +--- +source-updated-at: 2025-05-25T15:16:02.000Z +translation-updated-at: 2025-06-02T20:03:14.510Z +title: كيفية استخدام CSS في تطبيقك +nav_title: CSS +description: تعرف على الطرق المختلفة لإضافة CSS إلى تطبيقك، بما في ذلك وحدات CSS (CSS Modules)، وCSS العام (Global CSS)، وتيلويند CSS (Tailwind CSS)، وغيرها. +related: + title: الخطوات التالية + description: تعرف على المزيد حول الطرق البديلة لاستخدام CSS في تطبيقك. + links: + - app/guides/tailwind-css + - app/guides/sass + - app/guides/css-in-js +--- + +يوفر Next.js عدة طرق لاستخدام CSS في تطبيقك، بما في ذلك: + +- [وحدات CSS (CSS Modules)](#css-modules) +- [CSS العام (Global CSS)](#global-css) +- [صفحات الأنماط الخارجية (External Stylesheets)](#external-stylesheets) +- [تيلويند CSS (Tailwind CSS)](/docs/app/guides/tailwind-css) +- [ساس (Sass)](/docs/app/guides/sass) +- [CSS-in-JS](/docs/app/guides/css-in-js) + +## وحدات CSS (CSS Modules) + +تقوم وحدات CSS بتحديد نطاق CSS محليًا عن طريق إنشاء أسماء فريدة للفئات. هذا يسمح لك باستخدام نفس الفئة في ملفات مختلفة دون القلق حول تعارض الأسماء. + + + +للبدء باستخدام وحدات CSS، أنشئ ملفًا جديدًا بامتداد `.module.css` وقم باستيراده إلى أي مكون داخل دليل `app`: + +```css filename="app/blog/blog.module.css" +.blog { + padding: 24px; +} +``` + +```tsx filename="app/blog/page.tsx" switcher +import styles from './blog.module.css' + +export default function Page() { + return
+} +``` + +```jsx filename="app/blog/page.js" switcher +import styles from './blog.module.css' + +export default function Layout() { + return
+} +``` + +
+ + + +للبدء باستخدام وحدات CSS، أنشئ ملفًا جديدًا بامتداد `.module.css` وقم باستيراده إلى أي مكون داخل دليل `pages`: + +```css filename="/styles/blog.module.css" +.blog { + padding: 24px; +} +``` + +```tsx filename="pages/blog/index.tsx" switcher +import styles from './blog.module.css' + +export default function Page() { + return
+} +``` + +```jsx filename="pages/blog/index.js" switcher +import styles from './blog.module.css' + +export default function Page() { + return
+} +``` + +
+ +## CSS العام (Global CSS) + +يمكنك استخدام CSS العام لتطبيق الأنماط على مستوى التطبيق بأكمله. + + + +قم بإنشاء ملف `app/global.css` واستورده في التخطيط الجذري لتطبيق الأنماط على **كل مسار** في تطبيقك: + +```css filename="app/global.css" +body { + padding: 20px 20px 60px; + max-width: 680px; + margin: 0 auto; +} +``` + +```tsx filename="app/layout.tsx" switcher +// هذه الأنماط تنطبق على كل مسار في التطبيق +import './global.css' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" switcher +// هذه الأنماط تنطبق على كل مسار في التطبيق +import './global.css' + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +> **معلومة مفيدة:** يمكن استيراد الأنماط العامة في أي تخطيط أو صفحة أو مكون داخل دليل `app`. ومع ذلك، نظرًا لأن Next.js يستخدم دعم React المدمج لصفحات الأنماط للتكامل مع Suspense، فإن هذا حاليًا لا يزيل صفحات الأنماط أثناء التنقل بين المسارات مما قد يؤدي إلى تعارضات. نوصي باستخدام الأنماط العامة لـ CSS _فعليًا_ عام، و[وحدات CSS (CSS Modules)](#css-modules) لـ CSS محدود النطاق. + + + + + +قم باستيراد صفحة الأنماط في ملف `pages/_app.js` لتطبيق الأنماط على **كل مسار** في تطبيقك: + +```tsx filename="pages/_app.js" +import '@/styles/global.css' + +export default function MyApp({ Component, pageProps }) { + return +} +``` + +بسبب الطبيعة العامة لصفحات الأنماط، ولتجنب التعارضات، يجب استيرادها داخل [`pages/_app.js`](/docs/pages/building-your-application/routing/custom-app). + + + +## صفحات الأنماط الخارجية (External Stylesheets) + + + +يمكن استيراد صفحات الأنماط المنشورة بواسطة حزم خارجية في أي مكان داخل دليل `app`، بما في ذلك المكونات المجاورة: + +```tsx filename="app/layout.tsx" switcher +import 'bootstrap/dist/css/bootstrap.css' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} +``` + +```jsx filename="app/layout.js" switcher +import 'bootstrap/dist/css/bootstrap.css' + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} +``` + +> **معلومة مفيدة:** في React 19، يمكن أيضًا استخدام ``. راجع [توثيق React `link`](https://react.dev/reference/react-dom/components/link) لمزيد من المعلومات. + + + + + +يسمح لك Next.js باستيراد ملفات CSS من ملف JavaScript. +هذا ممكن لأن Next.js يمتد مفهوم [`import`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/import) إلى ما بعد JavaScript. + +### استيراد الأنماط من `node_modules` + +منذ Next.js **9.5.4**، يُسمح باستيراد ملف CSS من `node_modules` في أي مكان في تطبيقك. + +لصفحات الأنماط العامة، مثل `bootstrap` أو `nprogress`، يجب استيراد الملف داخل `pages/_app.js`. على سبيل المثال: + +```jsx filename="pages/_app.js" +import 'bootstrap/dist/css/bootstrap.css' + +export default function MyApp({ Component, pageProps }) { + return +} +``` + +لاستيراد CSS المطلوب لمكون طرف ثالث، يمكنك القيام بذلك في مكونك. على سبيل المثال: + +```jsx filename="components/example-dialog.js" +import { useState } from 'react' +import { Dialog } from '@reach/dialog' +import VisuallyHidden from '@reach/visually-hidden' +import '@reach/dialog/styles.css' + +function ExampleDialog(props) { + const [showDialog, setShowDialog] = useState(false) + const open = () => setShowDialog(true) + const close = () => setShowDialog(false) + + return ( +
+ + + +

مرحبًا. أنا حوار

+
+
+ ) +} +``` + +
+ +## الترتيب والدمج (Ordering and Merging) + +يقوم Next.js بتحسين CSS أثناء عمليات البناء للإنتاج عن طريق تجزئة (دمج) صفحات الأنماط تلقائيًا. يعتمد **ترتيب CSS الخاص بك** على **ترتيب استيراد الأنماط في الكود الخاص بك**. + +على سبيل المثال، سيتم ترتيب `base-button.module.css` قبل `page.module.css` نظرًا لأن `` يتم استيراده قبل `page.module.css`: + +```tsx filename="page.ts" switcher +import { BaseButton } from './base-button' +import styles from './page.module.css' + +export default function Page() { + return +} +``` + +```jsx filename="page.js" switcher +import { BaseButton } from './base-button' +import styles from './page.module.css' + +export default function Page() { + return +} +``` + +```tsx filename="base-button.tsx" switcher +import styles from './base-button.module.css' + +export function BaseButton() { + return + + ) +} +``` + +```jsx filename="app/ui/counter.tsx" highlight={1} switcher +'use client' + +import { useState } from 'react' + +export default function Counter() { + const [count, setCount] = useState(0) + + return ( +
+

{count} likes

+ +
+ ) +} +``` + +يُستخدم `"use client"` للإعلان عن **حدود** بين الرسوم البيانية (الأشجار) لوحدات الخادم والعميل. + +بمجرد وضع علامة على ملف بـ `"use client"`، تعتبر **جميع استيراداته والمكونات الفرعية جزءًا من حزمة العميل**. هذا يعني أنك لست بحاجة إلى إضافة التوجيه إلى كل مكون مخصص للعميل. + +### تقليل حجم حزمة JS + +لتقليل حجم حزم JavaScript الخاصة بالعميل، أضف `'use client'` إلى مكونات تفاعلية محددة بدلاً من وضع علامة على أجزاء كبيرة من واجهة المستخدم كمكونات عميل. + +على سبيل المثال، يحتوي مكون `` على عناصر ثابتة في الغالب مثل شعار وروابط تنقل، ولكنه يتضمن شريط بحث تفاعلي. `` تفاعلي ويجب أن يكون مكون عميل، بينما يمكن أن يبقى باقي التخطيط مكون خادم. + +```tsx filename="app/ui/search.tsx" highlight={1} switcher +'use client' + +export default function Search() { + // ... +} +``` + +```jsx filename="app/ui/search.js" highlight={1} switcher +'use client' + +export default function Search() { + // ... +} +``` + +```tsx filename="app/layout.tsx" switcher +// مكون عميل +import Search from './search' +// مكون خادم +import Logo from './logo' + +// التخطيط هو مكون خادم افتراضيًا +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + <> + +
{children}
+ + ) +} +``` + +```jsx filename="app/layout.js" switcher +// مكون عميل +import Search from './search' +// مكون خادم +import Logo from './logo' + +// التخطيط هو مكون خادم افتراضيًا +export default function Layout({ children }) { + return ( + <> + +
{children}
+ + ) +} +``` + +### تمرير البيانات من مكونات الخادم إلى العميل + +يمكنك تمرير البيانات من مكونات الخادم إلى مكونات العميل باستخدام الخصائص. + +```tsx filename="app/[id]/page.tsx" highlight={1,7} switcher +import LikeButton from '@/app/ui/like-button' +import { getPost } from '@/lib/data' + +export default async function Page({ params }: { params: { id: string } }) { + const post = await getPost(params.id) + + return +} +``` + +```jsx filename="app/[id]/page.js" highlight={1,7} switcher +import LikeButton from '@/app/ui/like-button' +import { getPost } from '@/lib/data' + +export default async function Page({ params }) { + const post = await getPost(params.id) + + return +} +``` + +```tsx filename="app/ui/like-button.tsx" highlight={1} switcher +'use client' + +export default function LikeButton({ likes }: { likes: number }) { + // ... +} +``` + +```jsx filename="app/ui/like-button.js" highlight={1} switcher +'use client' + +export default function LikeButton({ likes }) { + // ... +} +``` + +بدلاً من ذلك، يمكنك دفق البيانات من مكون خادم إلى مكون عميل باستخدام [خطاف `use`](https://react.dev/reference/react/use). انظر [مثال](/docs/app/getting-started/fetching-data#streaming-data-with-the-use-hook). + +> **جيد أن تعرف**: يجب أن تكون الخصائص الممررة إلى مكونات العميل [قابلة للتسلسل (Serializable)](https://react.dev/reference/react/use-server#serializable-parameters-and-return-values) بواسطة React. + +### تداخل مكونات الخادم والعميل + +يمكنك تمرير مكونات الخادم كخاصية إلى مكون عميل. هذا يسمح لك بتداخل واجهة المستخدم المعروضة من الخادم داخل مكونات العميل. + +نمط شائع هو استخدام `children` لإنشاء _فتحة_ في ``. على سبيل المثال، مكون `` الذي يجلب البيانات من الخادم، داخل مكون `` الذي يستخدم حالة العميل لتبديل الرؤية. + +```tsx filename="app/ui/modal.tsx" switcher +'use client' + +export default function Modal({ children }: { children: React.ReactNode }) { + return
{children}
+} +``` + +```jsx filename="app/ui/modal.js" switcher +'use client' + +export default function Modal({ children }) { + return
{children}
+} +``` + +ثم، في مكون خادم أصل (مثل ``)، يمكنك تمرير `` كطفل لـ ``: + +```tsx filename="app/page.tsx" highlight={7} switcher +import Modal from './ui/modal' +import Cart from './ui/cart' + +export default function Page() { + return ( + + + + ) +} +``` + +```jsx filename="app/page.js" highlight={7} switcher +import Modal from './ui/modal' +import Cart from './ui/cart' + +export default function Page() { + return ( + + + + ) +} +``` + +في هذا النمط، سيتم عرض جميع مكونات الخادم على الخادم مسبقًا، بما في ذلك تلك التي تم تمريرها كخصائص. ستتضمن حمولة RSC الناتجة مراجع لمكان عرض مكونات العميل داخل شجرة المكونات. + +### موفرو السياق (Context Providers) + +يُستخدم [سياق React (React Context)](https://react.dev/learn/passing-data-deeply-with-context) بشكل شائع لمشاركة الحالة العامة مثل السمة الحالية. ومع ذلك، لا يتم دعم سياق React في مكونات الخادم. + +لاستخدام السياق، أنشئ مكون عميل يقبل `children`: + +```tsx filename="app/theme-provider.tsx" switcher +'use client' + +import { createContext } from 'react' + +export const ThemeContext = createContext({}) + +export default function ThemeProvider({ + children, +}: { + children: React.ReactNode +}) { + return {children} +} +``` + +```jsx filename="app/theme-provider.js" switcher +'use client' + +import { createContext } from 'react' + +export const ThemeContext = createContext({}) + +export default function ThemeProvider({ children }) { + return {children} +} +``` + +ثم، قم باستيراده في مكون خادم (مثل `layout`): + +```tsx filename="app/layout.tsx" switcher +import ThemeProvider from './theme-provider' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + {children} + + + ) +} +``` + +```jsx filename="app/layout.js" switcher +import ThemeProvider from './theme-provider' + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ) +} +``` + +سيتمكن مكون الخادم الخاص بك الآن من عرض موفرك مباشرة، وستتمكن جميع مكونات العميل الأخرى في تطبيقك من استهلاك هذا السياق. + +> **جيد أن تعرف**: يجب أن تعرض الموفرين في أعمق مكان ممكن في الشجرة - لاحظ كيف أن `ThemeProvider` يلف فقط `{children}` بدلاً من مستند `` بأكمله. هذا يجعل من السهل على Next.js تحسين الأجزاء الثابتة من مكونات الخادم الخاصة بك. + +### مكونات الطرف الثالث + +عند استخدام مكون طرف ثالث يعتمد على ميزات العميل فقط، يمكنك لفه في مكون عميل لضمان عمله كما هو متوقع. + +على سبيل المثال، يمكن استيراد `` من حزمة `acme-carousel`. يستخدم هذا المكون `useState`، ولكنه لا يملك بعد توجيه `"use client"`. + +إذا استخدمت `` داخل مكون عميل، فسيعمل كما هو متوقع: + +```tsx filename="app/gallery.tsx" switcher +'use client' + +import { useState } from 'react' +import { Carousel } from 'acme-carousel' + +export default function Gallery() { + const [isOpen, setIsOpen] = useState(false) + + return ( +
+ + {/* يعمل، لأن Carousel مستخدم داخل مكون عميل */} + {isOpen && } +
+ ) +} +``` + +```jsx filename="app/gallery.js" switcher +'use client' + +import { useState } from 'react' +import { Carousel } from 'acme-carousel' + +export default function Gallery() { + const [isOpen, setIsOpen] = useState(false) + + return ( +
+ + {/* يعمل، لأن Carousel مستخدم داخل مكون عميل */} + {isOpen && } +
+ ) +} +``` + +ومع ذلك، إذا حاولت استخدامه مباشرة داخل مكون خادم، فسترى خطأ. هذا لأن Next.js لا يعرف أن `` يستخدم ميزات العميل فقط. + +لإصلاح هذا، يمكنك لف مكونات الطرف الثالث التي تعتمد على ميزات العميل فقط في مكونات العميل الخاصة بك: + +```tsx filename="app/carousel.tsx" switcher +'use client' + +import { Carousel } from 'acme-carousel' + +export default Carousel +``` + +```jsx filename="app/carousel.js" switcher +'use client' + +import { Carousel } from 'acme-carousel' + +export default Carousel +``` + +الآن، يمكنك استخدام `` مباشرة داخل مكون خادم: + +```tsx filename="app/page.tsx" switcher +import Carousel from './carousel' + +export default function Page() { + return ( +
+

View pictures

+ {/* يعمل، لأن Carousel هو مكون عميل */} + +
+ ) +} +``` + +```jsx filename="app/page.js" switcher +import Carousel from './carousel' + +export default function Page() { + return ( +
+

View pictures

+ {/* يعمل، لأن Carousel هو مكون عميل */} + +
+ ) +} +``` + +> **نصيحة لمؤلفي المكتبات** +> +> إذا كنت تبني مكتبة مكونات، أضف توجيه `"use client"` إلى نقاط الدخول التي تعتمد على ميزات العميل فقط. هذا يسمح لمستخدميك باستيراد المكونات في مكونات الخادم دون الحاجة إلى إنشاء أغلفة. +> +> من الجدير بالذكر أن بعض أدوات الحزم قد تحذف توجيهات `"use client"`. يمكنك العثور على مثال لكيفية تكوين esbuild لتضمين توجيه `"use client"` في مستودعات [React Wrap Balancer](https://github.com/shuding/react-wrap-balancer/blob/main/tsup.config.ts#L10-L13) و[Vercel Analytics](https://github.com/vercel/analytics/blob/main/packages/web/tsup.config.js#L26-L30). + +### منع تلويث البيئة (Environment poisoning) + +يمكن مشاركة وحدات جافا سريبت (JavaScript modules) بين وحدات مكونات الخادم والعميل (Server and Client Components). وهذا يعني أنه من الممكن استيراد كود مخصص للخادم فقط (server-only) إلى العميل عن طريق الخطأ. على سبيل المثال، ضع في الاعتبار الدالة التالية: + +```ts filename="lib/data.ts" switcher +export async function getData() { + const res = await fetch('https://external-service.com/data', { + headers: { + authorization: process.env.API_KEY, + }, + }) + + return res.json() +} +``` + +```js filename="lib/data.js" switcher +export async function getData() { + const res = await fetch('https://external-service.com/data', { + headers: { + authorization: process.env.API_KEY, + }, + }) + + return res.json() +} +``` + +تحتوي هذه الدالة على `API_KEY` التي لا يجب أن تصل إلى العميل أبدًا. + +في Next.js، فقط متغيرات البيئة (environment variables) المسبوقة بـ `NEXT_PUBLIC_` يتم تضمينها في حزمة العميل (client bundle). إذا لم تكن المتغيرات مسبوقة بهذا البادئة، يقوم Next.js باستبدالها بسلسلة فارغة. + +نتيجة لذلك، على الرغم من أنه يمكن استيراد وتنفيذ `getData()` على العميل، إلا أنها لن تعمل كما هو متوقع. + +لمنع الاستخدام العرضي في مكونات العميل (Client Components)، يمكنك استخدام حزمة [`server-only`](https://www.npmjs.com/package/server-only). + +```bash filename="Terminal" +npm install server-only +``` + +ثم قم باستيراد الحزمة إلى ملف يحتوي على كود مخصص للخادم فقط: + +```js filename="lib/data.js" +import 'server-only' + +export async function getData() { + const res = await fetch('https://external-service.com/data', { + headers: { + authorization: process.env.API_KEY, + }, + }) + + return res.json() +} +``` + +الآن، إذا حاولت استيراد الوحدة إلى مكون عميل (Client Component)، سيظهر خطأ أثناء وقت البناء (build-time error). + +> **معلومة مفيدة**: يمكن استخدام الحزمة المقابلة [`client-only`](https://www.npmjs.com/package/client-only) لوضع علامة على الوحدات التي تحتوي على منطق مخصص للعميل فقط (client-only logic) مثل الكود الذي يصل إلى كائن `window`. diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/08-fetching-data.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/08-fetching-data.mdx new file mode 100644 index 00000000..3550312f --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/08-fetching-data.mdx @@ -0,0 +1,658 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:05:12.523Z +title: كيفية جلب البيانات والتدفق +nav_title: جلب البيانات +description: ابدأ بجلب البيانات وتدفق المحتوى في تطبيقك. +related: + title: مرجع API + description: تعلم المزيد عن الميزات المذكورة في هذه الصفحة من خلال قراءة مرجع API. + links: + - app/api-reference/functions/fetch + - app/api-reference/file-conventions/loading + - app/api-reference/config/next-config-js/logging + - app/api-reference/config/next-config-js/taint +--- + +سترشدك هذه الصفحة حول كيفية جلب البيانات في [مكونات الخادم والعميل](/docs/app/getting-started/server-and-client-components)، وكيفية [تدفق](#streaming) المكونات التي تعتمد على البيانات. + +## جلب البيانات + +### مكونات الخادم + +يمكنك جلب البيانات في مكونات الخادم باستخدام: + +1. [واجهة `fetch` API](#with-the-fetch-api) +2. [ORM أو قاعدة بيانات](#with-an-orm-or-database) + +#### باستخدام `fetch` API + +لجلب البيانات باستخدام `fetch` API، حول مكونك إلى دالة غير متزامنة، واستخدم await مع استدعاء `fetch`. على سبيل المثال: + +```tsx filename="app/blog/page.tsx" switcher +export default async function Page() { + const data = await fetch('https://api.vercel.app/blog') + const posts = await data.json() + return ( +
    + {posts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +```jsx filename="app/blog/page.js" switcher +export default async function Page() { + const data = await fetch('https://api.vercel.app/blog') + const posts = await data.json() + return ( +
    + {posts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +> **جيد أن تعرف:** +> +> - استجابات `fetch` لا يتم تخزينها مؤقتًا افتراضيًا. ومع ذلك، سيقوم Next.js [بالتقديم المسبق](/docs/app/getting-started/partial-prerendering#static-rendering) للمسار وسيتم تخزين الناتج لتحسين الأداء. إذا كنت ترغب في اختيار [التقديم الديناميكي](/docs/app/getting-started/partial-prerendering#dynamic-rendering)، استخدم الخيار `{ cache: 'no-store' }`. راجع [مرجع `fetch` API](/docs/app/api-reference/functions/fetch). +> - أثناء التطوير، يمكنك تسجيل استدعاءات `fetch` لتحسين الرؤية والتdebugging. راجع [مرجع `logging` API](/docs/app/api-reference/config/next-config-js/logging). + +#### باستخدام ORM أو قاعدة بيانات + +بما أن مكونات الخادم يتم تقديمها على الخادم، يمكنك بأمان إجراء استعلامات قاعدة بيانات باستخدام ORM أو عميل قاعدة بيانات. حول مكونك إلى دالة غير متزامنة، واستخدم await مع الاستدعاء: + +```tsx filename="app/blog/page.tsx" switcher +import { db, posts } from '@/lib/db' + +export default async function Page() { + const allPosts = await db.select().from(posts) + return ( +
    + {allPosts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +```jsx filename="app/blog/page.js" switcher +import { db, posts } from '@/lib/db' + +export default async function Page() { + const allPosts = await db.select().from(posts) + return ( +
    + {allPosts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +### مكونات العميل + +هناك طريقتان لجلب البيانات في مكونات العميل، باستخدام: + +1. [خطاف `use` من React](https://react.dev/reference/react/use) +2. مكتبة مجتمعية مثل [SWR](https://swr.vercel.app/) أو [React Query](https://tanstack.com/query/latest) + +#### تدفق البيانات باستخدام خطاف `use` + +يمكنك استخدام [خطاف `use` من React](https://react.dev/reference/react/use) ل[تدفق](#streaming) البيانات من الخادم إلى العميل. ابدأ بجلب البيانات في مكون الخادم الخاص بك، ومرر الوعد إلى مكون العميل كخاصية: + +```tsx filename="app/blog/page.tsx" switcher +import Posts from '@/app/ui/posts +import { Suspense } from 'react' + +export default function Page() { + // لا تستخدم await مع دالة جلب البيانات + const posts = getPosts() + + return ( + Loading...}> + + + ) +} +``` + +```jsx filename="app/blog/page.js" switcher +import Posts from '@/app/ui/posts +import { Suspense } from 'react' + +export default function Page() { + // لا تستخدم await مع دالة جلب البيانات + const posts = getPosts() + + return ( + Loading...}> + + + ) +} +``` + +ثم، في مكون العميل الخاص بك، استخدم خطاف `use` لقراءة الوعد: + +```tsx filename="app/ui/posts.tsx" switcher +'use client' +import { use } from 'react' + +export default function Posts({ + posts, +}: { + posts: Promise<{ id: string; title: string }[]> +}) { + const allPosts = use(posts) + + return ( +
    + {allPosts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +```jsx filename="app/ui/posts.js" switcher +'use client' +import { use } from 'react' + +export default function Posts({ posts }) { + const posts = use(posts) + + return ( +
    + {posts.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +في المثال أعلاه، تم تغليف مكون `` داخل حدود [``](https://react.dev/reference/react/Suspense). هذا يعني أنه سيتم عرض الحالة الاحتياطية أثناء حل الوعد. تعلم المزيد عن [التدفق](#streaming). + +#### المكتبات المجتمعية + +يمكنك استخدام مكتبة مجتمعية مثل [SWR](https://swr.vercel.app/) أو [React Query](https://tanstack.com/query/latest) لجلب البيانات في مكونات العميل. هذه المكتبات لها دلالاتها الخاصة للتخزين المؤقت والتدفق والميزات الأخرى. على سبيل المثال، مع SWR: + +```tsx filename="app/blog/page.tsx" switcher +'use client' +import useSWR from 'swr' + +const fetcher = (url) => fetch(url).then((r) => r.json()) + +export default function BlogPage() { + const { data, error, isLoading } = useSWR( + 'https://api.vercel.app/blog', + fetcher + ) + + if (isLoading) return
Loading...
+ if (error) return
Error: {error.message}
+ + return ( +
    + {data.map((post: { id: string; title: string }) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +```jsx filename="app/blog/page.js" switcher +'use client' + +import useSWR from 'swr' + +const fetcher = (url) => fetch(url).then((r) => r.json()) + +export default function BlogPage() { + const { data, error, isLoading } = useSWR( + 'https://api.vercel.app/blog', + fetcher + ) + + if (isLoading) return
Loading...
+ if (error) return
Error: {error.message}
+ + return ( +
    + {data.map((post) => ( +
  • {post.title}
  • + ))} +
+ ) +} +``` + +## منع الطلبات المكررة باستخدام `React.cache` + +منع التكرار هو عملية _منع الطلبات المكررة_ لنفس المورد أثناء تمرير التقديم. يسمح لك بجلب نفس البيانات في مكونات مختلفة مع منع طلبات متعددة إلى مصدر البيانات الخاص بك. + +إذا كنت تستخدم `fetch`، يمكن منع تكرار الطلبات عن طريق إضافة `cache: 'force-cache'`. هذا يعني أنه يمكنك بأمان استدعاء نفس URL بنفس الخيارات، وسيتم إجراء طلب واحد فقط. + +إذا كنت _لا_ تستخدم `fetch`، وبدلاً من ذلك تستخدم ORM أو قاعدة بيانات مباشرة، يمكنك تغليف جلب البيانات الخاص بك باستخدام دالة [React `cache`](https://react.dev/reference/react/cache). + +```tsx filename="app/lib/data.ts" switcher +import { cache } from 'react' +import { db, posts, eq } from '@/lib/db' + +export const getPost = cache(async (id: string) => { + const post = await db.query.posts.findFirst({ + where: eq(posts.id, parseInt(id)), + }) +}) +``` + +```jsx filename="app/lib/data.js" switcher +import { cache } from 'react' +import { db, posts, eq } from '@/lib/db' +import { notFound } from 'next/navigation' + +export const getPost = cache(async (id) => { + const post = await db.query.posts.findFirst({ + where: eq(posts.id, parseInt(id)), + }) +}) +``` + +## التدفق + +> **تحذير:** المحتوى أدناه يفترض أن خيار التكوين [`dynamicIO`](/docs/app/api-reference/config/next-config-js/dynamicIO) مفعل في تطبيقك. تم تقديم هذه العلامة في Next.js 15 canary. + +عند استخدام `async/await` في مكونات الخادم، سيقوم Next.js باختيار [التقديم الديناميكي](/docs/app/getting-started/partial-prerendering#dynamic-rendering). هذا يعني أنه سيتم جلب البيانات وتقديمها على الخادم لكل طلب مستخدم. إذا كانت هناك أي طلبات بيانات بطيئة، فسيتم حظر المسار بأكمله من التقديم. + +لتحسين وقت التحميل الأولي وتجربة المستخدم، يمكنك استخدام التدفق لتقسيم HTML الصفحة إلى أجزاء أصغر وإرسال هذه الأجزاء تدريجياً من الخادم إلى العميل. + +كيف يعمل التقديم من الخادم مع التدفق + +هناك طريقتان يمكنك من خلالهما تنفيذ التدفق في تطبيقك: + +1. تغليف صفحة بملف [`loading.js`](#with-loadingjs) +2. تغليف مكون بـ [``](#with-suspense) + +### باستخدام `loading.js` + +يمكنك إنشاء ملف `loading.js` في نفس مجلد صفحتك لتدفق **الصفحة بأكملها** أثناء جلب البيانات. على سبيل المثال، لتدفق `app/blog/page.js`، أضف الملف داخل مجلد `app/blog`. + +هيكل مجلد المدونة مع ملف loading.js + +```tsx filename="app/blog/loading.tsx" switcher +export default function Loading() { + // حدد واجهة المستخدم للتحميل هنا + return
Loading...
+} +``` + +```jsx filename="app/blog/loading.js" switcher +export default function Loading() { + // حدد واجهة المستخدم للتحميل هنا + return
Loading...
+} +``` + +عند التنقل، سيرى المستخدم على الفور التخطيط وحالة [التحميل](#creating-meaningful-loading-states) أثناء تقديم الصفحة. سيتم بعد ذلك تبديل المحتوى الجديد تلقائيًا بمجرد اكتمال التقديم. + +واجهة المستخدم للتحميل + +خلف الكواليس، سيتم تداخل `loading.js` داخل `layout.js`، وسيتم تغليف ملف `page.js` وأي أطفال أدناه تلقائيًا داخل حدود ``. + +نظرة عامة على loading.js + +يعمل هذا النهج جيدًا لمقاطع المسار (التخطيطات والصفحات)، ولكن لمزيد من التدفق الدقيق، يمكنك استخدام ``. + +### باستخدام `` + +يسمح لك `` بأن تكون أكثر دقة بشأن الأجزاء التي تريد تدفقها في الصفحة. على سبيل المثال، يمكنك عرض أي محتوى صفحة يقع خارج حدود `` على الفور، وتدفق قائمة منشورات المدونة داخل الحدود. + +```tsx filename="app/blog/page.tsx" switcher +import { Suspense } from 'react' +import BlogList from '@/components/BlogList' +import BlogListSkeleton from '@/components/BlogListSkeleton' + +export default function BlogPage() { + return ( +
+ {/* سيتم إرسال هذا المحتوى إلى العميل على الفور */} +
+

مرحبًا بكم في المدونة

+

اقرأ أحدث المنشورات أدناه.

+
+
+ {/* أي محتوى مغلف داخل حدود سيتم تدفقه */} + }> + + +
+
+ ) +} +``` + +```jsx filename="app/blog/page.js" switcher +import { Suspense } from 'react' +import BlogList from '@/components/BlogList' +import BlogListSkeleton from '@/components/BlogListSkeleton' + +export default function BlogPage() { + return ( +
+ {/* سيتم إرسال هذا المحتوى إلى العميل على الفور */} +
+

مرحبًا بكم في المدونة

+

اقرأ أحدث المنشورات أدناه.

+
+
+ {/* أي محتوى مغلف داخل حدود سيتم تدفقه */} + }> + + +
+
+ ) +} +``` + +### إنشاء حالات تحميل ذات معنى + +حالة التحميل الفورية هي واجهة المستخدم الاحتياطية التي يتم عرضها للمستخدم فورًا بعد التنقل. للحصول على أفضل تجربة مستخدم، نوصي بتصميم حالات التحميل التي تكون ذات معنى وتساعد المستخدمين على فهم أن التطبيق يستجيب. على سبيل المثال، يمكنك استخدام الهياكل العظمية والمؤشرات الدوارة، أو جزء صغير ولكن ذو معنى من الشاشات المستقبلية مثل صورة الغلاف والعنوان وما إلى ذلك. + +في التطوير، يمكنك معاينة وفحص حالة التحميل لمكوناتك باستخدام [أدوات مطوري React](https://react.dev/learn/react-developer-tools). + +## أمثلة + +### جلب البيانات المتسلسل + +يحدث جلب البيانات المتسلسل عندما تقوم المكونات المتداخلة في شجرة كل منها بجلب بياناتها الخاصة ولا يتم [منع تكرارها](/docs/app/deep-dive/caching#request-memoization)، مما يؤدي إلى أوقات استجابة أطول. + +جلب البيانات المتسلسل والمتوازي + +قد تكون هناك حالات تريد فيها هذا النمط لأن أحد عمليات الجلب يعتمد على نتيجة الآخر. + +على سبيل المثال، لن يبدأ مكون `` في جلب البيانات إلا بعد أن ينتهي مكون `` من جلب البيانات لأن `` يعتمد على خاصية `artistID`: + +```tsx filename="app/artist/[username]/page.tsx" switcher +export default async function Page({ + params, +}: { + params: Promise<{ username: string }> +}) { + const { username } = await params + // الحصول على معلومات الفنان + const artist = await getArtist(username) + + return ( + <> +

{artist.name}

+ {/* عرض واجهة المستخدم الاحتياطية أثناء تحميل مكون Playlists */} + Loading...}> + {/* تمرير معرف الفنان إلى مكون Playlists */} + + + + ) +} + +async function Playlists({ artistID }: { artistID: string }) { + // استخدام معرف الفنان لجلب قوائم التشغيل + const playlists = await getArtistPlaylists(artistID) + + return ( +
    + {playlists.map((playlist) => ( +
  • {playlist.name}
  • + ))} +
+ ) +} +``` + +```jsx filename="app/artist/[username]/page.js" switcher +export default async function Page({ params }) { + const { username } = await params + // الحصول على معلومات الفنان + const artist = await getArtist(username) + + return ( + <> +

{artist.name}

+ {/* عرض واجهة المستخدم الاحتياطية أثناء تحميل مكون Playlists */} + Loading...}> + {/* تمرير معرف الفنان إلى مكون Playlists */} + + + + ) +} + +async function Playlists({ artistID }) { + // استخدام معرف الفنان لجلب قوائم التشغيل + const playlists = await getArtistPlaylists(artistID) + + return ( +
    + {playlists.map((playlist) => ( +
  • {playlist.name}
  • + ))} +
+ ) +} +``` + +لتحسين تجربة المستخدم، يجب عليك استخدام [React ``](/docs/app/building-your-application/routing/loading-ui-and-streaming#streaming-with-suspense) لعرض `fallback` أثناء جلب البيانات. سيؤدي هذا إلى تمكين [التدفق](#streaming) ومنع حظر المسار بأكمله بواسطة طلبات البيانات المتسلسلة. + +### جلب البيانات المتوازي + +يحدث جلب البيانات المتوازي عندما يتم بدء طلبات البيانات في المسار (route) بحماس وتبدأ في نفس الوقت. + +بشكل افتراضي، يتم عرض [التخطيطات والصفحات](/docs/app/getting-started/layouts-and-pages) بشكل متوازي. لذا يبدأ كل جزء (segment) في جلب البيانات بأسرع وقت ممكن. + +ومع ذلك، داخل _أي_ مكون، يمكن أن تظل طلبات `async`/`await` متعددة متسلسلة إذا تم وضعها بعد بعضها البعض. على سبيل المثال، سيتم حظر `getAlbums` حتى يتم حل `getArtist`: + +```tsx filename="app/artist/[username]/page.tsx" switcher +import { getArtist, getAlbums } from '@/app/lib/data' + +export default async function Page({ params }) { + // These requests will be sequential + const { username } = await params + const artist = await getArtist(username) + const albums = await getAlbums(username) + return
{artist.name}
+} +``` + +يمكنك بدء الطلبات بشكل متوازي عن طريق تعريفها خارج المكونات التي تستخدم البيانات، وحلها معًا، على سبيل المثال، باستخدام [`Promise.all`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all): + +```tsx filename="app/artist/[username]/page.tsx" highlight={3,8,23} switcher +import Albums from './albums' + +async function getArtist(username: string) { + const res = await fetch(`https://api.example.com/artist/${username}`) + return res.json() +} + +async function getAlbums(username: string) { + const res = await fetch(`https://api.example.com/artist/${username}/albums`) + return res.json() +} + +export default async function Page({ + params, +}: { + params: Promise<{ username: string }> +}) { + const { username } = await params + const artistData = getArtist(username) + const albumsData = getAlbums(username) + + // Initiate both requests in parallel + const [artist, albums] = await Promise.all([artistData, albumsData]) + + return ( + <> +

{artist.name}

+ + + ) +} +``` + +```jsx filename="app/artist/[username]/page.js" highlight={3,8,19} switcher +import Albums from './albums' + +async function getArtist(username) { + const res = await fetch(`https://api.example.com/artist/${username}`) + return res.json() +} + +async function getAlbums(username) { + const res = await fetch(`https://api.example.com/artist/${username}/albums`) + return res.json() +} + +export default async function Page({ params }) { + const { username } = await params + const artistData = getArtist(username) + const albumsData = getAlbums(username) + + // Initiate both requests in parallel + const [artist, albums] = await Promise.all([artistData, albumsData]) + + return ( + <> +

{artist.name}

+ + + ) +} +``` + +> **جيد أن تعرف:** إذا فشل أحد الطلبات عند استخدام `Promise.all`، فستفشل العملية بأكملها. للتعامل مع هذا، يمكنك استخدام طريقة [`Promise.allSettled`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled) بدلاً من ذلك. + +### جلب البيانات المسبق + +يمكنك جلب البيانات مسبقًا عن طريق إنشاء دالة مساعدة تستدعيها بحماس قبل الطلبات الحاجزة (blocking requests). يقوم `` بعرض مشروط بناءً على دالة `checkIsAvailable()`. + +يمكنك استدعاء `preload()` قبل `checkIsAvailable()` لبدء تبعيات بيانات `` بحماس. بحلول وقت عرض ``، تكون بياناته قد تم جلبها بالفعل. + +```tsx filename="app/item/[id]/page.tsx" switcher +import { getItem } from '@/lib/data' + +export default async function Page({ + params, +}: { + params: Promise<{ id: string }> +}) { + const { id } = await params + // starting loading item data + preload(id) + // perform another asynchronous task + const isAvailable = await checkIsAvailable() + + return isAvailable ? : null +} + +export const preload = (id: string) => { + // void evaluates the given expression and returns undefined + // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/void + void getItem(id) +} +export async function Item({ id }: { id: string }) { + const result = await getItem(id) + // ... +} +``` + +```jsx filename="app/item/[id]/page.js" switcher +import { getItem } from '@/lib/data' + +export default async function Page({ params }) { + const { id } = await params + // starting loading item data + preload(id) + // perform another asynchronous task + const isAvailable = await checkIsAvailable() + + return isAvailable ? : null +} + +export const preload = (id) => { + // void evaluates the given expression and returns undefined + // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/void + void getItem(id) +} +export async function Item({ id }) { + const result = await getItem(id) + // ... +``` + +بالإضافة إلى ذلك، يمكنك استخدام دالة [`cache`](https://react.dev/reference/react/cache) من React وحزمة [`server-only`](https://www.npmjs.com/package/server-only) لإنشاء دالة مساعدة قابلة لإعادة الاستخدام. تتيح لك هذه الطريقة تخزين دالة جلب البيانات مؤقتًا وضمان تنفيذها على الخادم فقط. + +```ts filename="utils/get-item.ts" switcher +import { cache } from 'react' +import 'server-only' +import { getItem } from '@/lib/data' + +export const preload = (id: string) => { + void getItem(id) +} + +export const getItem = cache(async (id: string) => { + // ... +}) +``` + +```js filename="utils/get-item.js" switcher +import { cache } from 'react' +import 'server-only' +import { getItem } from '@/lib/data' + +export const preload = (id) => { + void getItem(id) +} + +export const getItem = cache(async (id) => { + // ... +}) +``` diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/09-caching-and-revalidating.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/09-caching-and-revalidating.mdx new file mode 100644 index 00000000..4f4f4430 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/09-caching-and-revalidating.mdx @@ -0,0 +1,252 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:02:39.535Z +title: كيفية تخزين البيانات مؤقتًا وإعادة التحقق منها +nav_title: التخزين المؤقت وإعادة التحقق +description: تعلم كيفية تخزين البيانات مؤقتًا وإعادة التحقق منها في تطبيقك. +related: + title: مرجع API + description: تعرف على المزيد حول الميزات المذكورة في هذه الصفحة من خلال قراءة مرجع API. + links: + - app/api-reference/functions/fetch + - app/api-reference/functions/unstable_cache + - app/api-reference/functions/revalidatePath + - app/api-reference/functions/revalidateTag +--- + +التخزين المؤقت (Caching) هو تقنية لتخزين نتائج جلب البيانات والحسابات الأخرى بحيث يمكن تقديم الطلبات المستقبلية لنفس البيانات بشكل أسرع، دون الحاجة إلى إعادة العمل مرة أخرى. بينما تتيح لك إعادة التحقق (Revalidation) تحديث إدخالات التخزين المؤقت دون الحاجة إلى إعادة بناء تطبيقك بالكامل. + +يوفر Next.js بعض واجهات برمجة التطبيقات (APIs) للتعامل مع التخزين المؤقت وإعادة التحقق. سيرشدك هذا الدليل حول متى وكيفية استخدامها. + +- [`fetch`](#fetch) +- [`unstable_cache`](#unstable_cache) +- [`revalidatePath`](#revalidatepath) +- [`revalidateTag`](#revalidatetag) + +## `fetch` + +بشكل افتراضي، لا يتم تخزين طلبات [`fetch`](/docs/app/api-reference/functions/fetch) مؤقتًا. يمكنك تخزين الطلبات الفردية مؤقتًا عن طريق تعيين خيار `cache` إلى `'force-cache'`. + +```tsx filename="app/page.tsx" switcher +export default async function Page() { + const data = await fetch('https://...', { cache: 'force-cache' }) +} +``` + +```jsx filename="app/page.jsx" switcher +export default async function Page() { + const data = await fetch('https://...', { cache: 'force-cache' }) +} +``` + +> **معلومة مفيدة**: على الرغم من أن طلبات `fetch` لا يتم تخزينها مؤقتًا افتراضيًا، إلا أن Next.js سيقوم [بالتقديم المسبق](/docs/app/getting-started/partial-prerendering#static-rendering) للمسارات التي تحتوي على طلبات `fetch` وتخزين HTML مؤقتًا. إذا كنت تريد ضمان أن يكون المسار [ديناميكيًا](/docs/app/getting-started/partial-prerendering#dynamic-rendering)، استخدم [واجهة برمجة التطبيقات `connection`](/docs/app/api-reference/functions/connection). + +لإعادة التحقق من البيانات التي تم إرجاعها بواسطة طلب `fetch`، يمكنك استخدام خيار `next.revalidate`. + +```tsx filename="app/page.tsx" switcher +export default async function Page() { + const data = await fetch('https://...', { next: { revalidate: 3600 } }) +} +``` + +```jsx filename="app/page.jsx" switcher +export default async function Page() { + const data = await fetch('https://...', { next: { revalidate: 3600 } }) +} +``` + +سيؤدي هذا إلى إعادة التحقق من البيانات بعد عدد محدد من الثواني. + +راجع [مرجع واجهة برمجة التطبيقات `fetch`](/docs/app/api-reference/functions/fetch) لمعرفة المزيد. + +## `unstable_cache` + +تتيح لك `unstable_cache` تخزين نتائج استعلامات قواعد البيانات والوظائف غير المتزامنة الأخرى مؤقتًا. لاستخدامها، قم بلف `unstable_cache` حول الوظيفة. على سبيل المثال: + +```tsx filename="app/lib/data.ts swichter +import { db } from '@/lib/db' +export async function getUserById(id: string) { + return db + .select() + .from(users) + .where(eq(users.id, id)) + .then((res) => res[0]) +} +``` + +```jsx filename="app/lib/data.js" switcher +import { db } from '@/lib/db' + +export async function getUserById(id) { + return db + .select() + .from(users) + .where(eq(users.id, id)) + .then((res) => res[0]) +} +``` + +```tsx filename="app/page.tsx" highlight={2,11,13} switcher +import { unstable_cache } from 'next/cache' +import { getUserById } from '@/app/lib/data' + +export default async function Page({ + params, +}: { + params: Promise<{ userId: string }> +}) { + const { userId } = await params + + const getCachedUser = unstable_cache( + async () => { + return getUserById(userId) + }, + [userId] // إضافة معرف المستخدم إلى مفتاح التخزين المؤقت + ) +} +``` + +```jsx filename="app/page.jsx" highlight={2,7,9} switcher +import { unstable_cache } from 'next/cache'; +import { getUserById } from '@/app/lib/data'; + +export default async function Page({ params } }) { + const { userId } = await params + + const getCachedUser = unstable_cache( + async () => { + return getUserById(userId) + }, + [userId] // إضافة معرف المستخدم إلى مفتاح التخزين المؤقت + ); +} +``` + +تقبل الوظيفة كائنًا اختياريًا ثالثًا لتحديد كيفية إعادة التحقق من التخزين المؤقت. وهي تقبل: + +- `tags`: مصفوفة من العلامات (tags) التي يستخدمها Next.js لإعادة التحقق من التخزين المؤقت. +- `revalidate`: عدد الثواني التي يجب بعدها إعادة التحقق من التخزين المؤقت. + +```tsx filename="app/page.tsx" highlight={6-9} switcher +const getCachedUser = unstable_cache( + async () => { + return getUserById(userId) + }, + [userId], + { + tags: ['user'], + revalidate: 3600, + } +) +``` + +```jsx filename="app/page.js" highlight={6-9} switcher +const getCachedUser = unstable_cache( + async () => { + return getUserById(userId) + }, + [userId], + { + tags: ['user'], + revalidate: 3600, + } +) +``` + +راجع [مرجع واجهة برمجة التطبيقات `unstable_cache`](/docs/app/api-reference/functions/unstable_cache) لمعرفة المزيد. + +## `revalidateTag` + +يتم استخدام `revalidateTag` لإعادة التحقق من إدخالات التخزين المؤقت بناءً على علامة (tag) وبعد حدث ما. لاستخدامها مع `fetch`، ابدأ بوضع علامة على الوظيفة باستخدام خيار `next.tags`: + +```tsx filename="app/lib/data.ts" highlight={3-5} switcher +export async function getUserById(id: string) { + const data = await fetch(`https://...`, { + next: { + tags: ['user'], + }, + }) +} +``` + +```jsx filename="app/lib/data.js" highlight={3-5} switcher +export async function getUserById(id) { + const data = await fetch(`https://...`, { + next: { + tags: ['user'], + }, + }) +} +``` + +بدلاً من ذلك، يمكنك وضع علامة على وظيفة `unstable_cache` باستخدام خيار `tags`: + +```tsx filename="app/lib/data.ts" highlight={6-8} switcher +export const getUserById = unstable_cache( + async (id: string) => { + return db.query.users.findFirst({ where: eq(users.id, id) }) + }, + ['user'], // مطلوب إذا لم يتم تمرير المتغيرات كمعلمات + { + tags: ['user'], + } +) +``` + +```jsx filename="app/lib/data.js" highlight={6-8} switcher +export const getUserById = unstable_cache( + async (id) => { + return db.query.users.findFirst({ where: eq(users.id, id) }) + }, + ['user'], // مطلوب إذا لم يتم تمرير المتغيرات كمعلمات + { + tags: ['user'], + } +) +``` + +ثم، استدعِ `revalidateTag` في [معالج المسار (Route Handler)](/docs/app/api-reference/file-conventions/route) أو إجراء الخادم (Server Action): + +```tsx filename="app/lib/actions.ts" highlight={1} switcher +import { revalidateTag } from 'next/cache' + +export async function updateUser(id: string) { + // تعديل البيانات + revalidateTag('user') +} +``` + +```jsx filename="app/lib/actions.js" highlight={1} switcher +import { revalidateTag } from 'next/cache' + +export async function updateUser(id) { + // تعديل البيانات + revalidateTag('user') +} +``` + +يمكنك إعادة استخدام نفس العلامة في وظائف متعددة لإعادة التحقق منها جميعًا مرة واحدة. + +راجع [مرجع واجهة برمجة التطبيقات `revalidateTag`](/docs/app/api-reference/functions/revalidateTag) لمعرفة المزيد. + +## `revalidatePath` + +يتم استخدام `revalidatePath` لإعادة التحقق من مسار وبعد حدث ما. لاستخدامها، استدعِها في [معالج المسار (Route Handler)](/docs/app/api-reference/file-conventions/route) أو إجراء الخادم (Server Action): + +```tsx filename="app/lib/actions.ts" highlight={1} switcher +import { revalidatePath } from 'next/cache' + +export async function updateUser(id: string) { + // تعديل البيانات + revalidatePath('/profile') +``` + +```jsx filename="app/lib/actions.js" highlight={1} switcher +import { revalidatePath } from 'next/cache' + +export async function updateUser(id) { + // تعديل البيانات + revalidatePath('/profile') +``` + +راجع [مرجع واجهة برمجة التطبيقات `revalidatePath`](/docs/app/api-reference/functions/revalidatePath) لمعرفة المزيد. \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/10-updating-data.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/10-updating-data.mdx new file mode 100644 index 00000000..812a8d1d --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/10-updating-data.mdx @@ -0,0 +1,352 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:02:37.609Z +title: كيفية تحديث البيانات +nav_title: تحديث البيانات +description: تعلم كيفية تحديث البيانات في تطبيق Next.js الخاص بك. +related: + title: مرجع API + description: تعلم المزيد عن الميزات المذكورة في هذه الصفحة من خلال قراءة مرجع API. + links: + - app/api-reference/functions/revalidatePath + - app/api-reference/functions/revalidateTag + - app/api-reference/functions/redirect +--- + +يمكنك تحديث البيانات في Next.js باستخدام [وظائف الخادم (Server Functions)](https://react.dev/reference/rsc/server-functions) الخاصة بـ React. هذه الصفحة ستشرح كيفية [إنشاء](#creating-server-functions) و[استدعاء](#invoking-server-functions) وظائف الخادم. + +## وظائف الخادم + +وظيفة الخادم هي وظيفة غير متزامنة يتم تنفيذها على الخادم. وظائف الخادم غير متزامنة بطبيعتها لأنها يتم استدعاؤها من قبل العميل باستخدام طلب شبكة. عند استدعائها كجزء من `action`، تُسمى أيضًا **إجراءات الخادم (Server Actions)**. + +حسب الاصطلاح، `action` هي وظيفة غير متزامنة يتم تمريرها إلى `startTransition`. يتم تغليف وظائف الخادم تلقائيًا بـ `startTransition` عندما: + +- يتم تمريرها إلى `
` باستخدام خاصية `action`، +- يتم تمريرها إلى ` +} +``` + +```jsx filename="app/ui/button.js" switcher +'use client' + +import { createPost } from '@/app/actions' + +export function Button() { + return +} +``` + +## استدعاء وظائف الخادم + +هناك طريقتان رئيسيتان لاستدعاء وظيفة الخادم: + +1. [النماذج (Forms)](#forms) في مكونات الخادم والعميل +2. [معالجو الأحداث (Event Handlers)](#event-handlers) في مكونات العميل + +### النماذج + +يمتد React عنصر [``](https://react.dev/reference/react-dom/components/form) في HTML للسماح باستدعاء وظيفة الخادم باستخدام خاصية `action` في HTML. + +عند استدعائها في نموذج، تتلقى الوظيفة تلقائيًا كائن [`FormData`](https://developer.mozilla.org/docs/Web/API/FormData/FormData). يمكنك استخراج البيانات باستخدام [طرق FormData الأصلية](https://developer.mozilla.org/en-US/docs/Web/API/FormData#instance_methods): + +```tsx filename="app/ui/form.tsx" switcher +import { createPost } from '@/app/actions' + +export function Form() { + return ( + + + + +
+ ) +} +``` + +```jsx filename="app/ui/form.js" switcher +import { createPost } from '@/app/actions' + +export function Form() { + return ( +
+ + + +
+ ) +} +``` + +```ts filename="app/actions.ts" switcher +'use server' + +export async function createPost(formData: FormData) { + const title = formData.get('title') + const content = formData.get('content') + + // تحديث البيانات + // إعادة التحقق من ذاكرة التخزين المؤقت +} +``` + +```js filename="app/actions.js" switcher +'use server' + +export async function createPost(formData) { + const title = formData.get('title') + const content = formData.get('content') + + // تحديث البيانات + // إعادة التحقق من ذاكرة التخزين المؤقت +} +``` + +> **معلومة مفيدة:** عند تمريرها إلى خاصية `action`، تُعرف وظائف الخادم أيضًا باسم _إجراءات الخادم (Server Actions)_. + +### معالجو الأحداث + +يمكنك استدعاء وظيفة الخادم في مكون العميل باستخدام معالجي الأحداث مثل `onClick`. + +```tsx filename="app/like-button.tsx" switcher +'use client' + +import { incrementLike } from './actions' +import { useState } from 'react' + +export default function LikeButton({ initialLikes }: { initialLikes: number }) { + const [likes, setLikes] = useState(initialLikes) + + return ( + <> +

إجمالي الإعجابات: {likes}

+ + + ) +} +``` + +```jsx filename="app/like-button.js" switcher +'use client' + +import { incrementLike } from './actions' +import { useState } from 'react' + +export default function LikeButton({ initialLikes }) { + const [likes, setLikes] = useState(initialLikes) + + return ( + <> +

إجمالي الإعجابات: {likes}

+ + + ) +} +``` + +## أمثلة + +### عرض حالة الانتظار + +أثناء تنفيذ وظيفة الخادم، يمكنك عرض مؤشر تحميل باستخدام خطاف React [`useActionState`](https://react.dev/reference/react/useActionState). يُرجع هذا الخطاف قيمة منطقية `pending`: + +```tsx filename="app/ui/button.tsx" switcher +'use client' + +import { useActionState } from 'react' +import { createPost } from '@/app/actions' +import { LoadingSpinner } from '@/app/ui/loading-spinner' + +export function Button() { + const [state, action, pending] = useActionState(createPost, false) + + return ( + + ) +} +``` + +```jsx filename="app/ui/button.js" switcher +'use client' + +import { useActionState } from 'react' +import { createPost } from '@/app/actions' +import { LoadingSpinner } from '@/app/ui/loading-spinner' + +export function Button() { + const [state, action, pending] = useActionState(createPost, false) + + return ( + + ) +} +``` + +### إعادة التحقق من ذاكرة التخزين المؤقت + +بعد إجراء تحديث، يمكنك إعادة التحقق من ذاكرة التخزين المؤقت في Next.js وعرض البيانات المحدثة عن طريق استدعاء [`revalidatePath`](/docs/app/api-reference/functions/revalidatePath) أو [`revalidateTag`](/docs/app/api-reference/functions/revalidateTag) داخل وظيفة الخادم: + +```ts filename="app/lib/actions.ts" switcher +import { revalidatePath } from 'next/cache' + +export async function createPost(formData: FormData) { + 'use server' + // تحديث البيانات + // ... + + revalidatePath('/posts') +} +``` + +```js filename="app/actions.js" switcher +import { revalidatePath } from 'next/cache' + +export async function createPost(formData) { + 'use server' + // تحديث البيانات + // ... + revalidatePath('/posts') +} +``` + +### إعادة التوجيه + +قد ترغب في توجيه المستخدم إلى صفحة مختلفة بعد إجراء تحديث. يمكنك القيام بذلك عن طريق استدعاء [`redirect`](/docs/app/api-reference/functions/redirect) داخل وظيفة الخادم: + +```ts filename="app/lib/actions.ts" switcher +'use server' + +import { redirect } from 'next/navigation' + +export async function createPost(formData: FormData) { + // تحديث البيانات + // ... + + redirect('/posts') +} +``` + +```js filename="app/actions.js" switcher +'use server' + +import { redirect } from 'next/navigation' + +export async function createPost(formData) { + // تحديث البيانات + // ... + + redirect('/posts') +} +``` \ No newline at end of file diff --git a/apps/docs/content/ar/docs/01-app/01-getting-started/11-error-handling.mdx b/apps/docs/content/ar/docs/01-app/01-getting-started/11-error-handling.mdx new file mode 100644 index 00000000..8a7140d5 --- /dev/null +++ b/apps/docs/content/ar/docs/01-app/01-getting-started/11-error-handling.mdx @@ -0,0 +1,317 @@ +--- +source-updated-at: 2025-06-01T01:32:20.000Z +translation-updated-at: 2025-06-02T20:02:26.256Z +title: كيفية التعامل مع الأخطاء +nav_title: معالجة الأخطاء +description: تعلم كيفية عرض الأخطاء المتوقعة والتعامل مع الاستثناءات غير الملتقطة. +related: + title: مرجع API + description: تعرف على المزيد حول الميزات المذكورة في هذه الصفحة من خلال قراءة مرجع API. + links: + - app/api-reference/functions/redirect + - app/api-reference/file-conventions/error + - app/api-reference/functions/not-found + - app/api-reference/file-conventions/not-found +--- + +يمكن تقسيم الأخطاء إلى فئتين: [الأخطاء المتوقعة](#handling-expected-errors) و[الاستثناءات غير الملتقطة](#handling-uncaught-exceptions). ستوجهك هذه الصفحة حول كيفية التعامل مع هذه الأخطاء في تطبيق Next.js الخاص بك. + +## التعامل مع الأخطاء المتوقعة + +الأخطاء المتوقعة هي تلك التي قد تحدث أثناء التشغيل العادي للتطبيق، مثل الأخطاء الناتجة عن [التحقق من صحة النموذج من جانب الخادم](/docs/app/guides/forms) أو الطلبات الفاشلة. يجب التعامل مع هذه الأخطاء بشكل صريح وإعادتها إلى العميل. + +### دوال الخادم + +يمكنك استخدام خطاف [`useActionState`](https://react.dev/reference/react/useActionState) للتعامل مع الأخطاء المتوقعة في [دوال الخادم (Server Functions)](https://react.dev/reference/rsc/server-functions). + +بالنسبة لهذه الأخطاء، تجنب استخدام كتل `try`/`catch` ورمي الأخطاء. بدلاً من ذلك، قم بنمذجة الأخطاء المتوقعة كقيم مرتجعة. + +```ts filename="app/actions.ts" switcher +'use server' + +export async function createPost(prevState: any, formData: FormData) { + const title = formData.get('title') + const content = formData.get('content') + + const res = await fetch('https://api.vercel.app/posts', { + method: 'POST', + body: { title, content }, + }) + const json = await res.json() + + if (!res.ok) { + return { message: 'Failed to create post' } + } +} +``` + +```js filename="app/actions.js" switcher +'use server' + +export async function createPost(prevState, formData) { + const title = formData.get('title') + const content = formData.get('content') + + const res = await fetch('https://api.vercel.app/posts', { + method: 'POST', + body: { title, content }, + }) + const json = await res.json() + + if (!res.ok) { + return { message: 'Failed to create post' } + } +} +``` + +يمكنك تمرير الإجراء الخاص بك إلى خطاف `useActionState` واستخدام الحالة `state` المرتجعة لعرض رسالة خطأ. + +```tsx filename="app/ui/form.tsx" highlight={11,19} switcher +'use client' + +import { useActionState } from 'react' +import { createPost } from '@/app/actions' + +const initialState = { + message: '', +} + +export function Form() { + const [state, formAction, pending] = useActionState(createPost, initialState) + + return ( +
+ + + +