Reputation: 795
I want to make a page in English that has a button which can change the language to German. I have read thousands of articles about this topic but I haven't got the answer. I know for sure I don't want to make it with Google Translator API or any API. I want to make it with pure JS. I just want to how do you do it? With a button that has a lot of lines that changes the element's text one by one:
function changeLang () { document.getElementById('someid').innerHTML = "some German text"; ... }
Or make it with const transLang { from = "en" to = "de" ...}
?
Please let me know if you have any idea how to start it.
Upvotes: 2
Views: 4817
Reputation: 28611
For a "pure JS" solution, in other words none of the usual solutions:
one option is to store the translations on each div and switch them over using .text()
. Do not code your translations into your javascript as that will quickly become impossible to maintain.
function switchLang(lang)
{
$("[data-" + lang + "]").text(function(i, e) {
return $(this).data(lang);
});
}
switchLang("en");
$(".switchlang").click(function() {
// change the button caption here, eg a flag
// UX opinion of whether it should be what it is
// or what it will become
// ie "de" click to make it "de"
// or "de" it's currently "de", click to change it
$(this).text($(this).data("lang"));
// switch to other language based on language on the button
var lang = $(this).data("lang") == "de" ? "en" : "de";
$(this).data("lang", lang);
switchLang(lang)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span data-de="Um die Nachrichten zu lesen"
data-en="To read the news"></span>,
<span data-de="Übersetzungsdienst nicht verfügbar"
data-en="click here"></span>
<hr/>
<div data-en="no de translation for this line"></div>
<hr/>
<button class='switchlang' data-lang="en">de</button>
You can then easily add new languages without needing to change any code (this time with separate buttons)
var defaultlang = "en";
function switchLang(lang)
{
$("[data-" + lang + "]").text(function(i, e) {
return $(this).data(lang);
});
}
switchLang("en");
$(".switchlang").click(function() {
switchLang($(this).data("lang"))
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span data-de="Um die Nachrichten zu lesen"
data-es="Para leer las noticias"
data-en="To read the news"></span>,
<span data-de="Übersetzungsdienst nicht verfügbar"
data-es="haga clic aquí"
data-en="click here"></span>
<hr/>
<div data-es="no hay traducción para esta línea"
data-en="no de translation for this line"></div>
<hr/>
<button class='switchlang' data-lang="en">en</button>
<button class='switchlang' data-lang="de">de</button>
<button class='switchlang' data-lang="es">es</button>
You may prefer to default the language in the HTML directly, rather than on startup, eg:
<span data-de="speichern">save</span>
then store the original in .data("en")
on load. This would remove the FOUC (delay when loading the page) which may be important for your scenario.
Upvotes: 4