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

View File

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

View File

@ -4,11 +4,13 @@ import { getHeroData, listCarousel } from "@/service/landing/landing";
import { formatDateToIndonesian, textEllipsis } from "@/utils/globals"; import { formatDateToIndonesian, textEllipsis } from "@/utils/globals";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Icon } from "../ui/icon"; import { Icon } from "../ui/icon";
import { useTranslations } from "next-intl";
export default function NewsTicker() { export default function NewsTicker() {
const [article, setArticle] = useState<any>([]); const [article, setArticle] = useState<any>([]);
const [currentNewsIndex, setCurrentNewsIndex] = useState(0); const [currentNewsIndex, setCurrentNewsIndex] = useState(0);
const [animate, setAnimate] = useState(false); const [animate, setAnimate] = useState(false);
const t = useTranslations("LandingPage");
useEffect(() => { useEffect(() => {
async function getArticle() { async function getArticle() {
@ -47,7 +49,7 @@ export default function NewsTicker() {
return ( 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="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%]"> <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 className="absolute right-0 top-0 h-full w-4 bg-[#bb3523] transform translate-x-full clip-path-triangle"></div>
</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"}`}> <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", "next": "Next",
"categoryReg": "Registration Category", "categoryReg": "Registration Category",
"selectOne": "Please Select One", "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": { "FilterPage": {
"image": "Image", "image": "Image",

View File

@ -398,7 +398,64 @@
"next": "Selanjutnya", "next": "Selanjutnya",
"categoryReg": "Kategori Registrasi", "categoryReg": "Kategori Registrasi",
"selectOne": "Silahkan Pilih Salah Satu", "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": { "FilterPage": {
"image": "Foto", "image": "Foto",