Remove Ganjoor-specific services; Urdu defaults

- drop 7-day/top visits tabs (Ganjoor's kntr analytics)
- page language options: Urdu (default), Persian, Arabic; drop Turkish/Kurdish
- fa-IR -> ur-PK as default language/culture (site + API); JS digits ur-PK-u-nu-arabext
- unlink blog/museum/ava/... .ganjoor.net help links (text kept)
- random verse: data-driven random poem from our DB/API instead of c.ganjoor.net widget
  and hard-coded Persian poet id ranges
- word tooltip: Urdu Wiktionary instead of vajehyab; drop abjad.ganjoor.net

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Anas Rashid 2026-10-04 23:45:08 +02:00
parent 0104850692
commit 24add6c820
50 changed files with 161 additions and 521 deletions

View File

@ -148,7 +148,7 @@
var lang = document.getElementById('cat-poem-language').value;
if(lang == '')
lang = 'fa-IR';
lang = 'ur-PK';
var ok = await upConfirm(lang);
if (ok) {
var url = '?handler=SetCategoryLanguageTag';
@ -425,7 +425,7 @@
<select id="cat-poem-language">
@foreach (var lang in Model.Languages)
{
@if(lang.Code == "fa-IR")
@if(lang.Code == "ur-PK")
{
<option value="">@lang.Name</option>
}

View File

@ -94,10 +94,9 @@
<div class="up-field">
<label asp-for="ModifyModel.Language">زبان (برای کدگذاری صفحه و نه مشخصات لهجه‌ها)</label>
<select asp-for="ModifyModel.Language">
<option value="">فارسی</option>
<option value="azb">ترکی</option>
<option value="">اردو</option>
<option value="fa">فارسی</option>
<option value="ar">عربی</option>
<option value="ckb">کردی</option>
</select>
</div>
}

View File

@ -447,7 +447,7 @@ namespace GanjooRazor.Areas.Admin.Pages
Username = username,
Password = password,
ClientAppName = "GanjooRazor",
Language = "fa-IR"
Language = "ur-PK"
};
var stringContent = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");

View File

@ -67,7 +67,7 @@ else
}
});
$('#logout-others-btn').closest('div').remove();
upToast(removedCount > 0 ? 'از ' + removedCount.toLocaleString('fa-IR') + ' دستگاه دیگر خارج شدید.' : 'دستگاه دیگری برای خروج یافت نشد.', 'success');
upToast(removedCount > 0 ? 'از ' + removedCount.toLocaleString('ur-PK-u-nu-arabext') + ' دستگاه دیگر خارج شدید.' : 'دستگاه دیگری برای خروج یافت نشد.', 'success');
},
error: function (e) {
upToast(e.responseText || 'خروج از سایر دستگاه‌ها با خطا مواجه شد.', 'error');

View File

@ -332,7 +332,7 @@ else
<select id="language">
@foreach (var lang in Model.Languages)
{
@if (Model.MyLastEdit != null && (Model.MyLastEdit.Language == lang.Code || (string.IsNullOrEmpty(Model.MyLastEdit.Language) && lang.Code == "fa-IR")))
@if (Model.MyLastEdit != null && (Model.MyLastEdit.Language == lang.Code || (string.IsNullOrEmpty(Model.MyLastEdit.Language) && lang.Code == "ur-PK")))
{
<option value="@lang.Code" selected>@lang.Name</option>
}

View File

@ -164,7 +164,7 @@ namespace GanjooRazor.Areas.User.Pages
}
if(string.IsNullOrEmpty(PoemSection.Language))
{
PoemSection.Language = "fa-IR";
PoemSection.Language = "ur-PK";
}
int index = Array.IndexOf(PageInformation.Poem.Sections, PoemSection);

View File

@ -31,7 +31,7 @@ else
@if(Model.UpVotes.Count == 0)
{
<p>
شما خوانشی را نشان نکرده‌اید. برای آشنایی با نحوهٔ نشان کردن خوانش‌ها <a href="https://blog.ganjoor.net/1400/10/03/changes-in-recitations-section/" target="_blank">اینجا</a> را ببینید.
شما خوانشی را نشان نکرده‌اید. برای آشنایی با نحوهٔ نشان کردن خوانش‌ها اینجا را ببینید.
</p>
}

View File

@ -91,7 +91,7 @@ namespace GanjooRazor.Pages
ForgotPasswordViewModel = new UnverifiedSignUpViewModel()
{
ClientAppName = "وبگاه دیوان",
Language = "fa-IR",
Language = "ur-PK",
CallbackUrl = $"{Configuration["SiteUrl"]}/resetpassword"
};
@ -216,7 +216,7 @@ namespace GanjooRazor.Pages
LoginViewModel loginViewModel = new LoginViewModel()
{
ClientAppName = "وبگاه دیوان",
Language = "fa-IR",
Language = "ur-PK",
Username = postViewModel.Email,
Password = postViewModel.Password
};

View File

@ -95,7 +95,7 @@
<div class="background-red color-white"><p>@Model.LastError</p></div>
<div class="notice width-100per">
<p>لطفاً به نکات زیر توجه کنید:</p>
<p>۱. اگر پیشتر در <a href="https://museum.ganjoor.net">گنجینهٔ دیوان</a> یا <a href="https://gaudiopanel.ganjoor.net">پیشخان خوانشگران دیوان</a> نام‌نویسی کرده‌اید می‌توانید با همان اطلاعات کاربری در دیوان وارد شوید و نیاز به و امکان نام‌نویسی مجدد با همان ایمیل را ندارید. </p>
<p>۱. اگر پیشتر در گنجینهٔ دیوان یا پیشخان خوانشگران دیوان نام‌نویسی کرده‌اید می‌توانید با همان اطلاعات کاربری در دیوان وارد شوید و نیاز به و امکان نام‌نویسی مجدد با همان ایمیل را ندارید. </p>
<p>۲. برای مطالعهٔ اشعار نیازی به نام‌نویسی ندارید. نام‌نویسی برای درج حاشیه و مشارکت در سایت مورد نیاز است.</p>
<p>۳. دیوان اطلاعاتی راجع به این که شما با نام کاربری خود چه صفحاتی را مطالعه می‌کنید جمع آوری نمی‌کند. برای اطمینان مفاد صفحهٔ <a href="/privacy">حریم خصوصی</a> را مطالعه بفرمایید.</p>
<p>۴. بعد از نام‌نویسی امکان حذف حساب کاربری خود را دارید. با این کار اطلاعات خاص شما مثل حاشیه‌ها و خوانش‌ها حذف می‌شود و مشارکت‌های شما مثل ویرایش‌ها و ... به نام کاربر سیستم دیوان ثبت می‌شود.</p>

View File

@ -88,7 +88,7 @@ namespace GanjooRazor.Pages
SignUpViewModel = new UnverifiedSignUpViewModel()
{
ClientAppName = "وبگاه دیوان",
Language = "fa-IR",
Language = "ur-PK",
CallbackUrl = $"{Configuration["SiteUrl"]}/signup"
};
@ -228,7 +228,7 @@ namespace GanjooRazor.Pages
LoginViewModel loginViewModel = new LoginViewModel()
{
ClientAppName = "وبگاه دیوان",
Language = "fa-IR",
Language = "ur-PK",
Username = postViewModel.Email,
Password = postViewModel.Password
};

View File

@ -75,7 +75,7 @@
else
{
<p>
<span style="color:red">لطفاً</span> تنها در صورتی که حاشیهٔ مد نظر توهین‌آمیز (حاوی کلمات رکیک، توهین شخصی، سیاسی، مذهبی یا قومیتی و ...) یا نامفهوم (جملات و کلمات ناخوانا و بی‌ربط یا پینگلیش) است آن را جهت حذف گزارش کنید. <span style="color:red">اگر فکر می‌کنید بحث مطرح شده غلط یا نامستند است یا به هر دلیل دیگری با آن مخالفید به جای درخواست حذف حاشیه مطابق <a href="https://blog.ganjoor.net/1393/01/29/how-to-comment/" target="_blank">این راهنما به آن پاسخ دهید</a> و درخواست حذف آن را نکنید.</span> متنی که در اینجا می‌نویسید هیچ جا منتشر نمی‌شود و پس از بررسی گزارش حذف می‌شود.
<span style="color:red">لطفاً</span> تنها در صورتی که حاشیهٔ مد نظر توهین‌آمیز (حاوی کلمات رکیک، توهین شخصی، سیاسی، مذهبی یا قومیتی و ...) یا نامفهوم (جملات و کلمات ناخوانا و بی‌ربط یا پینگلیش) است آن را جهت حذف گزارش کنید. <span style="color:red">اگر فکر می‌کنید بحث مطرح شده غلط یا نامستند است یا به هر دلیل دیگری با آن مخالفید به جای درخواست حذف حاشیه مطابق این راهنما به آن پاسخ دهید و درخواست حذف آن را نکنید.</span> متنی که در اینجا می‌نویسید هیچ جا منتشر نمی‌شود و پس از بررسی گزارش حذف می‌شود.
</p>
}
</div>

View File

@ -27,7 +27,7 @@ else
<a href="/contribs">مشارکت‌های کاربران</a>
</h2>
<p>
این آمارها نشانگر آن بخش از مشارکت‌های کاربران در دیوان است که از طریق نام‌نویسی و به شکل مستقیم انجام شده و پوشش‌دهندهٔ همهٔ این مشارکت‌ها نیست. برای مشاهدهٔ گونه‌های دیگر مشارکت کاربران -بعضاً در حجم‌های بزرگتر- صفحات <a href="/sources">منابع</a>، <a href="/donate">حمایت‌های مالی</a> و همینطور <a href="https://blog.ganjoor.net">تازه‌های دیوان</a> و <a href="https://github.com/ganjoor/">گیتهاب دیوان</a> را ببینید.
این آمارها نشانگر آن بخش از مشارکت‌های کاربران در دیوان است که از طریق نام‌نویسی و به شکل مستقیم انجام شده و پوشش‌دهندهٔ همهٔ این مشارکت‌ها نیست. برای مشاهدهٔ گونه‌های دیگر مشارکت کاربران -بعضاً در حجم‌های بزرگتر- صفحات <a href="/sources">منابع</a>، <a href="/donate">حمایت‌های مالی</a> و همینطور تازه‌های دیوان و <a href="https://github.com/ganjoor/">گیتهاب دیوان</a> را ببینید.
</p>
<p>
در آمارهای زیر تعداد روز مشارکت نشانگر یک بازهٔ زمانی نیست بلکه نشانگر تعداد روزهایی است که در آن مشارکت صورت گرفته که ممکن است کوچکتر از فاصلهٔ شروع مشارکت تا روز جاری باشد. آمارها به شکل روزانه به‌روز می‌شوند و از این جهت ممکن است یک روز عقب‌تر از آمار واقعی باشند.

View File

@ -67,11 +67,11 @@
<h1 class="text-danger">خطای پیش‌بینی نشده</h1>
<h2 class="text-danger">متأسفانه نمایش صفحهٔ مد نظر شما با خطا مواجه شد.</h2>
<p>اگر این خطا با تازه‌سازی صفحه رفع نشد ممکن است سرور دیوان دچار کمبود منابع شده باشد یا اشکالی پیش آمده باشد که رسیدگی به آن تا ساعاتی دیگر میسر نباشد. در این صورت می‌توانید از وبگاههای جایگزین یا موارد پیشنهادی زیر استفاده کنید:</p>
<div class="century"><a href="http://old.ganjoor.net"><strong>وبگاه قدیمی دیوان</strong></a></div>
<div class="century"><a href="https://dg.ganjoor.net">دریافت دیوان رومیزی</a></div>
<div class="century"><strong>وبگاه قدیمی دیوان</strong></div>
<div class="century">دریافت دیوان رومیزی</div>
<div class="century"><a href="http://pozh.org/saaghar/">دریافت ساغر</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/android/">نرم‌افزارهای اندرویدی سازگار با دیوان</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/ios/">نرم‌افزارهای سازگار با دیوان برای آیفون و آی‌پد</a></div>
<div class="century">نرم‌افزارهای اندرویدی سازگار با دیوان</div>
<div class="century">نرم‌افزارهای سازگار با دیوان برای آیفون و آی‌پد</div>
<div class="century"><a href="https://github.com/ganjoor/">نرم‌افزارهای بازمتن دیوان</a></div>
@if (Model.ShowRequestId)

View File

@ -505,7 +505,7 @@ namespace GanjooRazor.Pages
return new OkObjectResult(poet);
}
public string HtmlLanguage { get; set; } = "fa-IR";
public string HtmlLanguage { get; set; } = "ur-PK";
private void _prepareNextPre()
{
@ -809,7 +809,7 @@ namespace GanjooRazor.Pages
if (IsPoemPage)
{
HtmlLanguage = string.IsNullOrEmpty(GanjoorPage.Poem.Language) ? "fa-IR" : GanjoorPage.Poem.Language;
HtmlLanguage = string.IsNullOrEmpty(GanjoorPage.Poem.Language) ? "ur-PK" : GanjoorPage.Poem.Language;
if (GetConfigFlag("BannersEnabled"))
{
var bannerQuery = await _httpClient.GetAsync($"{APIRoot.Url}/api/banners/random");
@ -1429,48 +1429,6 @@ namespace GanjooRazor.Pages
});
}
public async Task<IActionResult> OnGetTopVisitsAsync(string url)
{
url = $"https://ganjoor.net/{url}/";
var apiUrl = $"https://track.kntr.ir/api/reporting/toppages/1/ganjoor.net?parentUrl={WebUtility.UrlEncode(url)}&count=20";
var topVisitsResponse = await _httpClient.GetAsync(apiUrl);
if (!topVisitsResponse.IsSuccessStatusCode)
{
return Partial("~/Pages/Partials/GanjoorPage/_TopVisitsPartial.cshtml", new _TopVisitsPartialModel()
{
Visits = null
});
}
var topVisits = JsonConvert.DeserializeObject<PageVisitsViewModel[]>(await topVisitsResponse.Content.ReadAsStringAsync());
return Partial("~/Pages/Partials/GanjoorPage/_TopVisitsPartial.cshtml", new _TopVisitsPartialModel()
{
Visits = topVisits
});
}
public async Task<IActionResult> OnGetSevenDaysVisitsAsync(string url)
{
url = $"https://ganjoor.net/{url}/";
var apiUrl = $"https://track.kntr.ir/api/reporting/dailypagevisits/1/ganjoor.net/for/{WebUtility.UrlEncode(url)}?start={DateTime.Now.Date.AddDays(-6).ToString("yyyy-MM-dd")}";
var s7ndaysVisitsResponse = await _httpClient.GetAsync(apiUrl);
if (!s7ndaysVisitsResponse.IsSuccessStatusCode)
{
return Partial("~/Pages/Partials/GanjoorPage/_7DaysVisitsPartial.cshtml", new _7DaysVisitsPartialModel()
{
SevenDaysVisits = null
});
}
var s7ndaysVisits = JsonConvert.DeserializeObject<DateRangeVisitsViewModel[]>(await s7ndaysVisitsResponse.Content.ReadAsStringAsync());
return Partial("~/Pages/Partials/GanjoorPage/_7DaysVisitsPartial.cshtml", new _7DaysVisitsPartialModel()
{
SevenDaysVisits = s7ndaysVisits
});
}
// --- merged from the old _SimiPage.cshtml.cs (was a partial-class extension of IndexModel) ---
public async Task<IActionResult> OnGetSimilarPoemsPartialAsync(int poemId, int skip, string prosodyMetre, string rhymeLetters, string poemFullUrl, int sectionIndex)

