Tutorials
TutorialsVertalingen in batch uitvoeren met WP-CLI

Vertalingen in batch uitvoeren met WP-CLI

Je kunt vertalingen in batch uitvoeren met WP-CLI, via bash-scripts. Zo kun je de vertalingen op de achtergrond laten draaien terwijl je aan iets anders werkt.

Maak daarvoor twee bash-scripts aan:

  1. Een hoofdscript dat de logica bevat om ze in batches te verwerken (dit verandert nooit)
  2. Een configuratiebestand dat aangeeft welke items vertaald moeten worden (wordt bijgewerkt bij elke vertaalrun)

Hoofdscript

Maak een bestand aan met de naam gatotranslate.sh (download voorbeeld) dat de logica bevat voor het verwerken van de vertalingen:

Je kunt de parameters aanpassen die worden doorgegeven aan het commando gatotranslate (bijv.: --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 "----------------------------------------"

Configuratiebestand

Maak een bestand aan met de naam gatotranslate.config.sh (download voorbeeld) dat de configuratie voor je batchvertaling bevat:

user="admin"
subcommand="post"
batch_size=1
items=(
    4118
    4117
    4116
    3739
)

Dit bestand moet de volgende variabelen bevatten:

VariabeleBeschrijving
userWordPress-gebruikersnaam om het commando uit te voeren (meestal admin)
subcommandWP-CLI-subcommando gatotranslate om uit te voeren (post, media, term of menu)
batch_sizeAantal items dat per batch vertaald wordt (standaard 1)
itemsArray van ID's van de te vertalen items (berichten, tags, categorieën, media, menu's, etc.)

Het script uitvoeren

Voer dit uit vanuit de WordPress-hoofdmap, waar het commando wp beschikbaar is.

Om de batchvertaling te starten, voer je uit:

bash +x gatotranslate.sh

Het script voert het commando gatotranslate uit voor alle items, in batches van de opgegeven grootte, en toont voortgangsinformatie voor elke batch.

Het script 'gatotranslate.sh' uitvoeren
Het script 'gatotranslate.sh' uitvoeren

Wanneer het script succesvol is afgerond, geeft het een enkelvoudig piepsignaal.

Uitvoering stoppen bij een fout

Om het script automatisch te laten stoppen wanneer er een fout of waarschuwing aan de logs wordt toegevoegd, voeg je de parameter --fail-if-log-notifications toe aan het commando in gatotranslate.sh:

cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")

De ernst van de logmeldingen die het stoppen van het script activeren, worden geconfigureerd op de pagina Settings > Plugin Configuration > Logs & Notifications.

Logmeldingen ingeschakeld op basis van ernst
Logmeldingen ingeschakeld op basis van ernst

Wanneer het script stopt vanwege een logmelding, geeft het een uitgebreide reeks piepsignalen.

Het script 'gatotranslate.sh' uitvoeren met de parameter '--fail-if-log-notifications'
Het script 'gatotranslate.sh' uitvoeren met de parameter '--fail-if-log-notifications'

Na het oplossen van het probleem kun je de vertaling hervatten vanaf het punt waarop de fout optrad door het batchnummer als argument mee te geven.

Op die manier voorkom je dat items die al succesvol zijn vertaald opnieuw worden verwerkt, wat zowel tijd als API-credits bespaart.

Als de fout bijvoorbeeld optrad bij batch 2, voer je na het oplossen van het probleem het volgende uit:

bash +x gatotranslate.sh 2

Geavanceerd: de ID's ophalen van de te vertalen items

Bij het configureren van de batchvertaling moet je de ID's kennen van de items die vertaald moeten worden.

Omdat de plugin Gato GraphQL onder de motorkap gebruikt, kunnen we gemakkelijk een GraphQL-query uitvoeren om deze informatie op te halen.

Om GraphQL-queries uit te voeren, moet je eerst de Advanced Mode inschakelen en de Queries CPT openen. Zie Hulpqueries aanmaken voor instructies over hoe je Advanced Mode inschakelt.

Voeg een nieuw Queries-item toe met de titel Retrieve item IDs en de volgende GraphQL-query:

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: " " )
  }
}
De query 'Retrieve item IDs' aanmaken
De query 'Retrieve item IDs' aanmaken

Afhankelijk van welke entiteiten je wilt vertalen, moet je de bijbehorende operatie in de query configureren en uitvoeren.

Om bijvoorbeeld de ID's van berichtcategorieën op te halen, moet je de operatie RetrieveIDsForCategories uitvoeren en de taxonomie category als argument meegeven:

De query 'Retrieve item IDs' uitvoeren
De query 'Retrieve item IDs' uitvoeren

Uit het JSON-antwoord worden de ID's van de te vertalen items weergegeven in het item data.compiledData.ids (gemarkeerd in de afbeelding). Kopieer die string en sla deze op in de array items in het configuratiebestand.