Sbagli nell'impostazione di quelle condizioni.
Data questa espressione:
codice:
valore1 && valore2 || valore3 || valore4
la prima valutazione che viene fatta è proprio l'operatore && (AND logico) tra valore1 e valore2.
Otterrai quindi false a meno che i due valori siano entrambi true.
Se la prima valutazione è false, l'interprete va avanti con la seconda, dal momento che a seguire hai un operatore || (OR logico).
Avrai quindi:
Se anche valore3 è false si andrà avanti con la terza, dal momento che anche lì c'è un operatore ||.
Nel tuo caso, la prima condizione è sempre vera se almeno uno dei valori tra nokia e android è vero.
Mentre se è vero (tra gli ultimi 3) soltanto il valore blackberry, allora conta la valutazione di uno dei primi 3 valori (italiano, inglese, francese).
Dovresti utilizzare qualche parentesi per definire meglio l'ordine con cui eseguire la valutazione degli operatori logici.
Una cosa del genere dovrebbe risolvere:
codice:
if (italiano && (blackberry || nokia || android)) {...}
else if (inglese && (blackberry || nokia || android)) {...}
else if (francese && (blackberry || nokia || android)) {...}
Ad ogni modo questa impostazione risulta comunque essere ridondante dal momento che la seconda espressione da valutare è uguale per tutte le condizioni e che lo statement è sostanzialmente simile.
Per ottimizzare farei una cosa del genere:
codice:
if ((italiano || inglese || francese) && (blackberry || nokia || android))
window.open('https://www.google.'+ ((italiano && 'it') || (inglese && 'co.uk') || (francese && 'fr')));