Skip to content

Commit 4eb0fc4

Browse files
committed
Merge branch 'main' into feat/media-w-hf
2 parents 43767d1 + d01f7ef commit 4eb0fc4

182 files changed

Lines changed: 16357 additions & 7887 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/templates/next.config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import type { NextConfig } from "next";
44
const nextConfig: NextConfig = {
55
reactStrictMode: true,
66
trailingSlash: false,
7+
// Use basePath only when env var is set (for proxy integration)
8+
// Without env var, templates serves at root for standalone subdomain
9+
...(process.env.NEXT_PUBLIC_USE_BASE_PATH === "true" && {
10+
basePath: "/developers/templates",
11+
}),
712

813
webpack(config) {
914
// Handle inline SVGs

apps/templates/public/locales/en/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"mobile": "Mobile",
2121
"payments": "Payments",
2222
"airdrop": "Airdrop",
23+
"auth": "Auth",
2324
"nextjs": "Next.js",
2425
"expo": "Expo",
2526
"vite": "Vite",

apps/templates/src/app/[locale]/[id]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { TemplatesProviderWrapper } from "@/components/providers/templates-provi
55
import { BackgroundShapes } from "@/components/background-shapes";
66
import type { Metadata } from "next";
77

8+
export const revalidate = 3600;
9+
810
export async function generateStaticParams() {
911
const templates = await fetchTemplatesFromGitHub();
1012
return templates.map((template) => ({

apps/templates/src/app/[locale]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { fetchTemplatesFromGitHub } from "@/lib/fetch-templates";
66
import { AppProviders } from "@/components/app-providers";
77
import { TemplatesProviderWrapper } from "@/components/providers/templates-provider-wrapper";
88

9+
export const revalidate = 3600;
10+
911
export default async function TemplatesPage() {
1012
const templates = await fetchTemplatesFromGitHub();
1113
const t = await getTranslations("templates");

apps/templates/src/lib/fetch-templates.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type TemplatesJsonGroup = {
3737
export async function fetchTemplatesFromGitHub(): Promise<Template[]> {
3838
try {
3939
const response = await fetch(GITHUB_TEMPLATES_JSON, {
40-
next: { revalidate: 3600 }, // Revalidate every hour (ISR)
40+
next: { revalidate: 60 }, // Revalidate every minute (ISR)
4141
});
4242

4343
if (!response.ok) {
@@ -57,7 +57,7 @@ export async function fetchTemplatesFromGitHub(): Promise<Template[]> {
5757

5858
try {
5959
const readmeResponse = await fetch(readmePath, {
60-
next: { revalidate: 3600 }, // Revalidate every hour (ISR)
60+
next: { revalidate: 60 }, // Revalidate every minute (ISR)
6161
});
6262
if (readmeResponse.ok) {
6363
const readmeText = await readmeResponse.text();

apps/templates/src/lib/templates/filter-templates.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ const DEFAULT_TEMPLATE_NAMES = [
77
"gill-react-vite-tailwind-basic", // Fullstack boilerplate (Vite)
88
"web3js-expo", // Mobile
99
"gill-jito-airdrop", // Airdrop
10-
"x402-solana-protocol", // Payments
10+
"x402-template", // X402 Next.js
11+
"gill-node-solanax402", // X402 Express Server
1112
"gill-node-express", // Backend
13+
"supabase-auth", // Auth
1214
];
1315

1416
export function filterTemplates({

apps/templates/src/lib/types/templates/filters.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ export const createFilters = (t: (key: string) => string): TemplateFilter[] => [
2828
id: "airdrop",
2929
name: t("keywords.airdrop"),
3030
},
31+
{
32+
id: "auth",
33+
name: t("keywords.auth"),
34+
},
3135
],
3236
name: t("categories.usecases"),
3337
},
@@ -109,6 +113,7 @@ export const filters: TemplateFilter[] = [
109113
{ id: "mobile", name: "Mobile" },
110114
{ id: "payments", name: "Payments" },
111115
{ id: "airdrop", name: "Airdrop" },
116+
{ id: "auth", name: "Auth" },
112117
],
113118
name: "Use Cases",
114119
},

apps/web/content/docs/ar/core/accounts.mdx

Lines changed: 62 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ description:
2727

2828
### المفتاح العام
2929

30-
يوضح المثال أدناه كيفية استخدام مكتبة تطوير سولانا لإنشاء زوج مفاتيح.
30+
يوضح المثال أدناه كيفية استخدام مجموعة تطوير برمجيات سولانا لإنشاء keypair.
31+
يتضمن `Keypair` ما يلي:
32+
33+
- مفتاح عام يعمل كعنوان الحساب
34+
- مفتاح خاص يُستخدم لتوقيع المعاملات
3135

3236
<CodeTabs storage="accounts" flags="r">
3337

@@ -60,11 +64,11 @@ async fn main() {
6064

6165
</CodeTabs>
6266

63-
### العنوان المشتق من البرنامج
67+
### Program Derived Address
6468

65-
[العنوان المشتق من البرنامج](/docs/core/pda) (PDA) هو عنوان يتم اشتقاقه بشكل
66-
حتمي باستخدام معرّف البرنامج ومدخل واحد أو أكثر اختياري (بذور). يوضح المثال
67-
أدناه كيفية استخدام مكتبة تطوير سولانا لإنشاء عنوان مشتق من البرنامج.
69+
[Program Derived Address](/docs/core/pda) (PDA) هو عنوان يتم اشتقاقه بشكل حتمي
70+
باستخدام معرّف البرنامج ومدخلات اختيارية واحدة أو أكثر (البذور). يوضح المثال
71+
أدناه كيفية استخدام مجموعة تطوير برمجيات سولانا لإنشاء Program Derived Address.
6872

6973
<CodeTabs storage="accounts" flags="r">
7074

@@ -124,12 +128,12 @@ async fn main() {
124128

125129
<WithMentions>
126130

127-
- [`lamports`](mention:lamports): عدد [لامبورتس](#lamports) في الحساب
128-
- [`data`](mention:data): [بيانات](#data) الحساب
129-
- [`owner`](mention:owner): معرّف البرنامج الذي [يملك](#owner) الحساب
130-
- [`executable`](mention:executable): يشير إلى ما إذا كان الحساب يحتوي على ثنائي
131-
[قابل للتنفيذ](#executable)
132-
- [`rent_epoch`](mention:rent_epoch): حقل [فترة الإيجار](#rent-epoch) المهمل
131+
- [`lamports`](mention:lamports): عدد وحدات lamport في الحساب
132+
- [`data`](mention:data): بيانات الحساب
133+
- [`owner`](mention:owner): معرّف البرنامج الذي يملك الحساب
134+
- [`executable`](mention:executable): يشير إلى ما إذا كان الحساب يحتوي على ملف
135+
ثنائي قابل للتنفيذ
136+
- [`rent_epoch`](mention:rent_epoch): حقل rent epoch المهمل
133137

134138
```rust title="Account"
135139
pub struct Account {
@@ -156,23 +160,24 @@ pub struct Account {
156160

157161
<ScrollyCoding>
158162

159-
## !!steps لامبورت
163+
## !!steps وحدات Lamports
160164

161-
رصيد الحساب بوحدة [lamport](/docs/references/terminology#lamport).
165+
رصيد الحساب بوحدات [lamport](/docs/references/terminology#lamport).
162166

163167
يجب أن يكون لكل حساب حد أدنى من رصيد lamport، يسمى
164-
[rent](/docs/references/terminology#rent)، والذي يسمح بتخزين بياناته على
165-
السلسلة. يتناسب الإيجار مع حجم الحساب.
168+
[rent](/docs/references/terminology#rent)، مما يسمح بتخزين بياناته على السلسلة.
169+
يتناسب rent مع حجم الحساب.
166170

167171
<Callout type="info">
168-
على الرغم من أن هذا الرصيد يسمى إيجار، إلا أنه يعمل أكثر مثل وديعة، حيث يمكن
172+
على الرغم من أن هذا الرصيد يسمى rent، إلا أنه يعمل أكثر مثل وديعة، حيث يمكن
169173
استرداد الرصيد الكامل عند إغلاق الحساب. (يأتي اسم "rent" من حقل [rent
170-
epoch](#rent-epoch) الذي تم إلغاؤه الآن.)
174+
epoch](#rent-epoch) المهمل الآن.)
171175
</Callout>
172176

173-
(انظر صيغة
177+
(انظر
174178
[الحد الأدنى للرصيد](https://github.com/anza-xyz/agave/blob/v2.1.13/sdk/rent/src/lib.rs#L93-L97)
175-
و[الثوابت](https://github.com/anza-xyz/agave/blob/v2.1.13/sdk/rent/src/lib.rs#L47-L70)
179+
صيغة و
180+
[الثوابت](https://github.com/anza-xyz/agave/blob/v2.1.13/sdk/rent/src/lib.rs#L47-L70)
176181
المطبقة.)
177182

178183
```rust !! title="Account Examples"
@@ -201,20 +206,20 @@ Account {
201206

202207
## !!steps البيانات
203208

204-
يشار إلى هذا الحقل عادةً باسم "بيانات الحساب". تعتبر `data` في هذا الحقل عشوائية
205-
لأنها يمكن أن تحتوي على أي تسلسل من البايتات. يحدد كل برنامج هيكل البيانات
206-
المخزنة في هذا الحقل.
209+
يشار إلى هذا الحقل عادةً باسم "بيانات الحساب". تعتبر `data` في هذا الحقل
210+
اعتباطية حيث يمكن أن تحتوي على أي تسلسل من البايتات. كل برنامج يحدد بنية
211+
البيانات المخزنة في هذا الحقل.
207212

208-
- حسابات البرامج: يحتوي هذا الحقل إما على كود البرنامج القابل للتنفيذ أو عنوان
209-
[حساب بيانات البرنامج](#program-data-accounts) الذي يخزن كود البرنامج القابل
213+
- program account: يحتوي هذا الحقل إما على رمز البرنامج القابل للتنفيذ أو عنوان
214+
[حساب بيانات البرنامج](#program-data-accounts) الذي يخزن رمز البرنامج القابل
210215
للتنفيذ.
211216
- حسابات البيانات: يخزن هذا الحقل عمومًا بيانات الحالة، المقصود قراءتها.
212217

213218
تتضمن قراءة البيانات من حساب سولانا خطوتين:
214219

215220
1. جلب الحساب باستخدام [عنوانه](#account-address)
216-
2. فك تشفير حقل `data` الخاص بالحساب من البايتات الخام إلى هيكل البيانات
217-
المناسب، كما هو محدد من قبل البرنامج الذي يملك الحساب.
221+
2. فك تشفير حقل `data` الخاص بالحساب من البايتات الخام إلى بنية البيانات
222+
المناسبة، كما هو محدد من قبل البرنامج الذي يملك الحساب.
218223

219224
```rust !! title="Account Examples"
220225
// Example Token Mint Account
@@ -244,14 +249,15 @@ Account {
244249

245250
## !!steps المالك
246251

247-
يحتوي هذا الحقل على معرف البرنامج الخاص بمالك الحساب.
252+
يحتوي هذا الحقل على معرف البرنامج لمالك الحساب.
248253

249-
كل حساب في سولانا له [برنامج](/docs/core/programs) معين كمالك له. مالك الحساب هو
250-
البرنامج الوحيد الذي يمكنه تغيير `data` الخاصة بالحساب أو خصم وحدات lamport، كما
254+
كل حساب في سولانا لديه [برنامج](/docs/core/programs) معين كمالك له. مالك الحساب
255+
هو البرنامج الوحيد الذي يمكنه تغيير `data` الخاصة بالحساب أو خصم لامبورتس، كما
251256
هو موضح في تعليمات البرنامج.
252257

253-
(في حالة حساب البرنامج، يكون المالك هو
254-
[برنامج التحميل الخاص به](https://solana.com/docs/core/programs#loader-programs).)
258+
(في حالة program account، يكون المالك هو
259+
[برنامج التحميل](https://solana.com/docs/core/programs#loader-programs) الخاص
260+
به.)
255261

256262
```rust !! title="Account Examples"
257263
// Example Token Mint Account
@@ -279,10 +285,10 @@ Account {
279285

280286
## !!steps قابل للتنفيذ
281287

282-
يشير هذا الحقل إلى ما إذا كان الحساب هو [حساب برنامج](#program-accounts) أو
288+
يشير هذا الحقل إلى ما إذا كان الحساب هو [program account](#program-accounts) أو
283289
[حساب بيانات](#data-accounts)
284290

285-
- إذا كان `true`: فالحساب هو حساب برنامج
291+
- إذا كان `true`: فالحساب هو program account
286292
- إذا كان `false`: فالحساب هو حساب بيانات
287293

288294
```rust !! title="Account Examples"
@@ -313,8 +319,8 @@ Account {
313319

314320
**حقل `rent_epoch` مهمل.**
315321

316-
في الماضي، كان هذا الحقل يتتبع متى سيحتاج الحساب إلى دفع الإيجار. ومع ذلك، تم
317-
إهمال آلية تحصيل الإيجار هذه منذ ذلك الحين.
322+
في الماضي، كان هذا الحقل يتتبع متى سيحتاج الحساب إلى دفع rent. ومع ذلك، تم إهمال
323+
آلية تحصيل الإيجار هذه منذ ذلك الحين.
318324

319325
```rust !! title="Account Examples"
320326
// Example Token Mint Account
@@ -344,38 +350,37 @@ Account {
344350

345351
## أنواع الحسابات
346352

347-
هناك فئتان أساسيتان تندرج فيهما الحسابات:
353+
هناك فئتان أساسيتان تندرج تحتهما الحسابات:
348354

349355
- [حسابات البرامج](#program-accounts): حسابات تحتوي على رمز قابل للتنفيذ
350356
- [حسابات البيانات](#data-accounts): حسابات لا تحتوي على رمز قابل للتنفيذ
351357

352-
هذا الفصل يعني أن الرمز القابل للتنفيذ للبرنامج وحالته يتم تخزينهما في حسابات
353-
منفصلة. (مشابه لأنظمة التشغيل، التي عادة ما يكون لديها ملفات منفصلة للبرامج
354-
وبياناتها.)
358+
هذا الفصل بين رمز البرنامج وحالته هو ميزة أساسية في نموذج حسابات سولانا. (مشابه
359+
لأنظمة التشغيل، التي عادة ما تحتوي على ملفات منفصلة للبرامج وبياناتها.)
355360

356361
### حسابات البرامج
357362

358-
كل برنامج مملوك من قبل [برنامج التحميل](/docs/core/programs#loader-programs)،
359-
الذي يستخدم لنشر وإدارة الحساب. عندما يتم نشر [برنامج](/docs/core/programs)
360-
جديد، يتم إنشاء حساب لتخزين رمزه [القابل للتنفيذ](#executable). يسمى هذا حساب
363+
كل برنامج مملوك من قبل [برنامج محمّل](/docs/core/programs#loader-programs)، الذي
364+
يُستخدم لنشر وإدارة الحساب. عندما يتم نشر [برنامج](/docs/core/programs) جديد،
365+
يتم إنشاء حساب لتخزين رمزه [القابل للتنفيذ](#executable). هذا ما يسمى بحساب
361366
البرنامج. (للتبسيط، يمكنك اعتبار حساب البرنامج هو البرنامج نفسه.)
362367

363-
في الرسم البياني أدناه، يمكنك رؤية استخدام برنامج التحميل لنشر حساب برنامج.
364-
يحتوي حقل `data` الخاص بحساب البرنامج على رمز البرنامج القابل للتنفيذ.
368+
في الرسم البياني أدناه، يمكنك رؤية استخدام برنامج محمّل لنشر حساب برنامج. يحتوي
369+
حقل `data` الخاص بحساب البرنامج على رمز البرنامج القابل للتنفيذ.
365370

366-
![رسم توضيحي لحساب برنامج، ومكوناته الأربعة وبرنامج التحميل الخاص به.](/assets/docs/core/accounts/program-account-simple.svg)
371+
![رسم توضيحي لحساب برنامج، ومكوناته الأربعة وبرنامج المحمّل الخاص به.](/assets/docs/core/accounts/program-account-simple.svg)
367372

368373
#### حسابات بيانات البرامج
369374

370375
البرامج المنشورة باستخدام loader-v3 لا تحتوي على رمز البرنامج في حقل `data`
371-
الخاص بها. بدلاً من ذلك، يشير حقل `data` إلى **حساب بيانات البرنامج** منفصل،
372-
والذي يحتوي على رمز البرنامج. (انظر الرسم البياني أدناه.)
376+
الخاص بها. بدلاً من ذلك، يشير حقل `data` إلى **حساب بيانات برنامج** منفصل، يحتوي
377+
على رمز البرنامج. (انظر الرسم البياني أدناه.)
373378

374379
![حساب برنامج مع بيانات. البيانات تشير إلى حساب بيانات برنامج منفصل](/assets/docs/core/accounts/program-account-expanded.svg)
375380

376381
<Callout>
377-
أثناء نشر البرنامج أو الترقيات، يتم استخدام حسابات المخزن المؤقت لتجهيز
378-
التحميل مؤقتًا.
382+
أثناء نشر البرنامج أو الترقيات، تُستخدم حسابات المخزن المؤقت لتجهيز التحميل
383+
مؤقتًا.
379384
</Callout>
380385

381386
المثال أدناه يجلب حساب Token Program. لاحظ أن حقل `executable` مضبوط على `true`،
@@ -452,7 +457,7 @@ async fn main() -> Result<()> {
452457

453458
### حسابات البيانات
454459

455-
حسابات البيانات لا تحتوي على كود قابل للتنفيذ. بدلاً من ذلك، تقوم بتخزين
460+
لا تحتوي حسابات البيانات على رمز قابل للتنفيذ. بدلاً من ذلك، تقوم بتخزين
456461
المعلومات.
457462

458463
#### حساب حالة البرنامج
@@ -465,7 +470,8 @@ async fn main() -> Result<()> {
465470

466471
1. استدعاء [System Program](/docs/core/programs#the-system-program) لإنشاء حساب.
467472
(ثم ينقل System Program الملكية إلى البرنامج الجديد.)
468-
2. تهيئة بيانات الحساب، كما هو محدد في [تعليماته](/docs/core/instructions).
473+
2. تهيئة بيانات الحساب، كما هو محدد في [التعليمات](/docs/core/instructions)
474+
الخاصة به.
469475

470476
![رسم تخطيطي لحساب بيانات مملوك من قبل حساب برنامج](/assets/docs/core/accounts/data-account.svg)
471477

@@ -770,9 +776,9 @@ async fn main() -> Result<()> {
770776
عندما يتم إرسال SOL إلى عنوان جديد لأول مرة، يتم إنشاء حساب في ذلك العنوان مملوك
771777
من قبل System Program.
772778

773-
في المثال أدناه، يتم إنشاء keypair جديد وتمويله بـ SOL. بعد تشغيل الكود، يمكنك
774-
رؤية أن عنوان `owner` للحساب هو `11111111111111111111111111111111` (وهو
775-
[System Program](/docs/core/programs#the-system-program)).
779+
في المثال أدناه، يتم إنشاء زوج مفاتيح جديد وتمويله بـ SOL. بعد تشغيل الكود،
780+
يمكنك رؤية أن عنوان مالك الحساب `owner` هو `11111111111111111111111111111111`
781+
(وهو [System Program](/docs/core/programs#the-system-program)).
776782

777783
<CodeTabs storage="accounts" flags="r">
778784

@@ -869,8 +875,8 @@ async fn main() -> Result<()> {
869875

870876
#### حسابات Sysvar
871877

872-
توجد حسابات Sysvar في عناوين محددة مسبقًا وتوفر وصولاً إلى بيانات حالة المجموعة.
873-
تتحدث ديناميكيًا مع بيانات حول مجموعة الشبكة. راجع القائمة الكاملة لـ
878+
توجد حسابات Sysvar في عناوين محددة مسبقًا وتوفر الوصول إلى بيانات حالة المجموعة.
879+
يتم تحديثها ديناميكيًا ببيانات حول مجموعة الشبكة. راجع القائمة الكاملة لـ
874880
[حسابات Sysvar](https://docs.anza.xyz/runtime/sysvars).
875881

876882
المثال أدناه يجلب ويفك تشفير البيانات من حساب Sysvar Clock.

0 commit comments

Comments
 (0)