Skip to content

Commit 04d11cb

Browse files
committed
Translating managing state
- Revised mistakes. - Changed some words translations. - Added translations for code blocks
1 parent 18d68eb commit 04d11cb

File tree

2 files changed

+42
-42
lines changed

2 files changed

+42
-42
lines changed

src/content/learn/managing-state.md

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
---
2-
title: إدارة الحالة
2+
title: التحكم في الحالة
33
---
44

55
<Intro>
66

7-
مع نمو تطبيقك، من المفيد كونك أكثر حرصا بشأن أن تكون حالتك منظمة وأن تكون البيانات متدفقة خلال مكوناتك. تكرار أو نسخ الحالة هو مصدر شائع للأخطاء. في هذا الفصل، سوف تتعلم كيفية تهيئة حالتك جيدا، كيفية الحفاظ على منطق تحديث حالتك مصانا، وكيفية مشاركة الحالة بين المكونات المتباعدة.
7+
مع نمو تطبيقك، من المفيد كونك أكثر حرصا بشأن أن تكون حالتك منظمة وأن تكون البيانات متدفقة خلال مكوناتك. تكرار أو نسخ الحالة هو مصدر شائع للأخطاء. في هذا الفصل، سوف تتعلم كيفية هيكلة حالتك جيدا، كيفية الحفاظ على منطق تحديث حالتك مصانا، وكيفية مشاركة الحالة بين المكونات المتباعدة.
88

99
</Intro>
1010

1111
<YouWillLearn isChapter={true}>
1212

13-
* [كيفية التفكير في تغييرات واجهة المستخدم كتغيرات في الحالة](/learn/reacting-to-input-with-state)
13+
* [كيفية التفكير في تغييرات واجهة المستخدم (UI) كتغيرات في الحالة](/learn/reacting-to-input-with-state)
1414
* [كيفية هيكلة الحالة جيدا](/learn/choosing-the-state-structure)
1515
* [كيفية "رفع الحالة لمستوى أعلى (lifting state up)" لمشاكارتها بين المكونات](/learn/sharing-state-between-components)
1616
* [كيفية التحكم في ما إذا تم حفظ الحالة أم إعادة تعيينها](/learn/preserving-and-resetting-state)
@@ -22,7 +22,7 @@ title: إدارة الحالة
2222

2323
## الاستجابة للمدخلات باستخدام الحالة {/*reacting-to-input-with-state*/}
2424

25-
باستخدام React، لن تستطيع تعديل واجهة المستخدم عن طريق الكود مباشرة. على سبيل المثال، لن تكتب أوامر مثل "عطل الزر"، "فعل الزر"، "أظهر رسالة النجاح"، إلخ. بدلا عن ذلك، سوف تصف واجهة المستخدم التي تريد أن ترها للحالات المرئية من مكوناتك ("حالة ابتدائية"، "حالة كتابية"، "حالة ناجحة")، ومن بعدها تنشيط تغيرات الحالة بناءا على مدخل المستخدم. هذا مشابه لتصور المصممين عن واجهة المستخدم.
25+
باستخدام React، لن تستطيع تعديل واجهة المستخدم (UI) عن طريق الكود مباشرة. على سبيل المثال، لن تكتب أوامر مثل "عطل الزر"، "فعل الزر"، "أظهر رسالة النجاح"، إلخ. بدلا عن ذلك، سوف تصف واجهة المستخدم التي تريد أن تراها للحالات المرئية من مكوناتك ("حالة ابتدائية (initial state)"، "حالة كتابية (typing state)"، "حالة ناجحة (success state)")، ومن بعدها تنشيط تغيرات الحالة بناء على مدخل المستخدم. هذا مشابه لتصور المصممين عن واجهة المستخدم.
2626

2727
هنا نموذج اختبار صمم باستخدام React. لاحظ كيف يستخدم متغير الحالة `status` لكي يحدد ما إذا سيفعل أم سيعطل زر الإرسال، وما إذا ستظهر رسالة نجاح بدلا عن ذلك.
2828