View File

@ -109,77 +109,77 @@ else
@if(Model.Contributions.PoemCorrections > 0)
{
<tr>
<td><p><a href="https://blog.ganjoor.net/1400/05/23/notes-for-suggesting-corrections/">ویرایش‌ها</a>ی تأیید شده:</p></td>
<td><p>ویرایش‌های تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.PoemCorrections)</p></td>
</tr>
}
@if (Model.Contributions.SectionCorrections > 0)
{
<tr>
<td><p><a href="https://blog.ganjoor.net/1401/02/30/section-editor/">ویرایش‌های قطعات</a> تأیید شده:</p></td>
<td><p>ویرایش‌های قطعات تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.SectionCorrections)</p></td>
</tr>
}
@if (Model.Contributions.CatCorrections > 0)
{
<tr>
<td><p><a href="https://blog.ganjoor.net/1404/01/05/cat-editor/">ویرایش‌های بخش</a>‌های تأیید شده:</p></td>
<td><p>ویرایش‌های بخش‌های تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.CatCorrections)</p></td>
</tr>
}
@if (Model.Contributions.SuggestedSongs > 0)
{
<tr>
<td><p><a href="https://blog.ganjoor.net/1395/06/28/bptags/">ترانه</a>‌های مرتبط تأیید شده:</p></td>
<td><p>ترانه‌های مرتبط تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.SuggestedSongs)</p></td>
</tr>
}
@if (Model.Contributions.QuotedPoems > 0)
{
<tr>
<td><p><a href="https://blog.ganjoor.net/1402/11/06/suggest-quotes/">مشق</a>‌های پیشنهادی تأیید شده:</p></td>
<td><p>مشق‌های پیشنهادی تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.QuotedPoems)</p></td>
</tr>
}
@if (Model.Contributions.Recitations > 0)
{
<tr>
<td><p><a href="https://ava.ganjoor.net/about">خوانش</a>‌های تأیید شده:</p></td>
<td><p>خوانش‌های تأیید شده:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.Recitations)</p></td>
</tr>
}
@if (Model.Contributions.MuseumLinks > 0)
{
<tr>
<td><p>ارتباطات پیشنهادی <a href="https://museum.ganjoor.net">گنجینه</a>:</p></td>
<td><p>ارتباطات پیشنهادی گنجینه:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.MuseumLinks)</p></td>
</tr>
}
@if (Model.Contributions.PinterestLinks > 0)
{
<tr>
<td><p>ارتباطات پیشنهادی <a href="https://blog.ganjoor.net/1399/01/29/pinterest/">تصاویر خارجی</a>:</p></td>
<td><p>ارتباطات پیشنهادی تصاویر خارجی:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.PinterestLinks)</p></td>
</tr>
}
@if (Model.Contributions.PoetSpecLines > 0)
{
<tr>
<td><p>نکات پیشنهادی <a href="https://blog.ganjoor.net/1400/11/28/photos/"> دربارهٔ چهرهٔ سخنوان</a>:</p></td>
<td><p>نکات پیشنهادی دربارهٔ چهرهٔ سخنوان:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.PoetSpecLines)</p></td>
</tr>
}
@if (Model.Contributions.PoetPictures > 0)
{
<tr>
<td><p>تصاویر <a href="https://blog.ganjoor.net/1400/11/28/photos/">چهرهٔ پیشنهادی</a>:</p></td>
<td><p>تصاویر چهرهٔ پیشنهادی:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.PoetPictures)</p></td>
</tr>
}
@if (Model.Contributions.PublicUserNotes > 0)
{
<tr>
<td><p><a href="https://museum.ganjoor.net/notes">یادداشت‌های عمومی گنجینه</a>:</p></td>
<td><p>یادداشت‌های عمومی گنجینه:</p></td>
<td><p>@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Contributions.PublicUserNotes)</p></td>
</tr>
}

View File

@ -165,7 +165,7 @@ namespace GanjooRazor.Pages
}
LoginViewModel.ClientAppName = "GanjooRazor";
LoginViewModel.Language = "fa-IR";
LoginViewModel.Language = "ur-PK";
var stringContent = new StringContent(JsonConvert.SerializeObject(LoginViewModel), Encoding.UTF8, "application/json");
var loginUrl = $"{APIRoot.Url}/api/users/login";

View File

@ -100,7 +100,7 @@
// If divisible by three, insert number
if (count % 3 === 0) {
// Number is also localized for Persian
lineNumbers[i].innerHTML = `<p>${count.toLocaleString("fa-IR")}</p>`;
lineNumbers[i].innerHTML = `<p>${count.toLocaleString("ur-PK-u-nu-arabext")}</p>`;
}
}

View File

