This commit is contained in:
Flatlogic Bot 2026-02-25 01:45:26 +00:00
parent 649064caeb
commit 777450559e
7 changed files with 387 additions and 331 deletions

View File

@ -16,7 +16,7 @@ class ApkController extends Controller {
$apk = $this->apkService->getBySlug($params['slug']); $apk = $this->apkService->getBySlug($params['slug']);
if (!$apk) { if (!$apk) {
header("HTTP/1.0 404 Not Found"); header("HTTP/1.0 404 Not Found");
echo "APK Not Found"; $this->view("404");
return; return;
} }
@ -32,7 +32,7 @@ class ApkController extends Controller {
if (!$apk) { if (!$apk) {
header("HTTP/1.0 404 Not Found"); header("HTTP/1.0 404 Not Found");
echo "APK Not Found"; $this->view("404");
return; return;
} }

View File

@ -33,7 +33,10 @@ class HomeController extends Controller {
$apk = $stmt->fetch(); $apk = $stmt->fetch();
if (!$apk) { if (!$apk) {
$this->redirect('/'); if (ob_get_level() > 0) ob_clean();
header("HTTP/1.0 404 Not Found");
$this->view('404');
return;
} }
// Store referral code if present specifically for this APK or take from global session // Store referral code if present specifically for this APK or take from global session
@ -57,7 +60,10 @@ class HomeController extends Controller {
$apk = $stmt->fetch(); $apk = $stmt->fetch();
if (!$apk) { if (!$apk) {
$this->redirect('/'); if (ob_get_level() > 0) ob_clean();
header("HTTP/1.0 404 Not Found");
$this->view('404');
return;
} }
// Increment download count // Increment download count

View File

@ -45,7 +45,11 @@ class Router {
} }
} }
// Handle 404
if (ob_get_level() > 0) {
ob_clean();
}
header("HTTP/1.0 404 Not Found"); header("HTTP/1.0 404 Not Found");
echo "404 Not Found"; require __DIR__ . "/../../views/404.php";
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -1,5 +1,5 @@
<?php <?php
return [ return array (
'home' => 'Home', 'home' => 'Home',
'search' => 'Search', 'search' => 'Search',
'search_placeholder' => 'Search for apps and games...', 'search_placeholder' => 'Search for apps and games...',
@ -37,8 +37,6 @@ return [
'manage_categories' => 'Manage Categories', 'manage_categories' => 'Manage Categories',
'manage_withdrawals' => 'Manage Withdrawals', 'manage_withdrawals' => 'Manage Withdrawals',
'general_settings' => 'General Settings', 'general_settings' => 'General Settings',
// Footer
'footer_about' => 'is your premier source for professional APK downloads, offering the latest and safest Android applications and games.', 'footer_about' => 'is your premier source for professional APK downloads, offering the latest and safest Android applications and games.',
'popular' => 'Popular', 'popular' => 'Popular',
'top_games' => 'Top Games', 'top_games' => 'Top Games',
@ -52,8 +50,6 @@ return [
'subscribe_text' => 'Stay updated with the latest APK releases.', 'subscribe_text' => 'Stay updated with the latest APK releases.',
'email_placeholder' => 'Your email address', 'email_placeholder' => 'Your email address',
'all_rights_reserved' => 'All rights reserved.', 'all_rights_reserved' => 'All rights reserved.',
// Home
'hero_title' => 'Download the Best <span class="text-success">Android APKs</span> Professionally', 'hero_title' => 'Download the Best <span class="text-success">Android APKs</span> Professionally',
'hero_subtitle' => 'Fast, safe, and secure downloads for your favorite mobile apps and games. No registration required to browse.', 'hero_subtitle' => 'Fast, safe, and secure downloads for your favorite mobile apps and games. No registration required to browse.',
'explore_apps' => 'Explore Apps', 'explore_apps' => 'Explore Apps',
@ -63,8 +59,6 @@ return [
'referral_journey_text' => 'Earn <b>Rp 500</b> for every download via your link. Join our community and share your favorite APKs.', 'referral_journey_text' => 'Earn <b>Rp 500</b> for every download via your link. Join our community and share your favorite APKs.',
'get_started' => 'Get Started', 'get_started' => 'Get Started',
'home_title_suffix' => ' - Professional APK Download Portal', 'home_title_suffix' => ' - Professional APK Download Portal',
// APK Detail
'official_version_text' => 'Official and original version. Verified safe for Android device.', 'official_version_text' => 'Official and original version. Verified safe for Android device.',
'downloads' => 'Downloads', 'downloads' => 'Downloads',
'verified_safe' => 'Verified Safe', 'verified_safe' => 'Verified Safe',
@ -92,12 +86,10 @@ return [
'apk_detail_title' => 'Download %s %s - %s', 'apk_detail_title' => 'Download %s %s - %s',
'apk_detail_meta_desc' => 'Download %s %s APK for free. %s', 'apk_detail_meta_desc' => 'Download %s %s APK for free. %s',
'apk_detail_meta_keywords' => '%s, %s apk, download %s', 'apk_detail_meta_keywords' => '%s, %s apk, download %s',
// Auth
'login_title' => 'Login to ApkNusa', 'login_title' => 'Login to ApkNusa',
'username' => 'Username', 'username' => 'Username',
'password' => 'Password', 'password' => 'Password',
'dont_have_account' => "Don't have an account?", 'dont_have_account' => 'Don\'t have an account?',
'register_here' => 'Register here', 'register_here' => 'Register here',
'register_title' => 'Register for ApkNusa', 'register_title' => 'Register for ApkNusa',
'confirm_password' => 'Confirm Password', 'confirm_password' => 'Confirm Password',
@ -108,8 +100,6 @@ return [
'error_invalid_login' => 'Invalid username or password', 'error_invalid_login' => 'Invalid username or password',
'error_password_mismatch' => 'Passwords do not match', 'error_password_mismatch' => 'Passwords do not match',
'error_username_exists' => 'Username already exists', 'error_username_exists' => 'Username already exists',
// Profile
'member_since' => 'Member since', 'member_since' => 'Member since',
'points' => 'Points', 'points' => 'Points',
'referrals' => 'Referrals', 'referrals' => 'Referrals',
@ -135,12 +125,8 @@ return [
'error_min_withdraw' => 'Minimum withdrawal is Rp 10.000', 'error_min_withdraw' => 'Minimum withdrawal is Rp 10.000',
'error_insufficient_balance' => 'Insufficient balance', 'error_insufficient_balance' => 'Insufficient balance',
'success_withdraw_submitted' => 'Withdrawal request submitted successfully', 'success_withdraw_submitted' => 'Withdrawal request submitted successfully',
// SEO Defaults
'meta_description_default' => 'Download Professional APKs.', 'meta_description_default' => 'Download Professional APKs.',
'meta_keywords_default' => 'apk, android, download', 'meta_keywords_default' => 'apk, android, download',
// Help Center
'help_center_title' => 'Help Center', 'help_center_title' => 'Help Center',
'faq_title' => 'Frequently Asked Questions', 'faq_title' => 'Frequently Asked Questions',
'faq_q1' => 'How to download APK from our site?', 'faq_q1' => 'How to download APK from our site?',
@ -152,12 +138,11 @@ return [
'contact_us' => 'Contact Us', 'contact_us' => 'Contact Us',
'contact_text' => 'Still have questions? Our support team is here to help you.', 'contact_text' => 'Still have questions? Our support team is here to help you.',
'send_email' => 'Send Email', 'send_email' => 'Send Email',
// Privacy Policy
'privacy_policy_title' => 'Privacy Policy', 'privacy_policy_title' => 'Privacy Policy',
'privacy_policy_content' => '<h3>1. Information We Collect</h3><p>We collect information that you provide directly to us, such as when you create an account, participate in our referral program, or communicate with us.</p><h3>2. How We Use Information</h3><p>We use the information we collect to provide, maintain, and improve our services, including processing your referral earnings and withdrawal requests.</p><h3>3. Data Security</h3><p>We take reasonable measures to help protect information about you from loss, theft, misuse and unauthorized access.</p>', 'privacy_policy_content' => '<h3>1. Information We Collect</h3><p>We collect information that you provide directly to us, such as when you create an account, participate in our referral program, or communicate with us.</p><h3>2. How We Use Information</h3><p>We use the information we collect to provide, maintain, and improve our services, including processing your referral earnings and withdrawal requests.</p><h3>3. Data Security</h3><p>We take reasonable measures to help protect information about you from loss, theft, misuse and unauthorized access.</p>',
// Terms of Service
'terms_of_service_title' => 'Terms of Service', 'terms_of_service_title' => 'Terms of Service',
'terms_of_service_content' => '<h3>1. Acceptance of Terms</h3><p>By accessing or using our website, you agree to be bound by these terms of service.</p><h3>2. User Conduct</h3><p>You agree not to use the website for any unlawful purpose or in any way that could damage, disable, or impair the website.</p><h3>3. Referral Program</h3><p>Abuse of the referral program, including but not limited to self-referrals or using bots, will result in account suspension and forfeiture of earnings.</p>', 'terms_of_service_content' => '<h3>1. Acceptance of Terms</h3><p>By accessing or using our website, you agree to be bound by these terms of service.</p><h3>2. User Conduct</h3><p>You agree not to use the website for any unlawful purpose or in any way that could damage, disable, or impair the website.</p><h3>3. Referral Program</h3><p>Abuse of the referral program, including but not limited to self-referrals or using bots, will result in account suspension and forfeiture of earnings.</p>',
]; '404_title' => 'Page Not Found',
'404_text' => 'The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.',
'back_to_home' => 'Back to Home',
);

View File

@ -1,5 +1,5 @@
<?php <?php
return [ return array (
'home' => 'Beranda', 'home' => 'Beranda',
'search' => 'Cari', 'search' => 'Cari',
'search_placeholder' => 'Cari aplikasi dan game...', 'search_placeholder' => 'Cari aplikasi dan game...',
@ -37,8 +37,6 @@ return [
'manage_categories' => 'Kelola Kategori', 'manage_categories' => 'Kelola Kategori',
'manage_withdrawals' => 'Kelola Penarikan', 'manage_withdrawals' => 'Kelola Penarikan',
'general_settings' => 'Pengaturan Umum', 'general_settings' => 'Pengaturan Umum',
// Footer
'footer_about' => 'adalah sumber utama Anda untuk unduhan APK profesional, menawarkan aplikasi dan game Android terbaru dan teraman.', 'footer_about' => 'adalah sumber utama Anda untuk unduhan APK profesional, menawarkan aplikasi dan game Android terbaru dan teraman.',
'popular' => 'Populer', 'popular' => 'Populer',
'top_games' => 'Game Teratas', 'top_games' => 'Game Teratas',
@ -52,8 +50,6 @@ return [
'subscribe_text' => 'Tetap update dengan rilis APK terbaru.', 'subscribe_text' => 'Tetap update dengan rilis APK terbaru.',
'email_placeholder' => 'Alamat email Anda', 'email_placeholder' => 'Alamat email Anda',
'all_rights_reserved' => 'Hak cipta dilindungi undang-undang.', 'all_rights_reserved' => 'Hak cipta dilindungi undang-undang.',
// Home
'hero_title' => 'Unduh <span class="text-success">APK Android</span> Terbaik Secara Profesional', 'hero_title' => 'Unduh <span class="text-success">APK Android</span> Terbaik Secara Profesional',
'hero_subtitle' => 'Unduhan cepat, aman, dan terpercaya untuk aplikasi dan game seluler favorit Anda. Tanpa perlu registrasi untuk menjelajah.', 'hero_subtitle' => 'Unduhan cepat, aman, dan terpercaya untuk aplikasi dan game seluler favorit Anda. Tanpa perlu registrasi untuk menjelajah.',
'explore_apps' => 'Jelajahi Aplikasi', 'explore_apps' => 'Jelajahi Aplikasi',
@ -63,8 +59,6 @@ return [
'referral_journey_text' => 'Dapatkan <b>Rp 500</b> untuk setiap unduhan melalui link Anda. Bergabunglah dengan komunitas kami dan bagikan APK favorit Anda.', 'referral_journey_text' => 'Dapatkan <b>Rp 500</b> untuk setiap unduhan melalui link Anda. Bergabunglah dengan komunitas kami dan bagikan APK favorit Anda.',
'get_started' => 'Mulai Sekarang', 'get_started' => 'Mulai Sekarang',
'home_title_suffix' => ' - Portal Unduh APK Profesional', 'home_title_suffix' => ' - Portal Unduh APK Profesional',
// APK Detail
'official_version_text' => 'Versi resmi dan asli. Diverifikasi aman untuk perangkat Android.', 'official_version_text' => 'Versi resmi dan asli. Diverifikasi aman untuk perangkat Android.',
'downloads' => 'Unduhan', 'downloads' => 'Unduhan',
'verified_safe' => 'Terverifikasi Aman', 'verified_safe' => 'Terverifikasi Aman',
@ -92,12 +86,10 @@ return [
'apk_detail_title' => 'Unduh %s %s - %s', 'apk_detail_title' => 'Unduh %s %s - %s',
'apk_detail_meta_desc' => 'Unduh APK %s %s secara gratis. %s', 'apk_detail_meta_desc' => 'Unduh APK %s %s secara gratis. %s',
'apk_detail_meta_keywords' => '%s, %s apk, unduh %s', 'apk_detail_meta_keywords' => '%s, %s apk, unduh %s',
// Auth
'login_title' => 'Masuk ke ApkNusa', 'login_title' => 'Masuk ke ApkNusa',
'username' => 'Username', 'username' => 'Username',
'password' => 'Kata Sandi', 'password' => 'Kata Sandi',
'dont_have_account' => "Belum punya akun?", 'dont_have_account' => 'Belum punya akun?',
'register_here' => 'Daftar di sini', 'register_here' => 'Daftar di sini',
'register_title' => 'Daftar di ApkNusa', 'register_title' => 'Daftar di ApkNusa',
'confirm_password' => 'Konfirmasi Kata Sandi', 'confirm_password' => 'Konfirmasi Kata Sandi',
@ -108,8 +100,6 @@ return [
'error_invalid_login' => 'Username atau kata sandi salah', 'error_invalid_login' => 'Username atau kata sandi salah',
'error_password_mismatch' => 'Kata sandi tidak cocok', 'error_password_mismatch' => 'Kata sandi tidak cocok',
'error_username_exists' => 'Username sudah terdaftar', 'error_username_exists' => 'Username sudah terdaftar',
// Profile
'member_since' => 'Anggota sejak', 'member_since' => 'Anggota sejak',
'points' => 'Poin', 'points' => 'Poin',
'referrals' => 'Referral', 'referrals' => 'Referral',
@ -135,12 +125,8 @@ return [
'error_min_withdraw' => 'Penarikan minimum adalah Rp 10.000', 'error_min_withdraw' => 'Penarikan minimum adalah Rp 10.000',
'error_insufficient_balance' => 'Saldo tidak mencukupi', 'error_insufficient_balance' => 'Saldo tidak mencukupi',
'success_withdraw_submitted' => 'Permintaan penarikan berhasil diajukan', 'success_withdraw_submitted' => 'Permintaan penarikan berhasil diajukan',
// SEO Defaults
'meta_description_default' => 'Unduh APK Profesional.', 'meta_description_default' => 'Unduh APK Profesional.',
'meta_keywords_default' => 'apk, android, unduh', 'meta_keywords_default' => 'apk, android, unduh',
// Help Center
'help_center_title' => 'Pusat Bantuan', 'help_center_title' => 'Pusat Bantuan',
'faq_title' => 'Pertanyaan yang Sering Diajukan', 'faq_title' => 'Pertanyaan yang Sering Diajukan',
'faq_q1' => 'Bagaimana cara mengunduh APK dari situs kami?', 'faq_q1' => 'Bagaimana cara mengunduh APK dari situs kami?',
@ -152,12 +138,11 @@ return [
'contact_us' => 'Hubungi Kami', 'contact_us' => 'Hubungi Kami',
'contact_text' => 'Masih punya pertanyaan? Tim dukungan kami siap membantu Anda.', 'contact_text' => 'Masih punya pertanyaan? Tim dukungan kami siap membantu Anda.',
'send_email' => 'Kirim Email', 'send_email' => 'Kirim Email',
// Privacy Policy
'privacy_policy_title' => 'Kebijakan Privasi', 'privacy_policy_title' => 'Kebijakan Privasi',
'privacy_policy_content' => '<h3>1. Informasi yang Kami Kumpulkan</h3><p>Kami mengumpulkan informasi yang Anda berikan langsung kepada kami, seperti saat Anda membuat akun, berpartisipasi dalam program referral kami, atau berkomunikasi dengan kami.</p><h3>2. Bagaimana Kami Menggunakan Informasi</h3><p>Kami menggunakan informasi yang kami kumpulkan untuk menyediakan, memelihara, dan meningkatkan layanan kami, termasuk memproses pendapatan referral dan permintaan penarikan Anda.</p><h3>3. Data Security</h3><p>Kami mengambil langkah-langkah yang wajar untuk membantu melindungi informasi tentang Anda dari kehilangan, pencurian, penyalahgunaan, dan akses yang tidak sah.</p>', 'privacy_policy_content' => '<h3>1. Informasi yang Kami Kumpulkan</h3><p>Kami mengumpulkan informasi yang Anda berikan langsung kepada kami, seperti saat Anda membuat akun, berpartisipasi dalam program referral kami, atau berkomunikasi dengan kami.</p><h3>2. Bagaimana Kami Menggunakan Informasi</h3><p>Kami menggunakan informasi yang kami kumpulkan untuk menyediakan, memelihara, dan meningkatkan layanan kami, termasuk memproses pendapatan referral dan permintaan penarikan Anda.</p><h3>3. Data Security</h3><p>Kami mengambil langkah-langkah yang wajar untuk membantu melindungi informasi tentang Anda dari kehilangan, pencurian, penyalahgunaan, dan akses yang tidak sah.</p>',
// Terms of Service
'terms_of_service_title' => 'Ketentuan Layanan', 'terms_of_service_title' => 'Ketentuan Layanan',
'terms_of_service_content' => '<h3>1. Penerimaan Ketentuan</h3><p>Dengan mengakses atau menggunakan situs web kami, Anda setuju untuk terikat oleh ketentuan layanan ini.</p><h3>2. Perilaku Pengguna</h3><p>Anda setuju untuk tidak menggunakan situs web untuk tujuan yang melanggar hukum atau dengan cara apa pun yang dapat merusak, melumpuhkan, atau mengganggu situs web.</p><h3>3. Program Referral</h3><p>Penyalahgunaan program referral, termasuk namun tidak terbatas pada referral diri sendiri atau menggunakan bot, akan mengakibatkan penangguhan akun dan penghapusan pendapatan.</p>', 'terms_of_service_content' => '<h3>1. Penerimaan Ketentuan</h3><p>Dengan mengakses atau menggunakan situs web kami, Anda setuju untuk terikat oleh ketentuan layanan ini.</p><h3>2. Perilaku Pengguna</h3><p>Anda setuju untuk tidak menggunakan situs web untuk tujuan yang melanggar hukum atau dengan cara apa pun yang dapat merusak, melumpuhkan, atau mengganggu situs web.</p><h3>3. Program Referral</h3><p>Penyalahgunaan program referral, termasuk namun tidak terbatas pada referral diri sendiri atau menggunakan bot, akan mengakibatkan penangguhan akun dan penghapusan pendapatan.</p>',
]; '404_title' => 'Halaman Tidak Ditemukan',
'404_text' => 'Halaman yang Anda cari mungkin telah dihapus, namanya diubah, atau sementara tidak tersedia.',
'back_to_home' => 'Kembali ke Beranda',
);

76
views/404.php Normal file
View File

@ -0,0 +1,76 @@
<?php include 'header.php'; ?>
<div class="container overflow-hidden">
<div class="row min-vh-100 align-items-center justify-content-center">
<div class="col-md-10 col-lg-8 text-center position-relative">
<!-- Large Decorative background 404 -->
<div class="position-absolute top-50 start-50 translate-middle z-0 opacity-5 d-none d-md-block" style="font-size: 20rem; font-weight: 900; letter-spacing: -0.5rem; pointer-events: none; user-select: none;">
404
</div>
<div class="position-relative z-1 py-5">
<div class="mb-5 floating-animation">
<!-- Custom SVG Illustration instead of icons for better reliability -->
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg" class="mx-auto shadow-sm p-4 rounded-circle bg-white border border-light">
<path d="M100 0C44.7715 0 0 44.7715 0 100C0 155.228 44.7715 200 100 200C155.228 200 200 155.228 200 100C200 44.7715 155.228 0 100 0ZM100 185C53.0558 185 15 146.944 15 100C15 53.0558 53.0558 15 100 15C146.944 15 185 53.0558 185 100C185 146.944 146.944 185 100 185Z" fill="#00C853" fill-opacity="0.1"/>
<circle cx="100" cy="100" r="70" fill="#00C853" fill-opacity="0.05"/>
<path d="M100 60V110" stroke="#00C853" stroke-width="12" stroke-linecap="round"/>
<circle cx="100" cy="135" r="8" fill="#00C853"/>
<path d="M60 85L50 95M140 85L150 95" stroke="#00C853" stroke-width="8" stroke-linecap="round"/>
</svg>
</div>
<h1 class="display-3 fw-bold mb-3 text-dark"><?php echo __('404_title'); ?></h1>
<p class="text-muted fs-5 mb-5 max-width-600 mx-auto px-3">
<?php echo __('404_text'); ?>
</p>
<div class="d-flex flex-column flex-sm-row gap-3 justify-content-center align-items-center mb-5 px-3">
<a href="/" class="btn btn-success btn-lg rounded-pill px-5 py-3 shadow-sm hover-lift d-flex align-items-center w-100 w-sm-auto">
<i class="bi bi-house-door-fill me-2"></i>
<span class="fw-bold"><?php echo __('back_to_home'); ?></span>
</a>
<button onclick="window.history.back()" class="btn btn-outline-dark btn-lg rounded-pill px-5 py-3 hover-lift d-flex align-items-center w-100 w-sm-auto">
<i class="bi bi-arrow-left me-2"></i>
<span class="fw-bold"><?php echo __('Kembali', 'Kembali'); ?></span>
</button>
</div>
<div class="mt-5 p-4 bg-white rounded-5 shadow-sm border border-light-subtle max-width-500 mx-auto mx-3">
<p class="text-muted small fw-medium mb-3"><?php echo __('search_placeholder'); ?></p>
<form action="/" method="GET">
<div class="input-group bg-light rounded-pill p-1 border">
<span class="input-group-text bg-transparent border-0 ps-3">
<i class="bi bi-search text-muted small"></i>
</span>
<input type="text" name="search" class="form-control bg-transparent border-0 py-2 fs-6" placeholder="<?php echo __('search', 'Search...'); ?>">
<button class="btn btn-success rounded-pill px-4 fw-bold" type="submit"><?php echo __('search'); ?></button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<style>
.max-width-600 {
max-width: 600px;
}
.max-width-500 {
max-width: 500px;
}
.bg-light {
background-color: #f8f9fa !important;
}
.shadow-sm {
box-shadow: 0 .125rem .25rem rgba(0,0,0,.075) !important;
}
@media (max-width: 768px) {
.display-3 {
font-size: 2.5rem;
}
}
</style>
<?php include 'footer.php'; ?>