# E-mailek küldése a címzett nyelvén

> Hogyan integrálhatják a téma- és bővítményfejlesztők a wp_mail() függvényt a WPML levelezési API-jával, és hogyan tárolhatják a címzettek nyelvét.

Fontos, hogy a webhely felhasználói a saját nyelvükön kapják az e-maileket. A WPML erre egy API-t kínál: eltárolja a felhasználó preferált nyelvét, és levélküldéskor alkalmazza. Ez a fejezet témák és bővítmények fejlesztőinek szól: azt mutatja meg, hogyan illeszthetik a termékeiket a szabványos `wp_mail()` függvényhez a preferált nyelv kezelésével.

## Mikor kell nyelvenként levelet küldeni?

Néhány tipikus helyzet:

- **Hírlevél.** A webhely adminisztrátora francia, és a hírlevél-felületet franciául használja. Ennek eredménye: minden levél franciául megy ki. Az előfizetők a világ minden tájáról érkeznek, sokan nem értik a levelet.
- **Közösségi oldal.** A tagok fényképeket tesznek közzé, mások kedvelhetik őket, és a szerző e-mailben értesül. Mathias, aki német, közzétesz egy fotót. Pierre, a francia barátja, franciául böngészve megnyomja a Tetszik gombot. Mathias francia nyelvű értesítést kap.
- **Webshop.** Ha egy termék átmenetileg nem elérhető, a látogatók megadhatják az e-mail-címüket, hogy értesítést kapjanak. Egy japán látogató megadja az e-mail-címét. Aztán a spanyol adminisztrátor frissíti a készletet. A japán vásárló az automatikus „A termék ismét elérhető” levelet spanyolul kapja.

Ezekben az esetekben el kell tárolni a címzett preferált nyelvét, és a levél küldésekor átmenetileg erre a nyelvre kell váltani.

## A wp_mail() körbefogása WPML-kóddal

Levélküldéskor három lépést kell a kódba tenned:

1. Váltsd a nyelvi környezetet a címzett preferált nyelvére.
2. Futtasd a levélküldő kódot.
3. Válts vissza a webhely nyelvére.

A második lépés valószínűleg már megvan. Csak két WPML-specifikus sort kell hozzáadnod:

```php
$email = get_option('receiver-email');

// Nyelvi környezet váltása
do_action('wpml_switch_language_for_email', $email);

// a levélküldő kódod:
$subject = __('Hello, World!', 'text-domain');

$message = __('This is our newsletter', 'text-domain');

wp_mail($email, $subject, $message);

// vissza a webhely nyelvére
do_action('wpml_restore_language_from_email');
```

Két fontos szabályt tarts be.

### 1. A nyelvet az első levéltartalom lekérése előtt válts

A nyelvváltás célja a levél tartalmának fordítása, ezért a helyes nyelvet még a tárgy vagy a levélszöveg lekérése előtt kell beállítani.

Ez nem működik:

```php
$email = my_func_to_get_receiver_email();
$subject = my_func_to_get_title(); // a webhely nyelvén jön
$message = my_func_to_get_msg_body(); // a webhely nyelvén jön

do_action('wpml_switch_language_for_email', $email);
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');
```

Helyesen:

```php
$email = my_func_to_get_receiver_email();
do_action('wpml_switch_language_for_email', $email);
$subject = my_func_to_get_title(); // a címzett nyelvén jön
$message = my_func_to_get_msg_body(); // a címzett nyelvén jön
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');
```

### 2. Ne küldj címzettek tömbjének

A `wp_mail()` elfogadja az e-mail-címek tömbjét, ám ha fordítható levéltartalmat akarsz, ez tilos.

Ez nem működik:

```php
$emails = my_func_get_emails_array(); // array(email1, email2...)
do_action('wpml_switch_language_for_email', $emails); // nem fog működni

$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
```

Írd át így:

