people tags #387

This commit is contained in:
Hamid Reza Mohammadi 2026-10-03 08:10:12 +03:30
parent 854bae2873
commit 5ce8973ca3
15 changed files with 100 additions and 100 deletions

View File

@ -352,7 +352,7 @@ else
}
@if (summaryPersonCount > 0)
{
<span class="up-badge up-badge--primary">برچسب شخصیت دارد (@summaryPersonCount.ToPersianNumbers())</span>
<span class="up-badge up-badge--primary">برچسب نامبرده دارد (@summaryPersonCount.ToPersianNumbers())</span>
}
</td>
</tr>
@ -887,7 +887,7 @@ else
var isPersonTag = geoTag.PersonId != null || !string.IsNullOrEmpty(geoTag.SuggestedPersonGraphJson) || (existingTagForKindCheck != null && existingTagForKindCheck.PersonId != null);
<tr>
<td colspan="2">
@(isPersonTag ? "برچسب شخصیت" : "برچسب جغرافیایی/تاریخی")
@(isPersonTag ? "برچسب نامبرده" : "برچسب جغرافیایی/تاریخی")
@{
var geoCouplet = geoTag.CoupletIndex == null ? null : (Model.Couplets ?? Array.Empty<Tuple<int, string>>()).Where(c => c.Item1 == geoTag.CoupletIndex).Select(c => c.Item2).FirstOrDefault();
}
@ -957,12 +957,12 @@ else
<p class="green-color">
@if (geoTag.PersonId != null)
{
<text>شخصیت: @(geoTag.Person != null ? geoTag.Person.Name : $"شخصیت #{geoTag.PersonId}")</text>
<a href="/User/SuggestPersonEdit?id=@geoTag.PersonId" target="_blank" class="up-icon-btn" title="پیشنهاد ویرایش این شخصیت" aria-label="پیشنهاد ویرایش این شخصیت">✎</a>
<text>نامبرده: @(geoTag.Person != null ? geoTag.Person.Name : $"نامبرده #{geoTag.PersonId}")</text>
<a href="/User/SuggestPersonEdit?id=@geoTag.PersonId" target="_blank" class="up-icon-btn" title="پیشنهاد ویرایش این نامبرده" aria-label="پیشنهاد ویرایش این نامبرده">✎</a>
}
else if (personGraph?.Person != null)
{
<text>شخصیت جدید: @personGraph.Person.Name</text>
<text>نامبردۀ جدید: @personGraph.Person.Name</text>
if (personGraph.Relations != null && personGraph.Relations.Count > 0)
{
<text> (@personGraph.Relations.Count.ToPersianNumbers() رابطهٔ همراه)</text>
@ -970,7 +970,7 @@ else
}
else if (personGraphError != null)
{
<span class="red-color">خطا در تفسیر اطلاعات شخصیت پیشنهادی: @personGraphError</span>
<span class="red-color">خطا در تفسیر اطلاعات نامبردۀ پیشنهادی: @personGraphError</span>
}
</p>
@if (!string.IsNullOrEmpty(geoTag.SuggestionNote))
@ -1015,17 +1015,17 @@ else
<tr>
<td colspan="2">
<p class="up-hint">
اگر کاربر شخصیت را اشتباه تشخیص داده (مثلاً شخصیتی که از قبل در فهرست است را به‌عنوان شخصیت جدید پیشنهاد کرده)، به‌جای رد کردن می‌توانید آن را به شخصیت موجود متصل کنید؛
برای شخصیت تازه فقط نام قابل اصلاح است - اصلاح روابط/تاریخ‌ها نیازمند رد کردن و ارسال دوبارهٔ پیشنهاد توسط کاربر است:
اگر کاربر نامبرده را اشتباه تشخیص داده (مثلاً نامبرده‌ای که از قبل در فهرست است را به‌عنوان نامبردۀ جدید پیشنهاد کرده)، به‌جای رد کردن می‌توانید آن را به نامبردۀ موجود متصل کنید؛
برای نامبردۀ تازه فقط نام قابل اصلاح است - اصلاح روابط/تاریخ‌ها نیازمند رد کردن و ارسال دوبارهٔ پیشنهاد توسط کاربر است:
</p>
<label for="geotag@(geoIndex)_person_search">اتصال به شخصیت موجود در فهرست (در صورت وجود اشتباه در تشخیص شخصیت):</label>
<label for="geotag@(geoIndex)_person_search">اتصال به نامبردۀ موجود در فهرست (در صورت وجود اشتباه در تشخیص نامبرده):</label>
<div class="up-autocomplete-wrap">
<input type="text" id="geotag@(geoIndex)_person_search" autocomplete="off" placeholder="نام شخصیت را تایپ کنید..."
<input type="text" id="geotag@(geoIndex)_person_search" autocomplete="off" placeholder="نام نامبرده را تایپ کنید..."
value="@(geoTag.PersonId != null ? (Model.People ?? new List<GanjoorRelatedPerson>()).Where(p => p.Id == geoTag.PersonId).Select(p => p.Name).FirstOrDefault() : null)" />
<input type="hidden" id="geotag@(geoIndex)_person_select" name="geotag@(geoIndex)_person_select" value="@(geoTag.PersonId ?? 0)" />
<div id="geotag@(geoIndex)_person_results" class="up-autocomplete-results" style="display:none;"></div>
</div>
<p class="up-hint">برای اتصال به یک شخصیت موجود، نام او را تایپ کنید و از فهرست انتخاب کنید؛ برای رها کردن اتصال و پیشنهاد به‌عنوان شخصیت جدید، این فیلد را خالی کنید.</p>
<p class="up-hint">برای اتصال به یک نامبردۀ موجود، نام او را تایپ کنید و از فهرست انتخاب کنید؛ برای رها کردن اتصال و پیشنهاد به‌عنوان نامبردۀ جدید، این فیلد را خالی کنید.</p>
<script>
setupPersonAutocomplete(
document.getElementById('geotag@(geoIndex)_person_search'),
@ -1040,7 +1040,7 @@ else
{
<div id="geotag@(geoIndex)_new_person_fields">
<br>
<label for="geotag@(geoIndex)_person_name">نام اصلاح‌شدهٔ شخصیت:</label>
<label for="geotag@(geoIndex)_person_name">نام اصلاح‌شدهٔ نامبرده:</label>
<input type="text" id="geotag@(geoIndex)_person_name" name="geotag@(geoIndex)_person_name" size="30" />
</div>
}

View File

@ -511,7 +511,7 @@ namespace GanjooRazor.Areas.Admin.Pages
}
catch (Exception)
{
return new BadRequestObjectResult("برچسب شخصیت پیشنهادی قابل تفسیر نیست.");
return new BadRequestObjectResult("برچسب نامبردۀ پیشنهادی قابل تفسیر نیست.");
}
}
}

