Listen to article
3 min listen
Audio reading is not supported on this browser.
Ready
Thanks for listening. Continue with a related story, or tap the speaker icon on the next page to listen.
South Sudan eyes tourism growth after first UNESCO World Heritage inscription
XINHUA
·
1 day agoRead nextOpens a fresh page.
The caution comes amid increasing political statements that have drawn criticism for bordering on hate speech, raising concerns over their potential impact on one of the country’s leading economic sectors.
Tourism stakeholders have warned that inflammatory political rhetoric could undermine Kenya’s tourism industry, saying growing political tensions risk damaging the country’s image and discouraging international visitors.
The caution comes amid increasing political statements that have drawn criticism for bordering on hate speech, raising concerns over their potential impact on one of the country’s leading economic sectors.
Kenya Association of Hotelkeepers and Caterers (KAHC) Executive Director Sam Ikwaye said leaders should exercise restraint, noting that the industry supports millions of livelihoods and remains a major contributor to the Coast and national economies.
More To Read
- South Sudan eyes tourism growth after first UNESCO World Heritage inscription
- Court to decide on August 19 whether Mukurwe-ini MP Kaguchia will take plea
- Digital strategist Justin Kinyua arrested over alleged hate speech, ethnic contempt posts
- Mukurwe-ini MP John Kaguchia pleads not guilty to incitement charge
- Kenya’s national parks hit 3.5 million visits as domestic tourism surges
- Lawyers ask High Court to declare CS Aden Duale unfit for public office over Mandera remarks
“We would like to urge caution among our leaders. The words they spew could have devastating effects on the tourism sector. Words have power,” Ikwaye said.
He spoke during the graduation of more than 300 participants under the Recognition of Prior Learning (RPL) programme at the Kenya Coast National Polytechnic.
Ikwaye said Kenya’s target of attracting five million international tourists this year can only be achieved if all stakeholders work together to improve both visitor confidence and service delivery.
Latest Stories
- Majengo garbage crisis worsens as rubbish piles up near homes, food stalls and water points
- Kenya’s agricultural output hits Sh4 trillion as county investments fuel growth
- UNICEF says Ebola outbreak is keeping DRC children and families in Ituri Province away from hospitals
- Uganda approves troop deployment to proposed Gaza stabilisation force
He also renewed calls for the implementation of an open skies policy, arguing that increasing direct international flights to the Coast would boost tourist arrivals.
“That is why we insist that we need the open skies policy to liberalise the airspace so that more planes can bring tourists directly to the Coast region,” he said.
The government has set a target of five million international visitors after Kenya recorded a historic 2.7 million arrivals last year, generating about Sh500 billion in tourism earnings.
The graduation marked a milestone for workers whose skills have been formally recognised through the Recognition of Prior Learning programme.
The national initiative assesses and certifies competencies acquired through informal employment and work experience, enabling participants to obtain recognised qualifications without undergoing conventional training. The graduates were sponsored through the Tourism Fund.
Kenya Coast National Polytechnic Council Chairperson Patricia Mbogo said the programme is helping bridge the gap for skilled workers who have lacked formal qualifications despite years of experience.
“Through this RPL programme, these young people can now have documents that, coupled with their skills, will open doors for them to work in any part of the world,” Mbogo said.
Other Topics To Read
Top Stories Today
- Garbage crisis puts Majengo families at growing health risk
- Kenya’s agricultural output hits Sh4 trillion as county investments fuel growth
- Uganda approves troop deployment to proposed Gaza stabilisation force
- Kalonzo urges Sudan to reopen market for Kenyan tea exports
- CJ Koome calls for urgent action as SGBV cases surge in Bungoma
- Gor Mahia face <a href="https://absafricatv.com/africa-financial-inclusion-summit-and-expo-2026/” title=”Africa Financial Inclusion Summit and Expo 2026″>African champions Pyramids in Champions League opener
`;
}
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
𝐄𝐚𝐬𝐭𝐥𝐞𝐢𝐠𝐡 𝐕𝐨𝐢𝐜𝐞 𝐚𝐭 𝐍𝐢𝐧𝐞 – Isiolo communities’ representatives march to Nairobi over land ownership disputeVideos
|Zawadi Charity
|3 hours ago
Somali midfielder Jarma Mohamed joins English non‑league side Jersey BullsSports
|Abdirahman Khalif
|14 hours ago
2026 national examinations at risk as KNEC battles Sh6.7 billion funding shortfallNews
|Lucy Mumbi
|1 day ago
New cohort of Elite Special Operations Group officers graduates to tackle emerging terror threatsNews
|Mary Wambui
|6 hours ago
Majengo garbage crisis worsens as rubbish piles up near homes, food stalls and water pointsCity Affairs
|Charity Kilei
|2 hours ago
CJ Martha Koome warns SGBV crisis is devastating families in Bungoma, calls for urgent actionNews
|Carolyne Kubwa
|3 hours ago
Somalia orders ministers to use Somali passports only for official travelSomalia
|Abdirahman Khalif
|5 hours ago
Kenya set to boost digital hub status with two new undersea fibre-optic cablesBusiness
|Margaret Wanjiru
|5 hours ago
Telecom complaints top ICT consumer grievances in Kenya as service quality concerns persistBusiness
|Alfred Onyango
|10 hours ago
Akonnor hails Gor Mahia’s character as K’Ogalo close in on first CECAFA title in 41 yearsNews
|Erick Kariuki
|1 day ago

