Initial commit

Update .gitignore, 403.php, and 60 more files...
This commit is contained in:
2021-12-08 13:18:09 +01:00
commit b3274d1f8c
65 changed files with 2033 additions and 0 deletions

2
commons/body-root.php Normal file
View File

@@ -0,0 +1,2 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<div id="body-overlay"></div>

7
commons/config.php Normal file
View File

@@ -0,0 +1,7 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<?php
$host = "nibblepoker.lu";
$host_uri = "https://nibblepoker.lu";
$dir_commons = dirname(__FILE__);
$dir_root = realpath($dir_commons . "/../");
?>

127
commons/content.php Normal file
View File

@@ -0,0 +1,127 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<?php
// TODO: Include lang once
// This helper requires PHP 8 or newer !
// Defining constants and enums.
const CONTENT_NONE = 0;
abstract class ContentType {
const NONE = CONTENT_NONE;
const BLOG = 1;
const PROGRAMMING = 2;
const ELECTRONICS = 3;
}
abstract class ContentDisplayType {
const NONE = CONTENT_NONE;
const SEARCH = 1;
const ARTICLE = 2;
const APPLICATION = 3;
}
abstract class ContentSubType {
const NONE = CONTENT_NONE;
const PUREBASIC = 1;
const PYTHON = 2;
const JAVA = 3;
const OTHER_LANGUAGE = 4;
const APPLICATION = 5;
const TOOL = 6;
const TUTORIAL = 7;
const IOT = 8;
const EXPERIMENTS = 9;
const HAM = 10;
const ALL = 11;
const DOCKER = 11;
}
// Preparing default variables.
$requested_content_type = ContentType::NONE;
$requested_content_display_type = ContentDisplayType::NONE;
$requested_content_sub_type = ContentSubType::NONE;
$content_has_error = false;
$_content_error_message_key = "error.content.none";
$content_error_message = "";
$was_item_requested = false;
// Detecting content type requested.
$content_requested_url_part = l10n_url_switch(NULL);
if(str_starts_with($content_requested_url_part, "/blog/")) {
$requested_content_type = ContentType::BLOG;
} elseif(str_starts_with($content_requested_url_part, "/programming/")) {
$requested_content_type = ContentType::PROGRAMMING;
} elseif(str_starts_with($content_requested_url_part, "/electronics/")) {
$requested_content_type = ContentType::ELECTRONICS;
} else {
// Failed to detect which category of content was requested.
$content_has_error = true;
$_content_error_message_key = "error.content.detect.category";
goto content_end;
}
// Detecting what kind of item was requested, parsing additional parameters and loading required data.
$content_requested_url_part = preg_replace("^\/(blog|programming|electronics)^", "", $content_requested_url_part);
if($requested_content_type == ContentType::BLOG) {
if(str_starts_with($content_requested_url_part, "/article/")) {
$requested_content_display_type = ContentDisplayType::ARTICLE;
} else {
$requested_content_display_type = ContentDisplayType::SEARCH;
}
} elseif($requested_content_type == ContentType::PROGRAMMING) {
// May be changed later if a specific resource is requested and found.
$requested_content_display_type = ContentDisplayType::SEARCH;
if(str_starts_with($content_requested_url_part, "/applications/")) {
$requested_content_sub_type = ContentSubType::APPLICATION;
} elseif(str_starts_with($content_requested_url_part, "/tutorials/")) {
$requested_content_sub_type = ContentSubType::TUTORIAL;
} elseif(str_starts_with($content_requested_url_part, "/tools/")) {
$requested_content_sub_type = ContentSubType::TOOL;
} elseif(str_starts_with($content_requested_url_part, "/purebasic/")) {
$requested_content_sub_type = ContentSubType::PUREBASIC;
} elseif(str_starts_with($content_requested_url_part, "/python/")) {
$requested_content_sub_type = ContentSubType::PYTHON;
} elseif(str_starts_with($content_requested_url_part, "/java/")) {
$requested_content_sub_type = ContentSubType::JAVA;
} elseif(str_starts_with($content_requested_url_part, "/others/")) {
$requested_content_sub_type = ContentSubType::OTHER_LANGUAGE;
} elseif(str_starts_with($content_requested_url_part, "/docker/")) {
$requested_content_sub_type = ContentSubType::DOCKER;
} else {
$requested_content_sub_type = ContentSubType::ALL;
}
} elseif($requested_content_type == ContentType::ELECTRONICS) {
// May be changed later if a specific resource is requested and found.
$requested_content_display_type = ContentDisplayType::SEARCH;
if(str_starts_with($content_requested_url_part, "/iot/")) {
$requested_content_sub_type = ContentSubType::IOT;
} elseif(str_starts_with($content_requested_url_part, "/experiments/")) {
$requested_content_sub_type = ContentSubType::EXPERIMENTS;
} elseif(str_starts_with($content_requested_url_part, "/ham/")) {
$requested_content_sub_type = ContentSubType::HAM;
} else {
$requested_content_sub_type = ContentSubType::ALL;
}
}
if($requested_content_display_type == ContentDisplayType::NONE) {
// Failed to detect what kind of content was requested.
$content_has_error = true;
$_content_error_message_key = "error.content.detect.display";
goto content_end;
}
if($requested_content_type != ContentType::BLOG && $requested_content_sub_type == ContentSubType::NONE) {
// Failed to detect the subtype of content requested when not a blog post.
$content_has_error = true;
$_content_error_message_key = "error.content.detect.subtype";
goto content_end;
}
$content_requested_url_part = preg_replace("^\/(java|python|purebasic|others|ham|iot|experiments|applications|tutorials|tools)^", "", $content_requested_url_part);
// TODO: detect specific resource and parameters, and load data.
content_end:
$content_error_message = localize($_content_error_message_key);
?>

