Várt viselkedések, amelyek hibának tűnhetnek
Amit a WPML szándékosan így csinál: has_category(), dátum utótagok, slug, kivonat, domainek, importált fordítások, sztringek nyelve.
Néhány dolog többnyelvű webhelyen tervezetten másképp működik: egy WordPress-függvény, amely az alapértelmezett nyelv kifejezésére épül, egy dátum-utótag, amelyet a WordPress nem tud lokalizálni, vagy egy slug, amelyet az Advanced Translation Editor nem talál ki. Ezek nem hibák. Az alábbiakban azt találod, mi történik, miért, és mit tegyél helyette.
has_category() és más feltételes függvények fordított bejegyzéseknél
Szekció neve “has_category() és más feltételes függvények fordított bejegyzéseknél”A WordPress has_category() függvényét a WPML szándékosan nem szűri. Fordításnál a kategória a lefordított kifejezés, amelynek saját slugja van, ezért a has_category('news') hamis a francia bejegyzésen, még ha az a francia „news” kategóriában is van. Ugyanez igaz a has_term(), az in_category() és minden olyan kódra, amely az alapértelmezett nyelv slugját vagy azonosítóját hasonlítja.
Mit látsz. Van egy kategóriád test angol slugal és test-fr francia fordítással, amelyet bejegyzésekhez rendeltél. Ha a témád single.php fájljában egy cikluson belül meghívod a has_category("test") függvényt, az igazat ad az alapértelmezett nyelven, és hamisat a fordításon.
Mit tegyél. Hívd a feltételes függvényt a lefordított slugal, vagy előbb a wpml_object_id szűrővel kérd le a kifejezés azonosítóját. Vagy definiálj új szűrőt a téma functions.php fájljában:
function wp_has_category ($category) { $category = get_term_by('name', $category, 'category'); return has_category($category);}add_filter('wp_has_category', 'wp_has_category', 10, 1);A has_category hívását cseréld erre:
apply_filters( 'wp_has_category', 'test' )A szűrő az eredeti kategória neve alapján megkeresi a lefordított kategóriát, és ellenőrzi, hogy hozzá van-e rendelve a bejegyzéshez.
A dátum-utótagok (1st, 2nd, 3rd) nem fordíthatók
Szekció neve “A dátum-utótagok (1st, 2nd, 3rd) nem fordíthatók”Ez a WordPress magjának korlátja, nem a WPML-é: az utótag a PHP dátumformázásából jön, és sosem megy át fordítófüggvényen.
Mit látsz. Egyes témák és bővítmények a wp_date() vagy date_i18n() függvénnyel írják ki a dátumot, amely a paraméterektől függően utótagot használ (1st, 26th). Ezeket a WordPress magjának régi, ismert korlátja miatt jelenleg nem lehet lefordítani.
Mit tegyél. Megkerülő megoldásként a wp_date szűrővel lekérheted a dátumot, és a megjelenítés előtt módosíthatod az utótagot. Előtte készíts teljes biztonsági mentést az oldalról.
- Adj a téma
functions.phpfájljához egy kiswp_dateszűrőt, amely minden utótagot sztringként regisztrál (icl_register_string), és az angol utótag helyett a fordítását adja vissza (icl_t). - Nyisd meg az oldalt, ahol a dátumok megjelennek: ezzel lefut a szűrő.
- A WPML → String Translation oldalon fordítsd le a dátumokat.
Minden utótagot külön kell lefordítani (1st, 2nd …), mert nyelvenként eltérhet.
Az Advanced Translation Editor nem talál ki slugot
Szekció neve “Az Advanced Translation Editor nem talál ki slugot”A szerkesztő akkor fordítja le a slug mezőt, ha kitöltöd, és megtartja az eredeti slugot, ha üresen hagyod. A lefordított címből sosem képez slugot magától.
Mit látsz. Ha az Advanced Translation Editorban fordítasz egy bejegyzést, a slug mező nem töltődik ki automatikusan. Ha üresen hagyod, a lefordított bejegyzés az eredeti nyelv slugját kapja.
Oldalépítő shortcode-ok a WooCommerce termék rövid leírásában
Szekció neve “Oldalépítő shortcode-ok a WooCommerce termék rövid leírásában”A rövid leírás a bejegyzés kivonata, amely a WordPress meghatározása szerint egyszerű szöveges mező, ezért a WPML nem dolgozza fel benne az oldalépítők shortcode-jait úgy, mint a tartalomban. A WooCommerce viszont megjeleníti őket, ezért a különbség meglepi az embereket.
Mit látsz. A WooCommerce termék rövid leírása a kivonat mezőre épül, amely általában egyszerű szöveges mező, nem kezel shortcode-ot. A WooCommerce másképp kezeli ezeket a „kivonatokat”, és a shortcode-ok működnek, de a WPML úgy viselkedik, mintha nem működnének. Ha a shortcode fordítandó attribútumokat vagy automatikusan kezelendő belső hivatkozásokat tartalmaz, ez nem megy magától.
Mit tegyél. Van egy kód, amelyet bővítményként telepíthetsz. Másold egy wpmlpb-excerpts.php nevű fájlba a wp-content/plugins/ mappában, és aktiváld a bővítményt:
<?php/** * Plugin Name: WPML Page Builders - Proces Excerpts * Description: Parses shortcode strings in exceprts. * Version: 1.0 */namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->'; const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() { add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 ); add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 ); add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 ); }
public function joinWithContent( $content, $id ) { $post = get_post( $id ); if ( $post && $post->post_excerpt ) { $content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END; }
return $content; }
public function excludeFromJob( $package, $post ) { if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) { $package['contents']['excerpt']['translate'] = 0; $package['contents']['excerpt']['data'] = ''; }
return $package; }
public function splitFromContent( $post_id ) { $post = get_post( $post_id ); if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) { $start_pos = strpos( $post->post_content, self::SEPARATOR_START ); $end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) { $content = substr( $post->post_content, 0, $start_pos ); $excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) { wp_update_post( [ 'ID' => $post_id, 'post_content' => $content, 'post_excerpt' => $excerpt, ] ); } } } }}Nyelvenként külön domain WordPress.com tárhelyen
Szekció neve “Nyelvenként külön domain WordPress.com tárhelyen”A WordPress.com egy domaint rendel egy webhelyhez, a „különböző domain minden nyelvhez” URL-formához viszont az kell, hogy minden nyelvi domain ugyanahhoz a WordPresshez érjen, és ezt az a tárhely nem adja.
Mit látsz. A WordPress.com domain-hozzárendelésének korlátai miatt az ilyen tárhelyen nem választhatod a nyelvenkénti külön domain URL-beállítást.
Mit tegyél. Használd a másik két lehetőség egyikét: a nyelveket könyvtárakban, vagy URL-paraméterként. Ha a nyelvenkénti domain követelmény, másik tárhely kell.
Importált fordítások és a fordítószerkesztők
Szekció neve “Importált fordítások és a fordítószerkesztők”Az import kész fordításokat ír, de nem hoz létre fordítási feladatot, a szerkesztők pedig feladatokból dolgoznak. A fordítások a frontenden hiánytalanok, csak az Advanced vagy Classic Translation Editorban nem szerkeszthetők.
Mit látsz. Ha a WP All Import és a WPML All Import kiegészítővel importálsz tartalmat, az importált bejegyzésfordítások a frontenden tökéletesen látszanak. Ha viszont a WPML szerkesztőivel akarod frissíteni őket, gond van: a Classic Translation Editor az alapértelmezett nyelv tartalmát mutatja az importált fordítások helyett, az Advanced Translation Editor pedig üres fordításokat. Ennek oka, hogy többnyelvű tartalom importálásakor a WPML nem hoz létre fordítási feladatot, és a sztring-szegmentáláshoz az kell.
Mit tegyél. Az importált fordítások szerkesztéséhez váltsd a natív WordPress-szerkesztőt, és használd a kézi fordítást.
Angolul regisztrált sztringek, ha az alapértelmezett nyelv nem angol
Szekció neve “Angolul regisztrált sztringek, ha az alapértelmezett nyelv nem angol”A WPML String Translation 5.0 óta az a sztring, amelynek nyelvét a WPML nem tudja megállapítani, szándékosan angolként regisztrálódik. A téma vagy bővítmény sztringjeinek forrásnyelve a szövegtartomány beállítása, nem az oldal alapértelmezett nyelve, a megoldás tehát az, hogy a szövegtartományhoz beállítod.
Mit látsz. Amikor a sztringek automatikusan regisztrálódnak a WPML String Translationben, forrásnyelvük angol lesz, akkor is, ha az angol nincs telepítve, vagy nem az oldal alapértelmezett nyelve.
Mit tegyél. Állítsd be a szövegtartomány nyelvét:
- Nyisd meg a WPML → String Translation oldalt.
- Görgess le az Utilities részhez.
- Nyisd ki a Set the original language of themes and plugins szakaszt.
- Válaszd ki a téma vagy bővítmény szövegtartományának nyelvét.
Az egyes sztringek forrásnyelvének módosítását a A sztringek forrásnyelvének módosítása fejezet írja le. Ne javítsd a tartalék értéket a bővítmény kódjában: minden frissítés visszavonja, a szövegtartomány beállítása a támogatott megoldás.
Készült: