fix(share): align remaining owner share copy and K1 sync count with final design

- S0: signed-out description uses the design copy via its own key; the
  publish-failure message keeps its original text.
- S5: update notice reads 「文件有新改动,访问者看到的还是上一版。」.
- K2/K5: the failed-sync notice drops the 「分享已发布」 title and uses the
  design copy; terminal variants keep their own wording.
- K1: first-publication sync shows 「同步已有评论 · N 条」. The backfill
  state carries optional total/synced from the daemon's backfill members
  table, driving a determinate bar when progress is known; older daemons
  fall back to the previous copy and the indeterminate sweep.
- Refresh the PR screenshot of the Share popup comment-sync state.
This commit is contained in:
a1chzt
2026-09-26 15:41:35 +08:00
parent 7c3ac653ef
commit 30361fd670
35 changed files with 330 additions and 102 deletions
@@ -167,12 +167,22 @@ export function readPublishedCommentBackfill(
subject.workspaceId, subject.workspaceMemberId, subject.projectId, subject.filePath, current.revision,
) as { state?: unknown; retryable?: unknown; code?: unknown; reopened?: unknown } | undefined;
if (!row || (row.state !== 'pending' && row.state !== 'succeeded' && row.state !== 'failed')) return undefined;
// Real, measured progress from the SAME batch — the exact initial member
// set this revision's backfill recorded at publish time — not an estimate.
// A total of 0 never reaches here as `pending` (an empty batch is recorded
// `succeeded` immediately), so this only ever adds a meaningful count.
const members = db.prepare(`SELECT COUNT(*) AS total, COALESCE(SUM(delivered), 0) AS synced
FROM published_comment_backfill_members
WHERE workspace_id=? AND workspace_member_id=? AND project_id=? AND file_path=? AND publication_revision=?`).get(
subject.workspaceId, subject.workspaceMemberId, subject.projectId, subject.filePath, current.revision,
) as { total: number; synced: number };
const result: CommentBackfillState = {
state: row.state,
filePath: subject.filePath,
publicationRevision: current.revision,
retryable: row.retryable === 1,
...(row.reopened === 0 || row.reopened === 1 ? { reopened: row.reopened === 1 } : {}),
...(members.total > 0 ? { total: members.total, synced: members.synced } : {}),
};
return typeof row.code === 'string' && row.code ? { ...result, code: row.code } : result;
}
@@ -84,7 +84,19 @@ it('persists the exact initial batch and exposes empty and pending current state
publications.set(next, { slug: 'share-b', url: 'https://example.test/b', fileName: 'b.html' });
const nextRevision = publications.getRevision(next)!;
db.transaction(() => recordPublishedCommentBackfill(db, { scope: next, publicationRevision: nextRevision, commentIds: ['initial'] }))();
expect(readPublishedCommentBackfill(db, { ...subject, filePath: 'b.html' })).toEqual({ state: 'pending', filePath: 'b.html', publicationRevision: nextRevision.token, retryable: false });
expect(readPublishedCommentBackfill(db, { ...subject, filePath: 'b.html' })).toEqual({ state: 'pending', filePath: 'b.html', publicationRevision: nextRevision.token, retryable: false, total: 1, synced: 0 });
});
it('reports the initial batch size and delivered count as real, measured progress', () => {
const { db, scope, revision, subject } = setup();
db.transaction(() => recordPublishedCommentBackfill(db, { scope, publicationRevision: revision, commentIds: ['a', 'b', 'c'] }))();
expect(readPublishedCommentBackfill(db, subject)).toMatchObject({ state: 'pending', total: 3, synced: 0 });
const record = (commentId: string) => ({ workspaceId: scope.resourceTeamId, workspaceMemberId: scope.ownerMemberId, projectId: scope.projectId, commentId, comment: { filePath: scope.filePath }, publication: { slug: revision.slug, token: revision.token, publicFilePath: 'index.html' } });
markPublishedCommentBackfillOutcome(db, record('a'), 'delivered');
expect(readPublishedCommentBackfill(db, subject)).toMatchObject({ state: 'pending', total: 3, synced: 1 });
markPublishedCommentBackfillOutcome(db, record('b'), 'delivered');
markPublishedCommentBackfillOutcome(db, record('c'), 'delivered');
expect(readPublishedCommentBackfill(db, subject)).toMatchObject({ state: 'succeeded', total: 3, synced: 3 });
});
it('requires delivered receipts for every initial member and keeps failures file and revision scoped', () => {
@@ -95,7 +107,7 @@ it('requires delivered receipts for every initial member and keeps failures file
markPublishedCommentBackfillOutcome(db, record('late'), 'delivered');
expect(readPublishedCommentBackfill(db, subject)?.state).toBe('pending');
markPublishedCommentBackfillOutcome(db, record('b'), 'deferred');
expect(readPublishedCommentBackfill(db, subject)).toEqual({ state: 'failed', filePath: 'a.html', publicationRevision: revision.token, retryable: true, code: 'BACKFILL_DELIVERY_DEFERRED' });
expect(readPublishedCommentBackfill(db, subject)).toEqual({ state: 'failed', filePath: 'a.html', publicationRevision: revision.token, retryable: true, code: 'BACKFILL_DELIVERY_DEFERRED', total: 2, synced: 1 });
markPublishedCommentBackfillOutcome(db, record('b'), 'delivered');
expect(readPublishedCommentBackfill(db, subject)?.state).toBe('succeeded');
// Once this publication's initial value arrived, a later ordinary edit
@@ -123,7 +135,7 @@ it('marks queue removal as a safe discard by default, but succeeds only with exp
});
enqueue('a');
expect(outbox.acknowledge(outbox.listDue(1)[0]!)).toBe(true);
expect(readPublishedCommentBackfill(db, subject)).toEqual({ state: 'failed', filePath: 'a.html', publicationRevision: revision.token, retryable: false, code: 'BACKFILL_DELIVERY_DISCARDED' });
expect(readPublishedCommentBackfill(db, subject)).toEqual({ state: 'failed', filePath: 'a.html', publicationRevision: revision.token, retryable: false, code: 'BACKFILL_DELIVERY_DISCARDED', total: 2, synced: 0 });
enqueue('b');
expect(outbox.defer(outbox.listDue(1)[0]!, { nextAttemptAt: 1, error: 'credential=secret' })).toBe(true);
@@ -133,7 +145,7 @@ it('marks queue removal as a safe discard by default, but succeeds only with exp
for (const row of outbox.listDue(1)) expect(outbox.acknowledge(row, 'delivered')).toBe(true);
closeDatabase();
const reopened = openDatabase(root!);
expect(readPublishedCommentBackfill(reopened, subject)).toEqual({ state: 'succeeded', filePath: 'a.html', publicationRevision: revision.token, retryable: false });
expect(readPublishedCommentBackfill(reopened, subject)).toEqual({ state: 'succeeded', filePath: 'a.html', publicationRevision: revision.token, retryable: false, total: 2, synced: 2 });
});
it('migrates legacy batches without inventing a first-publication origin and retains a verified reopened revision', () => {
+1 -1
View File
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
import "./../../.tmp/e2e/playwright-30175-9dd75b19-w0/i0-p30183/scratch/tools-dev/playwright-30175-9dd75b19-w0/web/next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -133,7 +133,6 @@ export function CommentSyncBanner({ projectId, workspaceContext, filePath, inclu
if (includeBackfill && state.backfill?.state === 'failed') {
return (
<div className={backfillOnly ? `${styles.banner} ${styles.backfillOnly}` : styles.banner} role="status">
<p className={styles.title}>{t('fileViewer.commentSync.backfillFailedTitle')}</p>
<div className={styles.retryRow}>
<p>{t(state.backfill.reopened === true
? (state.backfill.retryable
@@ -538,9 +538,11 @@ button.updateButton:focus-visible {
/* K1/K4: comment-sync-pending replaces the entire published-link block with
a single indicator — a progress bar for the first-publish backfill (K1,
`reopened` absent/false) or a busy primary button for a verified reopen
resync (K4, `reopened === true`). CommentSyncState/CommentBackfillState
carry no live percentage or item count, so the fill is an indeterminate
sweep rather than a fabricated number. */
resync (K4, `reopened === true`). When CommentBackfillState carries a real,
measured `total`/`synced` (from published_comment_backfill_members), the
fill renders that percentage via `.syncProgressFillDeterminate`; an older
daemon that omits those fields keeps the indeterminate sweep below rather
than fabricating a number. */
.syncStatus {
display: grid;
}
@@ -572,6 +574,13 @@ button.updateButton:focus-visible {
100% { left: -35%; }
}
/* Real measured progress (K1 with a known comment count): a plain static
fill anchored to the left edge, its width set inline per render. */
.syncProgressFillDeterminate {
left: 0;
animation: none;
}
.syncProgressText {
position: absolute;
inset: 0;
+30 -4
View File
@@ -220,6 +220,16 @@ export function ShareTab({
const backfillPending = filePublished && commentSyncState?.backfill?.state === 'pending'
? commentSyncState.backfill
: null;
// K1 design ("同步已有评论 · 12 条") names the initial batch size. An older
// daemon that predates CommentBackfillState.total leaves it absent, not
// zero — that keeps the indeterminate sweep and the generic sentence
// instead of rendering "0 条" for a count nobody measured.
const backfillTotal = typeof backfillPending?.total === 'number' && backfillPending.total > 0
? backfillPending.total
: null;
const backfillProgress = backfillTotal !== null && typeof backfillPending?.synced === 'number'
? Math.min(1, Math.max(0, backfillPending.synced / backfillTotal))
: null;
const updateAvailable = Boolean(updateCurrentFilePublic) && filePublished && shareEntryPresentation({
status: publicationStatus ?? 'none', freshness: publicationFreshness,
}).appearance === 'outdated';
@@ -312,15 +322,31 @@ export function ShareTab({
<span>{t('fileViewer.commentSync.reopenSyncBusy')}</span>
</Button>
) : (
<div className={styles.syncProgress} aria-label={t('fileViewer.commentSync.backfillPendingBody')}>
<div className={styles.syncProgressFill} aria-hidden="true" />
<>
<div
className={styles.syncProgress}
aria-label={backfillTotal !== null
? t('fileViewer.commentSync.backfillPendingCountBody', { count: backfillTotal })
: t('fileViewer.commentSync.backfillPendingBody')}
>
<div
className={backfillProgress !== null
? `${styles.syncProgressFill} ${styles.syncProgressFillDeterminate}`
: styles.syncProgressFill}
aria-hidden="true"
style={backfillProgress !== null ? { width: `${Math.round(backfillProgress * 100)}%` } : undefined}
/>
<div className={styles.syncProgressText}>
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" aria-hidden="true" focusable="false" className="icon-spin">
<path d="M12 3a9 9 0 1 0 9 9" />
</svg>
<span>{t('fileViewer.commentSync.backfillPendingBody')}</span>
<span>{backfillTotal !== null
? t('fileViewer.commentSync.backfillPendingCountBody', { count: backfillTotal })
: t('fileViewer.commentSync.backfillPendingBody')}</span>
</div>
</div>
<p className={styles.publishHint}>{t('fileViewer.publishingContinuesOnClose')}</p>
</>
)}
</div>
) : (
@@ -430,7 +456,7 @@ export function ShareTab({
<div className={styles.signInPrompt}>
<div className={styles.linkAccessHeading}>
<span className={styles.linkAccessLabel}>{t('fileViewer.linkAccessTitle')}</span>
<p className={styles.linkAccessDescription}>{t(canResumeUpdateAfterLogin ? 'fileViewer.shareOutdatedSignInHint' : 'fileViewer.publishFileRequiresWorkspace')}</p>
<p className={styles.linkAccessDescription}>{t(canResumeUpdateAfterLogin ? 'fileViewer.shareOutdatedSignInHint' : 'fileViewer.signInToShareDescription')}</p>
</div>
{filePublished && publishedFileUrl ? (
<SharePublishedLinkControls
+5 -4
View File
@@ -237,14 +237,14 @@ export const ar: Dict = {
'fileViewer.commentSync.sessionMissing': "لم تسجّل الدخول. مزامنة التعليقات متوقفة مؤقتًا؛ تعليقات الزوار الجديدة غير ظاهرة حاليًا.",
'fileViewer.commentSync.shareStoppedPersonal': "الرابط معطّل. مزامنة التعليقات مع الصفحة المشتركة متوقفة مؤقتًا.",
'fileViewer.commentSync.shareStoppedTeam': "الرابط معطّل.",
'fileViewer.commentSync.backfillFailedTitle': "تم نشر المشاركة",
'fileViewer.commentSync.backfillFailedBody': "التعليقات الحالية لم تتم مزامنتها بعد؛ لا يمكن للزوار رؤيتها مؤقتًا.",
'fileViewer.commentSync.backfillTerminalBody': "تعذرت مزامنة بعض التعليقات الحالية مع صفحة المشاركة ولن تتم إعادة المحاولة تلقائيًا. يظل رابط المشاركة متاحًا.",
'fileViewer.commentSync.backfillRetryingBody': "لم تتم مزامنة التعليقات الحالية بعد، ولا يمكن للزوار رؤيتها مؤقتًا. ستتم إعادة المحاولة تلقائيًا في الخلفية.",
'fileViewer.commentSync.backfillRetryingBody': "لم تتم مزامنة التعليقات الحالية بعد، لذا لا يمكن للزوار رؤيتها حاليًا. تتم إعادة المحاولة تلقائيًا.",
'fileViewer.commentSync.backfillReopenedPendingBody': "تجري مزامنة تعليقات رابط المشاركة الذي أعيد تفعيله. قد تظل التعليقات المحذوفة أو التي تم حلها ظاهرة على صفحة المشاركة.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "لم تكتمل مزامنة التعليقات بعد. قد تظل التعليقات المحذوفة أو التي تم حلها ظاهرة على صفحة المشاركة. تجري إعادة المحاولة تلقائيًا في الخلفية.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "لم تكتمل مزامنة التعليقات. قد تظل صفحة المشاركة تعرض تعليقات تمت معالجتها.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "لم تكتمل مزامنة التعليقات بعد. قد تظل التعليقات المحذوفة أو التي تم حلها ظاهرة على صفحة المشاركة. توقفت إعادة المحاولة التلقائية؛ ولا يزال رابط المشاركة متاحًا.",
'fileViewer.commentSync.backfillPendingBody': "تتم مزامنة التعليقات الحالية. قد لا يتمكن الزوار من رؤيتها بعد.",
'fileViewer.commentSync.backfillPendingCountBody': "مزامنة التعليقات الحالية · {count}",
"fileViewer.commentSync.reopenSyncBusy": "جارٍ مزامنة التعليقات…",
'fileViewer.commentSync.alignFailedBody': "لم تكتمل مطابقة التعليقات؛ قد تكون بعض التعليقات غير ظاهرة.",
'fileViewer.shareGuide.title': "شارك الرابط لجمع الملاحظات",
@@ -3302,11 +3302,12 @@ export const ar: Dict = {
'fileViewer.publishFileRequiresTeam': 'يتطلب نشر رابط عام مساحة عمل جماعية. بدّل إلى مساحة عمل جماعية، أو استخدم النشر لإتاحة هذا الملف.',
'fileViewer.publishFileRequiresWorkspace': 'يتطلب رابط المشاركة مساحة عمل مسجّلة الدخول. سجّل الدخول إلى OpenDesign Cloud أو شارك هذا الملف عبر النشر.',
'fileViewer.publishFileTooLarge': "يتجاوز هذا المشروع حد المشاركة البالغ 20 MiB. قلّل حجم HTML والموارد المشار إليها، ثم أعد المحاولة.",
"fileViewer.shareUpdateHint": "يحتوي الملف على تغييرات جديدة. حدّث الرابط لمشاركة أحدث إصدار.",
"fileViewer.shareUpdateHint": "يحتوي الملف على تغييرات جديدة. لا يزال الزوار يرون الإصدار السابق.",
"fileViewer.shareUpdateLink": "تحديث الرابط",
"fileViewer.signInToUpdate": "سجّل الدخول للتحديث",
"fileViewer.signInToShare": "سجّل الدخول للمشاركة",
"fileViewer.shareOutdatedSignInHint": "يحتوي هذا الملف على تغييرات جديدة. سجّل الدخول لتحديث الرابط أو إيقافه.",
'fileViewer.signInToShareDescription': "سجّل الدخول إلى Open Design لإنشاء رابط مشاركة ودعوة الآخرين للعرض والتعليق.",
"fileViewer.shareUpdateSuccess": "تم التحديث. سيرى الزوار أحدث إصدار بعد تحديث الصفحة.",
"fileViewer.shareUpdateFailed": "فشل التحديث. لا يزال الزوار يرون الإصدار السابق.",
"fileViewer.shareUpdateUncertain": "نتيجة التحديث غير معروفة. ربما تغيّر محتوى الرابط العام. تحقّق من الرابط أو أوقف المشاركة قبل إعادة المحاولة.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const de: Dict = {
'fileViewer.commentSync.sessionMissing': "Nicht angemeldet. Die Kommentarsynchronisierung pausiert; neue Besucherkommentare sind vorübergehend nicht sichtbar.",
'fileViewer.commentSync.shareStoppedPersonal': "Der Link ist deaktiviert. Die Kommentarsynchronisierung mit der geteilten Seite pausiert.",
'fileViewer.commentSync.shareStoppedTeam': "Der Link ist deaktiviert.",
'fileViewer.commentSync.backfillFailedTitle': "Freigabe veröffentlicht",
'fileViewer.commentSync.backfillFailedBody': "Vorhandene Kommentare wurden noch nicht synchronisiert – Besucher sehen sie vorübergehend nicht.",
'fileViewer.commentSync.backfillTerminalBody': "Einige vorhandene Kommentare konnten nicht mit der Freigabeseite synchronisiert werden und werden nicht automatisch erneut versucht. Der Freigabelink bleibt verfügbar.",
'fileViewer.commentSync.backfillRetryingBody': "Vorhandene Kommentare wurden noch nicht synchronisiert – Besucher sehen sie vorerst nicht. Im Hintergrund wird automatisch erneut versucht.",
'fileViewer.commentSync.backfillRetryingBody': "Vorhandene Kommentare sind noch nicht synchronisiert und für Besucher vorerst nicht sichtbar. Wird automatisch erneut versucht.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Kommentare für diesen erneut aktivierten Freigabelink werden synchronisiert. Gelöschte oder erledigte Kommentare können auf der Freigabeseite noch sichtbar sein.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Die Kommentarsynchronisierung ist noch nicht abgeschlossen. Gelöschte oder erledigte Kommentare können auf der Freigabeseite noch sichtbar sein. Im Hintergrund wird automatisch erneut versucht.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Die Kommentarsynchronisierung ist unvollständig. Die Freigabeseite zeigt möglicherweise noch erledigte Kommentare.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Die Kommentarsynchronisierung ist noch nicht abgeschlossen. Gelöschte oder erledigte Kommentare können auf der Freigabeseite noch sichtbar sein. Automatische Wiederholungen wurden eingestellt; der Freigabelink bleibt verfügbar.",
'fileViewer.commentSync.backfillPendingBody': "Vorhandene Kommentare werden synchronisiert. Besucher sehen sie möglicherweise noch nicht.",
'fileViewer.commentSync.backfillPendingCountBody': "Vorhandene Kommentare werden synchronisiert · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Kommentare werden synchronisiert …",
'fileViewer.commentSync.alignFailedBody': "Der Kommentarabgleich ist nicht abgeschlossen – einige Kommentare fehlen möglicherweise.",
'fileViewer.shareGuide.title': "Link teilen, Feedback einholen",
@@ -3302,11 +3302,12 @@ export const de: Dict = {
'fileViewer.publishFileRequiresTeam': 'Für einen öffentlichen Link wird ein Team-Workspace benötigt. Wechsle zu einem Team-Workspace oder veröffentliche diese Datei über Deploy.',
'fileViewer.publishFileRequiresWorkspace': 'Für einen Freigabelink ist ein angemeldeter Workspace nötig. Melde dich bei OpenDesign Cloud an oder teile die Datei über eine Deploy-Option.',
'fileViewer.publishFileTooLarge': "Dieses Projekt überschreitet das Freigabelimit von 20 MiB. Verkleinere HTML und referenzierte Ressourcen und versuche es erneut.",
"fileViewer.shareUpdateHint": "Diese Datei enthält neue Änderungen. Aktualisiere den Link für die neueste Version.",
"fileViewer.shareUpdateHint": "Die Datei hat neue Änderungen. Besucher sehen noch die vorherige Version.",
"fileViewer.shareUpdateLink": "Link aktualisieren",
"fileViewer.signInToUpdate": "Anmelden und aktualisieren",
"fileViewer.signInToShare": "Anmelden und teilen",
"fileViewer.shareOutdatedSignInHint": "Diese Datei wurde geändert. Melde dich an, um den Link zu aktualisieren oder zu deaktivieren.",
'fileViewer.signInToShareDescription': "Melde dich bei Open Design an, um einen Freigabelink zu erstellen und andere zum Ansehen und Kommentieren einzuladen.",
"fileViewer.shareUpdateSuccess": "Aktualisiert. Besucher sehen die neueste Version nach dem Neuladen.",
"fileViewer.shareUpdateFailed": "Aktualisierung fehlgeschlagen. Besucher sehen weiterhin die vorherige Version.",
"fileViewer.shareUpdateUncertain": "Ergebnis der Aktualisierung unbekannt. Der öffentliche Link könnte sich geändert haben. Prüfe den Link oder beende die Freigabe, bevor du es erneut versuchst.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const en: Dict = {
'fileViewer.commentSync.sessionMissing': "Signed out. Comment sync is paused; new visitor comments are temporarily unavailable.",
'fileViewer.commentSync.shareStoppedPersonal': "The link is disabled. Comment sync to the shared page is paused.",
'fileViewer.commentSync.shareStoppedTeam': "The link is disabled.",
'fileViewer.commentSync.backfillFailedTitle': "Share published",
'fileViewer.commentSync.backfillFailedBody': "Existing comments haven't synced yet — visitors can't see them for now.",
'fileViewer.commentSync.backfillTerminalBody': "Some existing comments could not be synced to the share page and won't be retried automatically. The share link remains available.",
'fileViewer.commentSync.backfillRetryingBody': "Existing comments haven't synced yet — visitors can't see them for now. Retrying automatically in the background.",
'fileViewer.commentSync.backfillRetryingBody': "Existing comments haven't synced yet, so visitors can't see them for now. Retrying automatically.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Syncing comments for this reopened link. Previously deleted or resolved comments may still be visible on the share page.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Comment sync is incomplete. Previously deleted or resolved comments may still be visible on the share page. Retrying automatically in the background.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Comment sync is incomplete. The share page may still show resolved comments.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Comment sync is incomplete. Previously deleted or resolved comments may still be visible on the share page. Automatic retry has stopped; the share link remains available.",
'fileViewer.commentSync.backfillPendingBody': "Syncing existing comments. Visitors may not see them yet.",
'fileViewer.commentSync.backfillPendingCountBody': "Syncing existing comments · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Syncing comments…",
'fileViewer.commentSync.alignFailedBody': "Comment sync isn't fully aligned — some comments may be missing.",
'fileViewer.shareGuide.title': "Share the link, invite feedback",
@@ -3316,11 +3316,12 @@ export const en: Dict = {
'fileViewer.publishFileRequiresTeam': 'Publishing a public link needs a team workspace. Switch to a team workspace, or use Deploy to publish this file.',
'fileViewer.publishFileRequiresWorkspace': 'A share link needs a signed-in workspace. Sign in to OpenDesign Cloud, or use a deploy option to share this file.',
'fileViewer.publishFileTooLarge': "This project exceeds the 20 MiB sharing limit. Reduce its HTML and referenced resources, then retry.",
"fileViewer.shareUpdateHint": "This file has new changes. Update the link to share the latest version.",
"fileViewer.shareUpdateHint": "This file has new changes. Visitors still see the previous version.",
"fileViewer.shareUpdateLink": "Update link",
"fileViewer.signInToUpdate": "Sign in to update",
"fileViewer.signInToShare": "Sign in to share",
"fileViewer.shareOutdatedSignInHint": "This file has new changes. Sign in to update or turn off the link.",
'fileViewer.signInToShareDescription': "Sign in to Open Design to create a share link and invite others to view and comment.",
"fileViewer.shareUpdateSuccess": "Updated. Visitors will see the latest version after refreshing.",
"fileViewer.shareUpdateFailed": "Update failed. Visitors still see the previous version.",
"fileViewer.shareUpdateUncertain": "Update outcome unknown. The live link may have changed. Check the link or stop sharing before retrying.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const esES: Dict = {
'fileViewer.commentSync.sessionMissing': "Sesión cerrada. La sincronización de comentarios está pausada; los nuevos comentarios de visitantes no están disponibles temporalmente.",
'fileViewer.commentSync.shareStoppedPersonal': "El enlace está desactivado. La sincronización de comentarios con la página compartida está en pausa.",
'fileViewer.commentSync.shareStoppedTeam': "El enlace está desactivado.",
'fileViewer.commentSync.backfillFailedTitle': "Enlace publicado",
'fileViewer.commentSync.backfillFailedBody': "Los comentarios existentes aún no se han sincronizado; los visitantes no podrán verlos por ahora.",
'fileViewer.commentSync.backfillTerminalBody': "Algunos comentarios existentes no se pudieron sincronizar con la página compartida y no se volverá a intentar automáticamente. El enlace para compartir sigue disponible.",
'fileViewer.commentSync.backfillRetryingBody': "Los comentarios existentes aún no se han sincronizado; los visitantes no pueden verlos por ahora. Se volverá a intentar automáticamente en segundo plano.",
'fileViewer.commentSync.backfillRetryingBody': "Los comentarios existentes aún no se han sincronizado, así que los visitantes no pueden verlos por ahora. Reintentando automáticamente.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Sincronizando los comentarios del enlace compartido reactivado. Los comentarios eliminados o resueltos pueden seguir visibles en la página compartida.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La sincronización de comentarios no ha terminado. Los comentarios eliminados o resueltos pueden seguir visibles en la página compartida. Se reintentará automáticamente en segundo plano.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La sincronización de comentarios no se ha completado. La página compartida aún puede mostrar comentarios resueltos.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "La sincronización de comentarios no ha terminado. Los comentarios eliminados o resueltos pueden seguir visibles en la página compartida. Los reintentos automáticos se han detenido; el enlace sigue disponible.",
'fileViewer.commentSync.backfillPendingBody': "Sincronizando los comentarios existentes. Es posible que los visitantes aún no puedan verlos.",
'fileViewer.commentSync.backfillPendingCountBody': "Sincronizando comentarios existentes · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Sincronizando comentarios…",
'fileViewer.commentSync.alignFailedBody': "La alineación de comentarios no se completó; es posible que falten algunos comentarios.",
'fileViewer.shareGuide.title': "Comparte el enlace y recibe comentarios",
@@ -3302,11 +3302,12 @@ export const esES: Dict = {
'fileViewer.publishFileRequiresTeam': 'Publicar un enlace público requiere un espacio de trabajo de equipo. Cambia a un espacio de equipo o usa Desplegar para publicar este archivo.',
'fileViewer.publishFileRequiresWorkspace': 'Un enlace para compartir requiere un espacio de trabajo con sesión iniciada. Inicia sesión en OpenDesign Cloud o comparte este archivo mediante un despliegue.',
'fileViewer.publishFileTooLarge': "Este proyecto supera el límite de 20 MiB para compartir. Reduce el HTML y los recursos referenciados e inténtalo de nuevo.",
"fileViewer.shareUpdateHint": "Este archivo tiene cambios nuevos. Actualiza el enlace para compartir la última versión.",
"fileViewer.shareUpdateHint": "El archivo tiene cambios nuevos. Los visitantes siguen viendo la versión anterior.",
"fileViewer.shareUpdateLink": "Actualizar enlace",
"fileViewer.signInToUpdate": "Iniciar sesión para actualizar",
"fileViewer.signInToShare": "Iniciar sesión para compartir",
"fileViewer.shareOutdatedSignInHint": "Este archivo tiene cambios nuevos. Inicia sesión para actualizar o desactivar el enlace.",
'fileViewer.signInToShareDescription': "Inicia sesión en Open Design para crear un enlace para compartir e invitar a otras personas a ver y comentar.",
"fileViewer.shareUpdateSuccess": "Actualizado. Los visitantes verán la última versión al actualizar la página.",
"fileViewer.shareUpdateFailed": "Error al actualizar. Los visitantes siguen viendo la versión anterior.",
"fileViewer.shareUpdateUncertain": "No se conoce el resultado de la actualización. El enlace público puede haber cambiado. Comprueba el enlace o deja de compartir antes de reintentar.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const fa: Dict = {
'fileViewer.commentSync.sessionMissing': "وارد حساب نشده‌اید. همگام‌سازی نظرها موقتاً متوقف است؛ نظرهای جدید بازدیدکنندگان فعلاً نمایش داده نمی‌شوند.",
'fileViewer.commentSync.shareStoppedPersonal': "پیوند غیرفعال است. همگام‌سازی نظرها با صفحهٔ اشتراکی متوقف شده است.",
'fileViewer.commentSync.shareStoppedTeam': "پیوند غیرفعال است.",
'fileViewer.commentSync.backfillFailedTitle': "اشتراک منتشر شد",
'fileViewer.commentSync.backfillFailedBody': "نظرات موجود هنوز همگام‌سازی نشده‌اند؛ بازدیدکنندگان فعلاً آن‌ها را نمی‌بینند.",
'fileViewer.commentSync.backfillTerminalBody': "برخی از نظرات موجود با صفحه اشتراک‌گذاری همگام نشدند و به‌طور خودکار دوباره تلاش نمی‌شود. پیوند اشتراک‌گذاری همچنان در دسترس است.",
'fileViewer.commentSync.backfillRetryingBody': "نظرات موجود هنوز همگام‌سازی نشده‌اند؛ بازدیدکنندگان فعلاً آن‌ها را نمی‌بینند. تلاش مجدد به‌طور خودکار در پس‌زمینه انجام می‌شود.",
'fileViewer.commentSync.backfillRetryingBody': "نظرهای موجود هنوز همگام‌سازی نشده‌اند، بنابراین بازدیدکنندگان فعلاً آن‌ها را نمی‌بینند. تلاش مجدد خودکار در حال انجام است.",
'fileViewer.commentSync.backfillReopenedPendingBody': "دیدگاه‌های پیوند اشتراک‌گذاری دوباره فعال‌شده در حال همگام‌سازی هستند. دیدگاه‌های حذف‌شده یا حل‌شده ممکن است همچنان در صفحه اشتراک‌گذاری دیده شوند.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "همگام‌سازی دیدگاه‌ها هنوز کامل نشده است. دیدگاه‌های حذف‌شده یا حل‌شده ممکن است همچنان در صفحه اشتراک‌گذاری دیده شوند. تلاش دوباره به‌طور خودکار در پس‌زمینه انجام می‌شود.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "همگام‌سازی نظرها کامل نشده است. صفحهٔ اشتراک‌گذاری ممکن است هنوز نظرهای رسیدگی‌شده را نشان دهد.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "همگام‌سازی دیدگاه‌ها هنوز کامل نشده است. دیدگاه‌های حذف‌شده یا حل‌شده ممکن است همچنان در صفحه اشتراک‌گذاری دیده شوند. تلاش خودکار متوقف شده است؛ پیوند اشتراک‌گذاری همچنان در دسترس است.",
'fileViewer.commentSync.backfillPendingBody': "نظرات موجود در حال همگام‌سازی هستند. بازدیدکنندگان ممکن است هنوز آن‌ها را نبینند.",
'fileViewer.commentSync.backfillPendingCountBody': "همگام‌سازی نظرات موجود · {count}",
"fileViewer.commentSync.reopenSyncBusy": "در حال همگام‌سازی نظرات…",
'fileViewer.commentSync.alignFailedBody': "همسان‌سازی نظرات کامل نشده است؛ ممکن است برخی نظرات نمایش داده نشوند.",
'fileViewer.shareGuide.title': "پیوند را به اشتراک بگذارید تا بازخورد بگیرید",
@@ -3302,11 +3302,12 @@ export const fa: Dict = {
'fileViewer.publishFileRequiresTeam': 'انتشار پیوند عمومی به فضای کاری تیمی نیاز دارد. به یک فضای کاری تیمی بروید یا این فایل را با «استقرار» منتشر کنید.',
'fileViewer.publishFileRequiresWorkspace': 'ایجاد پیوند اشتراک‌گذاری نیازمند ورود به فضای کاری است. به OpenDesign Cloud وارد شوید یا این فایل را از طریق استقرار به اشتراک بگذارید.',
'fileViewer.publishFileTooLarge': "این پروژه از سقف اشتراک‌گذاری 20 MiB بیشتر است. حجم HTML و منابع ارجاع‌شده را کاهش دهید و دوباره تلاش کنید.",
"fileViewer.shareUpdateHint": "این فایل تغییرات جدیدی دارد. پیوند را برای اشتراک‌گذاری آخرین نسخه به‌روزرسانی کنید.",
"fileViewer.shareUpdateHint": "فایل تغییرات جدیدی دارد. بازدیدکنندگان هنوز نسخهٔ قبلی را می‌بینند.",
"fileViewer.shareUpdateLink": "به‌روزرسانی پیوند",
"fileViewer.signInToUpdate": "ورود برای به‌روزرسانی",
"fileViewer.signInToShare": "ورود برای اشتراک‌گذاری",
"fileViewer.shareOutdatedSignInHint": "این فایل تغییرات جدیدی دارد. برای به‌روزرسانی یا غیرفعال کردن پیوند وارد شوید.",
'fileViewer.signInToShareDescription': "برای ساخت پیوند اشتراک‌گذاری و دعوت دیگران به مشاهده و نظر دادن، وارد Open Design شوید.",
"fileViewer.shareUpdateSuccess": "به‌روزرسانی شد. بازدیدکنندگان پس از تازه‌سازی آخرین نسخه را می‌بینند.",
"fileViewer.shareUpdateFailed": "به‌روزرسانی ناموفق بود. بازدیدکنندگان همچنان نسخه قبلی را می‌بینند.",
"fileViewer.shareUpdateUncertain": "نتیجه به‌روزرسانی نامشخص است. محتوای پیوند عمومی ممکن است تغییر کرده باشد. پیش از تلاش دوباره پیوند را بررسی کنید یا اشتراک‌گذاری را متوقف کنید.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const fr: Dict = {
'fileViewer.commentSync.sessionMissing': "Vous êtes déconnecté. La synchronisation des commentaires est suspendue ; les nouveaux commentaires des visiteurs sont temporairement invisibles.",
'fileViewer.commentSync.shareStoppedPersonal': "Le lien est désactivé. La synchronisation des commentaires avec la page partagée est suspendue.",
'fileViewer.commentSync.shareStoppedTeam': "Le lien est désactivé.",
'fileViewer.commentSync.backfillFailedTitle': "Partage publié",
'fileViewer.commentSync.backfillFailedBody': "Les commentaires existants ne sont pas encore synchronisés ; les visiteurs ne les voient pas pour le moment.",
'fileViewer.commentSync.backfillTerminalBody': "Certains commentaires existants n'ont pas pu être synchronisés avec la page partagée et ne seront pas réessayés automatiquement. Le lien de partage reste disponible.",
'fileViewer.commentSync.backfillRetryingBody': "Les commentaires existants ne sont pas encore synchronisés ; les visiteurs ne les voient pas pour le moment. Nouvelle tentative automatique en arrière-plan.",
'fileViewer.commentSync.backfillRetryingBody': "Les commentaires existants ne sont pas encore synchronisés et restent invisibles pour les visiteurs. Nouvelle tentative automatique en cours.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Synchronisation des commentaires de ce lien de partage réactivé. Des commentaires supprimés ou résolus peuvent encore apparaître sur la page partagée.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La synchronisation des commentaires n’est pas terminée. Des commentaires supprimés ou résolus peuvent encore apparaître sur la page partagée. Une nouvelle tentative est effectuée automatiquement en arrière-plan.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La synchronisation des commentaires est incomplète. La page de partage peut encore afficher des commentaires résolus.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "La synchronisation des commentaires n’est pas terminée. Des commentaires supprimés ou résolus peuvent encore apparaître sur la page partagée. Les tentatives automatiques ont cessé ; le lien de partage reste disponible.",
'fileViewer.commentSync.backfillPendingBody': "Synchronisation des commentaires existants. Les visiteurs ne les voient peut-être pas encore.",
'fileViewer.commentSync.backfillPendingCountBody': "Synchronisation des commentaires existants · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Synchronisation des commentaires…",
'fileViewer.commentSync.alignFailedBody': "L'alignement des commentaires est incomplet ; certains commentaires pourraient être absents.",
'fileViewer.shareGuide.title': "Partagez le lien pour recueillir des retours",
@@ -3294,11 +3294,12 @@ export const fr: Dict = {
'fileViewer.publishFileRequiresTeam': 'La publication d’un lien public nécessite un espace de travail d’équipe. Passez à un espace d’équipe ou utilisez Déployer pour publier ce fichier.',
'fileViewer.publishFileRequiresWorkspace': 'Un lien de partage nécessite un espace de travail connecté. Connectez-vous à OpenDesign Cloud ou partagez ce fichier via un déploiement.',
'fileViewer.publishFileTooLarge': "Ce projet dépasse la limite de partage de 20 MiB. Réduisez le HTML et les ressources référencées, puis réessayez.",
"fileViewer.shareUpdateHint": "Ce fichier a changé. Mettez le lien à jour pour partager la dernière version.",
"fileViewer.shareUpdateHint": "Le fichier contient de nouvelles modifications. Les visiteurs voient encore la version précédente.",
"fileViewer.shareUpdateLink": "Mettre à jour le lien",
"fileViewer.signInToUpdate": "Se connecter pour mettre à jour",
"fileViewer.signInToShare": "Se connecter pour partager",
"fileViewer.shareOutdatedSignInHint": "Ce fichier a changé. Connectez-vous pour mettre à jour ou désactiver le lien.",
'fileViewer.signInToShareDescription': "Connectez-vous à Open Design pour créer un lien de partage et inviter d’autres personnes à consulter et commenter.",
"fileViewer.shareUpdateSuccess": "Mis à jour. Les visiteurs verront la dernière version après actualisation.",
"fileViewer.shareUpdateFailed": "Échec de la mise à jour. Les visiteurs voient toujours la version précédente.",
"fileViewer.shareUpdateUncertain": "Résultat de la mise à jour inconnu. Le lien public a peut-être changé. Vérifiez le lien ou arrêtez le partage avant de réessayer.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const hu: Dict = {
'fileViewer.commentSync.sessionMissing': "Nincs bejelentkezve. A hozzászólások szinkronizálása szünetel; a látogatók új hozzászólásai átmenetileg nem láthatók.",
'fileViewer.commentSync.shareStoppedPersonal': "A hivatkozás le van tiltva. A hozzászólások szinkronizálása a megosztott oldallal szünetel.",
'fileViewer.commentSync.shareStoppedTeam': "A hivatkozás le van tiltva.",
'fileViewer.commentSync.backfillFailedTitle': "A megosztás közzétéve",
'fileViewer.commentSync.backfillFailedBody': "A meglévő hozzászólások még nem szinkronizálódtak – a látogatók egyelőre nem látják őket.",
'fileViewer.commentSync.backfillTerminalBody': "Néhány meglévő hozzászólást nem sikerült szinkronizálni a megosztási oldallal, és a rendszer nem próbálkozik újra automatikusan. A megosztási link továbbra is elérhető.",
'fileViewer.commentSync.backfillRetryingBody': "A meglévő hozzászólások még nem szinkronizálódtak, ezért a látogatók egyelőre nem látják őket. A rendszer a háttérben automatikusan újrapróbálkozik.",
'fileViewer.commentSync.backfillRetryingBody': "A meglévő hozzászólások még nincsenek szinkronizálva, ezért a látogatók egyelőre nem látják őket. Automatikus újrapróbálkozás folyamatban.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Az újra aktivált megosztási hivatkozás hozzászólásainak szinkronizálása folyamatban van. A törölt vagy megoldott hozzászólások még láthatók lehetnek a megosztott oldalon.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "A hozzászólások szinkronizálása még nem fejeződött be. A törölt vagy megoldott hozzászólások továbbra is láthatók lehetnek a megosztott oldalon. A háttérben automatikus újrapróbálkozás zajlik.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "A hozzászólások szinkronizálása nem fejeződött be. A megosztási oldalon még megjelenhetnek a lezárt hozzászólások.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "A hozzászólások szinkronizálása még nem fejeződött be. A törölt vagy megoldott hozzászólások továbbra is láthatók lehetnek a megosztott oldalon. Az automatikus újrapróbálkozás leállt; a megosztási hivatkozás továbbra is elérhető.",
'fileViewer.commentSync.backfillPendingBody': "A meglévő hozzászólások szinkronizálása folyamatban van. A látogatók egyelőre nem biztos, hogy látják őket.",
'fileViewer.commentSync.backfillPendingCountBody': "Meglévő hozzászólások szinkronizálása · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Megjegyzések szinkronizálása…",
'fileViewer.commentSync.alignFailedBody': "A hozzászólások egyeztetése nem fejeződött be – előfordulhat, hogy néhány hozzászólás hiányzik.",
'fileViewer.shareGuide.title': "Oszd meg a linket, gyűjts visszajelzést",
@@ -3294,11 +3294,12 @@ export const hu: Dict = {
'fileViewer.publishFileRequiresTeam': 'A nyilvános hivatkozás közzétételéhez csapatmunkaterület szükséges. Válts csapatmunkaterületre, vagy tedd közzé a fájlt a Közzététel funkcióval.',
'fileViewer.publishFileRequiresWorkspace': 'A megosztási linkhez bejelentkezett munkaterület szükséges. Jelentkezz be az OpenDesign Cloudba, vagy oszd meg a fájlt telepítéssel.',
'fileViewer.publishFileTooLarge': "A projekt meghaladja a 20 MiB megosztási korlátot. Csökkentsd a HTML és a hivatkozott erőforrások méretét, majd próbáld újra.",
"fileViewer.shareUpdateHint": "A fájl megváltozott. Frissítsd a hivatkozást a legújabb verzió megosztásához.",
"fileViewer.shareUpdateHint": "A fájlban új módosítások vannak. A látogatók még az előző verziót látják.",
"fileViewer.shareUpdateLink": "Hivatkozás frissítése",
"fileViewer.signInToUpdate": "Bejelentkezés a frissítéshez",
"fileViewer.signInToShare": "Bejelentkezés a megosztáshoz",
"fileViewer.shareOutdatedSignInHint": "A fájl megváltozott. Jelentkezz be a hivatkozás frissítéséhez vagy kikapcsolásához.",
'fileViewer.signInToShareDescription': "Jelentkezz be az Open Designba, hogy megosztási linket hozz létre, és meghívj másokat megtekintésre és hozzászólásra.",
"fileViewer.shareUpdateSuccess": "Frissítve. A látogatók frissítés után látják a legújabb verziót.",
"fileViewer.shareUpdateFailed": "A frissítés sikertelen. A látogatók továbbra is az előző verziót látják.",
"fileViewer.shareUpdateUncertain": "A frissítés eredménye ismeretlen. A nyilvános link tartalma megváltozhatott. Újrapróbálás előtt ellenőrizd a linket vagy állítsd le a megosztást.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const id: Dict = {
'fileViewer.commentSync.sessionMissing': "Belum masuk. Sinkronisasi komentar dijeda; komentar baru pengunjung sementara tidak terlihat.",
'fileViewer.commentSync.shareStoppedPersonal': "Tautan dinonaktifkan. Sinkronisasi komentar ke halaman bersama dijeda.",
'fileViewer.commentSync.shareStoppedTeam': "Tautan dinonaktifkan.",
'fileViewer.commentSync.backfillFailedTitle': "Tautan berbagi dipublikasikan",
'fileViewer.commentSync.backfillFailedBody': "Komentar yang sudah ada belum tersinkron; pengunjung untuk sementara belum bisa melihatnya.",
'fileViewer.commentSync.backfillTerminalBody': "Beberapa komentar yang sudah ada tidak dapat disinkronkan ke halaman berbagi dan tidak akan dicoba ulang secara otomatis. Tautan berbagi tetap tersedia.",
'fileViewer.commentSync.backfillRetryingBody': "Komentar yang sudah ada belum tersinkron; pengunjung belum dapat melihatnya. Mencoba kembali otomatis di latar belakang.",
'fileViewer.commentSync.backfillRetryingBody': "Komentar yang ada belum disinkronkan, jadi pengunjung belum dapat melihatnya. Mencoba ulang secara otomatis.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Menyinkronkan komentar untuk tautan berbagi yang diaktifkan kembali. Komentar yang dihapus atau diselesaikan mungkin masih terlihat di halaman berbagi.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Sinkronisasi komentar belum selesai. Komentar yang sudah dihapus atau diselesaikan mungkin masih terlihat di halaman yang dibagikan. Sistem mencoba lagi secara otomatis di latar belakang.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Sinkronisasi komentar belum selesai. Halaman berbagi mungkin masih menampilkan komentar yang sudah diselesaikan.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Sinkronisasi komentar belum selesai. Komentar yang sudah dihapus atau diselesaikan mungkin masih terlihat di halaman yang dibagikan. Percobaan ulang otomatis telah berhenti; tautan berbagi tetap tersedia.",
'fileViewer.commentSync.backfillPendingBody': "Komentar yang sudah ada sedang disinkronkan. Pengunjung mungkin belum dapat melihatnya.",
'fileViewer.commentSync.backfillPendingCountBody': "Menyinkronkan komentar yang ada · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Menyinkronkan komentar…",
'fileViewer.commentSync.alignFailedBody': "Penyelarasan komentar belum selesai; beberapa komentar mungkin tidak muncul.",
'fileViewer.shareGuide.title': "Bagikan tautan, kumpulkan masukan",
@@ -3294,11 +3294,12 @@ export const id: Dict = {
'fileViewer.publishFileRequiresTeam': 'Menerbitkan tautan publik memerlukan ruang kerja tim. Beralihlah ke ruang kerja tim, atau gunakan Deploy untuk menerbitkan berkas ini.',
'fileViewer.publishFileRequiresWorkspace': 'Tautan berbagi memerlukan workspace yang masuk. Masuk ke OpenDesign Cloud atau bagikan file ini lewat deploy.',
'fileViewer.publishFileTooLarge': "Proyek ini melebihi batas berbagi 20 MiB. Kurangi ukuran HTML dan sumber daya yang dirujuk, lalu coba lagi.",
"fileViewer.shareUpdateHint": "Berkas ini memiliki perubahan baru. Perbarui tautan untuk membagikan versi terbaru.",
"fileViewer.shareUpdateHint": "File memiliki perubahan baru. Pengunjung masih melihat versi sebelumnya.",
"fileViewer.shareUpdateLink": "Perbarui tautan",
"fileViewer.signInToUpdate": "Masuk untuk memperbarui",
"fileViewer.signInToShare": "Masuk untuk berbagi",
"fileViewer.shareOutdatedSignInHint": "File ini memiliki perubahan baru. Masuk untuk memperbarui atau menonaktifkan tautan.",
'fileViewer.signInToShareDescription': "Masuk ke Open Design untuk membuat tautan berbagi dan mengundang orang lain melihat serta berkomentar.",
"fileViewer.shareUpdateSuccess": "Diperbarui. Pengunjung akan melihat versi terbaru setelah memuat ulang.",
"fileViewer.shareUpdateFailed": "Pembaruan gagal. Pengunjung masih melihat versi sebelumnya.",
"fileViewer.shareUpdateUncertain": "Hasil pembaruan tidak diketahui. Konten tautan publik mungkin berubah. Periksa tautan atau hentikan berbagi sebelum mencoba lagi.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const it: Dict = {
'fileViewer.commentSync.sessionMissing': "Accesso non effettuato. La sincronizzazione dei commenti è sospesa; i nuovi commenti dei visitatori sono temporaneamente invisibili.",
'fileViewer.commentSync.shareStoppedPersonal': "Il link è disattivato. La sincronizzazione dei commenti con la pagina condivisa è sospesa.",
'fileViewer.commentSync.shareStoppedTeam': "Il link è disattivato.",
'fileViewer.commentSync.backfillFailedTitle': "Condivisione pubblicata",
'fileViewer.commentSync.backfillFailedBody': "I commenti esistenti non sono ancora sincronizzati; per ora i visitatori non li vedono.",
'fileViewer.commentSync.backfillTerminalBody': "Alcuni commenti esistenti non sono stati sincronizzati con la pagina condivisa e non verranno ritentati automaticamente. Il link di condivisione resta disponibile.",
'fileViewer.commentSync.backfillRetryingBody': "I commenti esistenti non sono ancora sincronizzati; per ora i visitatori non li vedono. Nuovo tentativo automatico in background.",
'fileViewer.commentSync.backfillRetryingBody': "I commenti esistenti non sono ancora sincronizzati, quindi per ora i visitatori non li vedono. Nuovo tentativo automatico in corso.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Sincronizzazione dei commenti del link condiviso riattivato. I commenti eliminati o risolti potrebbero essere ancora visibili nella pagina condivisa.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La sincronizzazione dei commenti non è ancora terminata. I commenti eliminati o risolti potrebbero essere ancora visibili nella pagina condivisa. Nuovo tentativo automatico in background.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "La sincronizzazione dei commenti non è completa. La pagina condivisa potrebbe ancora mostrare commenti risolti.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "La sincronizzazione dei commenti non è ancora terminata. I commenti eliminati o risolti potrebbero essere ancora visibili nella pagina condivisa. I tentativi automatici sono terminati; il link resta disponibile.",
'fileViewer.commentSync.backfillPendingBody': "Sincronizzazione dei commenti esistenti in corso. I visitatori potrebbero non vederli ancora.",
'fileViewer.commentSync.backfillPendingCountBody': "Sincronizzazione dei commenti esistenti · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Sincronizzazione dei commenti…",
'fileViewer.commentSync.alignFailedBody': "L'allineamento dei commenti non è completo; alcuni commenti potrebbero mancare.",
'fileViewer.shareGuide.title': "Condividi il link, raccogli feedback",
@@ -3294,11 +3294,12 @@ export const it: Dict = {
'fileViewer.publishFileRequiresTeam': 'La pubblicazione di un link pubblico richiede uno spazio di lavoro del team. Passa a uno spazio del team o usa Distribuisci per pubblicare questo file.',
'fileViewer.publishFileRequiresWorkspace': 'Un link di condivisione richiede uno spazio di lavoro con accesso effettuato. Accedi a OpenDesign Cloud oppure condividi questo file tramite un deploy.',
'fileViewer.publishFileTooLarge': "Questo progetto supera il limite di condivisione di 20 MiB. Riduci HTML e risorse referenziate, poi riprova.",
"fileViewer.shareUpdateHint": "Questo file contiene nuove modifiche. Aggiorna il link per condividere la versione più recente.",
"fileViewer.shareUpdateHint": "Il file ha nuove modifiche. I visitatori vedono ancora la versione precedente.",
"fileViewer.shareUpdateLink": "Aggiorna link",
"fileViewer.signInToUpdate": "Accedi per aggiornare",
"fileViewer.signInToShare": "Accedi per condividere",
"fileViewer.shareOutdatedSignInHint": "Questo file ha nuove modifiche. Accedi per aggiornare o disattivare il link.",
'fileViewer.signInToShareDescription': "Accedi a Open Design per creare un link di condivisione e invitare altri a visualizzare e commentare.",
"fileViewer.shareUpdateSuccess": "Aggiornato. I visitatori vedranno l'ultima versione dopo l'aggiornamento della pagina.",
"fileViewer.shareUpdateFailed": "Aggiornamento non riuscito. I visitatori vedono ancora la versione precedente.",
"fileViewer.shareUpdateUncertain": "Esito dell’aggiornamento sconosciuto. Il link pubblico potrebbe essere cambiato. Controlla il link o interrompi la condivisione prima di riprovare.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const ja: Dict = {
'fileViewer.commentSync.sessionMissing': "ログインしていないためコメントの同期が一時停止しています。訪問者の新しいコメントは一時的に表示されません。",
'fileViewer.commentSync.shareStoppedPersonal': "リンクは無効です。共有ページへのコメント同期は一時停止しています。",
'fileViewer.commentSync.shareStoppedTeam': "リンクは無効です。",
'fileViewer.commentSync.backfillFailedTitle': "共有を公開しました",
'fileViewer.commentSync.backfillFailedBody': "既存のコメントはまだ同期されていません。訪問者には一時的に表示されません。",
'fileViewer.commentSync.backfillTerminalBody': "一部の既存コメントを共有ページに同期できず、自動再試行は行われません。共有リンクは引き続き利用できます。",
'fileViewer.commentSync.backfillRetryingBody': "既存のコメントはまだ同期されていないため、訪問者には一時的に表示されません。バックグラウンドで自動的に再試行しています。",
'fileViewer.commentSync.backfillRetryingBody': "既存のコメントはまだ同期されていないため、閲覧者には表示されません。自動で再試行しています。",
'fileViewer.commentSync.backfillReopenedPendingBody': "再開した共有リンクのコメントを同期しています。削除済みまたは解決済みのコメントが共有ページに残っている場合があります。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "コメントの同期はまだ完了していません。共有ページに削除済みまたは解決済みのコメントが残っている場合があります。バックグラウンドで自動的に再試行しています。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "コメントの同期が完了していません。共有ページに処理済みのコメントが表示されたままの場合があります。",
'fileViewer.commentSync.backfillReopenedTerminalBody': "コメントの同期はまだ完了していません。共有ページに削除済みまたは解決済みのコメントが残っている場合があります。自動再試行は停止しましたが、共有リンクは利用できます。",
'fileViewer.commentSync.backfillPendingBody': "既存のコメントを同期中です。訪問者にはまだ表示されない場合があります。",
'fileViewer.commentSync.backfillPendingCountBody': "既存のコメントを同期中 · {count}件",
"fileViewer.commentSync.reopenSyncBusy": "コメントを同期しています…",
'fileViewer.commentSync.alignFailedBody': "コメントの整合が完了していません。一部のコメントが表示されない可能性があります。",
'fileViewer.shareGuide.title': "リンクを共有してフィードバックを集めよう",
@@ -3294,11 +3294,12 @@ export const ja: Dict = {
'fileViewer.publishFileRequiresTeam': '公開リンクの発行にはチームワークスペースが必要です。チームワークスペースに切り替えるか、デプロイでこのファイルを公開してください。',
'fileViewer.publishFileRequiresWorkspace': '共有リンクの作成にはサインイン済みのワークスペースが必要です。OpenDesign Cloud にサインインするか、デプロイでこのファイルを共有してください。',
'fileViewer.publishFileTooLarge': "プロジェクトが共有上限の 20 MiB を超えています。HTML と参照リソースの合計サイズを減らしてから再試行してください。",
"fileViewer.shareUpdateHint": "このファイルに新しい変更があります。リンクを更新して最新版を共有してください。",
"fileViewer.shareUpdateHint": "ファイルに新しい変更があります。閲覧者にはまだ前のバージョンが表示されています。",
"fileViewer.shareUpdateLink": "リンクを更新",
"fileViewer.signInToUpdate": "ログインして更新",
"fileViewer.signInToShare": "ログインして共有",
"fileViewer.shareOutdatedSignInHint": "ファイルに新しい変更があります。ログインするとリンクを更新または停止できます。",
'fileViewer.signInToShareDescription': "Open Design にログインすると、共有リンクを作成して他の人を閲覧・コメントに招待できます。",
"fileViewer.shareUpdateSuccess": "更新しました。訪問者は再読み込み後に最新版を確認できます。",
"fileViewer.shareUpdateFailed": "更新に失敗しました。訪問者には引き続き前のバージョンが表示されます。",
"fileViewer.shareUpdateUncertain": "更新結果は不明です。公開リンクの内容が変わった可能性があります。再試行前にリンクを確認するか共有を停止してください。",
+5 -4
View File
@@ -237,14 +237,14 @@ export const ko: Dict = {
'fileViewer.commentSync.sessionMissing': "로그아웃되어 댓글 동기화가 일시 중지되었습니다. 방문자의 새 댓글을 일시적으로 볼 수 없습니다.",
'fileViewer.commentSync.shareStoppedPersonal': "링크가 비활성화되었습니다. 공유 페이지로의 댓글 동기화가 일시 중지되었습니다.",
'fileViewer.commentSync.shareStoppedTeam': "링크가 비활성화되었습니다.",
'fileViewer.commentSync.backfillFailedTitle': "공유가 게시되었습니다",
'fileViewer.commentSync.backfillFailedBody': "기존 댓글이 아직 동기화되지 않았습니다. 방문자에게는 잠시 표시되지 않습니다.",
'fileViewer.commentSync.backfillTerminalBody': "일부 기존 댓글을 공유 페이지와 동기화하지 못했으며 자동으로 다시 시도하지 않습니다. 공유 링크는 계속 사용할 수 있습니다.",
'fileViewer.commentSync.backfillRetryingBody': "기존 댓글이 아직 동기화되지 않아 방문자에게 표시되지 않습니다. 백그라운드에서 자동으로 다시 시도하고 있습니다.",
'fileViewer.commentSync.backfillRetryingBody': "기존 댓글이 아직 동기화되지 않아 방문자에게 보이지 않습니다. 자동으로 다시 시도하는 중입니다.",
'fileViewer.commentSync.backfillReopenedPendingBody': "다시 활성화한 공유 링크의 댓글을 동기화하고 있습니다. 삭제되거나 해결된 댓글이 공유 페이지에 여전히 표시될 수 있습니다.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "댓글 동기화가 완료되지 않았습니다. 공유 페이지에 삭제되거나 해결된 댓글이 여전히 표시될 수 있습니다. 백그라운드에서 자동으로 다시 시도합니다.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "댓글 동기화가 완료되지 않았습니다. 공유 페이지에 처리된 댓글이 아직 표시될 수 있습니다.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "댓글 동기화가 완료되지 않았습니다. 공유 페이지에 삭제되거나 해결된 댓글이 여전히 표시될 수 있습니다. 자동 재시도가 중단되었지만 공유 링크는 계속 사용할 수 있습니다.",
'fileViewer.commentSync.backfillPendingBody': "기존 댓글을 동기화하고 있습니다. 방문자에게 아직 표시되지 않을 수 있습니다.",
'fileViewer.commentSync.backfillPendingCountBody': "기존 댓글 동기화 중 · {count}개",
"fileViewer.commentSync.reopenSyncBusy": "댓글 동기화 중…",
'fileViewer.commentSync.alignFailedBody': "댓글 정렬이 완료되지 않았습니다. 일부 댓글이 표시되지 않을 수 있습니다.",
'fileViewer.shareGuide.title': "링크를 공유해 피드백을 받아보세요",
@@ -3294,11 +3294,12 @@ export const ko: Dict = {
'fileViewer.publishFileRequiresTeam': '공개 링크를 게시하려면 팀 워크스페이스가 필요합니다. 팀 워크스페이스로 전환하거나 배포를 사용해 이 파일을 게시하세요.',
'fileViewer.publishFileRequiresWorkspace': '공유 링크를 만들려면 로그인된 워크스페이스가 필요합니다. OpenDesign Cloud에 로그인하거나 배포로 이 파일을 공유하세요.',
'fileViewer.publishFileTooLarge': "프로젝트가 공유 한도인 20 MiB를 초과합니다. HTML 및 참조 리소스의 크기를 줄인 후 다시 시도하세요.",
"fileViewer.shareUpdateHint": "이 파일에 새 변경 사항이 있습니다. 링크를 업데이트하여 최신 버전을 공유하세요.",
"fileViewer.shareUpdateHint": "파일에 새 변경 사항이 있습니다. 방문자에게는 아직 이전 버전이 보입니다.",
"fileViewer.shareUpdateLink": "링크 업데이트",
"fileViewer.signInToUpdate": "로그인 후 업데이트",
"fileViewer.signInToShare": "로그인 후 공유",
"fileViewer.shareOutdatedSignInHint": "파일에 새 변경 사항이 있습니다. 로그인한 후 링크를 업데이트하거나 비활성화할 수 있습니다.",
'fileViewer.signInToShareDescription': "Open Design에 로그인하면 공유 링크를 만들어 다른 사람을 보기 및 댓글에 초대할 수 있습니다.",
"fileViewer.shareUpdateSuccess": "업데이트되었습니다. 방문자가 새로고침하면 최신 버전을 볼 수 있습니다.",
"fileViewer.shareUpdateFailed": "업데이트에 실패했습니다. 방문자에게는 여전히 이전 버전이 표시됩니다.",
"fileViewer.shareUpdateUncertain": "업데이트 결과를 확인할 수 없습니다. 공개 링크 내용이 변경되었을 수 있습니다. 다시 시도하기 전에 링크를 확인하거나 공유를 중지하세요.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const pl: Dict = {
'fileViewer.commentSync.sessionMissing': "Nie zalogowano. Synchronizacja komentarzy jest wstrzymana; nowe komentarze odwiedzających są tymczasowo niewidoczne.",
'fileViewer.commentSync.shareStoppedPersonal': "Link jest wyłączony. Synchronizacja komentarzy ze stroną udostępnioną jest wstrzymana.",
'fileViewer.commentSync.shareStoppedTeam': "Link jest wyłączony.",
'fileViewer.commentSync.backfillFailedTitle': "Udostępnienie opublikowane",
'fileViewer.commentSync.backfillFailedBody': "Istniejące komentarze nie zostały jeszcze zsynchronizowane — odwiedzający chwilowo ich nie widzą.",
'fileViewer.commentSync.backfillTerminalBody': "Nie udało się zsynchronizować niektórych istniejących komentarzy ze stroną udostępniania i nie będą ponawiane automatycznie. Link do udostępniania pozostaje dostępny.",
'fileViewer.commentSync.backfillRetryingBody': "Istniejące komentarze nie zostały jeszcze zsynchronizowane — odwiedzający na razie ich nie widzą. Trwa automatyczna ponowna próba w tle.",
'fileViewer.commentSync.backfillRetryingBody': "Istniejące komentarze nie zostały jeszcze zsynchronizowane, więc odwiedzający na razie ich nie widzą. Ponawianie automatyczne.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Trwa synchronizacja komentarzy dla ponownie włączonego linku. Usunięte lub rozwiązane komentarze mogą nadal być widoczne na udostępnionej stronie.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Synchronizacja komentarzy nie została jeszcze zakończona. Usunięte lub rozwiązane komentarze mogą nadal być widoczne na udostępnionej stronie. Automatyczna ponowna próba trwa w tle.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Synchronizacja komentarzy nie została ukończona. Strona udostępniania może nadal pokazywać rozwiązane komentarze.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Synchronizacja komentarzy nie została jeszcze zakończona. Usunięte lub rozwiązane komentarze mogą nadal być widoczne na udostępnionej stronie. Automatyczne ponawianie zostało zatrzymane; link nadal działa.",
'fileViewer.commentSync.backfillPendingBody': "Trwa synchronizowanie istniejących komentarzy. Odwiedzający mogą ich jeszcze nie widzieć.",
'fileViewer.commentSync.backfillPendingCountBody': "Synchronizowanie istniejących komentarzy · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Synchronizowanie komentarzy…",
'fileViewer.commentSync.alignFailedBody': "Synchronizacja komentarzy nie została zakończona — niektórych komentarzy może brakować.",
'fileViewer.shareGuide.title': "Udostępnij link, zbieraj opinie",
@@ -3294,11 +3294,12 @@ export const pl: Dict = {
'fileViewer.publishFileRequiresTeam': 'Opublikowanie linku publicznego wymaga zespołowej przestrzeni roboczej. Przełącz się na przestrzeń zespołu lub użyj Wdróż, aby opublikować ten plik.',
'fileViewer.publishFileRequiresWorkspace': 'Link do udostępniania wymaga zalogowanego obszaru roboczego. Zaloguj się do OpenDesign Cloud lub udostępnij ten plik przez wdrożenie.',
'fileViewer.publishFileTooLarge': "Projekt przekracza limit udostępniania 20 MiB. Zmniejsz rozmiar HTML i powiązanych zasobów, a następnie spróbuj ponownie.",
"fileViewer.shareUpdateHint": "Plik zawiera nowe zmiany. Zaktualizuj link, aby udostępnić najnowszą wersję.",
"fileViewer.shareUpdateHint": "Plik ma nowe zmiany. Odwiedzający nadal widzą poprzednią wersję.",
"fileViewer.shareUpdateLink": "Zaktualizuj link",
"fileViewer.signInToUpdate": "Zaloguj się, aby zaktualizować",
"fileViewer.signInToShare": "Zaloguj się, aby udostępnić",
"fileViewer.shareOutdatedSignInHint": "Ten plik ma nowe zmiany. Zaloguj się, aby zaktualizować lub wyłączyć link.",
'fileViewer.signInToShareDescription': "Zaloguj się do Open Design, aby utworzyć link do udostępniania i zaprosić innych do przeglądania i komentowania.",
"fileViewer.shareUpdateSuccess": "Zaktualizowano. Odwiedzający zobaczą najnowszą wersję po odświeżeniu.",
"fileViewer.shareUpdateFailed": "Aktualizacja nie powiodła się. Odwiedzający nadal widzą poprzednią wersję.",
"fileViewer.shareUpdateUncertain": "Wynik aktualizacji jest nieznany. Zawartość publicznego linku mogła się zmienić. Sprawdź link lub zatrzymaj udostępnianie przed ponowieniem.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const ptBR: Dict = {
'fileViewer.commentSync.sessionMissing': "Sessão encerrada. A sincronização de comentários está pausada; novos comentários de visitantes estão temporariamente indisponíveis.",
'fileViewer.commentSync.shareStoppedPersonal': "O link está desativado. A sincronização de comentários com a página compartilhada está pausada.",
'fileViewer.commentSync.shareStoppedTeam': "O link está desativado.",
'fileViewer.commentSync.backfillFailedTitle': "Compartilhamento publicado",
'fileViewer.commentSync.backfillFailedBody': "Os comentários existentes ainda não foram sincronizados; os visitantes não os veem por enquanto.",
'fileViewer.commentSync.backfillTerminalBody': "Alguns comentários existentes não puderam ser sincronizados com a página compartilhada e não serão repetidos automaticamente. O link de compartilhamento continua disponível.",
'fileViewer.commentSync.backfillRetryingBody': "Os comentários existentes ainda não foram sincronizados; os visitantes não conseguem vê-los por enquanto. Tentaremos novamente em segundo plano.",
'fileViewer.commentSync.backfillRetryingBody': "Os comentários existentes ainda não foram sincronizados, então os visitantes não podem vê-los por enquanto. Tentando novamente automaticamente.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Sincronizando os comentários do link de compartilhamento reativado. Comentários excluídos ou resolvidos podem continuar visíveis na página compartilhada.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "A sincronização dos comentários ainda não terminou. Comentários excluídos ou resolvidos podem continuar visíveis na página compartilhada. Uma nova tentativa será feita automaticamente em segundo plano.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "A sincronização de comentários não foi concluída. A página compartilhada ainda pode mostrar comentários resolvidos.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "A sincronização dos comentários ainda não terminou. Comentários excluídos ou resolvidos podem continuar visíveis na página compartilhada. As tentativas automáticas pararam; o link continua disponível.",
'fileViewer.commentSync.backfillPendingBody': "Sincronizando comentários existentes. Os visitantes talvez ainda não consigam vê-los.",
'fileViewer.commentSync.backfillPendingCountBody': "Sincronizando comentários existentes · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Sincronizando comentários…",
'fileViewer.commentSync.alignFailedBody': "O alinhamento dos comentários não foi concluído; alguns comentários podem estar faltando.",
'fileViewer.shareGuide.title': "Compartilhe o link e receba feedback",
@@ -3294,11 +3294,12 @@ export const ptBR: Dict = {
'fileViewer.publishFileRequiresTeam': 'Publicar um link público exige um espaço de trabalho de equipe. Mude para um espaço de equipe ou use Implantar para publicar este arquivo.',
'fileViewer.publishFileRequiresWorkspace': 'Um link de compartilhamento exige um workspace conectado. Entre no OpenDesign Cloud ou compartilhe este arquivo por deploy.',
'fileViewer.publishFileTooLarge': "Este projeto excede o limite de compartilhamento de 20 MiB. Reduza o HTML e os recursos referenciados e tente novamente.",
"fileViewer.shareUpdateHint": "Este arquivo tem novas alterações. Atualize o link para compartilhar a versão mais recente.",
"fileViewer.shareUpdateHint": "O arquivo tem novas alterações. Os visitantes ainda veem a versão anterior.",
"fileViewer.shareUpdateLink": "Atualizar link",
"fileViewer.signInToUpdate": "Entre para atualizar",
"fileViewer.signInToShare": "Entre para compartilhar",
"fileViewer.shareOutdatedSignInHint": "Este arquivo tem novas alterações. Entre para atualizar ou desativar o link.",
'fileViewer.signInToShareDescription': "Entre no Open Design para criar um link de compartilhamento e convidar outras pessoas para ver e comentar.",
"fileViewer.shareUpdateSuccess": "Atualizado. Os visitantes verão a versão mais recente após atualizar a página.",
"fileViewer.shareUpdateFailed": "Falha ao atualizar. Os visitantes ainda veem a versão anterior.",
"fileViewer.shareUpdateUncertain": "O resultado da atualização é desconhecido. O conteúdo do link público pode ter mudado. Verifique o link ou interrompa o compartilhamento antes de tentar novamente.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const ru: Dict = {
'fileViewer.commentSync.sessionMissing': "Вы не вошли в аккаунт. Синхронизация комментариев приостановлена; новые комментарии посетителей временно не видны.",
'fileViewer.commentSync.shareStoppedPersonal': "Ссылка отключена. Синхронизация комментариев со страницей общего доступа приостановлена.",
'fileViewer.commentSync.shareStoppedTeam': "Ссылка отключена.",
'fileViewer.commentSync.backfillFailedTitle': "Ссылка опубликована",
'fileViewer.commentSync.backfillFailedBody': "Существующие комментарии ещё не синхронизированы — посетители пока их не видят.",
'fileViewer.commentSync.backfillTerminalBody': "Некоторые существующие комментарии не удалось синхронизировать со страницей общего доступа; автоматических повторных попыток не будет. Ссылка остаётся доступной.",
'fileViewer.commentSync.backfillRetryingBody': "Существующие комментарии ещё не синхронизированы — посетители пока их не видят. Повторная попытка выполняется автоматически в фоновом режиме.",
'fileViewer.commentSync.backfillRetryingBody': "Существующие комментарии ещё не синхронизированы, поэтому посетители их пока не видят. Выполняется автоматический повтор.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Синхронизируются комментарии повторно включённой ссылки. Удалённые или закрытые комментарии могут по-прежнему отображаться на странице общего доступа.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Синхронизация комментариев ещё не завершена. Удалённые или закрытые комментарии могут по-прежнему отображаться на странице общего доступа. Повторная попытка выполняется автоматически в фоновом режиме.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Синхронизация комментариев не завершена. На странице общего доступа могут по-прежнему отображаться решённые комментарии.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Синхронизация комментариев ещё не завершена. Удалённые или закрытые комментарии могут по-прежнему отображаться на странице общего доступа. Автоматические попытки прекращены; ссылка остаётся доступной.",
'fileViewer.commentSync.backfillPendingBody': "Синхронизируем существующие комментарии. Посетители пока могут их не видеть.",
'fileViewer.commentSync.backfillPendingCountBody': "Синхронизация существующих комментариев · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Синхронизация комментариев…",
'fileViewer.commentSync.alignFailedBody': "Согласование комментариев не завершено — некоторые комментарии могут отсутствовать.",
'fileViewer.shareGuide.title': "Поделитесь ссылкой и получите отклики",
@@ -3294,11 +3294,12 @@ export const ru: Dict = {
'fileViewer.publishFileRequiresTeam': 'Для публикации общедоступной ссылки нужно командное рабочее пространство. Переключитесь на командное пространство или опубликуйте файл через «Развернуть».',
'fileViewer.publishFileRequiresWorkspace': 'Для ссылки нужен вход в рабочее пространство. Войдите в OpenDesign Cloud или поделитесь файлом через деплой.',
'fileViewer.publishFileTooLarge': "Проект превышает лимит публикации 20 MiB. Уменьшите размер HTML и связанных ресурсов и повторите попытку.",
"fileViewer.shareUpdateHint": "В файле есть новые изменения. Обновите ссылку, чтобы поделиться последней версией.",
"fileViewer.shareUpdateHint": "В файле есть новые изменения. Посетители пока видят предыдущую версию.",
"fileViewer.shareUpdateLink": "Обновить ссылку",
"fileViewer.signInToUpdate": "Войти и обновить",
"fileViewer.signInToShare": "Войти и поделиться",
"fileViewer.shareOutdatedSignInHint": "В файле есть изменения. Войдите, чтобы обновить или отключить ссылку.",
'fileViewer.signInToShareDescription': "Войдите в Open Design, чтобы создать ссылку для общего доступа и пригласить других просматривать и комментировать.",
"fileViewer.shareUpdateSuccess": "Обновлено. Посетители увидят последнюю версию после обновления страницы.",
"fileViewer.shareUpdateFailed": "Не удалось обновить. Посетители по-прежнему видят предыдущую версию.",
"fileViewer.shareUpdateUncertain": "Результат обновления неизвестен. Содержимое публичной ссылки могло измениться. Проверьте ссылку или остановите доступ перед повтором.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const th: Dict = {
'fileViewer.commentSync.sessionMissing': "ยังไม่ได้เข้าสู่ระบบ การซิงค์ความคิดเห็นหยุดชั่วคราว จึงยังไม่เห็นความคิดเห็นใหม่ของผู้เข้าชม",
'fileViewer.commentSync.shareStoppedPersonal': "ลิงก์ถูกปิดใช้งาน การซิงค์ความคิดเห็นไปยังหน้าที่แชร์หยุดชั่วคราว",
'fileViewer.commentSync.shareStoppedTeam': "ลิงก์ถูกปิดใช้งาน",
'fileViewer.commentSync.backfillFailedTitle': "เผยแพร่การแชร์แล้ว",
'fileViewer.commentSync.backfillFailedBody': "ความคิดเห็นที่มีอยู่ยังไม่ได้ซิงค์ ผู้เยี่ยมชมจะยังมองไม่เห็นชั่วคราว",
'fileViewer.commentSync.backfillTerminalBody': "ไม่สามารถซิงค์ความคิดเห็นที่มีอยู่บางส่วนไปยังหน้าที่แชร์ และจะไม่มีการลองซ้ำโดยอัตโนมัติ ลิงก์แชร์ยังใช้งานได้",
'fileViewer.commentSync.backfillRetryingBody': "ความคิดเห็นที่มีอยู่ยังไม่ได้ซิงค์ ผู้เยี่ยมชมยังมองไม่เห็น กำลังลองอีกครั้งโดยอัตโนมัติในเบื้องหลัง",
'fileViewer.commentSync.backfillRetryingBody': "ความคิดเห็นที่มีอยู่ยังไม่ได้ซิงค์ ผู้เข้าชมจึงยังมองไม่เห็นในตอนนี้ กำลังลองใหม่โดยอัตโนมัติ",
'fileViewer.commentSync.backfillReopenedPendingBody': "กำลังซิงค์ความคิดเห็นของลิงก์แชร์ที่เปิดใช้อีกครั้ง ความคิดเห็นที่ลบหรือแก้ไขแล้วอาจยังปรากฏบนหน้าที่แชร์",
'fileViewer.commentSync.backfillReopenedRetryingBody': "การซิงค์ความคิดเห็นยังไม่เสร็จสิ้น ความคิดเห็นที่ลบหรือแก้ไขแล้วอาจยังปรากฏบนหน้าที่แชร์ ระบบกำลังลองอีกครั้งโดยอัตโนมัติในเบื้องหลัง",
'fileViewer.commentSync.backfillReopenedRetryingBody': "การซิงค์ความคิดเห็นยังไม่เสร็จ หน้าแชร์อาจยังแสดงความคิดเห็นที่จัดการแล้ว",
'fileViewer.commentSync.backfillReopenedTerminalBody': "การซิงค์ความคิดเห็นยังไม่เสร็จสิ้น ความคิดเห็นที่ลบหรือแก้ไขแล้วอาจยังปรากฏบนหน้าที่แชร์ การลองใหม่อัตโนมัติหยุดแล้ว แต่ลิงก์แชร์ยังใช้งานได้",
'fileViewer.commentSync.backfillPendingBody': "กำลังซิงค์ความคิดเห็นที่มีอยู่ ผู้เยี่ยมชมอาจยังมองไม่เห็น",
'fileViewer.commentSync.backfillPendingCountBody': "กำลังซิงค์ความคิดเห็นที่มีอยู่ · {count}",
"fileViewer.commentSync.reopenSyncBusy": "กำลังซิงค์ความคิดเห็น…",
'fileViewer.commentSync.alignFailedBody': "การจัดเรียงความคิดเห็นยังไม่เสร็จสมบูรณ์ อาจมีความคิดเห็นบางส่วนไม่แสดง",
'fileViewer.shareGuide.title': "แชร์ลิงก์เพื่อรับฟีดแบ็ก",
@@ -3294,11 +3294,12 @@ export const th: Dict = {
'fileViewer.publishFileRequiresTeam': 'การเผยแพร่ลิงก์สาธารณะต้องใช้พื้นที่ทำงานแบบทีม สลับไปยังพื้นที่ทำงานแบบทีม หรือใช้ Deploy เพื่อเผยแพร่ไฟล์นี้',
'fileViewer.publishFileRequiresWorkspace': 'การสร้างลิงก์แชร์ต้องเข้าสู่ระบบเวิร์กสเปซ เข้าสู่ระบบ OpenDesign Cloud หรือแชร์ไฟล์นี้ผ่านการดีพลอย',
'fileViewer.publishFileTooLarge': "โปรเจกต์นี้เกินขีดจำกัดการแชร์ 20 MiB โปรดลดขนาด HTML และทรัพยากรที่อ้างอิง แล้วลองอีกครั้ง",
"fileViewer.shareUpdateHint": "ไฟล์นี้มีการเปลี่ยนแปลงใหม่ อัปเดตลิงก์เพื่อแชร์เวอร์ชันล่าสุด",
"fileViewer.shareUpdateHint": "ไฟล์มีการเปลี่ยนแปลงใหม่ ผู้เข้าชมยังเห็นเวอร์ชันก่อนหน้า",
"fileViewer.shareUpdateLink": "อัปเดตลิงก์",
"fileViewer.signInToUpdate": "เข้าสู่ระบบเพื่ออัปเดต",
"fileViewer.signInToShare": "เข้าสู่ระบบเพื่อแชร์",
"fileViewer.shareOutdatedSignInHint": "ไฟล์นี้มีการเปลี่ยนแปลงใหม่ เข้าสู่ระบบเพื่ออัปเดตหรือปิดลิงก์",
'fileViewer.signInToShareDescription': "ลงชื่อเข้าใช้ Open Design เพื่อสร้างลิงก์แชร์และเชิญผู้อื่นให้ดูและแสดงความคิดเห็น",
"fileViewer.shareUpdateSuccess": "อัปเดตแล้ว ผู้เยี่ยมชมจะเห็นเวอร์ชันล่าสุดหลังรีเฟรช",
"fileViewer.shareUpdateFailed": "อัปเดตไม่สำเร็จ ผู้เยี่ยมชมยังคงเห็นเวอร์ชันก่อนหน้า",
"fileViewer.shareUpdateUncertain": "ไม่ทราบผลการอัปเดต เนื้อหาลิงก์สาธารณะอาจเปลี่ยนไป ตรวจสอบลิงก์หรือหยุดแชร์ก่อนลองอีกครั้ง",
+5 -4
View File
@@ -237,14 +237,14 @@ export const tr: Dict = {
'fileViewer.commentSync.sessionMissing': "Oturum kapalı. Yorum eşitlemesi duraklatıldı; ziyaretçilerin yeni yorumları geçici olarak görünmüyor.",
'fileViewer.commentSync.shareStoppedPersonal': "Bağlantı devre dışı. Paylaşılan sayfaya yorum eşitlemesi duraklatıldı.",
'fileViewer.commentSync.shareStoppedTeam': "Bağlantı devre dışı.",
'fileViewer.commentSync.backfillFailedTitle': "Paylaşım yayımlandı",
'fileViewer.commentSync.backfillFailedBody': "Mevcut yorumlar henüz eşitlenmedi; ziyaretçiler şimdilik bunları göremiyor.",
'fileViewer.commentSync.backfillTerminalBody': "Bazı mevcut yorumlar paylaşım sayfasıyla eşitlenemedi ve otomatik olarak yeniden denenmeyecek. Paylaşım bağlantısı kullanılabilir durumda.",
'fileViewer.commentSync.backfillRetryingBody': "Mevcut yorumlar henüz eşitlenmedi; ziyaretçiler şimdilik göremiyor. Arka planda otomatik olarak yeniden deneniyor.",
'fileViewer.commentSync.backfillRetryingBody': "Mevcut yorumlar henüz eşitlenmedi, bu yüzden ziyaretçiler şimdilik göremiyor. Otomatik olarak yeniden deneniyor.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Yeniden etkinleştirilen paylaşım bağlantısının yorumları eşitleniyor. Silinen veya çözümlenen yorumlar paylaşılan sayfada hâlâ görünebilir.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Yorum eşitlemesi henüz tamamlanmadı. Silinen veya çözümlenen yorumlar paylaşılan sayfada hâlâ görünebilir. Arka planda otomatik olarak yeniden deneniyor.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Yorum eşitlemesi tamamlanmadı. Paylaşım sayfası çözülmüş yorumları hâlâ gösterebilir.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Yorum eşitlemesi henüz tamamlanmadı. Silinen veya çözümlenen yorumlar paylaşılan sayfada hâlâ görünebilir. Otomatik yeniden deneme durdu; paylaşım bağlantısı kullanılabilir.",
'fileViewer.commentSync.backfillPendingBody': "Mevcut yorumlar eşitleniyor. Ziyaretçiler henüz göremeyebilir.",
'fileViewer.commentSync.backfillPendingCountBody': "Mevcut yorumlar eşitleniyor · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Yorumlar eşitleniyor…",
'fileViewer.commentSync.alignFailedBody': "Yorum eşitlemesi tamamlanmadı; bazı yorumlar görünmeyebilir.",
'fileViewer.shareGuide.title': "Bağlantıyı paylaşın, geri bildirim toplayın",
@@ -3294,11 +3294,12 @@ export const tr: Dict = {
'fileViewer.publishFileRequiresTeam': 'Herkese açık bağlantı yayınlamak için ekip çalışma alanı gerekir. Bir ekip çalışma alanına geçin veya bu dosyayı Dağıt ile yayınlayın.',
'fileViewer.publishFileRequiresWorkspace': 'Paylaşım bağlantısı için oturum açılmış bir çalışma alanı gerekir. OpenDesign Cloud\'da oturum açın veya bu dosyayı bir dağıtımla paylaşın.',
'fileViewer.publishFileTooLarge': "Bu proje 20 MiB paylaşım sınırını aşıyor. HTML ve başvurulan kaynakların boyutunu küçültüp yeniden deneyin.",
"fileViewer.shareUpdateHint": "Bu dosyada yeni değişiklikler var. En son sürümü paylaşmak için bağlantıyı güncelleyin.",
"fileViewer.shareUpdateHint": "Dosyada yeni değişiklikler var. Ziyaretçiler hâlâ önceki sürümü görüyor.",
"fileViewer.shareUpdateLink": "Bağlantıyı güncelle",
"fileViewer.signInToUpdate": "Giriş yapıp güncelle",
"fileViewer.signInToShare": "Giriş yapıp paylaş",
"fileViewer.shareOutdatedSignInHint": "Bu dosyada yeni değişiklikler var. Bağlantıyı güncellemek veya kapatmak için giriş yapın.",
'fileViewer.signInToShareDescription': "Paylaşım bağlantısı oluşturmak ve başkalarını görüntülemeye ve yorum yapmaya davet etmek için Open Design’a giriş yapın.",
"fileViewer.shareUpdateSuccess": "Güncellendi. Ziyaretçiler sayfayı yenilediğinde en son sürümü görecek.",
"fileViewer.shareUpdateFailed": "Güncelleme başarısız oldu. Ziyaretçiler hâlâ önceki sürümü görüyor.",
"fileViewer.shareUpdateUncertain": "Güncelleme sonucu bilinmiyor. Herkese açık bağlantının içeriği değişmiş olabilir. Yeniden denemeden önce bağlantıyı kontrol edin veya paylaşımı durdurun.",
+5 -4
View File
@@ -237,14 +237,14 @@ export const uk: Dict = {
'fileViewer.commentSync.sessionMissing': "Ви не ввійшли в обліковий запис. Синхронізацію коментарів призупинено; нові коментарі відвідувачів тимчасово не видно.",
'fileViewer.commentSync.shareStoppedPersonal': "Посилання вимкнено. Синхронізацію коментарів зі спільною сторінкою призупинено.",
'fileViewer.commentSync.shareStoppedTeam': "Посилання вимкнено.",
'fileViewer.commentSync.backfillFailedTitle': "Посилання опубліковано",
'fileViewer.commentSync.backfillFailedBody': "Наявні коментарі ще не синхронізовано — відвідувачі поки що їх не бачать.",
'fileViewer.commentSync.backfillTerminalBody': "Не вдалося синхронізувати деякі наявні коментарі зі сторінкою поширення; автоматичних повторних спроб не буде. Посилання залишається доступним.",
'fileViewer.commentSync.backfillRetryingBody': "Наявні коментарі ще не синхронізовано — відвідувачі поки що їх не бачать. У фоновому режимі триває автоматична повторна спроба.",
'fileViewer.commentSync.backfillRetryingBody': "Наявні коментарі ще не синхронізовано, тому відвідувачі поки їх не бачать. Виконується автоматична повторна спроба.",
'fileViewer.commentSync.backfillReopenedPendingBody': "Триває синхронізація коментарів повторно ввімкненого посилання. Видалені або вирішені коментарі можуть досі відображатися на сторінці спільного доступу.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Синхронізація коментарів ще не завершена. Видалені або вирішені коментарі можуть досі відображатися на сторінці спільного доступу. Повторна спроба виконується автоматично у фоновому режимі.",
'fileViewer.commentSync.backfillReopenedRetryingBody': "Синхронізацію коментарів не завершено. На сторінці спільного доступу ще можуть відображатися вирішені коментарі.",
'fileViewer.commentSync.backfillReopenedTerminalBody': "Синхронізація коментарів ще не завершена. Видалені або вирішені коментарі можуть досі відображатися на сторінці спільного доступу. Автоматичні спроби припинено; посилання залишається доступним.",
'fileViewer.commentSync.backfillPendingBody': "Триває синхронізація наявних коментарів. Відвідувачі поки що можуть їх не бачити.",
'fileViewer.commentSync.backfillPendingCountBody': "Синхронізація наявних коментарів · {count}",
"fileViewer.commentSync.reopenSyncBusy": "Синхронізація коментарів…",
'fileViewer.commentSync.alignFailedBody': "Узгодження коментарів не завершено — деякі коментарі можуть бути відсутні.",
'fileViewer.shareGuide.title': "Поділіться посиланням, збирайте відгуки",
@@ -3294,11 +3294,12 @@ export const uk: Dict = {
'fileViewer.publishFileRequiresTeam': 'Щоб опублікувати загальнодоступне посилання, потрібен командний робочий простір. Перейдіть до командного простору або скористайтеся «Розгорнути».',
'fileViewer.publishFileRequiresWorkspace': 'Для посилання потрібен вхід у робочий простір. Увійдіть в OpenDesign Cloud або поділіться файлом через деплой.',
'fileViewer.publishFileTooLarge': "Проєкт перевищує ліміт поширення 20 MiB. Зменште розмір HTML і пов’язаних ресурсів та спробуйте ще раз.",
"fileViewer.shareUpdateHint": "У файлі є нові зміни. Оновіть посилання, щоб поділитися останньою версією.",
"fileViewer.shareUpdateHint": "У файлі є нові зміни. Відвідувачі досі бачать попередню версію.",
"fileViewer.shareUpdateLink": "Оновити посилання",
"fileViewer.signInToUpdate": "Увійти для оновлення",
"fileViewer.signInToShare": "Увійти й поділитися",
"fileViewer.shareOutdatedSignInHint": "У файлі є нові зміни. Увійдіть, щоб оновити або вимкнути посилання.",
'fileViewer.signInToShareDescription': "Увійдіть в Open Design, щоб створити посилання для спільного доступу й запросити інших переглядати та коментувати.",
"fileViewer.shareUpdateSuccess": "Оновлено. Відвідувачі побачать останню версію після оновлення сторінки.",
"fileViewer.shareUpdateFailed": "Не вдалося оновити. Відвідувачі й далі бачать попередню версію.",
"fileViewer.shareUpdateUncertain": "Результат оновлення невідомий. Вміст публічного посилання міг змінитися. Перевірте посилання або зупиніть доступ перед повторною спробою.",
+5 -4
View File
@@ -245,14 +245,14 @@ export const zhCN: Dict = {
'fileViewer.commentSync.sessionMissing': "未登录,评论暂停同步,访客的新评论暂时看不到。",
'fileViewer.commentSync.shareStoppedPersonal': "链接已停用,评论暂停同步到分享页。",
'fileViewer.commentSync.shareStoppedTeam': "链接已停用。",
'fileViewer.commentSync.backfillFailedTitle': "分享已发布",
'fileViewer.commentSync.backfillFailedBody': "已有评论暂未同步,访客暂时看不到",
'fileViewer.commentSync.backfillTerminalBody': "部分已有评论未能同步到分享页,系统不会自动重试。分享链接仍可使用。",
'fileViewer.commentSync.backfillRetryingBody': "已有评论暂未同步,访客暂时看不到。正在后台自动重试。",
'fileViewer.commentSync.backfillRetryingBody': "已有评论还没同步,访问者暂时看不到。正在自动重试。",
'fileViewer.commentSync.backfillReopenedPendingBody': "正在同步重新开启的分享链接;分享页可能仍显示已删除或已处理的评论。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "评论同步尚未完成,分享页可能仍显示已删除或已处理的评论。正在后台自动重试。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "评论同步未完成,分享页可能仍显示已处理的评论。",
'fileViewer.commentSync.backfillReopenedTerminalBody': "评论同步尚未完成,分享页可能仍显示已删除或已处理的评论。自动重试已停止;分享链接仍可使用。",
'fileViewer.commentSync.backfillPendingBody': "正在同步已有评论,访客暂时可能看不到。",
'fileViewer.commentSync.backfillPendingCountBody': "同步已有评论 · {count} 条",
"fileViewer.commentSync.reopenSyncBusy": "正在同步评论…",
'fileViewer.commentSync.alignFailedBody': "评论对齐未完成,可能有评论没显示出来",
'fileViewer.shareGuide.title': "分享链接,让大家留下反馈",
@@ -3466,11 +3466,12 @@ export const zhCN: Dict = {
"fileViewer.publishFileRequiresTeam": "发布公开链接需要团队工作区。请切换到团队工作区,或使用「部署」发布此文件。",
"fileViewer.publishFileRequiresWorkspace": "生成分享链接需要登录工作区。请登录 OpenDesign Cloud,或改用「部署」分享此文件。",
"fileViewer.publishFileTooLarge": "项目超过 20 MiB 分享上限。请减小 HTML 和引用资源的总大小后重试。",
"fileViewer.shareUpdateHint": "文件有新改动。更新链接以分享最新版本。",
"fileViewer.shareUpdateHint": "文件有新改动,访问者看到的还是上一版。",
"fileViewer.shareUpdateLink": "更新链接",
"fileViewer.signInToUpdate": "登录后更新",
"fileViewer.signInToShare": "登录后分享",
"fileViewer.shareOutdatedSignInHint": "文件有新改动,登录后可更新或关闭链接。",
'fileViewer.signInToShareDescription': "登录 Open Design 账号后,即可生成分享链接,邀请他人查看和评论。",
"fileViewer.shareUpdateSuccess": "已更新,访问者刷新后可看到最新版本",
"fileViewer.shareUpdateFailed": "更新失败,访问者仍看到上一版",
"fileViewer.shareUpdateUncertain": "更新结果尚不确定,公开链接的内容可能已变化。请先检查链接或停止分享,再重试。",
+5 -4
View File
@@ -245,14 +245,14 @@ export const zhTW: Dict = {
'fileViewer.commentSync.sessionMissing': "尚未登入,評論暫停同步,暫時看不到訪客的新評論。",
'fileViewer.commentSync.shareStoppedPersonal': "連結已停用,評論暫停同步到分享頁。",
'fileViewer.commentSync.shareStoppedTeam': "連結已停用。",
'fileViewer.commentSync.backfillFailedTitle': "分享已發布",
'fileViewer.commentSync.backfillFailedBody': "已有評論暫未同步,訪客暫時看不到",
'fileViewer.commentSync.backfillTerminalBody': "部分既有評論未能同步至分享頁,系統不會自動重試。分享連結仍可使用。",
'fileViewer.commentSync.backfillRetryingBody': "既有評論尚未同步,訪客暫時看不到。正在背景自動重試。",
'fileViewer.commentSync.backfillRetryingBody': "既有評論尚未同步,訪客暫時看不到。正在自動重試。",
'fileViewer.commentSync.backfillReopenedPendingBody': "正在同步重新開啟的分享連結;分享頁可能仍顯示已刪除或已處理的留言。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "留言同步尚未完成,分享頁可能仍顯示已刪除或已處理的留言。正在背景自動重試。",
'fileViewer.commentSync.backfillReopenedRetryingBody': "評論同步未完成,分享頁可能仍顯示已處理的評論。",
'fileViewer.commentSync.backfillReopenedTerminalBody': "留言同步尚未完成,分享頁可能仍顯示已刪除或已處理的留言。自動重試已停止;分享連結仍可使用。",
'fileViewer.commentSync.backfillPendingBody': "正在同步既有評論,訪客暫時可能看不到。",
'fileViewer.commentSync.backfillPendingCountBody': "同步既有評論 · {count} 則",
"fileViewer.commentSync.reopenSyncBusy": "正在同步留言…",
'fileViewer.commentSync.alignFailedBody': "評論對齊未完成,可能有評論沒顯示出來",
'fileViewer.shareGuide.title': "分享連結,讓大家留下回饋",
@@ -3475,11 +3475,12 @@ export const zhTW: Dict = {
"fileViewer.publishFileRequiresTeam": "發布公開連結需要團隊工作區。請切換到團隊工作區,或使用「部署」發布此檔案。",
"fileViewer.publishFileRequiresWorkspace": "產生分享連結需要登入工作區。請登入 OpenDesign Cloud,或改用「部署」分享此檔案。",
"fileViewer.publishFileTooLarge": "專案超過 20 MiB 分享上限。請減小 HTML 和引用資源的總大小後重試。",
"fileViewer.shareUpdateHint": "檔案有新變更。更新連結以分享最新版本。",
"fileViewer.shareUpdateHint": "檔案有新變更,訪客看到的仍是上一版。",
"fileViewer.shareUpdateLink": "更新連結",
"fileViewer.signInToUpdate": "登入後更新",
"fileViewer.signInToShare": "登入後分享",
"fileViewer.shareOutdatedSignInHint": "檔案有新變更,登入後可更新或關閉連結。",
'fileViewer.signInToShareDescription': "登入 Open Design 帳號後,即可產生分享連結,邀請他人查看和評論。",
"fileViewer.shareUpdateSuccess": "已更新,訪客重新整理後可看到最新版本",
"fileViewer.shareUpdateFailed": "更新失敗,訪客仍看到上一版",
"fileViewer.shareUpdateUncertain": "更新結果尚未確定,公開連結的內容可能已變更。請先檢查連結或停止分享,再重試。",
+3 -1
View File
@@ -137,7 +137,6 @@ export interface Dict {
'fileViewer.commentSync.sessionMissing': string;
'fileViewer.commentSync.shareStoppedPersonal': string;
'fileViewer.commentSync.shareStoppedTeam': string;
'fileViewer.commentSync.backfillFailedTitle': string;
'fileViewer.commentSync.backfillFailedBody': string;
'fileViewer.commentSync.backfillRetryingBody': string;
'fileViewer.commentSync.backfillReopenedPendingBody': string;
@@ -145,6 +144,8 @@ export interface Dict {
'fileViewer.commentSync.backfillReopenedTerminalBody': string;
'fileViewer.commentSync.backfillTerminalBody': string;
'fileViewer.commentSync.backfillPendingBody': string;
/** K1 with a known batch size: `{count}` is the initial backfill batch's total comment count. */
'fileViewer.commentSync.backfillPendingCountBody': string;
/** K4: reopen-resume comment sync busy state, shown in the primary share button itself. */
'fileViewer.commentSync.reopenSyncBusy': string;
'fileViewer.commentSync.alignFailedBody': string;
@@ -4230,6 +4231,7 @@ export interface Dict {
'fileViewer.signInToUpdate': string;
'fileViewer.signInToShare': string;
'fileViewer.shareOutdatedSignInHint': string;
'fileViewer.signInToShareDescription': string;
'fileViewer.shareUpdateSuccess': string;
'fileViewer.shareUpdateFailed': string;
'fileViewer.shareUpdateUncertain': string;
@@ -87,7 +87,7 @@ it('S0 login success returns to the first-share panel without automatically gene
const route = publishedRoute({ noPublication: true, amrAuthenticated: true });
const view = render(<CollabProvider value={{ ...collab, workspaceContext: null }}><FileViewer {...props} /></CollabProvider>);
fireEvent.click(await screen.findByRole('button', { name: /^share$/i }));
expect(screen.getByText('A share link needs a signed-in workspace. Sign in to OpenDesign Cloud, or use a deploy option to share this file.')).toBeVisible();
expect(screen.getByText('Sign in to Open Design to create a share link and invite others to view and comment.')).toBeVisible();
await act(async () => fireEvent.click(screen.getByTestId('share-cloud-signin')));
view.rerender(<CollabProvider value={collab}><FileViewer {...props} /></CollabProvider>);
await waitFor(() => expect(screen.getByRole('menuitem', { name: /generate and copy link/i })).toBeEnabled());
@@ -121,7 +121,8 @@ describe('CommentSyncBanner — restored branches', () => {
.mockImplementationOnce(async () => Response.json({ ...base, backfill: { state: 'succeeded', filePath: 'index.html', publicationRevision: 'r1', retryable: false } }));
render(<I18nProvider initial="zh-CN"><CommentSyncBanner projectId="p" workspaceContext={personalContext} filePath="index.html" /></I18nProvider>);
await act(async () => { await Promise.resolve(); await Promise.resolve(); });
expect(screen.getByText('分享已发布')).toBeInTheDocument();
expect(screen.getByText('已有评论还没同步,访问者暂时看不到。正在自动重试。')).toBeInTheDocument();
expect(screen.queryByText('分享已发布')).toBeNull();
expect(screen.getByRole('button', { name: '重试' })).toBeInTheDocument();
await act(async () => { await vi.advanceTimersByTimeAsync(2_000); });
expect(screen.queryByRole('status')).toBeNull();
@@ -130,7 +131,6 @@ describe('CommentSyncBanner — restored branches', () => {
it('shows an accurate terminal backfill outcome without offering a manual retry', async () => {
renderBanner({ ...base, backfill: { state: 'failed', filePath: 'index.html', publicationRevision: 'r1', retryable: false } });
await screen.findByText('分享已发布');
await screen.findByText('部分已有评论未能同步到分享页,系统不会自动重试。分享链接仍可使用。');
expect(screen.queryByRole('button', { name: '重试' })).toBeNull();
});
@@ -0,0 +1,133 @@
// @vitest-environment jsdom
/**
* K1: the first-publication comment-backfill progress bar names the initial
* batch size ("同步已有评论 · {count} 条") when CommentBackfillState reports a
* real, measured `total`/`synced` — and falls back to the old indeterminate
* sentence when an older daemon build omits those fields.
*/
import { cleanup, render, screen, waitFor } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type { CommentSyncState, WorkspaceCollabContext } from '@open-design/contracts';
import { buildWorkspacePermissions, buildWorkspaceSeatSummary } from '@open-design/contracts';
import { ShareTab } from '../../../src/components/share/ShareTab';
import { I18nProvider } from '../../../src/i18n';
import { zhCN } from '../../../src/i18n/locales/zh-CN';
import type { Dict } from '../../../src/i18n/types';
import { resetWorkspaceAccountGeneration } from '../../../src/collab/workspace-identity';
vi.mock('../../../src/components/AmrLoginPill', () => ({
AmrLoginPill: () => <div data-testid="login-pill" />,
}));
const workspaceContext: WorkspaceCollabContext = {
workspaceId: 'ws', workspaceType: 'personal', workspaceMemberId: 'member', role: 'owner',
memberStatus: 'active', lifecycleState: 'active', billingState: 'active', planId: null, providerMode: 'platform_credits',
seatSummary: buildWorkspaceSeatSummary({ seatLimit: 1, usedSeats: 1 }),
permissions: buildWorkspacePermissions({ role: 'owner', lifecycleState: 'active' }),
};
const fetchMock = vi.fn<typeof fetch>();
/** Real `t()` interpolates `{name}` placeholders; the plain `key => zhCN[key]`
* shorthand used by other ShareTab tests does not, which would leave this
* count key rendering its literal `{count}` template. */
function tZh(key: keyof Dict, vars?: Record<string, string | number>): string {
const raw = zhCN[key] ?? key;
if (!vars) return raw;
return raw.replace(/\{(\w+)\}/g, (_match: string, name: string) => {
const value = vars[name];
return value == null ? `{${name}}` : String(value);
});
}
function renderShareTab(state: CommentSyncState) {
fetchMock.mockImplementation(async (input) => {
const url = typeof input === 'string' ? input : input.toString();
if (url.includes('/comment-sync-state')) return Response.json(state);
return Response.json({ state: 'unknown', reason: 'unavailable' });
});
return render(
<I18nProvider initial="zh-CN">
<ShareTab
menuOrigin="artifact-card"
workspaceContext={workspaceContext}
t={tZh}
shareAccess="private"
shareAccessMenuOpen={false}
shareAccessBusy={false}
viewerOnly={false}
setShareAccessMenuOpen={vi.fn()}
setWorkspaceShareAccess={vi.fn()}
canPublishPublic
filePublished
publishedFileUrl="https://example.test/artifact/p/s"
copyPublishedFileLink={vi.fn().mockResolvedValue(undefined)}
publishLinkFeedback={null}
publishingPublicFile={false}
publishProgress={null}
unpublishCurrentFilePublic={vi.fn().mockResolvedValue(undefined)}
viewerOnlyDisabledTitle="read only"
publishCurrentFilePublic={vi.fn().mockResolvedValue(undefined)}
publishFailureKey={null}
streaming={false}
sharePageUrl=""
canCopyShareLink={false}
shareUnavailableHint=""
copyShareLink={vi.fn().mockResolvedValue(true)}
copyShareLinkLabel=""
canOpenSharePage={false}
shareLinkStatusHint=""
projectId="p"
filePath="index.html"
/>
</I18nProvider>,
);
}
const base: CommentSyncState = { pending: 1, lastError: null, sessionMissing: false, shareStopped: false };
beforeEach(() => { fetchMock.mockReset(); vi.stubGlobal('fetch', fetchMock); resetWorkspaceAccountGeneration(); });
afterEach(() => { cleanup(); vi.unstubAllGlobals(); resetWorkspaceAccountGeneration(); });
describe('K1 comment-sync progress count', () => {
it('renders the design copy with the real batch count and a determinate fill', async () => {
renderShareTab({
...base,
backfill: { state: 'pending', filePath: 'index.html', publicationRevision: 'r1', retryable: true, reopened: false, total: 12, synced: 6 },
});
await waitFor(() => expect(fetchMock).toHaveBeenCalled());
await screen.findByText('同步已有评论 · 12 条');
expect(screen.queryByText('正在同步已有评论,访客暂时可能看不到。')).toBeNull();
const fill = document.querySelector('[class*="syncProgressFill"]') as HTMLElement;
expect(fill).toBeTruthy();
expect(fill.className).toContain('syncProgressFillDeterminate');
expect(fill.style.width).toBe('50%');
expect(screen.getByText('关闭面板不会中断上传。')).toBeInTheDocument();
});
it('falls back to the indeterminate sweep and generic copy when the daemon omits the count', async () => {
renderShareTab({
...base,
backfill: { state: 'pending', filePath: 'index.html', publicationRevision: 'r1', retryable: true, reopened: false },
});
await waitFor(() => expect(fetchMock).toHaveBeenCalled());
await screen.findByText('正在同步已有评论,访客暂时可能看不到。');
expect(screen.queryByText(/同步已有评论 ·/)).toBeNull();
const fill = document.querySelector('[class*="syncProgressFill"]') as HTMLElement;
expect(fill).toBeTruthy();
expect(fill.className).not.toContain('syncProgressFillDeterminate');
expect(fill.style.width).toBe('');
});
it('K4 reopened busy button is unaffected by the count field', async () => {
renderShareTab({
...base,
backfill: { state: 'pending', filePath: 'index.html', publicationRevision: 'r2', retryable: true, reopened: true, total: 3, synced: 1 },
});
await waitFor(() => expect(fetchMock).toHaveBeenCalled());
await screen.findByText('正在同步评论…');
expect(screen.queryByText(/同步已有评论 ·/)).toBeNull();
});
});
@@ -60,7 +60,7 @@ describe('S0/S13 signed-out Share panel', () => {
it('explains why an unbound workspace cannot publish and offers a real sign-in entry, not an empty shell', () => {
const input = props({ canPublishPublic: false, filePublished: false, publishedFileUrl: '' });
render(<I18nProvider><ShareTab {...input} /></I18nProvider>);
expect(screen.getByText('fileViewer.publishFileRequiresWorkspace')).toBeVisible();
expect(screen.getByText('fileViewer.signInToShareDescription')).toBeVisible();
expect(screen.getByRole('button', { name: 'fileViewer.signInToShare' })).toBeEnabled();
expect(screen.queryByRole('switch', { name: 'fileViewer.linkAccessTitle' })).toBeNull();
expect(input.publishCurrentFilePublic).not.toHaveBeenCalled();
Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 160 KiB

+7 -5
View File
@@ -98,7 +98,7 @@ test('Owner-K1 first publication syncs existing comments', async ({ page }) => {
const k1 = await setupProject(page, 'k1');
const k1Pub = await setPublicationProjection(page, k1.projectId, 'none', 'k1-existing-comment');
await page.route(`**/api/projects/${k1.projectId}/comment-sync-state*`, route => route.request().method() === 'GET'
? route.fulfill({ json: { pending: 1, sessionMissing: false, lastError: null, shareStopped: false, backfill: { state: 'pending', filePath: 'index.html', publicationRevision: 'k1-revision', retryable: true, reopened: false } } })
? route.fulfill({ json: { pending: 1, sessionMissing: false, lastError: null, shareStopped: false, backfill: { state: 'pending', filePath: 'index.html', publicationRevision: 'k1-revision', retryable: true, reopened: false, total: 1, synced: 0 } } })
: route.fallback());
let finishK1!: () => void;
let startedK1!: () => void;
@@ -120,10 +120,12 @@ test('Owner-K1 first publication syncs existing comments', async ({ page }) => {
finishK1();
}
// Target K1: the primary action itself becomes the sync progress bar; no URL row while syncing.
const k1Banner = k1Menu.getByLabel('正在同步已有评论,访客暂时可能看不到。');
// The design's exact copy is "同步已有评论 · N 条" (N = the initial backfill batch
// size); this isolated project persisted one real comment, so N is 1.
const k1Banner = k1Menu.getByLabel('同步已有评论 · 1 条');
await expect(k1Banner).toBeVisible();
await expect(k1Menu.locator('.chrome-publish-url')).toHaveCount(0);
await capture(page, 'K1', k1.projectId, { state: 'publication-complete-existing-comments-syncing', existingLocalCommentCount: 1, commentText: '停用分享前已存在的项目评论', publicationUrl: k1Pub.url, commentSyncProjection: { pending: 1, backfill: { state: 'pending', reopened: false, retryable: true } }, renderedSyncStatus: await k1Banner.innerText(), visualGap: 'The first-publication branch now has a dark spinner/status treatment and syncs the persisted historical comment, matching the target progress affordance. The design shows “12条”; this isolated project has one persisted comment, and the production label has no count.' });
await capture(page, 'K1', k1.projectId, { state: 'publication-complete-existing-comments-syncing', existingLocalCommentCount: 1, commentText: '停用分享前已存在的项目评论', publicationUrl: k1Pub.url, commentSyncProjection: { pending: 1, backfill: { state: 'pending', reopened: false, retryable: true, total: 1, synced: 0 } }, renderedSyncStatus: await k1Banner.innerText(), visualGap: 'The first-publication branch now matches the design copy exactly, including the "同步已有评论 · N 条" count and the "关闭面板不会中断上传。" help line. The design shows “12条”; this isolated project has one real persisted comment, so N is 1 rather than 12 — the count is real and driven by the daemon-reported batch size, not a fixed mismatch.' });
});
@@ -205,8 +207,8 @@ test('Owner-K4/K5 distinct comment-sync capture sequences', async ({ page }) =>
await openShareMenu(page, k5.projectId);
await expect(k5Menu.getByRole('switch', { name: '链接访问' })).toHaveAttribute('aria-checked', 'true');
await expect(k5Menu.locator('.chrome-publish-url')).toHaveText(k5Pub.url);
const k5Banner = k5Menu.getByRole('status').filter({ hasText: '评论同步尚未完成' });
await expect(k5Banner).toContainText('评论同步尚未完成');
const k5Banner = k5Menu.getByRole('status').filter({ hasText: '评论同步未完成' });
await expect(k5Banner).toContainText('评论同步未完成,分享页可能仍显示已处理的评论。');
await expect(k5Banner.getByRole('button', { name: '重试' })).toBeVisible();
await expect(k5Banner).toHaveCSS('border-top-width', '0px');
await expect(k5Banner).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)');
+2 -2
View File
@@ -43,8 +43,8 @@ test('Owner-K2 keeps failed published-comment status and retry unboxed in the Sh
const menu = page.locator('.share-menu-popover[role="menu"]');
await expect(menu).toBeVisible();
const status = menu.getByRole('status');
await expect(status).toContainText('分享已发布');
await expect(status).toContainText('已有评论暂未同步');
await expect(status).not.toContainText('分享已发布');
await expect(status).toContainText('已有评论还没同步,访问者暂时看不到。正在自动重试。');
const retry = status.getByRole('button', { name: '重试' });
await expect(retry).toBeVisible();
const statusStyle = await status.evaluate(element => ({ border: getComputedStyle(element).borderTopWidth, background: getComputedStyle(element).backgroundColor }));
+1 -1
View File
@@ -302,7 +302,7 @@ test('capture isolated OD share entry, progress and failure states',async({page}
await failedBackfillRead;
const backfillBanner=page.getByRole('status').filter({hasText:/已有评论还没同步|评论.*同步/}).first();
await expect(backfillBanner).toBeVisible();
await expect(backfillBanner).toContainText('已有评论暂未同步,访客暂时看不到。正在后台自动重试。');
await expect(backfillBanner).toContainText('已有评论还没同步,访问者暂时看不到。正在自动重试。');
await save(page,'K2','K2',{backfill:{state:'failed',retryable:true,filePath:'index.html'},provenance:'GET-only local UI fixture'});
// This same failed-backfill response follows the scripted stop → re-enable (S9-R).
await save(page,'K5','K5');
+16
View File
@@ -2174,6 +2174,22 @@ export interface CommentBackfillState {
reopened?: boolean;
/** Machine-readable cause, when the producer recorded one. */
code?: string;
/**
* The initial batch's size and how many of its members have been
* delivered so far — both real, measured counts from
* `published_comment_backfill_members`, never an estimate.
*
* Absent means an older daemon build that predates this field, not zero:
* a client seeing no `total` falls back to an indeterminate indicator
* instead of rendering "0 条". When present, `synced` is always `<= total`
* and describes THIS batch/revision only — a member delivered by a later,
* unrelated send does not retroactively inflate an earlier revision's
* count, because `readPublishedCommentBackfill` already scopes the query
* to the file's current `publicationRevision`.
*/
total?: number;
/** See {@link CommentBackfillState.total}. Only meaningful alongside it. */
synced?: number;
}
/**