diff options
-rw-r--r-- | locales/en-US.json | 16 | ||||
-rw-r--r-- | locales/en.json | 16 | ||||
-rw-r--r-- | locales/ja.json | 70 | ||||
-rwxr-xr-x | src/app.ts | 15 | ||||
-rw-r--r-- | src/routes/event.ts | 14 | ||||
-rw-r--r-- | src/util/validation.ts | 2 |
6 files changed, 67 insertions, 66 deletions
diff --git a/locales/en-US.json b/locales/en-US.json index a6ba2e6..c44c29f 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -38,14 +38,14 @@ "routes.addeventcommentsubject": "New comment in {{eventName}}", "routes.deleteeventsubject": "{{ eventName }} was deleted", "routes.event.datetimeformat": "{{thedate, intlDate}}", - "routes.event.descriptionchanged": "the event description changed", + "routes.event.descriptionchanged": "the event description changed {{ description }}", "routes.event.difftext": "This event was just updated with new information.", - "routes.event.editedsubject": "was just edited", - "routes.event.endtimechanged": "the end time changed to ", - "routes.event.locationchanged": "the location changed to", - "routes.event.namechanged": "the event name changed to", - "routes.event.starttimechanged": "the end time changed to", - "routes.event.timezonechanged": "the time zone changed to", + "routes.event.editedsubject": "{{ eventname }} was just edited", + "routes.event.endtimechanged": "the end time changed to {{ endtime }}", + "routes.event.locationchanged": "the location changed to {{ location }}", + "routes.event.namechanged": "the event name changed to {{ eventname }}", + "routes.event.starttimechanged": "the start time changed to {{ starttime }}", + "routes.event.timezonechanged": "the time zone changed to {{ timezone }}", "routes.magiclink-invalid": "This magic link is invalid or has expired. Please request a new one here.", "routes.magiclink.mailsubject": "Magic link to create an event", "routes.magiclink.provideemail": "Please provide an email address.", @@ -303,4 +303,4 @@ "views.publiceventlist.pastevents": "Past events", "views.publiceventlist.upcomingevents": "Upcoming events", "views.right": "Get it right!" -}
\ No newline at end of file +} diff --git a/locales/en.json b/locales/en.json index a6ba2e6..c44c29f 100644 --- a/locales/en.json +++ b/locales/en.json @@ -38,14 +38,14 @@ "routes.addeventcommentsubject": "New comment in {{eventName}}", "routes.deleteeventsubject": "{{ eventName }} was deleted", "routes.event.datetimeformat": "{{thedate, intlDate}}", - "routes.event.descriptionchanged": "the event description changed", + "routes.event.descriptionchanged": "the event description changed {{ description }}", "routes.event.difftext": "This event was just updated with new information.", - "routes.event.editedsubject": "was just edited", - "routes.event.endtimechanged": "the end time changed to ", - "routes.event.locationchanged": "the location changed to", - "routes.event.namechanged": "the event name changed to", - "routes.event.starttimechanged": "the end time changed to", - "routes.event.timezonechanged": "the time zone changed to", + "routes.event.editedsubject": "{{ eventname }} was just edited", + "routes.event.endtimechanged": "the end time changed to {{ endtime }}", + "routes.event.locationchanged": "the location changed to {{ location }}", + "routes.event.namechanged": "the event name changed to {{ eventname }}", + "routes.event.starttimechanged": "the start time changed to {{ starttime }}", + "routes.event.timezonechanged": "the time zone changed to {{ timezone }}", "routes.magiclink-invalid": "This magic link is invalid or has expired. Please request a new one here.", "routes.magiclink.mailsubject": "Magic link to create an event", "routes.magiclink.provideemail": "Please provide an email address.", @@ -303,4 +303,4 @@ "views.publiceventlist.pastevents": "Past events", "views.publiceventlist.upcomingevents": "Upcoming events", "views.right": "Get it right!" -}
\ No newline at end of file +} diff --git a/locales/ja.json b/locales/ja.json index eda49c9..a27c00c 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -4,7 +4,7 @@ "common.copy": "コピー", "common.coverimg": "カバー画像", "common.create": "作成", - "common.creating": "作成中...", + "common.creating": "作成しています...", "common.datetimeformat": "LL (dd) LT", "common.emailaddr": "メールアドレス", "common.eventend": "終了日時", @@ -38,14 +38,14 @@ "routes.addeventcommentsubject": "{{ eventName }} にコメントがきました", "routes.deleteeventsubject": "{{ eventName }} は削除されました", "routes.event.datetimeformat": "{{thedate, long}}", - "routes.event.descriptionchanged": "イベントの説明が変更 : ", + "routes.event.descriptionchanged": "イベントの説明が変更 : {{ description }}", "routes.event.difftext": "このイベントの情報の変更点です。", - "routes.event.editedsubject": "に変更があります", - "routes.event.endtimechanged": "終了時間が変更 : ", - "routes.event.locationchanged": "場所が変更 : ", - "routes.event.namechanged": "イベント名が変更 : ", - "routes.event.starttimechanged": "終了日時が変更 : ", - "routes.event.timezonechanged": "タイムゾーンが変更 ; ", + "routes.event.editedsubject": "{{ eventname }} に変更がありました", + "routes.event.endtimechanged": "終了時間が変更 : {{ endtime }}", + "routes.event.locationchanged": "場所が変更 : {{ location }}", + "routes.event.namechanged": "イベント名が変更 : {{ eventname }}", + "routes.event.starttimechanged": "開始日時が変更 : {{ starttime }}", + "routes.event.timezonechanged": "タイムゾーンが変更 : {{ timezone }}", "routes.magiclink-invalid": "このマジックリンクは無効、または期限が切れています。再度リクエストしてください。", "routes.magiclink.mailsubject": "イベント作成の「マジックリンク」", "routes.magiclink.provideemail": "メールアドレスを入力してください。", @@ -73,7 +73,7 @@ "util.validation.groupdata.eventgroupdescription": "説明は必須です。", "util.validation.groupdata.eventgroupname": "グループ名は必須です。", "util.validation.groupdata.eventgroupurl": "グループのリンクが無効です。", - "views.404desc": "もともと存在しなかったか、終了して一定期間を経過したのなら、サーバーから削除されたかのいずれかです。がっかりしないで――あなたがイベントを企画してみたら? あなたのオカリナ・リサイタルにぜひ行きたい、と思う人は私のほかにもきっといますよ。", + "views.404desc": "もともと存在しなかったか、終了して一定期間を経過してサーバーから削除されたかのいずれかです。がっかりしないで――あなたがイベントを企画してみたら? あなたのオカリナ・リサイタルにぜひ行きたい、と思う人は私のほかにもきっといますよ。", "views.404notfound": "イベントが見つかりません !", "views.createeventmagiclink.requestmlcontact": "問題が生じたら、インスタンス管理者にご連絡ください。", "views.createeventmagiclink.requestmldesc": "この Gathio インスタンスの管理者は、イベントの作成権限を特定のメールアドレスに限定しています。確認のため、以下から「マジックリンク」――イベント作成の入口へのリンクをリクエストしてください。あなたのメールアドレスでの作成が許可されていれば、マジックリンクがメールで届くはずです。許可されていなければ、メールは届きません。", @@ -84,7 +84,7 @@ "views.emails.addeventattendee.clicktocancel": "クリックしてキャンセル", "views.emails.addeventattendee.dontknowhtml": "{{siteName}} でイベントに参加した覚えがありませんか? どなたかが自分のメールアドレスを入力したつもりで、たまたまこちらのあなた様あてに届いてしまった可能性があります。このイベントに参加したくない場合は、上のキャンセルリンクまたは削除パスワードで手続きしていただけると助かります。", "views.emails.addeventattendee.eventlink": "イベントページを確認したい場合は、こちらのリンクから", - "views.emails.addeventattendee.preface": "{{ siteName }}でイベントへの参加を受け付けました。ありがとうございます。引きつづき、このイベントについての更新情報があればメールを送信いたします。イベント終了後、こちらのメールアドレスはイベントの情報とともに削除します。", + "views.emails.addeventattendee.preface": "{{ siteName }}でイベントへの参加を受け付けました。ありがとうございます。このイベントに更新があればメールで情報を送信いたします。イベント終了後、こちらのメールアドレスはイベントのデータとともに削除します。", "views.emails.addeventattendee.removapasswordhtml": "また、イベントページからこちらの<strong>参加者パスワード</strong>でのキャンセルもできます", "views.emails.addeventattendee.removelink": "イベント参加をキャンセル(辞退)しますか? こちらのリンクをクリック", "views.emails.addeventattendee.removepassword": "また、イベントページからこちらの参加者パスワードでのキャンセルもできます", @@ -92,15 +92,15 @@ "views.emails.addeventcomment.link": "コメントを確認", "views.emails.addeventcomment.preface": "{{ siteName }} であなたが参加を募っているイベントに {{ commentAuthor }} さんがコメントしました。", "views.emails.addeventcomment.prefacehtml": "{{ siteName }} であなたが参加を募っているイベントに、<strong>{{ commentAuthor }}</strong> さんがコメントしました。", - "views.emails.createevent.desc": "イベントの編集には、こちらのボタンをクリックしてします。【このリンクは共有してはいけません!】 このリンクを知られることで、イベントを編集・削除されたり、匿名の参加者の氏名を知られたりする危険があります。", - "views.emails.createevent.editpswddesc": "イベントグループの秘密の編集コード", + "views.emails.createevent.desc": "イベントの編集には、こちらのボタンをクリックします。【このリンクは共有してはいけません!】 このリンクを知られることで、イベントを編集・削除されたり、匿名の参加者の氏名を知られたりする危険があります。", + "views.emails.createevent.editpswddesc": "イベントグループの編集コード(要秘匿)", "views.emails.createevent.preface": "イベントを作成しました!", "views.emails.createevent.sharelink": "こちらのリンクで参加をよびかけましょう", "views.emails.createeventgroup.done": "以上です。お元気で!", "views.emails.createeventgroup.dontknow": "{{siteName}} でイベントグループを作成した覚えがありませんか? どなたかがグループを作る際に自分のメールアドレスを入力したつもりで、たまたまこちらのあなた様あてに届いてしまったのかもしれません。申し訳ございませんが、上の編集リンクからイベントグループを削除していただけば、あなた様のメールアドレスをシステムから完全に削除いたします。", - "views.emails.createeventgroup.editgrouplink": "イベントグループの編集する", + "views.emails.createeventgroup.editgrouplink": "イベントグループの編集", "views.emails.createeventgroup.editgrouplinkhtml": "イベントグループを編集", - "views.emails.createeventgroup.eventlink": "このグループにイベント(新たに作成するもの、既存のもののいずれでも)を追加する際は、「イベントグループにリンクする」のチェックボックスにチェックしてください。開いた入力欄に、以下の 2 つのコードをコピーする必要があるかもしれません :", + "views.emails.createeventgroup.eventlink": "このグループにイベント(新たに作成するもの、既存のもののいずれでも)を追加する際は、「イベントグループにリンクする」のチェックボックスにチェックしてください。場合によっては、開いた入力欄に以下の 2 つのコードをコピーする必要があります :", "views.emails.createeventgroup.link": "イベントグループを編集するには下のボタンをクリックするか、こちらのリンクをご利用ください", "views.emails.createeventgroup.preface": "{{ siteName }} にイベントグループを作成しました。心から感謝し、歓迎します。", "views.emails.createeventgroup.sharelink": "こちらのリンクで、このイベントグループのことを知らせましょう", @@ -159,7 +159,7 @@ "views.event.deletetitle": "'{{ eventData.name }}' を削除", "views.event.discussion": "コメント", "views.event.edit": "イベントを編集", - "views.event.editlater": "後でいつでも編集できます。", + "views.event.editlater": "後で編集することもできます(必須)", "views.event.ended": "終了済み", "views.event.enternum": "人数を入力してください", "views.event.hidden": " - 匿名", @@ -168,8 +168,8 @@ "views.event.hiddenattendee_zero": "匿名 なし", "views.event.hostedby": "主催 : </span> {{eventData.hostName}}", "views.event.ICSexport": "iCalendar ファイル出力", - "views.event.joinemaildesc": "ご自身のメールアドレスを入力すると、このイベントについての情報をメールで受けられます。", - "views.event.locationdesc": "具体的に。", + "views.event.joinemaildesc": "ご自身のメールアドレスを入力すると、このイベントの情報をメールで受けられます。", + "views.event.locationdesc": "具体的に", "views.event.lostpswd": "パスワードをなくしましたか ? イベントの主催者に連絡を。", "views.event.noattendees": "まだ参加者がいません !", "views.event.nospam": "SPAM を送ることはありません!", @@ -187,7 +187,7 @@ "views.event.removemyself": "キャンセル(辞退)する", "views.event.removemyselfdesc": "'{{eventData.name}}' への参加をキャンセル(辞退)する", "views.event.removepswd": "参加者パスワード", - "views.event.removepswddesc": "この参加者パスワードは、イベントへの参加をキャンセル(辞退)する際に使います。\nメールアドレスを入力すれば、メールでも受信できます。\nメールを入力しない場合は、<strong>二度と表示されない</strong>ので、今すぐ書き留めてください。", + "views.event.removepswddesc": "この参加者パスワードは、イベントへの参加をキャンセル(辞退)する際に使います。\nメールアドレスを入力すれば、メールに送信します。\nメールを入力しない場合は、<strong>二度と表示されない</strong>ので、今すぐ書き留めてください。", "views.event.removetitle": "{{ attendeeName }} を {{ eventName }} から削除", "views.event.removeuser": "ユーザーをイベントから削除", "views.event.reply": "返信", @@ -196,12 +196,12 @@ "views.event.showonGM": "Google マップで表示", "views.event.showonOM": "OpenStreetMap で表示", "views.event.started": "開催中", - "views.event.welcome": "あなたが作成したイベントです。ようこそ!", + "views.event.welcome": "イベントを作成しました。ようこそ!", "views.eventgroup.about": "このグループについて", "views.eventgroup.addevent": "このグループにイベントをリンクするには、新しくイベントを作る際に、もしくは既存のイベントを編集して、以下の 2 つのコードをコピー・貼り付けします。", "views.eventgroup.del": "このイベントグループを削除", "views.eventgroup.delconfirm": "このイベントグループを削除します。よろしいですか? この操作は取り消しできません。", - "views.eventgroup.deldesc": "この操作では、このグループの個々のイベントは<strong>削除しません</strong>。それらのイベントは後で別のグループにリンクすることもできます。", + "views.eventgroup.deldesc": "この操作では、グループの個々のイベントは<strong>削除しません</strong>。それらのイベントを後で別のグループにリンクすることもできます。", "views.eventgroup.deletetitle": "'{{ eventGroupData.name }}' を削除", "views.eventgroup.edit": "グループ編集", "views.eventgroup.editmode": "編集モードへ", @@ -218,37 +218,37 @@ "views.eventgroup.welcome": "あなたのイベントグループ ページへ、ようこそ!</br>すでに編集用リンク(要、秘匿)をメールで送信していますし、いまアドレスバーの URL にも表示しています。メールが届いてない? SPAM ・迷惑メールのフォルダー内もご確認を。</br>イベントグループを共有するには、このメッセージの下に表示しているリンクをご利用ください。このリンクから参加者がグループにアクセスしても、あなたが作ったこのグループを編集・削除することはできません !", "views.home.about": "{{ siteName }} のご紹介", "views.home.aboutgathio": "Gathio について", - "views.home.attention": "ご注意 : すべてのイベントは URL さえ入手すれば、だれでも見ることができます。ですから Gathio はサプライズの誕生日パーティーや秘密の革命事業には使わない方がいいでしょう…が、どうぞご自由に。", - "views.home.autodelete": "このインスタンスサーバーに設定されていれば、イベント終了後の一定のタイミングでイベントを自動的に削除します。関連するあなたについてのデータもいっしょに、データベースから完全に削除します。", + "views.home.attention": "ご注意 : すべてのイベントは URL さえ入手すれば、だれでも見ることができます。ですから Gathio はサプライズの誕生日パーティーや秘密の革命事業には使わない方がいいでしょう…とはいえ、どうぞご自由に。", + "views.home.autodelete": "このインスタンスサーバーの設定によっては、イベント終了後の一定のタイミングでイベントを自動的に削除します。関連するあなたご自身のデータも、いっしょにデータベースから完全に削除します。", "views.home.conftitle": "お好みの設定に", "views.home.fedtitle": "連合プロトコルとセルフホスト", - "views.home.flagshipsetting": "<a href = \"https://gath.io\">Gathio のフラッグシップインスタンスは gath.io </a>です。終わり次第順次削除されるイベント、URL を知っている人にしか開けないイベントを、だれでも作成できるよう設計しています。</br>もう一度言います、ここではだれでもイベントを作成できます。イベントがパブリックな場所に公開されることはありません。またイベントは終了して 7 日後に自動削除します。", - "views.home.imgexample": "ピクニックに行くイベントページの例です。イベントの場所、主催、日時と説明を記載しています。また Google カレンダーに保存、エクスポート、場所を OpenStreetMap と Google マップから開くこともできます。", + "views.home.flagshipsetting": "<a href = \"https://gath.io\">Gathio のフラッグシップインスタンスは gath.io </a>です。終わり次第イベントは順次削除、URL を知っている人にしか開けないイベントを、だれでも作成できるよう設計しています。</br>もう一度言います、ここではだれでもイベントを作成できます。イベントがパブリックな場所に公開されることはありません。またイベントは終了して 7 日後に自動削除します。", + "views.home.imgexample": "ピクニックに出かけるイベントページの例です。イベントの場所、主催、日時と説明を記載しています。また Google カレンダーに保存、エクスポート、場所を OpenStreetMap と Google マップで開くこともできます。", "views.home.intro": "Gathio は、簡単、プライバシーファーストで、イベントの主催と参加、共有をサポートするシステムです。連合プロトコルにも対応しています。", "views.home.kofi": "Ko-fi で支援を", "views.home.kofidesc": "<strong>gath<span class='text-muted'>io</span></strong> 、よく使ってるし便利だよね…と思ったら、コーヒー 1 杯分を出してくれませんか? かならずサイトの運営に役立てます! <i class=\"far fa-heart\"></i>", - "views.home.onpre": "あなたのコミュニティーで自分たちの Gathio インスタンスを建てるなら、そこではイベントの作成を特定の人しかできないようにしたり、ホームページに便利なイベント一覧を表示したり、イベント削除を一切しない…といった制限・設定を加えることもできます。", + "views.home.onpre": "あなたのコミュニティーで自分たちの Gathio インスタンスを建てるなら、そこではイベントの作成を特定の人にしかできないようにしたり、便利な公開イベントリストをホームページに表示したり、終了後にイベントを削除しない…といった設定・制限を加えることもできます。", "views.home.opensource": "オープンソース", "views.home.osdesc": "Gathio はオープンソースであることを光栄に思っており、素敵な人たちが集まるグループで作成しています。 \nどんな問題でも<a href = \"https://github.com/lowercasename/gathio/issues\">トラッカー</a>で質問してください。", "views.home.privacy": "また、Gathio は広告を表示しません。あなたのデータを第三者に提供・売却することはしません。不要なメールを送ることもありません。", "views.home.privacytitle": "プライバシーファースト", "views.home.privdesc": "Gathio にはアカウントはありません。イベントを作成した時点で、後で編集する際のパスワードを生成しお知らせします。参加を呼びかける相手には、参加用リンクを伝えるだけ。共同主催者には、編集用リンク(パスワード埋め込み済み)を伝えます。", "views.home.privmail": "メールアドレスを入力すると編集パスワードを受信できます。けっしてなくさないように――それでもメールアドレスの入力は任意です!", - "views.home.selfhost": "Gathio は簡単にセルフホストできます。Mastodon、Pleroma、Friendica などの ActivityPub サービスをサポートしているので、Fediverse のどこからでもイベントにアクセスできます。\n私たちは、あなた方が自分たちのコミュニティー用に自前のインスタンスを建てることを応援ていします。詳しい手順・説明は、<a href = \"https://docs.gath.io/using-gathio/fediverse/\">AactivityPub access</a> や GitHub wiki の<a href = \"https://docs.gath.io/running-gathio/installation/\">セルフホスト インストール</a>を参考にしてください。", + "views.home.selfhost": "Gathio は簡単にセルフホストできます。Mastodon、Pleroma、Friendica などの ActivityPub サービスをサポートしているので、Fediverse のどこからでもイベントにアクセスできます。\n私たちは、あなた方が自分たちのコミュニティー用に自前のインスタンスを建てることを応援します。詳しい手順・説明は、<a href = \"https://docs.gath.io/using-gathio/fediverse/\">AactivityPub access</a> や GitHub wiki の<a href = \"https://docs.gath.io/running-gathio/installation/\">セルフホスト インストール</a>を参考にしてください。", "views.incorrectpswd": "編集パスワードが一致しません。もう一度やり直してください。", "views.interaction": "ユーザーにコメントを許可する", "views.join": "ユーザーは自分で参加登録する", - "views.layouts.main.defaultmetadata": "より簡単に、より速く、よりプライバシー侵害の小さい、イベントを作成・共有する方法", + "views.layouts.main.defaultmetadata": "より簡単に、より速く、プライバシー侵害のより小さく、イベントを作成・共有する方法", "views.layouts.main.footnote": "<strong>Gathio</strong> {{version}} バージョン · <a href=\"https://github.com/lowercasename/gathio\">GitHub</a> · <a href=\"https://raphaelkabo.com\">Raphael</a> と <a href=\"https://github.com/lowercasename/gathio/graphs/contributors\">協力者たち</a> が <i class=\"far fa-heart\"></i> を込めて作成しています。", "views.newevent.createnew": "イベントを作成", "views.newevent.groupattention": "イベントグループは、イベントのように自動削除されることはありません。しかし、{{siteName}} から削除されたイベントは、当然ですが、イベントグループに表示されません。", - "views.newevent.groupdesc": "イベントグループは、リンクしたイベントをまとめる機能です。例えば、シリーズものの映画上映会、いくつかのイベントに分かれるフェス、音楽バンドのツアーなどに便利です。個々のイベントへの公開リンクのように、グループの公開リンクを共有することができます。また秘密の編集パスワード(グループ作成時にメール送信)を知っているメンバーは、今後のイベントをグループに追加することができます。", + "views.newevent.groupdesc": "イベントグループは、リンクしたイベントをまとめる機能です。例えば、シリーズものの映画上映会、いくつかのイベントに分かれるフェス、バンドのツアーなどに便利です。個々のイベントへの公開リンクのように、グループの公開リンクを共有することができます。また秘密の編集パスワード(グループ作成時にメール送信)を知っているメンバーは、今後のイベントをグループに追加することができます。", "views.newevent.importevent": "既存のイベントをインポート", "views.newevent.neweventbutton": "イベントを作成", "views.newevent.neweventgroup": "イベントグループを作成", "views.newevent.newgroup": "グループを作成", "views.newevent.pagetitle": "どれからはじめますか?", - "views.newevent.visiblealert": "イベントは、リンクさえ知れば、だれでも見ることができます。", + "views.newevent.visiblealert": "イベントは、リンクさえ知っていれば、だれでも見られます。", "views.options.showlistattendees": "参加者リストを表示", "views.partials.choosefile": "ファイルを選択", "views.partials.creatoremaildesc": "メールアドレスを入力すると、編集用秘密パスワードを受信できます。また、イベントについての更新情報も届きます。", @@ -258,7 +258,7 @@ "views.partials.editeventgroup.del": "このイベントグループを削除する", "views.partials.editeventgroup.delbutton": "イベントグループを削除", "views.partials.eventform.creatoremail": "あなたのメールアドレス", - "views.partials.eventform.eventdescription": "説明", + "views.partials.eventform.eventdescription": "説明(必須)", "views.partials.eventform.eventgroup": "イベントグループにリンクする", "views.partials.eventform.eventgroupdata": "このイベントをイベントグループにリンク", "views.partials.eventform.eventgroupedittoken": "この長い文字列は、グループを作成したときに送信する確認メールにも記載しています。", @@ -284,18 +284,18 @@ "views.partials.fixerrors": "エラーを修正してください :", "views.partials.importevent.selectfile": "ファイルを選択", "views.partials.importeventform.import": "インポート", - "views.partials.importeventform.importdesc": ".ics ファイルをアップロードすると、簡単にイベントを作成できます。Facebook のイベントは、コンテキストメニューをクリックし、「カレンダーに追加」を選ぶことでファイルをダウンロードできます。", - "views.partials.importeventform.importing": "インポート中...", + "views.partials.importeventform.importdesc": ".ics ファイルをアップロードすることで、簡単にイベントを作成できます。Facebook のイベントは、コンテキストメニューをクリックし、「カレンダーに追加」を選ぶことでファイルをダウンロードできます。", + "views.partials.importeventform.importing": "インポートしています...", "views.partials.instancerules.instancesettings": "インスタンス設定", "views.partials.mdsupport": "<a href='https://commonmark.org/help/'>Markdown</a> 書式対応", "views.partials.recommendeddimensions": "推奨する画像サイズ(幅 ✕ 高さ): 920 ✕ 300 ピクセル", "views.partials.save": "変更を保存", - "views.partials.saving": "保存中...", + "views.partials.saving": "保存しています...", "views.partials.sidebar.about": "{{ siteName }} について", "views.partials.sidebar.createevent": "イベントを作成", "views.partials.sidebar.events": "イベントを探す", - "views.partials.snappy": "ズバッと。", - "views.partials.wontshow": "どこにも表示しません(任意)。", + "views.partials.snappy": "簡潔に(必須)", + "views.partials.wontshow": "どこにも表示しません(任意)", "views.publiceventlist.events": "公開イベント", "views.publiceventlist.groups": "公開グループ", "views.publiceventlist.nogroups": "公開グループなし!", @@ -13,7 +13,7 @@ import path from 'path'; const require = createRequire(import.meta.url); const handlebarsI18next = require('handlebars-i18next'); -// ESモジュールで__dirnameを再現 +// Recreate __dirname in ES module const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -37,7 +37,7 @@ const app = express(); app.locals.sendEmails = initEmailService(); -// ESモジュールで__dirnameを再現する部分を関数化 +// function to construct __dirname with ES module const getLocalesPath = () => { const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -75,11 +75,12 @@ async function initializeApp() { app.use(handle(i18next)); - // 言語を明示的に切り替える + // to Switch language app.use((req, res, next) => { const currentLanguage = i18next.language; i18next.changeLanguage(req.language); const newLanguage = i18next.language; +// Uncomment for debugging // console.log('Language Change:', { // header: req.headers['accept-language'], // detected: req.language, @@ -89,7 +90,7 @@ async function initializeApp() { next(); }); -// // デバッグ用 +// Uncomment for debugging // app.use((req, res, next) => { // console.log('Language Detection:', { // header: req.headers['accept-language'], @@ -108,16 +109,16 @@ async function initializeApp() { json: function (context: any) { return JSON.stringify(context); }, - // i18nextヘルパーを追加 + // add i18next helpers ...getI18nHelpers(), - plural: function (key: string, count: number, options: any) { // ★plural ヘルパーを登録 + plural: function (key: string, count: number, options: any) { // Register the plural helper const translation = i18next.t(key, { count: count }); return translation; } }, }); - // i18nextHelperの呼び出し方法を変更 + // calling i18nextHelper if (typeof handlebarsI18next === 'function') { handlebarsI18next(hbsInstance.handlebars, i18next); } else if (typeof handlebarsI18next.default === 'function') { diff --git a/src/routes/event.ts b/src/routes/event.ts index ca333c5..8972169 100644 --- a/src/routes/event.ts +++ b/src/routes/event.ts @@ -414,10 +414,10 @@ router.put( "<p>" + i18next.t("routes.event.difftext") + "</p><ul>"; let displayDate; if (event.name !== updatedEvent.name) { - diffText += `<li>` + i18next.t("routes.event.namechanged") + updatedEvent.name + `</li>`; + diffText += `<li>` + i18next.t("routes.event.namechanged", { eventname: updatedEvent.name} ) + `</li>`; } if (event.location !== updatedEvent.location) { - diffText += `<li>` + i18next.t("routes.event.locationchanged") + updatedEvent.location + `</li>`; + diffText += `<li>` + i18next.t("routes.event.locationchanged", { location: updatedEvent.location} ) + `</li>`; } if ( event.start.toISOString() !== updatedEvent.start.toISOString() @@ -425,19 +425,19 @@ router.put( displayDate = moment .tz(updatedEvent.start, updatedEvent.timezone) .format(i18next.t("common.datetimeformat")); - diffText += `<li>` + i18next.t("routes.event.starttimechanged") + displayDate + `</li>`; + diffText += `<li>` + i18next.t("routes.event.starttimechanged", { starttime: displayDate }) + `</li>`; } if (event.end.toISOString() !== updatedEvent.end.toISOString()) { displayDate = moment .tz(updatedEvent.end, updatedEvent.timezone) .format(i18next.t("common.datetimeformat")); - diffText += `<li>` + i18next.t("routes.event.endtimechanged") + displayDate + `</li>`; + diffText += `<li>` + i18next.t("routes.event.endtimechanged", { endtime: displayDate }) + `</li>`; } if (event.timezone !== updatedEvent.timezone) { - diffText += `<li>` + i18next.t("routes.event.timezonechanged") + updatedEvent.timezone + `</li>`; + diffText += `<li>` + i18next.t("routes.event.timezonechanged", { timezone: updatedEvent.timezone }) + `</li>`; } if (event.description !== updatedEvent.description) { - diffText += `<li>` + i18next.t("routes.event.descriptionchanged") + `</li>`; + diffText += `<li>` + i18next.t("routes.event.descriptionchanged", { description: updatedEvent.description }) + `</li>`; } diffText += `</ul>`; const updatedEventObject = await Event.findOneAndUpdate( @@ -502,7 +502,7 @@ router.put( sendEmailFromTemplate( config.general.email, attendeeEmails.join(","), - `${event.name} ` + i18next.t("routes.event.editedsubject"), + i18next.t("routes.event.editedsubject", { eventname: event.name}), "editEvent", { diffText, diff --git a/src/util/validation.ts b/src/util/validation.ts index 4ead7df..ccfc8d5 100644 --- a/src/util/validation.ts +++ b/src/util/validation.ts @@ -131,7 +131,7 @@ export const validateEventData = ( const errors: Error[] = []; if (!validatedData.eventName) { errors.push({ - message: i18next.t('validation.eventdata.eventname'), + message: i18next.t('util.validation.eventdata.eventname'), field: "eventName", }); } |