Gå til indhold

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 og Gør brugerdefinerede Gutenberg blokke oversættelige.

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:

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

Eller lad kommandoen skrive filen:

Shell
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
{
  "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
<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. 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 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, 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
{
  "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
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
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:

Shell
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
<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. 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, 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
);