This is the technical support forum for WPML - the multilingual WordPress plugin.

Everyone can read, but only WPML clients can post here. WPML team is replying on the forum 6 days per week, 22 hours per day.

Nessun supporter è disponibile a lavorare oggi sul forum Italian. Sentitevi liberi di creare ticket e li gestiremo il prima possibile quando saremo online. Grazie per la comprensione.

This thread is resolved. Here is a description of the problem and solution.

Problem: I'd like to redirect my users to a specific page if the language doesn't exist

Solution: Add this code into your theme's functions.php

/*custom redirect language*/
add_filter( 'wpml_ls_language_url', 'wp_redirect_another', 10, 2 );
function wp_redirect_another( $url, $lang ) {
      
    $languages = icl_get_languages('skip_missing=1');
  
    $lang = $lang['language_code'];
    if( ! isset( $languages[ $lang ] ) ) {
  
        //e.g. if japanese
        if( $lang == 'ja' ) { //change the language code
            return 'add-url-here';
        }
  
        //e.g. if chinese
        if( $lang == 'zh-hant' ) { //change the language code
            return 'add-url-here';
        }
  
    }
    return $url;
}

Etichettato: 

This topic contains 10 risposte, has 2 voci.

Last updated by dennysP 3 mesi, 1 settimana fa.

Assigned support staff: Alejandro.

Autore Post
July 5, 2019 at 6:07 pm

dennysP

Ciao, nel mio sito abbiamo 4 lingue, di cui 2 it/en sono in tutto il sito.
Abbiamo altre 2 lingue Giapponese/Cinese sono in 1 pagine e vorremo che gli utenti andassero sempre in quella pagina (chiamata “china/japan”);

Ho provato con il seguente codice:

add_filter( 'WPML_filter_link', 'wp_redirect_another', 10, 2 );
function wp_redirect_another( $url, $lang ) {
     
    $languages = icl_get_languages('skip_missing=1');
 
    $lang = $lang['language_code'];
    if( ! isset( $languages[ $lang ] ) ) {
 
        //e.g. if chinese
        if( $lang == 'zh-hang' ) { //change the language code
            return '/china/?lang=zh-hang';
        }
 
        //e.g. if japanese
        if( $lang == 'ja' ) { //change the language code
            return '/japan/?lang=ja';
        }
 
    }
    return $url;
}

Ma non funziona proprio.
Tema: Impreza (pienamente compatibile ed aggiornato, PHP7, memoria 256M etc..)

Grazie

July 8, 2019 at 8:02 am #4159785

Alejandro
Supporter

Languages: Inglese (English ) Spagnolo (Español ) Italiano (Italiano )

Timezone: Europe/Rome (GMT+02:00)

Ciao!
Benvenuto al supporto cliente WPML.
Farò del mio meglio per aiutarti a risolvere questo problema.

Non sono molto sicuro di quello che vorresti fare (qual'è il proposito finale che ti porta a creare questa modifica), ma vedo che si tratta di personalizzazzioni che noi non supportiamo (nel senso che non posso offrirti molto aiuto per trattarsi di codice personalizzato).

Voglio però darti una mano se mi spieghi meglio cosa vuoi fare.

Io avevo capito che per le lingue giapponesi e cinesi volevi rindirizzare l'utente ad una pagina specifica, ma di quale lingua? dal codice sembra che non funzionerà mai semplicemente perché stai usando parametri e directories insieme (ma di nuovo, non so cosa vorresti fare).

Se mi dai un esempio più specifico di quello che vuoi fare, forse ti posso dare una mano o al massimo ti posso orientare sulla strada giusta.

Saluti.

P.S: nel codice ho visto che hai aggiunto "zh-hanG" per il cinese ma in realtà dovrebbe essere "zh-hanT"

July 8, 2019 at 8:33 am #4159999

dennysP

Ciao,

Vorrei che al posto di andare nella 404 (visto che solo 1 pagina è in cinese,giapponese) - il selettore di lingua cinese/giapponese punti sempre alla pagina che abbiamo chiamato China/Japan...

Il codice che abbiamo trovato online su wpml è quello che ti abbiamo elenco prima)

Come fare? Grazie

July 8, 2019 at 12:11 pm #4162227

dennysP

Ciao, qualche idea?

Grazie mille

July 8, 2019 at 2:46 pm #4163669

Alejandro
Supporter

Languages: Inglese (English ) Spagnolo (Español ) Italiano (Italiano )

Timezone: Europe/Rome (GMT+02:00)

Ho trovato il problema.

Il problema si trova nel Language Switcher che hai nel header. immagino sarà fatto apposta e se è così forse dovresti rivedere come l'hai fatto.

Quello che ho fatto per testare questa ipotesi, è creare un Language Switcher in un footer, poi cambiare il parametro "tralascia lingue" per "Link alla pagina iniziale della lingua per le traduzioni non disponibili" che si trova su WPML > Lingue > Opzioni selettore di lingua > Come gestire le lingue prive di traduzione.

In questo modo il Language Switcher sempre mostrerebbe tutte le lingue.

