fix(redis): localize set editor row and column labels

This commit is contained in:
zipg
2026-09-19 09:24:05 +08:00
committed by GitHub
parent f3e5909a20
commit a03d19a76c
13 changed files with 88 additions and 18 deletions
@@ -2977,12 +2977,12 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<Input v-model="collectionSearchQuery" class="h-6 w-full pl-5 pr-2 text-xs" :placeholder="t('redis.searchItems')" @input="onCollectionSearchInput" @keydown="onCollectionSearchKeydown" />
</div>
<span class="flex-1" />
<Input v-model="newValue" class="h-6 w-40 text-xs" placeholder="value" @keydown.enter="listPush" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="listPush"><Plus class="w-3 h-3 mr-1" />Push</Button>
<Input v-model="newValue" class="h-6 w-40 text-xs" :placeholder="t('redis.valuePlaceholder')" @keydown.enter="listPush" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="listPush"><Plus class="w-3 h-3 mr-1" />{{ t("redis.pushAction") }}</Button>
</div>
<div class="grid grid-cols-[60px_1fr_84px] border-b bg-muted/50 shrink-0">
<div class="px-3 py-1 text-xs font-medium text-muted-foreground border-r">#</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground">Value</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground">{{ t("redis.columnValue") }}</div>
<div />
</div>
<RecycleScroller class="flex-1 overflow-y-auto" :items="listRows" :item-size="REDIS_COLLECTION_ROW_HEIGHT" :buffer="600" :skip-hover="true" key-field="id">
@@ -3025,11 +3025,11 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<Input v-model="collectionSearchQuery" class="h-6 w-full pl-5 pr-2 text-xs" :placeholder="t('redis.searchMembers')" @input="onCollectionSearchInput" @keydown="onCollectionSearchKeydown" />
</div>
<span class="flex-1" />
<Input v-model="newValue" class="h-6 w-40 text-xs" placeholder="member" @keydown.enter="setAdd" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="setAdd"><Plus class="w-3 h-3 mr-1" />Add</Button>
<Input v-model="newValue" class="h-6 w-40 text-xs" :placeholder="t('redis.memberPlaceholder')" @keydown.enter="setAdd" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="setAdd"><Plus class="w-3 h-3 mr-1" />{{ t("redis.addAction") }}</Button>
</div>
<div class="grid grid-cols-[1fr_84px] border-b bg-muted/50 shrink-0">
<div class="px-3 py-1 text-xs font-medium text-muted-foreground">Member</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground">{{ t("redis.member") }}</div>
<div />
</div>
<RecycleScroller class="flex-1 overflow-y-auto" :items="setRows" :item-size="REDIS_COLLECTION_ROW_HEIGHT" :buffer="600" :skip-hover="true" key-field="id">
@@ -3076,14 +3076,14 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<Input v-model="collectionSearchQuery" class="h-6 w-full pl-5 pr-2 text-xs" :placeholder="t('redis.searchFields')" @input="onCollectionSearchInput" @keydown="onCollectionSearchKeydown" />
</div>
<span class="flex-1" />
<Input v-model="newField" class="h-6 w-24 text-xs" placeholder="field" />
<Input v-model="newValue" class="h-6 w-32 text-xs" placeholder="value" @keydown.enter="hashSet" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="hashSet"><Plus class="w-3 h-3 mr-1" />Set</Button>
<Input v-model="newField" class="h-6 w-24 text-xs" :placeholder="t('redis.fieldPlaceholder')" />
<Input v-model="newValue" class="h-6 w-32 text-xs" :placeholder="t('redis.valuePlaceholder')" @keydown.enter="hashSet" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="hashSet"><Plus class="w-3 h-3 mr-1" />{{ t("redis.setAction") }}</Button>
</div>
<div class="grid border-b bg-muted/50 shrink-0" :style="hashGridStyle">
<div class="relative border-r text-xs font-medium text-muted-foreground select-none" role="columnheader" :aria-sort="hashSortBy === 'field' ? (hashSortDir === 'asc' ? 'ascending' : 'descending') : 'none'">
<button type="button" class="flex h-full w-full cursor-pointer items-center gap-1 px-3 py-1 text-left hover:bg-accent/50" @click="toggleHashSort('field')">
Field
{{ t("redis.field") }}
<ArrowUp v-if="hashSortBy === 'field' && hashSortDir === 'asc'" class="h-3 w-3 shrink-0" />
<ArrowDown v-else-if="hashSortBy === 'field' && hashSortDir === 'desc'" class="h-3 w-3 shrink-0" />
<ArrowUpDown v-else class="h-3 w-3 shrink-0 text-muted-foreground/40" />
@@ -3091,7 +3091,7 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<div class="absolute -right-1 top-0 h-full w-2 cursor-col-resize touch-none" @pointerdown.stop.prevent="startResizeHashColumns" />
</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground cursor-pointer hover:bg-accent/50 flex items-center gap-1 select-none" role="columnheader" :aria-sort="hashSortBy === 'value' ? (hashSortDir === 'asc' ? 'ascending' : 'descending') : 'none'" @click="toggleHashSort('value')">
Value
{{ t("redis.columnValue") }}
<ArrowUp v-if="hashSortBy === 'value' && hashSortDir === 'asc'" class="h-3 w-3 shrink-0" />
<ArrowDown v-else-if="hashSortBy === 'value' && hashSortDir === 'desc'" class="h-3 w-3 shrink-0" />
<ArrowUpDown v-else class="h-3 w-3 shrink-0 text-muted-foreground/40" />
@@ -3169,21 +3169,21 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<Input v-model="collectionSearchQuery" class="h-6 w-full pl-5 pr-2 text-xs" :placeholder="t('redis.searchMembers')" @input="onCollectionSearchInput" @keydown="onCollectionSearchKeydown" />
</div>
<span class="flex-1" />
<Input v-model="newScore" class="h-6 w-20 text-xs" placeholder="score" />
<Input v-model="newValue" class="h-6 w-32 text-xs" placeholder="member" @keydown.enter="zsetAdd" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="zsetAdd"><Plus class="w-3 h-3 mr-1" />Add</Button>
<Input v-model="newScore" class="h-6 w-20 text-xs" :placeholder="t('redis.scorePlaceholder')" />
<Input v-model="newValue" class="h-6 w-32 text-xs" :placeholder="t('redis.memberPlaceholder')" @keydown.enter="zsetAdd" />
<Button variant="ghost" size="sm" class="h-6 text-xs" @click="zsetAdd"><Plus class="w-3 h-3 mr-1" />{{ t("redis.addAction") }}</Button>
</div>
<div class="grid border-b bg-muted/50 shrink-0" :style="zsetGridStyle">
<div class="px-3 py-1 text-center text-xs font-medium text-muted-foreground border-r" role="columnheader">#</div>
<div class="relative border-r text-xs font-medium text-muted-foreground select-none" role="columnheader" :aria-sort="zsetSortDir === 'asc' ? 'ascending' : 'descending'">
<button type="button" class="flex h-full w-full cursor-pointer items-center gap-1 px-3 py-1 text-left hover:bg-accent/50" @click="toggleZsetSort">
Score
{{ t("redis.createScore") }}
<ArrowUp v-if="zsetSortDir === 'asc'" class="h-3 w-3 shrink-0" />
<ArrowDown v-else class="h-3 w-3 shrink-0" />
</button>
<div class="absolute -right-1 top-0 h-full w-2 cursor-col-resize touch-none" @pointerdown.stop.prevent="startResizeZsetColumns" />
</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground min-w-0">Member</div>
<div class="px-3 py-1 text-xs font-medium text-muted-foreground min-w-0">{{ t("redis.member") }}</div>
<div />
</div>
<RecycleScroller class="flex-1 overflow-y-auto" :items="zsetRows" :item-size="REDIS_COLLECTION_ROW_HEIGHT" :buffer="600" :skip-hover="true" key-field="id">
@@ -3191,11 +3191,11 @@ useUpdateBlocker(() => (hasUnsavedRedisDraft.value || editingTtl.value || saving
<div data-redis-value-row class="dbx-editor-font-family grid border-b text-sm hover:bg-accent/50 group" :class="{ 'bg-accent/60': isEditingZsetRow(row.value) }" :style="{ ...zsetGridStyle, height: `${REDIS_COLLECTION_ROW_HEIGHT}px` }">
<div class="px-3 py-1.5 text-center text-xs text-muted-foreground border-r tabular-nums">{{ row.index + 1 }}</div>
<div class="flex min-w-0 items-center border-r px-3 py-1.5 text-xs text-muted-foreground">
<Input v-if="isEditingZsetRow(row.value)" v-model="zsetInlineScore" aria-label="Score" class="h-6 min-w-0 text-xs tabular-nums" :disabled="savingZsetMember" inputmode="decimal" @keydown.enter.prevent="saveZsetInlineEdit(row.value)" />
<Input v-if="isEditingZsetRow(row.value)" v-model="zsetInlineScore" :aria-label="t('redis.createScore')" class="h-6 min-w-0 text-xs tabular-nums" :disabled="savingZsetMember" inputmode="decimal" @keydown.enter.prevent="saveZsetInlineEdit(row.value)" />
<span v-else class="min-w-0 truncate" :title="String(row.value.score)">{{ row.value.score }}</span>
</div>
<div class="flex min-w-0 items-center px-3 py-1.5">
<Input v-if="isEditingZsetRow(row.value)" v-model="zsetInlineMember" aria-label="Member" class="dbx-editor-font-family h-6 min-w-0 text-sm" :disabled="savingZsetMember" @keydown.enter.prevent="saveZsetInlineEdit(row.value)" />
<Input v-if="isEditingZsetRow(row.value)" v-model="zsetInlineMember" :aria-label="t('redis.member')" class="dbx-editor-font-family h-6 min-w-0 text-sm" :disabled="savingZsetMember" @keydown.enter.prevent="saveZsetInlineEdit(row.value)" />
<span v-else class="min-w-0 truncate" :title="formatValue(row.value.member)">{{ formatValue(row.value.member) }}</span>
</div>
<div class="flex items-center justify-center gap-1">
+7
View File
@@ -5296,6 +5296,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "Dəyişiklik ACL uyğunluq rejimi ilə yadda saxlanıldı; eyni vaxtda edilən bal dəyişikliklərini yoxlamaq mümkün olmadı.",
ttlInvalid: "Saniyə ilə etibarlı TTL daxil edin (müddətsiz üçün -1)",
member: "Üzv",
valuePlaceholder: "dəyər",
memberPlaceholder: "üzv",
fieldPlaceholder: "sahə",
scorePlaceholder: "bal",
pushAction: "Əlavə et",
addAction: "Əlavə et",
setAction: "Təyin et",
memberDetail: "Üzvün təfərrüatları",
viewMember: "Tam dəyərə bax",
copyMember: "Üzvü kopyala",
+7
View File
@@ -5479,6 +5479,13 @@ export default {
zsetAclCompatibilityWarning: "The change was saved using ACL compatibility mode; concurrent score changes could not be checked.",
ttlInvalid: "Enter a valid TTL in seconds (-1 for no expiry)",
member: "Member",
valuePlaceholder: "value",
memberPlaceholder: "member",
fieldPlaceholder: "field",
scorePlaceholder: "score",
pushAction: "Push",
addAction: "Add",
setAction: "Set",
memberDetail: "Member detail",
viewMember: "View full value",
copyMember: "Copy member",
+7
View File
@@ -5170,6 +5170,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "El cambio se guardó en modo de compatibilidad ACL; no se pudieron comprobar cambios simultáneos en la puntuación.",
ttlInvalid: "Ingresa un TTL válido en segundos (-1 para sin caducidad)",
member: "Miembro",
valuePlaceholder: "valor",
memberPlaceholder: "miembro",
fieldPlaceholder: "campo",
scorePlaceholder: "puntuación",
pushAction: "Insertar",
addAction: "Añadir",
setAction: "Establecer",
memberDetail: "Detalle del miembro",
viewMember: "Ver valor completo",
copyMember: "Copiar miembro",
+7
View File
@@ -5168,6 +5168,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "La modifica è stata salvata in modalità compatibilità ACL; non è stato possibile verificare modifiche concorrenti al punteggio.",
ttlInvalid: "Inserisci un TTL valido in secondi (-1 per nessuna scadenza)",
member: "Membro",
valuePlaceholder: "valore",
memberPlaceholder: "membro",
fieldPlaceholder: "campo",
scorePlaceholder: "punteggio",
pushAction: "Inserisci",
addAction: "Aggiungi",
setAction: "Imposta",
memberDetail: "Dettaglio membro",
viewMember: "Visualizza valore completo",
copyMember: "Copia membro",
+7
View File
@@ -5197,6 +5197,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "ACL 互換モードで保存しました。同時に行われたスコア変更は確認できませんでした。",
ttlInvalid: "有効なTTLを秒で入力してください(-1で期限なし)",
member: "メンバー",
valuePlaceholder: "値",
memberPlaceholder: "メンバー",
fieldPlaceholder: "フィールド",
scorePlaceholder: "スコア",
pushAction: "追加",
addAction: "追加",
setAction: "設定",
memberDetail: "メンバー詳細",
viewMember: "完全な値を表示",
copyMember: "メンバーをコピー",
+7
View File
@@ -4809,6 +4809,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "ACL 호환 모드로 저장했습니다. 동시에 변경된 점수는 확인할 수 없습니다.",
ttlInvalid: "초 단위의 올바른 TTL을 입력하세요 (만료 없음은 -1)",
member: "멤버",
valuePlaceholder: "값",
memberPlaceholder: "멤버",
fieldPlaceholder: "필드",
scorePlaceholder: "점수",
pushAction: "추가",
addAction: "추가",
setAction: "설정",
memberDetail: "멤버 상세",
viewMember: "전체 값 보기",
copyMember: "멤버 복사",
+7
View File
@@ -5170,6 +5170,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "A alteração foi salva no modo de compatibilidade ACL; não foi possível verificar alterações simultâneas na pontuação.",
ttlInvalid: "Insira um TTL válido em segundos (-1 para sem expiração)",
member: "Membro",
valuePlaceholder: "valor",
memberPlaceholder: "membro",
fieldPlaceholder: "campo",
scorePlaceholder: "pontuação",
pushAction: "Inserir",
addAction: "Adicionar",
setAction: "Definir",
memberDetail: "Detalhe do membro",
viewMember: "Ver valor completo",
copyMember: "Copiar membro",
+7
View File
@@ -5190,6 +5190,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "Değişiklik ACL uyumluluk modunda kaydedildi; eşzamanlı puan değişiklikleri denetlenemedi.",
ttlInvalid: "Saniye cinsinden geçerli bir TTL girin (sona erme yoksa -1)",
member: "Üye",
valuePlaceholder: "değer",
memberPlaceholder: "üye",
fieldPlaceholder: "alan",
scorePlaceholder: "puan",
pushAction: "Ekle",
addAction: "Ekle",
setAction: "Ayarla",
memberDetail: "Üye ayrıntısı",
viewMember: "Tam değeri görüntüle",
copyMember: "Üyeyi kopyala",
+7
View File
@@ -5454,6 +5454,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "修改已通过 ACL 兼容模式保存,无法校验并发的分数变更。",
ttlInvalid: "请输入有效的 TTL(秒数,-1 表示永不过期)",
member: "成员",
valuePlaceholder: "值",
memberPlaceholder: "成员",
fieldPlaceholder: "字段",
scorePlaceholder: "分值",
pushAction: "推入",
addAction: "添加",
setAction: "设置",
memberDetail: "成员详情",
viewMember: "查看完整内容",
copyMember: "复制成员",
+7
View File
@@ -4494,6 +4494,13 @@ export default withEnglishFallback({
zsetAclCompatibilityWarning: "變更已透過 ACL 相容模式儲存,無法驗證並行的分數變更。",
ttlInvalid: "請輸入有效的 TTL(秒數,-1 表示永不過期)",
member: "成員",
valuePlaceholder: "值",
memberPlaceholder: "成員",
fieldPlaceholder: "欄位",
scorePlaceholder: "分數",
pushAction: "推入",
addAction: "新增",
setAction: "設定",
memberDetail: "成員詳情",
viewMember: "檢視完整內容",
copyMember: "複製成員",
Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB