
# WPML

WPML verčia pasirinktinio bloko atributus tik tiek, kiek nurodo kalbos konfigūracijos failas. Blockstudio saugo kiekvieno lauko reikšmę bloko komentare po `blockstudio.attributes`, todėl kiekvienam blokui reikia įrašo, kuris nurodo WPML į jo teksto laukus ir priedų ID. Komanda `wp bs wpml config` sukuria šiuos įrašus kiekvienam registruotam blokui.

## Kodėl blokams reikia konfigūracijos

WPML nuskaito konfigūraciją iš failo, pavadinto `wpml-config.xml`, aktyvios temos ir kiekvieno aktyvaus papildinio šakniniame aplanke. Jei privalomasis papildinys yra vienas failas, aplankas pavadinamas kaip failas, tik be `.php`. Žr. [Kalbos konfigūracijos failai](https://wpml.org/documentation/support/language-configuration-files/) ir [Kaip padaryti pasirinktinius Gutenberg blokus](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/) išverčiamus.

Blokas be įrašo paliekamas WPML automatiniam eilučių aptikimui, kuris vertimui pateikia kiekvieną bloko eilutės atributą. Blokui Blockstudio, kuriame yra pasirinkimo reikšmės, failų nuorodos, URL ir CSS klasės. Vertėjai šias technines reikšmes mato greta tikrojo teksto, o išversta pasirinkimo reikšmė arba klasė gali sugadinti bloką.

## Generuoti konfigūraciją

Išveskite konfigūraciją ir išsaugokite ją temos arba papildinio, kuriame yra blokai, šakniniame aplanke:

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

Arba leiskite komandai įrašyti failą:

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

Blokas su teksto lauku, vaizdu, nuoroda ir kartotuvu:

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

tampa:

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

Reikšmė `style` nedeklaruota, todėl WPML ją nukopijuoja į vertimą nepakeistą. Taip pat nukopijuojami `gallery` ir `image` ID, o WPML, atvaizduojant bloką, kiekvieną jų pakeičia puslapio kalbos priedu, todėl išverstas vaizdas gali turėti savo alternatyvųjį tekstą. Žr. „Automatinis ID konvertavimas blokuose“ skirsnyje [Kaip padaryti pasirinktinius Gutenberg blokus](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/) išverčiamus.
Jei priedas neturi vertimo, WPML palieka pradinį ID.

## Kas deklaruojama

Komanda nuskaito registruotus blokus, kai `custom/` laukai ir blokų laukai išskleisti, o nepaisymo nustatymai ir atributų filtrai pritaikyti. Įtraukiami laukai, kuriuos [plėtiniai](https://blockstudio.dev/lt/docs/extensions/) prideda prie Blockstudio bloko. Neįtraukiami laukai, kuriuos plėtiniai prideda prie pagrindinių blokų arba kitų papildinių blokų, nes šių blokų konfigūracija gaunama iš WPML arba jų papildinio.

| Laukas | Deklaracija |
| --- | --- |
| `text`, `textarea`, `richtext`, `wysiwyg` | Verčiamas tekstas. |
| `link` | `title` kaip tekstas ir `url` su `type="link"`, kad WPML pakeistų nuorodą jos vertimu, jei toks yra. |
| `files` | Išsaugotas priedo ID su `type="post-ids"` ir `sub-type="attachment"`. Jei naudojamas `multiple`, sąrašo lygmuo, pavadintas `*`; jis taip pat atitinka vieną ID, kurį laukas išsaugo pasirinkus vieną failą. |
| `repeater` | Lygmuo, pavadintas `*`, atitinkantis kiekvieną eilutę, su eilutės laukų deklaracijomis. Įdėtiniai kartotuvai veikia taip pat. |
| `group` su `id` | Grupės laukai, o grupės ID naudojamas kaip rakto priešdėlis (`cta_text` lauko `text` grupėje `cta`). |
| `group` be `id`, `tabs` | Laukai be atskiro lygmens. |
| Pasirinktinis lauko tipas, užregistruotas nustačius `translate` į `true` | Verčiamas tekstas, kaip ir `text` lauko atveju. |
| Visi kiti įtaisyti tipai | Nedeklaruojami. WPML nukopijuoja reikšmę nepakeistą. |

Blokas, kuriame nėra deklaruoto teksto lauko, gauna `translate="0"`. Tada WPML nukopijuoja visas jo reikšmes ir nepateikia jų versti. Jo `files` laukai vis tiek deklaruojami įraše, nes WPML konvertuoja priedų ID, nepaisydamas `translate` reikšmės. Įdėtiniai blokai verčiami kaip įprasta.

Nedeklaruojama:

- Laukai su `hidden`, nes redaktoriai jų reikšmių neįrašo.
- Laukai su `"translate": false`, žr. toliau.
- [pasirinktinių laukų tipų](https://blockstudio.dev/lt/docs/blocks/attributes/custom-field-types/) laukai, kurie neužregistruoti nustačius `translate` į `true`. Komanda pateikia įspėjimą dėl kiekvieno tokio lauko, nes tik lauko tipas žino, ar jo reikšmė yra tekstas. Aiškiai nustačius lauko `"translate": false`, šis įspėjimas taip pat nerodomas. Žr. toliau.
- Atributai, kuriuos blokas deklaruoja savo vietiniame `attributes`, o ne kaip Blockstudio laukus.
- Saugyklos raktai, kurių laukai yra skirtingų tipų, žr. toliau.

Deklaruojamas kiekvienas teksto laukas, įskaitant tokį, kuriame laikoma techninė reikšmė, pavyzdžiui, CSS klasė, nebent nurodyta `"translate": false`.

### Neįtraukti lauko

Teksto lauke gali būti reikšmė, kuri turi būti vienoda visomis kalbomis: paskyros vardas, el. pašto adresas, inkaro nuoroda ar CSS klasė. WPML pateikia ją versti kaip bet kurį kitą tekstą, o išversta reikšmė gali sugadinti bloką. Nustatykite `translate` į `false`, kad laukas nebūtų įtrauktas į konfigūraciją ir WPML nukopijuotų jo reikšmę į vertimą nepakeistą:

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

Jei naudojamas `group`, `tabs` arba `repeater`, `"translate": false` taikomas kiekvienam laukui, įskaitant įdėtinius konteinerius. Vaikinis elementas negali pakeisti šio nustatymo konteineryje, kuriam jis pritaikytas, naudodamas `"translate": true`. Jei tai `files` laukas, `false` neįtraukia ir priedų ID, todėl vertime paliekami pradiniai priedai.

Praleidus `translate` arba nustačius jį į `true`, išlaikoma esama elgsena: sprendimą priima lauko tipas. Tai neleidžia versti paslėptų laukų ar tokių reikšmių tipų kaip `select`. Parinktis taikoma blokų ir plėtinių laukams, neslepia ir neišjungia jų redaktoriaus valdiklių bei nekeičia išsaugotų reikšmių. Pakeitę nustatymą, dar kartą paleiskite `wp bs wpml config` ir atnaujinkite savo `wpml-config.xml` naudodami sugeneruotą konfigūraciją.

Kiekvieno rakto `label` yra lauko žyma, prieš kurią pateikiamos identifikatorių turinčių pirminių kartotuvų ir grupių žymos. WPML ją rodo kaip lauko pavadinimą vertimo redaktoriuje. Du `link` lauko raktai prie žymos prideda `Link text` ir `URL`. Šios priesagos išverčiamos į svetainės kalbą, todėl komandą paleiskite ta kalba, kuria dirba jūsų vertėjai.

### Pasirinktiniai laukų tipai

Lauko tipas, kuriame saugoma paprasta teksto eilutė, tai nurodo registruojant. Apraše nustatykite `translate` į `true`; tam reikia, kad `attribute` būtų `string`:

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

Tada komanda paskelbia visus to tipo laukus verčiamu tekstu. Laukas vis tiek gali nustatyti `"translate": false`, kad pats nebūtų įtrauktas. Jei ši parinktis nenurodyta, tipo laukai, kaip ir anksčiau, neįtraukiami ir apie juos pranešama.

### Pakeiskite etiketes

Laukų etiketės skirtos blokų redaktoriui ir gali turėti užuominų, pavyzdžiui, „Image (optional)“, kurios vertimo redaktoriuje nieko nereiškia. Filtras `blockstudio/wpml/config/label` gauna kiekvieną etiketę prieš ją įrašant, kartu su rakto kontekstu:

- `block`: bloko pavadinimas.
- `path`: lauko saugojimo kelias po `blockstudio.attributes`, su `*` lygiu kiekvienos kartotuvo eilutėms, pavyzdžiui, `cards/*/link`.
- `field`: lauko apibrėžtis.
- `parents`: išorinių kartotuvų ir grupių su ID etiketės.
- `part`: `text` teksto laukui, `title` arba `url` dviem nuorodos lauko raktams.

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

Grąžinkite tuščią eilutę, kad rakto etiketė nebūtų įtraukta; tuomet WPML vietoj jos rodo bloko etiketę. Jei grąžinama reikšmė nėra eilutė, paliekama pradinė etiketė. Pakeitę filtrą, paleiskite komandą dar kartą.

### Laukai su tuo pačiu saugojimo raktu

Dviejų laukų saugojimo raktas gali sutapti, pavyzdžiui, bloko lauko ir plėtinio lauko, turinčių tą patį `id`, arba grupės lauko `text`, kai grupės ID yra `cta`, ir lauko, kurio ID yra `cta_text`. Komanda tokį raktą paskelbia tik tada, kai aišku, kokie duomenys jame saugomi:

- Tarp bloko laukų, neįskaitant kartotuvo eilučių, Blockstudio kiekvienam saugojimo raktui registruoja po vieną atributą, todėl vėlesnis laukas pakeičia ankstesnį, nepaisant jo tipo. Bloko plėtinių laukai veikia taip pat: vėlesnis laukas arba vėliau užregistruoto plėtinio laukas pakeičia ankstesnį.
- Bloko laukas ir tokį patį raktą turintis plėtinio laukas abu lieka galioti. Bloko šablonas gauna reikšmę taip, kaip ją apibrėžia bloko laukas, o plėtinys pritaikomas pagal savo lauką. Raktas paskelbiamas vieną kartą, kai abiem laukams reikia to paties apibrėžimo: abu yra teksto laukai (`text`, `textarea`, `richtext` arba `wysiwyg`), abu yra nuorodos, abu yra `files` laukai (jei kuriam nors taikomas `multiple`, raktui priskiriamas `*` lygis) arba nė vienas nepaskelbiamas, pavyzdžiui, `select` ir `number`. Du kartotuvai lyginami pagal kiekvieną jų eilučių lauką. Etiketė imama iš bloko lauko.
- Du laukai, turintys tą patį `id` vieno kartotuvo eilutėse, taip pat abu lieka galioti ir lyginami tokiu pačiu būdu.

Kai tipai skiriasi, pavyzdžiui, bloke yra laukas `text`, o plėtinyje – `select`, saugoma reikšmė priklauso nuo ją įrašiusio valdiklio: tai gali būti tekstas arba pasirinkimo parinktis. Komanda rakto nepaskelbia ir parodo įspėjimą:

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

Pervadinkite vieną iš laukų arba abiem priskirkite tą patį tipą, kad raktas būtų paskelbtas.

## Nuolat atnaujinkite konfigūraciją

Pridėję, pašalinę ar pervadinę laukus, paleiskite komandą dar kartą ir įtraukite atnaujintą failą į temą arba įskiepį. Iš naujo sugeneruokite konfigūracijas, sukurtas iki 7.7.5, kad jose būtų priedų ID apibrėžtys. Turinys, sukurtas anksčiau, naujus laukus vertimui parodys atnaujinus jo originalą, kaip aprašyta pirmiau pateiktame WPML vadove.

Naudojant `--file`, komanda sukuria trūkstamą failą. Esamame faile ji pakeičia tik tekstą tarp `<!-- blockstudio:start -->` ir `<!-- blockstudio:end -->`, todėl kitos dalys ir kitų blokų įrašai lieka nepakeisti:

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

Jei norite naudoti esamą failą, kuriame dar nėra žymeklių, vieną kartą įterpkite abi žymeklių eilutes į jo `gutenberg-blocks` elementą arba pridėkite `gutenberg-blocks` elementą su žymekliais, jei faile tokio nėra. Jei žymeklių nėra arba rezultatas nebūtų tinkama konfigūracija, komanda failo nepakeičia ir baigiama pateikdama klaidą.

Nebereikia rankiniu būdu įrašytų Blockstudio blokų įrašų, pavyzdžiui, `translate="0"` įrašų, kurie paslepia technines reikšmes, kai sugeneruota dalis jau apima bloką. Komanda įspėja apie kiekvieną daugiau nei kartą paskelbtą bloką, todėl šiuos įrašus galima pašalinti.

## Paveikslėlių tekstai vertimo užduotyse

WPML į puslapio vertimo užduotį įtraukia jame naudojamų paveikslėlių tekstus: pavadinimą, alternatyvųjį tekstą, antraštę ir aprašą. Užbaigus užduotį, WPML įrašo išverstus tekstus į tikslinės kalbos priedą ir sukuria tą priedą, jei jo dar nėra. Žr. [Kaip versti mediją](https://wpml.org/documentation/translating-your-contents/media/).
WPML turinyje randa paveikslėlius, esančius `<img>` žymose, galerijose, pagrindiniame paveikslėlyje ir jai žinomuose blokuose. Blokas Blockstudio priedų ID saugo bloko komentare, todėl WPML jų neranda.

Kai aktyvi WPML, Blockstudio prie rastų paveikslėlių WPML prideda ir puslapio blokuose esančius priedus, kurių ID saugo jos laukai:

- `files` laukai, įskaitant paslėptus, ir `attributes` laukai su `media` – tie patys laukai, kuriuos blokų redaktorius įkelia kaip mediją.
- Grupėse, skirtukuose, kartotuvų eilutėse ir vidiniuose blokuose esantys laukai.
- [plėtinių](https://blockstudio.dev/lt/docs/extensions/) laukai, taip pat pagrindinių blokų ir kitų įskiepių blokų laukai, nes jų reikšmės saugomos išplėsto bloko atributuose.

Reikšmės, kurios nėra priedo ID, praleidžiamos. Nieko nereikia konfigūruoti, o `wpml-config.xml` nenaudojama. Jei neįjungta WPML, vertimo užduotims niekas nenuskaitoma, o medijos integravimo klasė neįkeliama.

Tai atskira funkcija nuo priedų ID konvertavimo: sugeneruotas XML nurodo WPML, kurį išverstą priedą pateikti, o ši integracija nurodo, kuriuos priedų tekstus įtraukti į vertimo užduotį. Eilučių nuorodos ir ne priedams priklausančių įrašų ID į medijos užduotis neįtraukiami. Išsaugotos įdėtųjų laukų reikšmės turi pirmenybę prieš aukščiausio lygio reikšmes blokuose Blockstudio, kaip ir pateikiant turinį.

Tekstai į užduotį įtraukiami tik tada, kai skiltyje WPML > Settings > Media Translation įjungta bent viena paveikslėlių teksto parinktis: „Automatically detect best options for translating image texts“ arba „Translate Media Library texts when translating content“, kaip ir pagrindinių blokų paveikslėlių atveju.

Blockstudio pateikia vaizdus per filtrą `wpml_ids_of_media_used_in_post`, kuris WPML taikomas įrašo laikmenoms `PostWithMediaFiles`. Jei norite neįtraukti vaizdo į užduotis, pašalinkite jo ID atgalinio iškvietimo funkcijoje, priskirtoje tam pačiam filtrui su didesniu nei 10 prioritetu:

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