Eğitimler
EğitimlerWP-CLI ile toplu çeviri çalıştırma

WP-CLI ile toplu çeviri çalıştırma

Bash betikleri kullanarak WP-CLI ile toplu çeviri çalıştırabilirsiniz. Bu sayede başka bir şeyle ilgilenirken çevirileri arka planda çalıştırabilirsiniz.

Bunu yapmak için iki bash betiği oluşturun:

  1. İşlemleri toplu olarak yürütme mantığını içeren ana betik (hiçbir zaman değişmez)
  2. Hangi öğelerin çevrileceğini tanımlayan yapılandırma dosyası (her çeviri çalıştırmasında güncellenmesi gerekir)

Ana betik

Çevirileri işleme mantığını içeren gatotranslate.sh (örneği indir) adlı bir dosya oluşturun:

gatotranslate komutuna iletilen parametreleri özelleştirebilirsiniz (ör.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, vb.).

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

Yapılandırma dosyası

Toplu çeviri yapılandırmanızı içeren gatotranslate.config.sh (örneği indir) adlı bir dosya oluşturun:

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

Bu dosya aşağıdaki değişkenleri içermelidir:

DeğişkenAçıklama
userKomutu çalıştıracak WordPress kullanıcı adı (genellikle admin)
subcommandÇalıştırılacak gatotranslate WP-CLI alt komutu (post, media, term veya menu)
batch_sizeHer toplu işlemde çevrilecek öğe sayısı (varsayılan 1)
itemsÇevrilecek öğelerin (yazılar, etiketler, kategoriler, medya, menüler, vb.) ID dizisi

Betiği çalıştırma

wp komutunun kullanılabildiği WordPress kök dizininden çalıştırın.

Toplu çeviriyi başlatmak için şunu çalıştırın:

bash +x gatotranslate.sh

Betik, gatotranslate komutunu tüm öğeler için belirtilen boyuttaki toplu işlemler halinde çalıştıracak ve her toplu işlem için ilerleme bilgisini gösterecektir.

'gatotranslate.sh' betiğini çalıştırma
'gatotranslate.sh' betiğini çalıştırma

Betik başarıyla tamamlandığında tek bir bip sesi çıkarır.

Hata durumunda yürütmeyi durdurma

Günlüklere bir hata veya uyarı eklendiğinde betiğin otomatik olarak durmasını sağlamak için gatotranslate.sh dosyasındaki komuta --fail-if-log-notifications parametresini ekleyin:

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

Betik durdurulmasını tetikleyecek günlük bildirimlerinin önem düzeyi, Settings > Plugin Configuration > Logs & Notifications sayfasında yapılandırılan düzeylerdir.

Önem düzeyine göre etkinleştirilen günlük bildirimleri
Önem düzeyine göre etkinleştirilen günlük bildirimleri

Betik bir günlük bildirimi nedeniyle durduğunda uzun bir bip sesi dizisi çıkarır.

'gatotranslate.sh' betiğini '--fail-if-log-notifications' parametresiyle çalıştırma
'gatotranslate.sh' betiğini '--fail-if-log-notifications' parametresiyle çalıştırma

Sorunu giderdikten sonra, toplu işlem numarasını argüman olarak ileterek çeviriyi kaldığı yerden sürdürebilirsiniz.

Bu sayede zaten başarıyla çevrilmiş öğeleri yeniden işlemekten kaçınabilir, hem zaman hem de API kredisi tasarrufu sağlayabilirsiniz.

Örneğin, hata 2. toplu işlemde oluştuysa, sorunu giderdikten sonra şunu çalıştırın:

bash +x gatotranslate.sh 2

Gelişmiş: Çevrilecek öğelerin ID'lerini alma

Toplu çeviriyi yapılandırırken çevrilecek öğelerin ID'lerini bilmeniz gerekir.

Eklenti arka planda Gato GraphQL çalıştırdığından bu bilgiyi almak için bir GraphQL query'si rahatça çalıştırabilirsiniz.

GraphQL queries çalıştırmak için önce Advanced Mode'u etkinleştirmeniz ve Queries CPT'sine erişmeniz gerekir. Advanced Mode'un nasıl etkinleştirileceğine dair talimatlar için Yardımcı Queries Oluşturma sayfasına bakın.

Retrieve item IDs başlıklı ve aşağıdaki GraphQL query'sini içeren yeni bir Queries girişi ekleyin:

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: " " )
  }
}
'Retrieve item IDs' query'sini oluşturma
'Retrieve item IDs' query'sini oluşturma

Hangi varlıkları çevirmek istediğinize bağlı olarak, query'deki ilgili işlemi yapılandırıp çalıştırmanız gerekecektir.

Örneğin, yazı kategorilerinin ID'lerini almak için category taksonomisini argüman olarak ileterek RetrieveIDsForCategories işlemini çalıştırmanız gerekecektir:

'Retrieve item IDs' query'sini çalıştırma
'Retrieve item IDs' query'sini çalıştırma

JSON yanıtından, çevrilecek öğelerin ID'leri data.compiledData.ids girişinde yazdırılır (görselde vurgulanmıştır). Bu dizeyi kopyalayın ve yapılandırma dosyasındaki items dizisine kaydedin.