Към съдържанието

WPML

WPML превежда атрибутите на персонализиран блок само доколкото са декларирани във файл с езикова конфигурация. Blockstudio съхранява стойността на всяко поле в коментара на блока под blockstudio.attributes, затова всеки блок се нуждае от запис, който насочва WPML към текстовите му полета и идентификаторите на прикачените файлове. Командата wp bs wpml config записва тези записи за всеки регистриран блок.

Защо блоковете се нуждаят от конфигурация

WPML прочита конфигурацията от файл с име wpml-config.xml в основната папка на активната тема и на всеки активен плъгин. При плъгин за задължително зареждане, който е един файл, папката носи името на файла без .php. Вижте Файлове за езикова конфигурация и Направете блоковете Gutenberg преводими.

Блок без запис се оставя на автоматичното откриване на низове на WPML, което предлага за превод всеки низов атрибут на блока. За блок Blockstudio, който включва стойности за избор, препратки към файлове, URL адреси и класове CSS. Преводачите виждат тези технически стойности до същинския текст, а преведена стойност за избор или клас може да повреди блока.

Генериране на конфигурацията

Изведете конфигурацията и я запазете в основната папка на темата или плъгина, който предоставя блоковете:

Обвивка
wp bs wpml config > wp-content/themes/my-theme/wpml-config.xml

Или оставете командата да запише файла:

Обвивка
wp bs wpml config --file=wp-content/themes/my-theme/wpml-config.xml

Блок с текстово поле, изображение, връзка и повтаряща се секция:

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

става:

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>

Стойността style не е декларирана, затова WPML я копира в превода без промяна. Идентификаторите gallery и image също се копират, а WPML заменя всеки от тях с прикачения файл за езика на страницата при визуализиране на блока, така че преведеното изображение може да има собствен алтернативен текст. Вижте „Автоматично преобразуване на идентификатори в блокове“ в Направете блоковете Gutenberg преводими. Когато няма превод на прикачения файл, WPML запазва оригиналния идентификатор.

Какво се декларира

Командата прочита регистрираните блокове, след като полетата custom/ и полетата на блоковете са разширени и са приложени заместванията и филтрите за атрибути. Полетата, които разширения добавят към блок, се включват. Полетата, които разширенията добавят към основните блокове или към блокове на други разширения, не се включват, защото тези блокове получават конфигурацията си от Blockstudio или от собственото си разширение. WPML

Поле Декларация
text, textarea, richtext, wysiwyg Преводим текст.
link title като текст и url с type="link", така че WPML заменя връзката с превода ѝ, когато такъв е наличен.
files Запаметеният идентификатор на прикачения файл с type="post-ids" и sub-type="attachment". С multiple — ниво с име * за списъка, което съответства и на единичния идентификатор, съхраняван от полето при избран един файл.
repeater Ниво с име *, което съответства на всеки ред, с декларациите на полетата в реда. Вложените повтарящи се секции работят по същия начин.
group с id Полетата на групата, като идентификаторът на групата е префикс на ключа (cta_text за полето text в групата cta).
group без id, tabs Полетата без собствено ниво.
Персонализиран тип поле, регистриран с translate, зададено на true Преводим текст, като поле text.
Всеки друг вграден тип Не се декларира. WPML копира стойността без промяна.

Блок без декларирано текстово поле получава translate="0". След това WPML копира всички негови стойности и не предлага нищо от него за превод. Полетата му files все пак се декларират в записа, защото WPML преобразува идентификаторите на прикачени файлове независимо от стойността на translate. Вътрешните блокове се превеждат както обикновено.

Не се декларират:

  • Полета с hidden, защото редакторите не записват стойностите им.
  • Полета с "translate": false, вижте по-долу.
  • Полета от персонализирани типове полета, които не са регистрирани с translate, зададено на true. Командата извежда предупреждение за всяко от тях, защото само типът на полето знае дали стойността му съдържа текст. Изрично зададено "translate": false за поле също потиска това предупреждение за него. Вижте по-долу.
  • Атрибути, които блокът декларира в собствения си attributes, вместо като полета Blockstudio.
  • Ключове за съхранение, чиито полета са от различни типове; вижте по-долу.