View File

@ -4,7 +4,7 @@
@using DNTPersianUtils.Core
@{
Layout = "_AdminLayout";
ViewData["Title"] = "بازبینی پیشنهادهای ویرایش شخصیت‌ها";
ViewData["Title"] = "بازبینی پیشنهادهای ویرایش نامبردگان";
}
<div class="up-page-header">
@ -48,8 +48,8 @@ else
@if (s.SuggestedForDeletion)
{
<div class="up-alert up-alert--danger">
<strong>این پیشنهاد درخواست حذف کامل شخصیت «@p.Name» است.</strong>
در صورت تأیید، این شخصیت و همهٔ نسبت‌های خویشاوندی/وابستگی‌های آن حذف خواهد شد و هرگونه پیشنهاد در حال بررسی مرتبط با آن‌ها به طور خودکار رد می‌شود. فیلدهای زیر در این حالت نادیده گرفته می‌شوند.
<strong>این پیشنهاد درخواست حذف کامل نامبردۀ «@p.Name» است.</strong>
در صورت تأیید، این نامبرده و همهٔ نسبت‌های خویشاوندی/وابستگی‌های آن حذف خواهد شد و هرگونه پیشنهاد در حال بررسی مرتبط با آن‌ها به طور خودکار رد می‌شود. فیلدهای زیر در این حالت نادیده گرفته می‌شوند.
</div>
}
else

View File

