Riconoscere lingua del browser utente, e generare codice in base alla lingua con php (if, operatore ternario, switch)

In php, solitamente, abbiamo più possibilità per raggiungere lo stesso scopo!

Ad esempio, per le classiche condizioni if/else, possiamo utilizzare lo switch, o l’operatore ternario.

In questo articolo faremo alcuni esempi su come e perché scegliere una soluzione anziché l’altra!

if-else; operatore ternario; switch… cosa usare, e perché? usarli insieme, si può?

L’esempio classico if-else (cerchiamo la lingua del browser dell’utente):

<?php

// Lang:
$lang = "en"; // variabile (lingua) di default per evitare warning inutili
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}

if ($lang == "it") // se $lang è it:
{
  echo "testo in italiano"; // stampa questo
} 
else // altrimenti
{
    echo "default text in english"; // default: stampa questo
}

?>

Codice abbastanza chiaro e pulito – seppur decisamente ottimizzabile, non trovate?

Codice che trovai quando cercavo un esempio per cercare le lingue…

Ecco, invece, un metodo decisamente più “compatto” (l’operatore ternario):

<?php
// stampa: se esiste $_SERVER['HTTP_ACCEPT_LANGUAGE'] ed è "it" il testo in italiano, altrimenti (sia che esista che nel caso non esista) il testo in inglese
echo isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == "it" ? "testo in italiano" : "default text in english";
?>

Il punto interrogativo equivale all’ “echo”, i due punti, invece, all’ “else” e con un adeguato uso delle parentesi tonde si può simulare anche l’elseif.

<?php

$a = "1";
echo $a === "1" ? 'a === 1' : ($a > "1" ? 'a > 1' : 'a < 1');

?>

PS: a partire dalla versione 5.3 del php, esiste un modo ancora più compatto per usare l’operatore ternario = Elvis operator

$c = $a ?: $b; // equivalent to $c = $a ? $a : $b;

NB: alcuni richiudono l’intero codice tra parentesi tonde anche quando non necessario:

<?php

$var = 2;
echo ($var > 1 ? true : false); // true

?>

Ma, in simili casi, funziona anche senza e quindi io lo scrivo senza:

<?php

$var = 2;
echo $var > 1 ? true : false; // true

?>

Le parentesi sono necessarie, invece, se usiamo l’operatore ternario in una variabile con altro codice:

//example 1
$var = 2;
$var = $var > 1 ? true : false; // valid: 1 > parenthesis not required
echo $var;

//example 2
$var = 2;
$var = "test".($var > 1 ? true : false); // valid: test1 > parenthesis required
echo $var;

(o, come nell’esempio precedente, per creare unioni in un blocco di istruzioni e – ad esempio – simulare un elseif)

Oltre a echo/else e operatore ternario abbiamo lo switch (+ operatore ternario per la variabile)

<?php

// se $_SERVER['HTTP_ACCEPT_LANGUAGE'] esiste setta $lang con substr*, altrimenti "en"
$lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : "en";

// quindi lo switch con $lang
switch ($lang)
{
	// se it:
	case "it":
		$string = "stringa in italiano";
		$otherstring = "altra stringa in italiano...";
        break;
	// se en (e default)
	case "en":
	default:
		$string = "string in english";
		$otherstring = "other string in english...";
        break;
}

echo "<pre>".$lang."\n".$string."\n".$otherstring."</pre>";

?>

Questo si rivela molto utile (soprattutto in un caso come questo dove non dobbiamo settare solo una variabile, ma dobbiamo generare un vero e proprio sistema di traduzione, e quindi non possiamo proprio affidarci all’operatore ternario).

Bene, adesso sappiamo come riconoscere la lingua del visitatore, e stampare il testo di conseguenza, con il metodo più adatto!

A voi la scelta e, ricordatevi, scrivete php pulito ed inserite i commenti (quel che fate oggi potrebbe non tornarvi domani e quindi un commento, una nota, potrebbe aiutarvi) 😉

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *