Tutoriels
TutorielsExécuter des traductions par lots avec WP-CLI

Exécuter des traductions par lots avec WP-CLI

Vous pouvez exécuter des traductions par lots avec WP-CLI en utilisant des scripts bash. Cela vous permet de lancer les traductions en arrière-plan pendant que vous travaillez sur autre chose.

Pour ce faire, créez deux scripts bash :

  1. Un script principal qui contient la logique pour les traiter par lots (il ne change jamais)
  2. Un fichier de configuration qui définit les éléments à traduire (à mettre à jour à chaque exécution de traduction)

Script principal

Créez un fichier nommé gatotranslate.sh (télécharger l'exemple) qui contient la logique pour traiter les traductions :

Vous pouvez personnaliser les paramètres passés à la commande 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 "----------------------------------------"

Fichier de configuration

Créez un fichier nommé gatotranslate.config.sh (télécharger l'exemple) qui contient la configuration de votre traduction par lots :

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

Ce fichier doit contenir les variables suivantes :

VariableDescription
userNom d'utilisateur WordPress pour exécuter la commande (généralement admin)
subcommandSous-commande WP-CLI gatotranslate à exécuter (post, media, term ou menu)
batch_sizeNombre d'éléments à traduire dans chaque lot (par défaut 1)
itemsTableau d'IDs des éléments à traduire (articles, étiquettes, catégories, médias, menus, etc.)

Exécuter le script

Exécutez depuis le répertoire racine de WordPress, où la commande wp est disponible.

Pour lancer la traduction par lots, exécutez :

bash +x gatotranslate.sh

Le script exécutera la commande gatotranslate pour tous les éléments, par lots de la taille spécifiée, en affichant les informations de progression pour chaque lot.

Exécution du script 'gatotranslate.sh'
Exécution du script 'gatotranslate.sh'

Lorsque le script se termine avec succès, il émet un seul bip sonore.

Arrêter l'exécution en cas d'erreur

Pour que le script s'arrête automatiquement chaque fois qu'une erreur ou un avertissement est ajouté aux logs, ajoutez le paramètre --fail-if-log-notifications à la commande dans gatotranslate.sh :

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

La sévérité des notifications de log qui déclenchent l'arrêt du script est celle configurée dans la page Settings > Plugin Configuration > Logs & Notifications.

Notifications de log activées par sévérité
Notifications de log activées par sévérité

Lorsque le script s'arrête en raison d'une notification de log, il émet une séquence de bips prolongée.

Exécution du script 'gatotranslate.sh' avec le paramètre '--fail-if-log-notifications'
Exécution du script 'gatotranslate.sh' avec le paramètre '--fail-if-log-notifications'

Après avoir corrigé le problème, vous pouvez reprendre la traduction à partir du point où elle a échoué en passant le numéro de lot comme argument.

De cette façon, vous pouvez éviter de retraiter des éléments déjà traduits avec succès, en économisant à la fois du temps et des crédits d'API.

Par exemple, si l'échec s'est produit au lot 2, après avoir corrigé le problème, exécutez :

bash +x gatotranslate.sh 2

Avancé : Récupérer les IDs des éléments à traduire

Lors de la configuration de la traduction par lots, vous devez connaître les IDs des éléments à traduire.

Puisque le plugin exécute Gato GraphQL en coulisses, nous pouvons exécuter commodément une requête GraphQL pour récupérer cette information.

Pour exécuter des queries GraphQL, vous devez d'abord activer le Advanced Mode et accéder au CPT Queries. Consultez Créer des queries d'assistance pour les instructions sur la façon d'activer le Advanced Mode.

Ajoutez une nouvelle entrée Queries, avec le titre Retrieve item IDs, et la requête GraphQL suivante :

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: " " )
  }
}
Création de la query 'Retrieve item IDs'
Création de la query 'Retrieve item IDs'

Selon les entités que vous souhaitez traduire, vous devrez configurer et exécuter l'opération correspondante dans la query.

Par exemple, pour récupérer les IDs des catégories d'articles, vous devrez exécuter l'opération RetrieveIDsForCategories, en passant la taxonomie category comme argument :

Exécution de la query 'Retrieve item IDs'
Exécution de la query 'Retrieve item IDs'

À partir de la réponse JSON, les IDs des éléments à traduire sont imprimés dans l'entrée data.compiledData.ids (mise en évidence dans l'image). Copiez cette chaîne et stockez-la dans le tableau items du fichier de configuration.