# 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

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:

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

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

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.

1. Adj a téma `functions.php` fájljához egy kis `wp_date` szű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`).
2. Nyisd meg az oldalt, ahol a dátumok megjelennek: ezzel lefut a szűrő.
3. 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

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

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

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

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

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:

1. Nyisd meg a **WPML → String Translation** oldalt.
2. Görgess le az **Utilities** részhez.
3. Nyisd ki a **Set the original language of themes and plugins** szakaszt.
4. 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](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/sztringek-media-forrasnyelv/) 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.