@ -4,84 +4,84 @@
case "poemcorrections":
<text>
<p>
قابلیت ویرایش متن از <a href="https://blog.ganjoor.net/1400/05/23/notes-for-suggesting-corrections/">اواسط سال ۱۴۰۰</a> به دیوان افزوده شده است و به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) کار می‌کند. ویرایش می‌تواند شامل متن، معنی یا وزن و حروف قافیه و قالب و زبان غالب و ... باشد. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. یک ویرایش می‌تواند شامل یک یا چند ویرایش جزئی باشد از این جهت حجم کار انجام شده از لحاظ تعداد جزئیات تغییر یافته چند برابر این اعداد است. این آمار نشان‌دهندهٔ تعداد ویرایش‌های کلی تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های او به حساب «کاربر سیستمی حذف‌شده» منتقل می‌شود.
قابلیت ویرایش متن از اواسط سال ۱۴۰۰ به دیوان افزوده شده است و به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) کار می‌کند. ویرایش می‌تواند شامل متن، معنی یا وزن و حروف قافیه و قالب و زبان غالب و ... باشد. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. یک ویرایش می‌تواند شامل یک یا چند ویرایش جزئی باشد از این جهت حجم کار انجام شده از لحاظ تعداد جزئیات تغییر یافته چند برابر این اعداد است. این آمار نشان‌دهندهٔ تعداد ویرایش‌های کلی تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های او به حساب «کاربر سیستمی حذف‌شده» منتقل می‌شود.
</p>
</text>
break;
case "sectioncorrections":
<text>
<p>
ویرایش قطعات همانند ویرایش متن است. در متون مخلوط نظم و نثر برای تعیین وزن و قافیه باید مشخص شود که وزن و قافیه مربوط به کدام قطعهٔ بخش است. این کار را با <a href="https://blog.ganjoor.net/1401/02/30/section-editor/">ویرایش قطعه</a> انجام می‌دهیم. به دلایل فنی امکان یکی کردن آمار این ویرایش‌ها با ویرایش‌های عادی وجود ندارد. ویرایش‌های قطعات هم به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) انجام می‌شود. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. یک ویرایش قطعه نیز می‌تواند شامل یک یا چند ویرایش جزئی باشد از این جهت حجم کار انجام شده از لحاظ تعداد جزئیات تغییر یافته چند برابر این اعداد است. این آمار نشان‌دهندهٔ تعداد ویرایش‌های قطعات کلی تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های قطعات او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
ویرایش قطعات همانند ویرایش متن است. در متون مخلوط نظم و نثر برای تعیین وزن و قافیه باید مشخص شود که وزن و قافیه مربوط به کدام قطعهٔ بخش است. این کار را با ویرایش قطعه انجام می‌دهیم. به دلایل فنی امکان یکی کردن آمار این ویرایش‌ها با ویرایش‌های عادی وجود ندارد. ویرایش‌های قطعات هم به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) انجام می‌شود. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. یک ویرایش قطعه نیز می‌تواند شامل یک یا چند ویرایش جزئی باشد از این جهت حجم کار انجام شده از لحاظ تعداد جزئیات تغییر یافته چند برابر این اعداد است. این آمار نشان‌دهندهٔ تعداد ویرایش‌های قطعات کلی تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های قطعات او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
</p>
</text>
break;
case "catcorrections":
<text>
<p>
<a href="https://blog.ganjoor.net/1404/01/05/cat-editor/">ویرایش بخش</a> برای ویرایش زندگینامهٔ سخنوران و همینطور توضیحات اضافی زیربخش‌ها کاربرد دارد و به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) انجام می‌شود. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد ویرایش‌های بخش‌های تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های بخش او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
ویرایش بخش برای ویرایش زندگینامهٔ سخنوران و همینطور توضیحات اضافی زیربخش‌ها کاربرد دارد و به صورت دو مرحله‌ای (ویرایش و بعد تأیید یا رد ویرایش) انجام می‌شود. جزئیات ویرایش‌های کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد ویرایش‌های بخش‌های تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ویرایش‌های بخش او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
</p>
</text>
break;
case "suggestedsongs":
<text>
<p>
سابقهٔ <a href="https://blog.ganjoor.net/1395/06/28/bptags/">پیشنهاد ترانه‌های مرتبط با اشعار</a> به پیش از افزوده شدن امکان نام‌نویسی کاربران به دیوان برمی‌گردد (پیشنهاد ترانه بدون ورود به دیوان و به شکل بی‌نام انجام می‌شده). از این جهت تعداد ۴٬۶۸۲ ترانهٔ پیشنهادی تأیید شده (داخل در آمار زیر) فاقد اطلاعات کاربر پیشنهاد دهنده است. جزئیات ترانه‌های پیشنهادی کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد ترانه‌های مرتبط تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ترانه‌های پیشنهادی او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
سابقهٔ پیشنهاد ترانه‌های مرتبط با اشعار به پیش از افزوده شدن امکان نام‌نویسی کاربران به دیوان برمی‌گردد (پیشنهاد ترانه بدون ورود به دیوان و به شکل بی‌نام انجام می‌شده). از این جهت تعداد ۴٬۶۸۲ ترانهٔ پیشنهادی تأیید شده (داخل در آمار زیر) فاقد اطلاعات کاربر پیشنهاد دهنده است. جزئیات ترانه‌های پیشنهادی کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد ترانه‌های مرتبط تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ ترانه‌های پیشنهادی او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
</p>
</text>
break;
case "quoteds":
<text>
<p>
<a href="https://blog.ganjoor.net/1402/11/06/suggest-quotes/">مشق شعر</a> نقل قول اشعار شاعران از اشعار دیگر و یا اشعار خودشان است. جزئیات مشق شعرهای پیشنهادی کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد مشق شعرهای تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ مشق شعرهای او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
مشق شعر نقل قول اشعار شاعران از اشعار دیگر و یا اشعار خودشان است. جزئیات مشق شعرهای پیشنهادی کاربران با نام آنها منتشر نمی‌شود. این آمار نشان‌دهندهٔ تعداد مشق شعرهای تأیید شده است. در صورتی که کاربری حساب کاربری خود را حذف کند تاریخچهٔ مشق شعرهای او به نام حساب کاربر سیستمی حذف‌شده منتقل می‌شود.
</p>
</text>
break;
case "discussions":
<text>
<p>
<a href="/hashieha/">حاشیه‌ها</a> دیدگاه‌های ثبت شدهٔ کاربران دیوان است. <a href="https://blog.ganjoor.net/1386/12/06/comments/">سابقهٔ امکان درج حاشیه</a> در دیوان به ۱۴ سال پیش از <a href="https://blog.ganjoor.net/1400/03/01/signupandlogin/">افزوده شدن امکان نام‌نویسی در دیوان</a> برمی‌گردد و پیش از آن کاربران می‌توانستند حتی بدون وارد کردن نامشان در دیوان حاشیه‌نویسی کنند. بعد از افزوده شدن امکان نام‌نویسی اگر کاربر با ایمیلی ثبت نام کند که پیش از آن با همان ایمیل حاشیه‌ای در دیوان ثبت کرده باشد مالکیت آن حاشیه(ها) به او منتقل می‌شود. در صورتی که کاربری حساب کاربری خود را حذف کند حاشیه‌های او هم به طور کامل حذف می‌شود.
<a href="/hashieha/">حاشیه‌ها</a> دیدگاه‌های ثبت شدهٔ کاربران دیوان است. سابقهٔ امکان درج حاشیه در دیوان به ۱۴ سال پیش از افزوده شدن امکان نام‌نویسی در دیوان برمی‌گردد و پیش از آن کاربران می‌توانستند حتی بدون وارد کردن نامشان در دیوان حاشیه‌نویسی کنند. بعد از افزوده شدن امکان نام‌نویسی اگر کاربر با ایمیلی ثبت نام کند که پیش از آن با همان ایمیل حاشیه‌ای در دیوان ثبت کرده باشد مالکیت آن حاشیه(ها) به او منتقل می‌شود. در صورتی که کاربری حساب کاربری خود را حذف کند حاشیه‌های او هم به طور کامل حذف می‌شود.
</p>
</text>
break;
case "recitations":
<text>
<p>
امکان <a href="https://ava.ganjoor.net/about/">روخوانی متون دیوان</a> پیش از <a href="https://blog.ganjoor.net/1400/03/01/signupandlogin/">افزوده شدن امکان نام‌نویسی در دیوان</a> وجود داشته و شیوهٔ انتشار روخوانی‌ها آن بوده که خوانشگر روخوانی را با ایمیل یا روش‌های ارتباطی دیگر برای گردانندهٔ دیوان می‌فرستاده که بعدها به دلیل حجم بالای ورودی‌ها این روش منقضی شد و سیستمی برای آن ارائه شد. یک کاربر می‌تواند با تعریف نمایه‌های متعدد روخوانی‌های افراد مختلفی را منتشر کند. لذا لزوماً همهٔ خوانش‌های کاربر متعلق به خود او نیست. در صورت حذف حساب کاربری کلیهٔ خوانش‌های متعلق به کاربر حذف می‌شوند.
امکان روخوانی متون دیوان پیش از افزوده شدن امکان نام‌نویسی در دیوان وجود داشته و شیوهٔ انتشار روخوانی‌ها آن بوده که خوانشگر روخوانی را با ایمیل یا روش‌های ارتباطی دیگر برای گردانندهٔ دیوان می‌فرستاده که بعدها به دلیل حجم بالای ورودی‌ها این روش منقضی شد و سیستمی برای آن ارائه شد. یک کاربر می‌تواند با تعریف نمایه‌های متعدد روخوانی‌های افراد مختلفی را منتشر کند. لذا لزوماً همهٔ خوانش‌های کاربر متعلق به خود او نیست. در صورت حذف حساب کاربری کلیهٔ خوانش‌های متعلق به کاربر حذف می‌شوند.
</p>
</text>
break;
case "museumlinks":
<text>
<p>
سیستم <a href="https://blog.ganjoor.net/1398/07/12/mganjoor/">پیشنهاد تصاویر نسخه‌های خطی مرتبط با متون دیوان</a> پیش از <a href="https://blog.ganjoor.net/1400/03/01/signupandlogin/">افزوده شدن امکان نام‌نویسی در دیوان</a> ارائه شده و همان سیستم مدیریت کاربران و کاربران آن بعدها برای دیوان استفاده شده است. در صورت حذف حساب کاربری سوابق کلیهٔ ارتباطات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
سیستم پیشنهاد تصاویر نسخه‌های خطی مرتبط با متون دیوان پیش از افزوده شدن امکان نام‌نویسی در دیوان ارائه شده و همان سیستم مدیریت کاربران و کاربران آن بعدها برای دیوان استفاده شده است. در صورت حذف حساب کاربری سوابق کلیهٔ ارتباطات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
</p>
</text>
break;
case "pinterestlinks":
<text>
<p>
<a href="https://blog.ganjoor.net/1399/01/29/pinterest/">تصاویر خارجی</a> تصاویر نگاره‌ها و صفحات نسخه‌های نفیس است که در <a href="https://museum.ganjoor.net/">گنجینهٔ دیوان</a> میزبانی نمی‌شود. در صورت حذف حساب کاربری سوابق کلیهٔ ارتباطات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
تصاویر خارجی تصاویر نگاره‌ها و صفحات نسخه‌های نفیس است که در گنجینهٔ دیوان میزبانی نمی‌شود. در صورت حذف حساب کاربری سوابق کلیهٔ ارتباطات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
</p>
</text>
break;
case "poetspeclines":
<text>
<p>
کاربران دیوان می‌توانند <a href="https://blog.ganjoor.net/1400/11/28/photos/">برای چهره‌های شاعران دیوان نکاتی را پیشنهاد دهند</a>. در نسخه‌های اولیه تاریخ ثبت یا تأیید پیشنهاد ذخیره نمی‌شده و از این جهت تعدادی از موارد پیشنهادی بدون تاریخ هستند. در صورت حذف حساب کاربری سوابق کلیهٔ نکات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
کاربران دیوان می‌توانند برای چهره‌های شاعران دیوان نکاتی را پیشنهاد دهند. در نسخه‌های اولیه تاریخ ثبت یا تأیید پیشنهاد ذخیره نمی‌شده و از این جهت تعدادی از موارد پیشنهادی بدون تاریخ هستند. در صورت حذف حساب کاربری سوابق کلیهٔ نکات پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
</p>
</text>
break;
case "poetpix":
<text>
<p>
کاربران دیوان می‌توانند <a href="https://blog.ganjoor.net/1400/11/28/photos/">برای چهره‌های شاعران دیوان تصاویری را پیشنهاد دهند</a>. در نسخه‌های اولیه تاریخ ثبت یا تأیید پیشنهاد ذخیره نمی‌شده و از این جهت تعدادی از موارد پیشنهادی بدون تاریخ هستند. در صورت حذف حساب کاربری سوابق کلیهٔ تصاویر پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
کاربران دیوان می‌توانند برای چهره‌های شاعران دیوان تصاویری را پیشنهاد دهند. در نسخه‌های اولیه تاریخ ثبت یا تأیید پیشنهاد ذخیره نمی‌شده و از این جهت تعدادی از موارد پیشنهادی بدون تاریخ هستند. در صورت حذف حساب کاربری سوابق کلیهٔ تصاویر پیشنهادی به حساب سیستمی کاربر حذف شدهٔ دیوان منتقل می‌شود.
</p>
</text>
break;
case "usernotes":
<text>
<p>
کاربران گنجینهٔ دیوان می‌توانند روی نسخه‌های در دسترس روی آن یا تصاویر آنها <a href="https://museum.ganjoor.net/notes">یادداشتهایی را به شکل عمومی بنویسند</a>. در صورت حذف حساب کاربری این یادداشتها نیز پاک می‌شوند.
کاربران گنجینهٔ دیوان می‌توانند روی نسخه‌های در دسترس روی آن یا تصاویر آنها یادداشتهایی را به شکل عمومی بنویسند. در صورت حذف حساب کاربری این یادداشتها نیز پاک می‌شوند.
</p>
</text>
break;

View File

@ -33,7 +33,6 @@
<div class="poemtablinks active"><a href="#words" onclick="javascript:loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">واژگان</a></div>
<div class="poemtablinks"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
@* Word Counts Section *@
@ -56,7 +55,6 @@
<div class="poemtablinks"><a href="#words" onclick="javascript:loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">واژگان</a></div>
<div class="poemtablinks active"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
@if (Model.CategoryHasRecitations)
@ -79,7 +77,6 @@
<div class="poemtablinks"><a href="#words" onclick="javascript:loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">واژگان</a></div>
<div class="poemtablinks"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<div class="poemtablinks active"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-persongraph" onclick="loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">
@ -88,21 +85,6 @@
<div id="persongraph-placeholder"></div>
</div>
@* Top Visits Section *@
<div class="poempretab" id="topvisits"></div>
<div class="poemtab">
<div class="poemtablinks"><a href="#pretab">آمار</a></div>
<div class="poemtablinks"><a href="#words" onclick="javascript:loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">واژگان</a></div>
<div class="poemtablinks"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks active"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-topvisits" onclick="loadTopVisits('@Model.GanjoorPage.FullUrl')">
بارگذاری آمار پربازدیدها
</div>
<div id="topvisits-placeholder"></div>
</div>
@* Map - only when at least one tag actually carries a Location; person tags (added alongside
geo/date tags on the same CategoryPoemGeoDateTags array) never have one, so a category whose

View File

@ -124,7 +124,7 @@
</form>
@if (Model.PinterestUrl == "manual")
{
<a href="https://blog.ganjoor.net/1399/01/29/pinterest/" target="_blank">پیشنهاد آسان از اینستاگرام و پین‌ترست با افزونهٔ فایرفاکس</a>
<span>پیشنهاد آسان از اینستاگرام و پین‌ترست با افزونهٔ فایرفاکس</span>
}
</div>
}
@ -166,19 +166,7 @@
</a>
</h2>
@if (Model.HtmlLanguage == "azb")
{
<div class="notice">
مجموعه‌ای کامل‌تر و معتبرتر از اشعار ترکی را در وبگاه <a href="https://minsoz.ir">مین سؤز</a> خواهید یافت.
</div>
}
@if (Model.HtmlLanguage == "ckb")
{
<div class="notice">
مجموعه‌ای کامل‌تر و معتبرتر از اشعار کردی را در وبگاه <a href="https://books.vejin.net">ڤەژینبوکس</a> خواهید یافت.
</div>
}
</div>
}
}
@ -245,7 +233,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks">
<a href="#discussions">حاشیه‌ها</a>
</div>
@ -490,7 +477,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
@ -521,7 +507,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
@ -569,7 +554,7 @@
<a onclick="wpopen('?pinterest_url=manual'); return false" class="pagebutton comments-link">پیشنهاد تصاویر مرتبط از منابع اینترنتی<i class="notranslate info-buttons photo_camera"></i></a>
</p>
<p>
<a href="https://blog.ganjoor.net/1398/07/12/mganjoor/" class="pagebutton" target="_blank">راهنمای نحوهٔ پیشنهاد تصاویر مرتبط از گنجینهٔ دیوان<i class="notranslate info-buttons help-button"></i></a>
راهنمای نحوهٔ پیشنهاد تصاویر مرتبط از گنجینهٔ دیوان<i class="notranslate info-buttons help-button"></i>
</p>
</div>
</div>
@ -581,7 +566,7 @@
<a onclick="wpopen('?pinterest_url=manual'); return false" class="pagebutton comments-link">پیشنهاد تصاویر مرتبط از منابع اینترنتی<i class="notranslate info-buttons photo_camera"></i></a>
</p>
<p>
<a href="https://blog.ganjoor.net/1398/07/12/mganjoor/" class="pagebutton" target="_blank">راهنمای نحوهٔ پیشنهاد تصاویر مرتبط از گنجینهٔ دیوان<i class="notranslate info-buttons help-button"></i></a>
راهنمای نحوهٔ پیشنهاد تصاویر مرتبط از گنجینهٔ دیوان<i class="notranslate info-buttons help-button"></i>
</p>
</div>
}
@ -605,7 +590,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="poemtabcontent">
@ -614,7 +598,7 @@
فعال یا غیرفعال‌سازی قفل متن روی خوانش
<svg class="noindent-info-button" height="24px" viewBox="0 0 24 24" width="24px" fill="#5f6368"><path d="M0 0h24v24H0V0zm0 0h24v24H0V0zm0 0h24v24H0V0zm0 0h24v24H0V0z" fill="none" /><path d="M8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2h-4.66l2 2H18v5.56l2 2V10c0-1.1-.9-2-2-2h-1V6c0-2.76-2.24-5-5-5-2.32 0-4.26 1.59-4.82 3.74L8.9 6.46V6zM4.41 4.81L3 6.22l2.04 2.04C4.42 8.6 4 9.25 4 10v10c0 1.1.9 2 2 2h12.78l1 1 1.41-1.41L4.41 4.81zM6 20V10h.78l10 10H6z" /></svg>
</a>
<a href="https://ava.ganjoor.net/about/" class="pagebutton comments-link" target="_blank">من بخوانم</a>
من بخوانم
</div>
}
@ -636,7 +620,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="poemtabcontent">
@ -667,7 +650,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="poemtabcontent">
@ -692,7 +674,7 @@
else
{
<div>
<a href="https://blog.ganjoor.net/1402/11/06/suggest-quotes/" class="pagebutton comments-link" target="_blank">پیشنهاد مشق شعر</a>
پیشنهاد مشق شعر
</div>
}
</div>
@ -718,7 +700,6 @@
{
<div class="poemtablinks active"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="poemtabcontent">
@ -783,34 +764,6 @@
</div>
}
@* ============ 7 DAYS VISITS TAB ============ *@
<div class="poempretab" id="7daysvisits"></div>
<div class="poemtab">
<div class="poemtablinks"><a href="#pretab">اطّلاعات</a></div>
<div class="poemtablinks"><a href="#words" onclick="javascript:countPoemWords(@Model.GanjoorPage.Id, @Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id)">واژگان</a></div>
<div class="poemtablinks"><a href="#manuscripts">تصاویر</a></div>
@if (Model.GanjoorPage.Poem.Recitations.Where(a => a.RecitationType == RMuseum.Models.GanjoorAudio.RecitationType.Normal).Any())
{
<div class="poemtablinks"><a href="#recitations">خوانش‌ها</a></div>
}
@if (Model.GanjoorPage.Poem.Recitations.Where(a => a.RecitationType == RMuseum.Models.GanjoorAudio.RecitationType.Commentary).Any())
{
<div class="poemtablinks"><a href="#commentaries">شرح‌های صوتی</a></div>
}
<div class="poemtablinks"><a href="#qpoems">مشق شعر</a></div>
@if (Model.SectionsWithRelated.Count > 0)
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks active"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-7daysvisits" onclick="load7DaysVisits('@Model.GanjoorPage.FullUrl')">
بارگذاری روند بازدیدها
</div>
<div id="7daysvisits-placeholder"></div>
</div>
@* ============ DISCUSSIONS TAB ============ *@
<div class="poempretab" id="discussions"></div>
@ -831,7 +784,6 @@
{
<div class="poemtablinks"><a href="#rpoems">هم‌آهنگ‌ها</a></div>
}
<div class="poemtablinks"><a href="#7daysvisits" onclick="javascript:load7DaysVisits('@Model.GanjoorPage.FullUrl')">روند بازدیدها</a></div>
<div class="poemtablinks active"><a href="#discussions">حاشیه‌ها</a></div>
</div>
<div class="related-images-frame poemtabcontent">

