Bienvenue à votre cours sur l'exploration de la technologie 5G en Afrique! Le déploiement de la 5G et du haut débit en Afrique présente de nouvelles opportunités et de nouveaux défis pour différents secteurs.
Bienvenue dans le programme Verdissement par le numérique
Le programme Verdissement par le numérique est une initiative de Smart Africa visant à doter les décideurs politiques africains des connaissances et des outils nécessaires pour exploiter les technologies numériques au service de l'action climatique et du développement durable.
Alors que l’Afrique fait face aux défis conjoints de la dégradation de l’environnement et de la transformation numérique, ce programme explore comment l'innovation numérique peut favoriser une croissance verte, renforcer la résilience climatique et permettre une transition juste et inclusive vers un avenir durable.
À travers des modules dirigés par des experts, des études de cas concrètes et des opportunités de collaboration régionale, Verdissement par le numérique permet aux décideurs de concevoir et de mettre en œuvre des politiques qui placent la durabilité au cœur des stratégies de transformation numérique.
Rejoignez-nous pour bâtir une Afrique plus verte et plus intelligente.
Bienvenue au cours introductif sur la gouvernance des données en Afrique
Alors que les pays africains accélèrent leur transformation numérique, l’importance d’une gouvernance efficace des données devient essentielle. Ce cours vous introduit aux 8 piliers de la gouvernance des données, offrant une base complète pour aider les décideurs politiques, les régulateurs et les agents publics du continent à développer des cadres solides pour la gestion des données dans l’intérêt public.
Ancré dans le contexte africain et aligné sur les priorités régionales, ce cours explore deux axes clés de la gouvernance des données :
Réglementations et normes existantes
Consensus du secteur public
À travers ces thèmes, vous explorerez les huit piliers interdépendants suivants :
Politiques et cadres juridiques
Leadership et gouvernance
Structures institutionnelles, responsabilités et capacités
Infrastructure publique numérique, compétences et renforcement des capacités
Architecture et gestion de la gouvernance des données
Stimulation de la demande de données
Considérations de financement
Création de la chaîne de valeur des données
Ce cours est conçu pour vous aider à comprendre les éléments fondamentaux nécessaires à une gouvernance responsable et équitable des données, en mettant l’accent sur les approches dirigées par l’Afrique et la collaboration continentale. Que vous commenciez votre parcours ou que vous souhaitiez approfondir vos connaissances, ce cours vous fournira les outils nécessaires pour soutenir la prise de décision fondée sur les données dans votre institution ou votre pays.
Bienvenue dans votre cours sur les applications de l'IA en Afrique ! Le développement et l'utilisation de l'IA en Afrique présentent de nombreux défis et opportunités. Ce cours examine certaines stratégies et lignes directrices en matière de gouvernance que vous pouvez utiliser pour exploiter le potentiel et atténuer les risques dans votre région.
Bienvenue dans votre cours portant sur les technologies émergentes - l'IA dans le système de santé! À l'ère des avancées technologiques rapides, l'IA révolutionne le paysage de la santé en offrant des possibilités sans précédent d'améliorer le diagnostic, le traitement et la prestation globale des soins de santé.
Bienvenue dans votre cours portant sur la révolution des Cryptomonnaie : L'avenir de la finance décentralisée ! L'essor des Cryptomonnaie a changé la donne et continue de remodeler les paysages financiers et de remettre en question les paradigmes traditionnels.
Moodle Multi-Course Enrollment Script
document.addEventListener('DOMContentLoaded', function() {
console.log('Script loaded, checking body classes:', document.body.className);
// Only run on activity pages (path-mod)
if (document.body.className.includes('path-mod')) {
console.log('On activity page, looking for title...');
// Try to find the activity/page title from various possible locations
let activityTitle = '';
// Look for title in the hidden header first (this should be the activity title)
const headerTitle = document.querySelector('.page-header-headings h1, .page-header-headings h2, .course-header-txt h1, .course-header-txt h2');
if (headerTitle) {
activityTitle = headerTitle.textContent.trim();
console.log('Found title in header:', activityTitle);
}
// Fallback: try to get activity title from page title
if (!activityTitle) {
const pageTitle = document.title;
console.log('Page title:', pageTitle);
// Extract activity name from title (format usually "Activity: Course | Site")
const titleParts = pageTitle.split('|')[0].split(':');
if (titleParts.length > 0) {
activityTitle = titleParts[0].trim();
console.log('Extracted from page title:', activityTitle);
}
}
// Another fallback: look for activity title in main content area
if (!activityTitle) {
const mainTitle = document.querySelector('#region-main h1, #region-main h2, .activity-header h1, .activity-header h2');
if (mainTitle) {
activityTitle = mainTitle.textContent.trim();
console.log('Found title in main content:', activityTitle);
}
}
// Final fallback: use a generic title
if (!activityTitle) {
activityTitle = 'Page Content';
console.log('Using fallback title');
}
// Create the new header
const newHeader = document.createElement('div');
newHeader.className = 'custom-course-header';
newHeader.innerHTML = `
${activityTitle}
`;
// Insert the new header at the top of the main content area
const mainContent = document.querySelector('#page-content, #page, main, .main-content, #region-main');
if (mainContent) {
mainContent.insertBefore(newHeader, mainContent.firstChild);
console.log('Header inserted into main content');
} else {
// Fallback: insert after body opening
document.body.insertBefore(newHeader, document.body.firstChild);
console.log('Header inserted at body start');
}
console.log('Custom header created with title:', activityTitle);
} else {
console.log('Not on activity page, script not running');
}
});
// Robust mlang processor for SADA - handles dynamic content
(function() {
'use strict';
function getCurrentLanguage() {
// Get language from Moodle's M.cfg
if (typeof M !== 'undefined' && M.cfg && M.cfg.language) {
console.log('Language from M.cfg:', M.cfg.language);
return M.cfg.language;
}
// Check URL parameter
const urlParams = new URLSearchParams(window.location.search);
const langParam = urlParams.get('lang');
if (langParam) {
console.log('Language from URL:', langParam);
return langParam;
}
console.log('Using default language: en');
return 'en';
}
function processMlangTags() {
const currentLang = getCurrentLanguage();
console.log('=== Processing mlang tags for language:', currentLang, '===');
// Look specifically for elements containing mlang patterns
const elementsWithMlang = [];
// Use a more comprehensive search
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT,
function(node) {
return node.textContent.includes('{mlang') ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
}
);
let textNode;
while (textNode = walker.nextNode()) {
elementsWithMlang.push(textNode);
}
console.log('Found', elementsWithMlang.length, 'text nodes with mlang tags');
let processedCount = 0;
elementsWithMlang.forEach(function(textNode, index) {
const originalText = textNode.textContent;
console.log('Processing node', index + 1, ':', originalText);
// Pattern to match: {mlang en}content{mlang}{mlang fr}content{mlang}
const fullPattern = /(\{mlang\s+\w+\}[^{]*\{mlang\})+/g;
const matches = originalText.match(fullPattern);
if (matches) {
let newText = originalText;
matches.forEach(function(fullMatch) {
console.log('Found mlang block:', fullMatch);
// Extract individual segments
const segmentPattern = /\{mlang\s+(\w+)\}([^{]*)\{mlang\}/g;
const segments = [];
let segmentMatch;
// Reset regex
segmentPattern.lastIndex = 0;
while ((segmentMatch = segmentPattern.exec(fullMatch)) !== null) {
segments.push({
lang: segmentMatch[1].trim(),
content: segmentMatch[2]
});
}
console.log('Extracted segments:', segments);
// Find appropriate content
let replacement = '';
// Try current language first
const currentLangSegment = segments.find(s => s.lang === currentLang);
if (currentLangSegment) {
replacement = currentLangSegment.content;
console.log('Using current language content:', replacement);
}
// Fallback to English if not current language
else if (currentLang !== 'en') {
const englishSegment = segments.find(s => s.lang === 'en');
if (englishSegment) {
replacement = englishSegment.content;
console.log('Using English fallback:', replacement);
}
}
// Last resort: first available
if (!replacement && segments.length > 0) {
replacement = segments[0].content;
console.log('Using first available content:', replacement);
}
// Replace in the text
newText = newText.replace(fullMatch, replacement);
console.log('Replaced with:', replacement);
});
// Update the text node
textNode.textContent = newText;
processedCount++;
console.log('Updated node text to:', newText);
}
});
console.log('=== Completed processing. Updated', processedCount, 'nodes ===');
return processedCount;
}
// Multiple initialization strategies
function initialize() {
console.log('mlang processor initializing...');
// Strategy 1: Immediate processing
setTimeout(function() {
console.log('Strategy 1: Immediate processing');
processMlangTags();
}, 100);
// Strategy 2: After a longer delay for dynamic content
setTimeout(function() {
console.log('Strategy 2: Delayed processing');
processMlangTags();
}, 2000);
// Strategy 3: After page fully loads
window.addEventListener('load', function() {
setTimeout(function() {
console.log('Strategy 3: After window load');
processMlangTags();
}, 500);
});
// Strategy 4: Set up mutation observer
const observer = new MutationObserver(function(mutations) {
let shouldProcess = false;
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.TEXT_NODE) {
const textContent = node.textContent || '';
if (textContent.includes('{mlang')) {
console.log('Mutation observer detected mlang content');
shouldProcess = true;
}
}
});
}
});
if (shouldProcess) {
setTimeout(function() {
console.log('Strategy 4: Mutation observer triggered');
processMlangTags();
}, 300);
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
characterData: true
});
console.log('All strategies initialized');
}
// Manual refresh function
window.refreshMlangContent = function() {
console.log('=== MANUAL REFRESH TRIGGERED ===');
const count = processMlangTags();
console.log('Manual refresh completed. Processed', count, 'elements.');
return count;
};
// Debug function to find mlang content
window.findMlangContent = function() {
console.log('=== SEARCHING FOR MLANG CONTENT ===');
const allText = document.body.textContent;
if (allText.includes('{mlang')) {
console.log('Found {mlang} in page text content');
// Find specific elements
const allElements = document.querySelectorAll('*');
const elementsWithMlang = [];
allElements.forEach(function(el, index) {
if (el.textContent && el.textContent.includes('{mlang')) {
elementsWithMlang.push({
element: el,
tagName: el.tagName,
className: el.className,
textContent: el.textContent
});
}
});
console.log('Elements containing mlang:', elementsWithMlang);
return elementsWithMlang;
} else {
console.log('No {mlang} found in page content');
return [];
}
};
// Start when ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initialize);
} else {
initialize();
}
})();
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('Service Worker registered'))
.catch(err => console.log('Service Worker error:', err));
}