34
commons/footer.php Normal file
View File

@@ -0,0 +1,34 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<nav class="navbar navbar-fixed-bottom">
<div class="navbar-content">
<div class="navbar-content">
<button id="button-sidebar" class="btn btn-action" type="button">
<i class="fa fa-bars" aria-hidden="true"></i><span class="sr-only">Sidebar</span>
</button>
</div>
<!--<div id="copyright-text" class="text-muted ml-15">© Copyright 2020-2021, BOZET Herwin</div>-->
</div>
<span class="ml-auto">
<div id="privacy-footer-link" class="text-muted ml-15">
<a href="<?php print(l10n_url_abs('/privacy/')); ?>" class="text-decoration-none">
<p class="text-muted font-weight-semi-bold"><?php print(localize('privacy.title')); ?></p>
</a>
</div>
</span>
<!--<span class="navbar-brand ml-auto">
<a href="<?php echo(l10n_url_switch('en')); ?>">
<img src="/resources/Icons8/color/flags/countries/uk.svg" alt="English">
</a>
<a href="<?php echo(l10n_url_switch('fr')); ?>">
<img src="/resources/Icons8/color/flags/countries/france.svg" alt="French">
</a>
<a href="<?php echo(l10n_url_switch('lb')); ?>">
<img src="/resources/Icons8/color/flags/countries/luxembourg.svg" alt="Luxembourgish">
</a>
</span>-->
<a href="<?php print(l10n_url_abs('/')); ?>" class="navbar-brand ml-auto">
<span class="navbar-brand ml-auto">
<img id="logo-footer" src="/resources/Azias/logos/logov3-test-finalized.svg" alt="logo" draggable="false">
</span>
</a>
</nav>

24
commons/header-lang.php Normal file
View File

@@ -0,0 +1,24 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<div id="header-lang-menu" class="navbar-content ml-auto">
<div class="dropdown with-arrow">
<button class="btn" data-toggle="dropdown" type="button" id="navbar-lang-dropdown">
<i class="fad fa-language"></i>&nbsp;&nbsp;<?php print(localize("lang.menu.title")); ?>
<i class="fa fa-angle-down" aria-hidden="true"></i>
</button>
<div class="dropdown-menu dropdown-menu-right w-150" aria-labelledby="navbar-lang-dropdown">
<a href="<?php echo(l10n_url_switch('en')); ?>" class="dropdown-item">
<?php print(localize("lang.english")); ?>
</a>
<a href="<?php echo(l10n_url_switch('fr')); ?>" class="dropdown-item">
<?php print(localize("lang.french")); ?>
</a>
<!--<a href="<?php echo(l10n_url_switch('lb')); ?>" class="dropdown-item">
<?php print(localize("lang.luxembourgish")); ?>
</a>-->
<div class="dropdown-divider mt-5 mb-5"></div>
<a href="<?php echo(l10n_url_switch(NULL)); ?>" class="dropdown-item">
<?php print(localize("lang.automatic")); ?>
</a>
</div>
</div>
</div>

15
commons/headers.php Normal file
View File

@@ -0,0 +1,15 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
<!-- TODO: Change to proper values once finished ! -->
<meta content="no-cache, no-store, must-revalidate" http-equiv="Cache-Control">
<meta content="no-cache" http-equiv="Pragma">
<meta content="0" http-equiv="Expires">
<meta name="theme-color" content="#1D2023">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="alternate icon" href="/favicon.ico">
<link href="/resources/HalfMoon/1.1.1/css/halfmoon-variables.min.css" rel="stylesheet" />
<link rel="stylesheet" href="/resources/FontAwesomePro/5.15.3/css/all.min.css">
<link rel="stylesheet" href="/resources/Azias/css/nibblepoker.lu.css">