View File

@ -55,7 +55,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
@* Stats Section *@
@ -73,7 +72,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<p>مشق‌های شعر از @Model.GanjoorPage.PoetOrCat.Poet.Nickname</p>
@ -89,7 +87,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-word-counts" onclick="loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">
@ -113,7 +110,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
@if (Model.CategoryHasRecitations)
@ -139,7 +135,6 @@
<div class="poemtablinks active"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="poemtabcontent">
<div class="related-images-frame">
@ -175,7 +170,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks active"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="poemtabcontent related-images-frame">
<div class="related-images">
@ -217,7 +211,6 @@
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks active"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-persongraph" onclick="loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">
@ -226,24 +219,6 @@
<div id="persongraph-placeholder"></div>
</div>
@* Top Visits Section *@
<div class="poempretab" id="topvisits"></div>
<div class="poemtab">
<div class="poemtablinks"><a href="#pretab">آمار</a></div>
<div class="poemtablinks"><a href="#quoteds">مشق شعر</a></div>
<div class="poemtablinks"><a href="#words" onclick="javascript:loadWordCounts(@Model.GanjoorPage.PoetOrCat.Cat.Id, @Model.GanjoorPage.PoetOrCat.Poet.Id, false)">واژگان</a></div>
<div class="poemtablinks"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<div class="poemtablinks"><a href="#photos">تصاویر چهره</a></div>
<div class="poemtablinks"><a href="#papersources">منابع کاغذی</a></div>
<div class="poemtablinks"><a href="#persongraph" onclick="javascript:loadPersonGraph(@Model.GanjoorPage.PoetOrCat.Cat.Id)">نامبردگان</a></div>
<div class="poemtablinks active"><a href="#topvisits" onclick="javascript:loadTopVisits('@Model.GanjoorPage.FullUrl')">پربازدیدها</a></div>
</div>
<div class="related-images-frame poemtabcontent">
<div class="century cursor-pointer" id="load-topvisits" onclick="loadTopVisits('@Model.GanjoorPage.FullUrl')">
بارگذاری آمار پربازدیدها
</div>
<div id="topvisits-placeholder"></div>
</div>
@* Map *@
@if (!Model.OfflineMode && Model.CategoryPoemGeoDateTags != null && Model.CategoryPoemGeoDateTags.Length > 0)

View File

@ -1,42 +0,0 @@
@using DNTPersianUtils.Core
@model GanjooRazor.Pages._7DaysVisitsPartialModel
@if (Model.SevenDaysVisits == null)
{
<p>در دریافت آمار خطایی رخ داده، لطفاً مجدداً دکمهٔ روند بازدیدها را بزنید.</p>
return;
}
@if (Model.SevenDaysVisits.Length > 0)
{
<table class="stats" id="7days-visits">
<thead>
<tr class="h">
<td class="c1">ردیف</td>
<td class="c2">تاریخ</td>
<td class="c3">شمار</td>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.SevenDaysVisits.Length; i++)
{
@if (i % 2 == 0)
{
<tr class="e">
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2">@RMuseum.Services.Implementation.LanguageUtils.FormatInShortDate(Model.SevenDaysVisits[i].Date)</td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.SevenDaysVisits[i].Visits)</td>
</tr>
}
else
{
<tr>
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2">@RMuseum.Services.Implementation.LanguageUtils.FormatInShortDate(Model.SevenDaysVisits[i].Date)</td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.SevenDaysVisits[i].Visits)</td>
</tr>
}
}
</tbody>
</table>
}

View File

@ -1,10 +0,0 @@
using KontorService.Models.Reporting.ViewModels;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace GanjooRazor.Pages
{
public class _7DaysVisitsPartialModel : PageModel
{
public DateRangeVisitsViewModel[] SevenDaysVisits { get; set; }
}
}

View File

@ -10,7 +10,7 @@
</h2>
<div id="wordcounts-section">
<p>
در متن @Model.ThisPart @RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.TotalWordCount) واژه را شمرده‌ایم (در تعریفمان از <i>واژه</i> ایرادات جدی وجود دارد، <a href="https://blog.ganjoor.net/1403/04/06/words-frequency/" target="_blank">اینجا</a> را ببینید). شمار واژگان یاد شده به شکل غیرتکراری برابر با @RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.UniqueWordCount) واژه است.
در متن @Model.ThisPart @RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.TotalWordCount) واژه را شمرده‌ایم (در تعریفمان از <i>واژه</i> ایرادات جدی وجود دارد، اینجا را ببینید). شمار واژگان یاد شده به شکل غیرتکراری برابر با @RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.UniqueWordCount) واژه است.
</p>
@if (Model.RemStopWords)
{

View File

@ -31,7 +31,7 @@
<td class="c2"><a href="/search?s=@Model.WordCounts[i].Word&stats=true&author=@Model.PoetId&cat=@Model.CatId">@Model.WordCounts[i].Word</a></td>
}
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.WordCounts[i].Count)</td>
<td class="c4">@((Model.WordCounts[i].Count * 100.0 / Model.TotalWordCount).ToString("N4", new CultureInfo("fa-IR")).ToPersianNumbers())</td>
<td class="c4">@((Model.WordCounts[i].Count * 100.0 / Model.TotalWordCount).ToString("N4", new CultureInfo("ur-PK")).ToPersianNumbers())</td>
</tr>
}
@ -49,7 +49,7 @@
}
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.WordCounts[i].Count)</td>
<td class="c4">@((Model.WordCounts[i].Count * 100.0 / Model.TotalWordCount).ToString("N4", new CultureInfo("fa-IR")).ToPersianNumbers())</td>
<td class="c4">@((Model.WordCounts[i].Count * 100.0 / Model.TotalWordCount).ToString("N4", new CultureInfo("ur-PK")).ToPersianNumbers())</td>
</tr>
}
}

View File

@ -1,46 +0,0 @@
@using DNTPersianUtils.Core
@model GanjooRazor.Pages._TopVisitsPartialModel
@if (Model.Visits == null)
{
<p>در دریافت آمار خطایی رخ داده، لطفاً مجدداً دکمهٔ پربازدیدها را بزنید.</p>
return;
}
@if (Model.Visits.Length > 0)
{
<table class="stats" id="top-visits">
<thead>
<tr class="h">
<td class="c1">ردیف</td>
<td class="c2">شعر/بخش</td>
<td class="c3">شمار</td>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Visits.Length; i++)
{
@if (i % 2 == 0)
{
<tr class="e">
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2"><a href="@Model.Visits[i].Url">@Model.Visits[i].Title</a></td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Visits[i].Visits)</td>
</tr>
}
else
{
<tr>
<td class="c1">@((i + 1).ToPersianNumbers())</td>
<td class="c2"><a href="@Model.Visits[i].Url">@Model.Visits[i].Title</a></td>
<td class="c3">@RMuseum.Services.Implementation.LanguageUtils.FormatMoney(Model.Visits[i].Visits)</td>
</tr>
}
}
</tbody>
</table>
<p>
<small><strong>نکته:</strong> آمار مربوط به بعد از ۱۴۰۴/۰۲/۱۲ است.</small>
</p>
}

View File

@ -1,10 +0,0 @@
using KontorService.Models.Reporting.ViewModels;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace GanjooRazor.Pages
{
public class _TopVisitsPartialModel : PageModel
{
public PageVisitsViewModel[] Visits { get; set; }
}
}

View File

@ -33,7 +33,7 @@
}
else
{
<td class="c4">@((Model.WordStats[i].Count * 100.0 / Model.WordStats[i].TotalWordCount).ToString("N4", new CultureInfo("fa-IR")).ToPersianNumbers())</td>
<td class="c4">@((Model.WordStats[i].Count * 100.0 / Model.WordStats[i].TotalWordCount).ToString("N4", new CultureInfo("ur-PK")).ToPersianNumbers())</td>
}
</tr>
@ -50,7 +50,7 @@
}
else
{
<td class="c4">@((Model.WordStats[i].Count * 100.0 / Model.WordStats[i].TotalWordCount).ToString("N4", new CultureInfo("fa-IR")).ToPersianNumbers())</td>
<td class="c4">@((Model.WordStats[i].Count * 100.0 / Model.WordStats[i].TotalWordCount).ToString("N4", new CultureInfo("ur-PK")).ToPersianNumbers())</td>
}
</tr>
}

View File

@ -147,7 +147,7 @@
</p>
<p style="font-family: 'Vazirmatn';font-size: 1em">
جهت دریافت خوانش با استفاده از دیوان رومیزی <a href="https://blog.ganjoor.net/1395/04/07/dg-274/" target="_blank">این مطلب</a> را مطالعه بفرمایید. امکان ساخت کلیپهای ویدیویی از خوانشها با استفاده از <a href="https://blog.ganjoor.net/category/gsync2vid/" target="_blank">خوانشگر دیوان رومیزی</a> وجود دارد. جهت مشارکت در خوانش اشعار <a href="http://ava.ganjoor.net/about/" target="_blank">این صفحه</a> و ویدیوهای آموزشی آن را ببینید.
جهت دریافت خوانش با استفاده از دیوان رومیزی این مطلب را مطالعه بفرمایید. امکان ساخت کلیپهای ویدیویی از خوانشها با استفاده از خوانشگر دیوان رومیزی وجود دارد. جهت مشارکت در خوانش اشعار این صفحه و ویدیوهای آموزشی آن را ببینید.
</p>
<script src="~/lib/jquery/dist/jquery.min.js"></script>

