From 6ed242db18384c908bb9443a11b92d0e1b959c6b Mon Sep 17 00:00:00 2001 From: Gandalf Date: Mon, 8 Dec 2025 15:52:46 +0100 Subject: [PATCH 1/4] Add pagination to comments to prevent browser crash Posts with 1000+ comments (like ecency.waves posts with 1962 comments) caused Chrome to crash with "Aw, Snap!" due to rendering all comments at once. Changes: - Limit initial display to 50 root-level comments - Add "Show more comments" button to load 50 more at a time - Only applies to root-level (depth 1) comments, nested threads still fully expand - Added translation key for all locales Fixes #720 --- .../features/post-rendering/comment-list.tsx | 28 +++++++++++++++++-- apps/blog/locales/ar/common_blog.json | 5 +++- apps/blog/locales/en/common_blog.json | 3 ++ apps/blog/locales/es/common_blog.json | 5 +++- apps/blog/locales/fr/common_blog.json | 6 ++-- apps/blog/locales/it/common_blog.json | 5 +++- apps/blog/locales/ja/common_blog.json | 5 +++- apps/blog/locales/pl/common_blog.json | 3 ++ apps/blog/locales/ru/common_blog.json | 5 +++- apps/blog/locales/zh/common_blog.json | 5 +++- 10 files changed, 60 insertions(+), 10 deletions(-) diff --git a/apps/blog/features/post-rendering/comment-list.tsx b/apps/blog/features/post-rendering/comment-list.tsx index 9cda3202f..bf6b1f97f 100644 --- a/apps/blog/features/post-rendering/comment-list.tsx +++ b/apps/blog/features/post-rendering/comment-list.tsx @@ -3,8 +3,12 @@ import CommentListItem from '@/blog/features/post-rendering/comment-list-item'; import { Entry } from '@transaction/lib/extended-hive.chain'; import { IFollowList } from '@transaction/lib/extended-hive.chain'; +import { Button } from '@ui/components/button'; import clsx from 'clsx'; import { useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'next-i18next'; + +const COMMENTS_PER_PAGE = 50; const CommentList = ({ highestAuthor, @@ -27,7 +31,10 @@ const CommentList = ({ flagText: string | undefined; discussionPermlink: string; }) => { + const { t } = useTranslation('common_blog'); const [markedHash, setMarkedHash] = useState(""); + const [displayLimit, setDisplayLimit] = useState(COMMENTS_PER_PAGE); + const isRootLevel = parent.depth === 0; useEffect(() => { if (typeof window !== "undefined") { @@ -47,11 +54,17 @@ const CommentList = ({ const unmutedContent = filtered.filter((md) => mutedContent.every((fd) => fd.post_id !== md.post_id)); return [...mutedContent, ...unmutedContent]; }, [JSON.stringify(data), JSON.stringify(parent)]); + + // Only limit at root level to prevent browser crash with 1000+ comments + const visibleComments = isRootLevel && arr ? arr.slice(0, displayLimit) : arr; + const hasMoreComments = isRootLevel && arr && arr.length > displayLimit; + const remainingCount = arr ? arr.length - displayLimit : 0; + return ( ); diff --git a/apps/blog/locales/ar/common_blog.json b/apps/blog/locales/ar/common_blog.json index 0371b4ee6..afaae6586 100644 --- a/apps/blog/locales/ar/common_blog.json +++ b/apps/blog/locales/ar/common_blog.json @@ -463,6 +463,9 @@ "community_rules": "قواعد المجتمع", "cancel": "إلغاء", "ok": "موافق" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -621,4 +624,4 @@ "trending_posts": "المشاركات الرائجة", "muted_posts": "المشاركات الصامتة" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/en/common_blog.json b/apps/blog/locales/en/common_blog.json index 846eab10a..83808725d 100644 --- a/apps/blog/locales/en/common_blog.json +++ b/apps/blog/locales/en/common_blog.json @@ -458,6 +458,9 @@ "we_are_just_verifying": "We are just verifying with you that you want to continue.", "open_link": "Open Link" }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" + }, "footer": { "and_more": "and {{value}} more", "in": "in", diff --git a/apps/blog/locales/es/common_blog.json b/apps/blog/locales/es/common_blog.json index 6ac72425a..b8f1fbecb 100644 --- a/apps/blog/locales/es/common_blog.json +++ b/apps/blog/locales/es/common_blog.json @@ -415,6 +415,9 @@ "community_rules": "Reglas de la comunidad", "cancel": "Cancelar", "ok": "Aceptar" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -573,4 +576,4 @@ "trending_posts": "publicaciones de tendencia", "muted_posts": "publicaciones silenciadas" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/fr/common_blog.json b/apps/blog/locales/fr/common_blog.json index d8ea61ff6..e5486eceb 100644 --- a/apps/blog/locales/fr/common_blog.json +++ b/apps/blog/locales/fr/common_blog.json @@ -415,6 +415,9 @@ "community_rules": "Règles de la communauté", "cancel": "Annuler", "ok": "OK" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -509,7 +512,6 @@ "no_results": "Nothing was found.", "error": "There was an error" }, - "settings_page": { "invalid_url": "URL invalide", "name_is_too_long": "Le nom est trop long", @@ -574,4 +576,4 @@ "trending_posts": "posts tendances", "muted_posts": "posts muets" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/it/common_blog.json b/apps/blog/locales/it/common_blog.json index b6d53befe..58d257f9c 100644 --- a/apps/blog/locales/it/common_blog.json +++ b/apps/blog/locales/it/common_blog.json @@ -415,6 +415,9 @@ "community_rules": "Regole della comunità", "cancel": "Annulla", "ok": "OK" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -573,4 +576,4 @@ "trending_posts": "post di tendenza", "muted_posts": "post silenziati" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/ja/common_blog.json b/apps/blog/locales/ja/common_blog.json index e2672cd79..1ef003dc4 100644 --- a/apps/blog/locales/ja/common_blog.json +++ b/apps/blog/locales/ja/common_blog.json @@ -415,6 +415,9 @@ "community_rules": "コミュニティ規則", "cancel": "キャンセル", "ok": "OK" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -573,4 +576,4 @@ "trending_posts": "トレンド投稿", "muted_posts": "ミュートされた投稿" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/pl/common_blog.json b/apps/blog/locales/pl/common_blog.json index a2b65c6e1..aef26b801 100644 --- a/apps/blog/locales/pl/common_blog.json +++ b/apps/blog/locales/pl/common_blog.json @@ -379,6 +379,9 @@ "we_are_just_verifying": "Właśnie sprawdzamy, czy chcesz kontynuować.", "open_link": "Otwórz Link" }, + "comments": { + "show_more": "Pokaż więcej komentarzy ({{count}} pozostało)" + }, "footer": { "and_more": "i {{value}} więcej", "in": "w", diff --git a/apps/blog/locales/ru/common_blog.json b/apps/blog/locales/ru/common_blog.json index 5453b1058..7e7d2d59b 100644 --- a/apps/blog/locales/ru/common_blog.json +++ b/apps/blog/locales/ru/common_blog.json @@ -421,6 +421,9 @@ "community_rules": "Правила сообщества", "cancel": "Отмена", "ok": "OK" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -579,4 +582,4 @@ "trending_posts": "трендовые посты", "muted_posts": "приглушенные посты" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/zh/common_blog.json b/apps/blog/locales/zh/common_blog.json index 15869955f..ebf2325b9 100644 --- a/apps/blog/locales/zh/common_blog.json +++ b/apps/blog/locales/zh/common_blog.json @@ -415,6 +415,9 @@ "community_rules": "社区规则", "cancel": "取消", "ok": "确定" + }, + "comments": { + "show_more": "Show more comments ({{count}} remaining)" } }, "submit_page": { @@ -573,4 +576,4 @@ "trending_posts": "趋势帖子", "muted_posts": "静音帖子" } -} +} \ No newline at end of file -- GitLab From 4d39e9b858b7951d3ebc94f1055e73482ac1aed7 Mon Sep 17 00:00:00 2001 From: Gandalf Date: Mon, 8 Dec 2025 16:04:54 +0100 Subject: [PATCH 2/4] Add hidden links for crawler accessibility of paginated comments Comments beyond the initial 50 are now accessible to web crawlers via visually hidden links (sr-only). This ensures search engines can index all comments even though users need to click "Show more" to view them. The hidden links use individual comment page URLs which crawlers can follow to discover additional content. --- .../features/post-rendering/comment-list.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/blog/features/post-rendering/comment-list.tsx b/apps/blog/features/post-rendering/comment-list.tsx index bf6b1f97f..05fb7240a 100644 --- a/apps/blog/features/post-rendering/comment-list.tsx +++ b/apps/blog/features/post-rendering/comment-list.tsx @@ -5,6 +5,7 @@ import { Entry } from '@transaction/lib/extended-hive.chain'; import { IFollowList } from '@transaction/lib/extended-hive.chain'; import { Button } from '@ui/components/button'; import clsx from 'clsx'; +import Link from 'next/link'; import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'next-i18next'; @@ -59,6 +60,10 @@ const CommentList = ({ const visibleComments = isRootLevel && arr ? arr.slice(0, displayLimit) : arr; const hasMoreComments = isRootLevel && arr && arr.length > displayLimit; const remainingCount = arr ? arr.length - displayLimit : 0; + // Hidden comments - not rendered but links are crawlable + const hiddenComments = isRootLevel && arr && arr.length > displayLimit + ? arr.slice(displayLimit) + : []; return (
    @@ -115,6 +120,19 @@ const CommentList = ({ )} + {/* Hidden links for crawlers - visually hidden but present in HTML */} + {hiddenComments.length > 0 && ( + + )}
); -- GitLab From 78c0176739715265190b3b277059b7fa1323d955 Mon Sep 17 00:00:00 2001 From: Gandalf Date: Mon, 8 Dec 2025 23:52:27 +0100 Subject: [PATCH 3/4] Remove hidden crawler links, keep simple pagination Hidden links approach wasn't ideal. The "Show more" pagination alone prevents browser crash by limiting initial render to 50 comments. Crawler accessibility can be addressed separately with URL-based pagination if needed after testing confirms the fix works. --- .../features/post-rendering/comment-list.tsx | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/apps/blog/features/post-rendering/comment-list.tsx b/apps/blog/features/post-rendering/comment-list.tsx index 05fb7240a..bf6b1f97f 100644 --- a/apps/blog/features/post-rendering/comment-list.tsx +++ b/apps/blog/features/post-rendering/comment-list.tsx @@ -5,7 +5,6 @@ import { Entry } from '@transaction/lib/extended-hive.chain'; import { IFollowList } from '@transaction/lib/extended-hive.chain'; import { Button } from '@ui/components/button'; import clsx from 'clsx'; -import Link from 'next/link'; import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'next-i18next'; @@ -60,10 +59,6 @@ const CommentList = ({ const visibleComments = isRootLevel && arr ? arr.slice(0, displayLimit) : arr; const hasMoreComments = isRootLevel && arr && arr.length > displayLimit; const remainingCount = arr ? arr.length - displayLimit : 0; - // Hidden comments - not rendered but links are crawlable - const hiddenComments = isRootLevel && arr && arr.length > displayLimit - ? arr.slice(displayLimit) - : []; return (
    @@ -120,19 +115,6 @@ const CommentList = ({ )} - {/* Hidden links for crawlers - visually hidden but present in HTML */} - {hiddenComments.length > 0 && ( - - )}
); -- GitLab From b27dcf7b0b1255b780f89b5e371d5158f37f73f8 Mon Sep 17 00:00:00 2001 From: Gandalf Date: Tue, 9 Dec 2025 17:56:24 +0100 Subject: [PATCH 4/4] Add URL-based pagination for crawler accessibility - Add /api/comments/[author]/[permlink] API route with in-memory caching - Add visible pagination links that crawlers can follow without JS - Support ?comments_page=N query parameter for URL-based navigation - Pass initialPage to CommentList for SSR of specific pages - Add pagination translation keys for all locales The pagination links appear below the "Show more" button, providing both: - JS-enabled "Show more" for smooth UX - Real links for crawlers to discover all comments Addresses issue #720 crawler accessibility concerns. --- .../app/[param]/[p2]/[permlink]/content.tsx | 5 +- .../blog/app/[param]/[p2]/[permlink]/page.tsx | 9 +- .../api/comments/[author]/[permlink]/route.ts | 103 ++++++++++++++++++ .../features/post-rendering/comment-list.tsx | 31 +++++- apps/blog/locales/ar/common_blog.json | 4 +- apps/blog/locales/en/common_blog.json | 4 +- apps/blog/locales/es/common_blog.json | 4 +- apps/blog/locales/fr/common_blog.json | 4 +- apps/blog/locales/it/common_blog.json | 4 +- apps/blog/locales/ja/common_blog.json | 4 +- apps/blog/locales/pl/common_blog.json | 6 +- apps/blog/locales/ru/common_blog.json | 4 +- apps/blog/locales/zh/common_blog.json | 4 +- 13 files changed, 170 insertions(+), 16 deletions(-) create mode 100644 apps/blog/app/api/comments/[author]/[permlink]/route.ts diff --git a/apps/blog/app/[param]/[p2]/[permlink]/content.tsx b/apps/blog/app/[param]/[p2]/[permlink]/content.tsx index 89e37f170..44c9fa546 100644 --- a/apps/blog/app/[param]/[p2]/[permlink]/content.tsx +++ b/apps/blog/app/[param]/[p2]/[permlink]/content.tsx @@ -64,12 +64,13 @@ import { useLocalStorage } from 'usehooks-ts'; import { useUserClient } from '@smart-signer/lib/auth/use-user-client'; import VotesComponentWrapper from '@/blog/features/votes/votes-component-wrapper'; -const PostContent = () => { +const PostContent = ({ initialCommentsPage = 1 }: { initialCommentsPage?: number }) => { const searchParams = useSearchParams(); const params = useParams<{ param: string; p2: string; permlink: string }>(); const router = useRouter(); const pathname = usePathname(); const commentSort = searchParams?.get('sort') || 'trending'; + const commentsPage = parseInt(searchParams?.get('comments_page') || String(initialCommentsPage), 10) || 1; const author = params?.p2.replace('%40', '') ?? ''; const category = params?.param ?? ''; const permlink = params?.permlink ?? ''; @@ -688,6 +689,8 @@ const PostContent = () => { parent={postData} parent_depth={postData.depth} discussionPermlink={permlink} + initialPage={commentsPage} + sort={commentSort} /> ) : ( diff --git a/apps/blog/app/[param]/[p2]/[permlink]/page.tsx b/apps/blog/app/[param]/[p2]/[permlink]/page.tsx index 79756c563..bde21a218 100644 --- a/apps/blog/app/[param]/[p2]/[permlink]/page.tsx +++ b/apps/blog/app/[param]/[p2]/[permlink]/page.tsx @@ -14,10 +14,15 @@ import { getLogger } from '@ui/lib/logging'; const logger = getLogger('app'); const PostPage = async ({ - params: { param, p2, permlink } + params: { param, p2, permlink }, + searchParams }: { params: { param: string; p2: string; permlink: string }; + searchParams: { [key: string]: string | string[] | undefined }; }) => { + const commentsPage = typeof searchParams?.comments_page === 'string' + ? parseInt(searchParams.comments_page, 10) || 1 + : 1; const queryClient = getQueryClient(); const username = p2.replace('%40', ''); const community = param; @@ -59,7 +64,7 @@ const PostPage = async ({ return ( }> - + ); diff --git a/apps/blog/app/api/comments/[author]/[permlink]/route.ts b/apps/blog/app/api/comments/[author]/[permlink]/route.ts new file mode 100644 index 000000000..f9143d76d --- /dev/null +++ b/apps/blog/app/api/comments/[author]/[permlink]/route.ts @@ -0,0 +1,103 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDiscussion } from '@transaction/lib/bridge-api'; +import { sorter, SortOrder } from '@/blog/lib/sorter'; +import { Entry } from '@transaction/lib/extended-hive.chain'; + +// In-memory cache for discussion data +// Key: "author/permlink", Value: { data, timestamp } +const discussionCache = new Map(); +const CACHE_TTL = 60000; // 60 seconds + +interface CommentResponse { + comments: Entry[]; + totalCount: number; + nextCursor: { author: string; permlink: string } | null; +} + +async function getCachedDiscussion(author: string, permlink: string): Promise { + const cacheKey = `${author}/${permlink}`; + const cached = discussionCache.get(cacheKey); + const now = Date.now(); + + if (cached && now - cached.timestamp < CACHE_TTL) { + return cached.data; + } + + // Fetch fresh data + const discussionData = await getDiscussion(author, permlink); + + if (!discussionData) { + return []; + } + + // Convert Record to Entry[] and filter out the root post + const comments = Object.values(discussionData).filter( + (entry) => entry.author !== author || entry.permlink !== permlink + ); + + // Cache the result + discussionCache.set(cacheKey, { data: comments, timestamp: now }); + + return comments; +} + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ author: string; permlink: string }> } +): Promise> { + try { + const { author, permlink } = await params; + const searchParams = request.nextUrl.searchParams; + + const sort = (searchParams.get('sort') as SortOrder) || SortOrder.new; + const afterAuthor = searchParams.get('after_author') || ''; + const afterPermlink = searchParams.get('after_permlink') || ''; + const limit = Math.min(parseInt(searchParams.get('limit') || '50', 10), 100); + + // Get cached or fresh discussion + const comments = await getCachedDiscussion(author, permlink); + + if (comments.length === 0) { + return NextResponse.json({ + comments: [], + totalCount: 0, + nextCursor: null + }); + } + + // Make a copy to avoid mutating cached data + const sortedComments = [...comments]; + + // Sort comments + sorter(sortedComments, sort); + + // Find cursor position + let startIndex = 0; + if (afterAuthor && afterPermlink) { + const cursorIndex = sortedComments.findIndex( + (c) => c.author === afterAuthor && c.permlink === afterPermlink + ); + if (cursorIndex !== -1) { + startIndex = cursorIndex + 1; + } + } + + // Slice to get the page + const slice = sortedComments.slice(startIndex, startIndex + limit); + const hasMore = startIndex + limit < sortedComments.length; + + // Build next cursor + const nextCursor = hasMore && slice.length > 0 + ? { author: slice[slice.length - 1].author, permlink: slice[slice.length - 1].permlink } + : null; + + return NextResponse.json({ + comments: slice, + totalCount: sortedComments.length, + nextCursor + }); + } catch (error) { + console.error('Error fetching comments:', error); + return NextResponse.json({ error: 'Failed to fetch comments' }, { status: 500 }); + } +} diff --git a/apps/blog/features/post-rendering/comment-list.tsx b/apps/blog/features/post-rendering/comment-list.tsx index bf6b1f97f..282c00af1 100644 --- a/apps/blog/features/post-rendering/comment-list.tsx +++ b/apps/blog/features/post-rendering/comment-list.tsx @@ -5,6 +5,7 @@ import { Entry } from '@transaction/lib/extended-hive.chain'; import { IFollowList } from '@transaction/lib/extended-hive.chain'; import { Button } from '@ui/components/button'; import clsx from 'clsx'; +import Link from 'next/link'; import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'next-i18next'; @@ -19,7 +20,9 @@ const CommentList = ({ parent_depth, mutedList, flagText, - discussionPermlink + discussionPermlink, + initialPage = 1, + sort = 'trending' }: { highestAuthor: string; highestPermlink: string; @@ -30,10 +33,13 @@ const CommentList = ({ mutedList: IFollowList[]; flagText: string | undefined; discussionPermlink: string; + initialPage?: number; + sort?: string; }) => { const { t } = useTranslation('common_blog'); const [markedHash, setMarkedHash] = useState(""); - const [displayLimit, setDisplayLimit] = useState(COMMENTS_PER_PAGE); + // Start with initialPage worth of comments shown + const [displayLimit, setDisplayLimit] = useState(COMMENTS_PER_PAGE * initialPage); const isRootLevel = parent.depth === 0; useEffect(() => { @@ -60,6 +66,12 @@ const CommentList = ({ const hasMoreComments = isRootLevel && arr && arr.length > displayLimit; const remainingCount = arr ? arr.length - displayLimit : 0; + // Calculate pagination info for crawler-friendly links + const totalComments = arr?.length || 0; + const totalPages = Math.ceil(totalComments / COMMENTS_PER_PAGE); + const currentPage = Math.ceil(displayLimit / COMMENTS_PER_PAGE); + const nextPage = currentPage < totalPages ? currentPage + 1 : null; + return (
    <> @@ -105,7 +117,8 @@ const CommentList = ({ )) : null} {hasMoreComments && ( -
  • +
  • + {/* JS-enabled button for better UX */} + {/* Visible link for crawlers - works without JS */} + {nextPage && ( + + )}
  • )} diff --git a/apps/blog/locales/ar/common_blog.json b/apps/blog/locales/ar/common_blog.json index afaae6586..17a71d5ed 100644 --- a/apps/blog/locales/ar/common_blog.json +++ b/apps/blog/locales/ar/common_blog.json @@ -465,7 +465,9 @@ "ok": "موافق" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/en/common_blog.json b/apps/blog/locales/en/common_blog.json index 83808725d..30f6859f7 100644 --- a/apps/blog/locales/en/common_blog.json +++ b/apps/blog/locales/en/common_blog.json @@ -459,7 +459,9 @@ "open_link": "Open Link" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" }, "footer": { "and_more": "and {{value}} more", diff --git a/apps/blog/locales/es/common_blog.json b/apps/blog/locales/es/common_blog.json index b8f1fbecb..8b5ae42fd 100644 --- a/apps/blog/locales/es/common_blog.json +++ b/apps/blog/locales/es/common_blog.json @@ -417,7 +417,9 @@ "ok": "Aceptar" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/fr/common_blog.json b/apps/blog/locales/fr/common_blog.json index e5486eceb..cf25869ab 100644 --- a/apps/blog/locales/fr/common_blog.json +++ b/apps/blog/locales/fr/common_blog.json @@ -417,7 +417,9 @@ "ok": "OK" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/it/common_blog.json b/apps/blog/locales/it/common_blog.json index 58d257f9c..6d4731f38 100644 --- a/apps/blog/locales/it/common_blog.json +++ b/apps/blog/locales/it/common_blog.json @@ -417,7 +417,9 @@ "ok": "OK" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/ja/common_blog.json b/apps/blog/locales/ja/common_blog.json index 1ef003dc4..4ca97c525 100644 --- a/apps/blog/locales/ja/common_blog.json +++ b/apps/blog/locales/ja/common_blog.json @@ -417,7 +417,9 @@ "ok": "OK" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/pl/common_blog.json b/apps/blog/locales/pl/common_blog.json index aef26b801..b1874f86b 100644 --- a/apps/blog/locales/pl/common_blog.json +++ b/apps/blog/locales/pl/common_blog.json @@ -380,7 +380,9 @@ "open_link": "Otwórz Link" }, "comments": { - "show_more": "Pokaż więcej komentarzy ({{count}} pozostało)" + "show_more": "Pokaż więcej komentarzy ({{count}} pozostało)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" }, "footer": { "and_more": "i {{value}} więcej", @@ -590,4 +592,4 @@ "trending_posts": "trendingowe posty", "muted_posts": "wyciszone posty" } -} +} \ No newline at end of file diff --git a/apps/blog/locales/ru/common_blog.json b/apps/blog/locales/ru/common_blog.json index 7e7d2d59b..a8dc3f9fd 100644 --- a/apps/blog/locales/ru/common_blog.json +++ b/apps/blog/locales/ru/common_blog.json @@ -423,7 +423,9 @@ "ok": "OK" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { diff --git a/apps/blog/locales/zh/common_blog.json b/apps/blog/locales/zh/common_blog.json index ebf2325b9..561430dfc 100644 --- a/apps/blog/locales/zh/common_blog.json +++ b/apps/blog/locales/zh/common_blog.json @@ -417,7 +417,9 @@ "ok": "确定" }, "comments": { - "show_more": "Show more comments ({{count}} remaining)" + "show_more": "Show more comments ({{count}} remaining)", + "pagination_label": "Comment pagination", + "page_link": "Page {{page}} of {{total}}" } }, "submit_page": { -- GitLab