Files
student-web-if-development-kit/groups/Tapops/js/i18n-tapops.js
T
Dodo 529693cd5f feat: implementasi custom date range picker dengan preset dan navigasi kalender
* Mengganti field input tanggal yang sudah ada dengan UI date range picker baru.
* Menambahkan popover kalender untuk memilih rentang tanggal dengan navigasi bulan.
* Menambahkan tombol preset untuk pilihan rentang tanggal umum secara cepat, seperti Hari Ini dan 7 Hari Terakhir.
* Memperbarui string lokalisasi untuk fitur date range picker baru.
* Melakukan refactor JavaScript untuk menangani pemilihan tanggal dan state management pada picker baru.
2026-06-04 17:28:18 +07:00

209 lines
10 KiB
JavaScript

/**
* Tapops-local i18n — bilingual ID/EN for the document-repository sections.
*
* The shared assets/global/localization.js owns the nav/footer translations
* and exposes window.getLang() plus a `languageChanged` event. Its internal
* `translations` object is not extendable from here, so this layer keeps its
* own dictionary under a separate `data-tp-i18n*` attribute namespace. The
* global applyLang() ignores those attributes, and this script ignores the
* global `data-i18n*` ones — no collisions.
*
* Exposes window.applyTp() and window.tpT(key) so main.js can translate the
* dynamically-rendered document cards and state messages too.
*/
(function () {
const dict = {
id: {
// Hero
hero_kicker: "Digital Administrative Hub",
hero_title: "Administrasi Akademik Digital",
hero_tagline: "Satu pintu menuju semua dokumen penting. Akses terpusat menuju repositori dokumen akademik Program Studi Informatika Universitas Tanjungpura untuk mahasiswa dan staf.",
hero_btn_search: "Cari Dokumen",
hero_btn_flow: "ALUR PENGAJUAN",
stat_active: "Dokumen Aktif",
stat_updates: "Pembaruan Terbaru",
// Repository — sidebar
sidebar_category: "KATEGORI BERKAS",
filter_all: "Semua Berkas",
filter_skripsi: "Panduan Skripsi",
filter_akademik: "Kalender Akademik",
filter_praktik: "Kerja Praktik",
filter_umum: "Formulir Umum",
sidebar_info: "Pastikan mengunduh versi terbaru untuk menjamin validitas berkas pengajuan.",
// Repository — controls
repo_title: "Eksplorasi Dokumen Prodi",
repo_subtitle: "Temukan berkas administrasi dan akademik terbaru Program Studi Informatika.",
search_ph: "Cari nama berkas atau kata kunci...",
label_period: "Periode Unggahan",
range_divider: "s/d",
label_sort: "Urutkan",
sort_newest: "Terbaru",
sort_oldest: "Terlama",
sort_az: "Nama A-Z",
loading: "Menghubungkan ke repositori berkas...",
filter_all_time: "Semua Waktu",
presets_title: "RENTANG WAKTU",
preset_today: "Hari Ini",
preset_yesterday: "Kemarin",
preset_last_7_days: "7 Hari Terakhir",
preset_last_14_days: "14 Hari Terakhir",
preset_last_30_days: "30 Hari Terakhir",
preset_this_week: "Minggu Ini",
preset_last_week: "Minggu Lalu",
preset_this_month: "Bulan Ini",
preset_last_month: "Bulan Lalu",
btn_cancel: "Batal",
btn_update: "Perbarui",
// Repository — dynamic (cards + states, used by main.js)
card_open: "Buka Berkas",
card_download: "Unduh Berkas",
state_empty: "Belum ada dokumen yang tersedia di repositori.",
state_error: "Gagal memuat berkas. Silakan periksa koneksi internet Anda atau coba lagi nanti.",
// Procedures
proc_title: "Tata Cara Pengajuan Berkas",
proc_tag: "Alur Pengajuan",
proc_s1_h: "Unduh Formulir",
proc_s1_p: "Pilih kategori pengajuan Anda, lalu unduh formulir versi terbaru. Pastikan kode revisi pada formulir sesuai dengan yang tertera di halaman ini.",
proc_s2_h: "Lengkapi Formulir",
proc_s2_p: "Isi setiap kolom dengan lengkap dan teliti. Sertakan seluruh dokumen pendukung yang diminta sebelum pengiriman.",
proc_s3_h: "Kirim Berkas",
proc_s3_p: "Kirimkan formulir beserta dokumen pendukung melalui email resmi atau WhatsApp admin prodi. Berkas yang lengkap akan langsung diproses oleh admin prodi.",
// Help Center
help_title: "Butuh Bantuan Lebih Lanjut?",
help_desc: "Tim admin kami siap membantu Anda melalui kanal komunikasi resmi di bawah ini.",
help_email_title: "Korespondensi Resmi (Email)",
help_email_desc: "Gunakan untuk permohonan form khusus non-publik atau administrasi formal lainnya.",
help_email_c1: "Respon Maks. 24 Jam",
help_email_c2: "Pelayanan Formal",
help_email_btn: "HUBUNGI ADMIN",
help_wa_title: "Quick Support (WhatsApp)",
help_wa_desc: "Konsultasi cepat alur birokrasi atau pelaporan kendala akses pada berkas repositori.",
help_wa_c1: "Respon Instan Jam Kerja",
help_wa_c2: "Konsultasi Teknis",
help_wa_btn: "CHAT WHATSAPP",
},
en: {
// Hero
hero_kicker: "Digital Administrative Hub",
hero_title: "Digital Academic Administration",
hero_tagline: "One gateway to every important document. A centralized access point to the academic document repository of the Informatics Department, Universitas Tanjungpura, for students and staff.",
hero_btn_search: "Search Documents",
hero_btn_flow: "SUBMISSION FLOW",
stat_active: "Active Documents",
stat_updates: "Recent Updates",
// Repository — sidebar
sidebar_category: "DOCUMENT CATEGORY",
filter_all: "All Files",
filter_skripsi: "Thesis Guides",
filter_akademik: "Academic Calendar",
filter_praktik: "Internship",
filter_umum: "General Forms",
sidebar_info: "Always download the latest version to ensure your submission files remain valid.",
// Repository — controls
repo_title: "Explore Department Documents",
repo_subtitle: "Find the latest administrative and academic files of the Informatics Department.",
search_ph: "Search file name or keyword...",
label_period: "Upload Period",
range_divider: "to",
label_sort: "Sort by",
sort_newest: "Newest",
sort_oldest: "Oldest",
sort_az: "Name A-Z",
loading: "Connecting to the file repository...",
filter_all_time: "All Time",
presets_title: "DATE RANGE",
preset_today: "Today",
preset_yesterday: "Yesterday",
preset_last_7_days: "Last 7 Days",
preset_last_14_days: "Last 14 Days",
preset_last_30_days: "Last 30 Days",
preset_this_week: "This Week",
preset_last_week: "Last Week",
preset_this_month: "This Month",
preset_last_month: "Last Month",
btn_cancel: "Cancel",
btn_update: "Update",
// Repository — dynamic (cards + states, used by main.js)
card_open: "Open File",
card_download: "Download File",
state_empty: "No documents are available in the repository yet.",
state_error: "Failed to load files. Please check your internet connection or try again later.",
// Procedures
proc_title: "Document Submission Procedure",
proc_tag: "Submission Flow",
proc_s1_h: "Download the Form",
proc_s1_p: "Choose your submission category, then download the latest version of the form. Make sure the revision code on the form matches the one shown on this page.",
proc_s2_h: "Complete the Form",
proc_s2_p: "Fill in every field completely and carefully. Include all required supporting documents before submitting.",
proc_s3_h: "Submit the Document",
proc_s3_p: "Send the form along with the supporting documents via the official email or the department admin's WhatsApp. Complete submissions are processed immediately by the department admin.",
// Help Center
help_title: "Need Further Assistance?",
help_desc: "Our admin team is ready to help you through the official communication channels below.",
help_email_title: "Official Correspondence (Email)",
help_email_desc: "Use this for requests of non-public special forms or other formal administration.",
help_email_c1: "Response within 24 Hours",
help_email_c2: "Formal Service",
help_email_btn: "CONTACT ADMIN",
help_wa_title: "Quick Support (WhatsApp)",
help_wa_desc: "Quick consultation on bureaucratic flow or reporting access issues with repository files.",
help_wa_c1: "Instant Response in Work Hours",
help_wa_c2: "Technical Consultation",
help_wa_btn: "CHAT ON WHATSAPP",
},
};
function currentLang() {
if (typeof window.getLang === 'function') {
const l = window.getLang();
if (l === 'id' || l === 'en') return l;
}
try {
const saved = localStorage.getItem('if_untan_lang');
if (saved === 'id' || saved === 'en') return saved;
} catch (e) { /* localStorage unavailable */ }
const nav = (navigator.language || 'id').toLowerCase();
return nav.startsWith('en') ? 'en' : 'id';
}
function tpT(key) {
const lang = currentLang();
return (dict[lang] && dict[lang][key]) || dict.id[key] || null;
}
function applyTp(root) {
const scope = root || document;
scope.querySelectorAll('[data-tp-i18n]').forEach(el => {
const val = tpT(el.getAttribute('data-tp-i18n'));
if (val != null) el.textContent = val;
});
scope.querySelectorAll('[data-tp-i18n-placeholder]').forEach(el => {
const val = tpT(el.getAttribute('data-tp-i18n-placeholder'));
if (val != null) el.placeholder = val;
});
}
// Expose for main.js (dynamic cards/states).
window.tpT = tpT;
window.applyTp = applyTp;
// Re-translate when the shared toggle switches language.
document.addEventListener('languageChanged', () => applyTp());
// Initial pass (runs after localization.js's own DOMContentLoaded handler,
// so getLang() already reflects the resolved language).
document.addEventListener('DOMContentLoaded', () => applyTp());
})();