View File

@ -132,7 +132,7 @@ else
<div>
تعداد کل نتایج: @Model.PaginationMetadata.totalCount.ToPersianNumbers() قطعه
<div>
<small>در هر قطعه ممکن است عبارت چند بار تکرار شده باشد. برای دستیابی به آمار با احتساب تکرارها <a href="https://blog.ganjoor.net/1403/04/06/words-frequency/">بسامد واژگان</a> را ببینید.</small>
<small>در هر قطعه ممکن است عبارت چند بار تکرار شده باشد. برای دستیابی به آمار با احتساب تکرارها بسامد واژگان را ببینید.</small>
</div>
</div>
}

View File

@ -178,7 +178,7 @@ else
<tr>
<td colspan="2">
<p>
اگر پیش‌تر در <a href="https://museum.ganjoor.net" target="_blank">گنجینه</a> یا <a href="https://gaudiopanel.ganjoor.net" target="_blank">پیشخان خوانشگران</a> دیوان نام‌نویسی کرده‌اید می‌توانید با همان اطلاعات کاربری به دیوان وارد شوید.
اگر پیش‌تر در گنجینه یا پیشخان خوانشگران دیوان نام‌نویسی کرده‌اید می‌توانید با همان اطلاعات کاربری به دیوان وارد شوید.
</p>
</td>
</tr>

View File

@ -122,7 +122,7 @@ namespace GanjooRazor.Pages
anyParamsGiven |= Language != null;
Language ??= "fa-IR";
Language ??= "ur-PK";
string f = Request.Query["f"];
anyParamsGiven |= f != null;
@ -272,7 +272,7 @@ namespace GanjooRazor.Pages
}
if (Language != "fa-IR")
if (Language != "ur-PK")
{
var langModel = Languages.Where(l => l.Code == Language).FirstOrDefault();
if (langModel != null)

View File

@ -34,10 +34,10 @@
دیوان در حال به‌روزرسانی است. لطفاً لحظاتی دیگر مجدداً تلاش کنید.
</p>
<div class="century"><a href="https://dg.ganjoor.net">دریافت دیوان رومیزی</a></div>
<div class="century">دریافت دیوان رومیزی</div>
<div class="century"><a href="http://pozh.org/saaghar/">دریافت ساغر</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/android/">نرم‌افزارهای اندرویدی سازگار با دیوان</a></div>
<div class="century"><a href="https://blog.ganjoor.net/category/ios/">نرم‌افزارهای سازگار با دیوان برای آیفون و آی‌پد</a></div>
<div class="century">نرم‌افزارهای اندرویدی سازگار با دیوان</div>
<div class="century">نرم‌افزارهای سازگار با دیوان برای آیفون و آی‌پد</div>
<div class="century"><a href="https://github.com/ganjoor/">نرم‌افزارهای بازمتن دیوان</a></div>
</body>

View File

@ -2,7 +2,7 @@
@model GanjooRazor.Pages.RandomModel
@{
Layout = null;
ViewData["Title"] = "بیت تصادفی";
ViewData["Title"] = "اتفاقی شعر";
}
<!DOCTYPE html>
<html lang="ur-PK" dir="rtl">
@ -15,20 +15,28 @@
</head>
<body id="tb">
<div id="content">
<div id="ganjoor" />
<div id="ganjoor">
@if (Model.Poem != null)
{
@* first couplet (or first two lines) of a random poem *@
foreach (var verse in Model.Poem.Verses.Take(2))
{
<p>@verse.Text</p>
}
<p><a href="@Model.Poem.FullUrl" target="_top">@Model.Poem.Category?.Poet?.Nickname</a></p>
}
</div>
</div>
<div id="footer">
<p>
<a class="cursor-pointer" role="button" onclick="window.location.reload()">بیتی دیگر</a>
<a class="cursor-pointer" role="button" onclick="window.location.reload()">ایک اور شعر</a>
</p>
<p>
برای مطالعهٔ متن کامل شعر روی نام سخنور بزنید.
</p>
<p>
به کمک <a href="https://c.ganjoor.net">کدهای دیوان</a>
</p>
</div>
<script type="text/javascript" src="https://c.ganjoor.net/beyt.php"></script>
@if (ViewData["TrackingScript"] != null && !string.IsNullOrEmpty(ViewData["TrackingScript"].ToString()))
{

View File

@ -1,27 +1,37 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using RMuseum.Models.Ganjoor.ViewModels;
using System.Net.Http;
using System.Threading.Tasks;
namespace GanjooRazor.Pages
{
/// <summary>
/// random couplet (diwan: rendered from our own API instead of upstream's external c.ganjoor.net widget)
/// </summary>
public class RandomModel : PageModel
{
/// <summary>
/// configration file reader (appsettings.json)
/// </summary>
private readonly IConfiguration _configuration;
private readonly HttpClient _httpClient;
/// <summary>
/// constructor
/// </summary>
/// <param name="configuration"></param>
public RandomModel(IConfiguration configuration)
public RandomModel(IConfiguration configuration, HttpClient httpClient)
{
_configuration = configuration;
_httpClient = httpClient;
}
public void OnGet()
/// <summary>
/// random poem, null when the API is unreachable or empty
/// </summary>
public GanjoorPoemCompleteViewModel Poem { get; set; }
public async Task OnGetAsync()
{
ViewData["TrackingScript"] = _configuration["TrackingScript"];
var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/random?poetId=0");
if (response.IsSuccessStatusCode)
Poem = JsonConvert.DeserializeObject<GanjoorPoemCompleteViewModel>(await response.Content.ReadAsStringAsync());
}
}
}

View File

@ -2733,61 +2733,6 @@ function loadContributionsUsers(dataType, pageNumber) {
});
}
function loadTopVisits(url) {
if (document.getElementById("top-visits") != null) {
return;
}
if (document.getElementById("load-topvisits") != null) {
document.getElementById("load-topvisits").remove();
}
var divParent = document.getElementById('topvisits-placeholder');
var imgElementId = 'loadingtopvisitsimg';
divParent.innerHTML = '<div class="bnumdiv" id="remove-this-topvisits"><img id="' + imgElementId + '" src="/image/loading.gif" alt="بارگذاری"/></div>';
$.ajax({
type: "GET",
url: '?Handler=TopVisits&url=' + url,
error: function () {
if (document.getElementById("remove-this-topvisits") != null) {
document.getElementById("remove-this-topvisits").remove();
}
},
success: function (data) {
if (document.getElementById("remove-this-topvisits") != null) {
document.getElementById("remove-this-topvisits").remove();
$(data).appendTo(divParent);
plotChart('top-visits');
}
},
});
}
function load7DaysVisits(url) {
if (document.getElementById("7days-visits") != null) {
return;
}
if (document.getElementById("load-7daysvisits") != null) {
document.getElementById("load-7daysvisits").remove();
}
var divParent = document.getElementById('7daysvisits-placeholder');
var imgElementId = 'loading7daysvisitsimg';
divParent.innerHTML = '<div class="bnumdiv" id="remove-this-7daysvisits"><img id="' + imgElementId + '" src="/image/loading.gif" alt="بارگذاری"/></div>';
$.ajax({
type: "GET",
url: '?Handler=SevenDaysVisits&url=' + url,
error: function () {
if (document.getElementById("remove-this-7daysvisits") != null) {
document.getElementById("remove-this-7daysvisits").remove();
}
},
success: function (data) {
if (document.getElementById("remove-this-7daysvisits") != null) {
document.getElementById("remove-this-7daysvisits").remove();
$(data).appendTo(divParent);
plotChart('7days-visits');
}
},
});
}
// Turns a plain text <input> into a "search as you type" picker over a small
// in-memory location catalog ({id, name, latitude, longitude}[]), instead of a
// long <select> the user has to scroll/search through by hand. If nothing in

View File

@ -387,9 +387,9 @@
'<h3 style="margin:4px 0 10px 0">' + escapeHtml(personLabel(p)) + '</h3>';
if (p.birthYearInLHijri || p.deathYearInLHijri) {
html += '<p style="margin:4px 0"><small>';
if (p.birthYearInLHijri) html += 'زاده ' + p.birthYearInLHijri.toLocaleString('fa-IR') + (p.validBirthDate ? '' : ' (تخمینی)');
if (p.birthYearInLHijri) html += 'زاده ' + p.birthYearInLHijri.toLocaleString('ur-PK-u-nu-arabext') + (p.validBirthDate ? '' : ' (تخمینی)');
if (p.birthYearInLHijri && p.deathYearInLHijri) html += ' — ';
if (p.deathYearInLHijri) html += 'وفات ' + p.deathYearInLHijri.toLocaleString('fa-IR') + (p.validDeathDate ? '' : ' (تخمینی)');
if (p.deathYearInLHijri) html += 'وفات ' + p.deathYearInLHijri.toLocaleString('ur-PK-u-nu-arabext') + (p.validDeathDate ? '' : ' (تخمینی)');
html += '</small></p>';
}
if (p.description) {

View File

@ -74,7 +74,7 @@ var $tooltip = $('<div>').addClass('tooltip').css({
});
// Append links and close button to tooltip
$tooltip.append($meaning, $abjad, $quran, $search, $google, $vazn, $close);
$tooltip.append($meaning, $quran, $search, $google, $vazn, $close); // diwan: abjad (ganjoor service) dropped
// Append tooltip to body
$(document.body).append($tooltip);
@ -130,13 +130,8 @@ function vaabSelectionChanged() {
// Update tooltip links
$meaning.attr({
href: 'https://www.vajehyab.com/?q=' + encodeURI(text),
title: 'جستجو در واژه‌یاب',
target: '_blank',
});
$abjad.attr({
href: 'https://abjad.ganjoor.net/?q=' + encodeURI(text) + '&r=' + window.location.href,
title: 'محاسبه ابجد معادل عبارت',
href: 'https://ur.wiktionary.org/w/index.php?search=' + encodeURI(text),
title: 'ویکی لغت میں معنی',
target: '_blank',
});
$search.attr({

View File

@ -134,7 +134,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.ArtifactEntityShortName,
RMuseumSecurableItem.ViewDraftOperationShortName
);
@ -646,7 +646,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.ArtifactEntityShortName,
RMuseumSecurableItem.ToAwaitingStatusOperationShortName
);
@ -659,7 +659,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.ArtifactEntityShortName,
RMuseumSecurableItem.PublishOperationShortName
);
@ -1593,7 +1593,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.NoteEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -1631,7 +1631,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.NoteEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);

