Compare commits

...

1 Commits

Author SHA1 Message Date
CodeRabbit Fixer
e935794fd4 fix: Refactor: Clean up localization key structure in en/main.json (#9447)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 15:11:25 +01:00
21 changed files with 264 additions and 265 deletions

View File

@@ -3002,127 +3002,119 @@
"share": "Share", "share": "Share",
"shareTooltip": "Share workflow" "shareTooltip": "Share workflow"
}, },
"shareWorkflow": { "sharing": {
"shareLinkTab": "Share",
"publishToHubTab": "Publish",
"loadingTitle": "Share workflow",
"unsavedTitle": "Save workflow first",
"unsavedDescription": "You must save your workflow before sharing. Save it now to continue.",
"saveButton": "Save workflow",
"saving": "Saving...",
"workflowNameLabel": "Workflow name", "workflowNameLabel": "Workflow name",
"createLinkTitle": "Share workflow", "share": {
"createLinkDescription": "When you create a link for your workflow, you will share these media items along with your workflow", "shareLinkTab": "Share",
"privateAssetsDescription": "Your workflow contains private models and/or media files", "publishToHubTab": "Publish",
"createLinkButton": "Create a link", "unsavedDescription": "You must save your workflow before sharing. Save it now to continue.",
"creatingLink": "Creating a link...", "saveButton": "Save workflow",
"successTitle": "Workflow successfully published!", "saving": "Saving...",
"successDescription": "Anyone with this link can view and use this workflow. If you make changes to this workflow, you can republish to update the shared version.", "privateAssetsDescription": "Your workflow contains private models and/or media files",
"hasChangesTitle": "Share workflow", "createLinkButton": "Create a link",
"hasChangesDescription": "You have made changes since this workflow was last published.", "creatingLink": "Creating a link...",
"updateLinkButton": "Update link", "successDescription": "Anyone with this link can view and use this workflow. If you make changes to this workflow, you can republish to update the shared version.",
"updatingLink": "Updating link...", "hasChangesDescription": "You have made changes since this workflow was last published.",
"publishedOn": "Published on {date}", "updateLinkButton": "Update link",
"copyLink": "Copy", "updatingLink": "Updating link...",
"linkCopied": "Copied!", "publishedOn": "Published on {date}",
"shareUrlLabel": "Share URL", "copyLink": "Copy",
"loadFailed": "Failed to load shared workflow", "linkCopied": "Copied!",
"saveFailedTitle": "Save failed", "shareUrlLabel": "Share URL",
"saveFailedDescription": "Failed to save workflow. Please try again.", "loadFailed": "Failed to load shared workflow",
"mediaLabel": "{count} Media File | {count} Media Files", "saveFailedTitle": "Save failed",
"modelsLabel": "{count} Model | {count} Models", "saveFailedDescription": "Failed to save workflow. Please try again.",
"checkingAssets": "Checking media visibility…", "mediaLabel": "{count} Media File | {count} Media Files",
"acknowledgeCheckbox": "I understand these media items will be published and made public", "modelsLabel": "{count} Model | {count} Models",
"inLibrary": "In library", "checkingAssets": "Checking media visibility…",
"comfyHubTitle": "Upload to ComfyHub", "acknowledgeCheckbox": "I understand these media items will be published and made public",
"comfyHubDescription": "ComfyHub is ComfyUI's official community hub.\nYour workflow will have a public page viewable by all.", "inLibrary": "In library"
"comfyHubButton": "Upload to ComfyHub" },
}, "open": {
"openSharedWorkflow": { "dialogTitle": "Open shared workflow",
"dialogTitle": "Open shared workflow", "author": "Author:",
"author": "Author:", "copyDescription": "Opening the workflow will create a new copy in your workspace",
"copyDescription": "Opening the workflow will create a new copy in your workspace", "nonPublicAssetsWarningLine1": "This workflow comes with non-public assets.",
"nonPublicAssetsWarningLine1": "This workflow comes with non-public assets.", "nonPublicAssetsWarningLine2": "These will be imported to your library when you open the workflow",
"nonPublicAssetsWarningLine2": "These will be imported to your library when you open the workflow", "copyAssetsAndOpen": "Import assets & open workflow",
"copyAssetsAndOpen": "Import assets & open workflow", "openWorkflow": "Open workflow",
"openWorkflow": "Open workflow", "openWithoutImporting": "Open without importing",
"openWithoutImporting": "Open without importing", "importFailed": "Failed to import workflow assets",
"importFailed": "Failed to import workflow assets", "loadError": "Could not load this shared workflow. Please try again later."
"loadError": "Could not load this shared workflow. Please try again later." },
}, "publish": {
"comfyHubPublish": { "title": "Publish to ComfyHub",
"title": "Publish to ComfyHub", "stepDescribe": "Describe your workflow",
"stepDescribe": "Describe your workflow", "stepExamples": "Add output examples",
"stepExamples": "Add output examples", "stepFinish": "Finish publishing",
"stepFinish": "Finish publishing", "workflowNamePlaceholder": "Tip: enter a descriptive name that's easy to search",
"workflowName": "Workflow name", "workflowDescription": "Workflow description",
"workflowNamePlaceholder": "Tip: enter a descriptive name that's easy to search", "workflowDescriptionPlaceholder": "What makes your workflow exciting and special? Be specific so people know what to expect.",
"workflowDescription": "Workflow description", "workflowType": "Workflow type",
"workflowDescriptionPlaceholder": "What makes your workflow exciting and special? Be specific so people know what to expect.", "workflowTypePlaceholder": "Select the type",
"workflowType": "Workflow type", "workflowTypeImageGeneration": "Image generation",
"workflowTypePlaceholder": "Select the type", "workflowTypeVideoGeneration": "Video generation",
"workflowTypeImageGeneration": "Image generation", "workflowTypeUpscaling": "Upscaling",
"workflowTypeVideoGeneration": "Video generation", "workflowTypeEditing": "Editing",
"workflowTypeUpscaling": "Upscaling", "tags": "Tags",
"workflowTypeEditing": "Editing", "tagsDescription": "Select tags so people can find your workflow faster",
"tags": "Tags", "tagsPlaceholder": "Enter tags that match your workflow to help people find it e.g #nanobanana, #anime or #faceswap",
"tagsDescription": "Select tags so people can find your workflow faster", "selectAThumbnail": "Select a thumbnail",
"tagsPlaceholder": "Enter tags that match your workflow to help people find it e.g #nanobanana, #anime or #faceswap", "showMoreTags": "Show more...",
"selectAThumbnail": "Select a thumbnail", "showLessTags": "Show less...",
"showMoreTags": "Show more...", "suggestedTags": "Suggested tags",
"showLessTags": "Show less...", "thumbnailImage": "Image",
"suggestedTags": "Suggested tags", "thumbnailVideo": "Video",
"thumbnailImage": "Image", "thumbnailImageComparison": "Image comparison",
"thumbnailVideo": "Video", "uploadThumbnail": "Upload an image",
"thumbnailImageComparison": "Image comparison", "uploadVideo": "Upload a video",
"uploadThumbnail": "Upload an image", "uploadComparison": "Upload before and after",
"uploadVideo": "Upload a video", "thumbnailPreview": "Thumbnail preview",
"uploadComparison": "Upload before and after", "uploadPromptClickToBrowse": "Click to browse or",
"thumbnailPreview": "Thumbnail preview", "uploadPromptDropImage": "drop an image here",
"uploadPromptClickToBrowse": "Click to browse or", "uploadPromptDropVideo": "drop a video here",
"uploadPromptDropImage": "drop an image here", "uploadComparisonBeforePrompt": "Before",
"uploadPromptDropVideo": "drop a video here", "uploadComparisonAfterPrompt": "After",
"uploadComparisonBeforePrompt": "Before", "uploadThumbnailHint": "1:1 preferred, 1080p max",
"uploadComparisonAfterPrompt": "After", "back": "Back",
"uploadThumbnailHint": "1:1 preferred, 1080p max", "next": "Next",
"back": "Back", "publishButton": "Publish to ComfyHub",
"next": "Next", "examplesDescription": "Add up to {total} additional sample images",
"publishButton": "Publish to ComfyHub", "uploadAnImage": "Click to browse or drag an image",
"examplesDescription": "Add up to {total} additional sample images", "uploadExampleImage": "Upload example image",
"uploadAnImage": "Click to browse or drag an image", "exampleImage": "Example image {index}",
"uploadExampleImage": "Upload example image", "videoPreview": "Video thumbnail preview",
"exampleImage": "Example image {index}", "maxExamples": "You can select up to {max} examples",
"videoPreview": "Video thumbnail preview", "createProfileToPublish": "Create a profile to publish to ComfyHub",
"maxExamples": "You can select up to {max} examples", "createProfileCta": "Create a profile"
"createProfileToPublish": "Create a profile to publish to ComfyHub", },
"createProfileCta": "Create a profile" "profile": {
}, "checkingAccess": "Checking your publishing access...",
"comfyHubProfile": { "profileCreationNav": "Profile creation",
"checkingAccess": "Checking your publishing access...", "introTitle": "Publish to the ComfyHub",
"profileCreationNav": "Profile creation", "introDescription": "Publish your workflows, build your portfolio and get discovered by millions of users",
"introTitle": "Publish to the ComfyHub", "introSubtitle": "To share your workflow on ComfyHub, let's first create your profile.",
"introDescription": "Publish your workflows, build your portfolio and get discovered by millions of users", "createProfileButton": "Create my profile",
"introSubtitle": "To share your workflow on ComfyHub, let's first create your profile.", "startPublishingButton": "Start publishing",
"createProfileButton": "Create my profile", "modalTitle": "Create your profile on ComfyHub",
"startPublishingButton": "Start publishing", "createProfileTitle": "Create your Comfy Hub profile",
"modalTitle": "Create your profile on ComfyHub", "uploadCover": "+ Upload a cover",
"createProfileTitle": "Create your Comfy Hub profile", "uploadProfilePicture": "+ Upload a profile picture",
"uploadCover": "+ Upload a cover", "chooseProfilePicture": "Choose a profile picture",
"uploadProfilePicture": "+ Upload a profile picture", "nameLabel": "Your name",
"chooseProfilePicture": "Choose a profile picture", "namePlaceholder": "Enter your name here",
"nameLabel": "Your name", "usernameLabel": "Your username (required)",
"namePlaceholder": "Enter your name here", "usernamePlaceholder": "@",
"usernameLabel": "Your username (required)", "descriptionLabel": "Your description",
"usernamePlaceholder": "@", "descriptionPlaceholder": "Tell the community about yourself...",
"descriptionLabel": "Your description", "createProfile": "Create profile",
"descriptionPlaceholder": "Tell the community about yourself...", "creatingProfile": "Creating profile...",
"createProfile": "Create profile", "successTitle": "Looking good, {'@'}{username}!",
"creatingProfile": "Creating profile...", "successProfileUrl": "Your profile page is live at",
"successTitle": "Looking good, {'@'}{username}!", "successProfileLink": "comfy.com/p/{username}",
"successProfileUrl": "Your profile page is live at", "successDescription": "You can now upload your workflow to your creator page",
"successProfileLink": "comfy.com/p/{username}", "uploadWorkflowButton": "Upload my workflow"
"successDescription": "You can now upload your workflow to your creator page", }
"uploadWorkflowButton": "Upload my workflow"
}, },
"desktopDialogs": { "desktopDialogs": {
"": { "": {

View File

@@ -53,7 +53,7 @@
v-if="item.in_library" v-if="item.in_library"
class="ml-auto shrink-0 text-xs text-muted-foreground" class="ml-auto shrink-0 text-xs text-muted-foreground"
> >
{{ $t('shareWorkflow.inLibrary') }} {{ $t('sharing.share.inLibrary') }}
</span> </span>
</li> </li>
</ul> </ul>

View File

@@ -20,23 +20,25 @@ const i18n = createI18n({
messages: { messages: {
en: { en: {
g: { close: 'Close', cancel: 'Cancel' }, g: { close: 'Close', cancel: 'Cancel' },
openSharedWorkflow: { sharing: {
dialogTitle: 'Open shared workflow', open: {
copyDescription: dialogTitle: 'Open shared workflow',
'Opening the workflow will create a new copy in your workspace', copyDescription:
nonPublicAssetsWarningLine1: 'Opening the workflow will create a new copy in your workspace',
'This workflow comes with non-public assets.', nonPublicAssetsWarningLine1:
nonPublicAssetsWarningLine2: 'This workflow comes with non-public assets.',
'These will be added to your library when you open the workflow', nonPublicAssetsWarningLine2:
copyAssetsAndOpen: 'Copy assets & open workflow', 'These will be added to your library when you open the workflow',
openWorkflow: 'Open workflow', copyAssetsAndOpen: 'Copy assets & open workflow',
openWithoutImporting: 'Open without importing', openWorkflow: 'Open workflow',
loadError: openWithoutImporting: 'Open without importing',
'Could not load this shared workflow. Please try again later.' loadError:
}, 'Could not load this shared workflow. Please try again later.'
shareWorkflow: { },
mediaLabel: '{count} Media File | {count} Media Files', share: {
modelsLabel: '{count} Model | {count} Models' mediaLabel: '{count} Media File | {count} Media Files',
modelsLabel: '{count} Model | {count} Models'
}
} }
} }
} }

View File

@@ -4,7 +4,7 @@
class="flex h-12 items-center justify-between gap-2 border-b border-border-default px-4" class="flex h-12 items-center justify-between gap-2 border-b border-border-default px-4"
> >
<h2 class="text-sm text-base-foreground"> <h2 class="text-sm text-base-foreground">
{{ $t('openSharedWorkflow.dialogTitle') }} {{ $t('sharing.open.dialogTitle') }}
</h2> </h2>
<Button size="icon" :aria-label="$t('g.close')" @click="onCancel"> <Button size="icon" :aria-label="$t('g.close')" @click="onCancel">
<i class="icon-[lucide--x] size-4" /> <i class="icon-[lucide--x] size-4" />
@@ -37,7 +37,7 @@
aria-hidden="true" aria-hidden="true"
/> />
<p class="m-0 text-center text-sm text-muted-foreground"> <p class="m-0 text-center text-sm text-muted-foreground">
{{ $t('openSharedWorkflow.loadError') }} {{ $t('sharing.open.loadError') }}
</p> </p>
</main> </main>
<footer <footer
@@ -56,7 +56,7 @@
{{ workflowName }} {{ workflowName }}
</h2> </h2>
<p class="m-0 text-sm text-muted-foreground"> <p class="m-0 text-sm text-muted-foreground">
{{ $t('openSharedWorkflow.copyDescription') }} {{ $t('sharing.open.copyDescription') }}
</p> </p>
</div> </div>
@@ -77,7 +77,7 @@
<span <span
class="m-0 flex-1 text-left text-sm text-muted-foreground" class="m-0 flex-1 text-left text-sm text-muted-foreground"
> >
{{ $t('openSharedWorkflow.nonPublicAssetsWarningLine1') }} {{ $t('sharing.open.nonPublicAssetsWarningLine1') }}
</span> </span>
<i <i
:class=" :class="
@@ -111,13 +111,13 @@
size="lg" size="lg"
@click="onOpenWithoutImporting(sharedWorkflow)" @click="onOpenWithoutImporting(sharedWorkflow)"
> >
{{ $t('openSharedWorkflow.openWithoutImporting') }} {{ $t('sharing.open.openWithoutImporting') }}
</Button> </Button>
<Button variant="primary" size="lg" @click="onConfirm(sharedWorkflow)"> <Button variant="primary" size="lg" @click="onConfirm(sharedWorkflow)">
{{ {{
hasAssets hasAssets
? $t('openSharedWorkflow.copyAssetsAndOpen') ? $t('sharing.open.copyAssetsAndOpen')
: $t('openSharedWorkflow.openWorkflow') : $t('sharing.open.openWorkflow')
}} }}
</Button> </Button>
</footer> </footer>

View File

@@ -12,12 +12,15 @@ const i18n = createI18n({
locale: 'en', locale: 'en',
messages: { messages: {
en: { en: {
shareWorkflow: { sharing: {
privateAssetsDescription: share: {
'Your workflow contains private models and/or media files', privateAssetsDescription:
mediaLabel: '{count} Media File | {count} Media Files', 'Your workflow contains private models and/or media files',
modelsLabel: '{count} Model | {count} Models', mediaLabel: '{count} Media File | {count} Media Files',
acknowledgeCheckbox: 'I understand these assets...' modelsLabel: '{count} Model | {count} Models',
acknowledgeCheckbox: 'I understand these assets...',
inLibrary: 'In library'
}
} }
} }
} }

View File

@@ -14,7 +14,7 @@
aria-hidden="true" aria-hidden="true"
/> />
<span class="m-0 flex-1 text-left text-sm text-muted-foreground"> <span class="m-0 flex-1 text-left text-sm text-muted-foreground">
{{ $t('shareWorkflow.privateAssetsDescription') }} {{ $t('sharing.share.privateAssetsDescription') }}
</span> </span>
<i <i
@@ -42,7 +42,7 @@
class="size-3.5 shrink-0 cursor-pointer accent-primary-background" class="size-3.5 shrink-0 cursor-pointer accent-primary-background"
/> />
<span class="text-sm text-muted-foreground"> <span class="text-sm text-muted-foreground">
{{ $t('shareWorkflow.acknowledgeCheckbox') }} {{ $t('sharing.share.acknowledgeCheckbox') }}
</span> </span>
</label> </label>
</div> </div>

View File

@@ -3,7 +3,7 @@
<Input <Input
readonly readonly
:model-value="url" :model-value="url"
:aria-label="$t('shareWorkflow.shareUrlLabel')" :aria-label="$t('sharing.share.shareUrlLabel')"
class="flex-1" class="flex-1"
@focus="($event.target as HTMLInputElement).select()" @focus="($event.target as HTMLInputElement).select()"
/> />
@@ -14,7 +14,7 @@
@click="handleCopy" @click="handleCopy"
> >
{{ {{
copied ? $t('shareWorkflow.linkCopied') : $t('shareWorkflow.copyLink') copied ? $t('sharing.share.linkCopied') : $t('sharing.share.copyLink')
}} }}
<i class="icon-[lucide--link] size-3.5" aria-hidden="true" /> <i class="icon-[lucide--link] size-3.5" aria-hidden="true" />
</Button> </Button>

View File

@@ -102,30 +102,32 @@ const i18n = createI18n({
messages: { messages: {
en: { en: {
g: { close: 'Close', error: 'Error' }, g: { close: 'Close', error: 'Error' },
shareWorkflow: { sharing: {
unsavedDescription: 'You must save your workflow before sharing.',
shareLinkTab: 'Share',
publishToHubTab: 'Publish',
workflowNameLabel: 'Workflow name', workflowNameLabel: 'Workflow name',
saving: 'Saving...', share: {
saveButton: 'Save workflow', unsavedDescription: 'You must save your workflow before sharing.',
createLinkButton: 'Create link', shareLinkTab: 'Share',
creatingLink: 'Creating link...', publishToHubTab: 'Publish',
checkingAssets: 'Checking assets...', saving: 'Saving...',
successDescription: 'Anyone with this link...', saveButton: 'Save workflow',
hasChangesDescription: 'You have made changes...', createLinkButton: 'Create link',
updateLinkButton: 'Update link', creatingLink: 'Creating link...',
updatingLink: 'Updating link...', checkingAssets: 'Checking assets...',
publishedOn: 'Published on {date}', successDescription: 'Anyone with this link...',
mediaLabel: '{count} Media File | {count} Media Files', hasChangesDescription: 'You have made changes...',
modelsLabel: '{count} Model | {count} Models', updateLinkButton: 'Update link',
acknowledgeCheckbox: 'I understand these assets...', updatingLink: 'Updating link...',
loadFailed: 'Failed to load publish status' publishedOn: 'Published on {date}',
}, mediaLabel: '{count} Media File | {count} Media Files',
comfyHubProfile: { modelsLabel: '{count} Model | {count} Models',
introTitle: 'Introducing ComfyHub', acknowledgeCheckbox: 'I understand these assets...',
createProfileButton: 'Create my profile', loadFailed: 'Failed to load publish status'
startPublishingButton: 'Start publishing' },
profile: {
introTitle: 'Introducing ComfyHub',
createProfileButton: 'Create my profile',
startPublishingButton: 'Start publishing'
}
} }
} }
} }

View File

@@ -15,7 +15,7 @@
:class="tabButtonClass('shareLink')" :class="tabButtonClass('shareLink')"
@click="handleDialogModeChange('shareLink')" @click="handleDialogModeChange('shareLink')"
> >
{{ $t('shareWorkflow.shareLinkTab') }} {{ $t('sharing.share.shareLinkTab') }}
</Button> </Button>
<Button <Button
id="tab-publish" id="tab-publish"
@@ -25,11 +25,11 @@
@click="handleDialogModeChange('publishToHub')" @click="handleDialogModeChange('publishToHub')"
> >
<i class="icon-[lucide--globe] size-4" aria-hidden="true" /> <i class="icon-[lucide--globe] size-4" aria-hidden="true" />
{{ $t('shareWorkflow.publishToHubTab') }} {{ $t('sharing.share.publishToHubTab') }}
</Button> </Button>
</div> </div>
<div v-else class="select-none"> <div v-else class="select-none">
{{ $t('shareWorkflow.shareLinkTab') }} {{ $t('sharing.share.shareLinkTab') }}
</div> </div>
<Button size="icon" :aria-label="$t('g.close')" @click="onClose"> <Button size="icon" :aria-label="$t('g.close')" @click="onClose">
<i class="icon-[lucide--x] size-4" /> <i class="icon-[lucide--x] size-4" />
@@ -52,11 +52,11 @@
<template v-if="dialogState === 'unsaved'"> <template v-if="dialogState === 'unsaved'">
<p class="m-0 text-sm text-muted-foreground"> <p class="m-0 text-sm text-muted-foreground">
{{ $t('shareWorkflow.unsavedDescription') }} {{ $t('sharing.share.unsavedDescription') }}
</p> </p>
<label v-if="isTemporary" class="flex flex-col gap-1"> <label v-if="isTemporary" class="flex flex-col gap-1">
<span class="text-sm font-medium text-muted-foreground"> <span class="text-sm font-medium text-muted-foreground">
{{ $t('shareWorkflow.workflowNameLabel') }} {{ $t('sharing.workflowNameLabel') }}
</span> </span>
<Input <Input
ref="nameInputRef" ref="nameInputRef"
@@ -73,8 +73,8 @@
> >
{{ {{
isSaving isSaving
? $t('shareWorkflow.saving') ? $t('sharing.share.saving')
: $t('shareWorkflow.saveButton') : $t('sharing.share.saveButton')
}} }}
</Button> </Button>
</template> </template>
@@ -84,13 +84,13 @@
v-if="dialogState === 'stale'" v-if="dialogState === 'stale'"
class="m-0 text-xs text-muted-foreground" class="m-0 text-xs text-muted-foreground"
> >
{{ $t('shareWorkflow.hasChangesDescription') }} {{ $t('sharing.share.hasChangesDescription') }}
</p> </p>
<p <p
v-if="isLoadingAssets" v-if="isLoadingAssets"
class="m-0 text-sm text-muted-foreground italic" class="m-0 text-sm text-muted-foreground italic"
> >
{{ $t('shareWorkflow.checkingAssets') }} {{ $t('sharing.share.checkingAssets') }}
</p> </p>
<ShareAssetWarningBox <ShareAssetWarningBox
v-else-if="requiresAcknowledgment" v-else-if="requiresAcknowledgment"
@@ -118,10 +118,10 @@
v-if="publishResult.publishedAt" v-if="publishResult.publishedAt"
class="m-0 text-xs text-muted-foreground" class="m-0 text-xs text-muted-foreground"
> >
{{ $t('shareWorkflow.publishedOn', { date: formattedDate }) }} {{ $t('sharing.share.publishedOn', { date: formattedDate }) }}
</p> </p>
<p class="m-0 text-xs text-muted-foreground"> <p class="m-0 text-xs text-muted-foreground">
{{ $t('shareWorkflow.successDescription') }} {{ $t('sharing.share.successDescription') }}
</p> </p>
</div> </div>
</template> </template>
@@ -272,12 +272,12 @@ const formattedDate = computed(() => {
const publishButtonLabel = computed(() => { const publishButtonLabel = computed(() => {
if (dialogState.value === 'stale') { if (dialogState.value === 'stale') {
return isPublishing.value return isPublishing.value
? t('shareWorkflow.updatingLink') ? t('sharing.share.updatingLink')
: t('shareWorkflow.updateLinkButton') : t('sharing.share.updateLinkButton')
} }
return isPublishing.value return isPublishing.value
? t('shareWorkflow.creatingLink') ? t('sharing.share.creatingLink')
: t('shareWorkflow.createLinkButton') : t('sharing.share.createLinkButton')
}) })
function stripJsonExtension(filename: string): string { function stripJsonExtension(filename: string): string {
@@ -315,7 +315,7 @@ async function refreshDialogState() {
dialogState.value = 'ready' dialogState.value = 'ready'
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('shareWorkflow.loadFailed') summary: t('sharing.share.loadFailed')
}) })
} }
} }
@@ -351,8 +351,8 @@ const { isLoading: isSaving, execute: handleSave } = useAsyncState(
console.error('Failed to save workflow:', error) console.error('Failed to save workflow:', error)
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('shareWorkflow.saveFailedTitle'), summary: t('sharing.share.saveFailedTitle'),
detail: t('shareWorkflow.saveFailedDescription'), detail: t('sharing.share.saveFailedDescription'),
life: 5000 life: 5000
}) })
} }

View File

@@ -8,20 +8,20 @@
class="flex h-16 items-center justify-between px-6" class="flex h-16 items-center justify-between px-6"
> >
<h2 class="text-base font-normal text-base-foreground"> <h2 class="text-base font-normal text-base-foreground">
{{ $t('comfyHubProfile.createProfileTitle') }} {{ $t('sharing.profile.createProfileTitle') }}
</h2> </h2>
<Button size="icon" :aria-label="$t('g.close')" @click="onClose"> <Button size="icon" :aria-label="$t('g.close')" @click="onClose">
<i class="icon-[lucide--x] size-4" /> <i class="icon-[lucide--x] size-4" />
</Button> </Button>
</header> </header>
<h2 v-else class="px-6 pt-6 text-base font-normal text-base-foreground"> <h2 v-else class="px-6 pt-6 text-base font-normal text-base-foreground">
{{ $t('comfyHubProfile.createProfileTitle') }} {{ $t('sharing.profile.createProfileTitle') }}
</h2> </h2>
<div class="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-6 py-4"> <div class="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-6 py-4">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<label for="profile-picture" class="text-sm text-muted-foreground"> <label for="profile-picture" class="text-sm text-muted-foreground">
{{ $t('comfyHubProfile.chooseProfilePicture') }} {{ $t('sharing.profile.chooseProfilePicture') }}
</label> </label>
<label <label
class="flex size-13 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-linear-to-b from-green-600/50 to-green-900" class="flex size-13 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-linear-to-b from-green-600/50 to-green-900"
@@ -36,7 +36,7 @@
<template v-if="profilePreviewUrl"> <template v-if="profilePreviewUrl">
<img <img
:src="profilePreviewUrl" :src="profilePreviewUrl"
:alt="$t('comfyHubProfile.chooseProfilePicture')" :alt="$t('sharing.profile.chooseProfilePicture')"
class="size-full rounded-full object-cover" class="size-full rounded-full object-cover"
/> />
</template> </template>
@@ -51,18 +51,18 @@
<div class="flex flex-col gap-6"> <div class="flex flex-col gap-6">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<label for="profile-name" class="text-sm text-muted-foreground"> <label for="profile-name" class="text-sm text-muted-foreground">
{{ $t('comfyHubProfile.nameLabel') }} {{ $t('sharing.profile.nameLabel') }}
</label> </label>
<Input <Input
id="profile-name" id="profile-name"
v-model="name" v-model="name"
:placeholder="$t('comfyHubProfile.namePlaceholder')" :placeholder="$t('sharing.profile.namePlaceholder')"
/> />
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<label for="profile-username" class="text-sm text-muted-foreground"> <label for="profile-username" class="text-sm text-muted-foreground">
{{ $t('comfyHubProfile.usernameLabel') }} {{ $t('sharing.profile.usernameLabel') }}
</label> </label>
<div class="relative"> <div class="relative">
<span <span
@@ -84,12 +84,12 @@
for="profile-description" for="profile-description"
class="text-sm text-muted-foreground" class="text-sm text-muted-foreground"
> >
{{ $t('comfyHubProfile.descriptionLabel') }} {{ $t('sharing.profile.descriptionLabel') }}
</label> </label>
<Textarea <Textarea
id="profile-description" id="profile-description"
v-model="description" v-model="description"
:placeholder="$t('comfyHubProfile.descriptionPlaceholder')" :placeholder="$t('sharing.profile.descriptionPlaceholder')"
class="h-24 resize-none rounded-lg border-none bg-secondary-background p-4 text-sm shadow-none" class="h-24 resize-none rounded-lg border-none bg-secondary-background p-4 text-sm shadow-none"
/> />
</div> </div>
@@ -110,8 +110,8 @@
> >
{{ {{
isCreating isCreating
? $t('comfyHubProfile.creatingProfile') ? $t('sharing.profile.creatingProfile')
: $t('comfyHubProfile.createProfile') : $t('sharing.profile.createProfile')
}} }}
</Button> </Button>
</footer> </footer>

View File

@@ -15,10 +15,10 @@
<!-- Content --> <!-- Content -->
<section class="flex flex-col items-center gap-4 px-4 pt-4 pb-6"> <section class="flex flex-col items-center gap-4 px-4 pt-4 pb-6">
<h2 class="m-0 text-base font-semibold text-base-foreground"> <h2 class="m-0 text-base font-semibold text-base-foreground">
{{ $t('comfyHubProfile.introTitle') }} {{ $t('sharing.profile.introTitle') }}
</h2> </h2>
<p class="m-0 text-center text-sm text-muted-foreground"> <p class="m-0 text-center text-sm text-muted-foreground">
{{ $t('comfyHubProfile.introDescription') }} {{ $t('sharing.profile.introDescription') }}
</p> </p>
<Button <Button
variant="primary" variant="primary"
@@ -26,7 +26,7 @@
class="mt-2 w-full" class="mt-2 w-full"
@click="onCreateProfile" @click="onCreateProfile"
> >
{{ $t('comfyHubProfile.startPublishingButton') }} {{ $t('sharing.profile.startPublishingButton') }}
</Button> </Button>
</section> </section>
</div> </div>

View File

@@ -2,22 +2,22 @@
<div class="flex min-h-0 flex-1 flex-col gap-6 px-6 py-4"> <div class="flex min-h-0 flex-1 flex-col gap-6 px-6 py-4">
<label class="flex flex-col gap-2"> <label class="flex flex-col gap-2">
<span class="text-sm text-base-foreground"> <span class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.workflowName') }} {{ $t('sharing.workflowNameLabel') }}
</span> </span>
<Input <Input
:model-value="name" :model-value="name"
:placeholder="$t('comfyHubPublish.workflowNamePlaceholder')" :placeholder="$t('sharing.publish.workflowNamePlaceholder')"
@update:model-value="$emit('update:name', String($event))" @update:model-value="$emit('update:name', String($event))"
/> />
</label> </label>
<label class="flex flex-col gap-2"> <label class="flex flex-col gap-2">
<span class="text-sm text-base-foreground"> <span class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.workflowDescription') }} {{ $t('sharing.publish.workflowDescription') }}
</span> </span>
<Textarea <Textarea
:model-value="description" :model-value="description"
:placeholder="$t('comfyHubPublish.workflowDescriptionPlaceholder')" :placeholder="$t('sharing.publish.workflowDescriptionPlaceholder')"
rows="5" rows="5"
@update:model-value="$emit('update:description', String($event))" @update:model-value="$emit('update:description', String($event))"
/> />
@@ -25,7 +25,7 @@
<label class="flex flex-col gap-2"> <label class="flex flex-col gap-2">
<span class="text-sm text-base-foreground"> <span class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.workflowType') }} {{ $t('sharing.publish.workflowType') }}
</span> </span>
<Select <Select
:model-value="workflowType" :model-value="workflowType"
@@ -35,7 +35,7 @@
> >
<SelectTrigger> <SelectTrigger>
<SelectValue <SelectValue
:placeholder="$t('comfyHubPublish.workflowTypePlaceholder')" :placeholder="$t('sharing.publish.workflowTypePlaceholder')"
/> />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
@@ -52,7 +52,7 @@
<fieldset class="flex flex-col gap-2"> <fieldset class="flex flex-col gap-2">
<legend class="text-sm text-base-foreground"> <legend class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.tagsDescription') }} {{ $t('sharing.publish.tagsDescription') }}
</legend> </legend>
<TagsInput <TagsInput
v-slot="{ isEmpty }" v-slot="{ isEmpty }"
@@ -97,8 +97,8 @@
{{ {{
$t( $t(
showAllSuggestions showAllSuggestions
? 'comfyHubPublish.showLessTags' ? 'sharing.publish.showLessTags'
: 'comfyHubPublish.showMoreTags' : 'sharing.publish.showMoreTags'
) )
}} }}
</Button> </Button>
@@ -146,19 +146,19 @@ const { t } = useI18n()
const workflowTypeOptions = computed(() => [ const workflowTypeOptions = computed(() => [
{ {
value: 'imageGeneration', value: 'imageGeneration',
label: t('comfyHubPublish.workflowTypeImageGeneration') label: t('sharing.publish.workflowTypeImageGeneration')
}, },
{ {
value: 'videoGeneration', value: 'videoGeneration',
label: t('comfyHubPublish.workflowTypeVideoGeneration') label: t('sharing.publish.workflowTypeVideoGeneration')
}, },
{ {
value: 'upscaling', value: 'upscaling',
label: t('comfyHubPublish.workflowTypeUpscaling') label: t('sharing.publish.workflowTypeUpscaling')
}, },
{ {
value: 'editing', value: 'editing',
label: t('comfyHubPublish.workflowTypeEditing') label: t('sharing.publish.workflowTypeEditing')
} }
]) ])

View File

@@ -2,7 +2,7 @@
<div class="flex min-h-0 flex-1 flex-col gap-6"> <div class="flex min-h-0 flex-1 flex-col gap-6">
<p class="text-sm"> <p class="text-sm">
{{ {{
$t('comfyHubPublish.examplesDescription', { $t('sharing.publish.examplesDescription', {
selected: selectedExampleIds.length, selected: selectedExampleIds.length,
total: MAX_EXAMPLES total: MAX_EXAMPLES
}) })
@@ -14,7 +14,7 @@
<label <label
tabindex="0" tabindex="0"
role="button" role="button"
:aria-label="$t('comfyHubPublish.uploadExampleImage')" :aria-label="$t('sharing.publish.uploadExampleImage')"
class="focus-visible:outline-ring flex aspect-square h-25 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border-default text-center transition-colors hover:border-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2" class="focus-visible:outline-ring flex aspect-square h-25 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border-default text-center transition-colors hover:border-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2"
@dragenter.stop @dragenter.stop
@dragleave.stop @dragleave.stop
@@ -36,7 +36,7 @@
aria-hidden="true" aria-hidden="true"
/> />
<span class="sr-only">{{ <span class="sr-only">{{
$t('comfyHubPublish.uploadExampleImage') $t('sharing.publish.uploadExampleImage')
}}</span> }}</span>
</label> </label>
@@ -56,7 +56,7 @@
> >
<img <img
:src="image.url" :src="image.url"
:alt="$t('comfyHubPublish.exampleImage', { index: index + 1 })" :alt="$t('sharing.publish.exampleImage', { index: index + 1 })"
class="size-full object-cover" class="size-full object-cover"
/> />
<div <div

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="flex min-h-0 flex-1 flex-col gap-4 px-6 py-4"> <div class="flex min-h-0 flex-1 flex-col gap-4 px-6 py-4">
<p class="text-sm text-base-foreground"> <p class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.createProfileToPublish') }} {{ $t('sharing.publish.createProfileToPublish') }}
</p> </p>
<Button <Button
@@ -17,7 +17,7 @@
</div> </div>
<span class="inline-flex items-center gap-1 text-sm text-base-foreground"> <span class="inline-flex items-center gap-1 text-sm text-base-foreground">
<i class="icon-[lucide--plus] size-4" /> <i class="icon-[lucide--plus] size-4" />
{{ $t('comfyHubPublish.createProfileCta') }} {{ $t('sharing.publish.createProfileCta') }}
</span> </span>
</Button> </Button>
</div> </div>

View File

@@ -1,13 +1,13 @@
<template> <template>
<BaseModalLayout <BaseModalLayout
:content-title="$t('comfyHubPublish.title')" :content-title="$t('sharing.publish.title')"
content-padding="none" content-padding="none"
left-panel-width="16.5rem" left-panel-width="16.5rem"
size="md" size="md"
> >
<template #leftPanelHeaderTitle> <template #leftPanelHeaderTitle>
<h2 class="flex-1 text-base font-semibold select-none"> <h2 class="flex-1 text-base font-semibold select-none">
{{ $t('comfyHubPublish.title') }} {{ $t('sharing.publish.title') }}
</h2> </h2>
</template> </template>

View File

@@ -2,12 +2,12 @@
<footer class="flex shrink items-center justify-between py-2"> <footer class="flex shrink items-center justify-between py-2">
<div> <div>
<Button v-if="!isFirstStep" size="lg" @click="$emit('back')"> <Button v-if="!isFirstStep" size="lg" @click="$emit('back')">
{{ $t('comfyHubPublish.back') }} {{ $t('sharing.publish.back') }}
</Button> </Button>
</div> </div>
<div class="flex gap-4"> <div class="flex gap-4">
<Button v-if="!isLastStep" size="lg" @click="$emit('next')"> <Button v-if="!isLastStep" size="lg" @click="$emit('next')">
{{ $t('comfyHubPublish.next') }} {{ $t('sharing.publish.next') }}
<i class="icon-[lucide--chevron-right] size-4" /> <i class="icon-[lucide--chevron-right] size-4" />
</Button> </Button>
<Button <Button
@@ -18,7 +18,7 @@
@click="$emit('publish')" @click="$emit('publish')"
> >
<i class="icon-[lucide--upload] size-4" /> <i class="icon-[lucide--upload] size-4" />
{{ $t('comfyHubPublish.publishButton') }} {{ $t('sharing.publish.publishButton') }}
</Button> </Button>
</div> </div>
</footer> </footer>

View File

@@ -54,7 +54,7 @@
class="flex h-10 w-full items-center rounded-lg bg-secondary-background-selected pl-11 select-none" class="flex h-10 w-full items-center rounded-lg bg-secondary-background-selected pl-11 select-none"
> >
<span class="truncate text-sm text-base-foreground"> <span class="truncate text-sm text-base-foreground">
{{ $t('comfyHubProfile.profileCreationNav') }} {{ $t('sharing.profile.profileCreationNav') }}
</span> </span>
</div> </div>
</li> </li>
@@ -89,14 +89,14 @@ const steps = [
{ {
name: 'describe' as const, name: 'describe' as const,
number: 1, number: 1,
label: t('comfyHubPublish.stepDescribe') label: t('sharing.publish.stepDescribe')
}, },
{ {
name: 'examples' as const, name: 'examples' as const,
number: 2, number: 2,
label: t('comfyHubPublish.stepExamples') label: t('sharing.publish.stepExamples')
}, },
{ name: 'finish' as const, number: 3, label: t('comfyHubPublish.stepFinish') } { name: 'finish' as const, number: 3, label: t('sharing.publish.stepFinish') }
] ]
const isProfileCreationFlow = computed(() => currentStep === 'profileCreation') const isProfileCreationFlow = computed(() => currentStep === 'profileCreation')

View File

@@ -2,7 +2,7 @@
<div class="flex min-h-0 flex-1 flex-col gap-6"> <div class="flex min-h-0 flex-1 flex-col gap-6">
<fieldset class="flex flex-col gap-2"> <fieldset class="flex flex-col gap-2">
<legend class="text-sm text-base-foreground"> <legend class="text-sm text-base-foreground">
{{ $t('comfyHubPublish.selectAThumbnail') }} {{ $t('sharing.publish.selectAThumbnail') }}
</legend> </legend>
<ToggleGroup <ToggleGroup
type="single" type="single"
@@ -49,12 +49,12 @@
> >
<img <img
:src="comparisonPreviewUrls.after!" :src="comparisonPreviewUrls.after!"
:alt="$t('comfyHubPublish.uploadComparisonAfterPrompt')" :alt="$t('sharing.publish.uploadComparisonAfterPrompt')"
class="size-full object-contain" class="size-full object-contain"
/> />
<img <img
:src="comparisonPreviewUrls.before!" :src="comparisonPreviewUrls.before!"
:alt="$t('comfyHubPublish.uploadComparisonBeforePrompt')" :alt="$t('sharing.publish.uploadComparisonBeforePrompt')"
class="absolute inset-0 size-full object-contain" class="absolute inset-0 size-full object-contain"
:style="{ :style="{
clipPath: `inset(0 ${100 - previewSliderPosition}% 0 0)` clipPath: `inset(0 ${100 - previewSliderPosition}% 0 0)`
@@ -110,7 +110,7 @@
{{ slot.label }} {{ slot.label }}
</span> </span>
<span class="text-xs text-muted-foreground"> <span class="text-xs text-muted-foreground">
{{ $t('comfyHubPublish.uploadThumbnailHint') }} {{ $t('sharing.publish.uploadThumbnailHint') }}
</span> </span>
</template> </template>
</label> </label>
@@ -149,7 +149,7 @@
<video <video
v-if="isVideoFile" v-if="isVideoFile"
:src="thumbnailPreviewUrl" :src="thumbnailPreviewUrl"
:aria-label="$t('comfyHubPublish.videoPreview')" :aria-label="$t('sharing.publish.videoPreview')"
class="max-h-full max-w-full object-contain" class="max-h-full max-w-full object-contain"
muted muted
loop loop
@@ -158,19 +158,19 @@
<img <img
v-else v-else
:src="thumbnailPreviewUrl" :src="thumbnailPreviewUrl"
:alt="$t('comfyHubPublish.thumbnailPreview')" :alt="$t('sharing.publish.thumbnailPreview')"
class="max-h-full max-w-full object-contain" class="max-h-full max-w-full object-contain"
/> />
</template> </template>
<template v-else> <template v-else>
<span class="text-sm text-muted-foreground"> <span class="text-sm text-muted-foreground">
{{ $t('comfyHubPublish.uploadPromptClickToBrowse') }} {{ $t('sharing.publish.uploadPromptClickToBrowse') }}
</span> </span>
<span class="text-sm text-muted-foreground"> <span class="text-sm text-muted-foreground">
{{ uploadDropText }} {{ uploadDropText }}
</span> </span>
<span class="text-xs text-muted-foreground"> <span class="text-xs text-muted-foreground">
{{ $t('comfyHubPublish.uploadThumbnailHint') }} {{ $t('sharing.publish.uploadThumbnailHint') }}
</span> </span>
</template> </template>
</label> </label>
@@ -223,31 +223,31 @@ function handleThumbnailTypeChange(value: unknown) {
} }
const uploadSectionLabel = computed(() => { const uploadSectionLabel = computed(() => {
if (thumbnailType === 'video') return t('comfyHubPublish.uploadVideo') if (thumbnailType === 'video') return t('sharing.publish.uploadVideo')
if (thumbnailType === 'imageComparison') { if (thumbnailType === 'imageComparison') {
return t('comfyHubPublish.uploadComparison') return t('sharing.publish.uploadComparison')
} }
return t('comfyHubPublish.uploadThumbnail') return t('sharing.publish.uploadThumbnail')
}) })
const uploadDropText = computed(() => const uploadDropText = computed(() =>
thumbnailType === 'video' thumbnailType === 'video'
? t('comfyHubPublish.uploadPromptDropVideo') ? t('sharing.publish.uploadPromptDropVideo')
: t('comfyHubPublish.uploadPromptDropImage') : t('sharing.publish.uploadPromptDropImage')
) )
const thumbnailOptions = [ const thumbnailOptions = [
{ {
value: 'image' as const, value: 'image' as const,
label: t('comfyHubPublish.thumbnailImage') label: t('sharing.publish.thumbnailImage')
}, },
{ {
value: 'video' as const, value: 'video' as const,
label: t('comfyHubPublish.thumbnailVideo') label: t('sharing.publish.thumbnailVideo')
}, },
{ {
value: 'imageComparison' as const, value: 'imageComparison' as const,
label: t('comfyHubPublish.thumbnailImageComparison') label: t('sharing.publish.thumbnailImageComparison')
} }
] ]
@@ -335,11 +335,11 @@ type ComparisonSlot = 'before' | 'after'
const comparisonSlots = [ const comparisonSlots = [
{ {
key: 'before' as const, key: 'before' as const,
label: t('comfyHubPublish.uploadComparisonBeforePrompt') label: t('sharing.publish.uploadComparisonBeforePrompt')
}, },
{ {
key: 'after' as const, key: 'after' as const,
label: t('comfyHubPublish.uploadComparisonAfterPrompt') label: t('sharing.publish.uploadComparisonAfterPrompt')
} }
] ]

View File

@@ -17,12 +17,12 @@ export function useAssetSections(items: () => AssetInfo[]) {
const allSections: AssetSection[] = [ const allSections: AssetSection[] = [
{ {
id: 'media', id: 'media',
labelKey: 'shareWorkflow.mediaLabel', labelKey: 'sharing.share.mediaLabel',
items: media items: media
}, },
{ {
id: 'models', id: 'models',
labelKey: 'shareWorkflow.modelsLabel', labelKey: 'sharing.share.modelsLabel',
items: models items: models
} }
] ]

View File

@@ -62,13 +62,13 @@ vi.mock('vue-i18n', () => ({
useI18n: () => ({ useI18n: () => ({
t: vi.fn((key: string) => { t: vi.fn((key: string) => {
if (key === 'g.error') return 'Error' if (key === 'g.error') return 'Error'
if (key === 'shareWorkflow.loadFailed') { if (key === 'sharing.share.loadFailed') {
return 'Failed to load shared workflow' return 'Failed to load shared workflow'
} }
if (key === 'openSharedWorkflow.dialogTitle') { if (key === 'sharing.open.dialogTitle') {
return 'Open shared workflow' return 'Open shared workflow'
} }
if (key === 'openSharedWorkflow.importFailed') { if (key === 'sharing.open.importFailed') {
return 'Failed to import workflow assets' return 'Failed to import workflow assets'
} }
return key return key

View File

@@ -118,7 +118,7 @@ export function useSharedWorkflowUrlLoader() {
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('g.error'), summary: t('g.error'),
detail: t('shareWorkflow.loadFailed'), detail: t('sharing.share.loadFailed'),
life: 3000 life: 3000
}) })
cleanupUrlParams() cleanupUrlParams()
@@ -135,7 +135,7 @@ export function useSharedWorkflowUrlLoader() {
} }
const { payload } = result const { payload } = result
const workflowName = payload.name || t('openSharedWorkflow.dialogTitle') const workflowName = payload.name || t('sharing.open.dialogTitle')
const nonOwnedAssets = payload.assets.filter((a) => !a.in_library) const nonOwnedAssets = payload.assets.filter((a) => !a.in_library)
try { try {
@@ -148,7 +148,7 @@ export function useSharedWorkflowUrlLoader() {
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('g.error'), summary: t('g.error'),
detail: t('shareWorkflow.loadFailed'), detail: t('sharing.share.loadFailed'),
life: 5000 life: 5000
}) })
return 'failed' return 'failed'
@@ -167,7 +167,7 @@ export function useSharedWorkflowUrlLoader() {
toast.add({ toast.add({
severity: 'error', severity: 'error',
summary: t('g.error'), summary: t('g.error'),
detail: t('openSharedWorkflow.importFailed') detail: t('sharing.open.importFailed')
}) })
cleanupUrlParams() cleanupUrlParams()
clearPreservedQuery(SHARE_NAMESPACE) clearPreservedQuery(SHARE_NAMESPACE)