Come aggiungere una classe CSS a <body> a seconda della lingua attiva


8

Sto progettando un sito multilingue in cui vorrei basare alcuni dei miei stili sulla lingua attiva.

Pensa a qualcosa del genere:

body.en-uk li.artist:before {content:"Artist: "}
body.it-it li.artist:before {content:"Artista: "}
body.de-de li.artist:before {content:"Künstler"}

Qualcuno sa di un'estensione in grado di fare questo (cioè aggiungere una classe al tag a seconda della lingua attiva)?


1
Solo un piccolo punto; in questo esempio si sta modificando il contenuto, non lo stile, in base alla lingua. Ovviamente puoi già farlo molto facilmente all'interno di Joomla, senza bisogno di alcun CSS.
— Seth Warburton,

Risposte:


14

In realtà c'è una soluzione più semplice al tuo problema. Qualsiasi modello sano (inclusi tutti i modelli forniti con Joomla CMS) imposterà l' langattributo sull'elemento HTML. Ciò consente di utilizzare lo :lang()pseudo-selettore CSS .

Il tuo esempio sarebbe simile al seguente:

li.artist:lang(en):before {content:"Artist: "}
li.artist:lang(it):before {content:"Artista: "}
li.artist:lang(de):before {content:"Künstler"}

Questo ha un paio di vantaggi. Per cominciare, funzionerà indipendentemente da Template o anche con soluzioni diverse da Joomla come è fatto nel Browser.

Funzionerà bene anche con parti incorporate in altre lingue, purché l' langattributo sia impostato correttamente. Per esempio:

<html lang="en">
  <head>
    <style>
     blockquote:lang(de) { color: red; }
     blockquote:lang(en) { color: red; }
    </style>
  </head>
  <body>
    <p>A famous German quote is:</p>
    <blockquote lang="de">
      <p>Den Wald vor lauter Bäumen nicht sehen</p>
    </blockquote>
    <p>A famous English quote is:</p>
    <blockquote>
      <p>Listen to many, speak to a few.</p>
    </blockquote>
  <body>
</html>

Infine, Joomla non produce solo la lingua ma anche le impostazioni locali. Quindi il tuo sito potrebbe usare en-GB, un altro en-US e il modello lo rifletterà. L'utilizzo :lang(en)corrisponderà a entrambi, ma potresti anche utilizzare :lang(en-US)solo come target l'inglese americano.


Grazie per la tua risposta Rouven: molto interessante e sperimenterò anche questo.
— smz,

Bene, Rouven, alla fine, devo dire che ho adottato il tuo metodo: molto elegante, nemmeno la minima modifica al mio modello e mi ha aperto gli occhi su più possibilità che ora sto cercando di sfruttare (moduli HTML personalizzati multilingue e articoli ...). Grazie ancora e molte grazie anche a @Bakual e Lodder, ovviamente!
— smz,

Eccezionale. Glead per sentire che potrei offrire qualche ispirazione.
— Rouven Weßling,

Questa è una risposta brillante, non ne avevo idea!
— codinghands

5

Vorrei solo modificare il file index.php dei modelli e aggiungerei la classe direttamente lì.

<body class="<?php echo $this->language; ?>">

Assegnerebbe la lingua corrente come classe al tag body.


Fantastico: ancora più facile!
— smz,

Grazie Bakual: ho aggiunto il tuo codice al mio modello e funziona perfettamente. Ho "accettato" la tua risposta.
— smz,

Sto cercando di fare qualcosa di simile per aggiungere l'alias alla classe del corpo. Ma non voglio sovrascrivere il modello in caso di aggiornamenti. Stavo pensando di creare un plug-in di sistema, ma c'è un modo per aggiungere questa classe o dovrei semplicemente usare JavaScript?
— Eoin

3

Una piccola cosa da aggiungere riguardo al metodo di Rouven; il supporto del browser è migliore per i selettori di attributi piuttosto che per lo pseudo-selettore della lingua, quindi potresti prendere in considerazione l'uso di qualcosa del genere per indirizzare i tuoi stili:

[lang="en-GB"] .artist {…}

Grazie @Seth! Proverò la tua soluzione di targeting. Che ne dite di targeting con entrambi? Questo renderà la soluzione ancora più compatibile?
— smz,

Ciò qualificherebbe eccessivamente i selettori o aggiungerebbe gonfie inutili. Il selettore più corto è sempre la scelta migliore in quanto mantiene bassa la specificità, consentendoti di ignorarla facilmente se necessario. Più specifico è il selettore, più difficile sarà la sostituzione, motivo per cui non dovresti mai usare gli ID nei tuoi CSS. L'uso di entrambi non ti darebbe più compatibilità con il browser.
— Seth Warburton,

Ciao @ Seth! Ho provato la tua soluzione ma non sembra funzionare, almeno con il mio Joomla! luogo. Per quanto ho capito, l'unica indicazione sulla lingua in uso risiede nella direttiva <html> che recita: <html xmlns = " w3.org/1999/xhtml " xml: lang = "it-it" lang = "it -it "> in caso di italiano o <html xmlns =" w3.org/1999/xhtml "xml: lang =" en-gb "lang =" en-gb "> in caso di inglese. Questo dovrebbe essere sufficiente per la tua soluzione di targeting? Non sembra così ...
— smz,

Sì, questo selettore ha come target l'elemento html in base all'attributo, che in questo caso è la lingua. Tuttavia, gli attributi fanno distinzione tra maiuscole e minuscole, quindi è necessario utilizzare: [lang = "en-gb"]
— Seth Warburton,

1

Nell'indice.php del modello, è possibile sostituire il <body>tag corrente con il seguente:

<?php $lang = JFactory::getLanguage(); ?>
<body class="<?php echo $lang->getTag(); ?>">

Questo mostrerà il seguente esempio:

<body class="en-GB">

Sfortunatamente non posso votarti perché non ho abbastanza reputazione ... :-(
— smz

1
In realtà la risposta di @ Bakual è il metodo migliore. È più veloce e più facile;)
— Lodder

1
Sì, non è necessario recuperare la lingua. È già disponibile nel modello :)
— Bakual,

Non puoi votare, ma puoi scegliere un post come risposta :) Prendi tutto il tempo che vuoi scegliere (e se nessun post risponde alla tua domanda, lascialo). Le migliori risposte alla fine avranno il maggior numero di voti .... in teoria!
— TryHarder

@Bakual - Il mio sciocco errore. Il motivo è che ho appena risposto a una domanda linguistica su SO che non coinvolge il modello lol
— Lodder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.