My first multilanguage page
Avevo bisogno di una pagina multilingua, qualcosa di semplice che stesse bene con il mio sito generato staticamente
Ecco i miei requisiti:- deve essere basato esclusivamente si CSS e JavaScript, senza framework,
- deve essere di default in inglese, ma supportando una seconda lingua (l'italiano),
- deve essere possiible linkare una pagina in una determinata lingua.
L'idea è quella di identificare il body
HTML con una classe CSS che descriva il linguaggio visibile, show-en
oppure show-it
. Dopodichè identificare i contenuti nelle due lingue con le classi lang-en
e lang-it
.
Con tutto questo pronto, le seguenti 4 righe di CSS faranno in modo che siano visibili solo i contenuti nella lingua desiderata.
I needed a multilangage page, something simple that could fit on my static generated site.
Here are my requirements:
- it should only use CSS and plain JavaScript, without frameworks,
- it defaults to english, but supports only another languange (italian),
- it should be possible to generate a link that shows a specific languange.
The idea was to mark the HTML body with a CSS class describing the expected language, show-en
or show-it
. And then mark the language specific contents with lang-en
or lang-it
.
With this in place, the following 4 CSS lines will only show the expected language.
.show-en .lang-it { display: none; }
.show-en .lang-en { display: block; }
.show-it .lang-en { display: none; }
.show-it .lang-it { display: block; }
body
di esempio. <body class="show-en">
<div class="lang-it" lang="en">
This article is also available in <a href="#en" class="switch-lang">english</a>.
</div>
<div class="lang-en" lang="it">
Questo articolo è disponibile anche in <a href="#it" class="switch-lang">italiano</a>.
</div>
<div class="lang-en" lang="en">
In this article I'm going to explain how I made a multilanguage page,
only using CSS and plain JavaScript, without frameworks.
</div>
<div class="lang-it" lang="it">
In questo articolo spiegherò come ho realizzato una pagina multilingua.
Utilizzando solo CSS e JavaScript, senza framework.
</div>
<pre>
// example here
</pre>
</body>
- Si può notare che il
body
utilizza la classeshow-en
, - i contenuti localizzati sono identificabili dalle classi
lang-en
elang-it
, - si possono avere contenuto condivisi, privi di localizzazione (come il blocco
pre
), - ci sono due link speciali identificabili dalla classe
switch-lang
che si occuperanno del cambio di lingua.
Completiamo l'esempio con un po’ di JavaScript.
La prima funzione, setLangFromHash
, estrae l'hash dalla URL e controlla se contiene l'indicativo di una lingua.
Siamo solo interessati a #it
perché l'inglese è attivo di default.
In aggiunta, l'hash viene suddiviso in base alla presenza del carattere /
per permettere l'utilizzo di link interni al documento mantenendo la localizzazione attiva, ed esempio #en/section-1
.
- It it important to note that the
body
element defaults toshow-en
class, - localized contents are marked with
lang-en
orlang-it
, - it is possible to share unlocalized content (like the
pre
block), - there are two special links identified by the
switch-lang
class that will handle language switching.
Let’s complete the example with some JavaScript.
The first function, setLangFromHash
, will extract the URL hash and check if it contains a language code.
We only care about #it
because english is the default language and there is nothing to do in that case.
As a bonus, we split the hash on /
to allow localized internal links like #en/section-1
.
var setLangFromHash = function () {
var hash = window.location.hash;
var lang = hash.split("/", 2)[0] || "";
if (lang == "#it") {
document.body.classList.replace('show-en', 'show-it');
}
};
La seconda funzione, switchLang
, si occupa di alternare le classi show-en
e show-it
nell'elemento body
.
The second function, switchLang
, will toggle between show-en
and show-it
on the body
element.
var switchLang = function () {
if (!document.body.classList.replace('show-en', 'show-it')) {
document.body.classList.replace('show-it', 'show-en');
}
return true;
}
switch-lang
ad assegnargli la funzione switchLang
, infine possiamo invocare la funzione setLangFromHash
per identificare la lingua corrente nel caso in cui l'utente arrivi da un link esterno. switch-lang
tag and assign them to the switchLang
function, then we invoke the setLangFromHash
function to make sure the italian language is detected if a user is coming directly with #it
in the URL. document.addEventListener('DOMContentLoaded', () => {
// language switching links
document.querySelectorAll(".switch-lang").forEach(function(a) {
a.onclick = switchLang;
});
// override language based on hash
setLangFromHash();
});
This post accepts webmentions. Do you have the URL to your post?
Why not create a whole different page and connect the two with an alternate attribute link?
https://l0g.in/5GG8Zo