View File

@ -2324,7 +2324,7 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<GanjoorPoemCompleteViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetSimilarPoemsAsync([FromQuery] PagingParameterModel paging, string metre, string rhyme, int poetId = 0, int catId = 0, string language = "fa-IR", GanjoorPoemFormat format = GanjoorPoemFormat.Unknown, string term = null, int coupletCountsFrom = 0, int coupletCountsTo = 0, int[] e = null)
public async Task<IActionResult> GetSimilarPoemsAsync([FromQuery] PagingParameterModel paging, string metre, string rhyme, int poetId = 0, int catId = 0, string language = "ur-PK", GanjoorPoemFormat format = GanjoorPoemFormat.Unknown, string term = null, int coupletCountsFrom = 0, int coupletCountsTo = 0, int[] e = null)
{
var pagedResult = await _ganjoorService.GetSimilarPoemsAsync(paging, metre, rhyme, poetId == 0 ? null : poetId, catId == 0 ? null : catId, language, format, term, coupletCountsFrom, coupletCountsTo, e == null ? [] : e);
if (!string.IsNullOrEmpty(pagedResult.ExceptionString))

View File

@ -128,7 +128,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -339,7 +339,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -406,7 +406,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -429,7 +429,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -555,7 +555,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -778,7 +778,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
@ -843,7 +843,7 @@ namespace RMuseum.Controllers
(
loggedOnUserId,
sessionId,
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "fa-IR",
User.Claims.Any(c => c.Type == "Language") ? User.Claims.First(c => c.Type == "Language").Value : "ur-PK",
RMuseumSecurableItem.AudioRecitationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);

View File

@ -526,7 +526,7 @@ namespace RMuseum.Services
/// <param name="poetId"></param>
/// <param name="recitation"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorPoemCompleteViewModel>> Faal(int poetId = 2, bool recitation = true);
Task<RServiceResult<GanjoorPoemCompleteViewModel>> Faal(int poetId = 0, bool recitation = true);
/// <summary>
/// import from sqlite

View File

@ -52,7 +52,7 @@ namespace RMuseum.Services.Implementation
// the fa-IR comparer can't be translated to SQL, so sorting happens here in memory -
// the same approach GetPoets() above uses, fine for a list this small (< 200 rows)
StringComparer fa = StringComparer.Create(new CultureInfo("fa-IR"), true);
StringComparer fa = StringComparer.Create(new CultureInfo("ur-PK"), true);
books.Sort((a, b) => fa.Compare(a.Name, b.Name));
return new RServiceResult<GanjoorBookViewModel[]>(books.ToArray());

View File

@ -290,7 +290,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\">{sourcesByType[i].SourceType}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(sourcesByType[i].CoupletsCount)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(sourcesByType[i].CoupletsCount * 100.0 / totalCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(sourcesByType[i].CoupletsCount * 100.0 / totalCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -315,7 +315,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/sources/{sources[i].UrlSlug}\">{sources[i].FullName}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(sources[i].CoupletsCount)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(sources[i].CoupletsCount * 100.0 / totalCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(sources[i].CoupletsCount * 100.0 / totalCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}

View File

@ -76,7 +76,7 @@ namespace RMuseum.Services.Implementation
Username = naskbanUserName,
Password = naskbanPassword,
ClientAppName = "Ganjoor API",
Language = "fa-IR"
Language = "ur-PK"
};
var loginResponse = await client.PostAsync("https://api.naskban.ir/api/users/login", new StringContent(JsonConvert.SerializeObject(loginViewModel), Encoding.UTF8, "application/json"));
@ -336,7 +336,7 @@ namespace RMuseum.Services.Implementation
Username = naskbanUserName,
Password = naskbanPassword,
ClientAppName = "Ganjoor API",
Language = "fa-IR"
Language = "ur-PK"
};
var loginResponse = await client.PostAsync("https://api.naskban.ir/api/users/login", new StringContent(JsonConvert.SerializeObject(loginViewModel), Encoding.UTF8, "application/json"));
@ -579,7 +579,7 @@ namespace RMuseum.Services.Implementation
Username = naskbanUserName,
Password = naskbanPassword,
ClientAppName = "Ganjoor API",
Language = "fa-IR"
Language = "ur-PK"
};
var loginResponse = await client.PostAsync("https://api.naskban.ir/api/users/login", new StringContent(JsonConvert.SerializeObject(loginViewModel), Encoding.UTF8, "application/json"));

View File

@ -80,7 +80,7 @@ namespace RMuseum.Services.Implementation
Username = naskbanUserName,
Password = naskbanPassword,
ClientAppName = "Ganjoor API",
Language = "fa-IR"
Language = "ur-PK"
};
var loginResponse = await client.PostAsync("https://api.naskban.ir/api/users/login", new StringContent(JsonConvert.SerializeObject(loginViewModel), Encoding.UTF8, "application/json"));

View File

@ -77,7 +77,7 @@ namespace RMuseum.Services.Implementation
var wholePoemSections = await context.GanjoorPoemSections.Include(v => v.Poem).ThenInclude(p => p.Cat).ThenInclude(c => c.Poet).AsNoTracking()
.Where(s => s.PoetId == poet.Id && (string.IsNullOrEmpty(s.Language) || s.Language == "fa-IR") && s.Poem.Cat.Poet.Published && s.SectionType == PoemSectionType.WholePoem)
.Where(s => s.PoetId == poet.Id && (string.IsNullOrEmpty(s.Language) || s.Language == "ur-PK") && s.Poem.Cat.Poet.Published && s.SectionType == PoemSectionType.WholePoem)
.Select(s => new { s.PoemId, s.Index, s.GanjoorMetreId, s.VerseType })
.ToListAsync();
@ -180,7 +180,7 @@ namespace RMuseum.Services.Implementation
$"<a href=\"/simi/?v={Uri.EscapeDataString(rhythms.Where(r => r.Id == rhythmsCoupletCounts[i].GanjoorMetreId).Single().Rhythm)}&amp;a={poet.Id}\">{rhythms.Where(r => r.Id == rhythmsCoupletCounts[i].GanjoorMetreId).Single().Rhythm}</a>";
htmlText += $"<td class=\"c2\">{rhythm}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(rhythmsCoupletCounts[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -204,15 +204,15 @@ namespace RMuseum.Services.Implementation
{
new LanguageCoupletCount()
{
Language = "fa-IR",
Language = "ur-PK",
Count = 0
}
};
foreach (var item in linqResult)
{
if (item.Language == "fa-IR" || string.IsNullOrEmpty(item.Language))
if (item.Language == "ur-PK" || string.IsNullOrEmpty(item.Language))
{
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "fa-IR").Single();
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "ur-PK").Single();
fa.Count += item.Count;
}
else
@ -249,7 +249,7 @@ namespace RMuseum.Services.Implementation
string language = langModel.Name;
htmlText += $"<td class=\"c2\"><a href=\"/simi/?l={Uri.EscapeDataString(langModel.Code)}&amp;a={poet.Id}\">{language}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(languagesCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -318,7 +318,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?f={(int)formatCoupletsCountsUnprocessed[i].Format}&amp;a={poet.Id}\">{GanjoorPoemFormatConvertor.GetString(formatCoupletsCountsUnprocessed[i].Format)}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(formatCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -365,7 +365,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?a={poet.Id}&amp;c1={coupletCountsList[i].CoupletCount}&amp;c2={coupletCountsList[i].CoupletCount}\">{coupletCountsList[i].CoupletCount.ToPersianNumbers()}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(coupletCountsList[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -405,7 +405,7 @@ namespace RMuseum.Services.Implementation
int wholeCoupletsCount = catsCoupletCounts[0].Count;
var wholePoemSections = await context.GanjoorPoemSections.Include(v => v.Poem).ThenInclude(p => p.Cat).ThenInclude(c => c.Poet).AsNoTracking()
.Where(s => catIdList.Contains(s.Poem.CatId) && (string.IsNullOrEmpty(s.Language) || s.Language == "fa-IR") && s.Poem.Cat.Poet.Published && s.SectionType == PoemSectionType.WholePoem)
.Where(s => catIdList.Contains(s.Poem.CatId) && (string.IsNullOrEmpty(s.Language) || s.Language == "ur-PK") && s.Poem.Cat.Poet.Published && s.SectionType == PoemSectionType.WholePoem)
.Select(s => new { s.PoemId, s.Index, s.GanjoorMetreId, s.VerseType })
.ToListAsync();
@ -518,7 +518,7 @@ namespace RMuseum.Services.Implementation
$"<a href=\"/simi/?v={Uri.EscapeDataString(rhythms.Where(r => r.Id == rhythmsCoupletCounts[i].GanjoorMetreId).Single().Rhythm)}&amp;a={poetId}&amp;c={catId}\">{rhythms.Where(r => r.Id == rhythmsCoupletCounts[i].GanjoorMetreId).Single().Rhythm}</a>";
htmlText += $"<td class=\"c2\">{rhythm}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(rhythmsCoupletCounts[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -542,15 +542,15 @@ namespace RMuseum.Services.Implementation
{
new LanguageCoupletCount()
{
Language = "fa-IR",
Language = "ur-PK",
Count = 0
}
};
foreach (var item in linqResult)
{
if (item.Language == "fa-IR" || string.IsNullOrEmpty(item.Language))
if (item.Language == "ur-PK" || string.IsNullOrEmpty(item.Language))
{
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "fa-IR").Single();
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "ur-PK").Single();
fa.Count += item.Count;
}
else
@ -587,7 +587,7 @@ namespace RMuseum.Services.Implementation
string language = langModel.Name;
htmlText += $"<td class=\"c2\"><a href=\"/simi/?l={Uri.EscapeDataString(langModel.Code)}&amp;a={poetId}&amp;c={catId}\">{language}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(languagesCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -656,7 +656,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?f={(int)formatCoupletsCountsUnprocessed[i].Format}&amp;a={poetId}&amp;c={catId}\">{GanjoorPoemFormatConvertor.GetString(formatCoupletsCountsUnprocessed[i].Format)}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(formatCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -703,7 +703,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?a={poetId}&amp;c={catId}&amp;c1={coupletCountsList[i].CoupletCount}&amp;c2={coupletCountsList[i].CoupletCount}\">{coupletCountsList[i].CoupletCount.ToPersianNumbers()}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(coupletCountsList[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -774,7 +774,7 @@ namespace RMuseum.Services.Implementation
}
subCatsHtmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(subCatWholeCoupletsCount)}</td>{Environment.NewLine}";
subCatsHtmlText += $"<td class=\"c4\">{(subCatWholeCoupletsCount * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
subCatsHtmlText += $"<td class=\"c4\">{(subCatWholeCoupletsCount * 100.0 / wholeCoupletsCount).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
subCatsHtmlText += $"</tr>{Environment.NewLine}";
subCatIndex++;
@ -862,15 +862,15 @@ namespace RMuseum.Services.Implementation
{
new LanguageCoupletCount()
{
Language = "fa-IR",
Language = "ur-PK",
Count = 0
}
};
foreach (var item in linqResult)
{
if (item.Language == "fa-IR" || string.IsNullOrEmpty(item.Language))
if (item.Language == "ur-PK" || string.IsNullOrEmpty(item.Language))
{
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "fa-IR").Single();
var fa = languagesCoupletsCountsUnprocessed.Where(l => l.Language == "ur-PK").Single();
fa.Count += item.Count;
}
else
@ -926,7 +926,7 @@ namespace RMuseum.Services.Implementation
await jobProgressServiceEF.UpdateJob(job.Id, 1, "Counting whole sections");
var wholePoemSections = await context.GanjoorPoemSections.Include(v => v.Poem).ThenInclude(p => p.Cat).ThenInclude(c => c.Poet).AsNoTracking()
.Where(s => s.Poem.Cat.Poet.Published && (string.IsNullOrEmpty(s.Language) || s.Language == "fa-IR") && s.SectionType == PoemSectionType.WholePoem)
.Where(s => s.Poem.Cat.Poet.Published && (string.IsNullOrEmpty(s.Language) || s.Language == "ur-PK") && s.SectionType == PoemSectionType.WholePoem)
.Select(s => new { s.PoemId, s.Index, s.GanjoorMetreId, Versetype = s.VerseType })
.ToListAsync();
@ -1023,7 +1023,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"{(await context.GanjoorCategories.Where(c => c.ParentId == null && c.PoetId == poetsCoupletCounts[i].PoetId).SingleAsync()).FullUrl}\">{poets.Where(p => p.Id == poetsCoupletCounts[i].PoetId).Single().Nickname}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(poetsCoupletCounts[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(poetsCoupletCounts[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(poetsCoupletCounts[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -1064,7 +1064,7 @@ namespace RMuseum.Services.Implementation
string language = langModel.Description;
htmlText += $"<td class=\"c2\"><a href=\"/simi/?l={Uri.EscapeDataString(langModel.Code)}\">{language}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(languagesCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(languagesCoupletsCountsUnprocessed[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -1102,7 +1102,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?f={(int)formatCoupletsCountsUnprocessed[i].Format}\">{GanjoorPoemFormatConvertor.GetString(formatCoupletsCountsUnprocessed[i].Format)}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(formatCoupletsCountsUnprocessed[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(formatCoupletsCountsUnprocessed[i].Count * 100.0 / sumPoetsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -1151,7 +1151,7 @@ namespace RMuseum.Services.Implementation
$"<a href=\"/simi/?v={Uri.EscapeDataString(rhythm.Rhythm)}\">{rhythms.Where(r => r.Id == rhythmsCoupletCounts[i].GanjoorMetreId).Single().Rhythm}</a>";
htmlText += $"<td class=\"c2\">{rhythmName}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(rhythmsCoupletCounts[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(rhythmsCoupletCounts[i].Count * 100.0 / sumRhythmsCouplets).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}
@ -1199,7 +1199,7 @@ namespace RMuseum.Services.Implementation
htmlText += $"<td class=\"c1\">{(i + 1).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c2\"><a href=\"/simi/?c1={coupletCountsList[i].CoupletCount}&amp;c2={coupletCountsList[i].CoupletCount}\">{coupletCountsList[i].CoupletCount.ToPersianNumbers()}</a></td>{Environment.NewLine}";
htmlText += $"<td class=\"c3\">{LanguageUtils.FormatMoney(coupletCountsList[i].Count)}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("fa-IR")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"<td class=\"c4\">{(coupletCountsList[i].Count * 100.0 / cc).ToString("N2", new CultureInfo("ur-PK")).ToPersianNumbers()}</td>{Environment.NewLine}";
htmlText += $"</tr>{Environment.NewLine}";
}