Декларира се всяко текстово поле, включително такова, което съдържа техническа стойност, като клас CSS, освен ако не задава "translate": false.

Пропускане на поле

Текстовото поле може да съдържа стойност, която трябва да е еднаква на всички езици: име на акаунт, имейл адрес, котва или клас CSS. WPML го предлага за превод като всеки друг текст и преведената стойност може да повреди блока. Задайте translate на false, за да пропуснете полето от конфигурацията, така че WPML да копира стойността му в превода без промяна:

JSON
{
  "id": "account",
  "type": "text",
  "label": "Account handle",
  "translate": false
}

При group, tabs или repeater "translate": false се прилага към всяко вътрешно поле, включително във вложени контейнери. Дъщерен елемент не може да отмени пропускането на контейнер с "translate": true. При поле files false пропуска и идентификаторите на прикачените файлове, така че преводът запазва оригиналните прикачени файлове.

Пропускането на translate или задаването му на true запазва досегашното поведение: типът на полето определя какво да се прави. Това не прави скритите полета или типове стойности като select преводими. Опцията важи за полета на блокове и разширения, не скрива и не деактивира контролите им в редактора и не променя съхранените им стойности. Изпълнете отново wp bs wpml config след промяна на настройката и актуализирайте своя wpml-config.xml с генерираната конфигурация.

label на всеки ключ е етикетът на полето, предшестван от етикетите на съдържащите го повтарящи се секции и групи с идентификатор. WPML го показва като име на поле в редактора за превод. Двата ключа на поле link добавят Link text и URL към етикета. Тези наставки се превеждат на езика на сайта, затова изпълнете командата с локала, на който работят преводачите ви.

Персонализирани типове полета

Тип поле, който съхранява обикновен текстов низ, указва това при регистрацията. Задайте translate на true в определението, което изисква attribute да бъде string:

PHP
bs_register_field_type('acme/headline', [
  'attribute' => 'string',
  'translate' => true,
]);

След това командата декларира всяко поле от този тип като текст за превод. Едно поле все пак може да зададе "translate": false, за да бъде изключено. Без тази опция полетата от типа се изключват и се съобщават, както досега.

Променете етикетите

