From 40d2cf5014945bf011e85a398d3981a3f31a6174 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:13:07 +0330 Subject: [PATCH 01/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_10.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 translations/fa-IR/try_ruby_10.md diff --git a/translations/fa-IR/try_ruby_10.md b/translations/fa-IR/try_ruby_10.md new file mode 100644 index 0000000..db90fe4 --- /dev/null +++ b/translations/fa-IR/try_ruby_10.md @@ -0,0 +1,21 @@ +--- +lang: FA-IR +title: ۳۰ دقیقه وقت داری؟ همین حالا به روبی یک فرصت بده! +answer: +class: stretcher chapmark +ok: +error: +--- + +روبی یک زبان برنامه‌نویسی از کشور ژاپن است که در حال متحول‌کردن توسعه نرم‌افزار می‌باشد. + +زیبایی روبی در تعادل آن میان سادگی و قدرت یافت می‌شود. + +می‌توانید مقداری کد روبی را در ویرایشگر تایپ کنید و از این دکمه‌ها برای پیمایش استفاده کنید: + +- __اجرا__ ← کد موجود در ویرایشگر را اجرا می‌کند +- __رونوشت__ ← کد نمونه را در ویرایشگر رونوشت می‌کند +- __بعدی__ ← به شما اجازه می‌دهد به درس بعدی بروید +- __قبلی__ ← به شما اجازه می‌دهد به درس قبلی بازگردید + +
روی بعدی کلیک کنید تا یادگیری را آغاز کنید.
From f39a3624c87b0e2f99ecdf765d7be5a1603884dc Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:13:23 +0330 Subject: [PATCH 02/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_20.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 translations/fa-IR/try_ruby_20.md diff --git a/translations/fa-IR/try_ruby_20.md b/translations/fa-IR/try_ruby_20.md new file mode 100644 index 0000000..9dde3f9 --- /dev/null +++ b/translations/fa-IR/try_ruby_20.md @@ -0,0 +1,18 @@ +--- +lang: FA-IR +title: استفاده از ویرایشگر +answer: ^\d{1,}$ +ok: خوبه! کمی ریاضی انجام دادی. ببین چطور پاسخ ظاهر شد؟ +error: در ویرایشگر ۲ + ۶ را تایپ کن +--- + +پنجرهٔ ویرایشگر جایی است که کد روبی خود را تایپ می‌کنید. دکمهٔ __اجرا__ را بزنید و ببینید چطور اجرا می‌شود! + +برای مثال، امتحان کنید کمی ریاضی تایپ کنید. مانند: + + 2 + 6 + +خروجی برنامهٔ شما باید در پنجرهٔ خروجی نمایش داده شود. +همچنین خط دیگری هم وجود دارد در جواب که به شما می‌گوید چقدر خوب عمل کردید. + +> یا می توانید دکمه __رونوشت__ را فشار دهید تا کد نمونه را در ویرایشگر رونوشت شود. From 71a1a1c7235396ca925751d8883d80573cee1722 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:13:30 +0330 Subject: [PATCH 03/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_30.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 translations/fa-IR/try_ruby_30.md diff --git a/translations/fa-IR/try_ruby_30.md b/translations/fa-IR/try_ruby_30.md new file mode 100644 index 0000000..1b66b4a --- /dev/null +++ b/translations/fa-IR/try_ruby_30.md @@ -0,0 +1,13 @@ +--- +lang: FA-IR +title: اعداد و ریاضی +answer: ^[0-9\.,-]{1,}$ +ok: خوبه +error: +--- + +روبی، عددها و نمادهای ریاضی را تشخیص می‌دهد. می‌توانید چند محاسبهٔ دیگر را امتحان کنید؛ مانند: + + 4 * 10 + 5 - 12 + 30 / 4 \ No newline at end of file From 2d95fd6ab36256c078cef3ac667b94e4b1636459 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:13:51 +0330 Subject: [PATCH 04/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_40.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 translations/fa-IR/try_ruby_40.md diff --git a/translations/fa-IR/try_ruby_40.md b/translations/fa-IR/try_ruby_40.md new file mode 100644 index 0000000..aa9f15a --- /dev/null +++ b/translations/fa-IR/try_ruby_40.md @@ -0,0 +1,25 @@ +--- +lang: FA-IR +title: چاپ کردن به شکلی دیگر +answer: ^[0-9\.,-]{1,}$ +ok: به خوبی چاپ شد +error: +--- + + آیا متوجه شدید که اگر بیش از یک فرمول بنویسید، فقط پاسخ آخرین فرمول را می‌بینید. چه اتفاقی می‌افتد؟ + +> برای آسان‌تر کردن استفاده از این وبگاه، به روبی گفته‌ام نتیجهٔ برنامهٔ شما را در +> صفحهٔ خروجی رونوشت کند. بنابراین وقتی یک فرمول می‌نویسید نتایج را می‌بینید. +> __اما فقط آخرین نتیجه.__ و تنها در صورتی که خروجی همچنان خالی باشد. + +پس وقتی ۲ یا چند فرمول وارد کردید، روبی فقط نتیجهٔ آخرین فرمول را نشان داد. + +البته شما قدرت کنترل صفحه نمایش را دارید! کافی است قبل از هر فرمول __puts__ بنویسید (با یک فاصله در میان). puts یعنی: *«چیزی را روی صفحه قرار بده»*. + +امتحان کنید: + + puts 4 * 10 + puts 5 - 12 + puts 30 / 4 + +حالا puts را از آخرین فرمول حذف کنید و ببینید چه اتفاقی می‌افتد. From 2efadbaa7df526c9b01838176f495d8ab6f95db6 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:13:55 +0330 Subject: [PATCH 05/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_50.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 translations/fa-IR/try_ruby_50.md diff --git a/translations/fa-IR/try_ruby_50.md b/translations/fa-IR/try_ruby_50.md new file mode 100644 index 0000000..2aee168 --- /dev/null +++ b/translations/fa-IR/try_ruby_50.md @@ -0,0 +1,13 @@ +--- +lang: FA-IR +title: اسم‌ت را بگو +answer: [a-zA-Z]{1,1} +ok: عالیه، رشته‌ای از حروف اسم‌ت ساخته‌ای +error: +--- + +مطمئناً، رایانه‌ها برای ریاضی مفید و سریع هستند. برویم جلوتر. می‌خواهی اسم‌ت را وارونه ببینی؟ + +ابتدا نام کوچکت را درون گیومه بنویس، مانند این: + + "Goudarz" From 064e906fd319c74330177367bf70d3e2ceb245eb Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:08 +0330 Subject: [PATCH 06/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_60.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 translations/fa-IR/try_ruby_60.md diff --git a/translations/fa-IR/try_ruby_60.md b/translations/fa-IR/try_ruby_60.md new file mode 100644 index 0000000..af80b04 --- /dev/null +++ b/translations/fa-IR/try_ruby_60.md @@ -0,0 +1,15 @@ +--- +lang: FA-IR +title: اسم‌ت را وارونه بگو +answer: \w+ +ok: هبوخ +error: +--- + +رشته مجموعه‌ای از نویسه‌هاست که رایانه می‌تواند پردازش کند. تصور کن حروف روی یک بند رخت هستند و گیومه‌ها گیره‌هایی هستند که دو سر را نگه می‌دارند. گیومه‌ها آغاز و پایان را مشخص می‌کنند. + +برای وارونه کردن اسم‌ت، بنویس: + + "Goudarz".reverse + +(نقطه را فراموش نکن!) From 2bf5e21119584cf2016c849eabf3f65a11db25ce Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:15 +0330 Subject: [PATCH 07/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_70.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 translations/fa-IR/try_ruby_70.md diff --git a/translations/fa-IR/try_ruby_70.md b/translations/fa-IR/try_ruby_70.md new file mode 100644 index 0000000..e0daf61 --- /dev/null +++ b/translations/fa-IR/try_ruby_70.md @@ -0,0 +1,13 @@ +--- +lang: FA-IR +title: شمارش حروف +answer: ^\d+$ +ok: بله. Length نیز یک «متد» است +error: +--- + +شما از __متد__ reverse روی اسم‌تان استفاده کرده‌اید! با قرار دادن اسم‌تان در گیومه‌ها، یک رشته ساخته‌اید. سپس متد reverse را فراخوانده‌اید که روی رشته‌ها کار می‌کند تا همهٔ حروف را وارونه کند. + +حالا ببینیم چند حرف در اسم‌تان وجود دارد: + + "Goudarz".length From 79ba2683321a9a9597244c5f7f45f4d725e29034 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:22 +0330 Subject: [PATCH 08/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_80.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 translations/fa-IR/try_ruby_80.md diff --git a/translations/fa-IR/try_ruby_80.md b/translations/fa-IR/try_ruby_80.md new file mode 100644 index 0000000..22d3ae2 --- /dev/null +++ b/translations/fa-IR/try_ruby_80.md @@ -0,0 +1,17 @@ +--- +lang: FA-IR +title: تکرار +answer: (\w+) +ok: خوشحال شدم از دیدنت.خوشحال شدم از دیدنت.خوشحال شدم از دیدنت. +error: +--- + +حالا احتمالا می‌پرسید این‌ها به چه درد می‌خورند. + +خب، مطمئنم به وبگاهٔ رفته‌اید که پیغام داده که: __گذرواژه‌ات خیلی کوتاه است!__ + +می‌بینید، برخی برنامه‌ها از همان کد سادهٔ __.length__ استفاده می‌کنند. + +این را ببینید. بیایید اسم‌تان را در ۵ ضرب کنیم. + + "Goudarz" * 5 From f099674b125a031112c2acc23a1ecab3a69763f7 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:26 +0330 Subject: [PATCH 09/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_90.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 translations/fa-IR/try_ruby_90.md diff --git a/translations/fa-IR/try_ruby_90.md b/translations/fa-IR/try_ruby_90.md new file mode 100644 index 0000000..8e1ad7e --- /dev/null +++ b/translations/fa-IR/try_ruby_90.md @@ -0,0 +1,29 @@ +--- +lang: FA-IR +title: خلاصهٔ شماره ۱ همین حالا +answer: NoMethodError|undefined|-e:in `eval'|-e:in 'Kernel.eval' +class: stretcher chapmark +ok: نه، امکان وارونه کردن یک عدد وجود ندارد. روی «بعدی» کلیک کن +error: +--- + +بیایید ببینیم در اولین دقیقه چه چیزهایی یاد گرفته‌اید. + +### ویرایشگر +با تایپ کد در ویرایشگر و کلیک روی دکمهٔ اجرا پاسخی را در پنجرهٔ خروجی به شما نمایش می‌دهد. +(تقریباً) همهٔ کدها پاسخی می‌دهند. + +### اعداد و رشته‌ها +اعداد و رشته‌ها اشیای ریاضی و متنی روبی هستند. + +### متدها +شما از متدهای انگلیسی مانند reverse و length استفاده کرده‌اید. و از متدهای نمادین مانند متد ضرب: \* +__متدها یعنی عمل!__ + +این جوهرهٔ یادگیری شماست. گرفتن چیزهای ساده، بازی با آن‌ها و تبدیل‌شان به چیزهای جدید. +احساس راحتی می‌کنید؟ قول می‌دهم که می‌کنید. + +## خب، +بیایید کاری ناخوشایند انجام دهیم. امتحان کنید یک عدد را وارونه کنید: + + 40.reverse From 0f518567b06c1b6ee06a22f5ba62c17cba448291 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:33 +0330 Subject: [PATCH 10/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_100.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 translations/fa-IR/try_ruby_100.md diff --git a/translations/fa-IR/try_ruby_100.md b/translations/fa-IR/try_ruby_100.md new file mode 100644 index 0000000..40fc495 --- /dev/null +++ b/translations/fa-IR/try_ruby_100.md @@ -0,0 +1,15 @@ +--- +lang: FA-IR +title: بس کن، دیوانه شدی! +answer: ^\d{1,}$ +ok: فقط رشته‌ها می‌توانند وارونه شوند +error: +--- + +نمی‌توانید عدد چهل را وارونه کنید. حدس می‌زنم بتوانید مانیتور خود را جلوی آینه بگیرید، اما وارونه کردن یک عدد اصلا منطقی نیست. + +روبی یک پیام خطا داده است. روبی به شما می‌گوید هیچ متد reverse برای اعداد وجود ندارد. + +شاید اگر ابتدا عدد را به رشته تبدیل کنید: + + 40.to_s.reverse From 879fa9b7544b1348e04c3b46fa4beb0d70f6a7c3 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:14:56 +0330 Subject: [PATCH 11/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_120.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 translations/fa-IR/try_ruby_120.md diff --git a/translations/fa-IR/try_ruby_120.md b/translations/fa-IR/try_ruby_120.md new file mode 100644 index 0000000..83332f1 --- /dev/null +++ b/translations/fa-IR/try_ruby_120.md @@ -0,0 +1,18 @@ +--- +lang: FA-IR +title: ایستادن در صف +answer: ^\[([-\.\d]+)(\s*,\s*[-\d\.]+){3,}\]$ +ok: عالی +error: سعی کن یک عدد چهارم هم به لیست اضافه کنی +--- + +لیست‌ها (آرایه‌ها) چیزها را __به ترتیب مشخصی__ ذخیره می‌کنند. + +مثل ایستادن در صف نانوایی. شما پشت سر کسی هستید و هرگز فکر نمی‌کنید او را کنار بزنید و ازش رد بشید، +درسته؟ و فردی پشت سر شما، نگاه دقیقی به او دارید، درسته؟ + +اینجا یک لیست برای شماست. شماره‌های بخت‌آزمایی: + + [12, 47, 35] + +سعی کنید یک عدد به این لیست اضافه کنید: بعد از 35 یک ویرگول انگلیسی«,» تایپ کنید و سپس یک عدد بنویسید، فاصله اختیاری است. From 4cf533e3a3c63cd43c5c7864ebae5957b9432a50 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:00 +0330 Subject: [PATCH 12/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_130.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 translations/fa-IR/try_ruby_130.md diff --git a/translations/fa-IR/try_ruby_130.md b/translations/fa-IR/try_ruby_130.md new file mode 100644 index 0000000..edc3f61 --- /dev/null +++ b/translations/fa-IR/try_ruby_130.md @@ -0,0 +1,13 @@ +--- +lang: FA-IR +title: یکی دستش را بالا می‌برد +answer: ^47$ +ok: خوبه +error: +--- + +یک لیست از شماره‌های بخت‌آزمایی. کدام یکی بزرگ‌تر است؟ + +امتحان کن: + + [12, 47, 35].max From 1f852f86eaed38a8cb7f80ab33356aa35272438d Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:05 +0330 Subject: [PATCH 13/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_140.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 translations/fa-IR/try_ruby_140.md diff --git a/translations/fa-IR/try_ruby_140.md b/translations/fa-IR/try_ruby_140.md new file mode 100644 index 0000000..5003f35 --- /dev/null +++ b/translations/fa-IR/try_ruby_140.md @@ -0,0 +1,13 @@ +--- +lang: FA-IR +title: کنار گذاشتن یک لیست +answer: ^\[(\d+)(,\s*\d+){2,}\]$ +ok: ذخیره شد! +error: +--- + +خوب، خوب؛ اما آزاردهنده است که هر بار که به آن لیست نیاز دارید مجبور باشید دوباره آن را تایپ کنید، این‌طور نیست؟ + +بیایید اعدادمان را داخل یک بلیت ذخیره کنیم مانند این: + + ticket = [12, 47, 35] From 451246f6a1dca38b15dfcee703baf6aeb4368b31 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:12 +0330 Subject: [PATCH 14/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_150.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 translations/fa-IR/try_ruby_150.md diff --git a/translations/fa-IR/try_ruby_150.md b/translations/fa-IR/try_ruby_150.md new file mode 100644 index 0000000..95627ca --- /dev/null +++ b/translations/fa-IR/try_ruby_150.md @@ -0,0 +1,12 @@ +--- +lang: FA-IR +title: حالا بلیت را تایپ کن +answer: \[(\d+(, )?){2,}\] +load: ticket = [12, 47, 35] +ok: بازیابی شد! +error: +--- + +حالا تایپ کن: + + ticket From 0c8d6fccd0b6f1ace87e3b7dd37e2c0fbe300aab Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:16 +0330 Subject: [PATCH 15/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_160.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 translations/fa-IR/try_ruby_160.md diff --git a/translations/fa-IR/try_ruby_160.md b/translations/fa-IR/try_ruby_160.md new file mode 100644 index 0000000..543788e --- /dev/null +++ b/translations/fa-IR/try_ruby_160.md @@ -0,0 +1,24 @@ +--- +lang: FA +title: ذخیره شد، کنار گذاشته شد +answer: \[12, 35, 47\] +load: ticket = [12, 47, 35] +ok: لیست را مرتب کرده‌ای +error: +--- + +شما شماره‌های بخت‌آزمایی‌تان را نگه داشته‌اید و آن‌ها را داخل یک **متغیر** به نام ticket کنار گذاشته‌اید. +اما هر نام دیگری، مثل _goudilist_، هم خوب بود. + +متوجه خواهید شد که برنامه نویسی بیشتر در مورد کار با متغیرها است. + +بیایید شماره‌های بخت‌آزمایی‌تان را مرتب کنیم، چطوره؟ + +استفاده کنید: + + ticket.sort! + +شما یک لیست داشتید و اون را مرتب کردید. متغیر ticket اکنون تغییر کرده است. +متوجه شدید که متد _sort!_ با یک علامت تعجب بزرگ در انتها دارد؟ +خیلی وقت‌ها متدهای روبی این‌طور فریاد می‌زنند اگر قرار باشد متغیر را برای همیشه تغییر دهند. +چیز خاصی نیست، فقط یک نشانه است. From 3e21c85ddb3821bd1f6af5eaf4a40c873b47fa90 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:21 +0330 Subject: [PATCH 16/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_170.md | 34 ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 translations/fa-IR/try_ruby_170.md diff --git a/translations/fa-IR/try_ruby_170.md b/translations/fa-IR/try_ruby_170.md new file mode 100644 index 0000000..69627a6 --- /dev/null +++ b/translations/fa-IR/try_ruby_170.md @@ -0,0 +1,34 @@ +--- +lang: FA-IR +title: عنصر +answer: ^(12|35|47)$ +load: ticket = [12, 47, 35] +ok: خوبه +error: تقریبا +--- + +پس ما شماره‌های بخت‌آزمایی‌مان را داخل متغیر ticket ذخیره کردیم. چطور دوباره آن‌ها را بیرون بیاوریم؟ + +قبلاً دیدیم که می‌توانیم بزرگ‌ترین عدد را با __max__ بگیریم. به‌طور مشابه می‌توانید +اولین یا آخرین عنصر لیست را بگیرید. +اما اگر بخواهید یک عنصر مشخص را بگیرید چه؟ + +### [ ] +روبی از کروشه‌ها [ ] برای هدف‌گیری یک عنصر استفاده می‌کند. +کروشه‌ها در روبی بسیار رایج هستند. +آن‌ها مثل نشانه‌گیری برای هدف هستند. دقیقاً، +این کروشه‌ها یعنی: «من دنبال ____ هستم» آماده، هدف. + +بیایید همهٔ شماره‌های بخت‌آزمایی‌مان را بگیریم: + + puts ticket[0] + puts ticket[1] + puts ticket[2] + +چرا از [0]، [1]، [2] استفاده می‌کنیم؟ + +و نه [1]، [2] و [3]؟ آیا این نوعی ذِن ژاپنی است؟ +نه، ما آدم‌های رایانه‌ای فقط دوست داریم شمارش را از صفر شروع کنیم. این فقط مربوط به روبی نیست، +این _ایندکس‌گذاری از صفر_ در بیشتر زبان‌های برنامه‌نویسی استفاده می‌شود. + +> یک یادآوری کوچک: می‌توانید از دکمهٔ __Copy__ برای رونوشت کردن کد نمونه در ویرایشگر استفاده کنید. From 48e48576814ef934412987ef86ed23d15f63a3fd Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:25 +0330 Subject: [PATCH 17/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_180.md | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 translations/fa-IR/try_ruby_180.md diff --git a/translations/fa-IR/try_ruby_180.md b/translations/fa-IR/try_ruby_180.md new file mode 100644 index 0000000..952d488 --- /dev/null +++ b/translations/fa-IR/try_ruby_180.md @@ -0,0 +1,31 @@ +--- +lang: FA-IR +title: خلاصهٔ شماره ۲ فرا رسیده است +answer: \w+ +class: stretcher chapmark +load: poem = "نان تُستم تا ماه پر کشید،\nاما وقتی از قاب تلویزیون دیدمش،\nکه روی دُمِ دنباله‌دارِ هالی\nپرچم‌مان را می‌کارد،\nدلم بیشتر خواست همان جا\nیک لقمه از آن بزنم!\n" +ok: قافیه داشت؟ +error: +--- + +حالا ببینید دومین دقیقه‌تان چگونه گذشت: + +### خطاها +اگر سعی کنید یک عدد را وارونه کنید یا کاری مشکوک انجام دهید، روبی به شما خواهد گفت. + +### آرایه‌ها +آرایه‌ها لیست‌هایی برای ذخیرهٔ چیزها به ترتیب مشخص هستند. +ما همچنین می‌دانیم چگونه آرایه‌ها را بسازیم و آیتم‌ها را از آن‌ها بگیریم. + +### متغیرها +متغیرها چیزی را ذخیره می‌کنند و به آن نام می‌دهند. شما از علامت مساوی برای این کار استفاده کردید. مانند: +ticket = [14, 37, 18]. + +### ۲٫۸ +در مجموع هشت بخش وجود دارد. شما دو هشتم راه را آمدید! این چیزهای ساده‌ای هستند، +فکر نمی‌کنید؟ چیزهای خوبی در پیش است. + +بیایید برای لحظه‌ای جهت را تغییر دهیم. من کمی شعر برایتان داخل یک متغیر گذاشته‌ام. +نگاهی بیندازید. تایپ کنید: + + puts poem From 02d3db598f79e9c92cf452bf364baabffe27391f Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:29 +0330 Subject: [PATCH 18/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_190.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 translations/fa-IR/try_ruby_190.md diff --git a/translations/fa-IR/try_ruby_190.md b/translations/fa-IR/try_ruby_190.md new file mode 100644 index 0000000..a9f78d7 --- /dev/null +++ b/translations/fa-IR/try_ruby_190.md @@ -0,0 +1,15 @@ +--- +lang: FA +title: متاسفانه، از شعر نان تست خوشتان نیامد +answer: (toast){0} +load: prev +ok: عالی +error: هنوز برای من بوی نان تست می‌دهد +--- + +ببین، اشکالی ندارد. لازم نیست آن را دوست داشته باشی. آن را دستکاری کن، اختیار با توست. به‌جای نان تست، برو سراغ یک خربزه یا چیزی شبیه آن. این را امتحان کن تا شعر جدید را ببینی: + + poem.gsub("نان تُستم", "طالبیِ شیرینم") + +متد **gsub** کوتاه‌شدهٔ global substitute است. این متد همهٔ موارد «نان تُستم» را با +«طالبیِ شیرینم» جایگزین می‌کند. From d17427d5efb27eb4e8980f5dd9728287f80783e5 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:36 +0330 Subject: [PATCH 19/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_200.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 translations/fa-IR/try_ruby_200.md diff --git a/translations/fa-IR/try_ruby_200.md b/translations/fa-IR/try_ruby_200.md new file mode 100644 index 0000000..cfd3933 --- /dev/null +++ b/translations/fa-IR/try_ruby_200.md @@ -0,0 +1,12 @@ +--- +lang: FA-IR +title: آماده، هدف +answer: دیشک رپ هام ات متسُت نان +load: prev +ok: خوبه، کل شعر وارونه شد. +error: +--- + +اینجا یک سوال پیش میاد: چه اتفاقی می‌افته وقتی کل این شعر را وارونه کنیم؟ + + poem.reverse From 813262e317b290be8fa3de08e86c131e79c1c1a7 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:44 +0330 Subject: [PATCH 20/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_210.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 translations/fa-IR/try_ruby_210.md diff --git a/translations/fa-IR/try_ruby_210.md b/translations/fa-IR/try_ruby_210.md new file mode 100644 index 0000000..5fd6359 --- /dev/null +++ b/translations/fa-IR/try_ruby_210.md @@ -0,0 +1,17 @@ +--- +lang: FA-IR +title: وارونگی بیش از حد +answer: ^\["More still did (.+) +load: prev +ok: بله، تقریبا همان چیزی که می‌خواستیم +error: +--- + +پس کل شعر، حرف‌به‌حرف وارونه شده است. من واقعا فقط می‌خواستم خطوط را وارونه کنم. +خط آخر را به بالا بیاوریم و خط اول را به پایین ببرم. + +وارونه، اما نه __این مدل__ وارونه. + +این‌طور است: + + poem.lines.reverse From 76118b348b285035aeae01a1dd2d2195dd6136f5 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:15:56 +0330 Subject: [PATCH 21/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_110.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 translations/fa-IR/try_ruby_110.md diff --git a/translations/fa-IR/try_ruby_110.md b/translations/fa-IR/try_ruby_110.md new file mode 100644 index 0000000..e181fa7 --- /dev/null +++ b/translations/fa-IR/try_ruby_110.md @@ -0,0 +1,22 @@ +--- +lang: FA-IR +title: سیب‌ها با پرتقال‌ها فرق دارند +answer: \[\] +ok: عالیه، این یک لیست خالی است +error: +--- + +و اعداد با رشته‌ها متفاوت هستند. + +در حالی که می‌توانید از متدها روی هر شی در روبی استفاده کنید، برخی متدها فقط روی انواع خاصی کار می‌کنند. +اما همیشه می‌توانید بین انواع مختلف با استفاده از متدهای "to" در روبی تبدیل کنید. + +- __to_s__ چیزها را به __رشته__ تبدیل می‌کند +- __to_i__ چیزها را به __عدد صحیح__ (اعداد) تبدیل می‌کند +- __to_a__ چیزها را به __آرایه__ تبدیل می‌کند + +__آرایه‌ها چی هستند؟!__ + +آن‌ها لیست هستند. یک جفت براکت تایپ کنید: + + [] From 8f396e9fc21c97939dff9a29872f18a295e16088 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:25 +0330 Subject: [PATCH 22/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_220.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 translations/fa-IR/try_ruby_220.md diff --git a/translations/fa-IR/try_ruby_220.md b/translations/fa-IR/try_ruby_220.md new file mode 100644 index 0000000..2a0d39d --- /dev/null +++ b/translations/fa-IR/try_ruby_220.md @@ -0,0 +1,21 @@ +--- +lang: FA-IR +title: حلقه‌های متدهای زنجیره‌ای +answer: نان تُستم تا ماه پر کشید +load: prev +ok: نمایش خوبی بود، دوست من!
متد join آن آرایهٔ خطوط را گرفت و آن‌ها را در یک رشته کنار هم گذاشت. +error: +--- + +خب چه می‌بینید؟ چه اتفاقی افتاد؟ شما __poem.lines.reverse__ را تایپ کردید و چه شد؟ + +دو اتفاق افتاد. شما شعر را با استفاده از lines به یک لیست تبدیل کردید. +lines تصمیم می‌گیرد رشته چگونه تقسیم شود و آن را به یک آرایه تبدیل می‌کند. + +سپس، آن لیست را وارونه کردید. شما هر خط را داشتید. آن‌ها را وارونه کردید. همین. + +بیایید یک متد دیگر هم به انتهای آن اضافه کنیم: + + puts poem.lines.reverse.join + +ترکیب کردن متدها به این شکل _method chaining_ نامیده می‌شود. \ No newline at end of file From ac614d90ea34959fbb58219bcc49015a575d9826 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:34 +0330 Subject: [PATCH 23/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_230.md | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 translations/fa-IR/try_ruby_230.md diff --git a/translations/fa-IR/try_ruby_230.md b/translations/fa-IR/try_ruby_230.md new file mode 100644 index 0000000..27d9eda --- /dev/null +++ b/translations/fa-IR/try_ruby_230.md @@ -0,0 +1,31 @@ +--- +lang: FA-IR +title: از میان همهٔ خلاصه‌ها، شماره ۳ اکنون اینجاست +answer: \{\} +class: stretcher chapmark +load: prev +ok: شما یک هش خالی ساخته‌اید! +error: +--- + +### علامت‌های تعجبExclamations +ممکن است متدها در نامشان علامت تعجب (و همچنین علامت سوال) داشته باشند. +این‌ها فقط برای توضیح بهتر عملکردشان هستند. چیز مهمی نیست. + +### دستکاری رشتهString manipulation +جستجو و تغییر رشته‌ها + +### زنجیره‌سازیChaining +زنجیره‌سازی متدها به شما اجازه می‌دهد کارهای بیشتری انجام دهید. یک شعر را بشکنید، وارونه کنید، دوباره سرهم کنید: +__poem.lines.reverse.join__ + +در این مرحله، ممکن است بخواهید کمی بیشتر با شعر کار کنید. فهرست کامل همهٔ متدهای رشته در +اینجا است. + +برو جلو و چند مورد را امتحان کن، مانند: poem.downcase یا poem.swapcase +> چون زبان فارسی مفهوم حروف بزرگ و کوچک ندارد، هیچ تغییری روی آن ایجاد نمی‌شود؛ و اگر رشته ترکیبی باشد فقط روی بخش لاتین اثر می‌گذارد. + +آماده‌اید؟ +وقتی احساس کردید آمادهٔ ادامه هستید، تایپ کنید: + + books = {} From 724ee5f3d0948edcb078fd2bc9cdbd6ae29b4079 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:40 +0330 Subject: [PATCH 24/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_240.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 translations/fa-IR/try_ruby_240.md diff --git a/translations/fa-IR/try_ruby_240.md b/translations/fa-IR/try_ruby_240.md new file mode 100644 index 0000000..2040483 --- /dev/null +++ b/translations/fa-IR/try_ruby_240.md @@ -0,0 +1,25 @@ +--- +lang: FA-IR +title: یک کتابچهٔ کوچک خالی +answer: ^(splendid|quite_good|mediocre|quite_not_good|abysmal)$ +load: books = {} +ok: بله، این یک بررسی جدید است +error: از یکی از splendid، quite_good، mediocre، quite_not_good، abysmal استفاده کن.
یادت نرود از دونقطه استفاده کنی +--- + +شما یک __هش__ خالی ساخته‌اید. هش شبیه آرایه است، فقط هر یک از عناصر آن یک نام دارد. + +می‌خوایم یه سری بررسی کتابچهٔ کوچک را در هش جدیدمان قرار دهیم. سیستم امتیازدهی‌مون هم اینه: + +- :splendid ← یک شاهکار +- :quite\_good ← خوب بود، راضی‌کننده +- :mediocre ← متوسط، هم خوب هم بد +- :quite\_not\_good ← به‌طور قابل توجهی بد +- :abysmal ← افتضاح + +برای امتیاز دادن به یک کتاب، عنوان را داخل کروشه قرار دهید و امتیاز را بعد از مساوی بگذارید. برای مثال: + + books["The Blind Owl"] = :splendid + +> راستی یادت باشه، هر درس TryRuby جدا از هم هستند، پس اگه اینجا کتاب‌ها رو اضافه کردی، فقط تو همین درس می‌تونی ازشون استفاده کنی. اگه می‌خوای تو درس بعدی هم باشه، باید از اینجا بردار و جای دیگه بچسبان. +> نگران این موضوع نباش، هر درس کلی چیز آماده داره که می‌تونی باهاش بازی کنی. From 589eb5399e0d758dbe48a66402b37416da4a7165 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:44 +0330 Subject: [PATCH 25/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_250.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 translations/fa-IR/try_ruby_250.md diff --git a/translations/fa-IR/try_ruby_250.md b/translations/fa-IR/try_ruby_250.md new file mode 100644 index 0000000..ba80530 --- /dev/null +++ b/translations/fa-IR/try_ruby_250.md @@ -0,0 +1,26 @@ +--- +lang: FA-IR +title: بررسی‌های کوچک‌تر بیشتر +answer: [3-9] +load: books = {"The Blind Owl" => :splendid} +ok: ببین، متد length روی رشته‌ها، آرایه‌ها و هش‌ها کار می‌کند. +error: +--- + +ادامه بده و کتاب‌های بیشتری اضافه کن. اگه می‌خوای کل فهرست رو ببینی، فقط تایپ کن: __puts books__ + +باز هم یادآوری: امتیازدهی‌ها این‌ها هستند: :splendid، :quite\_good، :mediocre، :quite\_not\_good و :abysmal. + +این امتیازها رشته نیستند. وقتی یک دونقطهcolon «:» قبل از یک کلمهٔ ساده قرار می‌دهید، یک __symbolنماد__ ساخته می‌شه. +سمبل‌ها از نظر حافظهٔ رایانه سبک‌تر از رشته‌ها هستن. یعنی اگه یه کلمه رو بارها تو برنامه استفاده کنی، رایانه فقط __یه نسخه__ از نماد رو نگه می‌داره، نه هزاران نسخه از رشته‌ی همون کلمه را. + +یه نکته مهم‌تر هم اینه که symbol نشان می‌ده این کلمه فقط یه کلمه معمولی نیست، بلکه یه معنی خاص تو برنامه داره. + +حالا دو بررسی کتاب دیگه اضافه کنید، از __books.length__ استفاده کنید تا ببینید چند بررسی در هش وجود دارد: + + books["The deep end"] = :abysmal + books["Living colors"] = :mediocre + + puts books + + puts books.length From 51dda1bc3d804878bf08461f048b7d289de7bef3 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:48 +0330 Subject: [PATCH 26/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_260.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 translations/fa-IR/try_ruby_260.md diff --git a/translations/fa-IR/try_ruby_260.md b/translations/fa-IR/try_ruby_260.md new file mode 100644 index 0000000..ac91690 --- /dev/null +++ b/translations/fa-IR/try_ruby_260.md @@ -0,0 +1,20 @@ +--- +lang: FA-IR +title: وایسا، کتاب بوف کور را دوست داشتی؟ +answer: ^(splendid|quite_good|mediocre|quite_not_good|abysmal)$ +load: books = {"The Blind Owl" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre} +ok: خیلی این را دوست دارم +error: +--- + +یکی از چیزای خوب روبی اینه که اسم‌ها رو می‌تونی بارها استفاده کنی، یعنی لازم نیست هزار تا اسم مختلف یادت بمونه. + +یادت هست چطور از آرایه با شماره آیتم‌ها را بازیابی کردیم: +__puts ticket[1]__. + +برای هش این همان‌طور کار می‌کند، با این تفاوت که ما از شماره برای گرفتن یک عنصر استفاده نمی‌کنیم بلکه از اسم استفاده می‌کنیم. + +پس اگه بخوای یه بررسی قدیمی‌ت رو دوباره ببینی، کافیه اسم کتاب رو تو کروشه بذاری، بدون اینکه مساوی بذاری. مثل این: +دقیقا مثل این: + + puts books["The Blind Owl"] From 4bb8d14b848a95d245c4b634eb98b8ca388f569d Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:53 +0330 Subject: [PATCH 27/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_270.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 translations/fa-IR/try_ruby_270.md diff --git a/translations/fa-IR/try_ruby_270.md b/translations/fa-IR/try_ruby_270.md new file mode 100644 index 0000000..eed14a0 --- /dev/null +++ b/translations/fa-IR/try_ruby_270.md @@ -0,0 +1,18 @@ +--- +lang: FA-IR +title: هش‌ها به‌عنوان جفت‌ها +answer: ^\[".*"\] +load: prev +ok: کلیدها را پیدا کردی +error: +--- + +به یاد داشته باش که هش‌ها ترتیب آیتم‌ها را حفظ نمی‌کنن. این کار وظیفه‌شون نیست. هش فقط دو چیز رو به هم جفت می‌کنه: یک __keyکلید__ و یک __valueمقدار__. + +تو بررسی‌هات، عنوان کتاب کلید است و امتیازش مقدار. + +اگه فقط بخوای عنوان همه کتاب‌هایی که بررسی کردی رو ببینی، می‌تونی اینو اجرا کنی: + + books.keys + +همچنین می‌تونی به جای .keys از .values استفاده کنی تا فقط مقدارها (امتیازها) رو ببینی. \ No newline at end of file From 4b2fe26c3edcebac326af995f5ba9fb4337278fa Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:16:57 +0330 Subject: [PATCH 28/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_280.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 translations/fa-IR/try_ruby_280.md diff --git a/translations/fa-IR/try_ruby_280.md b/translations/fa-IR/try_ruby_280.md new file mode 100644 index 0000000..11afff2 --- /dev/null +++ b/translations/fa-IR/try_ruby_280.md @@ -0,0 +1,26 @@ +--- +lang: FA-IR +title: آیا سختگیر هستی؟ +answer: :mediocre|mediocre: +load: books = {"The Blind Owl" => :splendid, "The deep end" => :abysmal, "Living colors" => :mediocre, "Bumblebees" => :mediocre} +ok: عالی، وای! تو یه کارنامهٔ امتیازدهی از بررسی‌هایت ساخته‌ای +error: +--- + +خب، آیا داری نظرهای سخت‌گیرانه و ناعادلانه می‌دی؟ بیا با یه هش جدید به نام __ratings__، امتیازها رو بشماریم: + +حالا بریم تعداد بررسی‌هامون رو حساب کنیم. فقط با من همراه باش. تایپ کن: + + ratings = Hash.new {0} + + books.values.each { |rate| + ratings[rate] += 1 + } + + puts ratings + +خط عمودی توی کد همان نویسه pipe است، احتمالا درست بالای کلید Enter روی صفحه‌کلیدت قرار دارد. + +آن خط _+= 1_ یعنی: مقدار را یک واحد افزایش بده. + +نگران نباش اگر همهٔ چیزهایی که اینجا اتفاق می‌افتد را نمی‌فهمی، بعداً توضیح داده خواهد شد. From 0fd71dda035c1c5867fb10d4ff43829284ea9fed Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:02 +0330 Subject: [PATCH 29/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_290.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 translations/fa-IR/try_ruby_290.md diff --git a/translations/fa-IR/try_ruby_290.md b/translations/fa-IR/try_ruby_290.md new file mode 100644 index 0000000..faaeb7b --- /dev/null +++ b/translations/fa-IR/try_ruby_290.md @@ -0,0 +1,15 @@ +--- +lang: FA-IR +title: شمارش +answer: \w+ +ok: جیغ شادی! +error: +--- + +یکی از چیزای جالبی که تازه استفاده کردیم __block__ است. ما قراره تو این درس و درس بعدی بیشتر باهاش آشنا بشیم. ولی به طور ساده، بلوک یک تکه کد روبی است که بین آکولاد قرار می‌گیره. + +بیاید یه مثال دیگه از بلوک رو امتحان کنیم: + + 5.times { print "Horaa! " } + +بلوک‌ها همیشه به متدها وصل هستن. مثل متد __times__، که بلوک رو می‌گیره و کد داخلش رو چند بار اجرا می‌کنه. (تو مثال ما: پنج بار.) \ No newline at end of file From efa71bda71824c8c718018bad721b59cc45fadc9 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:08 +0330 Subject: [PATCH 30/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_300.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 translations/fa-IR/try_ruby_300.md diff --git a/translations/fa-IR/try_ruby_300.md b/translations/fa-IR/try_ruby_300.md new file mode 100644 index 0000000..4402093 --- /dev/null +++ b/translations/fa-IR/try_ruby_300.md @@ -0,0 +1,21 @@ +--- +lang: FA-IR +title: وقت داری؟ +answer: ^[0-9]$ +ok: زمان‌بندی‌ات دقیق بود! +error: بلوک را ۰ تا ۹ بار اجرا کن +--- + +همونطور که تو مثال اول با بلوک (وقتی امتیازها رو شمردیم) دیدیم، می‌تونیم یک مقدار به بلوک منتقل کنیم؛ اینکه چه مقادیری __ارسال بشن__ بستگی به متدی داره که بلوک رو اجرا می‌کنه. + +مقادیر __دریافت شده__ توسط بلوک در نام متغیر ابتدای بلوک قرار می‌گیرد، بین دو خط عمودیpipe «|» نوشته می‌شن. + +بیایید این را با این بلوک امتحان کنیم: + + 5.times { |time| + puts time + } + +اینجا، متد __.times__ یک مقدار را به متغیر __|time|__ می‌فرسته. ولی یادت باشه که متغیر time فقط داخل همون بلوک شناخته می‌شه و بیرون بلوک قابل استفاده نیست. + +> توجه کردی که می‌تونی کد رو توی چند خط بنویسی؟ این کار خوندنش رو راحت‌تر می‌کنه. From e3f8dbc3d96a0fcc595adcd14971fd7037880bf2 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:29 +0330 Subject: [PATCH 31/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_310.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 translations/fa-IR/try_ruby_310.md diff --git a/translations/fa-IR/try_ruby_310.md b/translations/fa-IR/try_ruby_310.md new file mode 100644 index 0000000..e6de45a --- /dev/null +++ b/translations/fa-IR/try_ruby_310.md @@ -0,0 +1,24 @@ +--- +lang: FA-IR +title: الان به خلاصهٔ شماره ۴ رسیدیم +answer: +class: stretcher chapmark +ok: +error: +--- + +این درس آخری یه کم طولانی‌تر بود. احتمالاً حدود سه دقیقه صرف یادگیری دربارهٔ این موارد کردی: + +### هش‌هاHashes +یه جور واژه‌نامه کوچولو با صفحه‌های آکولادی، که با این نشونه ساخته می‌شه: __{}__ + +### سمبل‌هاSymbols +کلمه‌های کوچیک، سبک و به‌صرفه که با دونقطه شروع می‌شن، مثل: __:splendid__ + +### بلوک‌هاBlocks +تکه‌کدهایی که می‌تونن به خیلی از متدهای روبی وصل بشن؛ این هم همون کدی که باهاش جدول امتیازها رو ساختی: + +__books.values.each { |rate| ratings[rate] += 1 }__ + +### قدم بعدی +تو درس بعدی قراره کمی عمیق‌تر بریم سراغ متدها و ببینیم دقیقاً چطور کار می‌کنن. From 795e44008eeb38e294107abf777c681c31a536f9 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:40 +0330 Subject: [PATCH 32/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_320.md | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 translations/fa-IR/try_ruby_320.md diff --git a/translations/fa-IR/try_ruby_320.md b/translations/fa-IR/try_ruby_320.md new file mode 100644 index 0000000..9ec1746 --- /dev/null +++ b/translations/fa-IR/try_ruby_320.md @@ -0,0 +1,36 @@ +--- +lang: FA-IR +title: بودن یا نبودن +answer: +load: poem = "نان تُستم تا ماه پر کشید،\nاما وقتی از قاب تلویزیون دیدمش،\nو از این حرفا…\n" +ok: +error: +--- + +یه نکته‌ی کوچولوی دیگه هست که هنوز درست و حسابی دربارش حرف نزدیم: آرگومان‌های متدmethod arguments. +یادت هست وقتی شعر رو یه کم تغییر دادیم؟ این کد رو استفاده کردیم: + +__poem.gsub("نان تُستم", "طالبیِ شیرینم")__ + +متد gsub به دو تا آرگومان نیاز داره، که ما اون‌ها رو با گذاشتن دو رشته داخل پرانتز به gsub پاس دادیم. +به طور خلاصه، _آرگومان‌ها به متد می‌گن دقیقاً باید چه کاری انجام بده._ + +### پرانتزهاParentheses +در واقع بیشتر وقت‌ها روبی اصلا حساس نیست که پرانتز بذاری یا نه؛ یعنی این کد هم کاملا کار می‌کنه: + +__poem.gsub "نان تُستم", "طالبیِ شیرینم"__ + +ما قبلا هم از یه متد دیگه با پارامتر استفاده کردیم؛ حتی خیلی وقت‌ها، فقط خیلی به چشم نیومده: + + puts "Hello" + puts("Hello") + +آره __puts__ هم یک متد است. برای روبی فرقی نمی‌کنه که puts رو با پرانتز بنویسی یا بدون پرانتز، ولی نسخه‌ی بدون پرانتز خوندنش راحت‌تره و کلی هم توی تایپ کردن صرفه‌جویی می‌کنه! + +> خلاصه‌اش اینه: هر کاری دلت می‌خواد با پرانتزها بکن، فقط طوری بنویس که کدت تمیز و خوانا باشه. + +### بودن یا نبودن «to (be) or not to (be)» +حالا که می‌دونیم _to_ یه متده و _be_ یه آرگومان، جواب این سؤال قدیمی هم معلوم شد! +در نهایت، فقط یه سلیقه شخصیه که بنویسی _to be_ یا _to(be)_. + +حال و هوای شکسپیری داری؟ پس ادامه بده بخون. From b43e10754c2fedb00de3cfb1d82f8afc1a79b3b0 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:46 +0330 Subject: [PATCH 33/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_330.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 translations/fa-IR/try_ruby_330.md diff --git a/translations/fa-IR/try_ruby_330.md b/translations/fa-IR/try_ruby_330.md new file mode 100644 index 0000000..b256a5e --- /dev/null +++ b/translations/fa-IR/try_ruby_330.md @@ -0,0 +1,32 @@ +--- +lang: FA-IR +title: رام کردن زن سرکش +answer: ^tame +ok: خوبه خوبه! +error: +--- + +خب، الان دیگه تقریباً بلدی با روبی کار کنی. یعنی اصول اولیه رو کاملا یاد گرفتی. +فقط کافیه متدهای بیشتری یاد بگیری و با بلوک‌های پیچیده‌تر تمرین کنی. + +اما یه بخش مهم از روبی مونده که هنوز سراغش نرفتیم: ساختن متدهای خودمون. +__ممم!__ بیایید همین حالا سراغش برویم. + +در کنار استفاده از متدهای داخلی روبی (مانند puts، sort، times) می‌تونی متدهای خودت را تعریف کنی. +این کار چرا خوبه؟ دو تا دلیل مهم داره: + +### کوتاه‌تر شدن برنامه +اگه یه کاری رو قراره تو چند جای کدت تکرار کنی، خیلی بهتره اون کد رو بذاری تو یه متد جدا؛ +این‌طوری کدت هم تمیزتر می‌شه هم کوتاه‌تر. + +### خواناتر شدن کد +فرض کن برنامه‌ات کلی کار مختلف انجام می‌ده؛ +__می‌تونی__ همه‌ی کدها رو بریزی تو یه تیکه کد بلندبالا، ولی بعداً خوندنش و فهمیدنش عذاب می‌شه. + +به‌جاش، بهتره کدت رو به چند تا متد کوچیک تقسیم کنی و برای هر کدوم یه اسم انگلیسی ساده و قابل فهم بذاری. +بعداً خودت از خودت تشکر می‌کنی... + +خب حالا متد رو چطوری تعریف می‌کنیم؟ این‌طوری: + + def tame( number_of_shrews ) + end From 48b5966b7e7f3475d868edc17b7be051a8828cab Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:50 +0330 Subject: [PATCH 34/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_340.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 translations/fa-IR/try_ruby_340.md diff --git a/translations/fa-IR/try_ruby_340.md b/translations/fa-IR/try_ruby_340.md new file mode 100644 index 0000000..1322570 --- /dev/null +++ b/translations/fa-IR/try_ruby_340.md @@ -0,0 +1,27 @@ +--- +lang: FA-IR +title: تو روبی، def یعنی «شروع کن به تعریف متد»؛ حالا اسمش هر چی باشه، مثلا Leppard +answer: ^tame +ok: ایول، کارت درسته +error: +--- + +خب، آفرین! انجامش دادی، داری متد خودت رو می‌سازی. +با def شروع کردی، بعد اسم متد رو نوشتی، و بعدش هم لیست آرگومان‌هایی که متد بهشون نیاز داره. +دیدی؟ اصلا ترسناک و خطرناک نبود! +کاری که مونده اینه که داخلش کد روبی بنویسیم و آخرش با end تمومش کنیم. + +این هم کدش: + + def tame( number_of_shrews ) + number_of_shrews.times { + puts "Tamed a shrew" + } + end + +> __پ.ن:__ +> اگه عنوان این بخش رو متوجه نشدی: +> Def Leppard +> اسم یه گروه راک انگلیسیه که یه زمانی خیلی معروف بوده. +> اینجا یه بازی زبانی کرده: +> def تو روبی یعنی «تعریف کن» و Leppard هم اسم اون گروهه From 446991e16e1c27e9fa6a7094d8807f2436ea9266 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:54 +0330 Subject: [PATCH 35/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_350.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 translations/fa-IR/try_ruby_350.md diff --git a/translations/fa-IR/try_ruby_350.md b/translations/fa-IR/try_ruby_350.md new file mode 100644 index 0000000..36090e5 --- /dev/null +++ b/translations/fa-IR/try_ruby_350.md @@ -0,0 +1,23 @@ +--- +lang: FA-IR +title: میوهٔ رسیدهٔ دست‌پخت خودت +answer: ^Tamed a shrew +ok: این به اون زن‌های سرکش نشان خواهد داد +error: +load: def tame(number_of_shrews);number_of_shrews.times{puts "Tamed a shrew"};end; +--- + +خب، یه متد جدید به دنیا اومد، حالا وقتشه ازش استفاده کنیم. + +کافیه اینو بنویسی: + + tame 5 + +یعنی چی؟ +یعنی متدی که خودت ساختی (tame) رو صدا می‌زنی و بهش می‌گی ۵ بار اجرا شو. +هر بار هم میاد و این پیام رو چاپ می‌کنه: + +Tamed a shrew + +خلاصه اینکه الان دیگه فقط استفاده‌کنندهٔ متدها نیستی؛ +خودت سازندهٔ متد شدی. \ No newline at end of file From 199d899e01ddbf83d7886c9a2018db7c15cfdbc2 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:17:59 +0330 Subject: [PATCH 36/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_360.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 translations/fa-IR/try_ruby_360.md diff --git a/translations/fa-IR/try_ruby_360.md b/translations/fa-IR/try_ruby_360.md new file mode 100644 index 0000000..019561c --- /dev/null +++ b/translations/fa-IR/try_ruby_360.md @@ -0,0 +1,29 @@ +--- +lang: FA-IR +title: بده و بستان +answer: \d+ +ok: درسته، آفرین. +error: +--- + +بیشتر متدها فقط ورودی نمی‌گیرن، بلکه یه چیزی هم __برمی‌گردونن__. +من متدمون رو یه کم تغییر دادم تا آخرش یه مقدار بهت برگردونه. امتحانش کن: + + def tame( number_of_shrews ) + number_of_shrews.times { + puts "Tamed a shrew" + } + return number_of_shrews + end + + puts tame(3) + +### Returnمقدار بازگشتی +حالا که حسابی پیشرفت کردی، یه نکته‌ی باحال دیگه هم بدون: +تو روبی لازم نیست حتما کلمه‌ی __return__ رو بنویسی، +روبی خودش آخرین مقداری که داخل متد استفاده شده رو به‌صورت خودکار برمی‌گردونه. + +پس می‌تونیم خط آخر متد رو این‌طوری ساده کنیم: __number\_of\_shrews__. + +اما یه نکتهٔ جالب‌تر! متد __.times__ خودش هم مقدار _number\_of\_shrews_ رو برمی‌گردونه، پس عملا می‌تونیم کل خط آخر رو حذف کنیم. +یعنی در واقع، همون متدی که از اول نوشته بودیم، از همون اول دقیقا کاری که می‌خواستیم رو انجام می‌داد! From 435fe6c10dab6a712b2a2c3850d0b8ad8e42fff6 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:02 +0330 Subject: [PATCH 37/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_370.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 translations/fa-IR/try_ruby_370.md diff --git a/translations/fa-IR/try_ruby_370.md b/translations/fa-IR/try_ruby_370.md new file mode 100644 index 0000000..575fc18 --- /dev/null +++ b/translations/fa-IR/try_ruby_370.md @@ -0,0 +1,27 @@ +--- +lang: FA-IR +title: سلام، کسی اونجاس؟ و خلاصهٔ شماره ۵ کلاهش رو تکان می‌ده! +answer: +class: stretcher chapmark +ok: +error: +--- + +آفرین، آفرین، آفرین، آفرین! + +واقعا، واقعا، واقعا، واقعا، واااااااقعا! + +بیاید چند دقیقه آخر یادگیری‌ت رو مرور کنیم: + +### متدهاMethods +متدها با __def__ تعریف می‌شن و یه اسم دارن، +متدها باعث می‌شن برنامه‌ت کوتاه‌تر و خوندنش راحت‌تر بشه. + +### پارامترهاParameters +متدها می‌تونن پارامتر داشته باشن، یعنی ورودی‌هایی که بهشون می‌دیم. + +### مقادیر بازگشتیReturn values +متدها (تقریبا) همیشه یه مقدار برمی‌گردونن. + +## حالا +سوال «بودن یا نبودن» دیگه برای تو سوال نیست! آماده‌ای که یه کم دیگه با شکسپیر حال کنیم؟ From bd217b986e5fb2fdd312c95d882372126851bb49 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:08 +0330 Subject: [PATCH 38/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_380.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 translations/fa-IR/try_ruby_380.md diff --git a/translations/fa-IR/try_ruby_380.md b/translations/fa-IR/try_ruby_380.md new file mode 100644 index 0000000..e75f95f --- /dev/null +++ b/translations/fa-IR/try_ruby_380.md @@ -0,0 +1,26 @@ +--- +lang: FA-IR +title: جهان صدف ماست +answer: ^\{\"William +ok: خوب. کمی سخته برای خوندن. +error: +load: def get_shakey; {"William Shakespeare"=>{"1"=>{"title"=>"The Two Gentlemen of Verona", "finished"=>1591},"2"=>{"title"=>"The Taming of the Shrew", "finished"=>1591},"3"=>{"title"=>"Henry VI, Part 2", "finished"=>1591},"4"=>{"title"=>"Henry VI, Part 3", "finished"=>1591},"5"=>{"title"=>"Henry VI, Part 1", "finished"=>1592},"6"=>{"title"=>"Titus Andronicus", "finished"=>1592},"7"=>{"title"=>"Richard III", "finished"=>1593},"8"=>{"title"=>"Edward III", "finished"=>1593},"9"=>{"title"=>"The Comedy of Errors", "finished"=>1594},"10"=>{"title"=>"Love's Labour's Lost", "finished"=>1595},"11"=>{"title"=>"Love's Labour's Won", "finished"=>1596},"12"=>{"title"=>"Richard II", "finished"=>1595},"13"=>{"title"=>"Romeo and Juliet", "finished"=>1595},"14"=>{"title"=>"A Midsummer Night's Dream", "finished"=>1595},"15"=>{"title"=>"King John", "finished"=>1596},"16"=>{"title"=>"The Merchant of Venice", "finished"=>1597},"17"=>{"title"=>"Henry IV, Part 1", "finished"=>1597},"18"=>{"title"=>"The Merry Wives of Windsor", "finished"=>1597},"19"=>{"title"=>"Henry IV, Part 2", "finished"=>1598},"20"=>{"title"=>"Much Ado About Nothing", "finished"=>1599},"21"=>{"title"=>"Henry V", "finished"=>1599},"22"=>{"title"=>"Julius Caesar", "finished"=>1599},"23"=>{"title"=>"As You Like It", "finished"=>1600},"24"=>{"title"=>"Hamlet", "finished"=>1601},"25"=>{"title"=>"Twelfth Night", "finished"=>1601},"26"=>{"title"=>"Troilus and Cressida", "finished"=>1602},"27"=>{"title"=>"Sir Thomas More", "finished"=>1604},"28"=>{"title"=>"Measure for Measure", "finished"=>1604},"29"=>{"title"=>"Othello", "finished"=>1604},"30"=>{"title"=>"All's Well That Ends Well", "finished"=>1605},"31"=>{"title"=>"King Lear", "finished"=>1606},"32"=>{"title"=>"Timon of Athens", "finished"=>1606},"33"=>{"title"=>"Macbeth", "finished"=>1606},"34"=>{"title"=>"Antony and Cleopatra", "finished"=>1606},"35"=>{"title"=>"Pericles, Prince of Tyre", "finished"=>1608},"36"=>{"title"=>"Coriolanus", "finished"=>1608},"37"=>{"title"=>"The Winter's Tale", "finished"=>1611},"38"=>{"title"=>"Cymbeline", "finished"=>1610},"39"=>{"title"=>"The Tempest", "finished"=>1611},"40"=>{"title"=>"Cardenio", "finished"=>1613},"41"=>{"title"=>"Henry VIII", "finished"=>1613},"42"=>{"title"=>"The Two Noble Kinsmen", "finished"=>1614}}}; end; +--- + +تا حالا برنامه‌هایی که اجرا کردیم، فقط از چیزایی استفاده می‌کردن که خودمون تایپ کرده بودیم. +این خیلی خوبه، منظورم اینه که اون _Odelay_ خیلی باحال بود، ولی خب الان عصر اینترنته و وقتشه که بقیه دنیا رو هم تو برنامه‌نویسی‌مون وارد کنیم. + +کلی وبگاه وجود داره که می‌تونی ازشون اطلاعات بگیری. مثلا این پیوند همهٔ خبرهای تازه گوگل درباره روبی رو برات میاره: خوراک‌های خبری گوگل + +مرورگر وب تو احتمالا این اطلاعات رو به شکل قابل خوندنی نشون می‌ده. ولی اگه سورس‌ش رو ببینی (کلید میانبر در صفحه کلید Ctrl+U)، یه رشته طولانی از متن‌های عجیب و غریب می‌بینی. تو مثال گوگل، این داده‌ها با فرمت __rss__ هستن. + +### فرمت‌ها +فرمت‌های دیگه هم هستن که روی وب استفاده می‌شن و اسماشون یه کم عجیبن، مثل: +html، xml و json. بله، حتی همین وبگاه هم از چند تا از این فرمت‌ها استفاده می‌کنه. + +من یه متد آماده برات درست کردم که می‌تونه فهرست کامل آثار ویلیام شکسپیر رو از اینترنت بیاره. +(نگران نباش، این اطلاعات از همون سروری میاد که وبگاه ما روش اجرا می‌شه، پس کسی اذیت نمی‌شه) + +برای گرفتن اطلاعات، اینو اجرا کن: + + get_shakey From 0a5370aedb3e3ce6576cf8799c7603307aeceec4 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:15 +0330 Subject: [PATCH 39/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_390.md | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 translations/fa-IR/try_ruby_390.md diff --git a/translations/fa-IR/try_ruby_390.md b/translations/fa-IR/try_ruby_390.md new file mode 100644 index 0000000..72869c2 --- /dev/null +++ b/translations/fa-IR/try_ruby_390.md @@ -0,0 +1,51 @@ +--- +lang: FA-IR +title: خویشاوندان نجیب +answer: ^The Two Noble Kinsmen$ +ok: خیلی بهتر شد +error: +load: prev +--- + +خب، الان یه فهرست از نمایشنامه‌ها از اینترنت داریم. این فهرست در فرمت json بود. +خوشبختانه روبی یه متد داره که json رو به هَش روبی تبدیل می‌کنه. متد _get\_shakey_ این کار رو برامون انجام داده. + +اما چون ساختار داده‌های json تو هَش حفظ شده، هنوز کمی خوندنش سخت به نظر میاد. +بیاید یه متد بسازیم که نمایشنامه‌ها رو به شکل مرتب و قابل خوندن نشون بده. + +اگه فهرست نمایشنامه‌ها رو دقیق نگاه کنی، می‌بینی که یه جور ساختار تو در توnested داره. +(این خیلی رایجه برای داده‌هایی که از اینترنت می‌گیری.) +مثال ساختارش شبیه اینه: + +
    +
  • "William Shakespeare" +
      +
    • "1" +
        +
      • "title": "The Two Gentlemen of Verona"
      • +
      • "finished": 1591
      • +
      +
    • +
    • "2" +
        +
      • "title": "The Taming of the Shrew"
      • +
      • "finished": 1591
      • +
      +
    • +
    • ...
    • +
    +
  • +
+ +برای فهرست کردن نمایشنامه‌ها، اول باید به عنصر بالایی "William Shakespeare" در هَش دسترسی پیدا کنیم. +بعد باید روی هر عنصر پایینی __iterateتکرار__ کنیم. + +روبی یه متد داره به اسم __each__ که برای تکرار استفاده می‌شه. قبلا وقتی سیستم امتیازدهی کتاب‌ها رو ساختیم باهاش آشنا شدیم. + +هر چیزی که متد __each__ برگردونه، به یک بلوک پاس داده می‌شه: + + s = get_shakey + + s["William Shakespeare"].each { |key, val| + puts val["title"] + } From 659c6db14905fb84ba337cd0587a6ac8436580e4 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:20 +0330 Subject: [PATCH 40/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_400.md | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 translations/fa-IR/try_ruby_400.md diff --git a/translations/fa-IR/try_ruby_400.md b/translations/fa-IR/try_ruby_400.md new file mode 100644 index 0000000..92cd43c --- /dev/null +++ b/translations/fa-IR/try_ruby_400.md @@ -0,0 +1,33 @@ +--- +lang: FA-IR +title: همه با هم +answer: ^4$ +ok: بله، شکسپیر در سال ۱۵۹۱ چهار نمایشنامه نوشت +error: اسخ برای سال ۱۵۹۱ باید ۴ باشد +load: prev +--- + +حالا فرض کنیم فقط می‌خوایم اسم‌ها و تعداد نمایشنامه‌هایی که شکسپیر در یه سال مشخص نوشته رو بدونیم. + +روبی به ما اجازه می‌ده که مقادیر دلخواه رو از یک هَش انتخاب کنیم. متد __select__ با کمک یک بلوک مشخص می‌کنه که چه چیزهایی انتخاب بشه و اون‌ها رو برمی‌گردونه. + +بعد می‌تونیم از نتایجی که __select__ برگردونده، مثل قبل با متد __each__ استفاده کنیم، فقط کافیه بعد از بلوک select اضافه‌شون کنیم. این یه نمونه دیگه از زنجیره‌سازی متدهاmethod chainingست که قبلا وقتی شعر رو برعکس کردیم دیدیم. + +من یه متد آماده به اسم __count\_plays__ برات درست کردم. ببین می‌تونی بفهمی شکسپیر در سال __1591__ چند تا نمایشنامه نوشته. امتحان کن: + + def count_plays(year) + s = get_shakey + + s["William Shakespeare"] + .select { |k, v| + v["finished"] == year + }.each { |key, val| + puts val["title"] + }.count + end + + puts count_plays(0) + +توجه کردی که آخر each، متد count رو زنجیره کردمchained؟ این کار باعث می‌شه متد __count\_plays__ یه مقدار بازگشتی داشته باشه. + +اون خط __s = get_shakey__ رو ببین، می‌تونی __["William Shakespeare"].select { |k, v|__ را به آخر get_shakey اضافه کنی (در این حالت نیازی به نقطه نیست). From 60d86aa664a005440ce22b3ecfd1a2580ecf1f90 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:33 +0330 Subject: [PATCH 41/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_410.md | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 translations/fa-IR/try_ruby_410.md diff --git a/translations/fa-IR/try_ruby_410.md b/translations/fa-IR/try_ruby_410.md new file mode 100644 index 0000000..a3d30e5 --- /dev/null +++ b/translations/fa-IR/try_ruby_410.md @@ -0,0 +1,38 @@ +--- +lang: FA-IR +title: نیک آن باشد که انجامش نکوست +answer: نیک آن باشد که انجامش نکوست +ok: True +error: از 1605 به‌عنوان پارامتر دوم استفاده کن +load: prev +--- + +خب، تا این‌جا یه سری اطلاعات از اینترنت گرفتیم، چیزهایی که می‌خواستیم رو ازش انتخاب کردیم و چاپ‌شون کردیم. +حالا چی مونده که بهترش کنیم؟ می‌تونیم خروجی رو قشنگ‌تر چاپ کنیم؛ مثلا سال رو هم کنار اسم نمایشنامه بیاریم و طوری بچینیم که اسم‌ها و سال‌ها مرتب زیر هم قرار بگیرن. + +این یعنی باید چند تا مقدار رو توی یه خط چاپ کنیم. روبی برای این کار یه راه تمیز و باحال داره. مثلا این رو ببین: __puts "Hi, my name is Goudarz"__. +حالا اگه به جای اسم ثابت _Goudarz_ بخوایم مقدار یه متغیر رو بذاریم، چی کار می‌کنیم؟ + +کافیه __Goudarz__ رو با __#{}__ عوض کنیم. وقتی روبی علامت # رو همراه با آکولاد {} ببینه، می‌فهمه که باید مقدار متغیری که داخلش هست رو بذاره اون‌جا. مثلا: __"Hi, my name is \#{name}"__. + +اینجا روبی مقدار متغیر name رو می‌ذاره وسط جمله. + +حالا بیایم کدمون رو یه کم بهتر کنیم + + def print_plays(year_from, year_to) + get_shakey["William Shakespeare"] + .select { |k, v| + year_from <= v["finished"] && + year_to >= v["finished"] + }.each { |k, v| + puts "#{v["title"].ljust(30)} #{v["finished"]}" + } + end + print_plays(1600, 1605) + +من اینجا به عنوان نمایشنامه یه متد __.ljust(30)__ اضافه کردم. این کار باعث می‌شه عنوان نمایشنامه از سمت _چپ تراز_ بشه و حداقل ۳۰ نویسه طول داشته باشه، تا سال‌ها همگی دقیقا زیر هم بیفتن و خروجی تمیزتر بشه. + +ببین می‌تونی خروجی برنامه رو طوری تغییر بدی که این شکلی چاپ بشه: +__1600 -> As You Like It__ + +__«آخرش همه‌چی درست می‌شه»؟__ هنوز تموم نشده، ولی تهش معلومه داریم خیلی نزدیک می‌شیم به پایان داستان! From a1ebc38748864b3fd4b7d176c60d3e13413a55b5 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:38 +0330 Subject: [PATCH 42/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_420.md | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 translations/fa-IR/try_ruby_420.md diff --git a/translations/fa-IR/try_ruby_420.md b/translations/fa-IR/try_ruby_420.md new file mode 100644 index 0000000..05aa6cc --- /dev/null +++ b/translations/fa-IR/try_ruby_420.md @@ -0,0 +1,37 @@ +--- +lang: FA-IR +title: کاش بلد بودم تصمیم بگیرم +answer: +ok: +error: +--- + +تصمیم‌گیری توی زندگی واقعی گاهی واقعا دردسره، ولی خوشبختانه توی برنامه‌نویسی (و مخصوصا روبی) این‌طور نیست روبی تصمیم گرفتن رو خیلی ساده کرده. + +مثلا این کد رو ببین: + + if 1 < 2 + puts "It is true: 1 is less than 2" + end + +اینجا کلمهٔ کلیدی مهم __if__ هست. if یعنی «اگه این شرط درست بود، این کارو انجام بده». جالب اینجاست که if می‌تونه قبل از متد بیاد یا بعد از متد، مثل این: + + puts "It is true: 1 is less than 2" if 1 < 2 + +__If__ یک متد است که یک شرط می‌گیره؛ این شرط می‌تونه هر چیزی باشه، به شرطی که آخرش یکی از این دو تا بشه: __true__ یا __false__ + +چندتا مثال با نتیجه‌شون: + + 5 <= 10 # => true + 'abc' == 'def' # => false + true # => true + 123456 # => true + 0 # => true + nil # => false + 'xyz'.empty? # => false + 'a' > 5 # => error: + # comparison of String with + # Numeric failed + +_عبارت ifif expression_ می‌تونه شکل‌های مختلفی داشته باشه. می‌تونه مقدارهای ثابت را مقایسه کنه (1 < 2)، +متغیرها (a < 1) و مقدار بازگشتی یک متد را ('xyz'.empty?) و هر چیزی که آخرش بشه true یا false، می‌تونه شرط if باشه. From ef28ac3688fc71f52a031f16f82be94e62753915 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:42 +0330 Subject: [PATCH 43/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_430.md | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 translations/fa-IR/try_ruby_430.md diff --git a/translations/fa-IR/try_ruby_430.md b/translations/fa-IR/try_ruby_430.md new file mode 100644 index 0000000..9d8fff1 --- /dev/null +++ b/translations/fa-IR/try_ruby_430.md @@ -0,0 +1,36 @@ +--- +lang: FA-IR +title: و حالا برای نتیجه‌گیری شگفت‌انگیز +answer: is not equal to 100$ +ok: بهتر شد +error: این نمی‌تونه درست باشه +--- + +دیدی توی عبارت __'abc' == 'def'__ دو تا علامت مساوی کنار هم اومده؟ + +این __==__ یعنی __«برابر است با»__ یا همون مقایسه. +اما اون علامت مساوی تکی (=) که قبلا دیدیم یعنی __اختصاص دادن یک مقدار به یک متغیر__. + +حالا قضیه یکم گیج‌کننده‌تر می‌شه، چون می‌تونی عمل انتساب (=) رو داخل if هم استفاده کنی،، مثل این: + + a = 0 + + if a = 100 + puts "Expression is true, but a is now: #{a}" + else + puts "#{a} is not equal to 100" + end + +اینجا چی اتفاق افتاده؟ + +توی شرط if به‌جای مقایسه، اومدیم مقدار ۱۰۰ رو ریختیم داخل a و چون نتیجهٔ این خط خودش عدد ۱۰۰ هست (که در روبی مقدار true حساب می‌شه)، شرط if همیشه درست هست. + +حالا بیا = رو به == تغییر بده و دوباره اجرا کن، اون وقت می‌بینی رفتار برنامه کاملا عوض می‌شه. + +باور کن این اشتباه (جا انداختن مساوی دوم) خیلی رایجه، خود منم هنوز بعضی وقتا یادم می‌ره. + +### else +توی کد بالا از else هم استفاده کردیم؛ بخش else وقتی اجرا می‌شه که __شرط داخل if__ برابر با false باشه. + +حالت‌ها و ترکیب‌های بیشتری از if - else وجود داره، اگه خواستی عمیق‌تر یاد بگیری، +مستندات روبی. رو ببین. From 6bd0b30ed3270a6431c799c5421102f5edce12e9 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:45 +0330 Subject: [PATCH 44/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_440.md | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 translations/fa-IR/try_ruby_440.md diff --git a/translations/fa-IR/try_ruby_440.md b/translations/fa-IR/try_ruby_440.md new file mode 100644 index 0000000..b7438b4 --- /dev/null +++ b/translations/fa-IR/try_ruby_440.md @@ -0,0 +1,48 @@ +--- +lang: FA-IR +title: گرسنه‌ام +answer: ^گرسنه نیستم +ok: Yes +error: هیچ‌وقت ساعت ۱۰ صبح گرسنه نیستم! +--- + +خب، عالی پیش می‌ریم؛ این چیزها الان به نظرت خیلی ساده میان، ولی یادت باشه فقط پونزده دقیقه پیش اصلا **هیچ روبی‌ای** بلد نبودی! + +رسیدیم به مرحله‌ی آخر؛ بیایم همه‌چی رو به هم وصل کنیم، جوری که انگار یه مجموعه زنگوله‌ی براق کنار ساحله که زیر نور آفتاب قشنگ با هم صدا می‌دن! + +اول دو تا متد تعریف می‌کنیم، بعد بر اساس شرایط تصمیم می‌گیریم: + + def hungry?(time_of_day_in_hours) + puts "Me hungry" + true + end + + def eat_an(what) + puts "Me eat #{what}\n" + end + + eat_an 'apple' if hungry?(14) + + eat_an 'apple' if hungry?(10) + +متد hungry? میاد می‌گه «من گرسنه‌ام» و همیشه هم true برمی‌گردونه. +متد eat_an هم فقط می‌گه «من فلان چیز رو می‌خورم». + +بعدش داریم می‌گیم: + +اگه ساعت ۱۴ گرسنه بودی، سیب بخور +اگه ساعت ۱۰ هم گرسنه بودی، بازم سیب بخور + +حالا تمرینت اینه: + +ببین می‌تونی متد **hungry?** رو طوری تغییر بدی که: + +وقتی ساعت کمتر از ۱۲ بود: + +پیام **"Me not hungry"** رو چاپ کنه، مقدار false برگردونه + +و وقتی ساعت ۱۲ یا بیشتر بود: + +همون **"Me hungry"** رو بگه، true برگردونه + +یعنی از این به بعد، قبل از ظهر دیگه گرسنه نیستی. \ No newline at end of file From de5977de30c0e4df9238fa0f13373e0b5b52319c Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:49 +0330 Subject: [PATCH 45/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_450.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 translations/fa-IR/try_ruby_450.md diff --git a/translations/fa-IR/try_ruby_450.md b/translations/fa-IR/try_ruby_450.md new file mode 100644 index 0000000..6c740b2 --- /dev/null +++ b/translations/fa-IR/try_ruby_450.md @@ -0,0 +1,32 @@ +--- +lang: FA-IR +title: خلاصهٔ شماره ۶ یعنی خیلی پیش آمده‌ای +answer: \{\} +class: stretcher chapmark +ok: خب، این یک هش خالی است +error: +--- + +تبریک می‌گم بهت! تو حالا یه کلاس ششمی روبی هستی، واقعا کارت عالی بوده. بیا یه مرور سریع داشته باشیم: + + +### Data +تو داده‌هایی از اینترنت گرفتی، ساختار داده‌ها رو پیمایش کردی و مقدارهای مورد نظرت رو انتخاب کردی. + +### Iterating +روی همه عناصر یک هش را تکرار کردی و چند تا متد دیگه هم پشت سر هم زنجیره‌ای اجرا کردی. + +### چاپ زیبا +اگه این کافی نبود، مقدارها رو به شکل قابل خوندن برای آدم‌ها چاپ کردی. در واقع، __تو یه برنامه واقعی ساختی!__ + +### IF +یاد گرفتی که برنامه‌ت رو با دستورات __if__ و __else__ کنترل کنی. + +## پس حالا +ممکنه بعدش چی یاد بگیری؟ چی می‌تونه بعدش برات بمونه؟ +ممم، بهترین قسمت همینه! تو اینقدر راه اومدی که قراره کلاس‌ها (classes) رو یاد بگیری. +فقط دو درس کوتاه دیگه مونده و بعدش کارت تمومه. + +قبلا یه هش اینجوری درست کردیم: + + Hash.new From 0f69f396892f228b09a687678eab4c9e5d4647ab Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:52 +0330 Subject: [PATCH 46/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_460.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 translations/fa-IR/try_ruby_460.md diff --git a/translations/fa-IR/try_ruby_460.md b/translations/fa-IR/try_ruby_460.md new file mode 100644 index 0000000..f558176 --- /dev/null +++ b/translations/fa-IR/try_ruby_460.md @@ -0,0 +1,32 @@ +--- +lang: FA-IR +title: نه کلاس مدرسه، بلکه یک کلاس کاری +answer: +ok: +error: +--- + +می‌بینی، آکولادهای خالی {} در واقع کوتاه‌شده و میان‌بری برای Hash.new هستن، متد new برای ساختن شیobject از یه کلاس مشخص استفاده می‌شه؛ یه جورایی کلاس یعنی یه گروه مشخص از شی‌ها که شبیه هم هستن، کارهای مشابه انجام می‌دن، لباس‌های مشابه دارن و… +فایدهٔ یه کلاس چیه؟ + +### BlurbalizerTM +تصور کن یه ایده کاربردی برای یه برنامه جدید داری، این برنامه قراره سکوی بعدی پیام‌رسان فوری باشه. +می‌خوای یه برنامه بسازی که مردم بتونن پیام‌های کوتاه بفرستن، این پیام‌ها رو می‌ذاری BlurbTM صدا بزنی. +هر BlurbTM حداکثر ۴۰ نویسه طول داره. حتی می‌خوای یه تنظیم حالت خلق و خو هم اضافه کنی. + + + +### از کجا شروع کنیم +خب، می‌خوای پیام‌های BlurbTM رو تو یه پرونده json ذخیره کنی، درست؟ +اما چطور می‌خوای محتوا و زمان ارسال هر پیام رو پیگیری کنی؟ +وقتی پرونده رو بارگذاری کردی، توی روبی چطور نمایش داده می‌شه؟ +یه Hash خواهد بود؟ یه Array؟ یا یه Array از Arrayها؟ یا یه چیز دیگه؟ + +### Class +به نظرم بهترین گزینه اینه که یه کلاس بسازی؛ تو قبلا با چند تا کلاس آشنا هستی: +Hash، Array، String. + +حالا یه کلاس جدید بسازیم (فعلا خروجی نمی‌ده): + + class Blurb + end From 15abf99ebf5c4f3687fd0527661bfe8e0b4869c0 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:18:56 +0330 Subject: [PATCH 47/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_470.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 translations/fa-IR/try_ruby_470.md diff --git a/translations/fa-IR/try_ruby_470.md b/translations/fa-IR/try_ruby_470.md new file mode 100644 index 0000000..a6ee03b --- /dev/null +++ b/translations/fa-IR/try_ruby_470.md @@ -0,0 +1,19 @@ +--- +lang: FA-IR +title: چیزهایی که برنامه‌ها از آن ساخته می‌شوند +answer: +ok: +error: +--- + +خب، حالا یه کلاس جدید BlurbTM باز کردی. یک پست یا پیام BlurbTM از چی ساخته شده؟ خب، محتواcontent که مشخصه. علاوه بر اون، زمان ارسال BlurbTM هم مهمه. و حتی حالت خلق و خو کاربر هم می‌تونه باشه. + +حالا که خط اول کلاس رو نوشتی، بقیه‌ش اینه: + + class Blurb + attr_accessor :content, :time, :mood + end + +نام کلاس همیشه با حرف بزرگ شروع می‌شه. + +تا اینجا هنوز هیچ خروجی‌ای نمایش داده نمی‌شه، فقط ساختار کلاس آماده شده. From d88b25aa9800d2ddf60940b69e9f5b4a443eb997 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:00 +0330 Subject: [PATCH 48/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_480.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 translations/fa-IR/try_ruby_480.md diff --git a/translations/fa-IR/try_ruby_480.md b/translations/fa-IR/try_ruby_480.md new file mode 100644 index 0000000..6832a47 --- /dev/null +++ b/translations/fa-IR/try_ruby_480.md @@ -0,0 +1,27 @@ +--- +lang: FA-IR +title: Accessorها مثل اندام‌های آویزون هستن +answer: Blurb: +ok: اولین Blurb من +error: +load: class Blurb;attr_accessor :content,:time,:mood;end +--- + +عالیه! حالا یه کلاس جدید BlurbTM ساختی. + +تو تعریف کلاس، از متدی به اسم attr\_accessor استفاده کردی. +چندین متد مشابه برای __attr__ibuteویژگی وجود داره که به کلاس‌ها ویژگی‌ها یا تنظیمات کوچیک اضافه می‌کنه. +این attributeها در واقع همون متغیرهایی هستن که به کلاس وصل شدن. + +یه جور دیگه تصور کن: +کلاس مثل یه آدمه (اون موجود ستاره‌ای شکل آدم که اون بیرونه). +attributeها مثل اندام‌های آویزون هستن، بخش‌های مختلف بدن که بقیه می‌تونن باهاش تعامل کنن یا دست بدن. + +### حالا چیکار کنیم +برای ساختن یه BlurbTM و گذاشتن محتواش: + + blurb1 = Blurb.new + puts blurb1 + blurb1.content = "Today Mount Hood Was Stolen!" + +> به بیان ساده‌تر، تو الان یه جعبه داری (BlurbTM) که می‌تونه متن، زمان و حالت خلق و خو داشته باشه. attr\_accessor مثل دست‌ها و پاهاش هستن که می‌تونی بهشون دست بزنی و تغییرشون بدی یا بخونی‌شون. \ No newline at end of file From 385310bc6ef27e7991bdc01195b9c74fba500226 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:05 +0330 Subject: [PATCH 49/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_490.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 translations/fa-IR/try_ruby_490.md diff --git a/translations/fa-IR/try_ruby_490.md b/translations/fa-IR/try_ruby_490.md new file mode 100644 index 0000000..30fda54 --- /dev/null +++ b/translations/fa-IR/try_ruby_490.md @@ -0,0 +1,15 @@ +--- +lang: FA-IR +title: یک شی، اون بستهٔ کوچک مرتب +answer: Blurb: +ok: Blurb به‌روزرسانی شد +error: +load: prev;blurb1=Blurb.new;blurb1.content="Today Mount Hood Was Stolen!" +--- + +خب، حالا وقتشه که BlurbTM رو کامل کنیم و زمان و حالت خلق و خو رو تنظیم کنیم: + + blurb1.time = Time.now + blurb1.mood = :sick + + puts blurb1 From 9dc32c319982b9729d3407175de6fa9628159714 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:11 +0330 Subject: [PATCH 50/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_500.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 translations/fa-IR/try_ruby_500.md diff --git a/translations/fa-IR/try_ruby_500.md b/translations/fa-IR/try_ruby_500.md new file mode 100644 index 0000000..3a7ff68 --- /dev/null +++ b/translations/fa-IR/try_ruby_500.md @@ -0,0 +1,30 @@ +--- +lang: FA-IR +title: سریع‌تر کردنش +answer: ^\d{4} +ok: یادداشت شد +error: +--- + +عالیه، برنامه‌ات خیلی باحاله؛ حالا بیایم کارو برات راحت‌تر کنیم. +تو که نمی‌خوای هر بار که یه BlurbTM جدید می‌سازی، زمان رو دستی تنظیم کنی که، درسته؟ + +می‌خوای فقط متن رو بنویسی و حالت خلق و خو رو مشخص کنی، همین دیگه کافی هست؟ + +پس بیایم یه متد __initialize__ به کلاس اضافه کنیم، این متد هر بار که یه BlurbTM جدید ساخته می‌شه، اجرا می‌شه. +همزمان می‌تونیم طول متن BlurbTM رو هم به ۴۰ نویسه محدود کنیم. + + class Blurb + attr_accessor :content, :time, :mood + + def initialize(mood, content="") + @time = Time.now + @content = content[0..39] + @mood = mood + end + end + + Blurb.new(:sick).time + +(پارامتر __content=""__ گذاشته شده تا مطمئن باشیم که متن محتوا همیشه یه رشته است، +حتی اگه وقتی متد initialize فراخوانی می‌شه، هیچ متنی بهش داده نشه.) From a58699a7eba89fd8ab6ebba4fb4ae922ca28564d Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:15 +0330 Subject: [PATCH 51/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_510.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 translations/fa-IR/try_ruby_510.md diff --git a/translations/fa-IR/try_ruby_510.md b/translations/fa-IR/try_ruby_510.md new file mode 100644 index 0000000..56e0b0a --- /dev/null +++ b/translations/fa-IR/try_ruby_510.md @@ -0,0 +1,29 @@ +--- +lang: FA-IR +title: به برنامه خود یاد دادی چیزهای بی‌ارزش را رد کنه +answer: Blurb: +ok: Blurb اضافه شد +error: +load: class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content="");@time=Time.now;@content=content[0..39];@mood=mood;end;end;blurb1=Blurb.new(:sick,"Today Mount Hood Was Stolen!") +--- + +دیدی که داخل کلاس از نمادsymbol @ استفاده کردیم (@time). + +__خارج__ از کلاس، از accessorها استفاده می‌کنیم: + +> __blurb.time = Time.now__ + +اما __داخل__ کلاس از __متغیرهای خود شی__ استفاده می‌کنیم: + +> __@time = Time.now__ + +این‌ها دقیقا یک چیز هستن، اما در دو جای متفاوت از برنامه بیان شدن. + +### ساخت یه BlurbTM دیگه +وقتی یه BlurbTM جدید می‌سازیم، متد initialize بررسی می‌کنه که چه پارامترهایی به new داده شده. + +ما این بار دو تا پارامتر داریم: + + blurb2 = Blurb.new :confused, "I can not believe Mt. Hood was stolen!" + +> داخل کلاس با @ کار می‌کنیم تا متغیرهای داخلی شی رو دستکاری کنیم، بیرون کلاس با accessorها. \ No newline at end of file From 7e156fec3649c268f7e064a1d56a31e62832df3f Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:20 +0330 Subject: [PATCH 52/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_520.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 translations/fa-IR/try_ruby_520.md diff --git a/translations/fa-IR/try_ruby_520.md b/translations/fa-IR/try_ruby_520.md new file mode 100644 index 0000000..5a85a57 --- /dev/null +++ b/translations/fa-IR/try_ruby_520.md @@ -0,0 +1,25 @@ +--- +lang: FA-IR +title: یه زرافه خلاصهٔ شماره ۷ را ندزدیده +answer: +class: stretcher chapmark +ok: +error: +load: prev;blurb2=Blurb.new :confused, "I can not believe Mt. Hood was stolen!" +--- + +آها، رسیدی اینجا؛ سالم و سرحال هم هستی؛ +هنوز قراره برنامه‌ات رو «واقعی» کنیم، ولی قبلش بیا یه جمع‌بندی داشته باشیم، حله؟ + +### کلاس‌هاClasses +تو روبی، همه‌چیز یه جور شی است؛ کلاس‌ها توضیح میدن هر شی چطوری کار می‌کنه. +مثلا تو چندتا BlurbTM ساختی و این Blurbها توی کلاس Blurb تعریف شدن. +به زبون ساده‌تر: اینا همون «شی‌های Blurb» هستن؛ کلاس‌ها کمک می‌کنن چیزهای دنیای واقعی رو (تقریبا) توی کد مدل‌سازی کنیم. + +### Accessors +Accessorها متغیرهایی هستن که به یه شی وصل هستن و می‌تونی از __بیرون__ شی بهشون دسترسی داشته باشی: +(blurb2.time = Time.now) + +### متغیرهای شیObject variables +متغیرهای شی همان متغیرهایی هستن که برای accessorها استفاده می‌کنی، اما __داخل__ شی ازشون استفاده می‌کنی. +(@time = Time.now) From 3ac87c478871c6c702e4f14d1f48a6612084b4e2 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:25 +0330 Subject: [PATCH 53/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_530.md | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 translations/fa-IR/try_ruby_530.md diff --git a/translations/fa-IR/try_ruby_530.md b/translations/fa-IR/try_ruby_530.md new file mode 100644 index 0000000..58beb2e --- /dev/null +++ b/translations/fa-IR/try_ruby_530.md @@ -0,0 +1,45 @@ +--- +lang: FA-IR +title: قلمروی خودت +answer: Blurbalizer: +ok: برنامه‌ام ساخته شد +error: +load: class Blurb;attr_accessor :content,:time,:mood;def initialize(mood, content="");@time=Time.now;@content=content[0..39];@mood=mood;end;end +--- + +خب، بیاید همه‌چیز را جمع‌بندی کنیم، این آخرین فصل از داستان خفن و هیجان‌انگیز Try Ruby ـه! +حالا که یه دید کلی گرفتی که همه‌چی چطور کار می‌کنه، قراره باهاش چیکار کنی؟ +توی خونه؟ توی فریزر سوپری محل؟ +آدم باحالی هستی (جزو افراد پرتلاشی)، ولی خب یه کم راهنمایی هم نیاز داری. + +### بیاید برنامه‌مون رو کامل کنیم +تا اینجا «ورودی» داریم، ولی هنوز برنامه واقعی نداریم. +برنامه‌مون هنوز اینا رو کم داره: یه اسم و عنوان، یه جایی که همه‌ی BlurbTMها توش ذخیره بشن , یه جدول زمانی برای کار کردن. + +حدس بزن چه می‌کنیم، قراره از یه کلاس دیگه استفاده کنیم؛ کل کد این کلاس جدید رو یک‌جا بهت دادم. +فقط __با حوصله__ بخونش و درکش کن. من عجله‌ای ندارم، تو درس بعدی منتظرت می‌مونم. + + class Blurbalizer + def initialize(title) + @title = title + @blurbs = [] # A fresh clean array + # for storing Blurbs + end + + def add_a_blurb(mood, content) + # The << means add to the end of the array + @blurbs << Blurb.new(mood, content) + end + + def show_timeline + puts "Blurbify: #{@title} has #{@blurbs.count} Blurbs" + + @blurbs.sort_by { |t| + t.time + }.reverse.each { |t| + puts "#{t.content.ljust(40)} #{t.time}" + } + end + end + + myapp = Blurbalizer.new "The Big Blurb" From 623855e958043fa4d3958ab6f0d54831212b2beb Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:29 +0330 Subject: [PATCH 54/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_540.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 translations/fa-IR/try_ruby_540.md diff --git a/translations/fa-IR/try_ruby_540.md b/translations/fa-IR/try_ruby_540.md new file mode 100644 index 0000000..781fe3d --- /dev/null +++ b/translations/fa-IR/try_ruby_540.md @@ -0,0 +1,23 @@ +--- +lang: FA-IR +title: این Blurb دربارهٔ چیه؟ +answer: امروز +ok: Blurbs را بیاور +error: +load: prev;class Blurbalizer;attr_reader :title;def initialize(title);@title=title;@blurbs=[];end;def add_a_blurb(mood, content);@blurbs << Blurb.new(mood, content);@blurbs.each {|t| t.time -= 73};end;def show_timeline;puts "Blurbalizer: #{@title} has #{@blurbs.count} Blurbs\n";@blurbs.sort_by { |t| t.time}.reverse.each { |t| puts "#{t.content.ljust(40)} #{t.time}"};end;end;myapp = Blurbalizer.new "The Big Blurb";myapp.add_a_blurb :sick,"Today Mount Hood Was Stolen!";myapp.add_a_blurb :confused,"I can not believe Mt. Hood was stolen!";myapp.add_a_blurb :dazed,"I am speechless!";myapp.add_a_blurb :mad,"It was stolen by a giraffe !!";myapp.add_a_blurb :sad,"I Left my Hoodie on the Mountain!";myapp.add_a_blurb :mad,"I am never going back to that mountain." +--- + +خب، رسیدی اینجا. متوجه شدی این همه کدی که توی کلاس BlurbalizerTM نوشته شده دقیقا داره چی کار می‌کنه؟ + +> توی کلاس BlurbalizerTM دو تا __متد__ داریم: add\_a\_blurb و show\_timeline. +> متدها رو می‌تونی بیرون از کلاس صدا بزنی، درست همون طوری که قبلا با accessorها کار می‌کردیم. + +حالا وقتشه واقعا از BlurbalizerTM استفاده کنیم. من از قبل چندتا BlurbTM برات آماده کردم، ولی دستت کاملا بازه که مال خودت رو هم اضافه کنی. + +دیگه خودمون مستقیم BlurbTM نمی‌سازیم، در عوض از __متد__ add\_a\_blurb داخل کلاس BlurbalizerTM استفاده می‌کنیم. چون این‌طوری مطمئن می‌شیم همه Blurbها مرتب و منظم داخل همون شی myapp ذخیره می‌شن. + +مثلا این‌جوری می‌تونی یه Blurb جدید اضافه کنی: + + myapp.add_a_blurb :moody, "Add Blurb here" + + myapp.show_timeline From 3acf02c34e60164b71ea43494a2788c459055888 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:32 +0330 Subject: [PATCH 55/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_550.md | 62 ++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 translations/fa-IR/try_ruby_550.md diff --git a/translations/fa-IR/try_ruby_550.md b/translations/fa-IR/try_ruby_550.md new file mode 100644 index 0000000..2b9d381 --- /dev/null +++ b/translations/fa-IR/try_ruby_550.md @@ -0,0 +1,62 @@ +--- +lang: FA-IR +title: همه‌چیز به ترکیب کردن برمی‌گرده +answer: :- +ok: Moody! +error: +load: prev +--- + +خیلی از چیزای قشنگ و باحال رو می‌شه با همین بخش‌های سادهٔ روبی ساخت، مخصوصا وقتی این تیکه‌ها رو با هم ترکیب می‌کنی و ازشون چیزای جدید درمیاری. +اینجا ما یه برنامه داریم که از یه کلاس ساخته شده که خودش داخلش از یه کلاس دیگه استفاده می‌کنه. +جالبه بدونی روبی توی این جور موجودات ترکیبی خیلی خوب عمل می‌کنه. به این سبک برنامه‌نویسی شیءگرا می‌نامند. + +ما به __آخرین تمرین برنامه‌نویسی__ TryRuby رسیدیم. +اگه دوست داری، می‌تونی خودت یه‌سری قابلیت جدید به BlurbalizerTM اضافه کنی. + +مثلا شاید بخوای خلق و خو رو به صورت شکلک توی متد __show_timeline__ چاپ کنی. برای این کار می‌تونی یه متد به اسم _moodify_ به کلاس BlurbTM اضافه کنی و بعدش ازش توی متد _show\_timeline_ استفاده کنی: + + class Blurb + attr_accessor :content, :time, :mood + + def initialize(mood, content="") + @time = Time.now + @content = content[0..39] + @mood = mood + end + + def moodify + if @mood == :sad + return ":-(" + elsif @mood == :happy + return ":-)" + # Add other moods here + end + + # The default mood + ":-|" + end + end + + class Blurbalizer + def initialize(title) + @title = title + @blurbs = [] + end + + def add_a_blurb(mood, content) + @blurbs << Blurb.new(mood, content) + end + + def show_timeline + puts "Blurbalizer: #{@title} has #{@blurbs.count} Blurbs" + + @blurbs.sort_by { |t| + t.time + }.reverse.each { |t| + puts "#{t.content.ljust(40)} #{t.time}" + } + end + end + + myapp.show_timeline From 89a47a0faf709caba7f93a7ebe44155a67856cd0 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:19:36 +0330 Subject: [PATCH 56/65] docs(i18n): add Persian translations --- translations/fa-IR/try_ruby_560.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 translations/fa-IR/try_ruby_560.md diff --git a/translations/fa-IR/try_ruby_560.md b/translations/fa-IR/try_ruby_560.md new file mode 100644 index 0000000..55987d9 --- /dev/null +++ b/translations/fa-IR/try_ruby_560.md @@ -0,0 +1,30 @@ +--- +lang: FA-IR +title: خلاصهٔ شماره ۸، خلاصهٔ آرام باش، کارت عالی بود +answer: +class: stretcher chapmark +ok: +error: +load: def ruby(f);puts "Go to www.ruby-lang.org to download Ruby";end;class K;attr_reader :rb;end;my_first_program=K.new +--- + +این بخش آخر یه کم آروم‌تر پیش رفت تا بهت چندتا راهنما بده که حالا با روبی چه کارهایی می‌تونی بکنی. + +اگه لذت بردی، می‌تونی ادامه بدی توی محیط تمرین TryRuby و باهاش کار کنی، +یا این‌که روبی رو روی سیستم خودت بارگیری و نصب کنی از ruby-lang.org. + +وقتی روبی نصب شد، کافیه با یه ویرایشگر متن یه پرونده بسازی، مثلا my_first_program.rb بعدش یه کم کد روبی داخلش بنویسی و توی خط فرمان اینو بزن: + + ruby my_first_program.rb + +و تمام، برنامه‌ت اجرا می‌شه! + +کلی ابزار توسعه‌ی رایگان هم هست که همه‌چی رو یه‌جا دارن: +ویرایشگر کد، مرور فلایل‌ها و دکمه اجرای روبی، کارتو خیلی راحت‌تر می‌کنن. + +## جشن بگیریم +تو واقعا حقته یه کیک دوطبقه با خامه‌ی دولایه زیاد و یه نفر که داره با اون گیتارهایی با دو دسته خفن می‌نوازه. +یعنی تو تمام کردی، واقعا انجامش دادی! هیچ شکی در اون نیست، تو یه __باهوش خون‌گرم تاییدشده__ هستی! + +## قدم بعدی چی +چندتا مقالهٔ دیگه هم توی همین وبگاه هست که بهت ایده می‌ده، از این‌جا به بعد چی کار کنی، چی یاد بگیری و کدوم مسیر رو From b0a0dae8225d181a2ce3a577434c277995225d55 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:20:33 +0330 Subject: [PATCH 57/65] docs(license): add copyright notice for Persian translation --- translations/fa-IR/README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 translations/fa-IR/README.md diff --git a/translations/fa-IR/README.md b/translations/fa-IR/README.md new file mode 100644 index 0000000..3c50bcf --- /dev/null +++ b/translations/fa-IR/README.md @@ -0,0 +1,21 @@ +## Copyright (C) +Try Ruby version 4 Persian version, 2025, _Goudarz Jafari_ + +## The MIT License +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 1fffc2e1231a78ab05baa353d975d4d8ee3d52c9 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:23:17 +0330 Subject: [PATCH 58/65] docs: add Persian translator credit --- source/articles/2015-01-01-try-ruby-version-4.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/articles/2015-01-01-try-ruby-version-4.html.markdown b/source/articles/2015-01-01-try-ruby-version-4.html.markdown index 14bda14..1669723 100644 --- a/source/articles/2015-01-01-try-ruby-version-4.html.markdown +++ b/source/articles/2015-01-01-try-ruby-version-4.html.markdown @@ -38,7 +38,7 @@ I had to make some alterations to the TryRuby lesson content. Also updated some - Removed mousehole stuff - Improved the feedback given to the user based on the program's output a bit - Added support for lesson content in multiple languages. The Spanish, Brazilian Portuguese, - Japanese, Russian, Ukrainian, Macedonian, Dutch, Turkish and French translations are available. + Japanese, Russian, Ukrainian, Macedonian, Dutch, Turkish, French and Persian translations are available. __If YOU would like to add a translation to TryRuby you are most welcome !__ - Added explanation of if/else statements - Changed the subject of the "Class" tutorials from building a blog (so last decade) to making an From 365365a75211c2b6f9883594e87f5d619ca4d056 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:23:46 +0330 Subject: [PATCH 59/65] docs: add Persian translator credit --- source/about.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/about.html.markdown b/source/about.html.markdown index 478a0aa..01c8310 100644 --- a/source/about.html.markdown +++ b/source/about.html.markdown @@ -53,6 +53,7 @@ Macedonian translation by _Violeta Pavleska_ Chinese translation by _Ye Junzhe_ & _Heng Li_ & _Bitfox_ Turkish translation by _Ali Rıza Şahin_ French translation by _Olivier Lacan_ & _Idris TAKERBOUST_ +Persian translation by _Goudarz Jafari_ ### Privacy From a6ef9f5ea62c3d91db016befa79ab1f5c1420349 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:25:22 +0330 Subject: [PATCH 60/65] feat(i18n): add Persian(fa-IR) language --- app/try_ruby.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/try_ruby.rb b/app/try_ruby.rb index 611f46f..4ee72e8 100644 --- a/app/try_ruby.rb +++ b/app/try_ruby.rb @@ -143,6 +143,8 @@ def get_language language = 'tr' when 'fr' language = 'fr' + when 'fa-IR', 'fa' + language = 'fa-IR' else language = 'en' end From d8ce144f3cf4ae07ca8829235a7e2caf35e381b5 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:26:02 +0330 Subject: [PATCH 61/65] feat(i18n): add Persian(fa-IR) language --- source/layouts/_navbar.html.erb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/layouts/_navbar.html.erb b/source/layouts/_navbar.html.erb index 2d29d55..4f36ba6 100644 --- a/source/layouts/_navbar.html.erb +++ b/source/layouts/_navbar.html.erb @@ -152,6 +152,13 @@ > Français (fr) + From f7c06750d15d43e91bddb0b36e7e29a39a9bb622 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:26:32 +0330 Subject: [PATCH 62/65] feat(i18n): add Persian(fa-IR) language --- collector.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/collector.rb b/collector.rb index 8902ed9..f5ea556 100644 --- a/collector.rb +++ b/collector.rb @@ -159,6 +159,7 @@ def initialize(app, options_hash={}, &block) Collector.new('translations/de/try_ruby_*.md', 'source/try_ruby_de.json').collect Collector.new('translations/tr/try_ruby_*.md', 'source/try_ruby_tr.json').collect Collector.new('translations/fr/try_ruby_*.md', 'source/try_ruby_fr.json').collect + Collector.new('translations/fa-IR/try_ruby_*.md', 'source/try_ruby_fa-IR.json').collect # TODO: add any new translations here true From 4b28b739e77c69bca1d25ab70fc735f2dcf3dce2 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:27:02 +0330 Subject: [PATCH 63/65] docs: add Persian translator credit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8f10f6f..1ff40c5 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Macedonian translation by [_Violeta Pavleska_](https://github.com/violeta-p) Chinese translation by [_Ye Junzhe_](https://github.com/McF4r) & [_Bitfox_](https://github.com/bitfoxtop) & [_Heng Li_](https://github.com/iheng) Turkish translation by [_Ali Rıza Şahin_](https://github.com/ARS-coding) French translation by [_Olivier Lacan_](https://github.com/olivierlacan) & [_Idris TAKERBOUST_](https://github.com/idrista) +Persian translation by [_Goudarz Jafari_](https://github.com/Goudarz) Suggestions to improve translations are welcome. If you submit a pull request updating a translation please From 026feb1acf9992a16ee9f4ff4434df84bbace2ae Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:28:14 +0330 Subject: [PATCH 64/65] style(css): add RTL styles for Persian (fa-IR) --- source/stylesheets/application.css.scss | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/source/stylesheets/application.css.scss b/source/stylesheets/application.css.scss index 45f1866..ce992fb 100644 --- a/source/stylesheets/application.css.scss +++ b/source/stylesheets/application.css.scss @@ -165,6 +165,11 @@ blockquote { border-left: .5rem solid var(--secondary-color); background: transparent; + :lang(fa-IR) & { + border-left: unset; + border-right: .5rem solid var(--secondary-color); + } + & > :last-child { margin-bottom: 0; } @@ -211,6 +216,10 @@ code, .CodeMirror pre { color: #555; font: .9rem "Source Code Pro", "Courier New", monospace; + + :lang(fa-IR) & { + direction: ltr; + } } code { @@ -224,6 +233,12 @@ pre { border-left: .5rem solid var(--primary-color); background: var(--code-light-background-color); + :lang(fa-IR) & { + border-left: unset; + border-right: .5rem solid var(--primary-color); + background: var(--code-light-background-color); + } + code { padding: 0; background: transparent; @@ -314,3 +329,18 @@ pre { transform-origin: 0 0; } } + +html:lang(fa-IR) body { + direction: rtl; + text-align: right; +} + + +.dropdown-menu-end[data-bs-popper]:lang(fa-IR) { + left: 0; + right: auto; +} + +.form-select:lang(fa-IR) { + background-position: left .75rem center; +} \ No newline at end of file From 4a6aefb3f3cf766eec40ae105072f8f16c5e4f10 Mon Sep 17 00:00:00 2001 From: Goudarz Jafari Date: Sat, 27 Dec 2025 16:39:09 +0330 Subject: [PATCH 65/65] style(css): support RTL layout for Persian playground iframe --- source/stylesheets/application.css.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/stylesheets/application.css.scss b/source/stylesheets/application.css.scss index ce992fb..de0ac60 100644 --- a/source/stylesheets/application.css.scss +++ b/source/stylesheets/application.css.scss @@ -327,6 +327,10 @@ pre { zoom: .8; transform: scale(.8); transform-origin: 0 0; + + :lang(fa-IR) & { + transform-origin: top right; + } } }