@ -284,16 +284,16 @@
// parent). Non-family affiliations default the other way around - see
// togglePersonRelativeKind(), which flips this select's value on kind change.
'<select id="person-relative-direction-' + idx + '" onchange="updatePersonRelativeHint(' + idx + ')">' +
'<option value="otherFirst" selected="selected">شخصیت دیگر، طرف اول رابطه است (مثلاً پدر/وزیر این شخصیت جدید)</option>' +
'<option value="newFirst">این شخصیت جدید، طرف اول رابطه است (مثلاً پدر/وزیر طرف دوم)</option>' +
'<option value="otherFirst" selected="selected">نامبردۀ دیگر، طرف اول رابطه است (مثلاً پدر/وزیر این نامبردۀ جدید)</option>' +
'<option value="newFirst">این نامبردۀ جدید، طرف اول رابطه است (مثلاً پدر/وزیر طرف دوم)</option>' +
'</select>' +
'</div>' +
'</div>' +
'<div class="up-field-row">' +
'<div class="up-field">' +
'<label>شخصیت دیگر (باید از قبل در فهرست موجود باشد)</label>' +
'<label>نامبردۀ دیگر (باید از قبل در فهرست موجود باشد)</label>' +
'<div class="up-autocomplete-wrap">' +
'<input type="text" id="person-relative-person-search-' + idx + '" autocomplete="off" placeholder="نام شخصیت را تایپ کنید..." oninput="updatePersonRelativeHint(' + idx + ')" />' +
'<input type="text" id="person-relative-person-search-' + idx + '" autocomplete="off" placeholder="نام نامبرده را تایپ کنید..." oninput="updatePersonRelativeHint(' + idx + ')" />' +
'<input type="hidden" id="person-relative-person-id-' + idx + '" />' +
'<div id="person-relative-person-results-' + idx + '" class="up-autocomplete-results" style="display:none;"></div>' +
'</div>' +
@ -319,7 +319,7 @@
updatePersonRelativeHint(idx);
},
function (typedText) {
upToast('این شخصیت در فهرست نیست. طرف دیگر یک رابطه باید از قبل تعریف‌شده باشد؛ برای دو شخصیت تازه، ابتدا این فرم را برای یکی از آن‌ها به‌صورت جدا تکمیل و ثبت کنید.', 'error');
upToast('این نامبرده در فهرست نیست. طرف دیگر یک رابطه باید از قبل تعریف‌شده باشد؛ برای دو نامبردۀ تازه، ابتدا این فرم را برای یکی از آن‌ها به‌صورت جدا تکمیل و ثبت کنید.', 'error');
}
);
@ -390,8 +390,8 @@
? $('#person-relative-familytype-' + idx).val()
: $('#person-relative-affiliationtype-' + idx).val();
var direction = $('#person-relative-direction-' + idx).val();
var otherName = ($('#person-relative-person-search-' + idx).val() || '').trim() || 'شخصیت دیگر';
var newName = ($('#geotag-new-person-name').val() || '').trim() || 'این شخصیت جدید';
var otherName = ($('#person-relative-person-search-' + idx).val() || '').trim() || 'نامبردۀ دیگر';
var newName = ($('#geotag-new-person-name').val() || '').trim() || 'این نامبردۀ جدید';
var person1Name = direction === 'otherFirst' ? otherName : newName;
var person2Name = direction === 'otherFirst' ? newName : otherName;
var build = (PERSON_RELATIVE_HINT_TEMPLATES[kind] || {})[type];
@ -540,7 +540,7 @@
function buildPersonGraphJson() {
var name = ($('#geotag-new-person-name').val() || '').trim();
if (name == '') {
upToast('لطفاً نام شخصیت جدید را وارد کنید.', 'error');
upToast('لطفاً نام نامبردۀ جدید را وارد کنید.', 'error');
return null;
}
@ -572,7 +572,7 @@
var idx = rows[r].id.replace('person-relative-row-', '');
var otherPersonId = $('#person-relative-person-id-' + idx).val();
if (!otherPersonId) {
upToast('برای یکی از روابط افزوده‌شده، شخصیت دیگر انتخاب نشده است.', 'error');
upToast('برای یکی از روابط افزوده‌شده، نامبردۀ دیگر انتخاب نشده است.', 'error');
return null;
}
otherPersonId = parseInt(otherPersonId);
@ -652,7 +652,7 @@
container.innerHTML = '';
return;
}
var html = '<table><tr><th>وضعیت</th><th>بیت</th><th>شخصیت</th><th>#</th></tr>';
var html = '<table><tr><th>وضعیت</th><th>بیت</th><th>نامبرده</th><th>#</th></tr>';
for (var r = 0; r < rows.length; r++) {
var i = rows[r];
var s = geoDateTagSuggestions[i];
@ -661,13 +661,13 @@
var personText = '';
if (!s.markForDelete) {
if (s.personId) {
personText = (allGeoPeople.filter(function (p) { return p.id === s.personId; })[0] || {}).name || ('شخصیت #' + s.personId);
personText = (allGeoPeople.filter(function (p) { return p.id === s.personId; })[0] || {}).name || ('نامبرده #' + s.personId);
} else if (s.suggestedPersonGraphJson) {
try {
var parsedGraph = JSON.parse(s.suggestedPersonGraphJson);
personText = 'شخصیت جدید: ' + (parsedGraph.person ? parsedGraph.person.name : '');
personText = 'نامبردۀ جدید: ' + (parsedGraph.person ? parsedGraph.person.name : '');
} catch (e) {
personText = 'شخصیت جدید';
personText = 'نامبردۀ جدید';
}
}
}
@ -792,7 +792,7 @@
if (!hasPerson) {
if (showErrorIfEmpty) {
upToast('لطفاً یک شخصیت موجود را انتخاب کنید یا شخصیت جدیدی تعریف کنید.', 'error');
upToast('لطفاً یک نامبردۀ موجود را انتخاب کنید یا نامبردۀ جدیدی تعریف کنید.', 'error');
}
return null;
}
@ -1732,7 +1732,7 @@ else
}
<a role="button" href="#summaries" class="up-btn up-btn--sm up-btn--ghost">💬 بخش معنی</a>
<a role="button" href="#geo-date-section" class="up-btn up-btn--sm up-btn--ghost">🗺️ بخش زمان و مکان</a>
<a role="button" href="#person-tag-section" class="up-btn up-btn--sm up-btn--ghost">🧑‍🎓 بخش شخصیت‌ها</a>
<a role="button" href="#person-tag-section" class="up-btn up-btn--sm up-btn--ghost">🧑‍🎓 بخش نامبردگان</a>
<a role="button" href="#footer" class="up-btn up-btn--sm up-btn--ghost">⬇ پایین صفحه</a>
</div>
@ -2602,22 +2602,22 @@ else
with its own "existing tags" table, its own pending list, and its own add button - a
suggestion coming out of this card never carries a location or a date. *@
<div class="up-card" id="person-tag-section">
<h2 class="up-card__title">🧑‍🎓 برچسب‌های شخصیت (پیشنهادی)</h2>
<p class="up-hint">می‌توانید پیشنهاد دهید که این شعر به یک شخصیت (تاریخی یا داستانی) اشاره دارد. پیشنهادهای شما پس از بررسی ناظران اعمال خواهد شد. با دکمهٔ «ذخیره» بالا همراه با بقیهٔ تغییرات ثبت می‌شود.</p>
<h2 class="up-card__title">🧑‍🎓 برچسب‌های نامبرده (پیشنهادی)</h2>
<p class="up-hint">می‌توانید پیشنهاد دهید که این شعر به یک نامبرده (تاریخی یا داستانی) اشاره دارد. پیشنهادهای شما پس از بررسی ناظران اعمال خواهد شد. با دکمهٔ «ذخیره» بالا همراه با بقیهٔ تغییرات ثبت می‌شود.</p>
@if (Model.PoemGeoDateTags != null && Model.PoemGeoDateTags.Any(t => t.PersonId != null))
{
<table>
<tr>
<th>بیت</th>
<th>شخصیت</th>
<th>نامبرده</th>
<th>#</th>
</tr>
@foreach (var tag in Model.PoemGeoDateTags.Where(t => t.PersonId != null))
{
<tr id="existing-geotag-@tag.Id">
<td>@(Model.Couplets.Where(c => c.Item1 == tag.CoupletIndex).Select(c => c.Item2).FirstOrDefault() ?? "— کل شعر —")</td>
<td>@(tag.Person != null ? tag.Person.Name : $"شخصیت #{tag.PersonId}")</td>
<td>@(tag.Person != null ? tag.Person.Name : $"نامبرده #{tag.PersonId}")</td>
<td>
<a role="button" class="up-btn up-btn--sm up-btn--ghost" onclick="requestDeleteExistingPersonTag(@tag.Id, this)">🗑️ درخواست حذف</a>
</td>
@ -2641,14 +2641,14 @@ else
</div>
<div class="up-field">
<label for="geotag-person-search">شخصیت</label>
<label for="geotag-person-search">نامبرده</label>
<div class="up-autocomplete-wrap">
<input type="text" id="geotag-person-search" autocomplete="off" placeholder="نام شخصیت را تایپ کنید..." />
<input type="text" id="geotag-person-search" autocomplete="off" placeholder="نام نامبرده را تایپ کنید..." />
<input type="hidden" id="geotag-person-select" />
<div id="geotag-person-results" class="up-autocomplete-results" style="display:none;"></div>
</div>
<p class="up-hint">شروع به تایپ کنید تا فهرست شخصیت‌ها بر اساس نام فیلتر شود؛ اگر شخصیت مورد نظر پیدا نشد، گزینهٔ تعریف او به‌عنوان شخصیت جدید نمایش داده می‌شود.</p>
<a role="button" class="up-btn up-btn--sm up-btn--ghost" onclick="toggleNewPersonWidget()">👤 شخصیت جدید پیشنهاد بده</a>
<p class="up-hint">شروع به تایپ کنید تا فهرست نامبردگان بر اساس نام فیلتر شود؛ اگر نامبردۀ مورد نظر پیدا نشد، گزینهٔ تعریف او به‌عنوان نامبردۀ جدید نمایش داده می‌شود.</p>
<a role="button" class="up-btn up-btn--sm up-btn--ghost" onclick="toggleNewPersonWidget()">👤 نامبردۀ جدید پیشنهاد بده</a>
</div>
<div id="new-person-widget" style="display:none;">
@ -2665,20 +2665,20 @@ else
<input type="text" id="geotag-new-person-wikiurl" />
</div>
<div class="up-field">
<label for="geotag-new-person-familytreecaption">عنوان تبارنامه (اختیاری، فقط اگر این شخصیت ریشهٔ یک خانواده/سلسله شناخته‌شده است - مثلاً «ساسانیان»)</label>
<label for="geotag-new-person-familytreecaption">عنوان تبارنامه (اختیاری، فقط اگر این نامبرده ریشهٔ یک خانواده/سلسله شناخته‌شده است - مثلاً «ساسانیان»)</label>
<input type="text" id="geotag-new-person-familytreecaption" />
</div>
<p class="up-hint">
اگر خویشاوندی یا وابستگی این شخصیت با شخصیتی دیگر را می‌دانید، می‌توانید همین‌جا اضافه کنید (شخصیت دیگر باید از قبل در فهرست موجود باشد؛
برای شخصیتی که او هم تازه است، ابتدا این فرم را برای او هم به‌صورت جدا تکمیل و ثبت کنید، سپس این رابطه را اضافه کنید).
اگر خویشاوندی یا وابستگی این نامبرده با نامبردۀ دیگری را می‌دانید، می‌توانید همین‌جا اضافه کنید (نامبردۀ دیگر باید از قبل در فهرست موجود باشد؛
برای نامبرده‌ای که او هم تازه است، ابتدا این فرم را برای او هم به‌صورت جدا تکمیل و ثبت کنید، سپس این رابطه را اضافه کنید).
</p>
<div id="geotag-person-relatives-list"></div>
<a role="button" class="up-btn up-btn--sm up-btn--ghost" onclick="addPersonRelativeRow()">➕ افزودن خویشاوند یا وابستگی</a>
</div>
<div class="up-field">
<label for="persontag-note">دلیل این برچسب (اختیاری، به‌ویژه برای اشاره‌های غیرمستقیم به این شخصیت)</label>
<label for="persontag-note">دلیل این برچسب (اختیاری، به‌ویژه برای اشاره‌های غیرمستقیم به این نامبرده)</label>
<textarea id="persontag-note" rows="2"></textarea>
</div>

View File

@ -280,7 +280,7 @@ else
{
<tr>
<td colspan="3">
@(GeoDateTagCorrectionDisplay.IsPersonTag(geoTag) ? "شخصیت" : "برچسب جغرافیایی/تاریخی") -
@(GeoDateTagCorrectionDisplay.IsPersonTag(geoTag) ? "نامبرده" : "برچسب جغرافیایی/تاریخی") -
@if (geoTag.CoupletIndex == null)
{
<text>کل شعر</text>
@ -315,12 +315,12 @@ else
<p style="color:green">
@if (geoTag.PersonId != null)
{
<a href="javascript:void(0)" onclick="PersonWindow.open(@geoTag.PersonId)">@(geoTag.Person != null ? geoTag.Person.Name : $"شخصیت #{geoTag.PersonId}")</a>
<a href="javascript:void(0)" onclick="PersonWindow.open(@geoTag.PersonId)">@(geoTag.Person != null ? geoTag.Person.Name : $"نامبرده #{geoTag.PersonId}")</a>
}
else
{
var suggestedPersonName = GeoDateTagCorrectionDisplay.GetSuggestedPersonName(geoTag.SuggestedPersonGraphJson);
<text>شخصیت جدید@(string.IsNullOrEmpty(suggestedPersonName) ? "" : $": {suggestedPersonName}")</text>
<text>نامبردۀ جدید@(string.IsNullOrEmpty(suggestedPersonName) ? "" : $": {suggestedPersonName}")</text>
}
</p>
</td>

View File

@ -291,7 +291,7 @@ namespace GanjooRazor.Areas.User.Pages
// onto this same record when the delete request was approved, so it's already
// available here for GeoDateTagCorrectionDisplay.IsPersonTag to tell the two kinds
// of tag apart for the note text below.
var geoTagLabel = GeoDateTagCorrectionDisplay.IsPersonTag(geoTag) ? "شخصیت" : "برچسب جغرافیایی/تاریخی";
var geoTagLabel = GeoDateTagCorrectionDisplay.IsPersonTag(geoTag) ? "نامبرده" : "برچسب جغرافیایی/تاریخی";
if (geoTag.MarkForDelete)
{
// the original request deleted an existing tag - undo that by re-adding a tag with

View File

@ -32,7 +32,7 @@ else
<table>
<tr>
<td>خویشاوند یا شخصیت دیگر:</td>
<td>خویشاوند یا نامبردۀ دیگر:</td>
<td>
<select asp-for="OtherPersonId">
<option value="0">— انتخاب کنید —</option>
@ -59,12 +59,12 @@ else
<td>نسبت با @Model.Person.Name:</td>
<td>
<select asp-for="RelationKind">
<option value="Child">فرزند این شخصیت است</option>
<option value="Parent">پدر یا مادر این شخصیت است</option>
<option value="Sibling">خواهر یا برادر این شخصیت است</option>
<option value="Spouse">همسر این شخصیت است</option>
<option value="DistantAncestor">نیای دور این شخصیت است (بدون نسل مشخص)</option>
<option value="DistantDescendant">نوادهٔ دور این شخصیت است (بدون نسل مشخص)</option>
<option value="Child">فرزند این نامبرده است</option>
<option value="Parent">پدر یا مادر این نامبرده است</option>
<option value="Sibling">خواهر یا برادر این نامبرده است</option>
<option value="Spouse">همسر این نامبرده است</option>
<option value="DistantAncestor">نیای دور این نامبرده است (بدون نسل مشخص)</option>
<option value="DistantDescendant">نوادهٔ دور این نامبرده است (بدون نسل مشخص)</option>
</select>
</td>
</tr>
@ -82,22 +82,22 @@ else
<td>وابستگی با @Model.Person.Name:</td>
<td>
<select asp-for="AffiliationKind">
<option value="Minister_Other">او وزیر یا کارگزار این شخصیت بود</option>
<option value="Minister_Subject">این شخصیت وزیر یا کارگزار او بود</option>
<option value="Advisor_Other">او مشاور این شخصیت بود</option>
<option value="Advisor_Subject">این شخصیت مشاور او بود</option>
<option value="Courtier_Other">او از درباریان/همراهان این شخصیت بود</option>
<option value="Courtier_Subject">این شخصیت از درباریان/همراهان او بود</option>
<option value="Servant_Other">او خدمتگزار این شخصیت بود</option>
<option value="Servant_Subject">این شخصیت خدمتگزار او بود</option>
<option value="Patron_Other">او از این شخصیت حمایت می‌کرد (حامی او بود)</option>
<option value="Patron_Subject">این شخصیت از او حمایت می‌کرد (حامی او بود)</option>
<option value="Successor_Other">او جانشین این شخصیت شد (پس از او آمد)</option>
<option value="Successor_Subject">این شخصیت جانشین او شد (پس از او آمد)</option>
<option value="Panegyrized_Other">او در شعری این شخصیت را مدح/ستایش کرد (مدح‌گوی او بود)</option>
<option value="Panegyrized_Subject">این شخصیت در شعری او را مدح/ستایش کرد (مدح‌گوی او بود)</option>
<option value="Satirized_Other">او در شعری این شخصیت را هجو کرد (هجوگوی او بود)</option>
<option value="Satirized_Subject">این شخصیت در شعری او را هجو کرد (هجوگوی او بود)</option>
<option value="Minister_Other">او وزیر یا کارگزار این نامبرده بود</option>
<option value="Minister_Subject">این نامبرده وزیر یا کارگزار او بود</option>
<option value="Advisor_Other">او مشاور این نامبرده بود</option>
<option value="Advisor_Subject">این نامبرده مشاور او بود</option>
<option value="Courtier_Other">او از درباریان/همراهان این نامبرده بود</option>
<option value="Courtier_Subject">این نامبرده از درباریان/همراهان او بود</option>
<option value="Servant_Other">او خدمتگزار این نامبرده بود</option>
<option value="Servant_Subject">این نامبرده خدمتگزار او بود</option>
<option value="Patron_Other">او از این نامبرده حمایت می‌کرد (حامی او بود)</option>
<option value="Patron_Subject">این نامبرده از او حمایت می‌کرد (حامی او بود)</option>
<option value="Successor_Other">او جانشین این نامبرده شد (پس از او آمد)</option>
<option value="Successor_Subject">این نامبرده جانشین او شد (پس از او آمد)</option>
<option value="Panegyrized_Other">او در شعری این نامبرده را مدح/ستایش کرد (مدح‌گوی او بود)</option>
<option value="Panegyrized_Subject">این نامبرده در شعری او را مدح/ستایش کرد (مدح‌گوی او بود)</option>
<option value="Satirized_Other">او در شعری این نامبرده را هجو کرد (هجوگوی او بود)</option>
<option value="Satirized_Subject">این نامبرده در شعری او را هجو کرد (هجوگوی او بود)</option>
<option value="Ally">با او متحد/هم‌پیمان بود</option>
<option value="Rival">با او رقیب/دشمن بود</option>
<option value="Companion">با او همراه/همدم بود</option>

View File

@ -81,7 +81,7 @@ namespace GanjooRazor.Areas.User.Pages
Person = JsonConvert.DeserializeObject<GanjoorRelatedPerson>(await response.Content.ReadAsStringAsync());
if (Person == null)
{
LastError = "شخصیتی با این کد پیدا نشد.";
LastError = "نامبرده‌ای با این کد پیدا نشد.";
return false;
}
@ -129,7 +129,7 @@ namespace GanjooRazor.Areas.User.Pages
if (OtherPersonId == 0 || OtherPersonId == personId)
{
LastResult = "لطفاً خویشاوند یا شخصیت مورد نظر را انتخاب کنید.";
LastResult = "لطفاً خویشاوند یا نامبردۀ مورد نظر را انتخاب کنید.";
return Page();
}
@ -314,7 +314,7 @@ namespace GanjooRazor.Areas.User.Pages
return Page();
}
LastResult = $"پیشنهاد شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({personId})\" class=\"actionlink\">مشاهدهٔ اطلاعات این شخصیت</a>";
LastResult = $"پیشنهاد شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({personId})\" class=\"actionlink\">مشاهدهٔ اطلاعات این نامبرده</a>";
return Page();
}

View File

@ -3,7 +3,7 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = "_UserPanelLayout";
ViewData["Title"] = "پیشنهاد ویرایش شخصیت";
ViewData["Title"] = "پیشنهاد ویرایش نامبرده";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
}
@if (!string.IsNullOrEmpty(Model.LastError))
@ -44,10 +44,10 @@ else
<table>
<tr>
<td>پیشنهاد حذف این شخصیت:</td>
<td>پیشنهاد حذف این نامبرده:</td>
<td>
<input asp-for="Suggestion.SuggestedForDeletion" id="suggestedForDeletion" />
<p class="up-hint"><small>در صورت انتخاب این گزینه سایر فیلدها نادیده گرفته خواهد شد و در صورت تأیید مدیران، این شخصیت و همهٔ نسبت‌ها/وابستگی‌های آن حذف می‌شود.</small></p>
<p class="up-hint"><small>در صورت انتخاب این گزینه سایر فیلدها نادیده گرفته خواهد شد و در صورت تأیید مدیران، این نامبرده و همهٔ نسبت‌ها/وابستگی‌های آن حذف می‌شود.</small></p>
</td>
</tr>
<tr>
@ -61,7 +61,7 @@ else
<tr>
<td>
عنوان تبارنامه:
<p class="up-hint"><small>پُر کنید تا این شخصیت در <a href="javascript:void(0)" onclick="PeopleExplorer.open()">فهرست تبارنامه‌ها</a> با این عنوان دیده شود.</small></p>
<p class="up-hint"><small>پُر کنید تا این نامبرده در <a href="javascript:void(0)" onclick="PeopleExplorer.open()">فهرست تبارنامه‌ها</a> با این عنوان دیده شود.</small></p>
</td>
<td><input asp-for="Suggestion.SuggestedFamilyTreeCaption" size="40" /></td>
</tr>

View File

@ -64,7 +64,7 @@ namespace GanjooRazor.Areas.User.Pages
Person = JsonConvert.DeserializeObject<GanjoorRelatedPerson>(await response.Content.ReadAsStringAsync());
if (Person == null)
{
LastError = "شخصیتی با این کد پیدا نشد.";
LastError = "نامبرده‌ای با این کد پیدا نشد.";
return false;
}
@ -146,7 +146,7 @@ namespace GanjooRazor.Areas.User.Pages
return Page();
}
LastResult = $"پیشنهاد ویرایش شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({id})\" class=\"actionlink\">مشاهدهٔ اطلاعات این شخصیت</a>";
LastResult = $"پیشنهاد ویرایش شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({id})\" class=\"actionlink\">مشاهدهٔ اطلاعات این نامبرده</a>";
FillSuggestionFromCurrentPerson();

View File

@ -201,7 +201,7 @@ namespace GanjooRazor.Areas.User.Pages
return Page();
}
LastResult = $"پیشنهاد شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({Person1Id})\" class=\"actionlink\">مشاهدهٔ اطلاعات این شخصیت</a>";
LastResult = $"پیشنهاد شما ثبت شد و پس از بررسی توسط مدیران اعمال خواهد شد. <a role=\"button\" href=\"javascript:void(0)\" onclick=\"PersonWindow.open({Person1Id})\" class=\"actionlink\">مشاهدهٔ اطلاعات این نامبرده</a>";
FillSuggestionFromCurrent();