57
commons/langs.php Normal file
View File

@@ -0,0 +1,57 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<?php
// This helper requires PHP 8 or newer !
// Setting the default values.
$default_language = "en";
$user_language = "en";
$user_uri_language = "";
// Attempting to detect the language through the URI
if(str_starts_with($_SERVER['REQUEST_URI'], "/en/")) {
$user_language = "en";
$user_uri_language = "/".$user_language;
} elseif(str_starts_with($_SERVER['REQUEST_URI'], "/fr/")) {
$user_language = "fr";
$user_uri_language = "/".$user_language;
} elseif(str_starts_with($_SERVER['REQUEST_URI'], "/lb/")) {
$user_language = "lb";
$user_uri_language = "/".$user_language;
} else {
// Attempting to detect the language through the browser's headers.
// TODO: This !
$user_uri_language = "";
}
// Reading and parsing the strings.json file
$lang_json = file_get_contents(realpath($dir_commons . "/strings.json"));
$lang_data = json_decode($lang_json, true);
// Localizer function
function localize($stringKey) {
global $user_language, $default_language, $lang_data;
if(array_key_exists($stringKey, $lang_data[$user_language])) {
return $lang_data[$user_language][$stringKey];
} else {
if(array_key_exists($stringKey, $lang_data[$default_language])) {
return $lang_data[$default_language][$stringKey];
} else {
return $stringKey;
}
}
}
function l10n_url_abs($url) {
global $user_uri_language;
return $user_uri_language . $url;
}
function l10n_url_switch($lang) {
if(is_null($lang)) {
return preg_replace("^\/(lb|lu|fr|en)^", "", $_SERVER['REQUEST_URI']);
} else {
return "/".$lang.preg_replace("^\/(lb|lu|fr|en)^", "", $_SERVER['REQUEST_URI']);
}
}
?>

86
commons/sidebar.php Normal file
View File

@@ -0,0 +1,86 @@
<?php if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) { header('HTTP/1.1 403 Forbidden'); die(); } ?>
<div class="sidebar">
<div class="sidebar-menu font-weight-bold">
<a href="<?php print(l10n_url_abs('/')); ?>" class="sidebar-brand no-select">
<img id="logo-sidebar" src="/resources/Azias/logos/logov3-test-finalized.svg" alt="logo" draggable="false">
</a>
<h4 class="text-center quantum ucase font-size-28 text-muted">N<span class="text-super-muted">ibble</span> P<span class="text-super-muted">oker</span></h4>
<div class="sidebar-divider"></div>
<a id="sbl-home" href="<?php print(l10n_url_abs('/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-home" aria-hidden="true"></i></span>
<?php print(localize("home.title.nav")); ?>
</a>
<a id="sbl-blog" href="<?php print(l10n_url_abs('/blog/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-rss-square"></i></span>
<?php print(localize("blog.title")); ?>
</a>
<div class="sidebar-divider"></div>
<a id="sbl-programming" href="<?php print(l10n_url_abs('/programming/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-code"></i></span>
<?php print(localize("programming.title")); ?>
</a>
<div class="ml-20">
<a id="sbl-purebasic" href="<?php print(l10n_url_abs('/programming/purebasic/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-microchip"></i></span>
<?php print(localize("programming.purebasic.title")); ?>
</a>
<a id="sbl-python" href="<?php print(l10n_url_abs('/programming/python/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fab fa-python"></i></span>
<?php print(localize("programming.python.title")); ?>
</a>
<!--<a id="sbl-others" href="<?php print(l10n_url_abs('/programming/others/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-ellipsis-h"></i></span>
<?php print(localize("programming.others.title")); ?>
</a>-->
<a id="sbl-docker" href="<?php print(l10n_url_abs('/programming/docker/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fab fa-docker"></i></span>
<?php print(localize("programming.docker.title")); ?>
</a>
<div class="sidebar-divider"></div>
<a id="sbl-projects-apps" href="<?php print(l10n_url_abs('/programming/applications/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-browser"></i></span>
<?php print(localize("programming.apps.title")); ?>
</a>
<a id="sbl-projects-tutorials" href="<?php print(l10n_url_abs('/programming/tutorials/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-books"></i></span>
<?php print(localize("programming.tutorials.title")); ?>
</a>
<a id="sbl-projects-tools" href="<?php print(l10n_url_abs('/programming/tools/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-tools"></i></span>
<?php print(localize("programming.tools.title")); ?>
</a>
</div>
<!--<div class="sidebar-divider"></div>
<a id="sbl-electronics" href="<?php print(l10n_url_abs('/electronics/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-microchip"></i></span>
<?php print(localize("electronics.title")); ?>
</a>
<div class="ml-20">
<a id="sbl-iot" href="<?php print(l10n_url_abs('/electronics/iot/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-house-signal"></i></span>
<?php print(localize("electronics.iot.title")); ?>
</a>
<a id="sbl-elec-misc" href="<?php print(l10n_url_abs('/electronics/experiments/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-flask"></i></span>
<?php print(localize("electronics.experiments.title")); ?>
</a>
<a id="sbl-ham" href="<?php print(l10n_url_abs('/electronics/ham/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-broadcast-tower"></i></span>
<?php print(localize("electronics.ham.title")); ?>
</a>
</div>-->
<div class="sidebar-divider"></div>
<a id="sbl-links" href="<?php print(l10n_url_abs('/links/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-link"></i></span>
<?php print(localize("links.title")); ?>
</a>
<a id="sbl-about" href="<?php print(l10n_url_abs('/about/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-user"></i></span>
<?php print(localize("about.title")); ?>
</a>
<a id="sbl-contact" href="<?php print(l10n_url_abs('/contact/')); ?>" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon"><i class="fad fa-mailbox"></i></span>
<?php print(localize("contact.title")); ?>
</a>
</div>
</div>

