Μετάβαση στο περιεχόμενο

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.

Εξαίρεση πεδίου

Ένα πεδίο κειμένου μπορεί να περιέχει μια τιμή που πρέπει να είναι ίδια σε κάθε γλώσσα: ένα όνομα λογαριασμού, μια διεύθυνση email, μια άγκυρα ή μια κλάση 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, ώστε να περιλαμβάνουν δηλώσεις αναγνωριστικών συνημμένων. Το περιεχόμενο που υπήρχε προηγουμένως εμφανίζει νέα πεδία προς μετάφραση μόλις ενημερωθεί το πρωτότυπό του, όπως περιγράφεται στον παραπάνω οδηγό 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 αποθηκεύει αναγνωριστικά συνημμένων στο σχόλιο του μπλοκ, οπότε το WPML δεν εντοπίζει κανένα από αυτά.

Όταν είναι ενεργό το WPML, το Blockstudio προσθέτει στις εικόνες που βρέθηκαν WPML τα συνημμένα που αποθηκεύουν τα πεδία του στα μπλοκ μιας σελίδας:

  • Πεδία files, συμπεριλαμβανομένων των κρυφών, και πεδία attributes με media, τα ίδια πεδία που φορτώνει ο επεξεργαστής μπλοκ ως πολυμέσα.
  • Πεδία σε ομάδες, καρτέλες, γραμμές επαναλήπτη και εσωτερικά μπλοκ.
  • Πεδία των επεκτάσεων, και σε βασικά μπλοκ και μπλοκ άλλων πρόσθετων, επειδή οι τιμές τους αποθηκεύονται στα χαρακτηριστικά του μπλοκ που επεκτείνεται.

Οι τιμές που δεν είναι αναγνωριστικά συνημμένων παραλείπονται. Δεν χρειάζεται καμία ρύθμιση και το wpml-config.xml δεν εμπλέκεται. Χωρίς το WPML, δεν γίνεται σάρωση για εργασίες μετάφρασης και δεν φορτώνεται η κλάση ενσωμάτωσης πολυμέσων.

Αυτό είναι ξεχωριστό από τη μετατροπή αναγνωριστικών συνημμένων: το XML που δημιουργείται υποδεικνύει στο WPML ποιο μεταφρασμένο συνημμένο θα εμφανίσει, ενώ αυτή η ενσωμάτωση του υποδεικνύει ποια κείμενα συνημμένων θα περιληφθούν σε μια εργασία μετάφρασης. Οι αναφορές συμβολοσειρών και τα αναγνωριστικά αναρτήσεων που δεν είναι συνημμένα δεν προστίθενται στις εργασίες πολυμέσων. Οι αποθηκευμένες τιμές ένθετων πεδίων έχουν προτεραιότητα έναντι των τιμών ανώτατου επιπέδου στα μπλοκ Blockstudio, όπως και κατά την απόδοση.

Τα κείμενα περιλαμβάνονται στην εργασία μόνο αν είναι ενεργοποιημένη μία από τις επιλογές κειμένου εικόνας στην ενότητα WPML > Ρυθμίσεις > Μετάφραση πολυμέσων: «Αυτόματος εντοπισμός των καλύτερων επιλογών για τη μετάφραση κειμένων εικόνων» ή «Μετάφραση κειμένων της βιβλιοθήκης πολυμέσων κατά τη μετάφραση περιεχομένου», όπως ισχύει και για τις εικόνες σε βασικά μπλοκ.

Το Blockstudio τις εικόνες μέσω του φίλτρου wpml_ids_of_media_used_in_post, το οποίο WPML εφαρμόζεται στα πολυμέσα μιας ανάρτησης στο PostWithMediaFiles. Για να εξαιρέσετε μια εικόνα από τις εργασίες, αφαιρέστε το αναγνωριστικό της σε μια επανάκληση του ίδιου φίλτρου με προτεραιότητα μεγαλύτερη από 10:

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