View File

@ -603,7 +603,7 @@ namespace RMuseum.Services.Implementation
options == GanjoorTOC.AlphabeticWithSecondVerse
)
{
var fa = new CultureInfo("fa-IR");
var fa = new CultureInfo("ur-PK");
if (foundLastChars.Contains("و") && foundLastChars.Contains("ی") && foundLastChars.IndexOf("ه") == (foundLastChars.IndexOf("و") - 1))
{
foundLastChars.Sort((a, b) => a == "ه" && b == "و" ? -1 : a == "و" && b == "ه" ? 1 : fa.CompareInfo.Compare(a, b));

View File

@ -79,7 +79,7 @@ namespace RMuseum.Services.Implementation
.AsNoTracking()
.ToListAsync();
StringComparer fa = StringComparer.Create(new CultureInfo("fa-IR"), true);
StringComparer fa = StringComparer.Create(new CultureInfo("ur-PK"), true);
res.Sort((a, b) => fa.Compare(a.Nickname, b.Nickname));
poets = res.ToArray();
if (AggressiveCacheEnabled)
@ -2611,87 +2611,11 @@ namespace RMuseum.Services.Implementation
/// <returns></returns>
private int _GetRandomPoemId(int poetId, int loopBreaker = 0)
{
if (loopBreaker > 10)
return 0;
Random r = new Random(DateTime.Now.Millisecond);
switch (poetId)
{
case 2://حافظ
{
//this is magic number based method!
int startPoemId = 2130;
int endPoemId = 2624 + 1; //one is added for مژده ای دل که مسیحا نفسی می‌آید
int poemId = r.Next(startPoemId, endPoemId);
if (poemId == endPoemId)
{
poemId = 33179;//مژده ای دل که مسیحا نفسی می‌آید
}
return poemId;
}
case 3://خیام
return r.Next(1119, 1296);
case 26://ابوسعید
return r.Next(20509, 21232);
case 22://صائب
return r.Next(52198, 59193);
case 7://سعدی
return r.Next(9323, 9959);
case 28://بابا طاهر
return r.Next(21309, 21674);
case 5://مولانا
return r.Next(2625, 5853);
case 19://اوحدی
return r.Next(16955, 17839);
case 35://شهریار
return r.Next(27065, 27224);
case 20://خواجو
return r.Next(18288, 19219);
case 32://فروغی
return r.Next(22996, 23511);
case 21://عراقی
return r.Next(19222, 19526);
case 40://سلمان
return r.Next(38411, 39320);
case 29://محتشم
return r.Next(21744, 22338);
case 34://امیرخسرو
return r.Next(60582, 62578);
case 31://سیف
return r.Next(62837, 63418);
case 33://عبید
return r.Next(23551, 23656);
case 25://هاتف
return r.Next(20275, 20364);
case 41://رهی
return r.Next(39441, 39546);
}
int[] poetIdArray = new int[]
{
2,
3,
26,
22,
7,
28,
5,
19,
35,
20,
23,
21,
40,
29,
34,
31,
33,
25,
41
};
return _GetRandomPoemId(poetIdArray[r.Next(0, poetIdArray.Length - 1)], loopBreaker++);
// diwan: data-driven (upstream used hard-coded id ranges of Persian poets); 0 = any poet
var poems = _context.GanjoorPoems.AsNoTracking().Where(p => p.Published);
if (poetId != 0)
poems = poems.Where(p => p.Cat.PoetId == poetId);
return poems.OrderBy(p => Guid.NewGuid()).Select(p => p.Id).FirstOrDefault();
}
@ -2702,7 +2626,7 @@ namespace RMuseum.Services.Implementation
/// <param name="poetId"></param>
/// <param name="recitation"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorPoemCompleteViewModel>> Faal(int poetId = 2, bool recitation = true)
public async Task<RServiceResult<GanjoorPoemCompleteViewModel>> Faal(int poetId = 0, bool recitation = true)
{
int poemId = _GetRandomPoemId(poetId);
var poem = await _context.GanjoorPoems.Where(p => p.Id == poemId).AsNoTracking().SingleOrDefaultAsync();
@ -2778,7 +2702,7 @@ namespace RMuseum.Services.Implementation
&&
(exceptPoetId.Length == 0 || !exceptPoetId.Contains(s.PoetId ?? 0))
&&
((language == "fa-IR" && string.IsNullOrEmpty(s.Language)) || s.Language == language)
((language == "ur-PK" && string.IsNullOrEmpty(s.Language)) || s.Language == language)
&&
(string.IsNullOrEmpty(metre) || (metre == "null" && s.GanjoorMetreId == null) || (!string.IsNullOrEmpty(metre) && s.GanjoorMetre.Rhythm == metre))
&&
@ -2872,14 +2796,14 @@ namespace RMuseum.Services.Implementation
{
if (string.IsNullOrEmpty(language))
{
language = "fa-IR";
language = "ur-PK";
}
var source =
_context.GanjoorPoemSections.Include(s => s.Poem).Include(s => s.Poet).Include(s => s.GanjoorMetre)
.Where(s =>
(poetId == null || s.PoetId == poetId)
&&
((language == "fa-IR" && string.IsNullOrEmpty(s.Language)) || s.Language == language)
((language == "ur-PK" && string.IsNullOrEmpty(s.Language)) || s.Language == language)
&&
s.SectionType == PoemSectionType.WholePoem
)

View File

@ -292,7 +292,7 @@ namespace RMuseum.Services.Implementation
public static string FormatMoney(decimal amount)
{
return amount.ToString("N0", new CultureInfo("fa-IR")).ToPersianNumbers();
return amount.ToString("N0", new CultureInfo("ur-PK")).ToPersianNumbers();
}
/// <summary>