diff options
| -rw-r--r-- | locales/en-US.json | 20 | ||||
| -rw-r--r-- | locales/en.json | 20 | ||||
| -rw-r--r-- | locales/ja.json | 22 | ||||
| -rw-r--r-- | src/util/validation.ts | 41 | 
4 files changed, 82 insertions, 21 deletions
diff --git a/locales/en-US.json b/locales/en-US.json index b15933f..b193f6b 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -204,6 +204,26 @@    "sidebar.events": "View events",    "snappy": "Make it snappy.",    "upcomingevents": "Upcoming events", +  "validation.eventdata.creatoremail": "Email address is invalid.", +  "validation.eventdata.eventdescription": "Event description is required.", +  "validation.eventdata.eventend": "Event end time is required.", +  "validation.eventdata.eventgroupboolean": "Event group ID is required.", +  "validation.eventdata.eventgroupedittoken": "Event group edit token is required.", +  "validation.eventdata.eventlocation": "Event location is required.", +  "validation.eventdata.eventname": "Event name is required.", +  "validation.eventdata.eventstart": "Event start time is required.", +  "validation.eventdata.eventurl": "Event link is invalid.", +  "validation.eventdata.maxattendees": "Max number of attendees must be a number.", +  "validation.eventdata.maxattendeesboolean": "Max number of attendees is required.", +  "validation.eventdata.timezone": "Event timezone is required.", +  "validation.eventtime.endisbefore": "End time must be in the future.", +  "validation.eventtime.endyears": "Event duration cannot be longer than 1 year.", +  "validation.eventtime.startisafter": "Start time must be before end time.", +  "validation.eventtime.startisbefore": "Start time must be in the future.", +  "validation.groupdata.creatoremail": "Email address is invalid.", +  "validation.groupdata.eventgroupdescription": "Event group description is required.", +  "validation.groupdata.eventgroupname": "Event group name is required.", +  "validation.groupdata.eventgroupurl": "Group link is invalid.",    "wontshow": "Will not be shown anywhere (optional).",    "year-month-format": "MMMM YYYY",    "youremail": "Your email" diff --git a/locales/en.json b/locales/en.json index b15933f..b193f6b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -204,6 +204,26 @@    "sidebar.events": "View events",    "snappy": "Make it snappy.",    "upcomingevents": "Upcoming events", +  "validation.eventdata.creatoremail": "Email address is invalid.", +  "validation.eventdata.eventdescription": "Event description is required.", +  "validation.eventdata.eventend": "Event end time is required.", +  "validation.eventdata.eventgroupboolean": "Event group ID is required.", +  "validation.eventdata.eventgroupedittoken": "Event group edit token is required.", +  "validation.eventdata.eventlocation": "Event location is required.", +  "validation.eventdata.eventname": "Event name is required.", +  "validation.eventdata.eventstart": "Event start time is required.", +  "validation.eventdata.eventurl": "Event link is invalid.", +  "validation.eventdata.maxattendees": "Max number of attendees must be a number.", +  "validation.eventdata.maxattendeesboolean": "Max number of attendees is required.", +  "validation.eventdata.timezone": "Event timezone is required.", +  "validation.eventtime.endisbefore": "End time must be in the future.", +  "validation.eventtime.endyears": "Event duration cannot be longer than 1 year.", +  "validation.eventtime.startisafter": "Start time must be before end time.", +  "validation.eventtime.startisbefore": "Start time must be in the future.", +  "validation.groupdata.creatoremail": "Email address is invalid.", +  "validation.groupdata.eventgroupdescription": "Event group description is required.", +  "validation.groupdata.eventgroupname": "Event group name is required.", +  "validation.groupdata.eventgroupurl": "Group link is invalid.",    "wontshow": "Will not be shown anywhere (optional).",    "year-month-format": "MMMM YYYY",    "youremail": "Your email" diff --git a/locales/ja.json b/locales/ja.json index 13b38eb..1dc10e4 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -174,7 +174,7 @@    "ml.requestmlbutton": "マジックリンクをリクエスト",    "ml.requestmldesc": "この Gathio インスタンスの管理者は、イベントの作成権限を特定のメールアドレスに限定しています。あなたのメールアドレスでの作成が許可されていれば、マジックリンクがメールで届くはずです。許可されていなければ、メールは届きません。",    "newevent.createnew": "イベントを作成", -  "newevent.groupattention": "イベントグループは、イベントのように自動削除されることはありません。しかし、{{siteName}} から削除されたイベントは", +  "newevent.groupattention": "イベントグループは、イベントのように自動削除されることはありません。しかし、{{siteName}} から削除されたイベントは、当然ですが、イベントグループに表示されません。",    "newevent.groupdesc": "イベントグループは、リンクしたイベントをまとめる機能です。例えば、シリーズものの映画上映会、いくつかのイベントに分かれるフェス、音楽バンドのツアーなどに便利です。個々のイベントへの公開リンクのように、グループの公開リンクを共有することができます。また秘密の編集パスワード(グループ作成時にメール送信)を知っているメンバーは、今後のイベントをグループに追加することができます。",    "newevent.importevent": "既存のイベントをインポート",    "newevent.neweventbutton": "イベントを作成", @@ -204,6 +204,26 @@    "sidebar.events": "イベント表示",    "snappy": "ズバッと。",    "upcomingevents": "今後のイベント", +  "validation.eventdata.creatoremail": "メールアドレスが無効です。", +  "validation.eventdata.eventdescription": "イベントの説明は必須です。", +  "validation.eventdata.eventend": "終了日時は必須です。", +  "validation.eventdata.eventgroupboolean": "イベントグループ ID は必須です。", +  "validation.eventdata.eventgroupedittoken": "イベントグループの編集用秘密パスワードが必要です。", +  "validation.eventdata.eventlocation": "場所は必須です。", +  "validation.eventdata.eventname": "イベント名は必須です。", +  "validation.eventdata.eventstart": "開始日時は必須です。", +  "validation.eventdata.eventurl": "イベントリンクが無効です。", +  "validation.eventdata.maxattendees": "定員は数字で入力してください。", +  "validation.eventdata.maxattendeesboolean": "定員数は必須です。", +  "validation.eventdata.timezone": "タイムゾーンは必須です。", +  "validation.eventtime.endisbefore": "終了日時は未来にしてください。", +  "validation.eventtime.endyears": "1 年を超えるイベントは作成できません。", +  "validation.eventtime.startisafter": "開始日時は、終了日時より前にしてください。", +  "validation.eventtime.startisbefore": "開始日時は未来にしてください。", +  "validation.groupdata.creatoremail": "メールアドレスが無効です。", +  "validation.groupdata.eventgroupdescription": "説明は必須です。", +  "validation.groupdata.eventgroupname": "グループ名は必須です。", +  "validation.groupdata.eventgroupurl": "グループのリンクが無効です。",    "wontshow": "どこにも表示しません ( 任意 )。",    "year-month-format": "YYYY年MMM",    "youremail": "あなたのメールアドレス" diff --git a/src/util/validation.ts b/src/util/validation.ts index a3bea63..0d82b88 100644 --- a/src/util/validation.ts +++ b/src/util/validation.ts @@ -1,3 +1,4 @@ +import i18next from "i18next";  import moment from "moment-timezone";  type Error = { @@ -90,26 +91,26 @@ const validateUrl = (url: string) => {  export const validateEventTime = (start: Date, end: Date): Error | boolean => {      if (moment(start).isAfter(moment(end))) {          return { -            message: "Start time must be before end time.", +            message: i18next.t('validation.eventtime.startisafter'),              field: "eventStart",          };      }      if (moment(start).isBefore(moment())) {          return { -            message: "Start time must be in the future.", +            message: i18next.t('validation.eventtime.startisbefore'),              field: "eventStart",          };      }      if (moment(end).isBefore(moment())) {          return { -            message: "End time must be in the future.", +            message: i18next.t('validation.eventtime.endisbefore'),              field: "eventEnd",          };      }      // Duration cannot be longer than 1 year      if (moment(end).diff(moment(start), "years") > 1) {          return { -            message: "Event duration cannot be longer than 1 year.", +            message: i18next.t("validation.eventtime.endyears"),              field: "eventEnd",          };      } @@ -130,25 +131,25 @@ export const validateEventData = (      const errors: Error[] = [];      if (!validatedData.eventName) {          errors.push({ -            message: "Event name is required.", +            message: i18next.t('validation.eventdata.eventname'),              field: "eventName",          });      }      if (!validatedData.eventLocation) {          errors.push({ -            message: "Event location is required.", +            message: i18next.t("validation.eventdata.eventlocation"),              field: "eventLocation",          });      }      if (!validatedData.eventStart) {          errors.push({ -            message: "Event start time is required.", +            message: i18next.t("validation.eventdata.eventstart"),              field: "eventStart",          });      }      if (!validatedData.eventEnd) {          errors.push({ -            message: "Event end time is required.", +            message: i18next.t("validation.eventdata.eventend"),              field: "eventEnd",          });      } @@ -163,26 +164,26 @@ export const validateEventData = (      }      if (!validatedData.timezone) {          errors.push({ -            message: "Event timezone is required.", +            message: i18next.t("validation.eventdata.timezone"),              field: "timezone",          });      }      if (!validatedData.eventDescription) {          errors.push({ -            message: "Event description is required.", +            message: i18next.t("validation.eventdata.eventdescription"),              field: "eventDescription",          });      }      if (validatedData.eventGroupBoolean) {          if (!validatedData.eventGroupID) {              errors.push({ -                message: "Event group ID is required.", +                message: i18next.t("validation.eventdata.eventgroupboolean"),                  field: "eventGroupID",              });          }          if (!validatedData.eventGroupEditToken) {              errors.push({ -                message: "Event group edit token is required.", +                message: i18next.t("validation.eventdata.eventgroupedittoken"),                  field: "eventGroupEditToken",              });          } @@ -190,13 +191,13 @@ export const validateEventData = (      if (validatedData.maxAttendeesBoolean) {          if (!validatedData.maxAttendees) {              errors.push({ -                message: "Max number of attendees is required.", +                message: i18next.t("validation.eventdata.maxattendeesboolean"),                  field: "maxAttendees",              });          }          if (isNaN(validatedData.maxAttendees)) {              errors.push({ -                message: "Max number of attendees must be a number.", +                message: i18next.t("validation.eventdata.maxattendees"),                  field: "maxAttendees",              });          } @@ -204,7 +205,7 @@ export const validateEventData = (      if (validatedData.creatorEmail) {          if (!validateEmail(validatedData.creatorEmail)) {              errors.push({ -                message: "Email address is invalid.", +                message: i18next.t("validation.eventdata.creatoremail"),                  field: "creatorEmail",              });          } @@ -212,7 +213,7 @@ export const validateEventData = (      if (validatedData.eventURL) {          if (!validateUrl(validatedData.eventURL)) {              errors.push({ -                message: "Event link is invalid.", +                message: i18next.t("validation.eventdata.eventurl"),                  field: "eventURL",              });          } @@ -230,20 +231,20 @@ export const validateGroupData = (      const errors: Error[] = [];      if (!groupData.eventGroupName) {          errors.push({ -            message: "Event group name is required.", +            message: i18next.t("validation.groupdata.eventgroupname"),              field: "eventGroupName",          });      }      if (!groupData.eventGroupDescription) {          errors.push({ -            message: "Event group description is required.", +            message: i18next.t("validation.groupdata.eventgroupdescription"),              field: "eventGroupDescription",          });      }      if (groupData.creatorEmail) {          if (!validateEmail(groupData.creatorEmail)) {              errors.push({ -                message: "Email address is invalid.", +                message: i18next.t("validation.groupdata.creatoremail"),                  field: "creatorEmail",              });          } @@ -251,7 +252,7 @@ export const validateGroupData = (      if (groupData.eventGroupURL) {          if (!validateUrl(groupData.eventGroupURL)) {              errors.push({ -                message: "Group link is invalid.", +                message: i18next.t("validation.groupdata.eventgroupurl"),                  field: "eventGroupURL",              });          }  | 