126
commons/strings.json Normal file
View File

@@ -0,0 +1,126 @@
{
"_note": "You really are a nosy one, aren't you ?",
"en": {
"home.title.nav": "Home",
"home.title.header": "Homepage",
"home.intro.meta.description": "${home.intro.meta.description}",
"home.intro.title": "Welcome",
"home.intro.text.1": "This website contains a collection of my personal work through blog posts, software releases and other forms of media, all of which is accessible for free and under open-source friendly licenses.",
"home.intro.text.2": "If you wish to contact me, you can do so through the contact form linked in the sidebar or via the email address present on that page.",
"blog.title": "Blog",
"programming.title": "Programming",
"programming.java.title": "Java",
"programming.purebasic.title": "PureBasic",
"programming.python.title": "Python",
"programming.others.title": "Others",
"programming.docker.title": "Docker",
"programming.apps.title": "Applications",
"programming.tutorials.title": "Tutorials",
"programming.tools.title": "Tools",
"electronics.title": "Electronics",
"electronics.iot.title": "IoT",
"electronics.experiments.title": "Experiments",
"electronics.ham.title": "HAM",
"links.title": "Links",
"links.visit.button": "Visit",
"about.title": "About",
"contact.title": "Contact",
"lang.menu.title": "Language",
"lang.current": "English",
"lang.automatic": "Automatic",
"lang.english": "English",
"lang.french": "French",
"lang.luxembourgish": "Luxembourgish",
"privacy.title": "Privacy policy",
"privacy.introduction.title": "Introduction",
"privacy.introduction.text.1": "This privacy policy is written in accordance with the 12th and 13th articles of the GDPR.",
"privacy.introduction.text.2": "If you wish to consult it, you can do so on the following websites:",
"privacy.data.title": "What data do we collect ?",
"privacy.data.text.1": "This website, does not collect any personal data, be it through access logs, cookies or any third-party services.",
"privacy.update.title": "Changes to our privacy policy",
"privacy.update.text.1": "The content of this privacy policy was written and last updated on the 4th of December 2021.",
"privacy.update.text.2": "In the event of a change to our privacy policy, you will be informed explicitly, and a copy of previous versions of the policy will be available on this page.",
"privacy.contact.title": "How to contact us ?",
"privacy.contact.text.1": "If you wish to contact us for more information regarding our privacy policy, please contact us via the form included on the contact page, or at the following email address:",
"privacy.complaint.title": "How to contact the appropriate authorities ?",
"privacy.complaint.text.1": "Should you wish to report a complaint or if you feel that our privacy policy has not addressed your concern in a satisfactory manner, you may contact your national Data Protection Authority (DPA).",
"privacy.complaint.text.2": "More information on this procedure can be found on the following websites:",
"error.common.details.title": "Error details",
"error.4xx.title": "HTTP client error",
"error.4xx.text": "${error.4xx.text}",
"error.4xx.button.back": "Go back",
"error.403.title": "403 Error",
"error.403.description": "Access to the requested resource is forbidden !",
"error.404.title": "404 Error",
"error.404.description": "The requested resource couldn't be found on the server !",
"error.content.none": "No explicit error was encountered.",
"error.content.detect.category": "Failed to detect which category of content you requested.",
"error.content.detect.display": "Failed to detect if you requested the category's search page or a specific one.",
"error.content.detect.subtype": "Failed to detect the sub-type of content you requested."
},
"fr": {
"home.title.nav": "Accueil",
"home.title.header": "Page d'accueil",
"home.intro.meta.description": "${home.intro.meta.description}",
"home.intro.title": "Bienvenue",
"home.intro.text.1": "Ce site internet contient une collection de mon travail personnel dans le domaine de l'informatique, le tout étant rendu accessible par le biais d'articles de blog, ? et ?, le tout sous une licence ouverte et en open source.",
"home.intro.text.2": "Si vous désirez me contacter, vous pouvez le faire via le formulaire de contact dans la page prévu à cet effet qui est liée dans le menu latéral ou via l'adresse email présente sur cette page.",
"blog.title": "Blog",
"programming.title": "Programmation",
"programming.java.title": "Java",
"programming.purebasic.title": "PureBasic",
"programming.python.title": "Python",
"programming.others.title": "Autres",
"programming.docker.title": "Docker",
"programming.apps.title": "Applications",
"programming.tutorials.title": "Tutoriels",
"programming.tools.title": "Outils",
"electronics.title": "Électronique",
"electronics.iot.title": "IoT",
"electronics.experiments.title": "Expériences",
"electronics.ham.title": "HAM",
"links.title": "Liens",
"links.visit.button": "Visiter",
"about.title": "À-propos",
"contact.title": "Contact",
"lang.menu.title": "Langue",
"lang.current": "Français",
"lang.automatic": "Automatique",
"lang.english": "Anglais",
"lang.french": "Français",
"lang.luxembourgish": "Luxembourgeois",
"privacy.title": "Politique de confidentialité",
"privacy.introduction.title": "Introduction",
"privacy.introduction.text.1": "La politique de confidentialité ci-présente a été écrite en accord avec les articles 12 et 13 de la RGPD.",
"privacy.introduction.text.2": "Si vous souhaitez consulter le texte officiel en question, vous pouvez le faire sur les sites internet suivants :",
"privacy.data.title": "Quelles données sont collectées ?",
"privacy.data.text.1": "Ce site web ne collecte aucune donnée personnelle, que ce soit au travers des journaux d'évènements sur nos serveurs, des cookies ou via quelconque autre tiers parti.",
"privacy.update.title": "Changements à notre politique de confidentialité",
"privacy.update.text.1": "Le contenu de notre politique de confidentialité a été écrit et modifié pour la dernière fois le 4 décembre 2021.",
"privacy.update.text.2": "En cas de changement, vous serez clairement informé et une copie des anciennes versions de notre politique sera disponible sur cette page.",
"privacy.contact.title": "Comment nous contacter ?",
"privacy.contact.text.1": "Si vous souhaitez nous contacter afin d'obtenir plus d'informations concernant notre politique de confidentialité, nous vous recommandons d'utiliser le formulaire présent sur la page de contact, ou par courriel à l'adresse suivante:",
"privacy.complaint.title": "Comment contacter les autorités compétentes ?",
"privacy.complaint.text.1": "Dans l'éventualité où vous souhaiteriez déposer une plainte pour une quelconque raison en rapport avec notre politique de confidentialité, veuillez vous adresser à l'autorité nationale de protection des données (DPA).",
"privacy.complaint.text.2": "Les informations concernant cette procédure peuvent être trouvées sur les sites internet suivants:",
"error.common.details.title": "Détails de l'erreur",
"error.4xx.title": "Erreur du client HTTP",
"error.4xx.text": "${error.4xx.text}",
"error.4xx.button.back": "Retourner en arrière",
"error.403.title": "Erreur 403",
"error.403.description": "L'accès à la ressource demandée est interdit !",
"error.404.title": "Erreur 404",
"error.404.description": "La ressource demandée est introuvable sur le serveur !",
"error.content.none": "Aucune erreur précise n'a été détectée.",
"error.content.detect.category": "Impossibilité de détecter la catégorie de contenu demandée.",
"error.content.detect.display": "Impossibilité de détecter si une recherche ou page spécifique était demandée.",
"error.content.detect.subtype": "Impossibilité de détecter le sous-type de contenu demandé."
},
"lb": {
"home.title.nav": "Doheem",
"lang.current": "Luxembourgish",
"home.intro.title": "Wëllkomm op <i>NibblePoker.lu</i> !"
}
}