rebrand: ganti sisa teks 'GitHub' -> 'Gitea' (UI, komentar, dokumen)

This commit is contained in:
oxpoe committed 2026-10-14 21:09:02 +07:00
1 parent 6817404688
commit 19558b9b94
14 files changed
+20 -20

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@ Format mengikuti [Keep a Changelog](https://keepachangelog.com/) dan [Semantic V
### Diperbaiki ### Diperbaiki
- Kolom **IP Address** di **GenieACS Pro** kini tampil saat **mode pencarian** (sebelumnya kosong). - Kolom **IP Address** di **GenieACS Pro** kini tampil saat **mode pencarian** (sebelumnya kosong).
- Menu **Update GitHub** otomatis disembunyikan pada instalasi **tanpa `.git`** (container/Docker), tetap tampil pada instalasi git. - Menu **Update Gitea** otomatis disembunyikan pada instalasi **tanpa `.git`** (container/Docker), tetap tampil pada instalasi git.
### Ditambahkan ### Ditambahkan
- **Badge kelengkapan data** di daftar pelanggan: centang hijau = **nomor HP + koordinat + ACS** lengkap; silang merah = ada yang kurang (tooltip menyebut yang belum). - **Badge kelengkapan data** di daftar pelanggan: centang hijau = **nomor HP + koordinat + ACS** lengkap; silang merah = ada yang kurang (tooltip menyebut yang belum).
+1 -1
View File
@@ -30,6 +30,6 @@ Kode Etik ini berlaku di seluruh ruang proyek (repositori, issues, PR) dan saat
## Penegakan ## Penegakan
Perilaku yang tidak dapat diterima dapat dilaporkan kepada pengelola melalui **GitHub** (buat issue privat/mention `@oxpoe`). Semua laporan akan ditinjau dan ditangani secara adil dan rahasia. Perilaku yang tidak dapat diterima dapat dilaporkan kepada pengelola melalui **Gitea** (buat issue privat/mention `@oxpoe`). Semua laporan akan ditinjau dan ditangani secara adil dan rahasia.
Teks ini diadaptasi dari [Contributor Covenant](https://www.contributor-covenant.org), versi 2.1. Teks ini diadaptasi dari [Contributor Covenant](https://www.contributor-covenant.org), versi 2.1.
+1 -1
View File
@@ -10,7 +10,7 @@
**Jangan** membuka Issue publik untuk masalah keamanan. **Jangan** membuka Issue publik untuk masalah keamanan.
Gunakan tab **Security → Report a vulnerability** (GitHub Security Advisories) pada repositori ini, atau hubungi pengelola secara privat melalui GitHub. Gunakan tab **Security → Report a vulnerability** (Gitea Security Advisories) pada repositori ini, atau hubungi pengelola secara privat melalui Gitea.
Sertakan: deskripsi, langkah reproduksi, dampak, dan (bila ada) saran perbaikan. Kami akan berusaha merespons secepatnya. Sertakan: deskripsi, langkah reproduksi, dampak, dan (bila ada) saran perbaikan. Kami akan berusaha merespons secepatnya.
+1 -1
View File
@@ -2,7 +2,7 @@
## 1. Uji manual cepat ## 1. Uji manual cepat
1. **Landing** `/` — hero, paket, switcher **ID/EN**, link GitHub/Wiki/Lisensi. 1. **Landing** `/` — hero, paket, switcher **ID/EN**, link Gitea/Wiki/Lisensi.
2. **Login admin** `/admin/login` → `admin` / `demo-isp123` → dashboard. 2. **Login admin** `/admin/login` → `admin` / `demo-isp123` → dashboard.
3. **Pelanggan** `/customer/login` → masukkan nomor HP demo **`081200000001`** (login pelanggan hanya butuh nomor HP) → dashboard & tagihan. 3. **Pelanggan** `/customer/login` → masukkan nomor HP demo **`081200000001`** (login pelanggan hanya butuh nomor HP) → dashboard & tagihan.
4. **Health** `/health` · versi `/version.txt`. 4. **Health** `/health` · versi `/version.txt`.
+1 -1
View File
@@ -57,7 +57,7 @@ const createSqliteSessionStore = require('./config/sqliteSessionStore');
const { getSetting, getSettingsWithCache, ensureDefaultSettings, getNowLocal, formatDateLocal, formatTimeLocal, parseDateInTimezone } = require('./config/settingsManager'); const { getSetting, getSettingsWithCache, ensureDefaultSettings, getNowLocal, formatDateLocal, formatTimeLocal, parseDateInTimezone } = require('./config/settingsManager');
const { SUPPORTED_LANGS, FALLBACK_LANG, normalizeLang, t } = require('./config/i18n'); const { SUPPORTED_LANGS, FALLBACK_LANG, normalizeLang, t } = require('./config/i18n');
// Pastikan semua default settings ada (untuk migrasi/update dari GitHub) // Pastikan semua default settings ada (untuk migrasi/update dari Gitea)
if (typeof ensureDefaultSettings === 'function') { if (typeof ensureDefaultSettings === 'function') {
ensureDefaultSettings(); ensureDefaultSettings();
} }
+1 -1
View File
@@ -532,7 +532,7 @@ db.exec(`
/** /**
* Memastikan menu-menu utama (WA, Settings, dll) selalu terbuka (Visible) * Memastikan menu-menu utama (WA, Settings, dll) selalu terbuka (Visible)
* meskipun setelah update dari GitHub yang mungkin mengunci menu tersebut secara default. * meskipun setelah update dari Gitea yang mungkin mengunci menu tersebut secara default.
*/ */
function forceUnlockCoreMenus() { function forceUnlockCoreMenus() {
try { try {
+1 -1
View File
@@ -285,7 +285,7 @@ function ensureDefaultSettings() {
// Default settings yang wajib ada // Default settings yang wajib ada
const defaultSettings = { const defaultSettings = {
// RADIUS Server settings (ditambahkan untuk update dari GitHub) // RADIUS Server settings (ditambahkan untuk update dari Gitea)
radius_enabled: '0', radius_enabled: '0',
radius_secret: 'secret123', radius_secret: 'secret123',
radius_auth_port: '1812', radius_auth_port: '1812',
+2 -2
View File
@@ -407,7 +407,7 @@ function getUpdateInfo(repoRoot) {
? runCmd('git', ['show', 'FETCH_HEAD:version.txt'], repoRoot) ? runCmd('git', ['show', 'FETCH_HEAD:version.txt'], repoRoot)
: runCmd('git', ['show', `origin/${branch}:version.txt`], repoRoot); : runCmd('git', ['show', `origin/${branch}:version.txt`], repoRoot);
if (!remote.ok) { if (!remote.ok) {
info.error = `Tidak bisa membaca version.txt dari GitHub (origin/${branch}).`; info.error = `Tidak bisa membaca version.txt dari Gitea (origin/${branch}).`;
return info; return info;
} }
@@ -4643,7 +4643,7 @@ router.post('/update/run', requireAdminSession, restrictToAdmin, (req, res) => {
? runCmd('git', ['show', 'FETCH_HEAD:version.txt'], repoRoot) ? runCmd('git', ['show', 'FETCH_HEAD:version.txt'], repoRoot)
: runCmd('git', ['show', `origin/${branch}:version.txt`], repoRoot); : runCmd('git', ['show', `origin/${branch}:version.txt`], repoRoot);
pushCmd(`git show origin/${branch}:version.txt`, remote); pushCmd(`git show origin/${branch}:version.txt`, remote);
if (!remote.ok) throw new Error('Tidak bisa membaca version.txt dari GitHub.'); if (!remote.ok) throw new Error('Tidak bisa membaca version.txt dari Gitea.');
const remoteVersion = String(remote.stdout || '').trim() || '-'; const remoteVersion = String(remote.stdout || '').trim() || '-';
if (remoteVersion !== '-' && remoteVersion === localBefore) { if (remoteVersion !== '-' && remoteVersion === localBefore) {
+1 -1
View File
@@ -74,7 +74,7 @@ const MENU_DEFINITIONS = [
] }, ] },
{ key: 'grp_system', section: 'system', href: '/admin/settings', icon: 'bi bi-gear', labelKey: 'admin.nav.grp_system', labelDefault: 'Sistem', roles: ['admin'], activePages: ['update', 'service_notice', 'settings', 'ewallet_logs', 'backup', 'audit_logs'], children: [ { key: 'grp_system', section: 'system', href: '/admin/settings', icon: 'bi bi-gear', labelKey: 'admin.nav.grp_system', labelDefault: 'Sistem', roles: ['admin'], activePages: ['update', 'service_notice', 'settings', 'ewallet_logs', 'backup', 'audit_logs'], children: [
{ key: 'update', section: 'system', href: '/admin/update', icon: 'bi bi-cloud-arrow-down', labelKey: 'admin.nav.update', labelDefault: 'Update GitHub', roles: ['admin'], activePages: ['update'] }, { key: 'update', section: 'system', href: '/admin/update', icon: 'bi bi-cloud-arrow-down', labelKey: 'admin.nav.update', labelDefault: 'Update Gitea', roles: ['admin'], activePages: ['update'] },
{ key: 'service_notice', section: 'system', href: '/admin/service-notice', icon: 'bi bi-megaphone-fill', labelKey: 'admin.nav.service_notice', labelDefault: 'Status Layanan', roles: ['admin'], activePages: ['service_notice'] }, { key: 'service_notice', section: 'system', href: '/admin/service-notice', icon: 'bi bi-megaphone-fill', labelKey: 'admin.nav.service_notice', labelDefault: 'Status Layanan', roles: ['admin'], activePages: ['service_notice'] },
{ key: 'settings', section: 'system', href: '/admin/settings', icon: 'bi bi-gear', labelKey: 'admin.nav.settings', labelDefault: 'Pengaturan', roles: ['admin'], activePages: ['settings'] }, { key: 'settings', section: 'system', href: '/admin/settings', icon: 'bi bi-gear', labelKey: 'admin.nav.settings', labelDefault: 'Pengaturan', roles: ['admin'], activePages: ['settings'] },
{ key: 'ewallet_logs', section: 'system', href: '/admin/ewallet-logs', icon: 'bi bi-journal-text', labelKey: 'admin.nav.log_rekap', labelDefault: 'Log & Rekap', roles: ['admin'], activePages: ['ewallet_logs'] }, { key: 'ewallet_logs', section: 'system', href: '/admin/ewallet-logs', icon: 'bi bi-journal-text', labelKey: 'admin.nav.log_rekap', labelDefault: 'Log & Rekap', roles: ['admin'], activePages: ['ewallet_logs'] },
+1 -1
View File
@@ -164,7 +164,7 @@ document.addEventListener('DOMContentLoaded', () => {
</div> </div>
<div style="margin-top:14px;display:flex;flex-direction:column;gap:8px"> <div style="margin-top:14px;display:flex;flex-direction:column;gap:8px">
<a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" class="btn btn-p" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px"> <a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" class="btn btn-p" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px">
<i class="bi bi-github"></i> <%= t('admin.lock.get_code','Ambil Kode Aktivasi (Gratis)') %> <i class="bi bi-git"></i> <%= t('admin.lock.get_code','Ambil Kode Aktivasi (Gratis)') %>
</a> </a>
<a href="/admin/sidebar-settings" class="btn btn-g" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px" onclick="hideLockedMenuNotice()"> <a href="/admin/sidebar-settings" class="btn btn-g" style="width:100%;display:flex;align-items:center;justify-content:center;gap:8px" onclick="hideLockedMenuNotice()">
<i class="bi bi-layout-sidebar-inset"></i> <%= t('admin.lock.open_settings','Buka Pengaturan Sidebar') %> <i class="bi bi-layout-sidebar-inset"></i> <%= t('admin.lock.open_settings','Buka Pengaturan Sidebar') %>
+1 -1
View File
@@ -590,7 +590,7 @@
} }
</script> </script>
<div class="fg"> <div class="fg">
<label class="fl"><%= t('admin.set.repo_link','Link Repositori Proyek (GitHub)') %></label> <label class="fl"><%= t('admin.set.repo_link','Link Repositori Proyek (Gitea)') %></label>
<input class="fc" name="project_url" value="<%= settings.project_url || 'https://gitea.oxpoe.qzz.io/oxpoe/open-isp' %>" placeholder="https://gitea.oxpoe.qzz.io/oxpoe/open-isp"> <input class="fc" name="project_url" value="<%= settings.project_url || 'https://gitea.oxpoe.qzz.io/oxpoe/open-isp' %>" placeholder="https://gitea.oxpoe.qzz.io/oxpoe/open-isp">
<div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.repo_hint','Dipakai untuk tautan ') %><b>Repo</b>, <b>Form/Issue</b> (<code>/issues/new/choose</code>), <b>Wiki</b>, dan <b>Lisensi</b> di landing page.</div> <div style="font-size:10px; color:var(--muted); margin-top:4px"><%= t('admin.set.repo_hint','Dipakai untuk tautan ') %><b>Repo</b>, <b>Form/Issue</b> (<code>/issues/new/choose</code>), <b>Wiki</b>, dan <b>Lisensi</b> di landing page.</div>
</div> </div>
+4 -4
View File
@@ -10,7 +10,7 @@
<%- include('partials/sidebar', { activePage: activePage || 'update', company }) %> <%- include('partials/sidebar', { activePage: activePage || 'update', company }) %>
<div class="mw"> <div class="mw">
<div class="topbar"> <div class="topbar">
<div class="tb-title"><button class="hb-menu" onclick="toggleSidebar()"><i class="bi bi-list"></i></button><i class="bi bi-cloud-arrow-down"></i> <%= t('admin.update.title', 'Update GitHub') %></div> <div class="tb-title"><button class="hb-menu" onclick="toggleSidebar()"><i class="bi bi-list"></i></button><i class="bi bi-cloud-arrow-down"></i> <%= t('admin.update.title', 'Update Gitea') %></div>
<div class="tb-right"> <div class="tb-right">
<span class="adm-badge"><i class="bi bi-person-fill"></i> <%= t('admin.role.admin', 'Admin') %></span> <span class="adm-badge"><i class="bi bi-person-fill"></i> <%= t('admin.role.admin', 'Admin') %></span>
<a href="/admin/logout" class="btn btn-g btn-sm"><i class="bi bi-box-arrow-left"></i> <%= t('common.logout', 'Logout') %></a> <a href="/admin/logout" class="btn btn-g btn-sm"><i class="bi bi-box-arrow-left"></i> <%= t('common.logout', 'Logout') %></a>
@@ -49,9 +49,9 @@
</div> </div>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl"><%= t('admin.update.github_version_prefix', 'Versi GitHub (') %><%= info?.repo || 'origin' %>/<%= info?.branch || '-' %><%= t('admin.update.github_version_suffix', ')') %></label> <label class="fl"><%= t('admin.update.github_version_prefix', 'Versi Gitea (') %><%= info?.repo || 'origin' %>/<%= info?.branch || '-' %><%= t('admin.update.github_version_suffix', ')') %></label>
<div class="fc" style="display:flex;align-items:center;gap:8px"> <div class="fc" style="display:flex;align-items:center;gap:8px">
<i class="bi bi-github"></i> <i class="bi bi-git"></i>
<span style="font-weight:800"><%= info?.remoteVersion || '-' %></span> <span style="font-weight:800"><%= info?.remoteVersion || '-' %></span>
<% if (info?.needsUpdate) { %> <% if (info?.needsUpdate) { %>
<span class="badge badge-d" style="margin-left:8px"><i class="bi bi-arrow-up-circle"></i> <%= t('admin.update.has_update', 'Ada update') %></span> <span class="badge badge-d" style="margin-left:8px"><i class="bi bi-arrow-up-circle"></i> <%= t('admin.update.has_update', 'Ada update') %></span>
@@ -92,7 +92,7 @@
<script> <script>
function confirmUpdate() { function confirmUpdate() {
return confirm("<%= t('admin.update.confirm', 'Jalankan update dari GitHub sekarang? Pastikan koneksi internet aman dan aplikasi akan direstart setelah selesai.') %>"); return confirm("<%= t('admin.update.confirm', 'Jalankan update dari Gitea sekarang? Pastikan koneksi internet aman dan aplikasi akan direstart setelah selesai.') %>");
} }
</script> </script>
</body> </body>
+1 -1
View File
@@ -159,7 +159,7 @@
<!-- AKTIVASI PLACEHOLDER --> <!-- AKTIVASI PLACEHOLDER -->
<div id="activationPlaceholder" class="activation-card"> <div id="activationPlaceholder" class="activation-card">
<div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px"> <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px">
<span class="badge bp"><i class="bi bi-github"></i> <%= t('donate.code_free','KODE AKTIVASI GRATIS') %></span> <span class="badge bp"><i class="bi bi-git"></i> <%= t('donate.code_free','KODE AKTIVASI GRATIS') %></span>
<span style="font-weight:700;font-size:14px"><%= t('donate.status','Status:') %> <span style="color:var(--warning);font-weight:800" id="statusText"><%= t('donate.waiting_donation','Menunggu Donasi Masuk') %></span></span> <span style="font-weight:700;font-size:14px"><%= t('donate.status','Status:') %> <span style="color:var(--warning);font-weight:800" id="statusText"><%= t('donate.waiting_donation','Menunggu Donasi Masuk') %></span></span>
</div> </div>
<p class="muted" style="font-size:13.5px;margin:0"><i class="bi bi-info-circle" style="color:var(--info)"></i> <%= t('donate.menu_code','Kode aktivasi menu') %> <strong style="color:var(--primary)"><%= t('donate.free','GRATIS') %></strong> di <a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:var(--primary)"><%= t('donate.wiki','Wiki OPEN-ISP') %></a>. Donasi bersifat sukarela; jika berdonasi, kode juga otomatis dikirim ke WhatsApp Anda begitu pembayaran terdeteksi.</p> <p class="muted" style="font-size:13.5px;margin:0"><i class="bi bi-info-circle" style="color:var(--info)"></i> <%= t('donate.menu_code','Kode aktivasi menu') %> <strong style="color:var(--primary)"><%= t('donate.free','GRATIS') %></strong> di <a href="https://gitea.oxpoe.qzz.io/oxpoe/open-isp/wiki" target="_blank" rel="noopener" style="color:var(--primary)"><%= t('donate.wiki','Wiki OPEN-ISP') %></a>. Donasi bersifat sukarela; jika berdonasi, kode juga otomatis dikirim ke WhatsApp Anda begitu pembayaran terdeteksi.</p>
+3 -3
View File
@@ -46,7 +46,7 @@
<a href="/lang/id" style="<%= (typeof lang !== 'undefined' && lang === 'id') ? 'color:var(--primary);font-weight:700' : '' %>">ID</a> <a href="/lang/id" style="<%= (typeof lang !== 'undefined' && lang === 'id') ? 'color:var(--primary);font-weight:700' : '' %>">ID</a>
<a href="/lang/en" style="<%= (typeof lang !== 'undefined' && lang === 'en') ? 'color:var(--primary);font-weight:700' : '' %>">EN</a> <a href="/lang/en" style="<%= (typeof lang !== 'undefined' && lang === 'en') ? 'color:var(--primary);font-weight:700' : '' %>">EN</a>
<% if (_upt) { %><a href="<%= _upt %>" target="_blank" rel="noopener"><i class="bi bi-activity"></i> <%= t('landing.nav.status','Status') %></a><% } %> <% if (_upt) { %><a href="<%= _upt %>" target="_blank" rel="noopener"><i class="bi bi-activity"></i> <%= t('landing.nav.status','Status') %></a><% } %>
<% if (projectUrl) { %><a href="<%= projectUrl %>" target="_blank" rel="noopener" title="Repositori Open Source"><i class="bi bi-github"></i> <%= t('landing.footer.github','GitHub') %></a><% } %> <% if (projectUrl) { %><a href="<%= projectUrl %>" target="_blank" rel="noopener" title="Repositori Open Source"><i class="bi bi-git"></i> <%= t('landing.footer.github','Gitea') %></a><% } %>
</nav> </nav>
<div class="header-actions"> <div class="header-actions">
<button class="icon-btn" onclick="toggleTheme()" aria-label="Ganti tema"><i class="bi bi-moon-stars-fill" id="themeIcon"></i></button> <button class="icon-btn" onclick="toggleTheme()" aria-label="Ganti tema"><i class="bi bi-moon-stars-fill" id="themeIcon"></i></button>
@@ -64,7 +64,7 @@
<a href="#testimoni" onclick="toggleMenu()"><%= t('landing.testi.eyebrow','Testimoni') %></a> <a href="#testimoni" onclick="toggleMenu()"><%= t('landing.testi.eyebrow','Testimoni') %></a>
<a href="#faq" onclick="toggleMenu()"><%= t('landing.nav.faq','FAQ') %></a> <a href="#faq" onclick="toggleMenu()"><%= t('landing.nav.faq','FAQ') %></a>
<% if (_upt) { %><a href="<%= _upt %>" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-activity"></i> <%= t('landing.footer.server_status','Status Server') %></a><% } %> <% if (_upt) { %><a href="<%= _upt %>" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-activity"></i> <%= t('landing.footer.server_status','Status Server') %></a><% } %>
<% if (projectUrl) { %><a href="<%= projectUrl %>" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-github"></i> <%= t('landing.footer.repo_gh','Repositori (GitHub)') %></a><% } %> <% if (projectUrl) { %><a href="<%= projectUrl %>" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-git"></i> <%= t('landing.footer.repo_gh','Repositori (Gitea)') %></a><% } %>
<% if (projectUrl) { %><a href="<%= projectUrl %>/wiki" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-journal-text"></i> <%= t('landing.footer.wiki2','Wiki / Dokumentasi') %></a><% } %> <% if (projectUrl) { %><a href="<%= projectUrl %>/wiki" target="_blank" rel="noopener" onclick="toggleMenu()"><i class="bi bi-journal-text"></i> <%= t('landing.footer.wiki2','Wiki / Dokumentasi') %></a><% } %>
<a href="/customer/login"><i class="bi bi-box-arrow-in-right"></i> <%= t('landing.nav.cust_login','Masuk Pelanggan') %></a> <a href="/customer/login"><i class="bi bi-box-arrow-in-right"></i> <%= t('landing.nav.cust_login','Masuk Pelanggan') %></a>
<a href="/customer/check-billing"><i class="bi bi-receipt"></i> <%= t('landing.hero.check','Cek Tagihan') %></a> <a href="/customer/check-billing"><i class="bi bi-receipt"></i> <%= t('landing.hero.check','Cek Tagihan') %></a>
@@ -332,7 +332,7 @@
<div> <div>
<h4><%= t('landing.footer.opensource','Open Source') %></h4> <h4><%= t('landing.footer.opensource','Open Source') %></h4>
<div class="foot-links"> <div class="foot-links">
<a href="<%= projectUrl %>" target="_blank" rel="noopener"><i class="bi bi-github"></i> <%= t('landing.footer.repo','Repositori') %></a> <a href="<%= projectUrl %>" target="_blank" rel="noopener"><i class="bi bi-git"></i> <%= t('landing.footer.repo','Repositori') %></a>
<a href="<%= projectUrl %>/issues/new/choose" target="_blank" rel="noopener"><i class="bi bi-bug"></i> <%= t('landing.footer.issues','Laporkan Masalah / Form') %></a> <a href="<%= projectUrl %>/issues/new/choose" target="_blank" rel="noopener"><i class="bi bi-bug"></i> <%= t('landing.footer.issues','Laporkan Masalah / Form') %></a>
<a href="<%= projectUrl %>/wiki" target="_blank" rel="noopener"><i class="bi bi-journal-text"></i> <%= t('landing.footer.wiki','Wiki & Dokumentasi') %></a> <a href="<%= projectUrl %>/wiki" target="_blank" rel="noopener"><i class="bi bi-journal-text"></i> <%= t('landing.footer.wiki','Wiki & Dokumentasi') %></a>
<a href="<%= projectUrl %>/blob/main/LICENSE" target="_blank" rel="noopener"><i class="bi bi-shield-check"></i> <%= t('landing.footer.license','Lisensi ISC') %></a> <a href="<%= projectUrl %>/blob/main/LICENSE" target="_blank" rel="noopener"><i class="bi bi-shield-check"></i> <%= t('landing.footer.license','Lisensi ISC') %></a>