fix(i18n): a ficha Anti-ban traduz as duas janelas e o disparo diz o que rege

Rotulos sem caixa alta ("Janela de resposta" / "Janela de disparo"),
entradas es e zh-CN para os textos novos, e a ajuda da janela de disparo
deixa de dizer "a resposta fica agendada", que agora e falso. O catalogo
de recursos opcionais nomeia as duas janelas.

Co-authored-by: suporteubere99-coder <267519567+suporteubere99-coder@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
melgarafael
2026-09-30 02:08:14 -03:00
co-authored by suporteubere99-coder Claude Opus 5.5
parent b740def16f
commit 172509f3e1
4 changed files with 33 additions and 23 deletions
+16 -16
View File
@@ -38,8 +38,8 @@ interface FormState {
window_start_hour: string;
window_end_hour: string;
/** Janela da RESPOSTA do agente (0495). '' = herda a janela de disparo. */
reengajar_start_hour: string;
reengajar_end_hour: string;
resposta_start_hour: string;
resposta_end_hour: string;
throttle_s: string;
jitter_s: string;
daily_message_limit: string;
@@ -55,8 +55,8 @@ function fromItem(item: PacingKnobsItem): FormState {
return {
window_start_hour: o?.window_start_hour != null ? String(o.window_start_hour) : "",
window_end_hour: o?.window_end_hour != null ? String(o.window_end_hour) : "",
reengajar_start_hour: o?.reengajar_start_hour != null ? String(o.reengajar_start_hour) : "",
reengajar_end_hour: o?.reengajar_end_hour != null ? String(o.reengajar_end_hour) : "",
resposta_start_hour: o?.resposta_start_hour != null ? String(o.resposta_start_hour) : "",
resposta_end_hour: o?.resposta_end_hour != null ? String(o.resposta_end_hour) : "",
throttle_s: o?.throttle_ms != null ? String(o.throttle_ms / 1000) : "",
jitter_s: o?.jitter_max_ms != null ? String(o.jitter_max_ms / 1000) : "",
daily_message_limit:
@@ -143,8 +143,8 @@ export function AntiBanSheet({ item, canWrite, onClose }: Props) {
channel_session_id: item.channel_session.id,
window_start_hour: intOrNull(form.window_start_hour),
window_end_hour: intOrNull(form.window_end_hour),
reengajar_start_hour: intOrNull(form.reengajar_start_hour),
reengajar_end_hour: intOrNull(form.reengajar_end_hour),
resposta_start_hour: intOrNull(form.resposta_start_hour),
resposta_end_hour: intOrNull(form.resposta_end_hour),
throttle_ms: msOrNull(form.throttle_s),
jitter_max_ms: msOrNull(form.jitter_s),
// `null` quando o Switch está no default: salvar esta ficha por outro
@@ -229,16 +229,16 @@ export function AntiBanSheet({ item, canWrite, onClose }: Props) {
</fieldset>
<fieldset className="flex flex-col gap-2">
<Label>{t("Janela de RESPOSTA (horário local)")}</Label>
<Label>{t("Janela de resposta (horário local)")}</Label>
<div className="flex items-center gap-2">
<Input
type="number"
min={0}
max={23}
inputMode="numeric"
placeholder={String(eff.reengajarStartHour)}
value={form.reengajar_start_hour}
onChange={(e) => set({ reengajar_start_hour: e.target.value })}
placeholder={String(eff.respostaStartHour)}
value={form.resposta_start_hour}
onChange={(e) => set({ resposta_start_hour: e.target.value })}
disabled={!canWrite}
aria-label={t("Hora de início da janela de resposta")}
className="w-20"
@@ -249,9 +249,9 @@ export function AntiBanSheet({ item, canWrite, onClose }: Props) {
min={1}
max={24}
inputMode="numeric"
placeholder={String(eff.reengajarEndHour)}
value={form.reengajar_end_hour}
onChange={(e) => set({ reengajar_end_hour: e.target.value })}
placeholder={String(eff.respostaEndHour)}
value={form.resposta_end_hour}
onChange={(e) => set({ resposta_end_hour: e.target.value })}
disabled={!canWrite}
aria-label={t("Hora de fim da janela de resposta")}
className="w-20"
@@ -260,13 +260,13 @@ export function AntiBanSheet({ item, canWrite, onClose }: Props) {
</div>
<p className="text-xs text-muted-foreground">
{t(
"Quando o cliente escreve, o agente responde nesta janela. Use 0 e 24 para responder a qualquer hora — o limite anti-ban (teto diário e intervalo entre envios) continua valendo.",
"Quando o cliente escreve, o agente responde nesta janela. Em branco, segue a janela de disparo. Use 0 e 24 para responder a qualquer hora — o teto diário e o intervalo entre envios continuam valendo.",
)}
</p>
</fieldset>
<fieldset className="flex flex-col gap-2">
<Label>{t("Janela de DISPARO (horário local)")}</Label>
<Label>{t("Janela de disparo (horário local)")}</Label>
<div className="flex items-center gap-2">
<Input
type="number"
@@ -297,7 +297,7 @@ export function AntiBanSheet({ item, canWrite, onClose }: Props) {
</div>
<p className="text-xs text-muted-foreground">
{t(
"O assistente só envia mensagens dentro desta janela. Fora dela, a resposta fica agendada para a próxima abertura — você vê o motivo na conversa.",
"Disparos em massa, prospecção e mensagens que retomam conversa parada só saem nesta janela. Fora dela, o envio fica agendado para a próxima abertura — você vê o motivo na conversa.",
)}
</p>
</fieldset>
+10 -4
View File
@@ -5233,12 +5233,18 @@ export const DICIONARIO: Traducoes = {
"dia(s) de uso. Enquanto esse número for menor que o teto diário, é ELE que limita, e mexer no teto diário não muda nada.": {
es: "día(s) de uso. Mientras ese número sea menor que el tope diario, es ÉL quien limita, y cambiar el tope diario no cambia nada.",
},
"Janela de envio (horário local)": { es: "Ventana de envío (horario local)" },
"Janela de resposta (horário local)": { es: "Ventana de respuesta (horario local)" },
"Janela de disparo (horário local)": { es: "Ventana de envíos proactivos (horario local)" },
"Hora de início da janela de resposta": { es: "Hora de inicio de la ventana de respuesta" },
"Hora de fim da janela de resposta": { es: "Hora de fin de la ventana de respuesta" },
"Hora de início da janela": { es: "Hora de inicio de la ventana" },
"h até": { es: "h hasta" },
"Hora de fim da janela": { es: "Hora de fin de la ventana" },
"O assistente só envia mensagens dentro desta janela. Fora dela, a resposta fica agendada para a próxima abertura — você vê o motivo na conversa.": {
es: "El asistente solo envía mensajes dentro de esta ventana. Fuera de ella, la respuesta queda programada para cuando se abra de nuevo, y el motivo aparece en la conversación.",
"Quando o cliente escreve, o agente responde nesta janela. Em branco, segue a janela de disparo. Use 0 e 24 para responder a qualquer hora — o teto diário e o intervalo entre envios continuam valendo.": {
es: "Cuando el cliente escribe, el agente responde dentro de esta ventana. En blanco, sigue la ventana de envíos proactivos. Usa 0 y 24 para responder a cualquier hora: el tope diario y el intervalo entre envíos siguen valiendo.",
},
"Disparos em massa, prospecção e mensagens que retomam conversa parada só saem nesta janela. Fora dela, o envio fica agendado para a próxima abertura — você vê o motivo na conversa.": {
es: "Los envíos masivos, la prospección y los mensajes que retoman una conversación detenida solo salen dentro de esta ventana. Fuera de ella, el envío queda programado para cuando se abra de nuevo, y el motivo aparece en la conversación.",
},
"Enviar aos domingos": { es: "Enviar los domingos" },
"Ligado por padrão: quem escreve no domingo espera resposta no domingo. Desligue se você faz prospecção ativa e prefere não incomodar no fim de semana.": {
@@ -13429,7 +13435,7 @@ export const DICIONARIO: Traducoes = {
"Acesso da IA por número": { es: "Acceso de la IA por número" },
"Em cada número, a IA atende todo mundo, só números de teste, ninguém, ou só quem veio de uma origem.": { es: "En cada número, la IA atiende a todos, solo a números de prueba, a nadie, o solo a quien vino de un origen." },
"Proteção de envio por número": { es: "Protección de envío por número" },
"Janela, ritmo, teto diário, envio aos domingos e aquecimento de cada número.": { es: "Horario, ritmo, tope diario, envío los domingos y calentamiento de cada número." },
"Janelas de resposta e de disparo, ritmo, teto diário, envio aos domingos e aquecimento de cada número.": { es: "Horarios de respuesta y de envíos proactivos, ritmo, tope diario, envío los domingos y calentamiento de cada número." },
"Grupos na caixa de entrada": { es: "Grupos en la bandeja de entrada" },
"Em cada número, escolhe quais grupos do WhatsApp aparecem nas conversas.": { es: "En cada número, elige qué grupos de WhatsApp aparecen en las conversaciones." },
"Verificação em duas etapas obrigatória": { es: "Verificación en dos pasos obligatoria" },
+6 -2
View File
@@ -2213,11 +2213,15 @@
"Hoje o aquecimento libera": "今天预热可释放",
"envio(s) — o número tem": "次发送——该号码有",
"dia(s) de uso. Enquanto esse número for menor que o teto diário, é ELE que limita, e mexer no teto diário não muda nada.": "使用天数。只要这个数字小于每日上限,起限制作用的就是它,调整每日上限没有任何作用。",
"Janela de envio (horário local)": "发送时间窗口(本地时间)",
"Janela de resposta (horário local)": "回复时间窗口(本地时间)",
"Janela de disparo (horário local)": "主动发送时间窗口(本地时间)",
"Hora de início da janela de resposta": "回复窗口开始时间",
"Hora de fim da janela de resposta": "回复窗口结束时间",
"Hora de início da janela": "窗口开始时间",
"h até": "时 至",
"Hora de fim da janela": "窗口结束时间",
"O assistente só envia mensagens dentro desta janela. Fora dela, a resposta fica agendada para a próxima abertura — você vê o motivo na conversa.": "助手仅在此时间窗口内发送消息。窗口外,回复会安排到下次窗口开启时发送——你可以在会话中看到原因。",
"Quando o cliente escreve, o agente responde nesta janela. Em branco, segue a janela de disparo. Use 0 e 24 para responder a qualquer hora — o teto diário e o intervalo entre envios continuam valendo.": "客户发来消息时,智能体在此时间窗口内回复。留空则沿用主动发送窗口。填 0 和 24 表示任何时间都回复——每日上限和发送间隔仍然有效。",
"Disparos em massa, prospecção e mensagens que retomam conversa parada só saem nesta janela. Fora dela, o envio fica agendado para a próxima abertura — você vê o motivo na conversa.": "群发、拓客以及重新激活停滞会话的消息只在此窗口内发出。窗口外,发送会安排到下次窗口开启时——你可以在会话中看到原因。",
"Enviar aos domingos": "周日发送",
"Ligado por padrão: quem escreve no domingo espera resposta no domingo. Desligue se você faz prospecção ativa e prefere não incomodar no fim de semana.": "默认开启:周日发消息的人期望周日收到回复。如果你做主动拓客且不想在周末打扰对方,请关闭。",
"Ritmo entre envios (segundos)": "发送间隔节奏(秒)",
+1 -1
View File
@@ -444,7 +444,7 @@ const DA_EMPRESA: RecursoOpcional[] = [
{
id: "protecao_de_envio",
nome: "Proteção de envio por número",
oQueFaz: "Janela, ritmo, teto diário, envio aos domingos e aquecimento de cada número.",
oQueFaz: "Janelas de resposta e de disparo, ritmo, teto diário, envio aos domingos e aquecimento de cada número.",
nivel: "organizacao",
padrao: "varia",
quemDecide: "admin",