```php
$emails = my_func_get_emails_array(); // array(email1, email2...)

foreach ($emails as $email) :
    do_action('wpml_switch_language_for_email', $email); // így jó
    $subject = my_func_to_get_title();
    $message = my_func_to_get_msg_body();
    do_action('wpml_restore_language_from_email');
endforeach;
```

## A címzett nyelvének tárolása

### WordPress-felhasználók

Ha a címzettek hagyományos WordPress-felhasználók, nem kell külön elmentened a nyelvi adatot, sem horgot (hook) készítened. Elég tájékoztatni őket, hogy a preferált nyelvüket a WordPress adminban, a **Profilok → Saját profil** oldalon állíthatják be.

Az adat egy szokásos user meta mezőben van. Ha mégis le akarod kérni:

```php
$user = get_user_by( 'email', $email );
if ( $user && isset( $user->ID ) ) {
    $lang = get_user_meta( $user->ID, 'icl_admin_language', true );
}
```

### Nem WordPress-felhasználó címzettek

Ha a bővítményed vagy témád elment egy e-mail-címet, a címzett preferált nyelvét is el kell mentened. Nincs szükség külön helyre vagy adattípusra, csak egy szűrőt kell hozzáadnod, amely visszaadja a nyelvi információt. A szűrő neve `wpml_user_language`:

```php
add_filter('wpml_user_language', 'my_recipient_language', 10, 2);

function my_recipient_language($lang, $email) {
    return get_language_from_my_database($email); // ezt a függvényt neked kell megírnod
}
```

#### Nyelvválasztó a felületen

Ha a bővítményed a feliratkozóknak konfigurációs panelt kínál a frontenden, megkérdezheted tőlük a nyelvet ezzel az action horoggal:

```php
do_action('wpml_user_language_switcher', array('mail' => 'mail@example.com'));
```

A `mail@example.com` helyére az aktuális feliratkozó valódi e-mail-címe kerül.

Ez egy legördülő listát jelenít meg az elérhető nyelvekkel. Ha a feliratkozó választ, az érték AJAX-hívással a szerverre kerül. Ezt neked kell elmentened az adatbázis-tábláidba. Ehhez akaszd a `wpml_user_language_switcher_save` szűrőre a saját függvényedet:

```php
add_filter('wpml_user_language_switcher_save', 'my_func', 10, 3);

function my_func($saved, $email, $language) {
    // az e-mail-cím és a nyelv párosának mentése, például:
    save_language_in_my_database($email, $language);
    // ha sikeresen mentetted, térj vissza true értékkel
    return true;
}
```

Ha a szűrő nem ad vissza `true` értéket, vagy egyáltalán nincs ilyen szűrőd, a WPML a nyelvi információt a user meta táblába próbálja menteni.

### Nem tárolt címekre küldés

Néha olyan címre kell levelet küldeni, amely nincs egyik adatbázistáblában sem, így a nyelvi preferenciája sincs eltárolva. Ilyenkor a WPML azt várja, hogy a nyelvkód ezen három globális változó egyikében elérhető:

- `$_POST['wpml_user_email_language']`
- `$_GET['wpml_user_email_language']`
- `$GLOBALS['wpml_user_email_language']`

## Az e-mailek fordítása

A levéltartalom fordítása ugyanúgy megy, mint bármely más sztringé a webhelyen (lásd: [Sztringek fordítása](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/sztringek-media-sztringek/)). Röviden, a levél tárgyára és szövegére ezeknek kell teljesülniük:

- Ha statikus sztringek, lokalizáld őket Gettext-függvényekkel (`_e()` vagy `__()`).
- Ha a WordPress opciók táblájában vannak mentve, és a `get_option()` függvénnyel olvasod őket, jelezned kell a WPML-nek, hogy ezek is fordíthatók. Ezt a nyelvi konfigurációs fájllal teheted meg (lásd: [A wp_options táblában tárolt szövegek fordítása](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/fejleszto-admin-szovegek/)).

Ha a bővítményed vagy témád megfelel ezeknek, a felhasználók le tudják fordítani a szövegeket a **WPML → String Translation** oldalon.
