Samouczki
SamouczkiUruchamianie tłumaczeń wsadowych za pomocą WP-CLI

Uruchamianie tłumaczeń wsadowych za pomocą WP-CLI

Możesz uruchamiać tłumaczenia wsadowe za pomocą WP-CLI, używając skryptów bash. Pozwala to uruchamiać tłumaczenia w tle, podczas gdy pracujesz nad czymś innym.

Aby to zrobić, utwórz dwa skrypty bash:

  1. Główny skrypt zawierający logikę przetwarzania wsadowego (nigdy się nie zmienia)
  2. Plik konfiguracyjny definiujący, które elementy mają być tłumaczone (aktualizowany przy każdym uruchomieniu tłumaczenia)

Główny skrypt

Utwórz plik o nazwie gatotranslate.sh (pobierz przykład) zawierający logikę przetwarzania tłumaczeń:

Możesz dostosować parametry przekazywane do polecenia gatotranslate (np.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, itd.).

#!/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 "----------------------------------------"

Plik konfiguracyjny

Utwórz plik o nazwie gatotranslate.config.sh (pobierz przykład) zawierający konfigurację dla tłumaczenia wsadowego:

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

Ten plik musi zawierać następujące zmienne:

ZmiennaOpis
userNazwa użytkownika WordPress do wykonania polecenia (zazwyczaj admin)
subcommandPodpolecenie WP-CLI gatotranslate do wykonania (post, media, term lub menu)
batch_sizeLiczba elementów do przetłumaczenia w każdej partii (domyślnie 1)
itemsTablica identyfikatorów elementów do przetłumaczenia (wpisy, tagi, kategorie, media, menu itd.)

Uruchamianie skryptu

Uruchom z katalogu głównego WordPress, gdzie dostępne jest polecenie wp.

Aby uruchomić tłumaczenie wsadowe, wykonaj:

bash +x gatotranslate.sh

Skrypt wykona polecenie gatotranslate dla wszystkich elementów, w partiach o określonym rozmiarze, wyświetlając informacje o postępie dla każdej partii.

Wykonywanie skryptu 'gatotranslate.sh'
Wykonywanie skryptu 'gatotranslate.sh'

Gdy skrypt zakończy działanie pomyślnie, emituje pojedynczy sygnał dźwiękowy.

Zatrzymywanie wykonania w przypadku błędu

Aby skrypt zatrzymywał się automatycznie za każdym razem, gdy do logów zostanie dodany błąd lub ostrzeżenie, dodaj parametr --fail-if-log-notifications do polecenia w gatotranslate.sh:

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

Poziom ważności powiadomień logów wyzwalających zatrzymanie skryptu jest skonfigurowany na stronie Settings > Plugin Configuration > Logs & Notifications.

Powiadomienia logów włączone według poziomu ważności
Powiadomienia logów włączone według poziomu ważności

Gdy skrypt zatrzyma się z powodu powiadomienia logu, emituje rozszerzoną sekwencję sygnałów dźwiękowych.

Wykonywanie skryptu 'gatotranslate.sh' z parametrem '--fail-if-log-notifications'
Wykonywanie skryptu 'gatotranslate.sh' z parametrem '--fail-if-log-notifications'

Po naprawieniu problemu możesz wznowić tłumaczenie od miejsca, w którym wystąpił błąd, przekazując numer partii jako argument.

W ten sposób możesz uniknąć ponownego przetwarzania elementów, które zostały już pomyślnie przetłumaczone, oszczędzając zarówno czas, jak i kredyty API.

Na przykład, jeśli błąd wystąpił w partii 2, po naprawieniu problemu wykonaj:

bash +x gatotranslate.sh 2

Zaawansowane: pobieranie identyfikatorów elementów do przetłumaczenia

Podczas konfigurowania tłumaczenia wsadowego musisz znać identyfikatory elementów do przetłumaczenia.

Ponieważ wtyczka uruchamia Gato GraphQL pod maską, możemy wygodnie wykonać query GraphQL, aby pobrać te informacje.

Aby wykonywać queries GraphQL, musisz najpierw włączyć Advanced Mode i uzyskać dostęp do CPT Queries. Zobacz Tworzenie pomocniczych queries, aby dowiedzieć się, jak włączyć Advanced Mode.

Dodaj nowy wpis w Queries, z tytułem Retrieve item IDs, i następującym 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: " " )
  }
}
Tworzenie query 'Retrieve item IDs'
Tworzenie query 'Retrieve item IDs'

W zależności od tego, jakie encje chcesz przetłumaczyć, musisz skonfigurować i wykonać odpowiednią operację w query.

Na przykład, aby pobrać identyfikatory kategorii wpisów, musisz wykonać operację RetrieveIDsForCategories, przekazując taksonomię category jako argument:

Wykonywanie query 'Retrieve item IDs'
Wykonywanie query 'Retrieve item IDs'

Z odpowiedzi JSON identyfikatory elementów do przetłumaczenia są wyświetlane we wpisie data.compiledData.ids (zaznaczonym na obrazku). Skopiuj ten ciąg i zapisz go w tablicy items w pliku konfiguracyjnym.