Update UI

This commit is contained in:
2026-07-19 22:03:33 +10:00
parent ba7ec6b8c9
commit c1ea59d23c
4 changed files with 135 additions and 62 deletions
+1 -1
View File
@@ -145,7 +145,7 @@ MUSIC_ROOT = os.path.join(BASE_DIR, 'data', 'music')
# File uploads folder — override via FILE_UPLOADS_FOLDER env var. # File uploads folder — override via FILE_UPLOADS_FOLDER env var.
# Defaults to ~/Downloads locally; set to /uploads on k8s. # Defaults to ~/Downloads locally; set to /uploads on k8s.
FILE_UPLOADS_FOLDER = os.environ.get('FILE_UPLOADS_FOLDER', os.path.expanduser('~/Downloads')) FILE_UPLOADS_FOLDER = os.environ.get('FILE_UPLOADS_FOLDER', os.path.expanduser('~/Downloads'))
IMAGES_FOLDER = os.environ.get('IMAGES_FOLDER', os.path.expanduser('~/Pictures')) IMAGES_FOLDER = os.environ.get('IMAGES_FOLDER', os.path.expanduser('~/Downloads'))
LOGGING = { LOGGING = {
+82 -11
View File
@@ -56,7 +56,7 @@
opacity: 1 !important; opacity: 1 !important;
transform: none !important; transform: none !important;
} }
.app-tile, .post-card, .fan-card, .fan-card img, .fan-card-frame { transition: none !important; animation: none !important; } .app-tile, .post-card, .fan-card, .fan-card img, .fan-card-frame, .fan-lightbox { transition: none !important; animation: none !important; }
} }
/* ---------- Hero ---------- */ /* ---------- Hero ---------- */
@@ -395,6 +395,35 @@
.fan-actions { gap: 0.8rem; } .fan-actions { gap: 0.8rem; }
} }
/* ---------- Fan lightbox (full-size preview on card click) ---------- */
.fan-lightbox {
position: fixed; inset: 0; z-index: 1000;
display: flex; align-items: center; justify-content: center;
padding: 2rem;
background: rgba(0, 0, 0, 0.82);
-webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
animation: fan-lightbox-fade 0.25s ease;
cursor: zoom-out;
}
.fan-lightbox[hidden] { display: none; }
@keyframes fan-lightbox-fade { from { opacity: 0; } to { opacity: 1; } }
.fan-lightbox-img {
max-width: min(92vw, 900px); max-height: 88vh;
display: block; object-fit: contain; cursor: default;
border-radius: 14px;
background: #e8e8ed;
box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45);
}
.fan-lightbox-close {
position: absolute; top: 1.1rem; right: 1.1rem;
width: 2.5rem; height: 2.5rem; border-radius: 50%; border: none;
display: flex; align-items: center; justify-content: center;
background: rgba(255, 255, 255, 0.14); color: #fff; cursor: pointer;
transition: background 0.2s ease;
}
.fan-lightbox-close:hover, .fan-lightbox-close:focus-visible { background: rgba(255, 255, 255, 0.28); }
.fan-lightbox-close svg { width: 1.2rem; height: 1.2rem; }
/* ---------- Accessibility: visible keyboard focus ---------- */ /* ---------- Accessibility: visible keyboard focus ---------- */
a:focus-visible, button:focus-visible { a:focus-visible, button:focus-visible {
outline: 2px solid var(--apple-blue); outline: 2px solid var(--apple-blue);
@@ -520,52 +549,52 @@
</div> </div>
</div> </div>
<div class="photo-fan"> <div class="photo-fan">
<button type="button" class="fan-card" style="--r: -13deg; --fy: 18px; --z: 1; --d: 0; --tape: rgba(0, 113, 227, 0.22); --tape-r: -4deg;" onclick="refreshRandomImage(this.querySelector('img'))" aria-label="{% trans 'Shuffle image' %}"> <button type="button" class="fan-card" style="--r: -13deg; --fy: 18px; --z: 1; --d: 0; --tape: rgba(0, 113, 227, 0.22); --tape-r: -4deg;" onclick="openFanLightbox(this.querySelector('img'))" aria-label="{% trans 'View Full Size' %}">
<span class="fan-card-frame"> <span class="fan-card-frame">
<img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan1" data-box="fan1" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)"> <img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan1" data-box="fan1" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)">
<span class="fan-card-hint" aria-hidden="true"> <span class="fan-card-hint" aria-hidden="true">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16zM11 8v6M8 11h6"/>
</svg> </svg>
</span> </span>
</span> </span>
</button> </button>
<button type="button" class="fan-card" style="--r: -6.5deg; --fy: 7px; --z: 2; --d: 1; --tape: rgba(255, 55, 95, 0.20); --tape-r: 3deg;" onclick="refreshRandomImage(this.querySelector('img'))" aria-label="{% trans 'Shuffle image' %}"> <button type="button" class="fan-card" style="--r: -6.5deg; --fy: 7px; --z: 2; --d: 1; --tape: rgba(255, 55, 95, 0.20); --tape-r: 3deg;" onclick="openFanLightbox(this.querySelector('img'))" aria-label="{% trans 'View Full Size' %}">
<span class="fan-card-frame"> <span class="fan-card-frame">
<img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan2" data-box="fan2" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)"> <img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan2" data-box="fan2" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)">
<span class="fan-card-hint" aria-hidden="true"> <span class="fan-card-hint" aria-hidden="true">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16zM11 8v6M8 11h6"/>
</svg> </svg>
</span> </span>
</span> </span>
</button> </button>
<button type="button" class="fan-card" style="--r: 0deg; --fy: 0px; --z: 3; --d: 2; --tape: rgba(48, 209, 88, 0.22); --tape-r: -2deg;" onclick="refreshRandomImage(this.querySelector('img'))" aria-label="{% trans 'Shuffle image' %}"> <button type="button" class="fan-card" style="--r: 0deg; --fy: 0px; --z: 3; --d: 2; --tape: rgba(48, 209, 88, 0.22); --tape-r: -2deg;" onclick="openFanLightbox(this.querySelector('img'))" aria-label="{% trans 'View Full Size' %}">
<span class="fan-card-frame"> <span class="fan-card-frame">
<img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan3" data-box="fan3" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)"> <img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan3" data-box="fan3" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)">
<span class="fan-card-hint" aria-hidden="true"> <span class="fan-card-hint" aria-hidden="true">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16zM11 8v6M8 11h6"/>
</svg> </svg>
</span> </span>
</span> </span>
</button> </button>
<button type="button" class="fan-card" style="--r: 6.5deg; --fy: 7px; --z: 2; --d: 3; --tape: rgba(255, 159, 10, 0.22); --tape-r: 4deg;" onclick="refreshRandomImage(this.querySelector('img'))" aria-label="{% trans 'Shuffle image' %}"> <button type="button" class="fan-card" style="--r: 6.5deg; --fy: 7px; --z: 2; --d: 3; --tape: rgba(255, 159, 10, 0.22); --tape-r: 4deg;" onclick="openFanLightbox(this.querySelector('img'))" aria-label="{% trans 'View Full Size' %}">
<span class="fan-card-frame"> <span class="fan-card-frame">
<img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan4" data-box="fan4" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)"> <img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan4" data-box="fan4" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)">
<span class="fan-card-hint" aria-hidden="true"> <span class="fan-card-hint" aria-hidden="true">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16zM11 8v6M8 11h6"/>
</svg> </svg>
</span> </span>
</span> </span>
</button> </button>
<button type="button" class="fan-card" style="--r: 13deg; --fy: 18px; --z: 1; --d: 4; --tape: rgba(191, 90, 242, 0.22); --tape-r: -3deg;" onclick="refreshRandomImage(this.querySelector('img'))" aria-label="{% trans 'Shuffle image' %}"> <button type="button" class="fan-card" style="--r: 13deg; --fy: 18px; --z: 1; --d: 4; --tape: rgba(191, 90, 242, 0.22); --tape-r: -3deg;" onclick="openFanLightbox(this.querySelector('img'))" aria-label="{% trans 'View Full Size' %}">
<span class="fan-card-frame"> <span class="fan-card-frame">
<img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan5" data-box="fan5" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)"> <img src="/api/images/random/600/800/?fit=crop&v={{ timestamp }}&box=fan5" data-box="fan5" alt="{% trans 'Random Image' %}" loading="lazy" onerror="handleRandomImageError(this)">
<span class="fan-card-hint" aria-hidden="true"> <span class="fan-card-hint" aria-hidden="true">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-4.35-4.35M11 19a8 8 0 100-16 8 8 0 000 16zM11 8v6M8 11h6"/>
</svg> </svg>
</span> </span>
</span> </span>
@@ -573,6 +602,16 @@
</div> </div>
</section> </section>
<!-- ============ Fan Lightbox (full-size preview) ============ -->
<div id="fan-lightbox" class="fan-lightbox" hidden role="dialog" aria-modal="true" aria-label="{% trans 'Random Image' %}">
<button type="button" class="fan-lightbox-close" id="fan-lightbox-close" aria-label="{% trans 'Close' %}">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.5" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
<img id="fan-lightbox-img" class="fan-lightbox-img" src="" alt="{% trans 'Random Image' %}">
</div>
<!-- ============ Link Library ============ --> <!-- ============ Link Library ============ -->
<section class="apple-card home-section" aria-labelledby="links-heading"> <section class="apple-card home-section" aria-labelledby="links-heading">
<div class="library-header"> <div class="library-header">
@@ -776,6 +815,38 @@
card.addEventListener('animationend', () => { card.style.animation = 'none'; }, { once: true }); card.addEventListener('animationend', () => { card.style.animation = 'none'; }, { once: true });
}); });
/* ---------- Photo fan: lightbox (click a card to view it full-size) ---------- */
const fanLightbox = document.getElementById('fan-lightbox');
const fanLightboxImg = document.getElementById('fan-lightbox-img');
const fanLightboxClose = document.getElementById('fan-lightbox-close');
window.openFanLightbox = function (img) {
if (!img || !fanLightbox || !fanLightboxImg) return;
fanLightboxImg.src = img.currentSrc || img.src;
fanLightboxImg.alt = img.alt;
fanLightbox.hidden = false;
document.body.style.overflow = 'hidden';
fanLightboxClose.focus();
};
function closeFanLightbox() {
if (!fanLightbox) return;
fanLightbox.hidden = true;
fanLightboxImg.src = '';
document.body.style.overflow = '';
}
if (fanLightbox) {
fanLightboxClose.addEventListener('click', closeFanLightbox);
// Click the dimmed backdrop (not the image itself) to dismiss.
fanLightbox.addEventListener('click', function (event) {
if (event.target === fanLightbox) closeFanLightbox();
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && !fanLightbox.hidden) closeFanLightbox();
});
}
/* ---------- Scroll-reveal animations (respects reduced motion) ---------- */ /* ---------- Scroll-reveal animations (respects reduced motion) ---------- */
const revealEls = document.querySelectorAll('.reveal'); const revealEls = document.querySelectorAll('.reveal');
const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
Binary file not shown.
+52 -50
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-19 21:30+1000\n" "POT-Creation-Date: 2026-07-19 22:00+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -481,6 +481,11 @@ msgid "Slideshow"
msgstr "" msgstr ""
#: links/templates/links/collection_detail.html:254 #: links/templates/links/collection_detail.html:254
#: links/templates/links/link_list.html:552
#: links/templates/links/link_list.html:562
#: links/templates/links/link_list.html:572
#: links/templates/links/link_list.html:582
#: links/templates/links/link_list.html:592
msgid "View Full Size" msgid "View Full Size"
msgstr "" msgstr ""
@@ -659,7 +664,7 @@ msgid "All Files"
msgstr "" msgstr ""
#: links/templates/links/files/list.html:109 #: links/templates/links/files/list.html:109
#: links/templates/links/link_list.html:623 #: links/templates/links/link_list.html:662
msgid "Type" msgid "Type"
msgstr "链接类型" msgstr "链接类型"
@@ -731,7 +736,7 @@ msgstr "导出数据库"
#: links/templates/links/files/list.html:233 #: links/templates/links/files/list.html:233
#: links/templates/links/files/list.html:343 #: links/templates/links/files/list.html:343
#: links/templates/links/jobs.html:507 #: links/templates/links/jobs.html:507 links/templates/links/link_list.html:607
msgid "Close" msgid "Close"
msgstr "" msgstr ""
@@ -868,7 +873,7 @@ msgid ""
msgstr "" msgstr ""
#: links/templates/links/jobs.html:152 #: links/templates/links/jobs.html:152
#: links/templates/links/link_list.html:1007 #: links/templates/links/link_list.html:1078
msgid "selected" msgid "selected"
msgstr "已选择" msgstr "已选择"
@@ -1025,13 +1030,13 @@ msgstr "链接详情"
#: links/templates/links/link_confirm_delete.html:17 #: links/templates/links/link_confirm_delete.html:17
#: links/templates/links/link_detail.html:43 #: links/templates/links/link_detail.html:43
#: links/templates/links/link_list.html:613 #: links/templates/links/link_list.html:652
msgid "Alias" msgid "Alias"
msgstr "别名" msgstr "别名"
#: links/templates/links/link_confirm_delete.html:18 #: links/templates/links/link_confirm_delete.html:18
#: links/templates/links/link_detail.html:60 #: links/templates/links/link_detail.html:60
#: links/templates/links/link_list.html:633 #: links/templates/links/link_list.html:672
msgid "Original URL" msgid "Original URL"
msgstr "原始URL" msgstr "原始URL"
@@ -1097,7 +1102,7 @@ msgid "No changes recorded."
msgstr "" msgstr ""
#: links/templates/links/link_detail.html:256 #: links/templates/links/link_detail.html:256
#: links/templates/links/link_list.html:643 #: links/templates/links/link_list.html:682
msgid "Clicks" msgid "Clicks"
msgstr "点击次数" msgstr "点击次数"
@@ -1106,7 +1111,7 @@ msgid "Edit Link"
msgstr "编辑链接" msgstr "编辑链接"
#: links/templates/links/link_form.html:33 #: links/templates/links/link_form.html:33
#: links/templates/links/link_list.html:597 #: links/templates/links/link_list.html:636
msgid "New Link" msgid "New Link"
msgstr "创建新链接" msgstr "创建新链接"
@@ -1139,136 +1144,130 @@ msgstr ""
msgid "Alias cannot be changed after creation." msgid "Alias cannot be changed after creation."
msgstr "链接别名中不能带有 - 或者 _ 以及其他任意特殊字符" msgstr "链接别名中不能带有 - 或者 _ 以及其他任意特殊字符"
#: links/templates/links/link_list.html:469 #: links/templates/links/link_list.html:498
#: links/templates/links/mini_apps/image_gallery.html:4 templates/base.html:8 #: links/templates/links/mini_apps/image_gallery.html:4 templates/base.html:8
#: templates/base.html:61 #: templates/base.html:61
msgid "GoLinks" msgid "GoLinks"
msgstr "GoLinks" msgstr "GoLinks"
#: links/templates/links/link_list.html:475 #: links/templates/links/link_list.html:504
msgid "Search aliases" msgid "Search aliases"
msgstr "搜索别名" msgstr "搜索别名"
#: links/templates/links/link_list.html:479 #: links/templates/links/link_list.html:508
msgid "Search aliases..." msgid "Search aliases..."
msgstr "搜索别名..." msgstr "搜索别名..."
#: links/templates/links/link_list.html:487 #: links/templates/links/link_list.html:516
msgid "Matching aliases" msgid "Matching aliases"
msgstr "匹配的别名" msgstr "匹配的别名"
#: links/templates/links/link_list.html:493 #: links/templates/links/link_list.html:522
#: links/templates/links/tag_detail.html:34 #: links/templates/links/tag_detail.html:34
msgid "Links" msgid "Links"
msgstr "链接" msgstr "链接"
#: links/templates/links/link_list.html:498 #: links/templates/links/link_list.html:527
msgid "Total Clicks" msgid "Total Clicks"
msgstr "总点击次数" msgstr "总点击次数"
#: links/templates/links/link_list.html:506 #: links/templates/links/link_list.html:535
msgid "Random Images" msgid "Random Images"
msgstr "随机图片" msgstr "随机图片"
#: links/templates/links/link_list.html:512 #: links/templates/links/link_list.html:541
msgid "Shuffle all" msgid "Shuffle all"
msgstr "换一批" msgstr "换一批"
#: links/templates/links/link_list.html:515 #: links/templates/links/link_list.html:544
msgid "Open gallery" msgid "Open gallery"
msgstr "打开画廊" msgstr "打开画廊"
#: links/templates/links/link_list.html:523 #: links/templates/links/link_list.html:554
#: links/templates/links/link_list.html:533 #: links/templates/links/link_list.html:564
#: links/templates/links/link_list.html:543 #: links/templates/links/link_list.html:574
#: links/templates/links/link_list.html:553 #: links/templates/links/link_list.html:584
#: links/templates/links/link_list.html:563 #: links/templates/links/link_list.html:594
msgid "Shuffle image" #: links/templates/links/link_list.html:606
msgstr "换一张图片" #: links/templates/links/link_list.html:612
#: links/templates/links/link_list.html:525
#: links/templates/links/link_list.html:535
#: links/templates/links/link_list.html:545
#: links/templates/links/link_list.html:555
#: links/templates/links/link_list.html:565
msgid "Random Image" msgid "Random Image"
msgstr "随机图片" msgstr "随机图片"
#: links/templates/links/link_list.html:580 #: links/templates/links/link_list.html:619
msgid "Link List" msgid "Link List"
msgstr "链接列表" msgstr "链接列表"
#: links/templates/links/link_list.html:582 #: links/templates/links/link_list.html:621
#, python-format #, python-format
msgid "%(counter)s link" msgid "%(counter)s link"
msgid_plural "%(counter)s links" msgid_plural "%(counter)s links"
msgstr[0] "" msgstr[0] ""
#: links/templates/links/link_list.html:590 #: links/templates/links/link_list.html:629
msgid "Search links" msgid "Search links"
msgstr "搜索链接" msgstr "搜索链接"
#: links/templates/links/link_list.html:591 #: links/templates/links/link_list.html:630
msgid "Search links..." msgid "Search links..."
msgstr "搜索链接..." msgstr "搜索链接..."
#: links/templates/links/link_list.html:609 #: links/templates/links/link_list.html:648
msgid "Select all links" msgid "Select all links"
msgstr "全选所有链接" msgstr "全选所有链接"
#: links/templates/links/link_list.html:651 #: links/templates/links/link_list.html:690
#: links/templates/links/mini_apps/image_gallery.html:432 #: links/templates/links/mini_apps/image_gallery.html:432
#: templates/pricemon/dashboard.html:187 #: templates/pricemon/dashboard.html:187
msgid "Actions" msgid "Actions"
msgstr "操作" msgstr "操作"
#: links/templates/links/link_list.html:659 #: links/templates/links/link_list.html:698
msgid "No links available" msgid "No links available"
msgstr "暂无可用链接" msgstr "暂无可用链接"
#: links/templates/links/link_list.html:675 #: links/templates/links/link_list.html:714
#: links/templates/links/link_list.html:987 #: links/templates/links/link_list.html:1058
#: links/templates/links/link_list.html:995 #: links/templates/links/link_list.html:1066
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: links/templates/links/link_list.html:681 #: links/templates/links/link_list.html:720
msgid "Delete Selected" msgid "Delete Selected"
msgstr "删除选中项" msgstr "删除选中项"
#: links/templates/links/link_list.html:689 #: links/templates/links/link_list.html:728
msgid "Latest Posts" msgid "Latest Posts"
msgstr "最新文章" msgstr "最新文章"
#: links/templates/links/link_list.html:691 #: links/templates/links/link_list.html:730
msgid "View all posts" msgid "View all posts"
msgstr "查看全部文章" msgstr "查看全部文章"
#: links/templates/links/link_list.html:720 #: links/templates/links/link_list.html:759
msgid "No posts available yet" msgid "No posts available yet"
msgstr "暂无文章" msgstr "暂无文章"
#: links/templates/links/link_list.html:721 #: links/templates/links/link_list.html:760
msgid "Create your first post" msgid "Create your first post"
msgstr "创建你的第一篇文章" msgstr "创建你的第一篇文章"
#: links/templates/links/link_list.html:729 #: links/templates/links/link_list.html:768
msgid "Pinned Mini Apps" msgid "Pinned Mini Apps"
msgstr "置顶小应用" msgstr "置顶小应用"
#: links/templates/links/link_list.html:750 #: links/templates/links/link_list.html:789
msgid "No mini apps available" msgid "No mini apps available"
msgstr "暂无可用小应用" msgstr "暂无可用小应用"
#: links/templates/links/link_list.html:881 #: links/templates/links/link_list.html:952
msgid "No results found" msgid "No results found"
msgstr "未找到结果" msgstr "未找到结果"
#: links/templates/links/link_list.html:959 #: links/templates/links/link_list.html:1030
msgid "No matching links found" msgid "No matching links found"
msgstr "未找到匹配的链接" msgstr "未找到匹配的链接"
#: links/templates/links/link_list.html:977 #: links/templates/links/link_list.html:1048
#: links/templates/links/settings.html:199 #: links/templates/links/settings.html:199
msgid "Loading…" msgid "Loading…"
msgstr "" msgstr ""
@@ -2288,3 +2287,6 @@ msgstr ""
#: templates/pricemon/watcher_form.html:145 #: templates/pricemon/watcher_form.html:145
msgid "Testing…" msgid "Testing…"
msgstr "" msgstr ""
#~ msgid "Shuffle image"
#~ msgstr "换一张图片"