View File

@ -32,7 +32,7 @@
<div class="poemtablinks"><a href="#pretab">آمار</a></div>
<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="#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>
@ -55,7 +55,7 @@
<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 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="#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">
@ -78,12 +78,12 @@
<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 active"><a href="#persongraph" onclick="javascript:loadPersonGraph(@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)">
بارگذاری شخصیت‌های این بخش
بارگذاری نامبردگانی این بخش
</div>
<div id="persongraph-placeholder"></div>
</div>
@ -94,7 +94,7 @@
<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"><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">

View File

@ -54,7 +54,7 @@
<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"><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>
@ -72,7 +72,7 @@
<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"><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">
@ -88,7 +88,7 @@
<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"><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">
@ -112,7 +112,7 @@
<div class="poemtablinks active"><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"><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">
@ -138,7 +138,7 @@
<div class="poemtablinks"><a href="#recitations" onclick="javascript:loadCatRecitations(@Model.GanjoorPage.PoetOrCat.Cat.Id)">خوانش‌ها</a></div>
<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="#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">
@ -174,7 +174,7 @@
<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 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="#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">
@ -216,7 +216,7 @@
<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"><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">
@ -235,12 +235,12 @@
<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 active"><a href="#persongraph" onclick="javascript:loadPersonGraph(@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)">
بارگذاری شخصیت‌های این بخش
بارگذاری نامبردگانی این بخش
</div>
<div id="persongraph-placeholder"></div>
</div>

