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
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
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
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
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
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)
+
diff --git a/source/stylesheets/application.css.scss b/source/stylesheets/application.css.scss
index 45f1866..de0ac60 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;
@@ -312,5 +327,24 @@ pre {
zoom: .8;
transform: scale(.8);
transform-origin: 0 0;
+
+ :lang(fa-IR) & {
+ transform-origin: top right;
+ }
}
}
+
+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
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.
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:
+---
+
+روبی یک زبان برنامهنویسی از کشور ژاپن است که در حال متحولکردن توسعه نرمافزار میباشد.
+
+زیبایی روبی در تعادل آن میان سادگی و قدرت یافت میشود.
+
+میتوانید مقداری کد روبی را در ویرایشگر تایپ کنید و از این دکمهها برای پیمایش استفاده کنید:
+
+- __اجرا__ ← کد موجود در ویرایشگر را اجرا میکند
+- __رونوشت__ ← کد نمونه را در ویرایشگر رونوشت میکند
+- __بعدی__ ← به شما اجازه میدهد به درس بعدی بروید
+- __قبلی__ ← به شما اجازه میدهد به درس قبلی بازگردید
+
+
روی بعدی کلیک کنید تا یادگیری را آغاز کنید.
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
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__ چیزها را به __آرایه__ تبدیل میکند
+
+__آرایهها چی هستند؟!__
+
+آنها لیست هستند. یک جفت براکت تایپ کنید:
+
+ []
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 یک ویرگول انگلیسی«,» تایپ کنید و سپس یک عدد بنویسید، فاصله اختیاری است.
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
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]
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
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!_ با یک علامت تعجب بزرگ در انتها دارد؟
+خیلی وقتها متدهای روبی اینطور فریاد میزنند اگر قرار باشد متغیر را برای همیشه تغییر دهند.
+چیز خاصی نیست، فقط یک نشانه است.
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__ برای رونوشت کردن کد نمونه در ویرایشگر استفاده کنید.
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
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 است. این متد همهٔ موارد «نان تُستم» را با
+«طالبیِ شیرینم» جایگزین میکند.
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
+
+خروجی برنامهٔ شما باید در پنجرهٔ خروجی نمایش داده شود.
+همچنین خط دیگری هم وجود دارد در جواب که به شما میگوید چقدر خوب عمل کردید.
+
+> یا می توانید دکمه __رونوشت__ را فشار دهید تا کد نمونه را در ویرایشگر رونوشت شود.
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
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
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
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:
+---
+
+### علامتهای تعجب
+ممکن است متدها در نامشان علامت تعجب (و همچنین علامت سوال) داشته باشند.
+اینها فقط برای توضیح بهتر عملکردشان هستند. چیز مهمی نیست.
+
+### دستکاری رشته
+جستجو و تغییر رشتهها
+
+### زنجیرهسازی
+زنجیرهسازی متدها به شما اجازه میدهد کارهای بیشتری انجام دهید. یک شعر را بشکنید، وارونه کنید، دوباره سرهم کنید:
+__poem.lines.reverse.join__
+
+در این مرحله، ممکن است بخواهید کمی بیشتر با شعر کار کنید. فهرست کامل همهٔ متدهای رشته در
+اینجا است.
+
+برو جلو و چند مورد را امتحان کن، مانند: poem.downcase یا poem.swapcase
+> چون زبان فارسی مفهوم حروف بزرگ و کوچک ندارد، هیچ تغییری روی آن ایجاد نمیشود؛ و اگر رشته ترکیبی باشد فقط روی بخش لاتین اثر میگذارد.
+
+آمادهاید؟
+وقتی احساس کردید آمادهٔ ادامه هستید، تایپ کنید:
+
+ books = {}
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 جدا از هم هستند، پس اگه اینجا کتابها رو اضافه کردی، فقط تو همین درس میتونی ازشون استفاده کنی. اگه میخوای تو درس بعدی هم باشه، باید از اینجا بردار و جای دیگه بچسبان.
+> نگران این موضوع نباش، هر درس کلی چیز آماده داره که میتونی باهاش بازی کنی.
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.
+
+این امتیازها رشته نیستند. وقتی یک دونقطه «:» قبل از یک کلمهٔ ساده قرار میدهید، یک __symbol__ ساخته میشه.
+سمبلها از نظر حافظهٔ رایانه سبکتر از رشتهها هستن. یعنی اگه یه کلمه رو بارها تو برنامه استفاده کنی، رایانه فقط __یه نسخه__ از نماد رو نگه میداره، نه هزاران نسخه از رشتهی همون کلمه را.
+
+یه نکته مهمتر هم اینه که symbol نشان میده این کلمه فقط یه کلمه معمولی نیست، بلکه یه معنی خاص تو برنامه داره.
+
+حالا دو بررسی کتاب دیگه اضافه کنید، از __books.length__ استفاده کنید تا ببینید چند بررسی در هش وجود دارد:
+
+ books["The deep end"] = :abysmal
+ books["Living colors"] = :mediocre
+
+ puts books
+
+ puts books.length
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"]
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
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_ یعنی: مقدار را یک واحد افزایش بده.
+
+نگران نباش اگر همهٔ چیزهایی که اینجا اتفاق میافتد را نمیفهمی، بعداً توضیح داده خواهد شد.
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
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
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: بلوک را ۰ تا ۹ بار اجرا کن
+---
+
+همونطور که تو مثال اول با بلوک (وقتی امتیازها رو شمردیم) دیدیم، میتونیم یک مقدار به بلوک منتقل کنیم؛ اینکه چه مقادیری __ارسال بشن__ بستگی به متدی داره که بلوک رو اجرا میکنه.
+
+مقادیر __دریافت شده__ توسط بلوک در نام متغیر ابتدای بلوک قرار میگیرد، بین دو خط عمودی «|» نوشته میشن.
+
+بیایید این را با این بلوک امتحان کنیم:
+
+ 5.times { |time|
+ puts time
+ }
+
+اینجا، متد __.times__ یک مقدار را به متغیر __|time|__ میفرسته. ولی یادت باشه که متغیر time فقط داخل همون بلوک شناخته میشه و بیرون بلوک قابل استفاده نیست.
+
+> توجه کردی که میتونی کد رو توی چند خط بنویسی؟ این کار خوندنش رو راحتتر میکنه.
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:
+---
+
+این درس آخری یه کم طولانیتر بود. احتمالاً حدود سه دقیقه صرف یادگیری دربارهٔ این موارد کردی:
+
+### هشها
+یه جور واژهنامه کوچولو با صفحههای آکولادی، که با این نشونه ساخته میشه: __{}__
+
+### سمبلها
+کلمههای کوچیک، سبک و بهصرفه که با دونقطه شروع میشن، مثل: __:splendid__
+
+### بلوکها
+تکهکدهایی که میتونن به خیلی از متدهای روبی وصل بشن؛ این هم همون کدی که باهاش جدول امتیازها رو ساختی:
+
+__books.values.each { |rate| ratings[rate] += 1 }__
+
+### قدم بعدی
+تو درس بعدی قراره کمی عمیقتر بریم سراغ متدها و ببینیم دقیقاً چطور کار میکنن.
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:
+---
+
+یه نکتهی کوچولوی دیگه هست که هنوز درست و حسابی دربارش حرف نزدیم: آرگومانهای متد.
+یادت هست وقتی شعر رو یه کم تغییر دادیم؟ این کد رو استفاده کردیم:
+
+__poem.gsub("نان تُستم", "طالبیِ شیرینم")__
+
+متد gsub به دو تا آرگومان نیاز داره، که ما اونها رو با گذاشتن دو رشته داخل پرانتز به gsub پاس دادیم.
+به طور خلاصه، _آرگومانها به متد میگن دقیقاً باید چه کاری انجام بده._
+
+### پرانتزها
+در واقع بیشتر وقتها روبی اصلا حساس نیست که پرانتز بذاری یا نه؛ یعنی این کد هم کاملا کار میکنه:
+
+__poem.gsub "نان تُستم", "طالبیِ شیرینم"__
+
+ما قبلا هم از یه متد دیگه با پارامتر استفاده کردیم؛ حتی خیلی وقتها، فقط خیلی به چشم نیومده:
+
+ puts "Hello"
+ puts("Hello")
+
+آره __puts__ هم یک متد است. برای روبی فرقی نمیکنه که puts رو با پرانتز بنویسی یا بدون پرانتز، ولی نسخهی بدون پرانتز خوندنش راحتتره و کلی هم توی تایپ کردن صرفهجویی میکنه!
+
+> خلاصهاش اینه: هر کاری دلت میخواد با پرانتزها بکن، فقط طوری بنویس که کدت تمیز و خوانا باشه.
+
+### بودن یا نبودن «to (be) or not to (be)»
+حالا که میدونیم _to_ یه متده و _be_ یه آرگومان، جواب این سؤال قدیمی هم معلوم شد!
+در نهایت، فقط یه سلیقه شخصیه که بنویسی _to be_ یا _to(be)_.
+
+حال و هوای شکسپیری داری؟ پس ادامه بده بخون.
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
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 هم اسم اون گروهه
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
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_ رو برمیگردونه، پس عملا میتونیم کل خط آخر رو حذف کنیم.
+یعنی در واقع، همون متدی که از اول نوشته بودیم، از همون اول دقیقا کاری که میخواستیم رو انجام میداد!
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:
+---
+
+آفرین، آفرین، آفرین، آفرین!
+
+واقعا، واقعا، واقعا، واقعا، واااااااقعا!
+
+بیاید چند دقیقه آخر یادگیریت رو مرور کنیم:
+
+### متدها
+متدها با __def__ تعریف میشن و یه اسم دارن،
+متدها باعث میشن برنامهت کوتاهتر و خوندنش راحتتر بشه.
+
+### پارامترها
+متدها میتونن پارامتر داشته باشن، یعنی ورودیهایی که بهشون میدیم.
+
+### مقادیر بازگشتی
+متدها (تقریبا) همیشه یه مقدار برمیگردونن.
+
+## حالا
+سوال «بودن یا نبودن» دیگه برای تو سوال نیست! آمادهای که یه کم دیگه با شکسپیر حال کنیم؟
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
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 تو هَش حفظ شده، هنوز کمی خوندنش سخت به نظر میاد.
+بیاید یه متد بسازیم که نمایشنامهها رو به شکل مرتب و قابل خوندن نشون بده.
+
+اگه فهرست نمایشنامهها رو دقیق نگاه کنی، میبینی که یه جور ساختار تو در تو داره.
+(این خیلی رایجه برای دادههایی که از اینترنت میگیری.)
+مثال ساختارش شبیه اینه:
+
+
+
"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"]
+ }
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 را از آخرین فرمول حذف کنید و ببینید چه اتفاقی میافتد.
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 اضافهشون کنیم. این یه نمونه دیگه از زنجیرهسازی متدهاست که قبلا وقتی شعر رو برعکس کردیم دیدیم.
+
+من یه متد آماده به اسم __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 رو زنجیره کردم؟ این کار باعث میشه متد __count\_plays__ یه مقدار بازگشتی داشته باشه.
+
+اون خط __s = get_shakey__ رو ببین، میتونی __["William Shakespeare"].select { |k, v|__ را به آخر get_shakey اضافه کنی (در این حالت نیازی به نقطه نیست).
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__
+
+__«آخرش همهچی درست میشه»؟__ هنوز تموم نشده، ولی تهش معلومه داریم خیلی نزدیک میشیم به پایان داستان!
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
+
+_عبارت if_ میتونه شکلهای مختلفی داشته باشه. میتونه مقدارهای ثابت را مقایسه کنه (1 < 2)،
+متغیرها (a < 1) و مقدار بازگشتی یک متد را ('xyz'.empty?) و هر چیزی که آخرش بشه true یا false، میتونه شرط if باشه.
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 وجود داره، اگه خواستی عمیقتر یاد بگیری،
+مستندات روبی. رو ببین.
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
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
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 برای ساختن شی از یه کلاس مشخص استفاده میشه؛ یه جورایی کلاس یعنی یه گروه مشخص از شیها که شبیه هم هستن، کارهای مشابه انجام میدن، لباسهای مشابه دارن و…
+فایدهٔ یه کلاس چیه؟
+
+### BlurbalizerTM
+تصور کن یه ایده کاربردی برای یه برنامه جدید داری، این برنامه قراره سکوی بعدی پیامرسان فوری باشه.
+میخوای یه برنامه بسازی که مردم بتونن پیامهای کوتاه بفرستن، این پیامها رو میذاری BlurbTM صدا بزنی.
+هر BlurbTM حداکثر ۴۰ نویسه طول داره. حتی میخوای یه تنظیم حالت خلق و خو هم اضافه کنی.
+
+
+
+### از کجا شروع کنیم
+خب، میخوای پیامهای BlurbTM رو تو یه پرونده json ذخیره کنی، درست؟
+اما چطور میخوای محتوا و زمان ارسال هر پیام رو پیگیری کنی؟
+وقتی پرونده رو بارگذاری کردی، توی روبی چطور نمایش داده میشه؟
+یه Hash خواهد بود؟ یه Array؟ یا یه Array از Arrayها؟ یا یه چیز دیگه؟
+
+### Class
+به نظرم بهترین گزینه اینه که یه کلاس بسازی؛ تو قبلا با چند تا کلاس آشنا هستی:
+Hash، Array، String.
+
+حالا یه کلاس جدید بسازیم (فعلا خروجی نمیده):
+
+ class Blurb
+ end
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 از چی ساخته شده؟ خب، محتوا که مشخصه. علاوه بر اون، زمان ارسال BlurbTM هم مهمه. و حتی حالت خلق و خو کاربر هم میتونه باشه.
+
+حالا که خط اول کلاس رو نوشتی، بقیهش اینه:
+
+ class Blurb
+ attr_accessor :content, :time, :mood
+ end
+
+نام کلاس همیشه با حرف بزرگ شروع میشه.
+
+تا اینجا هنوز هیچ خروجیای نمایش داده نمیشه، فقط ساختار کلاس آماده شده.
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
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
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"
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 فراخوانی میشه، هیچ متنی بهش داده نشه.)
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!")
+---
+
+دیدی که داخل کلاس از نماد @ استفاده کردیم (@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
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!"
+---
+
+آها، رسیدی اینجا؛ سالم و سرحال هم هستی؛
+هنوز قراره برنامهات رو «واقعی» کنیم، ولی قبلش بیا یه جمعبندی داشته باشیم، حله؟
+
+### کلاسها
+تو روبی، همهچیز یه جور شی است؛ کلاسها توضیح میدن هر شی چطوری کار میکنه.
+مثلا تو چندتا BlurbTM ساختی و این Blurbها توی کلاس Blurb تعریف شدن.
+به زبون سادهتر: اینا همون «شیهای Blurb» هستن؛ کلاسها کمک میکنن چیزهای دنیای واقعی رو (تقریبا) توی کد مدلسازی کنیم.
+
+### Accessors
+Accessorها متغیرهایی هستن که به یه شی وصل هستن و میتونی از __بیرون__ شی بهشون دسترسی داشته باشی:
+(blurb2.time = Time.now)
+
+### متغیرهای شی
+متغیرهای شی همان متغیرهایی هستن که برای accessorها استفاده میکنی، اما __داخل__ شی ازشون استفاده میکنی.
+(@time = Time.now)
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"
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
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
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
+
+و تمام، برنامهت اجرا میشه!
+
+کلی ابزار توسعهی رایگان هم هست که همهچی رو یهجا دارن:
+ویرایشگر کد، مرور فلایلها و دکمه اجرای روبی، کارتو خیلی راحتتر میکنن.
+
+## جشن بگیریم
+تو واقعا حقته یه کیک دوطبقه با خامهی دولایه زیاد و یه نفر که داره با اون گیتارهایی با دو دسته خفن مینوازه.
+یعنی تو تمام کردی، واقعا انجامش دادی! هیچ شکی در اون نیست، تو یه __باهوش خونگرم تاییدشده__ هستی!
+
+## قدم بعدی چی
+چندتا مقالهٔ دیگه هم توی همین وبگاه هست که بهت ایده میده، از اینجا به بعد چی کار کنی، چی یاد بگیری و کدوم مسیر رو
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
+
+(نقطه را فراموش نکن!)
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
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
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