
# WPML

A WPML csak addig fordítja le egyéni blokkok attribútumait, ameddig a nyelvi konfigurációs fájl deklarálja őket. A Blockstudio minden mezőértéket a blokk megjegyzésében tárol a `blockstudio.attributes` alatt, ezért minden blokkhoz olyan bejegyzés szükséges, amely a WPML elemet a szövegmezőire és a mellékletek azonosítóira irányítja. A `wp bs wpml config` parancs minden regisztrált blokkhoz létrehozza ezeket a bejegyzéseket.

## Miért van szükségük konfigurációra a blokkoknak

A WPML az aktív sablon gyökérmappájában és minden aktív bővítmény gyökérmappájában található, `wpml-config.xml` nevű fájlból olvassa be a konfigurációt. Egyetlen fájlból álló kötelezően használandó bővítmény esetén a mappa neve a fájl neve, `.php` nélkül. Lásd: [Nyelvi konfigurációs fájlok](https://wpml.org/documentation/support/language-configuration-files/) és [Egyéni Gutenberg blokkok fordíthatóvá tétele](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/).

A bejegyzés nélküli blokk fordíthatóságáról a WPML automatikus szövegfelismerése gondoskodik, amely a blokk minden szöveges attribútumát felkínálja fordításra. Egy Blockstudio blokk esetében ide tartoznak a választási értékek, fájlhivatkozások, URL-ek és CSS osztályok. A fordítók ezeket a technikai értékeket a valódi szöveg mellett látják, és egy lefordított választási érték vagy osztály működésképtelenné teheti a blokkot.

## A konfiguráció létrehozása

Írassa ki a konfigurációt, és mentse annak a sablonnak vagy bővítménynek a gyökérmappájába, amely a blokkokat tartalmazza:

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

Vagy hagyja, hogy a parancs írja meg a fájlt:

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

Egy blokk szövegmezővel, képpel, hivatkozással és ismétlőmezővel:

```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" }
        ]
      }
    ]
  }
}
```

eredménye:

```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>
```

A `style` érték nincs deklarálva, ezért a WPML változatlanul másolja át a fordításba. A `gallery` és `image` azonosítók is átkerülnek, a WPML pedig a blokk megjelenítésekor mindegyiket az oldal nyelvéhez tartozó melléklettel helyettesíti, így a lefordított képhez saját alternatív szöveg tartozhat. Lásd az „Azonosítók automatikus átalakítása blokkokban” című részt itt: [Egyéni Gutenberg blokkok fordíthatóvá tétele](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/). Ha egy mellékletnek nincs fordítása, a WPML megtartja az eredeti azonosítót.

## Mit deklarál a konfiguráció

A parancs a regisztrált blokkokat olvassa be, miután a `custom/` mezők és blokkmezők kibontása, valamint a felülírások és attribútumszűrők alkalmazása megtörtént. A [bővítmények](https://blockstudio.dev/hu/docs/extensions/) által egy Blockstudio blokkhoz hozzáadott mezők is bekerülnek. A bővítmények által az alapblokkokhoz vagy más bővítmények blokkjaihoz hozzáadott mezők nem kerülnek bele, mert ezek a blokkok a konfigurációjukat a WPML fájlból vagy a saját bővítményükből kapják.

| Mező | Deklaráció |
| --- | --- |
| `text`, `textarea`, `richtext`, `wysiwyg` | Fordítható szöveg. |
| `link` | `title` szövegként, `url` pedig `type="link"` értékkel, így a WPML elérhető fordítás esetén a hivatkozást annak fordítására cseréli. |
| `files` | A tárolt mellékletazonosító `type="post-ids"` és `sub-type="attachment"` értékkel. `multiple` esetén a lista szintje `*` nevű, ami az egyetlen fájl kiválasztásakor tárolt azonosítóra is illeszkedik. |
| `repeater` | A szint neve `*`, és minden sorra illeszkedik; a deklarációk a sor mezőire vonatkoznak. A beágyazott ismétlőmezők ugyanígy működnek. |
| `group` `id` értékkel | A csoport mezői, a csoportazonosítóval mint kulcselőtaggal (`cta_text` a `cta` csoport `text` mezőjéhez). |
| `group` `id` nélkül, `tabs` | A mezők saját szint nélkül. |
| `translate` értéke `true`, regisztrált egyéni mezőtípus | Fordítható szöveg, például egy `text` mező. |
| Minden más beépített típus | Nincs deklarálva. A WPML változatlanul másolja át az értéket. |

A deklarált szövegmező nélküli blokk `translate="0"` értéket kap. Ezután a WPML átmásolja az összes értékét, és semmit sem kínál fel fordításra. A `files` mezői ettől még deklarálva vannak a bejegyzésben, mert a WPML a mellékletazonosítókat attól függetlenül átalakítja, hogy mit mond a `translate`. A belső blokkok fordítása a szokásos módon történik.

Nincs deklarálva:

- A `hidden`-vel rendelkező mezők, mert értékeiket nem a szerkesztők írják.
- A `"translate": false`-vel rendelkező mezők, lásd alább.
- [Egyéni mezőtípusok](https://blockstudio.dev/hu/docs/blocks/attributes/custom-field-types/) mezői,
  amelyek nincsenek regisztrálva a `translate`-ben `true` értékkel. A parancs mindegyikhez figyelmeztetést ír ki, mert csak a mezőtípus ismeri, hogy az értéke tartalmaz-e szöveget. Egy mezőn megadott explicit `"translate": false` az adott mezőnél is elnyomja ezt a figyelmeztetést. Lásd alább.
- Azok az attribútumok, amelyeket egy blokk a natív `attributes` formátumában deklarál, nem pedig Blockstudio mezőkként.
- Azok a tárolókulcsok, amelyek mezői különböző típusúak; lásd alább.

Minden szövegmező deklarálva van, beleértve az olyan technikai értéket tartalmazókat is, mint egy CSS osztály, kivéve, ha be van állítva rajta a `"translate": false`.

### Mező kihagyása

Egy szövegmező olyan értéket is tartalmazhat, amelynek minden nyelven azonosnak kell maradnia: fióknevet, e-mail-címet, horgonyt vagy CSS osztályt. A WPML ezt bármely más szöveghez hasonlóan felkínálja fordításra, a lefordított érték pedig működésképtelenné teheti a blokkot. Állítsa a `translate` értékét `false` értékre, hogy a mező kimaradjon a konfigurációból, és a WPML változatlanul másolja át az értékét a fordításba:

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

Egy `group`, `tabs` vagy `repeater` esetében a `"translate": false` minden belső mezőre, a beágyazott tárolókat is beleértve, érvényes. A gyermekelem nem írhatja felül a kihagyásra beállított tároló értékét a `"translate": true` használatával. Egy `files` mezőn a `false` a mellékletazonosítókat is kihagyja, így a fordítás megtartja az eredeti mellékleteket.

A `translate` elhagyása vagy `true` értékre állítása megőrzi a meglévő működést: a mezőtípus dönt. Ettől a rejtett mezők és az olyan értéktípusok, mint a `select`, nem válnak fordíthatóvá. A beállítás a blokk- és bővítménymezőkre vonatkozik, nem rejti el és nem tiltja le a szerkesztői vezérlőket, és nem módosítja a tárolt értékeket. A beállítás módosítása után futtassa újra a `wp bs wpml config` parancsot, és frissítse a `wpml-config.xml` fájlt a létrehozott konfigurációval.

Minden kulcs `label` része a mező címkéje, amely előtt az azonosítóval rendelkező befoglaló ismétlőmezők és csoportok címkéi állnak. A WPML ezt jeleníti meg mezőnévként a fordítói felületen. Egy `link` mező két kulcsa `Link text` és `URL` utótagot fűz a címkéhez. Ezek az utótagok a webhely nyelvére fordulnak, ezért a parancsot azon a területi beállításon futtassa, amelyen a fordítók dolgoznak.

### Egyéni mezőtípusok

A sima szöveges karakterláncot tároló mezőtípus ezt a regisztrációjakor jelzi. A definícióban állítsa a `translate` értékét `true` értékre; ehhez a `attribute` értékének `string`-nak/-nek kell lennie:

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

A parancs ezután az adott típus minden mezőjét fordítható szövegként jelöli meg. Egy mező továbbra is beállíthatja a `"translate": false` értéket, hogy kimaradjon. Az opció nélkül a típus mezői kimaradnak, és a parancs a korábbiak szerint jelzi őket.

### Címkék módosítása

A mezőcímkék a blokkszerkesztőhöz készülnek, és olyan útmutatásokat is tartalmazhatnak, mint az „Image (optional)”, amelyeknek nincs jelentésük a fordításszerkesztőben. A `blockstudio/wpml/config/label` szűrő minden címkét a kiírása előtt kap meg, a kulcs kontextusával együtt:

- `block`: a blokk neve.
- `path`: a mező `blockstudio.attributes` alatti tárolási útvonala, minden ismétlő soraihoz egy `*` szinttel, például `cards/*/link`.
- `field`: a mező definíciója.
- `parents`: a körülvevő ismétlők és azonosítóval rendelkező csoportok címkéi.
- `part`: `text` szövegmező esetén, `title` vagy `url` pedig a hivatkozásmező két kulcsához.

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

Adjon vissza üres karakterláncot, ha ki szeretné hagyni egy kulcs címkéjét; ekkor a WPML a blokk címkéjét jeleníti meg helyette. Ha a visszatérési érték nem karakterlánc, az eredeti címke marad érvényben. A szűrő módosítása után futtassa újra a parancsot.

### Azonos tárolási kulcsú mezők

Két mező ugyanahhoz a tárolási kulcshoz vezethet, például egy blokkmező és egy olyan bővítménymező esetén, amelynek ugyanaz a `id` értéke, vagy a `text` mezőnél egy `cta` azonosítójú csoportban, valamint egy `cta_text` azonosítójú mezőnél. A parancs csak akkor deklarál ilyen kulcsot, ha egyértelmű, hogy mit tárol:

- Egy blokk mezői között, az ismétlősorokon kívül a Blockstudio tárolási kulcsonként egy attribútumot regisztrál, így egy későbbi mező felülírja a korábbit, annak típusától függetlenül. A blokk bővítményeinek mezői ugyanígy működnek: egy későbbi mező vagy egy később regisztrált bővítmény mezője felülírja a korábbit.
- Az azonos kulcsú blokkmező és bővítménymező egyaránt érvényben marad. A blokksablon az értéket a blokk mezőjének definíciója szerint kapja meg, míg a bővítmény a saját mezőjével alkalmazza. A kulcs csak akkor kap egyszeri deklarációt, ha mindkét mezőhöz ugyanaz a deklaráció szükséges: mindkettő szövegmező (`text`, `textarea`, `richtext` vagy `wysiwyg`), mindkettő hivatkozás, mindkettő `files` mező (bármelyikükön `multiple` esetén a kulcs `*` szintet kap), vagy egyik sincs deklarálva, például egy `select` és egy `number` esetén. A két ismétlő mezőit soronként, mezőről mezőre hasonlítja össze. A címke a blokk mezőjéből származik.
- Az ugyanazzal a `id` értékkel rendelkező két mező egy ismétlő soraiban szintén érvényben marad, és ugyanígy hasonlítja össze őket.

Ha a típusok eltérnek, például a blokkban lévő `text` mező és a bővítményben lévő `select` mező esetén, a tárolt érték szöveg vagy egy kiválasztott lehetőség attól függően, melyik vezérlő írta. A parancs nem deklarálja a kulcsot, és figyelmeztetést ír ki:

```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)
```

Nevezze át az egyik mezőt, vagy állítsa be mindkettőnél ugyanazt a típust, hogy a kulcs deklarálva legyen.

## Tartsa naprakészen a konfigurációt

Mezők hozzáadása, eltávolítása vagy átnevezése után futtassa újra a parancsot, és a frissített fájlt mellékelje a témához vagy a bővítményhez. Generálja újra az 7.7.5 előtt készült konfigurációkat, hogy azonosítóval rendelkező mellékletdeklarációk is bekerüljenek. Az eredeti tartalom frissítése után a korábban meglévő tartalmakban fordíthatóvá válnak az új mezők, a fent bemutatott WPML útmutató szerint.

A `--file` használatakor a parancs létrehozza a hiányzó fájlt. Meglévő fájlban csak a `<!-- blockstudio:start -->` és a `<!-- blockstudio:end -->` közötti szöveget cseréli le, így a többi szakasz és a többi blokkhoz tartozó bejegyzések változatlanok maradnak:

```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>
```

Ha olyan meglévő fájlt szeretne használni, amelyben még nincsenek jelölők, adja hozzá egyszer a két jelölős sort az `gutenberg-blocks` eleméhez, vagy ha ilyen elem nincs a fájlban, adjon hozzá egy `gutenberg-blocks` elemet a jelölőkkel. Jelölők nélkül, illetve ha az eredmény nem lenne érvényes konfiguráció, a parancs változatlanul hagyja a fájlt, és hibával lép ki.

A kézzel írt Blockstudio blokkok bejegyzéseire, például a technikai értékeket elrejtő `translate="0"` bejegyzésekre már nincs szükség, ha a generált szakasz lefedi a blokkot. A parancs figyelmeztetést ad minden többször deklarált blokkról, így ezek a bejegyzések eltávolíthatók.

## Képszövegek a fordítási feladatokban

A WPML az oldal által használt képek szövegeit is hozzáadja az oldal fordítási feladatához: cím, alternatív szöveg, képaláírás és leírás. A feladat befejezésekor a WPML a lefordított szövegeket a célnyelv mellékletéhez írja, és létrehozza azt, ha még nem létezik. Lásd: [Média fordítása](https://wpml.org/documentation/translating-your-contents/media/).
A WPML a tartalomban lévő `<img>` címkékben, galériákban, a kiemelt képen és az általa ismert blokkokban keresi a képeket. Egy Blockstudio blokk a mellékletazonosítókat a blokk megjegyzésében tárolja, ezért a WPML nem találja meg ezeket.

Ha a WPML aktív, a Blockstudio hozzáadja az oldal blokkjainak mezőiben tárolt mellékleteket a megtalált képekhez (WPML):

- `files` mezők, a rejtetteket is beleértve, valamint `attributes` mezők `media` értékkel; ezek ugyanazok a mezők, amelyeket a blokkszerkesztő médiaként betölt.
- Mezők csoportokban, lapokon, ismétlősorokban és belső blokkokban.
- A [bővítmények](https://blockstudio.dev/hu/docs/extensions/) mezői, az alapblokkokon és más bővítmények blokkjain is, mert ezek értékei a bővített blokk attribútumaiban tárolódnak.

A nem mellékletazonosító értékek kimaradnak. Semmit sem kell beállítani, és a `wpml-config.xml` nincs használatban. A WPML nélkül a program nem keresi a fordítási feladatokhoz szükséges elemeket, és a médiaintegrációs osztály sem töltődik be.

Ez elkülönül a mellékletazonosító átalakításától: a generált XML megadja a WPML számára, hogy melyik lefordított mellékletet jelenítse meg, ez az integráció pedig azt határozza meg, mely melléklethoz tartozó szövegeket kell a fordítási feladatba felvenni. A szöveges hivatkozások és a nem mellékletbejegyzések azonosítói nem kerülnek a médiafeladatokba. Az Blockstudio blokkoknál a mentett beágyazott mezőértékek elsőbbséget élveznek a legfelső szintű értékekkel szemben, a megjelenítéskor alkalmazott módon.

A szövegek csak akkor kerülnek be a feladatba, ha engedélyezve van az WPML > Settings > Media Translation alatti képszöveg-beállítások egyike: „Automatically detect best options for translating image texts” vagy „Translate Media Library texts when translating content”, az alapblokkokban található képekhez hasonlóan.

Blockstudio a képeket a `wpml_ids_of_media_used_in_post` szűrőn keresztül jelenti, amely WPML egy bejegyzés médiatartalmára vonatkozik a `PostWithMediaFiles`-ban. Ha ki szeretne hagyni egy képet a feladatokból, távolítsa el az azonosítóját ugyanazon a szűrőn futó, 10-nél nagyobb prioritású visszahívásban:

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