feat: eng language

This commit is contained in:
sabdayagra 2025-02-05 21:33:18 +07:00
parent 9db725dde3
commit 2bb97c5a24
5 changed files with 208 additions and 81 deletions

View File

@ -88,16 +88,16 @@ const page = () => {
};
const validationSchema = Yup.object().shape({
firstName: Yup.string().required("Nama Lengkap tidak boleh kosong"),
username: Yup.string().required("Username tidak boleh kosong"),
phoneNumber: Yup.string().required("Nomor Telepon tidak boleh kosong"),
address: Yup.string().required("Alamat tidak boleh kosong"),
email: Yup.string().required("Email tidak boleh kosong"),
provinsi: Yup.string().required("Provinsi tidak boleh kosong"),
kota: Yup.string().required("Kota tidak boleh kosong"),
kecamatan: Yup.string().required("Kecamatan tidak boleh kosong"),
password: Yup.string().required("Kata Sandi tidak boleh kosong"),
passwordConf: Yup.string().required("Konfirmasi Kata Sandi tidak boleh kosong"),
firstName: Yup.string().required(t("nameEmpty")),
username: Yup.string().required(t("usernameEmpty")),
phoneNumber: Yup.string().required(t("numberEmpty")),
address: Yup.string().required(t("addressEmpty")),
email: Yup.string().required(t("emailEmpty")),
provinsi: Yup.string().required(t("provinceEmpty")),
kota: Yup.string().required(t("cityEmpty")),
kecamatan: Yup.string().required(t("subdistrictEmpty")),
password: Yup.string().required(t("passwordEmpty")),
passwordConf: Yup.string().required(t("confirmEmpty")),
});
const formOptions = {
@ -358,7 +358,7 @@ const page = () => {
setEmailValidate("");
setEmail(e);
} else {
setEmailValidate("Email tidak valid");
setEmailValidate(t("emailValid"));
setEmail("");
}
};
@ -562,7 +562,7 @@ const page = () => {
: {}
}
>
<p className="text-2xl lg:text-4xl px-0 lg:px-12 font-bold ">{stepThreeActive ? "Silahkan lengkapi data pengguna" : "Silahkan registrasi terlebih dahulu"}</p>
<p className="text-2xl lg:text-4xl px-0 lg:px-12 font-bold ">{stepThreeActive ? t("userData") : t("registerFirst")}</p>
<p className="px-0 lg:px-12 text-sm lg:text-base mt-2">
{t("alreadyHave")}{" "}
<Link href="/auth" className="text-red-500">
@ -580,14 +580,14 @@ const page = () => {
: {}
}
>
<p className="text-black text-2xl px-0 lg:px-20 font-semibold">Masukkan Kode OTP</p>
<p className="text-red-500 text-sm px-0 lg:px-20">Silahkan cek inbox atau kotak spam pada email Anda.</p>
<p className="text-black text-2xl px-0 lg:px-20 font-semibold">{t("enterOTP")}</p>
<p className="text-red-500 text-sm px-0 lg:px-20">{t("checkInbox")}</p>
</div>
</div>
<div className={`flex flex-col gap-3 px-8 lg:px-12 ${formProfile == true || stepTwoActive ? "hidden" : ""}`}>
<div
className="flex flex-col"
className="flex flex-col px-0 lg:px-8"
style={
Number(category) == 6
? {}
@ -597,11 +597,16 @@ const page = () => {
}
>
<Label htmlFor="association" className="mb-2">
Jenis Keanggotaan <span className="text-red-500">*</span>
{t("member")} <span className="text-red-500">*</span>
</Label>
<select className={`py-2 px-1 rounded-md border border-slate-300 bg-white ${errors.association ? "block" : ""}`} {...register("association")} id="association" onChange={(e) => setAssociation(e.target.value)}>
<select
className={`py-2 px-1 rounded-md border text-sm text-slate-400 border-slate-300 bg-white ${errors.association ? "block" : ""}`}
{...register("association")}
id="association"
onChange={(e) => setAssociation(e.target.value)}
>
<option disabled selected>
Pilih Asosiasi
{t("association")}
</option>
<option value="PWI" key="1">
PWI (Persatuan Wartawan Indonesia)
@ -616,7 +621,7 @@ const page = () => {
AJI (Asosiasi Jurnalis Indonesia)
</option>
<option value="Wartawan" key="5">
Identitas Lainnya
{t("otherIdentity")}
</option>
</select>
<div className="hidden w-full mt-[0.25rem] text-lg text-[#dc3545]">{errors.association?.message}</div>
@ -625,7 +630,7 @@ const page = () => {
{Number(category) == 7 ? (
<div className="px-0 lg:px-[34px]">
<label htmlFor="userIdentity" className="mb-3">
<b>Nomor Registrasi Polri (NRP)</b> <span className="text-red-500">*</span>
<b>{t("policeNumber")}</b> <span className="text-red-500">*</span>
</label>
<Input className="mt-3" autoComplete="off" placeholder="Masukan Nomor Registrasi Polri Anda" type="text" onChange={(event: any) => setPersonilNRP(event.target.value)} />
<p className="text-red-500">{userIdentityValidate}</p>
@ -645,9 +650,9 @@ const page = () => {
}
>
<Label htmlFor="journalistCertificate">
Nomor Sertifikasi Wartawan <span className="text-red-500">*</span>
{t("journalistNumber")} <span className="text-red-500">*</span>
</Label>
<Input className="rounded-md py-3" autoComplete="off" placeholder="Masukan Nomor Sertifikasi" type="text" onChange={(event: any) => setJournalistCertificate(event.target.value)} />
<Input className="rounded-md py-3" autoComplete="off" placeholder={t("inputJournalist")} type="text" onChange={(event: any) => setJournalistCertificate(event.target.value)} />
</div>
) : (
""
@ -656,7 +661,7 @@ const page = () => {
<label htmlFor="email">
<b>Email</b> <span className="text-red-500">*</span>
</label>
<Input className="w-full" autoComplete="off" placeholder="Masukkan Email Anda" type="email" onChange={(event) => checkEmail(event.target.value)} />
<Input className="w-full" autoComplete="off" placeholder={t("inputEmail")} type="email" onChange={(event) => checkEmail(event.target.value)} />
<p className="text-sm text-red-500 mt-1">{emailValidate}</p>
</div>
</div>
@ -685,10 +690,10 @@ const page = () => {
</p>
<div className="flex flex-row px-0 lg:px-28 justify-between items-center my-4">
<a className="bg-slate-300 text-center rounded-lg mr-1 w-[200px] py-2 text-base cursor-pointer" onClick={() => handleResendOTP()}>
Kirim Ulang ({convertMilisecondsToHour(timerCount)})
{t("resending")} ({convertMilisecondsToHour(timerCount)})
</a>
<a className="bg-red-700 w-[200px] py-2 text-center text-white rounded-lg ml-1 cursor-pointer" onClick={() => handleVerifyOTP()}>
Lanjut
{t("next")}
</a>
</div>
</div>
@ -698,7 +703,7 @@ const page = () => {
{Number(category) == 6 || Number(category) == 7 ? (
<div className="px-0 lg:px-[34px]">
<Label className="mb-2">
{`${Number(category) == 6 ? "Nomor Sertifikasi Wartawan" : "NRP"}`}
{`${Number(category) == 6 ? t("journalistNumber") : "NRP"}`}
<span className="text-red-500">*</span>
</Label>
<Input
@ -706,7 +711,7 @@ const page = () => {
autoComplete="off"
className={`mb-3 ${errors.memberIdentity ? "block" : ""}`}
{...register("memberIdentity")}
placeholder="Masukan Nomor Identitas"
placeholder={t("inputNumberIdentity")}
onChange={(e) => handleIdentity(e.target.value)}
disabled
/>
@ -717,9 +722,9 @@ const page = () => {
)}
<div className="mb-4 px-0 lg:px-[34px]">
<Label className="mb-2">
Nama Lengkap <span className="text-red-500">*</span>
{t("fullName")} <span className="text-red-500">*</span>
</Label>
<Input type="text" autoComplete="off" className={` ${errors.firstName ? "block" : ""}`} {...register("firstName")} placeholder="Masukan Nama Lengkap Anda" />
<Input type="text" autoComplete="off" className={` ${errors.firstName ? "block" : ""}`} {...register("firstName")} placeholder={t("enterFullName")} />
<div className="text-red-500">{errors.firstName?.message}</div>
</div>
<div className="mb-4 px-0 lg:px-[34px]">
@ -731,7 +736,7 @@ const page = () => {
type="text"
autoComplete="off"
className={`${errors.username ? "block" : ""}`}
placeholder="Masukan Username"
placeholder={t("enterUsername")}
onChange={(e) => {
setValUsername(e.target.value.trim());
}}
@ -754,27 +759,27 @@ const page = () => {
</div>
<div className="flex flex-col px-0 lg:px-[34px]">
<Label className="mb-2">
No. HP<span className="text-red-500">*</span>
{t("number")} <span className="text-red-500">*</span>
</Label>
<Input type="number" autoComplete="off" className={`mb-3 ${errors.phoneNumber ? "block" : ""}`} {...register("phoneNumber")} placeholder="Masukan Nomor Telepon Anda" />
<Input type="number" autoComplete="off" className={`mb-3 ${errors.phoneNumber ? "block" : ""}`} {...register("phoneNumber")} placeholder={t("enterNumber")} />
<div className="text-red-500">{errors.phoneNumber?.message}</div>
</div>
<div className="mb-4 px-0 lg:px-[34px]">
<Label htmlFor="address" className="mb-2">
Alamat <span className="text-red-500">*</span>
{t("address")} <span className="text-red-500">*</span>
</Label>
<Textarea className={` ${errors.address ? "block" : ""}`} {...register("address")} placeholder="Masukan Alamat Lengkap Anda" rows={3} />
<Textarea className={` ${errors.address ? "block" : ""}`} {...register("address")} placeholder={t("insertAddress")} rows={3} />
<div className="text-red-500">{errors.address?.message}</div>
</div>
{Number(category) == 6 ? (
<div className="flex flex-col gap-3 px-0 lg:px-[34px]">
<div className="flex flex-col mb-2">
<Label htmlFor="provinsi">
Institusi <span className="text-red-500">*</span>
<Label htmlFor="provinsi" className="mb-2">
{t("institutions")} <span className="text-red-500">*</span>
</Label>
<select className="mb-3 p-2 border rounded-md border-slate-300 bg-white cursor-pointer" id="provinsi" onChange={(event) => handleInstituteOption(event)}>
<select className="mb-3 p-2 border text-sm text-slate-400 rounded-md border-slate-300 bg-white cursor-pointer" id="provinsi" onChange={(event) => handleInstituteOption(event)}>
<option disabled selected>
Pilih Institusi
{t("selectInst")}
</option>
{institution.map((row: any) => (
<option value={row.id} key={row.id}>
@ -782,7 +787,7 @@ const page = () => {
</option>
))}
<option value="0" key="0">
Nama Institusi Lainnya
{t("otherInst")}
</option>
</select>
</div>
@ -797,33 +802,33 @@ const page = () => {
}
>
<Label htmlFor="alamat" className="mb-2">
Nama Institusi <span className="text-red-500">*</span>
{t("instName")} <span className="text-red-500">*</span>
</Label>
<Input className="mb-3" autoComplete="off" placeholder="Masukan Nama Lengkap Institusi Anda" type="text" onChange={(event) => setCustomInstituteName(event.target.value)} />
</div>
<div>
<Label htmlFor="alamat" className="mb-2">
Alamat Institusi <span className="text-red-500">*</span>
{t("instAddress")} <span className="text-red-500">*</span>
</Label>
<Textarea className="mb-3" placeholder="Masukan Alamat Lengkap Institusi Anda" rows={3} value={institusiAddress} onChange={(event) => setInstitusiAddress(event.target.value)} />
<Textarea className="mb-3" placeholder={t("addressInst")} rows={3} value={institusiAddress} onChange={(event) => setInstitusiAddress(event.target.value)} />
</div>
</div>
) : (
""
)}
<div className="flex flex-col px-0 lg:px-[34px]">
<label htmlFor="provinsi" className="mb-2">
Provinsi <span className="text-red-500">*</span>
<label htmlFor="provinsi" className="mb-2 ">
{t("province")} <span className="text-red-500">*</span>
</label>
<select
className={`mb-3 p-2 border rounded-md border-slate-300 bg-white cursor-pointer ${errors.provinsi ? "block" : ""}`}
className={`mb-3 p-2 border rounded-md text-sm text-slate-400 border-slate-300 bg-white cursor-pointer ${errors.provinsi ? "block" : ""}`}
{...register("provinsi")}
id="provinsi"
name="provinsi"
onChange={(event) => getCity(event.target.value)}
>
<option disabled selected>
Pilih Provinsi
{t("selectProv")}
</option>
{province?.map((row: any) => (
<option value={row.id} key={row.id}>
@ -835,11 +840,16 @@ const page = () => {
</div>
<div className="flex flex-col px-0 lg:px-[34px]">
<label htmlFor="kota" className="mb-2">
Kota/Kabupaten <span className="text-red-500">*</span>
{t("city")} <span className="text-red-500">*</span>
</label>
<select className={`mb-3 p-2 border rounded-md border-slate-300 bg-white cursor-pointer ${errors.kota ? "block" : ""}`} {...register("kota")} id="kota" onChange={(event) => getDistricts(event.target.value)}>
<select
className={`mb-3 p-2 border text-sm text-slate-400 rounded-md border-slate-300 bg-white cursor-pointer ${errors.kota ? "block" : ""}`}
{...register("kota")}
id="kota"
onChange={(event) => getDistricts(event.target.value)}
>
<option disabled selected>
Pilih Kota/Kabupaten
{t("selectCity")}
</option>
{city?.map((row: any) => (
<option value={row.id} key={row.id}>
@ -851,11 +861,11 @@ const page = () => {
</div>
<div className="flex flex-col px-0 lg:px-[34px]">
<label htmlFor="kecamatan" className="mb-2">
Kecamatan <span className="text-red-500">*</span>
{t("subdistrict")} <span className="text-red-500">*</span>
</label>
<select className={`p-2 border rounded-md border-slate-300 bg-white cursor-pointer ${errors.kecamatan ? "block" : ""}`} {...register("kecamatan")} id="kecamatan">
<select className={`p-2 border text-sm text-slate-400 rounded-md border-slate-300 bg-white cursor-pointer ${errors.kecamatan ? "block" : ""}`} {...register("kecamatan")} id="kecamatan">
<option disabled selected>
Pilih Kecamatan
{t("selectSub")}
</option>
{districts?.map((row: any) => (
<option value={row.id} key={row.id}>
@ -896,7 +906,7 @@ const page = () => {
</div> */}
<div className="mt-3.5 space-y-2 px-0 lg:px-[34px]">
<Label htmlFor="password" className="mb-2 font-medium text-default-600">
Kata Sandi <span className="text-red-500">*</span>
{t("password")} <span className="text-red-500">*</span>
</Label>
<div className="relative">
<Input
@ -905,7 +915,7 @@ const page = () => {
autoComplete="off"
className={` ${errors.password ? "block" : ""}`}
{...register("password")}
placeholder="Masukan Kata Sandi"
placeholder={t("inputPass")}
onChange={(e) => {
setValPassword(e.target.value.trim());
}}
@ -954,7 +964,7 @@ const page = () => {
</div> */}
<div className="mt-3.5 space-y-2 px-0 lg:px-[34px]">
<Label htmlFor="password" className="mb-2 font-medium text-default-600">
Konfirmasi Kata Sandi <span className="text-red-500">*</span>
{t("confirmPass")} <span className="text-red-500">*</span>
</Label>
<div className="relative">
<Input
@ -963,7 +973,7 @@ const page = () => {
autoComplete="off"
className={` ${errors.passwordConf ? "block" : ""}`}
{...register("passwordConf")}
placeholder="Masukan Kata Sandi yang Sama"
placeholder={t("samePass")}
onChange={(e) => {
setValPasswordConf(e.target.value.trim());
}}
@ -991,11 +1001,11 @@ const page = () => {
setIsValidPassword(isValid);
}}
messages={{
minLength: "Password harus lebih dari 8 karakter",
specialChar: "Password harus memiliki spesial karakter",
number: "Password harus memiliki angka",
capital: "Password harus memiliki huruf kapital",
match: "Password sama",
minLength: t("passCharacter"),
specialChar: t("passSpecial"),
number: t("passNumber"),
capital: t("passCapital"),
match: t("passSame"),
}}
/>
</div>
@ -1013,13 +1023,13 @@ const page = () => {
>
<div className="text-center mb-2 px-[34px]">
<p className="text-sm lg:text-base">
Dengan mendaftar, saya telah menyetujui <br />{" "}
{t("byRegis")} <br />{" "}
<a href="/privacy" target="_blank" className="text-red-500">
<b>Syarat dan Ketentuan</b>
<b>{t("terms")}</b>
</a>{" "}
serta{" "}
{t("and")}{" "}
<a href="/privacy" target="_blank" className="text-red-500">
<b>Kebijakan Privasi</b>
<b>{t("privacy")}</b>
</a>
</p>
</div>
@ -1032,7 +1042,7 @@ const page = () => {
setStepTwoActive(true);
}}
>
Kirim OTP
{t("send")} OTP
</a>
</div>
</div>
@ -1047,7 +1057,7 @@ const page = () => {
}
>
<Button type="submit" className="border w-[550px] text-center bg-red-700 text-white hover:bg-white hover:text-red-700 ">
Daftar
{t("register")}
</Button>
</div>
</div>

View File

@ -17,17 +17,19 @@ const Home = ({ params: { locale } }: { params: { locale: string } }) => {
return (
<MountedProvider isProtected={false}>
<ReactLenis root>
<Navbar />
<NewsTicker />
<Hero />
<SearchSection />
<NewContent group="mabes" type="latest" />
<NewContent group="mabes" type="popular" />
{/* <PopularContent /> */}
<ContentCategory group="mabes" />
<Coverage />
<Division />
<Footer />
<div className="pb-14">
<Navbar />
<Hero />
<SearchSection />
<NewContent group="mabes" type="latest" />
<NewContent group="mabes" type="popular" />
{/* <PopularContent /> */}
<ContentCategory group="mabes" />
<Coverage />
<Division />
<Footer />
<NewsTicker />
</div>
</ReactLenis>
</MountedProvider>
);

View File

@ -4,11 +4,13 @@ import { getHeroData, listCarousel } from "@/service/landing/landing";
import { formatDateToIndonesian, textEllipsis } from "@/utils/globals";
import { useEffect, useState } from "react";
import { Icon } from "../ui/icon";
import { useTranslations } from "next-intl";
export default function NewsTicker() {
const [article, setArticle] = useState<any>([]);
const [currentNewsIndex, setCurrentNewsIndex] = useState(0);
const [animate, setAnimate] = useState(false);
const t = useTranslations("LandingPage");
useEffect(() => {
async function getArticle() {
@ -47,7 +49,7 @@ export default function NewsTicker() {
return (
<div className="fixed bottom-0 z-50 flex flex-row h-[60px] gap-3 w-full justify-between dark:bg-stone-800 bg-gray-50">
<div className="relative px-4 py-2 font-semibold text-xs lg:text-sm flex items-center bg-[#bb3523] text-white w-[30%] lg:w-[10%]">
<span className="mr-2"></span> BREAKING NEWS
<span className="mr-2"></span> {t("breakingNews")}
<div className="absolute right-0 top-0 h-full w-4 bg-[#bb3523] transform translate-x-full clip-path-triangle"></div>
</div>
<div className={`w-full px-5 py-1 flex flex-col gap-1 transition-transform duration-300 ${animate ? "opacity-0 translate-y-5" : "opacity-100 translate-y-0"}`}>

View File

@ -398,7 +398,63 @@
"next": "Next",
"categoryReg": "Registration Category",
"selectOne": "Please Select One",
"alreadyHave": "Already have an account?"
"alreadyHave": "Already have an account?",
"userData": "Please Complete the User Data",
"registerFirst": "Please Register First",
"byRegis": "By registering, I have agreed to the",
"terms": "Terms and Conditions",
"enterOTP": "Enter OTP Code",
"checkInbox": "Please check your email inbox or spam box.",
"resending": "Resending",
"fullName": "Full Name",
"enterFullName": "Insert your full name",
"enterUsername": "Insert your Username",
"number": "Mobile phone number",
"enterNumber": "Insert Your Phone Number",
"enterEmail": "Insert your Email",
"address": "Address",
"insertAddress": "Insert Your Address",
"province": "Province",
"selectProv": "Select Province",
"city": "City / District",
"selectCity": "Select City / District",
"subdistrict": "Subdistrict",
"selectSub": "Select Subdistrict",
"confirmPass": "Confirm Password",
"inputPass": "Input Password",
"samePass": "Input Same Password",
"passCharacter": "Password must be more than 8 characters",
"passSpecial": "Password must have special characters",
"passNumber": "Password must have numbers",
"passCapital": "Password must have capital letters",
"passSame": "Passwords are the same",
"member": "Membership Types",
"association": "Select Association",
"journalistNumber": "Journalist Certification Number",
"otherIdentity": "Other Identities",
"inputJournalist": "Input Certification Number",
"inputNumberIdentity": "Input Identity Number",
"institutions": "Institutions",
"selectInst": "Select Institutions",
"otherInst": "Other Institution Names",
"instAddress": "Institutions Address",
"instName": "Institution Name",
"inputEmail": "Input your Email",
"emailValid": "Invalid Email",
"nameEmpty": "Full Name Cannot be Empty",
"usernameEmpty": "Username Cannot be Empty",
"numberEmpty": "Phone Number cannot be empty",
"addressEmpty": "Address cannot be empty",
"emailEmpty": "Email cannot be empty",
"provinceEmpty": "Province cannot be empty",
"cityEmpty": "City/district cannot be empty",
"subdistrictEmpty": "Subdistrict cannot be empty",
"passwordEmpty": "Password cannot be empty",
"confirmEmpty": "Confirm Password cannot be empty",
"addressInst": "Input the complete address of your institution",
"identityEmpty": "Identity number cannot be empty",
"policeNumber": "Police Registration Number",
"breakingNews": "BREAKING NEWS"
},
"FilterPage": {
"image": "Image",

View File

@ -398,7 +398,64 @@
"next": "Selanjutnya",
"categoryReg": "Kategori Registrasi",
"selectOne": "Silahkan Pilih Salah Satu",
"alreadyHave": "Sudah Memiliki Akun?"
"alreadyHave": "Sudah Memiliki Akun?",
"userData": "Silahkan Lengkapi Data Pengguna",
"registerFirst": "Silahkan Daftar terlebih Dahulu",
"byRegis": "Dengan mendaftar, saya telah menyetujui",
"terms": "Syarat dan Ketentuan",
"enterOTP": "Masukkan kode OTP",
"checkInbox": "Silahkan cek inbox atau kotak spam pada email Anda.",
"resending": "Kirim Ulang",
"fullName": "Nama Lengkap",
"enterFullName": "Masukkan Nama Lengkap Anda",
"enterUsername": "Masukkan Username Anda",
"number": "Nomor Telepon",
"enterNumber": "Masukkan Nomor Telepon Anda",
"enterEmail": "Masukkan Email Anda",
"address": "Alamat",
"insertAddress": "Masukkan Alamat Lengkap Anda",
"province": "Provinsi",
"selectProv": "Pilih Provinsi",
"city": "Kota / Kabupaten",
"selectCity": "Pilih Kota / Kabupaten",
"subdistrict": "Kecamatan",
"selectSub": "Pilih Kecamatan",
"confirmPass": "Konfirmasi Kata Sandi",
"inputPass": "Masukkan Kata Sandi",
"samePass": "Masukkan Kata Sandi yang Sama",
"passCharacter": "Kata Sandi harus lebih dari 8 karakter",
"passSpecial": "Kata Sandi harus memiliki spesial karakter",
"passNumber": "Kata Sandi harus memiliki angka",
"passCapital": "Kata Sandi harus memiliki huruf kapital",
"passSame": "Kata Sandi Sama",
"member": "Jenis Keanggotaan",
"association": "Pilih Asosiasi",
"otherIdentity": "Identitas Lainnya",
"inputJournalist": "Masukkan Nomor Sertifikasi",
"journalistNumber": "Nomor Sertifikasi Wartawan",
"inputNumberIdentity": "Masukkan Nomor Identitas",
"institutions": "Institusi",
"selectInst": "Pilih Institusi",
"otherInst": "Nama Institusi Lainnya",
"instAddress": "Alamat Institusi",
"instName": "Nama Institusi",
"inputEmail": "Masukkan Email Anda",
"emailValid": "Email Tidak Valid",
"nameEmpty": "Nama Lengkap Tidak Boleh Kosong",
"usernameEmpty": "Username Tidak Boleh Kosong",
"numberEmpty": "Nomor Telepon Tidak Boleh Kosong",
"addressEmpty": "Alamat Tidak boleh Kosong",
"emailEmpty": "Email Tidak Boleh Kosong",
"provinceEmpty": "Provinsi Tidak Boleh Kosong",
"cityEmpty": "Kota/Kabupaten tidak boleh kosong",
"subdistrictEmpty": "Kecamatan tidak boleh kosong",
"passwordEmpty": "Kata Sandi tidak boleh kosong",
"confirmEmpty": "Konfirmasi Kata Sandi tidak boleh kosong",
"addressInst": "Masukkan Alamat lengkap institusi anda",
"identityEmpty": "Nomor identitas tidak boleh kosong",
"policeNumber": "Nomor Registrasi Polri (NRP)",
"breakingNews": "BERITA TERKINI"
},
"FilterPage": {
"image": "Foto",