
# WPML

WPML, özel bir bloğun özniteliklerini yalnızca dil yapılandırma dosyasında tanımlandıkları ölçüde çevirir. Blockstudio, her alan değerini blok yorumunda `blockstudio.attributes` altında saklar; bu nedenle her blok için, WPML metin alanlarına ve ek kimliklerine yönlendiren bir girdi gerekir. `wp bs wpml config` komutu, kayıtlı her blok için bu girdileri yazar.

## Blokların neden bir yapılandırmaya ihtiyacı var

WPML, yapılandırmayı etkin temanın ve etkin her eklentinin kök klasöründeki `wpml-config.xml` adlı dosyadan okur. Tek bir dosyadan oluşan bir zorunlu eklentide klasörün adı, `.php` olmadan dosyanın adıdır. [Dil Yapılandırma Dosyaları](https://wpml.org/documentation/support/language-configuration-files/) ve [Özel Gutenberg Bloklarını Çevirilebilir Hale Getirme](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/) bölümlerine bakın.

Bir girişi olmayan blok, WPML tarafından otomatik dize algılamasına bırakılır; bu yöntem, bloktaki her dize niteliğini çeviri için sunar. Seçim değerleri, dosya başvuruları, URL'ler ve CSS sınıfları içeren bir Blockstudio bloğunda çevirmenler bu teknik değerleri gerçek metnin yanında görür; çevrilmiş bir seçim değeri veya sınıf bloğu bozabilir.

## Yapılandırmayı oluşturma

Yapılandırmayı yazdırın ve blokları içeren tema veya eklentinin kök klasörüne kaydedin:

```bash
wp bs wpml config > wp-content/themes/my-theme/wpml-config.xml
```

Ya da dosyayı komutun yazmasını sağlayın:

```bash
wp bs wpml config --file=wp-content/themes/my-theme/wpml-config.xml
```

Bir metin alanı, görsel, bağlantı ve tekrarlayıcı içeren blok:

```json title="block.json"
{
  "name": "my-theme/cards",
  "title": "Cards",
  "blockstudio": {
    "attributes": [
      { "id": "heading", "type": "text", "label": "Heading" },
      { "id": "gallery", "type": "files", "label": "Gallery", "multiple": true },
      {
        "id": "style",
        "type": "select",
        "label": "Style",
        "options": [
          { "value": "light", "label": "Light" },
          { "value": "dark", "label": "Dark" }
        ]
      },
      {
        "id": "cards",
        "type": "repeater",
        "label": "Cards",
        "attributes": [
          { "id": "title", "type": "text", "label": "Title" },
          { "id": "image", "type": "files", "label": "Image" },
          { "id": "link", "type": "link", "label": "Button" }
        ]
      }
    ]
  }
}
```

şuna dönüşür:

```xml title="wpml-config.xml"
<wpml-config>
	<gutenberg-blocks>
		<!-- blockstudio:start -->
		<!-- Generated by wp bs wpml config. Run it again after changing block fields; edits between the markers are replaced. -->
		<gutenberg-block type="my-theme/cards" translate="1" label="Cards">
			<key name="blockstudio">
				<key name="attributes">
					<key name="heading" label="Heading" />
					<key name="gallery">
						<key name="*" type="post-ids" sub-type="attachment" />
					</key>
					<key name="cards">
						<key name="*">
							<key name="title" label="Cards: Title" />
							<key name="image" type="post-ids" sub-type="attachment" />
							<key name="link">
								<key name="title" label="Cards: Button: Link text" />
								<key name="url" type="link" label="Cards: Button: URL" />
							</key>
						</key>
					</key>
				</key>
			</key>
		</gutenberg-block>
		<!-- blockstudio:end -->
	</gutenberg-blocks>
</wpml-config>
```

`style` değeri bildirilmediğinden WPML bu değeri değiştirmeden kopyalar. `gallery` ve `image` kimlikleri de kopyalanır; blok oluşturulurken WPML bunların her birini sayfa dilindeki ekleyle değiştirir, böylece çevrilmiş bir görselin kendi alternatif metni olabilir. [Özel Gutenberg Bloklarını Çevirilebilir Hale Getirme](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/) bölümündeki "Bloklardaki Kimlikleri Otomatik Dönüştürme" başlığına bakın. Eklemin çevirisi yoksa WPML özgün kimliği korur.

## Bildirilenler

Komut, kayıtlı blokları; `custom/` alanları ve blok alanları genişletildikten, geçersiz kılmalar ve nitelik filtreleri uygulandıktan sonra okur. [uzantılar](https://blockstudio.dev/tr/docs/extensions/) tarafından bir Blockstudio bloğa eklenen alanlar dahil edilir. Uzantıların çekirdek bloklara veya diğer eklentilerin bloklarına eklediği alanlar dahil edilmez; çünkü bu bloklar yapılandırmalarını WPML dosyasından veya kendi eklentilerinden alır.

| Alan | Bildirim |
| --- | --- |
| `text`, `textarea`, `richtext`, `wysiwyg` | Çevrilebilir metin. |
| `link` | Metin olarak `title` ve `type="link"` ile `url`; böylece WPML, kullanılabilir olduğunda bir bağlantıyı çevirisiyle değiştirir. |
| `files` | `type="post-ids"` ve `sub-type="attachment"` ile saklanan eklem kimliği. `multiple` ile liste için `*` adlı bir düzey; bu, tek dosya seçildiğinde alanın sakladığı tek kimlikle de eşleşir. |
| `repeater` | Her satırla eşleşen `*` adlı bir düzey ve satır alanlarının bildirimleri. İç içe tekrarlayıcılar da aynı şekilde çalışır. |
| `id` içeren `group` | Grubun alanları; grup kimliği anahtar öneki olarak kullanılır (gruptaki `cta` grubunun `text` alanı için `cta_text`). |
| `id` olmadan `group`, `tabs` | Kendi düzeyleri olmayan alanlar. |
| `true` olarak ayarlanmış `translate` ile kaydedilen özel alan türü | `text` alanı gibi çevrilebilir metin. |
| Diğer tüm yerleşik türler | Bildirilmez. WPML değeri değiştirmeden kopyalar. |

Bildirilen bir metin alanı olmayan bloğa `translate="0"` uygulanır. Ardından WPML tüm değerlerini kopyalar ve bu bloktaki hiçbir şeyi çeviriye sunmaz. `files` alanları yine de girişte bildirilir; çünkü WPML, eklem kimliklerini `translate` ne derse desin dönüştürür. İç bloklar her zamanki gibi çevrilir.

Bildirilmeyenler:

- Değerleri editörler tarafından yazılmadığı için `hidden` içeren alanlar.
- Aşağıya bakın: `"translate": false` içeren alanlar.
- `translate`, `true` olarak ayarlanarak kaydedilmemiş [özel alan türlerinin](https://blockstudio.dev/tr/docs/blocks/attributes/custom-field-types/) alanları. Değerinin metin içerip içermediğini yalnızca alan türü bildiğinden komut her biri için bir uyarı yazdırır. Bir alandaki açık `"translate": false` da o alan için bu uyarıyı bastırır. Aşağıya bakın.
- Blockstudio alanları olarak değil, blokların yerel `attributes` dosyasında bildirilen nitelikler.
- Alanları farklı türlerde olan depolama anahtarları; aşağıya bakın.

`"translate": false` ayarlanmamışsa CSS sınıfı gibi teknik bir değer tutan alanlar dahil her metin alanı bildirilir.

### Alanı dahil etmeme

Bir metin alanı, her dilde aynı kalması gereken bir değer tutabilir: hesap adı, e-posta adresi, bağlantı noktası veya CSS sınıfı. WPML bu değeri diğer metinler gibi çeviriye sunar; çevrilmiş bir değer bloğu bozabilir. Alanı yapılandırmaya dahil etmemek için `translate` değerini `false` olarak ayarlayın; böylece WPML değerini çeviriye değiştirmeden kopyalar:

```json title="block.json"
{
  "id": "account",
  "type": "text",
  "label": "Account handle",
  "translate": false
}
```

Bir `group`, `tabs` veya `repeater` üzerinde `"translate": false`, iç içe kapsayıcılar dahil içindeki her alana uygulanır. Bir alt öğe, kapsam dışı bırakılmış bir kapsayıcıyı `"translate": true` ile geçersiz kılamaz. Bir `files` alanında `false` eklem kimliklerini de dışarıda bırakır; böylece çeviri özgün ekleri korur.

`translate` değerini atlamak veya `true` olarak ayarlamak mevcut davranışı korur: kararı alan türü verir. Bu, gizli alanları veya `select` gibi değer türlerini çevrilebilir hale getirmez. Seçenek, blok ve uzantı alanlarına uygulanır; düzenleyici denetimlerini gizlemez ya da devre dışı bırakmaz ve saklanan değerlerini değiştirmez. Ayarı değiştirdikten sonra `wp bs wpml config` komutunu yeniden çalıştırın ve oluşturulan yapılandırmayla `wpml-config.xml` dosyanızı güncelleyin.

Her anahtarın `label`, alan etiketidir; öncesinde kimliği olan kapsayıcı tekrarlayıcıların ve grupların etiketleri yer alır. WPML bunu çeviri düzenleyicisinde alan adı olarak gösterir. Bir `link` alanının iki anahtarı, etikete `Link text` ve `URL` ekler. Bu son ekler site diline çevrilir; bu nedenle komutu çevirmenlerinizin çalıştığı yerel ayarla çalıştırın.

### Özel alan türleri

Düz bir metin dizesi saklayan alan türü, kaydedilirken bunu belirtir. Tanımda `translate` değerini `true` olarak ayarlayın; bunun için `attribute` değerinin `string` olması gerekir:

```php title="functions.php"
bs_register_field_type('acme/headline', [
  'attribute' => 'string',
  'translate' => true,
]);
```

Komut daha sonra bu türün her alanını çevrilebilir metin olarak tanımlar. Bir alan, kendisini hariç tutmak için yine de `"translate": false` ayarını yapabilir. Bu seçenek olmadan, türün alanları önceki gibi hariç tutulur ve raporlanır.

### Etiketleri değiştirme

Alan etiketleri blok düzenleyici için yazılır ve çeviri düzenleyicisinde anlam taşımayan "Görsel (isteğe bağlı)" gibi ipuçları içerebilir. `blockstudio/wpml/config/label` filtresi, anahtarın bağlamıyla birlikte her etiketi yazılmadan önce alır:

- `block`: blok adı.
- `path`: `blockstudio.attributes` altındaki alanın depolama yolu; her yineleyicinin satırları için `*` düzeyinde, örneğin `cards/*/link`.
- `field`: alan tanımı.
- `parents`: kapsayan, kimlikli yineleyicilerin ve grupların etiketleri.
- `part`: metin alanı için `text`, bağlantı alanının iki anahtarı için `title` veya `url`.

```php title="functions.php"
add_filter('blockstudio/wpml/config/label', function ($label, $context) {
  return str_replace(' (optional)', '', $label);
}, 10, 2);
```

Bir anahtarın etiketini hariç tutmak için boş bir dize döndürün; böylece WPML bunun yerine bloğun etiketini gösterir. Dize olmayan bir dönüş değeri özgün etiketi korur. Filtreyi değiştirdikten sonra komutu yeniden çalıştırın.

### Aynı depolama anahtarına sahip alanlar

Örneğin bir blok alanı ile aynı `id` değerine sahip bir uzantı alanı veya `cta` kimlikli bir gruptaki `text` alanı ile `cta_text` kimlikli bir alan gibi, iki alan aynı depolama anahtarına sahip olabilir. Komut, bu anahtarda ne depolandığı açık olduğunda anahtarı tanımlar:

- Bir bloğun yineleyici satırlarının dışındaki alanlarında Blockstudio, depolama anahtarı başına bir öznitelik kaydeder; dolayısıyla türü ne olursa olsun sonraki alan öncekini değiştirir. Bir bloğun uzantı alanları da aynı şekilde çalışır: sonraki alan veya daha sonra kaydedilen bir uzantının alanı öncekinin yerine geçer.
- Aynı anahtara sahip bir blok alanı ve uzantı alanı birlikte etkin kalır. Blok şablonu değeri bloğun alanında tanımlandığı biçimde alırken uzantı kendi alanıyla uygulanır. Her iki alan da aynı tanımı gerektirdiğinde anahtar bir kez tanımlanır: ikisi de metin alanıdır (`text`, `textarea`, `richtext` veya `wysiwyg`), ikisi de bağlantı alanıdır, ikisi de `files` alanıdır (ikisinden birinde `multiple` varsa anahtar `*` düzeyini alır) ya da biri `select`, diğeri `number` gibi hiçbiri tanımlanmamıştır. İki yineleyici, satırlarındaki alanlar tek tek karşılaştırılarak değerlendirilir. Etiket blok alanından alınır.
- Tek bir yineleyicinin satırlarında aynı `id` değerine sahip iki alan da birlikte etkin kalır ve aynı şekilde karşılaştırılır.

Türler farklı olduğunda, örneğin blokta bir `text` alanı ve uzantıda bir `select` alanı varsa, depolanan değer, yazan denetime bağlı olarak metin veya bir seçeneğidir. Komut anahtarı tanımlamaz ve bir uyarı yazdırır:

```bash
Warning: Not declared, the fields that store this key have different types: my-theme/cards: tone (text in the block, select in an extension)
```

Anahtarın tanımlanması için alanlardan birini yeniden adlandırın veya ikisine de aynı türü verin.

## Yapılandırmayı güncel tutma

Alan ekledikten, kaldırdıktan veya yeniden adlandırdıktan sonra komutu yeniden çalıştırın ve güncellenmiş dosyayı temayla ya da eklentiyle birlikte dağıtın. Ek iliştirme kimliği tanımlarını içermesi için 7.7.5 öncesinde oluşturulmuş yapılandırmaları yeniden oluşturun. Daha önce var olan içerikte yeni alanların çeviri için görünmesi için, yukarıdaki WPML kılavuzunda açıklandığı gibi özgün içeriği güncelleyin.

`--file` ile komut eksik bir dosya oluşturur. Mevcut bir dosyada yalnızca `<!-- blockstudio:start -->` ile `<!-- blockstudio:end -->` arasındaki metni değiştirir; böylece diğer bölümler ve başka bloklara ait girdiler olduğu gibi kalır:

```xml title="wpml-config.xml"
<wpml-config>
	<custom-types>
		<custom-type translate="1">book</custom-type>
	</custom-types>
	<gutenberg-blocks>
		<gutenberg-block type="my-plugin/map" translate="1">
			<key name="caption" />
		</gutenberg-block>
		<!-- blockstudio:start -->
		<!-- blockstudio:end -->
	</gutenberg-blocks>
</wpml-config>
```

Henüz işaretleyicileri olmayan mevcut bir dosyayı kullanmak için, iki işaretleyici satırını dosyanın `gutenberg-blocks` öğesinin içine bir kez ekleyin veya dosyada böyle bir öğe yoksa işaretleyicileri içeren bir `gutenberg-blocks` öğesi ekleyin. İşaretleyiciler yoksa veya sonuç geçerli bir yapılandırma olmayacaksa komut dosyayı değiştirmeden bırakır ve hatayla çıkar.

Blockstudio blokları için elle yazılmış, örneğin teknik değerleri gizleyen `translate="0"` girdileri gibi girdilere, oluşturulan bölüm bloğu kapsadığında artık gerek kalmaz. Komut birden fazla kez tanımlanan her blok için uyarı verir; böylece bu girdiler kaldırılabilir.

## Çeviri işlerinde görsel metinleri

WPML, bir sayfanın kullandığı görsellerin başlık, alternatif metin, altyazı ve açıklama gibi metinlerini sayfanın çeviri işine ekler. İş tamamlandığında WPML çevrilmiş metinleri hedef dildeki ek dosyaya yazar ve henüz yoksa bu eki oluşturur. Bkz. [Medyayı çevirme](https://wpml.org/documentation/translating-your-contents/media/).
WPML görselleri içerikteki `<img>` etiketlerinde, galerilerde, öne çıkarılan görselde ve bildiği bloklarda bulur. Bir Blockstudio bloğu ek dosya kimliklerini blok yorumunda depolar; bu nedenle WPML bunlardan hiçbirini bulamaz.

WPML etkin olduğunda, Blockstudio bir sayfanın bloklarındaki alanların depoladığı ek dosyaları bulunan görsellerin WPML listesine ekler:

- Gizli olanlar dâhil `files` alanları ve `media` içeren `attributes` alanları; blok düzenleyicinin medya olarak yüklediği alanlarla aynıdır.
- Gruplardaki, sekmelerdeki, yineleyici satırlarındaki ve iç bloklardaki alanlar.
- [uzantılarının](https://blockstudio.dev/tr/docs/extensions/) alanları; değerleri genişletilen bloğun özniteliklerinde depolandığından çekirdek bloklarda ve diğer eklentilerin bloklarında da geçerlidir.

Ek dosya kimliği olmayan değerler hariç tutulur. Herhangi bir yapılandırma gerekmez ve `wpml-config.xml` devreye girmez. WPML olmadan çeviri işleri için hiçbir şey taranmaz ve medya entegrasyonu sınıfı yüklenmez.

Bu, ek dosya kimliği dönüştürme işleminden ayrıdır: oluşturulan XML, WPML bileşenine hangi çevrilmiş ek dosyanın görüntüleneceğini söylerken bu entegrasyon, çeviri işine hangi ek dosya metinlerinin ekleneceğini bildirir. Dize başvuruları ve ek dosya olmayan yazıların kimlikleri medya işlerine eklenmez. Kaydedilmiş iç içe alan değerleri, oluşturma sırasında olduğu gibi, Blockstudio bloklarındaki üst düzey değerlerden önceliklidir.

Görsel metin seçeneklerinden biri WPML > Ayarlar > Medya Çevirisi altında etkinleştirildiğinde metinler işe eklenir: "Görsel metinlerini çevirmek için en iyi seçenekleri otomatik olarak algıla" veya "İçeriği çevirirken Medya Kitaplığı metinlerini çevir". Çekirdek bloklardaki görseller için de durum aynıdır.

Blockstudio, gönderinin `PostWithMediaFiles` içindeki medyaya uygulanan WPML filtresi aracılığıyla görselleri bildirir`wpml_ids_of_media_used_in_post`. Bir görseli işlemlerin dışında bırakmak için aynı filtrede 10'dan yüksek önceliğe sahip bir geri çağırımda görselin kimliğini kaldırın:

```php
add_filter(
	'wpml_ids_of_media_used_in_post',
	function ( $ids ) {
		return array_values( array_diff( $ids, array( 42 ) ) );
	},
	20
);
```
