refactor: move ellipsis and punctuation into i18n translation strings (#8573)

## Summary

Move ellipsis and punctuation characters into i18n translation strings
for proper internationalization support.

## Changes

- Add 12 new translation keys with punctuation included:
- Placeholder keys with trailing ellipsis (e.g.,
`searchNodesPlaceholder: "Search Nodes..."`)
  - `downloadWithSize` with interpolation: `"Download ({size})"`
  - `completedWithCheckmark`: `"Completed ✓"`
- Prompt keys with colons (e.g., `enterNewNamePrompt: "Enter new
name:"`)
- Update 20 files to use new translation keys instead of string
concatenation

## Review Focus

This eliminates string concatenation patterns like `$t('key') + '...'`
that break proper internationalization, since different languages may
use different punctuation or may not need ellipsis/colons in the same
contexts.

Fixes #7333


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Standardized localization across the app: unified search placeholders
and input hints; updated dialog prompt texts for renaming,
saving/exporting, and related prompts.
* **New Features**
  * Download buttons now show file size via localized text.
  * Completed status displays a localized label with a checkmark.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8573-refactor-move-ellipsis-and-punctuation-into-i18n-translation-strings-2fc6d73d365081828ad3f257bcac7799)
by [Unito](https://www.unito.io)
This commit is contained in:
Christian Byrne
2026-02-03 15:50:18 -08:00
committed by GitHub
parent 4b43eb5fff
commit 278d491030
23 changed files with 47 additions and 24 deletions

View File

@@ -22,7 +22,7 @@
@click="triggerDownload"
>
<i class="pi pi-download" />
{{ $t('g.download') + ' (' + fileSize + ')' }}
{{ $t('g.downloadWithSize', { size: fileSize }) }}
</Button>
<Button
v-if="(status === null || status === 'error') && !!props.url"

View File

@@ -27,7 +27,7 @@
:title="props.url"
@click="download.triggerBrowserDownload"
>
{{ $t('g.download') + ' (' + fileSize + ')' }}
{{ $t('g.downloadWithSize', { size: fileSize }) }}
</Button>
</div>
<div>

View File

@@ -3,7 +3,9 @@
<template #header>
<SearchBox
v-model="filters['global'].value"
:placeholder="$t('g.searchKeybindings') + '...'"
:placeholder="
$t('g.searchPlaceholder', { subject: $t('g.keybindings') })
"
/>
</template>

View File

@@ -46,7 +46,7 @@ const isFavorited = computed(() =>
async function handleRename() {
const newLabel = await dialogService.prompt({
title: t('g.rename'),
message: t('g.enterNewName') + ':',
message: t('g.enterNewNamePrompt'),
defaultValue: widget.label,
placeholder: widget.name
})

View File

@@ -118,7 +118,9 @@ const suggestions = ref<ComfyNodeDefImpl[]>([])
const hoveredSuggestion = ref<ComfyNodeDefImpl | null>(null)
const currentQuery = ref('')
const placeholder = computed(() => {
return filters.length === 0 ? t('g.searchNodes') + '...' : ''
return filters.length === 0
? t('g.searchPlaceholder', { subject: t('g.nodes') })
: ''
})
const nodeDefStore = useNodeDefStore()

View File

@@ -25,7 +25,11 @@
<SearchBox
ref="searchBoxRef"
v-model:model-value="searchQuery"
:placeholder="$t('g.searchModels') + '...'"
:placeholder="
$t('g.searchPlaceholder', {
subject: $t('sideToolbar.labels.models')
})
"
@search="handleSearch"
/>
</div>

View File

@@ -91,7 +91,7 @@
v-model:model-value="searchQuery"
data-testid="node-library-search"
class="node-lib-search-box"
:placeholder="$t('g.searchNodes') + '...'"
:placeholder="$t('g.searchPlaceholder', { subject: $t('g.nodes') })"
filter-icon="pi pi-filter"
:filters
@search="handleSearch"

View File

@@ -22,7 +22,9 @@
ref="searchBoxRef"
v-model:model-value="searchQuery"
class="workflows-search-box"
:placeholder="$t('g.searchWorkflows') + '...'"
:placeholder="
$t('g.searchPlaceholder', { subject: $t('g.workflow') })
"
@search="handleSearch"
/>
</div>