Poi, il codice che avevi l'ho soltanto aggiornato con il parametro giusto per il filtro (quello che hai usato prima è deprecated)

Ora si vede così:

/*custom redirect language*/
add_filter( 'wpml_ls_language_url', 'wp_redirect_another', 10, 2 );
function wp_redirect_another( $url, $lang ) {
     
    $languages = icl_get_languages('skip_missing=1');
 
    $lang = $lang['language_code'];
    if( ! isset( $languages[ $lang ] ) ) {
 
        //e.g. if jap
        if( $lang == 'ja' ) { //change the language code
            return '<em><u>hidden link</u></em>';
        }
 
        //e.g. if chinese
        if( $lang == 'zh-hant' ) { //change the language code
            return 'china/?lang=zh-hant';
        }
 
    }
    return $url;
}

Ricapitolando:
1) usa "wpml_ls_language_url" invece di "WPML_filter_link"
2) Per usare il link relativo devi togliere lo slash nel return (come ho fatto con il cinese)
3) Avevi un errore nel language code della china, avevi inserito zh-hanG quando è invece zh-hanT
4) Se ti va puoi anche usare il link diretto invece di uno relativo (come ho fatto con il giapponese)

Ora ti mancherebbe soltanto sistemare il language switcher che hai usato nella homepage e sarai apposto, nel frattempo ho lasciato attivo quello del footer così puoi fare i test che desideri.

Saluti.

July 8, 2019 at 3:33 pm #4164079

dennysP

Wow! Grazie!

Impreza però ha il suo switcher di default per l’header!

Nel caso.. non si può settare gentilmente di default?

Tutti i link ja e chinese - puntarli a quella pagina? - indipendentemente dal menu?

Grazie mille

July 9, 2019 at 9:32 am #4168979

Alejandro
Supporter

Languages: Inglese (English ) Spagnolo (Español ) Italiano (Italiano )

Timezone: Europe/Rome (GMT+02:00)

Si puo' fare ma siccome Impreza l'ha creato, devono loro gestire i cambiamenti o al meno dirti dove sta questo header e forse ti posso dare una mano lì, perché per qualche ragione sembra che loro usino un metodo diverso a quello usato da noi (e da quello consigliato da noi), o forse è un metodo vecchio, visto che per default, il Language Switcher dovrebbe seguire la configurazione che trovi su WPML > Languages, cosa che non fa, purtroppo.

Io ti consiglierei di far vedere il codice che ti ho inviato io al supporto di impreza e di chiederli di aggiungere la modifica al loro language switcher o al meno di dirti dove si puo' aggiungere e così avrai anche il language switcher del header funzionante correttamente.

Saluti.

July 9, 2019 at 9:42 am #4169219

dennysP

Ciao, alla fine ho dovuto mettere lo shortcode per un custom language switcher (quello di WPML)

Ho dato un’occhiata al codice di Ipmreza e si: hanno un proprio codice personale.

Questo è quello che ho trovato:

add_filter( 'wpml_pb_shortcode_decode', 'wpml_pb_shortcode_decode_us_urlencoded_json', 10, 3 );
function wpml_pb_shortcode_decode_us_urlencoded_json( $string, $encoding, $original_string ) {
	if ( $encoding !== 'us_urlencoded_json' ) {
		return $string;
	}

	$fields_to_translate = array(
		'title',
		'label',
		'description',
		'placeholder',
		'price',
		'substring',
		'features',
		'btn_text',
		'btn_link',
		'image',
		'link',
		'url',
	);
	$rows = json_decode( urldecode( $original_string ), TRUE );
	$result = array();
	foreach ( $rows as $i => $row ) {
		foreach ( $row as $key => $value ) {
			if ( in_array( $key, $fields_to_translate ) ) {
				$result[ $key . '_' . $i ] = array( 'value' => $value, 'translate' => TRUE );
			} else {
				$result[ $key . '_' . $i ] = array( 'value' => $value, 'translate' => FALSE );
			}
		}
	}

	return $result;
}

Con questo si può fare qualcosa?

July 9, 2019 at 11:56 am #4170341

Alejandro
Supporter

Languages: Inglese (English ) Spagnolo (Español ) Italiano (Italiano )

Timezone: Europe/Rome (GMT+02:00)

Mi sa che l'opzione del shortcode è il miglior modo per risolvere il problema.

Non saprei come adattare questo codice con quello del tema, perché sembra non usare diversi parametri che invece sono "necessari" nel codice che ti ho appena inviato.

Forse ti converrebbe inviare questa documentazione agli autori del tema: https://wpml.org/documentation/getting-started-guide/language-setup/custom-language-switcher/

questo è il metodo che di solito usiamo per creare i language switcher custom. loro possono anche creare un metodo diverso, ma possono al meno usare le diverse direttive che usiamo noi.

Saluti.

July 9, 2019 at 12:18 pm #4170539

dennysP

Grazie mille, chiudo il thread!

July 9, 2019 at 12:19 pm #4170603

dennysP

My issue is resolved now. Thank you!