@@ -109,7 +109,7 @@ function submitForm(answer) {
109109

110110
<LearnMore path="/learn/reacting-to-input-with-state">
111111

112-
اقرأ **[الاستجابة للمدخلات باستخدام الحالة](/learn/reacting-to-input-with-state)** لكي تتعلم كيفية الوصول لتعاملات مع عقلية معتمدة على الحالة.
112+
اقرأ **[الاستجابة للمدخلات باستخدام الحالة](/learn/reacting-to-input-with-state)** لكي تتعلم كيفية التعامل مع التفاعلات بعقلية موجّهة بناء على الحالة.
113113

114114
</LearnMore>
115115

@@ -232,7 +232,7 @@ label { display: block; margin-bottom: 5px; }
232232

233233
## مشاركة الحالة بين المكونات {/*sharing-state-between-components*/}
234234

235-
أحيانا، أنت تريد الحالة ذات المكونين أن تتغير دائما مع بعضها البعض. لعمل ذلك، احذف حالة من كليهما، انقلها لأقرب مكون أب، وبعد ذلك مررها لأسفل باستخدام الخصائص. هذا ما يعرف بـ "رفع الحالة لمستوى أعلى (lifting state up)"، وهو واحد من أكثر الأشياء شيوعا التي ستسعملها أثناء كتابتك لكود React.
235+
أحيانا، أنت تريد الحالة ذات المكونين أن تتغير دائما مع بعضها البعض. لعمل ذلك، احذف حالة من كليهما، انقلها لأقرب مكون أب، وبعد ذلك مررها لأسفل باستخدام الخصائص (props). هذا ما يعرف بـ "رفع الحالة لمستوى أعلى (lifting state up)"، وهو واحد من أكثر الأشياء شيوعا التي ستسعملها أثناء كتابتك لكود React.
236236

237237
في هذا المثال، في كل مرة يجب أن تكون قائمة واحدة فقط نشطة. لتحقيق ذلك، بدلا من حفظ الحالة النشطة داخل كل قائمة بمفردها، المكونّ الأب يحمل الحالة ويحدد الخصائص لمكوناته الأبناء.
238238

@@ -258,7 +258,7 @@ export default function Accordion() {
258258
isActive={activeIndex === 1}
259259
onShow={() => setActiveIndex(1)}
260260
>
261-
الاسم مأخوذ من <span lang="kk-KZ">алма</span>، الكلمة الكازاخستانية التي تعني "تفاحة" وغالبا تترجم على أنها "مليئة بالتفاح". في الحقيقة، المنطقة المحيطة بـ Almaty تعتبر الموطن الأصلي للتفاحة، والنوع البريّ <i lang="la">Malus sieversii</i> يعتبر أقرب مرشح
261+
الاسم مأخوذ من <span lang="kk-KZ">алма</span>، الكلمة الكازاخستانية التي تعني "تفاحة" وغالبا تترجم على أنها "مليئة بالتفاح". في الحقيقة، المنطقة المحيطة بـ Almaty تعتبر الموطن الأصلي للتفاح، والنوع البريّ <i lang="la">Malus sieversii</i> يعتبر أقرب مرشح لكونه أصل للتفاح المحلي الحديث.
262262
</Panel>
263263
</>
264264
);
@@ -303,7 +303,7 @@ h3, p { margin: 5px 0px; }
303303

304304
## حفظ وإعادة تعيين الحالة {/*preserving-and-resetting-state*/}
305305

306-
عمدما تعيد تصيير مكون، React تحتاج لتقرر أىّ أجزاء من الشجرة لتحفظها (وتحدثها)، وأيّ أجزاء لتلغيها أو تعيد إنشاءها من الصفر. في أغلب الحالات، التصرف التلقائي لـ React يعمل بشكل جيد كفاية. تلقائياـ React تحفظ الأجزاء من الشجرة التي "تتوافق" مع مكون الشجرة المصيير مسبقا.
306+
عندما تعيد تصيير مكون، React تحتاج لتقرر أىّ أجزاء من الشجرة لتحفظها (وتحدثها)، وأيّ أجزاء لتلغيها أو تعيد إنشاءها من الصفر. في أغلب الحالات، التصرف التلقائي لـ React يعمل بشكل جيد كفاية. تلقائيا، React تحفظ الأجزاء من الشجرة التي "تتوافق" مع مكون الشجرة المصيّر مسبقا.
307307

308308
على كل حال، أحيانا هذا ما لا تريده أنت. في تطبيق المحادثة هذا، كتابة رسالة وتغيير الطرف المستقبل لا يعيد تعيين المدخل. هذا قد يجعل المستخدم يرسل رسالة بغير قصد للشخص الخطأ.
309309

@@ -400,7 +400,7 @@ textarea {
400400

401401
</Sandpack>
402402

403-
React تعطيك القدرة على تجاوز السلوك الافتراضي، و*تفرض* على المكون إعادة تعيين حالته عن طريق تمرير `key` مختلف لها، مثل `<Chat key={email} />`. هذا يخبر React أن الطرف المستقبل مختلف، ومن الواجب تعيين مكون `Chat` *مختلف* يكون بحاجة إلى إعادة الإنشاء من الصفر ببايانات جديدة (وواجهة مستخدم مثل المدخلات). الآن الانتقال بين المستقبلين يعيد تعيين حقل الإدخال--حتى بالرغم من أنك تعيد تصيير نفس المكون.
403+
React تعطيك القدرة على تجاوز السلوك الافتراضي، و*الفرض* على المكون إعادة تعيين حالته عن طريق تمرير `key` مختلف لها، مثل `<Chat key={email} />`. هذا يخبر React أن الطرف المستقبل مختلف، ومن الواجب تعيين مكون `Chat` *مختلف* يكون بحاجة إلى إعادة الإنشاء من الصفر ببايانات جديدة (وواجهة مستخدم مطابقة للمدخلات). الآن الانتقال بين المستقبلين يعيد تعيين حقل الإدخال--حتى بالرغم من أنك تعيد تصيير نفس المكون.
404404

405405
<Sandpack>
406406

@@ -497,13 +497,13 @@ textarea {
497497

498498
<LearnMore path="/learn/preserving-and-resetting-state">
499499

500-
اقرأ **[حفظ وإعادة تعيين الحالة](/learn/preserving-and-resetting-state)** لتتعلم الحياة الزمنية للحالة وكيفية التحكم بها.
500+
اقرأ **[حفظ وإعادة تعيين الحالة](/learn/preserving-and-resetting-state)** لتتعلم عن الحياة الزمنية للحالة وكيفية التحكم بها.
501501

502502
</LearnMore>
503503

504504
## استخلاص منطق الحالة إلى مخفض (reducer) {/*extracting-state-logic-into-a-reducer*/}
505505

506-
المكونات ذات تحديثات حالة كثيرة المنتشرة خلال كثير من معالجات الأحداث (event handlers) قد تصبح معقدة. لمثل هذه الأحوال، يمكنك تجميع جميع منطق تحديث الحالة خارج مكوّنك داخل دالة واحدة، تدعى "مخفض (reducer)". معالجات الأحداث خاصتك ستصبح موجزة لأنها تحدد "إجراءات (actions)" المستخدم فقط. في أسفل الملف، دالة المخفض تحدد كيف يجب أن تحدث الحالة إستجابة لكل إجراء!
506+
المكونات ذات تحديثات حالة كثيرة المنتشرة خلال كثير من معالجات الأحداث (event handlers) قد تصبح معقدة. لمثل هذه الأحوال، يمكنك تجميع جميع منطق تحديث الحالة خارج مكوّنك داخل دالة واحدة، تدعى "مخفض (reducer)". معالجات الأحداث خاصتك ستصبح موجزة لأنها تحدد "إجراءات (actions)" المستخدم فقط. في أسفل الملف، دالة المخفض تحدد كيف يجب أن تحدث الحالة استجابةً لكل إجراء!
507507

508508
<Sandpack>
509509

@@ -542,7 +542,7 @@ export default function TaskApp() {
542542

543543
return (
544544
<>
545-
<h1>Prague itinerary</h1>
545+
<h1>Prague مخطط رحلة</h1>
546546
<AddTask
547547
onAddTask={handleAddTask}
548548
/>
@@ -584,9 +584,9 @@ function tasksReducer(tasks, action) {
584584

585585
let nextId = 3;
586586
const initialTasks = [
587-
{ id: 0, text: 'Visit Kafka Museum', done: true },
588-
{ id: 1, text: 'Watch a puppet show', done: false },
589-
{ id: 2, text: 'Lennon Wall pic', done: false }
587+
{ id: 0, text: 'زيارة متحف Kafka', done: true },
588+
{ id: 1, text: 'مشاهدة عرض الدمى', done: false },
589+
{ id: 2, text: 'Lennon Wall صورة', done: false }
590590
];
591591
```
592592

@@ -598,14 +598,14 @@ export default function AddTask({ onAddTask }) {
598598
return (
599599
<>
600600
<input
601-
placeholder="Add task"
601+
placeholder="إضافة مهمة"
602602
value={text}
603603
onChange={e => setText(e.target.value)}
604604
/>
605605
<button onClick={() => {
606606
setText('');
607607
onAddTask(text);
608-
}}>Add</button>
608+
}}>أضف</button>
609609
</>
610610
)
611611
}
@@ -649,7 +649,7 @@ function Task({ task, onChange, onDelete }) {
649649
});
650650
}} />
651651
<button onClick={() => setIsEditing(false)}>
652-
Save
652+
حفظ
653653
</button>
654654
</>
655655
);
@@ -658,7 +658,7 @@ function Task({ task, onChange, onDelete }) {
658658
<>
659659
{task.text}
660660
<button onClick={() => setIsEditing(true)}>
661-
Edit
661+
تعديل
662662
</button>
663663
</>
664664
);
@@ -677,7 +677,7 @@ function Task({ task, onChange, onDelete }) {
677677
/>
678678
{taskContent}
679679
<button onClick={() => onDelete(task.id)}>
680-
Delete
680+
حذف
681681
</button>
682682
</label>
683683
);
@@ -702,7 +702,7 @@ ul, li { margin: 0; padding: 0; }
702702

703703
عادة، سوف تقوم بتمرير معلومات من مكوّن أب إلى مكوّن ابن بواسطة الخصائص (props). لكن تمرير الخصائص قد يكون غير مجدٍ لو احتجت لتمرير بعض الخصائص خلال مكونات عديدة، أو لو أن العديد من المكونات تحتاج نفس المعلومات. السياق (context) يتيح للمكون الأب جعل بعض المعلومات متوفرة لأي مكون أدناه في الشجرة-لا يهم مقدار عمق المكون-بدون تمريرها مباشرة عن طريق الخصائص.
704704

705-
هنا، المكوّن `Heading` يحدد مستوى عنوانه عن طريق "سؤال" أقرب `Section` لمستواها. كل `Section` يتتبع مستواه الخاص عن طريق سؤال `Section` الأب وإضافة واحد له. كل `Section` بتوفير معلومات لجميع المكونات أدناه دون نقل الخصائص--وهذا يتم عبر السياق (context).
705+
هنا، المكوّن `Heading` يحدد مستوى عنوانه عن طريق "سؤال" أقرب `Section` لمستواه. كل `Section` يتتبع مستواه الخاص عن طريق سؤال `Section` الأب وإضافة واحد له. كل `Section` يقوم بتوفير معلومات لجميع المكونات أدناه دون نقل الخصائص--وهذا يتم عبر السياق (context).
706706

707707
<Sandpack>
708708

@@ -713,19 +713,19 @@ import Section from './Section.js';
713713
export default function Page() {
714714
return (
715715
<Section>
716-
<Heading>Title</Heading>
716+
<Heading>عنوان</Heading>
717717
<Section>
718-
<Heading>Heading</Heading>
719-
<Heading>Heading</Heading>
720-
<Heading>Heading</Heading>
718+
<Heading>عنوان رئيسي</Heading>
719+
<Heading>عنوان رئيسي</Heading>
720+
<Heading>عنوان رئيسي</Heading>
721721
<Section>
722-
<Heading>Sub-heading</Heading>
723-
<Heading>Sub-heading</Heading>
724-
<Heading>Sub-heading</Heading>
722+
<Heading>عنوان فرعي</Heading>
723+
<Heading>عنوان فرعي</Heading>
724+
<Heading>عنوان فرعي</Heading>
725725
<Section>
726-
<Heading>Sub-sub-heading</Heading>
727-
<Heading>Sub-sub-heading</Heading>
728-
<Heading>Sub-sub-heading</Heading>
726+
<Heading>عنوان فرعي ثانٍ</Heading>
727+
<Heading>عنوان فرعي ثانٍ</Heading>
728+
<Heading>عنوان فرعي ثانٍ</Heading>
729729
</Section>
730730
</Section>
731731
</Section>
@@ -816,7 +816,7 @@ import { TasksProvider } from './TasksContext.js';
816816
export default function TaskApp() {
817817
return (
818818
<TasksProvider>
819-
<h1>Day off in Kyoto</h1>
819+
<h1>يوم إجازة في Kyoto</h1>
820820
<AddTask />
821821
<TaskList />
822822
</TasksProvider>
@@ -883,9 +883,9 @@ function tasksReducer(tasks, action) {
883883
}
884884

885885
const initialTasks = [
886-
{ id: 0, text: 'Philosopher’s Path', done: true },
887-
{ id: 1, text: 'Visit the temple', done: false },
888-
{ id: 2, text: 'Drink matcha', done: false }
886+
{ id: 0, text: 'Philosopher’الطريق الـ', done: true },
887+
{ id: 1, text: 'زيارة المعبد', done: false },
888+
{ id: 2, text: 'شراب الشاي الأخضر (matcha)', done: false }
889889
];
890890
```
891891

@@ -899,7 +899,7 @@ export default function AddTask({ onAddTask }) {
899899
return (
900900
<>
901901
<input
902-
placeholder="Add task"
902+
placeholder="إضافة مهمة"
903903
value={text}
904904
onChange={e => setText(e.target.value)}
905905
/>
@@ -910,7 +910,7 @@ export default function AddTask({ onAddTask }) {
910910
id: nextId++,
911911
text: text,
912912
});
913-
}}>Add</button>
913+
}}>أضف</button>
914914
</>
915915
);
916916
}
@@ -954,7 +954,7 @@ function Task({ task }) {
954954
});
955955
}} />
956956
<button onClick={() => setIsEditing(false)}>
957-
Save
957+
حفظ
958958
</button>
959959
</>
960960
);
@@ -963,7 +963,7 @@ function Task({ task }) {
963963
<>
964964
{task.text}
965965
<button onClick={() => setIsEditing(true)}>
966-
Edit
966+
تعديل
967967
</button>
968968
</>
969969
);
@@ -990,7 +990,7 @@ function Task({ task }) {
990990
id: task.id
991991
});
992992
}}>
993-
Delete
993+
حذف
994994
</button>
995995
</label>
996996
);
@@ -1007,7 +1007,7 @@ ul, li { margin: 0; padding: 0; }
10071007

10081008
<LearnMore path="/learn/scaling-up-with-reducer-and-context">
10091009

1010-
اقرأ **[التوسع بواسطة المخفض (reducer) و السياق (context)](/learn/scaling-up-with-reducer-and-context)** لتتعلم كيف تتوسع إدارة الحالة في تطبيق نامٍ.
1010+
اقرأ **[التوسع بواسطة المخفض (reducer) و السياق (context)](/learn/scaling-up-with-reducer-and-context)** لتتعلم كيف توسيع إدارة الحالة في تطبيق نامٍ.
10111011

10121012
</LearnMore>
10131013

src/sidebarLearn.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
]
122122
},
123123
{
124-
"title": "إدارة الحالة",
124+
"title": "التحكم في الحالة",
125125
"path": "/learn/managing-state",
126126
"tags": ["intermediate"],
127127
"routes": [

0 commit comments

Comments
 (0)