View File

@ -2,7 +2,7 @@
@if (Model.Graph == null || Model.Graph.Nodes == null || Model.Graph.Nodes.Count == 0)
{
<p>برای این بخش هنوز شخصیتی برچسب‌گذاری نشده است.</p>
<p>برای این بخش هنوز نامبرده‌ای برچسب‌گذاری نشده است.</p>
}
else
{
@ -17,9 +17,9 @@ else
</small></p>
<div style="margin-bottom:10px;">
<input type="text" id="pg-cat-search" placeholder="جستجوی نام شخصیت..." style="width:240px;" />
<input type="text" id="pg-cat-search" placeholder="جستجوی نام نامبرده..." style="width:240px;" />
<a role="button" id="pg-cat-reset" class="up-btn up-btn--ghost up-btn--sm">نمایش همه</a>
<a role="button" href="javascript:void(0)" onclick="PeopleExplorer.open()" class="up-btn up-btn--ghost up-btn--sm">نمایش شبکهٔ کامل شخصیت‌ها</a>
<a role="button" href="javascript:void(0)" onclick="PeopleExplorer.open()" class="up-btn up-btn--ghost up-btn--sm">نمایش شبکهٔ کامل نامبردگان</a>
</div>
<div id="pg-cat-legend" class="pg-legend"></div>

View File

@ -15,7 +15,7 @@ else
@Model.Person.Name
@if (Model.LoggedIn)
{
<a href="/User/SuggestPersonEdit?id=@Model.Person.Id" class="up-icon-btn" title="پیشنهاد ویرایش این شخصیت" aria-label="پیشنهاد ویرایش این شخصیت">✎</a>
<a href="/User/SuggestPersonEdit?id=@Model.Person.Id" class="up-icon-btn" title="پیشنهاد ویرایش این نامبرده" aria-label="پیشنهاد ویرایش این نامبرده">✎</a>
}
</h2>
@ -119,7 +119,7 @@ else
@if (Model.Poems != null && Model.Poems.Length > 0)
{
<h3>اشعار برچسب‌خورده با این شخصیت</h3>
<h3>اشعار برچسب‌خورده با این نامبرده</h3>
<ul>
@foreach (var tag in Model.Poems)
{
@ -142,7 +142,7 @@ else
}
else
{
<p><small>هنوز شعری با این شخصیت برچسب‌گذاری نشده است.</small></p>
<p><small>هنوز شعری با این نامبرده برچسب‌گذاری نشده است.</small></p>
}
</div>
}