Етикетите на полетата са предназначени за редактора на блокове и може да съдържат подсказки като „Изображение (по избор)“, които нямат смисъл в редактора за преводи. Филтърът blockstudio/wpml/config/label получава всеки етикет преди записването му, заедно с контекста на ключа:

  • block: името на блока.
  • path: пътят за съхранение на полето под blockstudio.attributes, с ниво * за редовете на всеки повторител, например cards/*/link.
  • field: дефиницията на полето.
  • parents: етикетите на обхващащите повторители и групи с идентификатор.
  • part: text за текстово поле, title или url за двата ключа на поле за връзка.
PHP
add_filter('blockstudio/wpml/config/label', function ($label, $context) {
  return str_replace(' (optional)', '', $label);
}, 10, 2);

Върнете празен низ, за да изключите етикета на даден ключ, така че WPML да показва етикета на блока. Върната стойност, която не е низ, запазва първоначалния етикет. Изпълнете командата отново след промяна на филтъра.

Полета с един и същ ключ за съхранение

Две полета може да имат един и същ ключ за съхранение, например поле на блок и поле на разширение със същото id или полето text в група с идентификатор cta и поле с идентификатор cta_text. Командата декларира такъв ключ само когато е ясно какво се съхранява в него:

  • Сред полетата на даден блок, извън редовете на повторители, Blockstudio регистрира по един атрибут за всеки ключ за съхранение, така че по-късно поле заменя по-ранно, независимо от типа му. Полетата на разширенията на блок работят по същия начин: по-късно поле или поле от разширение, регистрирано по-късно, заменя по-ранното.
  • Поле на блок и поле на разширение с един и същ ключ остават активни и двете. Шаблонът на блока получава стойността според дефиницията на полето на блока, а разширението се прилага със собственото си поле. Ключът се декларира веднъж, когато и двете полета изискват една и съща декларация: и двете са текстови полета (text, textarea, richtext или wysiwyg), и двете са връзки, и двете са полета files (с multiple при което и да е от тях ключът получава нивото *) или нито едно не се декларира, например select и number. Два повторителя се сравняват поле по поле в редовете им. Етикетът идва от полето на блока.
  • Две полета с един и същ id в редовете на един повторител също остават активни и се сравняват по същия начин.

Когато типовете се различават, например поле text в блока и select в разширение, съхранената стойност е текст или избрана опция според контролата, която я е записала. Командата не декларира ключа и извежда предупреждение:

Обвивка
Warning: Not declared, the fields that store this key have different types: my-theme/cards: tone (text in the block, select in an extension)

Преименувайте едно от полетата или задайте един и същ тип и на двете, за да бъде деклариран ключът.

Поддържайте конфигурацията актуална

Изпълнете командата отново след добавяне, премахване или преименуване на полета и включете актуализирания файл в темата или разширението. Генерирайте отново конфигурациите, създадени преди 7.7.5, за да включите декларациите за ID на прикачени файлове. В съдържание, създадено преди това, новите полета се показват за превод, след като бъде актуализиран оригиналът, както е описано в ръководството WPML по-горе.

С --file командата създава липсващ файл. В съществуващ файл тя заменя само текста между <!-- blockstudio:start --> и <!-- blockstudio:end -->, така че останалите раздели и записите за други блокове остават непроменени:

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>

За да използвате съществуващ файл без маркери, добавете двата реда с маркери веднъж в елемента му gutenberg-blocks или добавете елемент gutenberg-blocks с маркерите, ако файлът няма такъв. Без маркерите или ако резултатът не е валидна конфигурация, командата оставя файла непроменен и завършва с грешка.

Записите за блокове Blockstudio, добавени ръчно, например записи translate="0", които скриват технически стойности, вече не са необходими, след като генерираният раздел обхване блока. Командата предупреждава за всеки блок, деклариран повече от веднъж, за да могат тези записи да бъдат премахнати.

Текстове на изображения в задачи за превод

WPML добавя текстовете на изображенията, използвани от дадена страница, към задачата за превод на страницата: заглавие, алтернативен текст, надпис и описание. Когато задачата приключи, WPML записва преведените текстове в прикачения файл на целевия език и създава такъв, ако все още няма. Вижте Как да превеждате мултимедия. WPML открива изображенията в таговете <img> в съдържанието, в галериите, в основното изображение и в познатите му блокове. Блок Blockstudio съхранява ID на прикачени файлове в коментара на блока, затова WPML не открива тези изображения.

Когато WPML е активен, Blockstudio добавя към намерените изображения WPML прикачените файлове, чиито ID се съхраняват в полетата на блоковете на дадена страница:

  • Полета files, включително скритите, и полета attributes с media — същите полета, които редакторът на блокове зарежда като мултимедия.
  • Полета в групи, раздели, редове на повторители и вътрешни блокове.
  • Полета на разширения, включително в основни блокове и блокове от други разширения, тъй като стойностите им се съхраняват в атрибутите на разширения блок.

Стойностите, които не са ID на прикачен файл, се изключват. Нищо не е необходимо да се конфигурира и wpml-config.xml не участва. Без WPML нищо не се сканира за задачите за превод и класът за интеграция с мултимедия не се зарежда.

Това е отделно от преобразуването на ID на прикачени файлове: генерираният XML указва на WPML кой преведен прикачен файл да изобрази, а тази интеграция указва на системата кои текстове на прикачени файлове да включи в задача за превод. Низовите препратки и ID на публикации, които не са прикачени файлове, не се добавят към задачите за мултимедия. Запазените стойности на вложените полета имат предимство пред стойностите на най-горно ниво в блокове Blockstudio, както и при изобразяване.

Текстовете се включват в задачата само когато е активирана една от опциите за текст на изображение под WPML > Настройки > Превод на мултимедия: „Автоматично откриване на най-подходящите опции за превод на текстове в изображения“ или „Превод на текстовете в мултимедийната библиотека при превод на съдържание“, както при изображенията в основните блокове.

Blockstudio отчита изображенията чрез филтъра wpml_ids_of_media_used_in_post, който WPML прилага към медийните файлове на публикация в PostWithMediaFiles. За да изключите изображение от заданията, премахнете ID-то му в callback към същия филтър с приоритет над 10:

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