diff --git a/README.md b/README.md
index b2c9a47..66d6e9c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-
中文 | English
+
中文 | English | 日本語
HelloGitHub 是一个发现和分享有趣、入门级开源项目的平台
diff --git a/README_en.md b/README_en.md
index 2e85b43..a09ce44 100644
--- a/README_en.md
+++ b/README_en.md
@@ -1,6 +1,6 @@
-
中文 | English
+
中文 | English | 日本語
HelloGitHub is a platform for discovering and sharing beginner-friendly open source projects
diff --git a/README_ja.md b/README_ja.md
new file mode 100644
index 0000000..223556c
--- /dev/null
+++ b/README_ja.md
@@ -0,0 +1,36 @@
+
+
+
中文 | English | 日本語
+
HelloGitHubは、初心者向けのオープンソースプロジェクトを発見・共有するプラットフォームです
+
+
+「Geese」は「Jinghong(一瞬の眺め)」と訳され、軽快で迅速な形態を体現し、その爽やかでミニマルなインターフェースを通じて「Jinghong」のようなブラウジング体験を提供することを目指しています。
+
+## はじめに
+
+オープンソースプロジェクトを楽しむ人々のための場所を作りたいと考え、Next.jsとTailwind CSSを使用して軽量なオープンソースコミュニティを構築しました。このリポジトリには[HelloGitHub](https://hellogithub.com/)コミュニティのソースコードが含まれています。
+
+
+
+このコミュニティでは、様々な**プログラミング言語**と**カテゴリー**にわたる興味深い初心者向けのオープンソースプロジェクトを提供しています。ユーザーは興味のあるプロジェクトを**発見/検索/ブックマーク/コメント/共有**することができます。また、優れたオープンソースプロジェクトを際立たせるために、プロジェクトに**いいね/投稿/評価**することもできます。これらのプロジェクトを中心に、オープンソース愛好家、熟練した専門家、共有を愛する作者たちが集まっています。**オープンソース**のおかげで私たちは出会うことができました。おそらく、オープンソースの精神は友達を作る方法の一つなのでしょう!
+
+現在、コミュニティは[オンライン体験](https://hellogithub.com)が可能です。問題や不具合に遭遇した場合は、[ワンクリックで報告](https://github.com/HelloGitHub-Team/geese/issues/new)することができます。
+
+## 参加可能なタスク
+
+- [ ] [[Complex] パッケージサイズの削減](https://github.com/HelloGitHub-Team/geese/issues/101)
+- [ ] [[Simple] 未解決の課題](https://github.com/HelloGitHub-Team/geese/issues/38)
+
+開発ガイドラインは[こちら](./docs/content_ja.md)で確認できます。すべての[コントリビューター](https://github.com/HelloGitHub-Team/geese/graphs/contributors)に感謝します。皆さんとオープンソースプロジェクトに取り組めることを嬉しく思います。この経験は非常に有意義なものとなっています。
+
+**要件**
+
+1. **オープンソースへの情熱**、**最後までやり遂げる意志**、そして**信頼性**を持っていること。
+2. 完了時期:実際の状況に応じて設定可能です。参考期間:Simple(7日)、Medium(14日)、Complex(30日)。
+3. 質問がある場合は、対応する`issues`でコミュニケーションを取ってください。
+
+## 免責事項
+
+お問い合わせ
+
+
この作品はクリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンスの下に提供されています。
\ No newline at end of file
diff --git a/docs/content_en.md b/docs/content_en.md
index b2451f7..0b0a426 100644
--- a/docs/content_en.md
+++ b/docs/content_en.md
@@ -1,3 +1,5 @@
+[中文](content.md) | English | [日本語](content_ja.md)
+
## Before Development
Firstly, the project utilizes yarn for package installation, which you can search for and install on your own. After installation is complete, set the version number with the command `yarn set version v1.22.19`.
diff --git a/docs/content_ja.md b/docs/content_ja.md
new file mode 100644
index 0000000..35cbd22
--- /dev/null
+++ b/docs/content_ja.md
@@ -0,0 +1,66 @@
+[中文](content.md) | [English](content_en.md) | 日本語
+
+## 開発を始める前に
+
+まず、プロジェクトはyarnをパッケージインストール用に使用しています。yarnを自身でインストールしてください。インストール完了後、`yarn set version v1.22.19`コマンドでバージョンを設定します。
+
+次に、'Geese'プロジェクトをローカルで実行するには、以下の手順に従ってください:
+
+1. プロジェクトのクローン: `git clone git@github.com:HelloGitHub-Team/geese.git`
+2. 依存関係のインストール: `yarn install`
+3. プロジェクトの実行: `yarn dev`
+4. ブラウザでアクセス: `http://localhost:3000/`
+
+起動後に遭遇する可能性のある問題:
+
+1. CORS問題: フロントエンドサービスがポート`3000`で、ホストが`localhost`または`127.0.0.1`で起動していることを確認してください。
+2. 画像が表示されない: ローカルのhostsファイルの末尾に`127.0.0.1 dev.hg.com`を追加し、`http://dev.hg.com:3000/`でアクセスしてください。
+3. ログイン状態: @521xueweihanからテスト環境のログイントークンを取得し、ブラウザのLocalStorageにAuthorization: tokenアイテムを手動で追加してください。
+4. ビルド中にマシンがフリーズする場合: yarnで同時実行数を設定することで解決できます: `yarn config set cloneConcurrency 1`
+
+**技術スタック**
+
+- [Next.js](https://nextjs.org/)
+- [Tailwind CSS](https://tailwindcss.com/)
+- [SWR](https://swr.vercel.app/ja)
+- スキャフォールド: [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter)
+- コンポーネントスタイル: [hyperui](https://github.com/markmead/hyperui)
+
+最後に、APIドキュメントは[こちら](https://frp.hellogithub.com/docs#)で確認できます。
+
+プロジェクトを実行できたら、ローカルで試してみてください。興味を持った場合は、[こちら](https://github.com/orgs/HelloGitHub-Team/projects/1/views/1)をクリックして未割り当ての要件を確認し、興味のある機能、バグ、または最適化を見つけ、開発を始める前に対応するissuesで@521xueweihanに「タスクを引き受けます」と伝えて、**重複開発を防いでください**。
+
+## 開発中
+
+これは共同開発であるため、`main`ブランチは継続的に更新される可能性があります。各開発セッションの前に、最新のコードをプルして、最新の`main`ブランチに基づいて開発していることを確認する必要があります。
+
+特定の要件を開発する際は、コードを対応するディレクトリに分割してください:
+
+- コンポーネント: `components`ディレクトリ
+- ページ: `pages`ディレクトリ
+- データ定義: `types`ディレクトリ
+- リクエスト: `services`ディレクトリ
+
+機能開発/バグ修正の完了後、セルフテスト、コードスタイルのチェック、コードの再利用性の向上を行う必要があります。
+
+最後に、以下のコマンドをローカルで実行し、可能な限り**警告**を解決してください:
+
+- `yarn lint:fix`
+- `yarn lint`
+- `yarn typecheck`
+
+## 開発後
+
+最新の`main`ブランチコードを取得し、ローカルで競合を解決してください。
+
+最初のコード提出は、PR(Pull Request)を通じて行う必要があります。
+
+コードが正常にマージされた後、@521xueweihanが'Geese'プロジェクトのメンバーとして招待します。GitHubの通知メールを確認してください。
+
+その後のコード提出は、'自己作成ブランチ'または'要件の引き受け時に自動作成されるブランチ'で開発できます。
+
+コードを提出した後は、プロジェクトの**issues**と**prs**の通知に注意を払ってください。提出されたコードをレビューした後、フィードバックと最適化の提案を提供します。
+
+## 最後に
+
+皆さんと'Geese'を構築できることを嬉しく思います。コード貢献のプロセスから何かを得ていただければ幸いです。
\ No newline at end of file
diff --git a/next-i18next.config.js b/next-i18next.config.js
index fa901cf..af84c82 100644
--- a/next-i18next.config.js
+++ b/next-i18next.config.js
@@ -3,7 +3,7 @@
module.exports = {
i18n: {
defaultLocale: 'zh',
- locales: ['zh', 'en'],
+ locales: ['zh', 'en', 'ja'],
},
// eslint-disable-next-line @typescript-eslint/no-var-requires
localePath: require('path').resolve('./public/locales'), // 指定翻译文件的路径
diff --git a/public/locales/ja/article.json b/public/locales/ja/article.json
new file mode 100644
index 0000000..14877b0
--- /dev/null
+++ b/public/locales/ja/article.json
@@ -0,0 +1,13 @@
+{
+ "title": "記事",
+ "description": "オープンソースの世界の素晴らしさを共有し、オープンソースプロジェクトに関する独自の高品質な記事に焦点を当て、厳選された選択肢と実践的なガイドを提供します。",
+ "bottom_text_login": "これ以上の記事はありません。",
+ "bottom_text_nologin": "コンテンツはここまでです!ログインすると、さらに表示されます。",
+ "nav": {
+ "title": "記事",
+ "hot": "人気",
+ "last": "最新"
+ },
+ "author": "著者:{{name}}",
+ "read": "閲覧数:{{num}}"
+}
\ No newline at end of file
diff --git a/public/locales/ja/claim.json b/public/locales/ja/claim.json
new file mode 100644
index 0000000..4abc2b2
--- /dev/null
+++ b/public/locales/ja/claim.json
@@ -0,0 +1,56 @@
+{
+ "title": "HelloGitHubバッジを着用",
+ "description": "オープンソースプロジェクトの影響力を高め、その素晴らしさを示し、オープンソースの取り組みの促進と運営をサポートします。",
+ "navbar": "HelloGitHubバッジ",
+ "top_h2": "HelloGitHubバッジプログラムに参加",
+ "top_text": "これはオープンソースプロジェクトの獲得プログラムです。獲得後、HelloGitHubバッジを着用することで、プロジェクトがコミュニティから受けた認知と推薦を示し、オープンソースプロジェクトの栄光を強調します。同時に、オープンソースプロジェクトを獲得することで、コミュニティからのより多くの推薦と特典を享受できます。",
+ "badge_theme_neutral": "ホワイト",
+ "badge_theme_dark": "ダーク",
+ "badge_theme_small": "スモール",
+ "copy": {
+ "text": "コードをコピー",
+ "success": "コピー成功",
+ "warning": "バッジを生成中です。後でもう一度お試しください",
+ "fail": "コピー失敗"
+ },
+ "submit": {
+ "text": "送信",
+ "loading": "送信中",
+ "check_fail": "正しいREADMEファイル名を入力してください!",
+ "check_fail2": "このプロジェクトはまだ掲載されていません。先に投稿してください。",
+ "check_fail3": "このプロジェクトは既に獲得されています!問題がある場合は管理者に連絡してください",
+ "check_fail4": "このプロジェクトの獲得状態が異常です。管理者に連絡してください",
+ "check_fail5": "プロジェクトの獲得状態はまだレビュー中です。コミュニティの確認をお待ちください",
+ "check_fail6": "このプロジェクトはレビューを通過していません。処理を加速するために管理者に連絡できます",
+ "success": "おめでとうございます!送信が成功しました。コミュニティの確認をお待ちください。",
+ "fail": "確認に失敗しました!READMEファイル名とコードの整合性を確認してください。",
+ "fail2": "確認に失敗しました!ネットワークとREADMEファイル名を確認してください。"
+ },
+ "rights": {
+ "item1": "コミュニティの認知:バッジは、あなたのプロジェクトがHelloGitHubコミュニティの厳格な選考を通過し、推薦を受けたことを示します。",
+ "item2": "露出の増加:獲得(バッジの着用)を完了すると、より多くの推薦トラフィックを獲得し、潜在的なユーザーと貢献者を引き付けます。",
+ "item3": "交流の機会:ユーザーはバッジを通じてあなたのプロジェクトを素早く理解し、いいね、コメント、お気に入りでコミュニティと交流できます。",
+ "item4": "フィードバックの蓄積:幅広いユーザーから真摯なフィードバックを収集し、プロジェクトを継続的に最適化します。",
+ "item5": "作者の識別:確認後、あなたのコメントには目立つ識別子が表示され、コメントのピン留めを受けることができます。"
+ },
+ "generate": {
+ "title": "バッジを生成",
+ "placeholder": "プロジェクトのGitHub URLを入力",
+ "button": "生成"
+ },
+ "howto": {
+ "title": "オープンソースプロジェクトを獲得",
+ "step1": "あなたのプロジェクトがHelloGitHubコミュニティに掲載されていることを確認し、クリックしてください",
+ "step2": "プロジェクトのREADMEファイルの適切な位置を見つけ、コピーしたコードを貼り付けて、変更を送信します。",
+ "step3": "バッジの着用を完了したら、プロジェクトのREADMEファイル名を入力してください:",
+ "step4": "HelloGitHubチームによってプロジェクトが承認されたら、より多くの推薦と特典をお楽しみください。"
+ },
+ "question": {
+ "title": "よくある質問",
+ "item1": "権限:プロジェクトの作者または変更権限を持つ貢献者のみがプロジェクトを獲得できます。十分な権限があることを確認してください。",
+ "item2": "確認失敗:コミュニティに既に掲載されているプロジェクトのみ獲得できます。プロジェクトが掲載されていない場合は、先に投稿してください。",
+ "item3": "認証無効:プロジェクトのREADMEファイル名を変更したり、バッジコードを削除したりすると、認証が無効になります。",
+ "item4": "一度限りの獲得:認証後、プロジェクトの獲得は変更できません。進める前にすべての情報を再確認してください。",
+ "item5": "サポート:WeChat: xueweihan(注:獲得について)で連絡できます。"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json
new file mode 100644
index 0000000..1ddfd2e
--- /dev/null
+++ b/public/locales/ja/common.json
@@ -0,0 +1,125 @@
+{
+ "header": {
+ "search": "プロジェクトを検索",
+ "home": "ホーム",
+ "periodical": "月刊",
+ "rank": "ランキング",
+ "article": "記事",
+ "submit": "投稿",
+ "profile": "プロフィール",
+ "notification": "通知",
+ "logout": "ログアウト"
+ },
+ "login": {
+ "text": "ログイン",
+ "title": "ログイン方法を選択",
+ "tips": "ログインすると",
+ "agreement": "利用規約",
+ "oauth": "{{platform}}でログイン",
+ "redirect": "リダイレクト待ち...",
+ "redirect_bar_text": "ログイン中、リダイレクト待ち...",
+ "bottom_text_login": "ログインに同意する"
+ },
+ "user_side": {
+ "contribute_label": "貢献",
+ "profile": "プロフィール",
+ "admin": "設定",
+ "logout": "ログアウト",
+ "login": "ログイン"
+ },
+ "advert": {
+ "desc": "期限まで",
+ "desc2": "コーヒーを奢る",
+ "next": "ゴールドが必要",
+ "next2": "次の目標まで",
+ "day": "日",
+ "year": "年"
+ },
+ "site_stats": {
+ "user": "ユーザー数",
+ "repo": "プロジェクト数",
+ "title": "概要",
+ "desc": "HelloGitHubは、初心者向けのオープンソースプロジェクトを発見・共有するプラットフォームです。\nユーザーがプログラミングの楽しさを見つけ、技術的な課題を解決し、オープンソースの旅を始めるための素晴らしいツールを探索するお手伝いをします。"
+ },
+ "recommend": {
+ "title": "おすすめ",
+ "desc": "コンテンツはspdxとGitHubから収集され、",
+ "desc2": "プロトコルに従っています。",
+ "change": "更新"
+ },
+ "footer": {
+ "feedback": "フィードバック",
+ "business": "ビジネス",
+ "contact": "お問い合わせ",
+ "agreement": "利用規約",
+ "source": "ソース",
+ "sitemap": "サイトマップ",
+ "server_sponsor": "サーバースポンサー",
+ "server_sponsor2": "",
+ "cdn_sponsor": "クラウドストレージスポンサー",
+ "cdn_sponsor2": ""
+ },
+ "submit_repo": {
+ "text": "投稿",
+ "title": "プロジェクトを推薦または投稿",
+ "description": "承認されたプロジェクトのみがホームページに表示されます",
+ "url_placeholder": "プロジェクトURL",
+ "url_tip": "👆 GitHubのプロジェクトのみ受け付けています",
+ "title_placeholder": "タイトル:プロジェクトを簡単に紹介",
+ "summary_placeholder": "説明:プロジェクトの内容、解決する問題、使用技術、機能、使用例などを説明してください(明確な説明は承認の可能性を高めます!)",
+ "summary_tip": "文字制限:10-300文字",
+ "create_err": "URLを入力してください",
+ "create_err2": "タイトルは5文字以上必要です",
+ "create_err3": "説明は10文字以上必要です",
+ "create_err4": "タイトルは50文字を超えることはできません",
+ "create_err5": "説明は300文字を超えることはできません",
+ "create_success": "共有ありがとうございます!今日はあと{{remaining}}回投稿できます",
+ "check_url_err": "URLはhttps://github.comで始まる必要があります",
+ "check_url_err2": "このプロジェクトは既に存在します。別のものを試してください",
+ "check_url_err3": "無効なURL",
+ "check_url_err4": "リクエストに失敗しました。後でもう一度お試しください"
+ },
+ "collect": {
+ "title": "新規",
+ "create_success": "作成成功",
+ "create_fail": "作成失敗",
+ "edit_success": "編集成功",
+ "edit_fail": "編集失敗",
+ "name": "名前",
+ "name_placeholder": "フォルダ名を入力",
+ "desc": "説明",
+ "desc_placeholder": "フォルダの説明を入力(最大100文字、任意)",
+ "pravite": "非公開",
+ "pravite_desc": "あなたにのみ表示",
+ "public": "公開",
+ "public_desc": "全員に表示",
+ "button": {
+ "cancel": "キャンセル",
+ "confirm": "確認"
+ }
+ },
+ "feedback": {
+ "success": "送信成功",
+ "err": "内容を入力してください",
+ "err2": "内容は1000文字を超えることはできません",
+ "content_placeholder": "詳細なフィードバックをこちらに記入してください。丁寧に読み、迅速に対応いたします。",
+ "limit": "文字制限:1-1000文字",
+ "contact_placeholder": "連絡先:WeChat/電話番号/メール",
+ "submit": "送信",
+ "options": {
+ "feedback": {
+ "name": "提案",
+ "title": "改善提案"
+ },
+ "bug": { "title": "問題報告" },
+ "bussiess": { "name": "ビジネス", "title": "ビジネス提携" },
+ "other": { "name": "その他", "title": "自由にお話しください" }
+ }
+ },
+ "redirect": "HelloGitHubコミュニティを離れて、以下のURLにジャンプします 👇",
+ "theme": {
+ "dark": "ダークテーマ",
+ "light": "ライトテーマ"
+ },
+ "return": "ホームに戻る"
+}
\ No newline at end of file
diff --git a/public/locales/ja/help.json b/public/locales/ja/help.json
new file mode 100644
index 0000000..148ee75
--- /dev/null
+++ b/public/locales/ja/help.json
@@ -0,0 +1,12 @@
+{
+ "ats": {
+ "title": "利用規約"
+ },
+ "level": {
+ "title": "コミュニティレベルルール",
+ "nav": {
+ "middle": "コミュニティレベル",
+ "end": "概要"
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/home.json b/public/locales/ja/home.json
new file mode 100644
index 0000000..d5b8a68
--- /dev/null
+++ b/public/locales/ja/home.json
@@ -0,0 +1,27 @@
+{
+ "title": "魅力的なオープンソースコミュニティ",
+ "description": "HelloGitHubオープンソースコミュニティは、魅力的な初心者向けオープンソースプロジェクトの発掘と共有に専念しています。ここでは、オープンソース技術のソリューションを探求し、オープンソースの喜びを味わい、プロジェクトを推薦または推奨してオープンソースの冒険を始めることができます。",
+ "bottom_text_login": "ページの最後に到達しました",
+ "bottom_text_nologin": "ページの最後です!さらに読むにはログインしてください",
+ "nav": {
+ "all": "すべて",
+ "newest": "最新",
+ "monthly": "月間",
+ "yearly": "年間",
+ "featured": "注目"
+ },
+ "tag_side": {
+ "title": "トピック",
+ "manage": "設定"
+ },
+ "tag_modal": {
+ "tips": "ヒント:左側のタグをクリックして「選択」し、右側の選択したタグをドラッグして「並び替え」ができます",
+ "selected": "選択済み:",
+ "fetch_fail_msg": "タグの取得に失敗しました",
+ "add": "タグを追加",
+ "save": "保存",
+ "save_success_msg": "保存に成功しました!",
+ "save_fail_msg": "保存に失敗しました!",
+ "max_tag_msg": "最大{{maxTotal}}個のタグまでしか選択できません!"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/license.json b/public/locales/ja/license.json
new file mode 100644
index 0000000..a48fe32
--- /dev/null
+++ b/public/locales/ja/license.json
@@ -0,0 +1,13 @@
+{
+ "title": "{{spdx}}オープンソースライセンス",
+ "nav": "ライセンス",
+ "feedback": "フィードバック",
+ "copy": {
+ "button": "コピー",
+ "success": "オープンソースライセンスの内容をコピーしました",
+ "fail": "コピーに失敗しました"
+ },
+ "expand": "展開",
+ "collapse": "折りたたむ",
+ "empty": "コンテンツがありません"
+}
\ No newline at end of file
diff --git a/public/locales/ja/notification.json b/public/locales/ja/notification.json
new file mode 100644
index 0000000..35d07a7
--- /dev/null
+++ b/public/locales/ja/notification.json
@@ -0,0 +1,16 @@
+{
+ "title": "メッセージセンター",
+ "empty": "メッセージはありません",
+ "repository": {
+ "desc": "あなたは{{content}}プロジェクト"
+ },
+ "reply": {
+ "desc": "で",
+ "desc2": "あなたに返信しました:"
+ },
+ "comment": {
+ "desc": "あなたの",
+ "desc2": "あなたが共有した",
+ "desc3": "プロジェクトにコメントしました:"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/onefile.json b/public/locales/ja/onefile.json
new file mode 100644
index 0000000..3b9999a
--- /dev/null
+++ b/public/locales/ja/onefile.json
@@ -0,0 +1,26 @@
+{
+ "title": "OneFile オープンソースプロジェクト",
+ "description": "単一ファイルで動作する、コピーして実行できるオープンソースプロジェクトのコレクション",
+ "click": "クリック",
+ "p_text": "OneFileは、1つのファイルだけで構成されたオープンソースプロジェクトのコレクションで、実行と理解が容易です。ゲーム、コンパイラ、サーバー、ツール、ユーティリティライブラリなどが含まれています。コピーして実行するだけで、ソースコードを確認し、ワンクリックでオンラインで試すことができます。",
+ "p_text2": "OneFileは、興味深く実行しやすいプログラムを見つけることができるオープンソースプロジェクトです。また、単一ファイルでチャレンジに挑戦できるプログラミングチャレンジでもあります。",
+ "p_text3": "OneFileプログラミングチャレンジに参加して、1つのファイルで面白いコードを書いてみましょう!",
+ "code": {
+ "copy_success": "ソースコードをコピーしました。ファイルに貼り付けて実行してください",
+ "copy_fail": "コピーに失敗しました",
+ "title": "OneFile: {{name}} ソースコード",
+ "nav": "コード",
+ "author": "作者: {{author}}",
+ "language": "言語: {{language}}",
+ "package": "依存関係",
+ "nopackage": "依存関係なし",
+ "read": "{{num}}回閲覧",
+ "play": "実行",
+ "vite": "訪問",
+ "copy": "コピー"
+ },
+ "join": {
+ "title": "OneFileプログラミングチャレンジに参加",
+ "nav": "参加"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/periodical.json b/public/locales/ja/periodical.json
new file mode 100644
index 0000000..1731fd8
--- /dev/null
+++ b/public/locales/ja/periodical.json
@@ -0,0 +1,39 @@
+{
+ "title": "HelloGitHub 月刊",
+ "description": "GitHubで魅力的で初心者向けのオープンソースプロジェクトを発見しましょう。毎月28日に最新情報を公開しています。開発ツール、オープンソースの書籍、チュートリアル、エンタープライズレベルのプロジェクトまで、オープンソースの魅力を伝えることを目指しています。",
+ "nav": "HelloGitHub 月刊",
+ "p_text": "「HelloGitHub 月刊」は、GitHubの興味深い初心者向けオープンソースプロジェクトを共有します。毎月28日に公開され、開発ツール、オープンソースの書籍、チュートリアル、エンタープライズレベルのプロジェクトを紹介し、プログラミングを楽しみ、オープンソースの魅力に触れていただけます!",
+ "read_button": "読む",
+ "submit_button": "投稿",
+ "detail_button": "詳細",
+ "order_t1": "公開日",
+ "order_t2": "巻数",
+ "order_t3": "選択:",
+ "order_t4": "含む",
+ "order_t5": "カテゴリー",
+ "order_t6": "選択:",
+ "order_t7": "プロジェクト",
+ "order_t8": "アイテム",
+ "order_t9": "推薦歓迎",
+ "vol_prev": "前へ",
+ "vol_next": "次へ",
+ "page_prev": "前へ",
+ "page_next": "次へ",
+ "category": {
+ "title": "HelloGitHub 月刊 {{name}} コレクション",
+ "nav": {
+ "active": "アクティブ",
+ "last": "デフォルト"
+ },
+ "p_text": "ここでは、HelloGitHub 月刊のバックナンバーをカテゴリー別に読むことができます。現在表示しているのは",
+ "p_text2": "コレクションです。"
+ },
+ "volume": {
+ "title": "HelloGitHub 月刊 Vol.{{num}}",
+ "nav": "巻",
+ "h2_text": "HelloGitHub Vol.{{num}}",
+ "p_text": "HelloGitHubは、GitHubの興味深い初心者向けオープンソースプロジェクトを共有し、毎月28日に更新しています。ここでは、楽しく初心者向けのオープンソースプロジェクト、オープンソースの書籍、実用的なプロジェクト、エンタープライズレベルのプロジェクトを見つけることができ、オープンソースの魅力をすぐに感じ、興味を持っていただけます。
",
+ "catalog": "目次",
+ "catalog2": "目次"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/profile.json b/public/locales/ja/profile.json
new file mode 100644
index 0000000..a71bd61
--- /dev/null
+++ b/public/locales/ja/profile.json
@@ -0,0 +1,93 @@
+{
+ "title": "プロフィール",
+ "page_prev": "前へ",
+ "page_next": "次へ",
+ "tabs": {
+ "dynamic": "アクティビティ",
+ "favorite": "お気に入り",
+ "comment": "コメント",
+ "vote": "投票",
+ "repo": "プロジェクト"
+ },
+ "user_info": {
+ "desc": "HelloGitHubコミュニティの{{rank}}番目のユーザー、{{date}}に参加",
+ "desc2": "{{share_repo}}件のプロジェクトを共有し、{{comment_repo}}件のプロジェクトレビューを投稿し、{{contribute}}貢献ポイントを獲得しました。",
+ "desc3": "HelloGitHubコミュニティの{{rank}}番目のユーザー",
+ "desc4": "{{date}}に参加、{{contribute}}貢献ポイントを獲得",
+ "desc5": "{{share_repo}}件のプロジェクトを共有し、{{comment_repo}}件のプロジェクトレビューを投稿"
+ },
+ "dynamic": {
+ "time_desc": "アクティビティ",
+ "desc": "アクティビティなし",
+ "value_text": "、{{value}}貢献ポイントを獲得。",
+ "comment": "プロジェクトにコメント",
+ "comment_hot": "人気コメント:",
+ "comment_hot2": "プロジェクト",
+ "comment_bad": "無意味/スパムコメントの投稿により、2貢献ポイントが減点されました。",
+ "reply_bad": "無意味/スパム返信の投稿により、2貢献ポイントが減点されました。",
+ "contribute_code": "コミュニティにコードを貢献し、{{value}}貢献ポイントを獲得。",
+ "feedback_bug": "コミュニティに価値のある問題を報告し、{{value}}貢献ポイントを獲得。",
+ "submit_repo": "優れたオープンソースプロジェクトを共有",
+ "default": "コミュニティのコンテンツを充実",
+ "empty": "アクティビティなし"
+ },
+ "favorite": {
+ "text": "お気に入り",
+ "share_text": "詳細を表示するにはクリック:",
+ "no_share": "このお気に入りフォルダは非公開です",
+ "del_success": "お気に入りフォルダを削除しました",
+ "del_fail": "お気に入りフォルダの削除に失敗しました",
+ "share_success": "お気に入りフォルダのリンクをコピーしました。友達とシェアしましょう!",
+ "no_description": "フォルダの説明なし",
+ "empty": "お気に入りなし",
+ "repo_total": "合計{{total}}件のプロジェクト",
+ "button": {
+ "edit": "編集",
+ "delete": "削除",
+ "cancel": "キャンセル",
+ "confirm": "確認",
+ "share": "共有"
+ },
+ "dialog": {
+ "del_title": "お気に入りフォルダを削除しますか?",
+ "del_desc": "フォルダを削除すると、中のプロジェクトもすべて削除されます",
+ "edit_title": "お気に入りフォルダを編集"
+ },
+ "status": {
+ "pravite": "非公開",
+ "public": "公開",
+ "review": "レビュー中"
+ }
+ },
+ "comment": {
+ "article": "記事",
+ "repository": "プロジェクト",
+ "empty": "コメントなし",
+ "text": "{{date}}にコメントを投稿",
+ "show": "表示",
+ "unshow": "非表示",
+ "hot": "人気",
+ "unhot": "非人気",
+ "used": "使用済み",
+ "unused": "未使用",
+ "score": "スコア:",
+ "button": {
+ "appeal": "申し立て",
+ "vote": "いいね {{total}}"
+ },
+ "item": {
+ "expand": "展開",
+ "collapse": "折りたたむ"
+ }
+ },
+ "vote": {
+ "empty": "投票なし"
+ },
+ "repo": {
+ "empty": "プロジェクトなし",
+ "featured": "注目",
+ "failed": "失敗",
+ "review": "レビュー中",
+ "feedback": "フィードバック"
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/rank.json b/public/locales/ja/rank.json
new file mode 100644
index 0000000..bb11fd1
--- /dev/null
+++ b/public/locales/ja/rank.json
@@ -0,0 +1,61 @@
+{
+ "tiobe": {
+ "title": "プログラミング言語ランキング",
+ "nav": "{{year}}年{{month}}月 プログラミング言語ランキング",
+ "p_text": "TIOBEプログラミングコミュニティインデックスは、2000年10月にオランダのアイントホーフェンに設立されたTIOBE Software BVによって作成・維持されているプログラミング言語の人気度を示す指標です。このインデックスは、言語名を含む検索クエリのサーチエンジン結果数に基づいて計算されます。Google、Baidu、Wikipedia、YouTubeの結果が含まれます。",
+ "thead": {
+ "position": "順位",
+ "name": "言語",
+ "rating": "人気度",
+ "change": "変動",
+ "md_change": "📊",
+ "star": "🏅️年間"
+ }
+ },
+ "db": {
+ "title": "データベースランキング",
+ "nav": "{{year}}年{{month}}月 データベースランキング",
+ "p_text": "DB-Enginesランキングは、380以上のデータベースを対象に、人気度によってデータベース管理システムをランク付けし、毎月更新されています。ランキング基準には、データベース名での検索エンジン結果数、Googleトレンド、Stack Overflow、ソーシャルネットワーク、データベースに言及する求人情報が含まれ、包括的な比較を提供します。",
+ "thead": {
+ "position": "順位",
+ "name": "データベース",
+ "rating": "スコア",
+ "change": "変動",
+ "md_change": "📊",
+ "model": "モデル"
+ }
+ },
+ "netcraft": {
+ "title": "Webサーバーランキング",
+ "nav": "{{year}}年{{month}}月 Webサーバーランキング",
+ "p_text": "Netcraftランキングは、1995年に設立されたインターネットサービス企業Netcraftによって毎月公開されるWebサーバーランキングです。世界のWebサーバーのマーケットシェアとランキングを理解するための主要な参考資料として、The Wall Street JournalやSlashdotなどの主要メディアでよく引用されています。",
+ "thead": {
+ "position": "順位",
+ "name": "サーバー",
+ "rating": "シェア",
+ "change": "変動",
+ "md_change": "📊",
+ "total": "合計"
+ },
+ "market_title": "マーケットシェアランキング",
+ "active_title": "アクティブサイトランキング",
+ "servers": {
+ "apache": "ほとんどのコンピュータのオペレーティングシステムで動作可能なオープンソースのWebサーバー。マルチプラットフォームのサポートとセキュリティの高さから、最も人気のあるWebサーバーソフトウェアの1つとなっています。",
+ "nginx": "ロシアで2番目に訪問数の多いサイトRambler.ruのためにIgor Sysoevによって開発された、無料のオープンソースの軽量で高性能なWebサーバー。",
+ "openresty": "Yichun Zhangによって作成された、LuaJITエンジンを使用してLuaスクリプトを実行できるNginxベースのWebプラットフォーム。"
+ }
+ },
+ "contribution": {
+ "title": "貢献度ランキング",
+ "nav": "{{year}}年{{month}}月 貢献度ランキング",
+ "p_text": "「HelloGitHub貢献度ランキング」は、HelloGitHubオープンソースコミュニティ内でユーザーが獲得した貢献ポイントに基づくランキングで、このコミュニティにおけるオープンソース愛好家の貢献度と評価を反映しています。ユーザーは以下の方法で貢献ポイントを獲得できます:オープンソースプロジェクトの共有で5ポイント、コメントの投稿で2ポイント、コメントが人気コメントに選ばれると追加で10貢献ポイントが獲得できます。",
+ "thead": {
+ "position": "順位",
+ "name": "ユーザー",
+ "rating": "レベル",
+ "change": "変動",
+ "total": "合計",
+ "md_change": "📊"
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/repository.json b/public/locales/ja/repository.json
new file mode 100644
index 0000000..a2bb42d
--- /dev/null
+++ b/public/locales/ja/repository.json
@@ -0,0 +1,99 @@
+{
+ "nav": {
+ "title": "リポジトリの詳細",
+ "desc": "共有者:",
+ "desc2": ""
+ },
+ "info": {
+ "claimed": "獲得済み",
+ "claim": "獲得",
+ "score_desc": "HelloGitHub評価",
+ "score_user_desc": "{{count}}件の評価",
+ "vite": "訪問",
+ "voted": "投票済み",
+ "vote": "投票",
+ "opensource": "無料",
+ "discuss": "議論",
+ "share": "共有",
+ "collect": "コレクション",
+ "copy_desc": "詳細はこちら:",
+ "copy_success": "プロジェクト情報をコピーしました。共有しましょう!",
+ "copy_fail": "コピーに失敗しました"
+ },
+ "url": {
+ "home": "ウェブサイト",
+ "document": "ドキュメント",
+ "download": "ダウンロード",
+ "online": "デモ",
+ "source": "ソース"
+ },
+ "favorite": {
+ "default": "デフォルトのお気に入り",
+ "cancel": "お気に入りから削除",
+ "success": "お気に入りに追加しました",
+ "fail": "お気に入りの追加に失敗しました",
+ "title": "お気に入りを選択",
+ "desc": "お気に入りのプロジェクトは'プロフィール'で確認できます",
+ "save": "保存"
+ },
+ "history": {
+ "past_day_desc": "過去{{days}}日間",
+ "total_desc": "{{total}}スターを獲得 ✨",
+ "fail_desc": "スター履歴データがありません"
+ },
+ "more": {
+ "yes": "はい",
+ "no": "いいえ",
+ "null": "なし",
+ "star": "スター",
+ "chinese": "中国語",
+ "language": "言語",
+ "activity": "アクティブ",
+ "contributors": "貢献者",
+ "org": "組織",
+ "version": "最新",
+ "license": "ライセンス",
+ "expand": "もっと見る",
+ "collapse": "折りたたむ"
+ },
+ "content": {
+ "desc_tab": "説明",
+ "code_tab": "コード",
+ "volume_label": "掲載号:",
+ "volume": "Vol.{{volume}}",
+ "tag_label": "タグ:"
+ },
+ "comment": {
+ "title": "コメント",
+ "sort_hot": "人気順",
+ "sort_new": "新着順",
+ "total": "{{total}}件のコメント",
+ "more_reply": "{{total}}件の返信をすべて表示",
+ "load_more": "もっと読み込む...",
+ "no_comment": "まだコメントがありません",
+ "used": "使用済み",
+ "unused": "未使用",
+ "score": "評価:",
+ "reply": "返信",
+ "cancel": "キャンセル",
+ "item": {
+ "featured": "注目",
+ "unfeatured": "非注目",
+ "vote": "投票",
+ "expand": "展開",
+ "collapse": "折りたたむ",
+ "login": "先にログインしてください"
+ },
+ "submit": {
+ "reply_placeholder": "{{nickname}}さんへの返信",
+ "placeholder": "このプロジェクトについての経験、意見、使用方法、特別な点などを書いてください...",
+ "save": "送信",
+ "success": "送信成功!承認後に表示されます",
+ "fail": "送信に失敗しました",
+ "err1": "コメントを入力してください",
+ "err2": "コメントは5文字以上必要です",
+ "err3": "コメントは500文字を超えることはできません",
+ "err4": "評価を入力してください"
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/locales/ja/search.json b/public/locales/ja/search.json
new file mode 100644
index 0000000..050988e
--- /dev/null
+++ b/public/locales/ja/search.json
@@ -0,0 +1,10 @@
+{
+ "title": "オープンソースプロジェクト検索結果",
+ "description": "HelloGitHubで興味深い初心者向けオープンソースプロジェクトを見つけましょう",
+ "bottom_text_nologin": "これで全部です!さらにコンテンツを見るにはログインしてください",
+ "navbar": "検索結果",
+ "placeholder": "プロジェクトを検索...",
+ "result": "件の結果",
+ "empty": "結果が見つかりませんでした",
+ "loading": "検索中..."
+}
\ No newline at end of file
diff --git a/public/locales/ja/topic.json b/public/locales/ja/topic.json
new file mode 100644
index 0000000..e84ccaa
--- /dev/null
+++ b/public/locales/ja/topic.json
@@ -0,0 +1,6 @@
+{
+ "title": "{{name}}トピックのオープンソースプロジェクト",
+ "description": "{{name}}トピックの興味深く楽しいオープンソースプロジェクト",
+ "navbar": "トピック",
+ "bottom_text": "現在表示できるのはこれだけです"
+}
\ No newline at end of file
diff --git a/src/components/buttons/LanguageSwitcher.tsx b/src/components/buttons/LanguageSwitcher.tsx
deleted file mode 100644
index d8d852a..0000000
--- a/src/components/buttons/LanguageSwitcher.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-// components/LanguageSwitcher.tsx
-import { useRouter } from 'next/router';
-import { useState } from 'react';
-// eslint-disable-next-line @typescript-eslint/no-var-requires
-const Cookies = require('js-cookie');
-
-type LanguageSwitchProps = {
- type?: string;
-};
-
-const LanguageSwitcher = (props: LanguageSwitchProps) => {
- const router = useRouter();
- const { locale, asPath } = router;
- const [selectedLocale, setSelectedLocale] = useState(locale);
-
- const changeLanguage = (language: string) => {
- Cookies.set('locale', language);
- setSelectedLocale(language);
- router.push(asPath, asPath, { locale: language });
- };
-
- if (props.type === 'text') {
- const isChinese = locale == 'zh' ? true : false;
- const buttonText = isChinese ? 'English' : '简体中文';
- return (
- changeLanguage(isChinese ? 'en' : 'zh')}>
- {buttonText}
-
- );
- }
-
- return (
-
-
-
- );
-};
-
-export default LanguageSwitcher;
diff --git a/src/components/dropdown/AvatarWithDropdown.tsx b/src/components/dropdown/AvatarWithDropdown.tsx
index 222576c..e6ce88c 100644
--- a/src/components/dropdown/AvatarWithDropdown.tsx
+++ b/src/components/dropdown/AvatarWithDropdown.tsx
@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { useLoginContext } from '@/hooks/useLoginContext';
-import LanguageSwitcher from '@/components/buttons/LanguageSwitcher';
+import LanguageSwitcher from '@/components/dropdown/LanguageSwitcher';
import ThemeSwitcher from '@/components/buttons/ThemeSwitcher';
import { RepoModal } from '@/components/dialog/RepoModal';
import { CustomLink } from '@/components/links/CustomLink';
diff --git a/src/components/dropdown/LanguageSwitcher.tsx b/src/components/dropdown/LanguageSwitcher.tsx
new file mode 100644
index 0000000..fa17f50
--- /dev/null
+++ b/src/components/dropdown/LanguageSwitcher.tsx
@@ -0,0 +1,106 @@
+// components/LanguageSwitcher.tsx
+import { useRouter } from 'next/router';
+import { useState } from 'react';
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const Cookies = require('js-cookie');
+
+type LanguageSwitchProps = {
+ type?: string;
+};
+
+type Language = {
+ code: string;
+ text: string;
+ fullText: string;
+};
+
+const LANGUAGES: Language[] = [
+ { code: 'zh', text: '中文', fullText: '简体中文' },
+ { code: 'en', text: 'EN', fullText: 'English' },
+ { code: 'ja', text: 'JP', fullText: '日本語' },
+];
+
+const LanguageSwitcher = (props: LanguageSwitchProps) => {
+ const router = useRouter();
+ const { locale, asPath } = router;
+ const [selectedLocale, setSelectedLocale] = useState(locale);
+ const [isOpen, setIsOpen] = useState(false);
+
+ const changeLanguage = (language: string) => {
+ Cookies.set('locale', language);
+ setSelectedLocale(language);
+ setIsOpen(false);
+ router.push(asPath, asPath, { locale: language });
+ };
+
+ const getCurrentLanguage = () => {
+ return LANGUAGES.find(lang => lang.code === locale) ?? LANGUAGES[0];
+ };
+
+ if (props.type === 'text') {
+ return (
+
+
+ {isOpen && (
+
+
+ {LANGUAGES.map((lang) => (
+
+ ))}
+
+
+ )}
+
+ );
+ }
+
+ return (
+
+
+ {isOpen && (
+
+
+ {LANGUAGES.map((lang) => (
+
+ ))}
+
+
+ )}
+
+ );
+};
+
+export default LanguageSwitcher;
diff --git a/src/components/layout/ErrorPage.tsx b/src/components/layout/ErrorPage.tsx
index fa1994a..03c3feb 100644
--- a/src/components/layout/ErrorPage.tsx
+++ b/src/components/layout/ErrorPage.tsx
@@ -1,6 +1,6 @@
import { IoIosArrowForward } from 'react-icons/io';
-import LanguageSwitcher from '@/components/buttons/LanguageSwitcher';
+import LanguageSwitcher from '@/components/dropdown/LanguageSwitcher';
import ThemeSwitcher from '@/components/buttons/ThemeSwitcher';
import { NoPrefetchLink } from '@/components/links/CustomLink';
diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx
index 8d6ac68..d9b2ca0 100644
--- a/src/components/layout/Header.tsx
+++ b/src/components/layout/Header.tsx
@@ -7,7 +7,7 @@ import { AiOutlineGithub } from 'react-icons/ai';
import { useLoginContext } from '@/hooks/useLoginContext';
import HeaderBtn from '@/components/buttons/HeaderBtn';
-import LanguageSwitcher from '@/components/buttons/LanguageSwitcher';
+import LanguageSwitcher from '@/components/dropdown/LanguageSwitcher';
import RankButton from '@/components/buttons/RankButton';
import ThemeSwitcher from '@/components/buttons/ThemeSwitcher';
import { RepoModal } from '@/components/dialog/RepoModal';