
# WPML

WPML oversætter kun attributterne i en brugerdefineret blok, hvis sprogkonfigurationsfilen angiver dem. Blockstudio gemmer hver feltværdi i blokkommentaren under `blockstudio.attributes`, så hver blok skal have en post, der peger WPML på dens tekstfelter og tilknytnings-id'er. `wp bs wpml config`-kommandoen skriver disse poster for hver registreret blok.

## Hvorfor blokke har brug for en konfiguration

WPML læser konfigurationen fra en fil med navnet `wpml-config.xml` i rodmappen
for det aktive tema og hvert aktivt plugin. For et must-use-plugin, der består
af én fil, har mappen samme navn som filen uden `.php`. Se
[Sprogfiler til konfiguration](https://wpml.org/documentation/support/language-configuration-files/)
og [Gør brugerdefinerede Gutenberg blokke oversættelige](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/).

En blok uden en post overlades til WPMLs automatiske strengdetektion, som
tilbyder hver strengattribut i blokken til oversættelse. For en Blockstudio-blok,
der indeholder select-værdier, filreferencer, URL'er og CSS-klasser.
Oversættere ser disse tekniske værdier ved siden af den egentlige tekst, og en
oversat select-værdi eller klasse kan ødelægge blokken.

## Generér konfigurationen

Udskriv konfigurationen, og gem den i rodmappen for det tema eller plugin,
der leverer blokkene:

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

Eller lad kommandoen skrive filen:

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

En blok med et tekstfelt, et billede, et link og en repeater:

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

bliver til:

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

Værdien `style` er ikke deklareret, så WPML kopierer den uændret til
oversættelsen. ID'erne `gallery` og `image` kopieres også, og WPML erstatter
hver af dem med den vedhæftning, der hører til sidens sprog, når blokken
vises, så et oversat billede kan have sin egen alt-tekst. Se "Automatisk
konvertering af ID'er i blokke" i
[Gør brugerdefinerede Gutenberg blokke oversættelige](https://wpml.org/documentation/support/language-configuration-files/make-custom-gutenberg-blocks-translatable/).
Når en vedhæftning ikke har en oversættelse, beholder WPML det oprindelige ID.

## Hvad der deklareres

Kommandoen læser de registrerede blokke, efter at `custom/`-felter og blokfelter
er blevet udfoldet, og tilsidesættelser og attributfiltre er anvendt. Felter,
som [udvidelser](https://blockstudio.dev/da/docs/extensions/) føjer til en Blockstudio-blok, medtages. Felter,
som udvidelser føjer til kerneblokke eller blokke fra andre plugins, medtages
ikke, fordi disse blokke får deres konfiguration fra WPML eller deres eget plugin.

| Felt | Deklaration |
| --- | --- |
| `text`, `textarea`, `richtext`, `wysiwyg` | Oversættelig tekst. |
| `link` | `title` som tekst og `url` med `type="link"`, så WPML erstatter et link med dets oversættelse, når en sådan er tilgængelig. |
| `files` | Det gemte vedhæftnings-ID med `type="post-ids"` og `sub-type="attachment"`. Med `multiple` et niveau med navnet `*` for listen, som også matcher det enkelte ID, feltet gemmer, når der er valgt én fil. |
| `repeater` | Et niveau med navnet `*`, der matcher hver række, med deklarationerne for rækkens felter. Indlejrede repeatere fungerer på samme måde. |
| `group` med en `id` | Gruppens felter med gruppe-ID'et som nøglepræfiks (`cta_text` for feltet `text` i gruppen `cta`). |
| `group` uden en `id`, `tabs` | Felterne uden deres eget niveau. |
| Brugerdefineret felttype registreret med `translate` sat til `true` | Oversættelig tekst, ligesom et `text`-felt. |
| Alle andre indbyggede typer | Ikke deklareret. WPML kopierer værdien uændret. |

En blok uden et deklareret tekstfelt får `translate="0"`. WPML kopierer derefter
alle dens værdier og gør ingen af dem tilgængelige for oversættelse. Dens `files`-
felter deklareres stadig i posten, fordi WPML konverterer vedhæftnings-ID'er,
uanset hvad `translate` angiver. Indre blokke oversættes som normalt.

Ikke deklareret:

- Felter med `hidden`, fordi deres værdier ikke skrives af redaktører.
- Felter med `"translate": false`, se nedenfor.
- Felter med [brugerdefinerede felttyper](https://blockstudio.dev/da/docs/blocks/attributes/custom-field-types/),
  der ikke er registreret med `translate` sat til `true`. Kommandoen udskriver en
  advarsel for hver af dem, fordi kun felttypen ved, om dens værdi indeholder
  tekst. En eksplicit `"translate": false` på et felt undertrykker også denne
  advarsel for det pågældende felt. Se nedenfor.
- Attributter, som en blok deklarerer i sin oprindelige `attributes` i stedet for som
  Blockstudio-felter.
- Lager-nøgler, hvis felter har forskellige typer, se nedenfor.

Alle tekstfelter deklareres, også felter med tekniske værdier såsom en CSS-klasse, medmindre feltet angiver `"translate": false`.

### Udelad et felt

Et tekstfelt kan indeholde en værdi, der skal være den samme på alle sprog: et
kontonavn, en e-mailadresse, et anker eller en CSS-klasse. WPML gør feltet
tilgængeligt for oversættelse som enhver anden tekst, og en oversat værdi kan
ødelægge blokken. Sæt `translate` til `false` for at udelade feltet fra
konfigurationen, så WPML kopierer dets værdi uændret til oversættelsen:

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

På en `group`, `tabs` eller `repeater` gælder `"translate": false` for hvert
felt indeni, også indlejrede beholdere. Et underordnet felt kan ikke tilsidesætte
en udeladt beholder med `"translate": true`. På et `files`-felt udelader `false` også
vedhæftnings-ID'erne, så oversættelsen bevarer de oprindelige vedhæftninger.

Hvis `translate` udelades eller sættes til `true`, bevares den eksisterende
adfærd: felttypen bestemmer. Det gør ikke skjulte felter eller værdityper som
`select` oversættelige. Indstillingen gælder for blok- og udvidelsesfelter,
skjuler eller deaktiverer ikke deres redigeringskontroller og ændrer ikke deres
gemte værdier. Kør `wp bs wpml config` igen, når indstillingen er ændret, og opdatér
din `wpml-config.xml` med den genererede konfiguration.

`label` for hver nøgle er feltetiketten, efterfulgt af etiketterne for de
omgivende repeatere og grupper med et ID. WPML viser den som feltnavn i
oversættelseseditoren. De to nøgler for et `link`-felt føjer `Link text` og
`URL` til etiketten. Disse suffikser oversættes til webstedets sprog, så
kør kommandoen med det sprog, dine oversættere arbejder på.

### Brugerdefinerede felttyper

En felttype, der gemmer en almindelig tekststreng, angiver dette ved
registreringen. Sæt `translate` til `true` i definitionen, hvilket kræver, at
`attribute` er `string`:

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

Kommandoen erklærer derefter alle felter af den pågældende type som tekst, der skal oversættes. Et felt kan stadig indstille `"translate": false` til at blive udeladt. Uden indstillingen udelades felterne af typen og rapporteres som før.

### Skift etiketterne

Feltetiketter er skrevet til blokeditoren og kan indeholde hints som "Image (optional)", der ikke giver mening i oversættelseseditoren. Filteret `blockstudio/wpml/config/label` modtager hver etiket, før den skrives, sammen med konteksten for nøglen:

- `block`: bloknavnet.
- `path`: feltets lagersti under `blockstudio.attributes`, med et niveau `*` for rækkerne i hver gentager, for eksempel `cards/*/link`.
- `field`: feltdefinitionen.
- `parents`: etiketterne for de omgivende gentagere og grupper med et ID.
- `part`: `text` for et tekstfelt, `title` eller `url` for de to nøgler i et linkfelt.

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

Returnér en tom streng for at udelade etiketten for en nøgle, så WPML i stedet viser blokkens etiket. En returværdi, der ikke er en streng, bevarer den oprindelige etiket. Kør kommandoen igen, når du har ændret filteret.

### Felter med samme lagernøgle

To felter kan ende med samme lagernøgle, for eksempel et blokfelt og et udvidelsesfelt med samme `id`, eller feltet `text` i en gruppe med ID'et `cta` og et felt med ID'et `cta_text`. Kommandoen erklærer kun en sådan nøgle, når det er klart, hvad der gemmes dér:

- Blandt blokkens felter uden for gentagerrækker registrerer Blockstudio én attribut pr. lagernøgle, så et senere felt erstatter et tidligere, uanset type. Felterne i blokkens udvidelser fungerer på samme måde: Et senere felt eller et felt fra en senere registreret udvidelse erstatter et tidligere.
- Et blokfelt og et udvidelsesfelt med samme nøgle er begge aktive. Blokskabelonen modtager værdien, som defineret af blokkens felt, mens udvidelsen anvendes med sit eget felt. Nøglen erklæres én gang, når begge felter kræver samme erklæring: Begge er tekstfelter (`text`, `textarea`, `richtext` eller `wysiwyg`), begge er links, begge er felter af typen `files` (med `multiple` på en af dem får nøglen niveauet `*`), eller ingen af dem erklæres, f.eks. et `select` og et `number`. To gentagere sammenlignes felt for felt i deres rækker. Etiketten kommer fra blokkens felt.
- To felter med samme `id` i rækkerne i én gentager forbliver også begge aktive og sammenlignes på samme måde.

Når typerne er forskellige, f.eks. et `text`-felt i blokken og et `select` i en udvidelse, er den gemte værdi tekst eller en valgmulighed afhængigt af den kontrol, der skrev den. Kommandoen erklærer ikke nøglen og viser en advarsel:

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

Omdøb et af felterne, eller giv dem begge samme type, så nøglen bliver erklæret.

## Hold konfigurationen opdateret

Kør kommandoen igen, når du tilføjer, fjerner eller omdøber felter, og medtag den opdaterede fil i temaet eller pluginnet. Generér konfigurationer, der er lavet før 7.7.5, igen for at medtage erklæringer for vedhæftnings-ID'er. Indhold, der fandtes i forvejen, viser nye felter til oversættelse, når dets original opdateres, som beskrevet i guiden WPML ovenfor.

Med `--file` opretter kommandoen en manglende fil. I en eksisterende fil erstatter den kun teksten mellem `<!-- blockstudio:start -->` og `<!-- blockstudio:end -->`, så andre sektioner og poster for andre blokke forbliver uændrede:

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

Hvis du vil bruge en eksisterende fil uden markører, skal du tilføje de to markeringslinjer én gang i dens `gutenberg-blocks`-element eller tilføje et `gutenberg-blocks`-element med markørerne, hvis filen ikke har et. Uden markørerne, eller hvis resultatet ikke ville være en gyldig konfiguration, lader kommandoen filen være uændret og afslutter med en fejl.

Poster for Blockstudio-blokke, der er skrevet manuelt, f.eks. poster af typen `translate="0"`, som skjuler tekniske værdier, er ikke længere nødvendige, når den genererede sektion dækker blokken. Kommandoen advarer om hver blok, der er erklæret mere end én gang, så disse poster kan fjernes.

## Billedtekster i oversættelsesjob

WPML føjer teksterne fra de billeder, en side bruger, til sidens oversættelsesjob: titel, alt-tekst, billedtekst og beskrivelse. Når jobbet er fuldført, skriver WPML de oversatte tekster til vedhæftningen på målsproget og opretter vedhæftningen, hvis den ikke allerede findes. Se [Sådan oversætter du medier](https://wpml.org/documentation/translating-your-contents/media/).
WPML finder billederne i `<img>`-tags i indholdet, i gallerier, i det fremhævede billede og i de blokke, den kender. En Blockstudio-blok gemmer vedhæftnings-ID'er i blokkens kommentar, så WPML finder ingen af dem.

Når WPML er aktiv, føjer Blockstudio de vedhæftninger, som dens felter gemmer i en sides blokke, til de billeder, der findes med WPML:

- `files`-felter, herunder skjulte, og `attributes`-felter med `media`, de samme felter, som blokeditoren indlæser som medier.
- Felter i grupper, faner, gentagerrækker og indre blokke.
- Felter i [udvidelser](https://blockstudio.dev/da/docs/extensions/), også på kerneblokke og blokke fra andre plugins, fordi deres værdier gemmes i attributterne for den udvidede blok.

Værdier, der ikke er ID'er for en vedhæftning, udelades. Der er ikke noget, der skal konfigureres, og `wpml-config.xml` er ikke involveret. Uden WPML scannes intet til oversættelsesjob, og medieintegrationsklassen indlæses ikke.

Dette er adskilt fra konvertering af vedhæftnings-ID'er: Den genererede XML fortæller WPML, hvilken oversat vedhæftning der skal vises, mens denne integration fortæller den, hvilke vedhæftningstekster der skal med i et oversættelsesjob. Strengreferencer og ID'er for indlæg, der ikke er vedhæftninger, føjes ikke til mediejob. Gemte indlejrede feltværdier har forrang frem for værdier på øverste niveau i Blockstudio-blokke, som ved visning.

Teksterne indgår kun i jobbet, når en af billedtekstindstillingerne under WPML > Settings > Media Translation er aktiveret: "Automatically detect best options for translating image texts" eller "Translate Media Library texts when translating content", ligesom for billeder i kerneblokke.

Blockstudio rapporterer billederne via filteret
`wpml_ids_of_media_used_in_post`, som WPML anvendes på et indlægs medier i
`PostWithMediaFiles`. Hvis et billede skal udelades fra opgaverne, skal du fjerne dets ID i et
callback på det samme filter med en prioritet over 10:

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