feat(translation): re-translate on model change — artist-scoped + global re-run (#146)
retranslate_posts resets the 5 translation columns to NULL for a scoped set of posts (all, or WHERE artist_id IN ids) then reuses the untranslated sweep to re-run them, chasing the tail until drained (run-until-done). Interpreter cache keys on engine_version so a changed model re-translates, an unchanged one is cache-fast. Reset only happens when the service is configured+healthy so translations are never wiped when they can't be rebuilt. New POST /settings/translation/retranslate (artist_id | all=true). UI: per-artist 'Re-translate posts' on the Artist Management tab + 'Re-translate all' in the Settings Translation card, both with confirm dialogs. No migration (reuses m143 columns). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -47,16 +47,49 @@
|
||||
prepend-icon="mdi-translate" :loading="running"
|
||||
:disabled="!enabled || !baseUrl" @click="onRun"
|
||||
>Translate now</v-btn>
|
||||
<v-btn
|
||||
size="small" variant="tonal" rounded="pill"
|
||||
prepend-icon="mdi-refresh" :loading="retranslating"
|
||||
:disabled="!enabled || !baseUrl" @click="confirmAll = true"
|
||||
>Re-translate all</v-btn>
|
||||
<span v-if="status" class="fc-muted text-caption">
|
||||
{{ status.untranslated_count }}
|
||||
post{{ status.untranslated_count === 1 ? '' : 's' }} awaiting translation
|
||||
</span>
|
||||
</div>
|
||||
<p class="fc-muted text-caption mt-2 mb-0">
|
||||
Use <strong>Re-translate all</strong> after switching the Interpreter model —
|
||||
it clears every stored translation and re-runs it through the new model
|
||||
(unchanged text is served from cache, so it's cheap). To refresh just one
|
||||
artist, use the Re-translate button on that artist's page.
|
||||
</p>
|
||||
|
||||
<v-alert
|
||||
v-if="err" type="error" variant="tonal" density="compact"
|
||||
class="mt-3" closable @click:close="err = null"
|
||||
>{{ err }}</v-alert>
|
||||
|
||||
<!-- m146: re-translate-everything is a bigger hammer than 'Translate now'
|
||||
(it clears + rebuilds all translations), so it asks first. -->
|
||||
<v-dialog v-model="confirmAll" max-width="440">
|
||||
<v-card>
|
||||
<v-card-title>Re-translate everything?</v-card-title>
|
||||
<v-card-text class="text-body-2">
|
||||
This clears the stored translation for <strong>every</strong> post and
|
||||
re-runs them through your current Interpreter model. Text that hasn't
|
||||
changed comes back from the cache instantly; anything the new model
|
||||
translates differently is refreshed. It runs in the background until
|
||||
done.
|
||||
</v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer />
|
||||
<v-btn variant="text" @click="confirmAll = false">Cancel</v-btn>
|
||||
<v-btn
|
||||
color="accent" :loading="retranslating" @click="onRetranslateAll"
|
||||
>Re-translate all</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</MaintenanceTile>
|
||||
</template>
|
||||
|
||||
@@ -75,6 +108,8 @@ const baseUrl = ref('')
|
||||
const targetLang = ref('en')
|
||||
const busy = ref(false)
|
||||
const running = ref(false)
|
||||
const retranslating = ref(false)
|
||||
const confirmAll = ref(false)
|
||||
const testing = ref(false)
|
||||
const testResult = ref(null) // null = not tested this session; true/false = last result
|
||||
const status = ref(null)
|
||||
@@ -159,4 +194,18 @@ async function onRun() {
|
||||
setTimeout(loadStatus, 1500) // let the sweep make a dent, then refresh
|
||||
}
|
||||
}
|
||||
async function onRetranslateAll() {
|
||||
retranslating.value = true
|
||||
err.value = null
|
||||
try {
|
||||
await api.post('/api/settings/translation/retranslate', { body: { all: true } })
|
||||
confirmAll.value = false
|
||||
toast({ text: 'Re-translating all posts…', type: 'success' })
|
||||
} catch (e) {
|
||||
err.value = e.message
|
||||
} finally {
|
||||
retranslating.value = false
|
||||
setTimeout(loadStatus, 1500) // reset spikes the untranslated count — refresh it
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user