Tutoriais
TutoriaisExecutar traduções em lote com WP-CLI

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:

  1. Um script principal que contém a lógica para processá-los em lotes (nunca muda)
  2. 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ávelDescrição
userNome de usuário do WordPress para executar o comando (geralmente admin)
subcommandSubcomando WP-CLI gatotranslate a executar (post, media, term ou menu)
batch_sizeNúmero de itens a traduzir em cada lote (padrão é 1)
itemsArray 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.sh

O script executará o comando gatotranslate para todos os itens, em lotes do tamanho especificado, exibindo informações de progresso para cada lote.

Executando o script 'gatotranslate.sh'
Executando o script 'gatotranslate.sh'

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.

Notificações de log habilitadas por severidade
Notificações de log habilitadas por severidade

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

Executando o script 'gatotranslate.sh' com o parâmetro '--fail-if-log-notifications'
Executando o script 'gatotranslate.sh' com o parâmetro '--fail-if-log-notifications'

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 2

Avanç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: " " )
  }
}
Criando a query 'Retrieve item IDs'
Criando a query 'Retrieve item IDs'

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:

Executando a query 'Retrieve item IDs'
Executando a query 'Retrieve item IDs'

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.