Executar traduções em lote com WP-CLI
Você pode executar traduções em lote com WP-CLI usando scripts bash. Isso permite que você rode as traduções em segundo plano enquanto trabalha em outra coisa.
Para isso, crie dois scripts bash:
- Um script principal que contém a lógica para processá-los em lotes (nunca muda)
- Um arquivo de configuração que define quais itens traduzir (a ser atualizado a cada execução de tradução)
Script principal
Crie um arquivo chamado gatotranslate.sh (baixar exemplo) que contém a lógica para processar as traduções:
Você pode personalizar os parâmetros passados ao comando gatotranslate (ex.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, etc.).
#!/bin/bash
# ------------------------------------------------------------------------------------------------
# Load configuration
# ------------------------------------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/gatotranslate.config.sh"
# ------------------------------------------------------------------------------------------------
# Arguments
# ------------------------------------------------------------------------------------------------
# (Optional) Provide the start batch number as an argument, default is 1
start_batch=${1:-1}
# ------------------------------------------------------------------------------------------------
# Logic
# ------------------------------------------------------------------------------------------------
batch_size=${batch_size:-1} # If not provided, default to 1
total_items=${#items[@]}
total_batches=$(((total_items + batch_size - 1) / batch_size))
start_batch_index=$(((start_batch - 1) * batch_size))
echo "----------------------------------------"
echo "Translating $subcommand items"
echo "----------------------------------------"
echo "Batch size: $batch_size"
echo "Total items: $total_items"
echo "Total batches: $total_batches"
echo "Starting from batch number: $start_batch"
echo "----------------------------------------"
for ((start=start_batch_index; start<total_items; start+=batch_size)); do
# Get the next batch of items
batch=("${items[@]:$start:$batch_size}")
echo "Processing batch #$((start/batch_size + 1))"
# Pass all items in the batch as separate arguments
cmd=$(printf 'wp gatotranslate %s "%s" --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")
echo "Command: $cmd"
eval $cmd
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo -e "\a\a\a\a\a"
exit 1
fi
done
# Finished successfully
echo -e "\a"
echo "----------------------------------------"
echo "Finished successfully 👏"
echo "----------------------------------------"Arquivo de configuração
Crie um arquivo chamado gatotranslate.config.sh (baixar exemplo) que contém a configuração da sua tradução em lote:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Este arquivo deve conter as seguintes variáveis:
| Variável | Descrição |
|---|---|
user | Nome de usuário do WordPress para executar o comando (geralmente admin) |
subcommand | Subcomando WP-CLI gatotranslate a executar (post, media, term ou menu) |
batch_size | Número de itens a traduzir em cada lote (padrão é 1) |
items | Array de IDs dos itens a traduzir (posts, tags, categorias, mídias, menus, etc.) |
Executar o script
Execute a partir do diretório raiz do WordPress, onde o comando wp está disponível.
Para rodar a tradução em lote, execute:
bash +x gatotranslate.shO script executará o comando gatotranslate para todos os itens, em lotes do tamanho especificado, exibindo informações de progresso para cada lote.

Quando o script termina com sucesso, ele emite um único bipe sonoro.
Interromper a execução em caso de erro
Para que o script pare automaticamente sempre que um erro ou aviso for adicionado aos logs, adicione o parâmetro --fail-if-log-notifications ao comando em gatotranslate.sh:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")A severidade das notificações de log que acionam a parada do script é aquela configurada na página Settings > Plugin Configuration > Logs & Notifications.

Quando o script para devido a uma notificação de log, ele emite uma sequência prolongada de bipes sonoros.

Após corrigir o problema, você pode retomar a tradução a partir do ponto onde ela falhou passando o número do lote como argumento.
Dessa forma, você evita reprocessar itens que já foram traduzidos com sucesso, economizando tempo e créditos de API.
Por exemplo, se a falha ocorreu no lote 2, após corrigir o problema, execute:
bash +x gatotranslate.sh 2Avançado: recuperar os IDs dos itens a traduzir
Ao configurar a tradução em lote, você precisa conhecer os IDs dos itens a traduzir.
Como o plugin executa o Gato GraphQL nos bastidores, podemos convenientemente executar uma query GraphQL para recuperar essa informação.
Para executar queries GraphQL, você deve primeiro habilitar o Advanced Mode e acessar o CPT Queries. Consulte Criando queries auxiliares para instruções sobre como habilitar o Advanced Mode.
Adicione uma nova entrada em Queries, com o título Retrieve item IDs, e a seguinte query GraphQL:
query RetrieveIDsForCustomPosts {
customPosts(
filter: {
#########################################################
### Configure which CPTs to retrieve ###
customPostTypes: [ "post", "page" ],
#########################################################
polylangLanguagesBy: { predefined: DEFAULT }
},
pagination: { limit: -1 },
sort: { by: DATE, order: DESC }
) @export(as: "ids") {
id
title
customPostType
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForCategories {
categories(
#########################################################
### Configure which taxonomy to retrieve ###
taxonomy: "category",
#########################################################
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
taxonomy
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForTags {
tags(
#########################################################
### Configure which taxonomy to retrieve ###
taxonomy: "post_tag",
#########################################################
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
taxonomy
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForMedia {
mediaItems(
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: DATE, order: DESC }
) @export(as: "ids") {
id
title
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
#################################################################################################
# Watch out: This will bring all menus, not just the ones in the origin language.
# Translated menus are those with a location containing the "___" string,
# e.g.: "header___es", "footer___fr", etc.
#################################################################################################
query RetrieveIDsForMenus {
menus(
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
locations
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
Dependendo das entidades que você deseja traduzir, será necessário configurar e executar a operação correspondente na query.
Por exemplo, para recuperar os IDs das categorias de posts, você precisará executar a operação RetrieveIDsForCategories, passando a taxonomia category como argumento:

Da resposta JSON, os IDs dos itens a traduzir são exibidos na entrada data.compiledData.ids (destacada na imagem). Copie essa string e armazene-a no array items do arquivo de configuração.