
# WPML

WPML prekladá atribúty vlastného bloku iba v rozsahu, ktorý deklaruje jazykový konfiguračný súbor. Blockstudio ukladá každú hodnotu poľa do komentára bloku pod `blockstudio.attributes`, takže každý blok potrebuje záznam, ktorý nasmeruje WPML na jeho textové polia a ID príloh. Príkaz `wp bs wpml config` vytvorí tieto záznamy pre každý registrovaný blok.

## Prečo bloky potrebujú konfiguráciu

WPML načíta konfiguráciu zo súboru s názvom `wpml-config.xml` v koreňovom
priečinku aktívnej témy a každého aktívneho doplnku. Pri jedno-súborovom povinnom
plugine sa priečinok volá rovnako ako súbor bez `.php`. Pozrite si
[Súbory konfigurácie jazykov](https://wpml.org/documentation/support/language-configuration-files/)
a [Preklady vlastných blokov Gutenberg](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/).

Blok bez záznamu ponecháva WPML automatickému rozpoznávaniu reťazcov, ktoré
ponúka na preklad každý reťazcový atribút bloku. Pri bloku Blockstudio
obsahuje aj hodnoty výberov, odkazy na súbory, URL a triedy CSS.
Prekladatelia tak vidia tieto technické hodnoty vedľa skutočného textu a preložená
hodnota výberu alebo trieda môže blok poškodiť.

## Vygenerovanie konfigurácie

Vypíšte konfiguráciu a uložte ju do koreňového priečinka témy alebo doplnku,
ktorý obsahuje bloky:

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

Alebo nechajte príkaz vytvoriť súbor:

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

Blok s textovým poľom, obrázkom, odkazom a opakovačom:

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

sa zmení na:

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

Hodnota `style` nie je deklarovaná, preto ju WPML skopíruje do prekladu
bez zmien. Skopírujú sa aj identifikátory `gallery` a `image` a WPML pri
vykreslení bloku nahradí každý z nich prílohou v jazyku stránky. Preložený obrázok
tak môže mať vlastný alternatívny text. Pozrite si časť „Automatická konverzia
identifikátorov v blokoch“ v dokumente
[Preklady vlastných blokov Gutenberg](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/).
Ak príloha nemá preklad, WPML ponechá pôvodný identifikátor.

## Čo sa deklaruje

Príkaz načíta zaregistrované bloky po rozšírení polí `custom/` a polí blokov
a po použití prepísaní a filtrov atribútov. Zahrnuté sú polia, ktoré [rozšírenia](https://blockstudio.dev/sk/docs/extensions/) pridajú do bloku Blockstudio. Polia, ktoré rozšírenia pridajú do jadrových blokov alebo blokov iných doplnkov, zahrnuté nie sú, pretože tieto bloky získavajú konfiguráciu z WPML alebo z vlastného doplnku.

| Pole | Deklarácia |
| --- | --- |
| `text`, `textarea`, `richtext`, `wysiwyg` | Preložiteľný text. |
| `link` | `title` ako text a `url` s `type="link"`, aby WPML nahradil odkaz jeho prekladom, ak je dostupný. |
| `files` | Uložený identifikátor prílohy s `type="post-ids"` a `sub-type="attachment"`. Pri `multiple` sa pre zoznam použije úroveň s názvom `*`, ktorá zodpovedá aj jedinému identifikátoru uloženému po výbere jedného súboru. |
| `repeater` | Úroveň s názvom `*` zodpovedá každému riadku a obsahuje deklarácie polí daného riadka. Vnorené opakovače fungujú rovnako. |
| `group` s `id` | Polia skupiny s ID skupiny ako predponou kľúča (`cta_text` pre pole `text` v skupine `cta`). |
| `group` bez `id`, `tabs` | Polia bez vlastnej úrovne. |
| Vlastný typ poľa zaregistrovaný s `translate` nastaveným na `true` | Preložiteľný text, ako pri poli `text`. |
| Každý iný vstavaný typ | Nie je deklarovaný. WPML skopíruje hodnotu bez zmien. |

Blok bez deklarovaného textového poľa dostane `translate="0"`. WPML potom skopíruje
všetky jeho hodnoty a neponúkne z neho nič na preklad. Jeho polia `files`
sú v zázname stále deklarované, pretože WPML konvertuje identifikátory príloh
bez ohľadu na to, čo určuje `translate`. Vnorené bloky sa prekladajú ako zvyčajne.

Nedeklarujú sa:

- Polia s `hidden`, pretože ich hodnoty nezapisujú editory.
- Polia s `"translate": false`, pozrite nižšie.
- Polia [vlastných typov polí](https://blockstudio.dev/sk/docs/blocks/attributes/custom-field-types/),
  ktoré nie sú zaregistrované s `translate` nastaveným na `true`. Príkaz pri každom
  vypíše upozornenie, pretože len typ poľa vie, či jeho hodnota obsahuje text.
  Výslovné nastavenie `"translate": false` pre pole toto upozornenie potlačí. Pozrite nižšie.
- Atribúty, ktoré blok deklaruje vo svojom natívnom `attributes` namiesto v poliach
  Blockstudio.
- Kľúče úložiska, ktorých polia majú odlišné typy, pozrite nižšie.

Deklaruje sa každé textové pole vrátane polí s technickou hodnotou, napríklad
triedou CSS, pokiaľ nenastaví `"translate": false`.

### Vynechanie poľa

Textové pole môže obsahovať hodnotu, ktorá musí byť rovnaká vo všetkých
jazykoch: názov účtu, e-mailovú adresu, kotvu alebo triedu CSS. WPML ju
ponúkne na preklad ako každý iný text a preložená hodnota môže blok poškodiť.
Nastavte `translate` na `false`, aby sa pole vynechalo z konfigurácie a
WPML skopírovalo jeho hodnotu do prekladu bez zmien:

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

Pri `group`, `tabs` alebo `repeater` sa nastavenie `"translate": false` uplatní na každé
vnútorné pole vrátane vnorených kontajnerov. Podradené pole nemôže prepísať
nastavenie kontajnera vyňatého z prekladu pomocou `"translate": true`. Pri poli `files`
`false` vynechá aj identifikátory príloh, takže preklad zachová pôvodné prílohy.

Vynechanie `translate` alebo nastavenie na `true` zachová existujúce správanie:
o rozhodnutí rozhoduje typ poľa. Skryté polia ani typy hodnôt, ako napríklad
`select`, sa tým nestanú preložiteľnými. Nastavenie sa uplatní na polia blokov a
rozšírení, neskryje ani nevypne ovládacie prvky v editore a nezmení uložené
hodnoty. Po zmene nastavenia znova spustite `wp bs wpml config` a aktualizujte svoj
`wpml-config.xml` vygenerovanou konfiguráciou.

`label` každého kľúča tvorí názov poľa, pred ktorým sú názvy nadradených
opakovačov a skupín s ID. WPML ho zobrazuje ako názov poľa v editore prekladov.
Dva kľúče poľa `link` pridávajú do názvu `Link text` a `URL`. Tieto prípony
sa prekladajú do jazyka stránky, preto príkaz spustite v jazyku, v ktorom pracujú
vaši prekladatelia.

### Vlastné typy polí

Typ poľa, ktorý ukladá obyčajný textový reťazec, to oznámi pri registrácii.
V definícii nastavte `translate` na `true`; na to treba, aby `attribute` malo
hodnotu `string`:

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

Príkaz potom označí každé pole daného typu ako prekladateľný text. Pole sa môže stále nastavením `"translate": false` z prekladu vynechať. Bez tejto možnosti sa polia daného typu vynechajú a nahlásia ako predtým.

### Zmena označení

Označenia polí sú určené pre editor blokov a môžu obsahovať pokyny, napríklad „Obrázok (voliteľné)“, ktoré v editore prekladov nemajú význam. Filter `blockstudio/wpml/config/label` dostane každé označenie ešte pred jeho zápisom spolu s kontextom kľúča:

- `block`: názov bloku.
- `path`: cesta úložiska poľa pod `blockstudio.attributes` s úrovňou `*` pre riadky každého opakovača, napríklad `cards/*/link`.
- `field`: definícia poľa.
- `parents`: označenia nadradených opakovačov a skupín s ID.
- `part`: `text` pre textové pole, `title` alebo `url` pre dva kľúče poľa odkazu.

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

Vrátením prázdneho reťazca vynecháte označenie kľúča, takže WPML namiesto neho zobrazí označenie bloku. Ak návratová hodnota nie je reťazec, zachová sa pôvodné označenie. Po zmene filtra spustite príkaz znova.

### Polia s rovnakým kľúčom úložiska

Dve polia môžu mať rovnaký kľúč úložiska, napríklad pole bloku a pole rozšírenia s rovnakým `id` alebo pole `text` v skupine s ID `cta` a pole s ID `cta_text`. Príkaz takýto kľúč deklaruje iba vtedy, keď je jasné, čo sa v ňom ukladá:

- Medzi poľami bloku mimo riadkov opakovača Blockstudio registruje jeden atribút pre každý kľúč úložiska. Neskoršie pole tak nahradí skoršie bez ohľadu na jeho typ. Rovnako to funguje aj pri rozšíreniach bloku: neskoršie pole alebo pole neskôr zaregistrovaného rozšírenia nahradí skoršie.
- Pole bloku aj pole rozšírenia s rovnakým kľúčom zostávajú účinné. Šablóna bloku dostane hodnotu podľa definície poľa bloku, zatiaľ čo rozšírenie sa použije s vlastným poľom. Kľúč sa deklaruje raz, ak obe polia vyžadujú rovnakú deklaráciu: obe sú textové polia (`text`, `textarea`, `richtext` alebo `wysiwyg`), obe sú odkazy, obe sú polia `files` (s `multiple` na ktoromkoľvek z nich má kľúč úroveň `*`) alebo nie je deklarované ani jedno, napríklad `select` a `number`. Dva opakovače sa porovnávajú po jednotlivých poliach v ich riadkoch. Označenie sa preberá z poľa bloku.
- Aj dve polia s rovnakým `id` v riadkoch jedného opakovača zostávajú účinné a porovnávajú sa rovnakým spôsobom.

Ak sa typy líšia, napríklad pole `text` v bloku a pole `select` v rozšírení, uložená hodnota je text alebo možnosť výberu podľa ovládacieho prvku, ktorý ju zapísal. Príkaz kľúč nedeklaruje a vypíše upozornenie:

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

Premenujte jedno z polí alebo obom nastavte rovnaký typ, aby sa kľúč deklaroval.

## Udržujte konfiguráciu aktuálnu

Po pridaní, odstránení alebo premenovaní polí spustite príkaz znova a aktualizovaný súbor pribaľte k téme alebo doplnku. Konfigurácie vytvorené pred 7.7.5 vygenerujte znova, aby obsahovali deklarácie ID príloh. V obsahu vytvorenom skôr sa nové polia zobrazia na preklad až po aktualizácii originálu, ako je opísané vyššie v návode WPML.

Pomocou `--file` príkaz vytvorí chýbajúci súbor. V existujúcom súbore nahradí iba text medzi `<!-- blockstudio:start -->` a `<!-- blockstudio:end -->`, takže ostatné časti a záznamy pre ďalšie bloky zostanú zachované:

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

Ak chcete použiť existujúci súbor, ktorý ešte nemá značky, pridajte tieto dva riadky so značkami raz dovnútra jeho prvku `gutenberg-blocks` alebo pridajte prvok `gutenberg-blocks` aj so značkami, ak súbor žiadny nemá. Bez značiek alebo ak by výsledok nebol platnou konfiguráciou príkaz súbor nezmení a skončí s chybou.

Záznamy pre bloky Blockstudio pridané ručne, napríklad záznamy `translate="0"`, ktoré skrývajú technické hodnoty, už nie sú potrebné, keď vygenerovaná časť pokrýva daný blok. Príkaz upozorní na každý blok deklarovaný viac než raz, takže tieto záznamy možno odstrániť.

## Texty obrázkov v úlohách prekladu

WPML pridáva texty obrázkov použitých na stránke do úlohy prekladu danej stránky: názov, alternatívny text, popis a opis. Po dokončení úlohy WPML zapíše preložené texty do prílohy v cieľovom jazyku a vytvorí ju, ak ešte neexistuje. Pozrite si [Ako prekladať médiá](https://wpml.org/documentation/translating-your-contents/media/).
WPML vyhľadáva obrázky v značkách `<img>` v obsahu, v galériách, v náhľadovom obrázku a v blokoch, ktoré pozná. Blok Blockstudio ukladá ID príloh do komentára bloku, preto ich WPML nenájde.

Keď je aktívne WPML, Blockstudio pridá medzi nájdené obrázky aj prílohy, ktorých ID sú uložené v poliach blokov stránky WPML:

- Polia `files` vrátane skrytých a polia `attributes` s `media`; ide o tie isté polia, ktoré editor blokov načítava ako médiá.
- Polia v skupinách, kartách, riadkoch opakovačov a vnorených blokoch.
- Polia [rozšírení](https://blockstudio.dev/sk/docs/extensions/) vrátane polí v základných blokoch a blokoch iných doplnkov, pretože ich hodnoty sa ukladajú do atribútov rozšíreného bloku.

Hodnoty, ktoré nie sú ID prílohy, sa vynechajú. Nie je potrebné nič konfigurovať a `wpml-config.xml` sa nepoužíva. Bez WPML sa nič neskenuje pre úlohy prekladu a trieda integrácie médií sa nenačíta.

Ide o samostatnú funkciu od konverzie ID príloh: vygenerovaný XML informuje WPML, ktorú preloženú prílohu má vykresliť, zatiaľ čo táto integrácia určuje, ktoré texty prílohy sa majú zahrnúť do úlohy prekladu. Odkazy na reťazce a ID príspevkov, ktoré nie sú prílohami, sa do úloh prekladu médií nepridávajú. Uložené hodnoty vnorených polí majú pri blokoch Blockstudio prednosť pred hodnotami najvyššej úrovne, rovnako ako pri vykresľovaní.

Texty sú súčasťou úlohy iba vtedy, keď je povolená jedna z možností pre text obrázka v časti WPML > Nastavenia > Preklad médií: „Automaticky určiť najlepšie možnosti pre preklad textov obrázkov“ alebo „Prekladať texty knižnice médií pri preklade obsahu“, rovnako ako pri obrázkoch v základných blokoch.

Blockstudio vracia obrázky cez filter
`wpml_ids_of_media_used_in_post`, ktorý WPML sa použije na médiá príspevku v
`PostWithMediaFiles`. Ak chcete obrázok vynechať z úloh, odstráňte jeho ID v
callbacku na rovnakom filtri s prioritou vyššou ako 10:

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