From 298cdcaae0a9272c4e642eb089aba2de37e20cc8 Mon Sep 17 00:00:00 2001 From: Debucquoy Anthony Date: Fri, 1 Mar 2024 21:56:42 +0100 Subject: [PATCH] Implementation of i18n with documentation All files are documented. For further details please read them. --- frontend/public/i18n/EN.txt | 8 ++++ frontend/public/i18n/FR.txt | 8 ++++ frontend/src/i18n.js | 84 +++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 frontend/public/i18n/EN.txt create mode 100644 frontend/public/i18n/FR.txt create mode 100644 frontend/src/i18n.js diff --git a/frontend/public/i18n/EN.txt b/frontend/public/i18n/EN.txt new file mode 100644 index 0000000..8ffb03d --- /dev/null +++ b/frontend/public/i18n/EN.txt @@ -0,0 +1,8 @@ +# English translations (some examples to remove) + +login.guest.login=log in +login.guest.register=register +login.guest.welcome=Please Register here +login.success=You are now registered as $name + +#===================================================== diff --git a/frontend/public/i18n/FR.txt b/frontend/public/i18n/FR.txt new file mode 100644 index 0000000..caf4165 --- /dev/null +++ b/frontend/public/i18n/FR.txt @@ -0,0 +1,8 @@ +# Traductions françaises (Quelques examples a enlever) + +login.guest.login=s'identifier +login.guest.register=s'enregistrer +login.guest.welcome=Veuillez vous enregistrer ici +login.success=Vous êtes maintenant identifié comme $name + +#===================================================== diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js new file mode 100644 index 0000000..02fba50 --- /dev/null +++ b/frontend/src/i18n.js @@ -0,0 +1,84 @@ +/** + * Usage: + * import i18n from './i18n.js' + * + * console.log( i18n('parentcontext.childcontext.key', {user: username}) ); + * + * language is loaded from cookie: lang=XX + * translations are loaded from /public/i18n/XX.txt + * + */ + +const default_lang = "EN"; +let langs; + + +/** + * Fetch the translation from a key using the current language. + * could also replace certain value of the form `$variable` by providing an object + * with { variable: "value" } + * @param key :string translation key (can be null) + * @param options: Object element to replace in the translation + * + * @return :string The translated text + */ +function i18n(key, options) { + let ret = langs[key]; + if(options != null){ + for (let key in options) { + ret = ret.replaceAll("$" + key, options[key]); + } + } + return ret; +} + +async function reloadLang(){ + langs = await loadLangs(); +} +reloadLang(); + +export default i18n; + + +// +// Those functions are utility functions use by previous exported functions. +// + +/** + * Return the content of a cookie with specified key + * @param key cookie name + */ +function getCookie(key){ + key = key + "=" + let cookies = decodeURIComponent(document.cookie).split(";"); + for (let el of cookies) { + el = el.trimStart(); + if(el.indexOf(key) == 0){ + return el.substr(key.length, el.length); + } + } + return ""; +} + +/** + * Function that load the file with translation from the specified lang and return a dictionnary + * @param select the language to load. could be null to fetch the cookies for an answer + * if nothing is found. default to EN.txt + */ +async function loadLangs(lang){ + lang = lang != null ? lang : getCookie("lang"); + lang = lang != "" ? lang : default_lang; + + const filename = "./i18n/" + lang.toUpperCase() + ".txt"; + const content = await (await fetch(filename)).text(); + const lines = content.split("\n"); + + let filteredLines = {}; + for (let line of lines) { + if(!line.trim().startsWith("#") && line.trim() != ""){ + let split = line.indexOf("=") + filteredLines[line.substr(0, split)] = line.substr(split+1, line.length); + }; + } + return filteredLines; +}