Close Menu
    Facebook X (Twitter) Instagram
    • Home
    • Contact Us
    • About Us
    • Privacy Policy
    • Terms Of Service
    • Advertisement
    Sunday, July 5
    Facebook X (Twitter) Instagram Pinterest Vimeo
    ABS Africa TV
    • Breaking News
    • Trending
    • Africa News
    • World News
    • Features
    • Technology
    • Sports
    • Politics
    • More
      • Culture
      • Lifestyle
      • Travel
      • Business
      • Environment
      • Legal
      • Health
      • Cameroon
      • Ambazonia
      • AfroSingles
      • Environ/Climate
      • Editorial
      • The Leak Magazine
    • Donate
    Subscription
    ABS Africa TV
    Home»Sports»Ghana to host 2027 CAF U-20 Africa Cup of Nations
    Sports

    Ghana to host 2027 CAF U-20 Africa Cup of Nations

    Johnson BenguruBy Johnson BenguruJuly 5, 2026No Comments8 Mins Read
    Facebook Twitter Pinterest LinkedIn Tumblr Email
    Share
    Facebook Twitter LinkedIn Pinterest Email
    Post Views: 4

    Ghana to host 2027 CAF U-20 Africa Cup of Nations

    Ghana to host 2027 CAF U-20 Africa Cup of Nations

    South Africa’s U-20 players celebrate after winning the 2025 CAF U-20 Africa Cup of Nations title. (Photo: CAF)

    Read this story aloud

    Listen to the clean text version of this article

    Ready
    3 min listen
    Audio reading is not supported on this browser.

    The TotalEnergies CAF U-20 Africa Cup of Nations will feature 12 teams drawn from across the continent

    Ghana has been awarded the hosting rights for the 2027 TotalEnergies CAF U-20 Africa Cup of Nations (AFCON) by the Confédération Africaine de Football (CAF).
    The tournament will be staged in the same year Ghana marks 70 years of independence, a milestone highlighting the country’s football heritage and contribution to the development of the game on the continent.
    According to CAF, the official dates and host venues for the tournament will be announced in due course.
    This will be the second time Ghana hosts the competition, having previously staged it in 1999, when the host nation went on to win the title. They have also won the title three more times, in 1993, 2009 and 2021.
    “The tournament holds a special place in Ghanaian football history, having served as a platform for the emergence of some of the continent’s most celebrated players,” said CAF in a statement on Tuesday.
    “Over the years, Ghana’s U-20 programme has produced a remarkable generation of football icons, including Stephen Appiah, Michael Essien, Sulley Muntari, Samuel Osei Kuffour, Derek Boateng, André Ayew, and Abdul Fatawu Issahaku, among others.”

    Latest Stories

    • A Super El Niño is coming: Five hard‑won lessons the world can learn from Africa
    • Zamzam fires back as Mombasa ODM succession battle takes shape
    • Faith Kipyegon reveals hamstring injury after rare defeat as focus shifts to second half of season
    • Less sunshine may worsen anxiety and depression symptoms, new research suggests

    The Ghana Football Association has since welcomed CAF’s decision, describing the move as a strong endorsement of Ghana’s growing reputation in African football and its continued commitment to youth development.
    According to the Association, CAF will work closely with a soon-to-be-established Local Organising Committee (LOC) to ensure the successful planning and execution of the tournament.
    “This collaboration is expected to focus on infrastructure readiness, logistics, security, and overall fan experience, all aimed at delivering a world-class event worthy of Africa’s growing football stature,” the Association said in a statement.
    The 2027 tournament will feature 12 teams drawn from across the continent, with qualification still to be decided. The four highest-placed teams will earn spots to represent Africa at the FIFA U-20 World Cup, making the competition even more important.

    Other Topics To Read

    Top Stories Today

    • Coast leaders rally support for 10-point agenda, reject divisive politics
    • A Super El Niño is coming: Five lessons Africa can teach the world
    • Faith Kipyegon reveals hamstring injury after rare defeat in Eugene
    • Study finds weather changes drive demand for mental health care
    • Government releases Sh4 billion to settle NHIF hospital claims
    • Kiharu MP Ndindi Nyoro announces exit from UDA

    `;
    }

    return “;
    }

    function commentActionsMarkup(comment, canComment) {
    const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
    const likeCount = Number(comment.like_count || 0) > 0
    ? “
    : ”;

    const likeButton = canComment && comment.status === ‘approved’
    ? “
    : “;

    const replyButton = canComment && comment.status === ‘approved’
    ? “
    : ”;

    return `

    `;
    }

    function commentMarkup(comment, canComment, isReply = false) {
    const pendingBadge = comment.status && comment.status !== ‘approved’
    ? “
    : ”;

    const edited = comment.is_edited
    ? “
    : ”;

    const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
    ? `

    `
    : “;

    return `

    `;
    }

    function replyFormMarkup(commentId) {
    return `

    `;
    }

    function setNotice(widget, message, type = ‘info’) {
    const notice = widget.querySelector(‘[data-role=”notice”]’);
    if (!notice) return;

    if (!message) {
    notice.hidden = true;
    notice.textContent = ”;
    notice.classList.remove(‘is-error’);
    return;
    }

    notice.hidden = false;
    notice.textContent = message;
    notice.classList.toggle(‘is-error’, type === ‘error’);
    }

    function setCount(widget, total) {
    const count = widget.querySelector(‘[data-role=”count”]’);
    if (!count) return;

    const num = Number(total || 0);
    count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
    }

    function openReplyBox(widget, commentId) {
    widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
    box.hidden = true;
    box.innerHTML = ”;
    });

    const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
    if (!targetItem) return;

    const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
    if (!replyBox) return;

    replyBox.hidden = false;
    replyBox.innerHTML = replyFormMarkup(commentId);

    const textarea = replyBox.querySelector(‘textarea’);
    if (textarea) textarea.focus();
    }

    function closeReplyBox(container) {
    if (!container) return;
    container.hidden = true;
    container.innerHTML = ”;
    }

    async function initCommentsWidget(widget) {
    const state = {
    articleId: Number(widget.dataset.articleId),
    loadUrl: widget.dataset.loadUrl,
    storeUrl: widget.dataset.storeUrl,
    commentsBaseUrl: widget.dataset.commentsBaseUrl,
    canComment: widget.dataset.canComment === ‘1’,
    page: 1,
    perPage: 10,
    sort: ‘newest’,
    total: 0,
    hasMore: false,
    busy: false
    };

    const list = widget.querySelector(‘[data-role=”list”]’);
    const loading = widget.querySelector(‘[data-role=”loading”]’);
    const empty = widget.querySelector(‘[data-role=”empty”]’);
    const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
    const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
    const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);

    async function loadComments(reset = true) {
    if (state.busy) return;

    state.busy = true;
    setNotice(widget, ”);
    loading.hidden = false;

    if (reset) {
    state.page = 1;
    list.innerHTML = ”;
    empty.hidden = true;
    }

    try {
    const url = new URL(state.loadUrl, window.location.origin);
    url.searchParams.set(‘page’, state.page);
    url.searchParams.set(‘per_page’, state.perPage);
    url.searchParams.set(‘sort’, state.sort);

    const response = await requestJson(url.toString(), {
    method: ‘GET’,
    headers: {
    ‘Accept’: ‘application/json’,
    ‘X-Requested-With’: ‘XMLHttpRequest’
    }
    });

    const items = Array.isArray(response.data) ? response.data : [];
    const meta = response.meta || {};

    state.total = Number(meta.total || 0);
    state.hasMore = !!meta.has_more;

    setCount(widget, state.total);

    if (reset) {
    list.innerHTML = ”;
    }

    if (!items.length && reset) {
    empty.hidden = false;
    } else {
    empty.hidden = true;
    list.insertAdjacentHTML(
    ‘beforeend’,
    items.map(item => commentMarkup(item, state.canComment, false)).join(”)
    );
    }

    loadMoreBtn.hidden = !state.hasMore;
    } catch (error) {
    if (!list.children.length) {
    empty.hidden = false;
    empty.textContent = ‘Unable to load comments right now.’;
    }
    setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
    } finally {
    loading.hidden = true;
    state.busy = false;
    }
    }

    async function submitTopLevelComment(form) {
    const textarea = form.querySelector(‘textarea[name=”content”]’);
    const button = form.querySelector(‘[data-role=”submit-comment”]’);

    if (!textarea) return;

    const content = textarea.value.trim();
    if (!content) return;

    const originalText = button ? button.textContent : ”;

    try {
    if (button) {
    button.disabled = true;
    button.textContent = ‘Posting…’;
    }

    const response = await requestJson(state.storeUrl, {
    method: ‘POST’,
    headers: buildJsonHeaders(),
    body: JSON.stringify({
    article_id: state.articleId,
    content: content,
    source_url: window.location.href
    })
    });

    textarea.value = ”;

    if (response?.data) {
    list.insertAdjacentHTML(
    ‘afterbegin’,
    commentMarkup(response.data, state.canComment, false)
    );
    empty.hidden = true;

    if ((response.data.status || ”) === ‘approved’) {
    state.total += 1;
    setCount(widget, state.total);
    }
    }

    setNotice(widget, response.message || ‘Comment posted successfully.’);
    } catch (error) {
    setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
    } finally {
    if (button) {
    button.disabled = false;
    button.textContent = originalText || ‘Post comment’;
    }
    }
    }

    async function submitReply(form) {
    const commentId = Number(form.dataset.commentId || 0);
    const textarea = form.querySelector(‘textarea[name=”content”]’);
    const button = form.querySelector(‘.ev-comments__reply-submit’);

    if (!commentId || !textarea) return;

    const content = textarea.value.trim();
    if (!content) return;

    const originalText = button ? button.textContent : ”;

    try {
    if (button) {
    button.disabled = true;
    button.textContent = ‘Posting…’;
    }

    const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
    method: ‘POST’,
    headers: buildJsonHeaders(),
    body: JSON.stringify({
    article_id: state.articleId,
    content: content,
    source_url: window.location.href
    })
    });

    if (response?.data) {
    const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
    if (parentItem) {
    const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
    if (repliesWrap) {
    repliesWrap.insertAdjacentHTML(
    ‘beforeend’,
    commentMarkup(response.data, state.canComment, true)
    );
    }
    }
    }

    closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
    setNotice(widget, response.message || ‘Reply posted successfully.’);
    } catch (error) {
    setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
    } finally {
    if (button) {
    button.disabled = false;
    button.textContent = originalText || ‘Post reply’;
    }
    }
    }

    async function toggleLike(button) {
    const commentId = Number(button.dataset.commentId || 0);
    if (!commentId) return;

    const originalHtml = button.innerHTML;

    try {
    button.disabled = true;
    button.innerHTML = ‘Working…’;

    const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
    method: ‘POST’,
    headers: buildJsonHeaders(),
    body: JSON.stringify({})
    });

    const liked = !!response?.data?.liked;
    const likeCount = Number(response?.data?.like_count || 0);

    button.classList.toggle(‘is-liked’, liked);
    button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
    } catch (error) {
    button.innerHTML = originalHtml;
    setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
    } finally {
    button.disabled = false;
    }
    }

    if (composerForm) {
    composerForm.addEventListener(‘submit’, function (e) {
    e.preventDefault();
    submitTopLevelComment(composerForm);
    });
    }

    if (sortSelect) {
    sortSelect.addEventListener(‘change’, function () {
    state.sort = this.value || ‘newest’;
    loadComments(true);
    });
    }

    if (loadMoreBtn) {
    loadMoreBtn.addEventListener(‘click’, function () {
    if (state.busy || !state.hasMore) return;
    state.page += 1;
    loadComments(false);
    });
    }

    widget.addEventListener(‘click’, function (e) {
    const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
    if (likeBtn) {
    e.preventDefault();
    toggleLike(likeBtn);
    return;
    }

    const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
    if (replyBtn) {
    e.preventDefault();
    openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
    return;
    }

    const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
    if (cancelReplyBtn) {
    e.preventDefault();
    closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
    }
    });

    widget.addEventListener(‘submit’, function (e) {
    const replyForm = e.target.closest(‘.ev-comments__reply-form’);
    if (replyForm) {
    e.preventDefault();
    submitReply(replyForm);
    }
    });

    loadComments(true);
    }

    document.addEventListener(‘DOMContentLoaded’, function () {
    document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
    });
    })();

    Trending

    A Super El Niño is coming: Five hard‑won lessons the world can learn from Africa
    A Super El Niño is coming: Five hard‑won lessons the world can learn from AfricaClimate Change
    |The Conversation
    |27 minutes ago
    Zamzam fires back as Mombasa ODM succession battle takes shape
    Zamzam fires back as Mombasa ODM succession battle takes shapeVideos
    |Zawadi Charity
    |37 minutes ago
    Nyaribari Chache MP Zaheer Jhanda summoned as police widen probe into Kisii political violence
    Nyaribari Chache MP Zaheer Jhanda summoned as police widen probe into Kisii political violenceNews
    |Lucy Mumbi
    |7 hours ago
    Mbappé fires France past Paraguay into World Cup quarter-finals
    Mbappé fires France past Paraguay into World Cup quarter-finalsSports
    |Erick Kariuki
    |10 hours ago
    Coast leaders intensify unity drive, back 10-point agenda and urge end to divisive politics
    Coast leaders intensify unity drive, back 10-point agenda and urge end to divisive politicsPolitics
    |Farhiya Hussein
    |2 hours ago
    Kiharu MP Ndindi Nyoro announces exit from UDA
    Kiharu MP Ndindi Nyoro announces exit from UDAPolitics
    |Lucy Mumbi
    |3 hours ago
    DP Kindiki hails cooperatives as key to Kenya's economic transformation
    DP Kindiki hails cooperatives as key to Kenya’s economic transformationNews
    |Rachael Mutabasi
    |1 day ago
    Cherotich, Odira shine as Kenya dominates Prefontaine Classic despite rare Kipyegon defeat
    Cherotich, Odira shine as Kenya dominates Prefontaine Classic despite rare Kipyegon defeatSports
    |Erick Kariuki
    |11 hours ago
    Court declares Ruaraka School land public, rules Sh1.5 billion payout illegalNews
    |Carolyne Kubwa
    |22 hours ago
    Protest victims decry exclusion from government compensation programme despite registration
    Protest victims decry exclusion from government compensation programme despite registrationNews
    |Lucy Mumbi
    |6 hours ago

    2027 africa Ghana host Nations
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Johnson Benguru
    • Website

    Related Posts

    Who is Hossam Hassan? Egypt’s World Cup architect caught between football and politics

    July 5, 2026

    Traditional TV Advertising – South Africa

    July 5, 2026

    West Africa, Not ‘Worst Africa’: Harnessing the Region’s Extraordinary Wealth for Sustainable Development. Part II: Stronger Together — Why Regional Cooperation Is West Africa’s Greatest Competitive Advantage

    July 5, 2026
    Leave A Reply Cancel Reply

    Search
    Latest Post

    City Lodge Hotels looks to post-pandemic recovery as travel demand slowly rebuilds

    July 5, 2026

    Great Green Wall: Africa’s Ambitious Plan to Fight Climate Change Explained

    July 5, 2026

    Stock markets to track crude oil prices, global trends, TCS earnings this week: Analysts

    July 5, 2026

    Customs, Afreximbank Expand Trade Facilitation Partnership

    July 5, 2026

    ISA moves to challenge US, curb mining race – Global Times

    July 5, 2026

    Subscribe to Updates

    Get the latest creative news from FooBar about art, design and business.

    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • TikTok
    ABS TV and ABS Network News is a leading Pan-African 24/7 broadcasting network delivering nonstop news, talk shows, lifestyle programs, and digital media content worldwide through Satellite, Streaming Platforms, and Roku TV.
     
    Based in the United States, we connect Africa to the world while empowering creators, journalists, and brands through innovative media and broadcasting services.
    Facebook X (Twitter) Pinterest WhatsApp Instagram

    Our Picks

    City Lodge Hotels looks to post-pandemic recovery as travel demand slowly rebuilds

    Great Green Wall: Africa’s Ambitious Plan to Fight Climate Change Explained

    Stock markets to track crude oil prices, global trends, TCS earnings this week: Analysts

    Most Popular

    Customs, Afreximbank Expand Trade Facilitation Partnership

    ISA moves to challenge US, curb mining race – Global Times

    African reality TV moves to challenge foreign format dominance

    © 2026 Copyright. All Rights Reserved by ABSAFRICATV
    • Privacy Policy
    • Terms of Services

    Type above and press Enter to search. Press Esc to cancel.

    We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.