diff --git a/.github/workflows/docker-analyze.yaml b/.github/workflows/docker-analyze.yaml deleted file mode 100644 index a3533a7..0000000 --- a/.github/workflows/docker-analyze.yaml +++ /dev/null @@ -1,50 +0,0 @@ -name: Docker-Analyze - -on: - schedule: - - cron: "0 0 * * *" # Daily at midnight UTC - workflow_dispatch: - inputs: - trigger-build: - description: 'Trigger a manual build and push' - default: 'true' - -env: - DOCKER_IMAGE: donaldzou/wgdashboard - -jobs: - docker_analyze: - runs-on: ubuntu-latest - strategy: - fail-fast: false - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_PASSWORD }} - - - name: Install Docker Scout - run: | - echo "Installing Docker Scout..." - curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s -- - echo "Docker Scout installed successfully." - - name: Analyze Docker image with Docker Scout - id: analyze-image - run: | - echo "Analyzing Docker image with Docker Scout..." - docker scout cves ${{ env.DOCKER_IMAGE }}:latest > scout-results.txt - cat scout-results.txt - echo "Docker Scout analysis completed." - - name: Fail if critical CVEs are found - run: | - if grep -q "0C" scout-results.txt; then - echo "No critical vulnerabilities found! Continueing." - exit 0 - else - echo "At least one critical vulnerabilities found! Exiting." - exit 1 - fi diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-related.yaml similarity index 72% rename from .github/workflows/docker-build.yaml rename to .github/workflows/docker-related.yaml index f038314..a2ae195 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-related.yaml @@ -1,8 +1,10 @@ -name: Docker-Build +name: Docker Scan and Build on: push: branches: [ main ] + schedule: + - cron: "0 0 * * *" # Daily at midnight UTC workflow_dispatch: inputs: trigger-build: @@ -13,7 +15,7 @@ env: DOCKER_IMAGE: donaldzou/wgdashboard jobs: - docker_build: + docker_build_analyze: runs-on: ubuntu-latest strategy: fail-fast: false @@ -21,17 +23,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - with: - platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 - - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_PASSWORD }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -42,3 +44,12 @@ jobs: push: true tags: ${{ env.DOCKER_IMAGE }}:latest platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 + + - name: Docker Scout + id: docker-scout + uses: docker/scout-action@v1 + with: + command: cves + image: ${{ env.DOCKER_IMAGE }}:latest + only-severities: critical,high,medium,low,unspecified + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/qodana_code_quality.yml b/.github/workflows/qodana_code_quality.yml new file mode 100644 index 0000000..7bdf543 --- /dev/null +++ b/.github/workflows/qodana_code_quality.yml @@ -0,0 +1,28 @@ +name: Qodana +on: + workflow_dispatch: + pull_request: + push: + branches: # Specify your branches here + - main # The 'main' branch + - v4.2-dev + +jobs: + qodana: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + checks: write + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit + fetch-depth: 0 # a full history is required for pull request analysis + - name: 'Qodana Scan' + uses: JetBrains/qodana-action@v2024.3 + with: + pr-mode: false + env: + QODANA_TOKEN: ${{ secrets.QODANA_TOKEN_2090978292 }} + QODANA_ENDPOINT: 'https://qodana.cloud' diff --git a/README.md b/README.md index 3003c68..3d1c91b 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,19 @@
This project is supported by
+
+
+
+
+
Monitoring WireGuard is not convenient, in most case, you'll need to login to your server and type wg show
. That's why this project is being created, to view and manage all WireGuard configurations in a easy way.
With all these awesome features, while keeping it easy to install and use
diff --git a/qodana.yaml b/qodana.yaml new file mode 100644 index 0000000..bfca57a --- /dev/null +++ b/qodana.yaml @@ -0,0 +1,6 @@ +version: "1.0" +linter: jetbrains/qodana-python:2024.3 +profile: + name: qodana.recommended +include: + - name: CheckDependencyLicenses \ No newline at end of file diff --git a/src/static/locale/active_languages.json b/src/static/locale/active_languages.json index c2e22f3..ee8e0da 100644 --- a/src/static/locale/active_languages.json +++ b/src/static/locale/active_languages.json @@ -1,92 +1,102 @@ [ - { - "lang_id": "ar-sa", - "lang_name": "Arabic", - "lang_name_localized": "العربية" - }, - { - "lang_id": "cs", - "lang_name": "Czech", - "lang_name_localized": "Česky" - }, - { - "lang_id": "de-de", - "lang_name": "German", - "lang_name_localized": "Deutsch" - }, - { - "lang_id": "en", - "lang_name": "English", - "lang_name_localized": "English" - }, - { - "lang_id": "es-es", - "lang_name": "Spanish", - "lang_name_localized": "Español" - }, - { - "lang_id": "fr-ca", - "lang_name": "French (Quebec)", - "lang_name_localized": "Français (Québec)" - }, - { - "lang_id": "it-it", - "lang_name": "Italian", - "lang_name_localized": "Italiano" - }, - { - "lang_id": "ko", - "lang_name": "Korean", - "lang_name_localized": "한국어" - }, - { - "lang_id": "nl-nl", - "lang_name": "Dutch", - "lang_name_localized": "Nederlands" - }, - { - "lang_id": "ru", - "lang_name": "Russian", - "lang_name_localized": "Русский" - }, - { - "lang_id": "th", - "lang_name": "Thai", - "lang_name_localized": "ภาษาไทย" - }, - { - "lang_id": "tr-tr", - "lang_name": "Turkish", - "lang_name_localized": "Türkçe" - }, - { - "lang_id": "uk", - "lang_name": "Ukrainian", - "lang_name_localized": "Українська" - }, - { - "lang_id": "zh-cn", - "lang_name": "Chinese (Simplified)", - "lang_name_localized": "中文(简体)" - }, - { - "lang_id": "zh-hk", - "lang_name": "Chinese (Traditional)", - "lang_name_localized": "中文(繁體)" - }, - { - "lang_id": "sv-se", - "lang_name": "Swedish", - "lang_name_localized": "Svenska" - }, - { - "lang_id": "pl", - "lang_name": "Polish", - "lang_name_localized": "Polski" - }, - { - "lang_id": "be", - "lang_name": "Belarusian", - "lang_name_localized": "Беларуская" - } + { + "lang_id": "ar-sa", + "lang_name": "Arabic", + "lang_name_localized": "العربية" + }, + { + "lang_id": "be", + "lang_name": "Belarusian", + "lang_name_localized": "Беларуская" + }, + { + "lang_id": "zh-cn", + "lang_name": "Chinese (Simplified)", + "lang_name_localized": "中文(简体)" + }, + { + "lang_id": "zh-hk", + "lang_name": "Chinese (Traditional)", + "lang_name_localized": "中文(繁體)" + }, + { + "lang_id": "cs", + "lang_name": "Czech", + "lang_name_localized": "Česky" + }, + { + "lang_id": "nl-nl", + "lang_name": "Dutch", + "lang_name_localized": "Nederlands" + }, + { + "lang_id": "en", + "lang_name": "English", + "lang_name_localized": "English" + }, + { + "lang_id": "fa", + "lang_name": "Farsi", + "lang_name_localized": "فارسی" + }, + { + "lang_id": "fr-ca", + "lang_name": "French (Quebec)", + "lang_name_localized": "Français (Québec)" + }, + { + "lang_id": "de-de", + "lang_name": "German", + "lang_name_localized": "Deutsch" + }, + { + "lang_id": "it-it", + "lang_name": "Italian", + "lang_name_localized": "Italiano" + }, + { + "lang_id": "ja-jp", + "lang_name": "Japanese", + "lang_name_localized": "日本語" + }, + { + "lang_id": "ko", + "lang_name": "Korean", + "lang_name_localized": "한국어" + }, + { + "lang_id": "pl", + "lang_name": "Polish", + "lang_name_localized": "Polski" + }, + { + "lang_id": "ru", + "lang_name": "Russian", + "lang_name_localized": "Русский" + }, + { + "lang_id": "es-es", + "lang_name": "Spanish", + "lang_name_localized": "Español" + }, + { + "lang_id": "sv-se", + "lang_name": "Swedish", + "lang_name_localized": "Svenska" + }, + { + "lang_id": "th", + "lang_name": "Thai", + "lang_name_localized": "ภาษาไทย" + }, + { + "lang_id": "tr-tr", + "lang_name": "Turkish", + "lang_name_localized": "Türkçe" + }, + { + "lang_id": "uk", + "lang_name": "Ukrainian", + "lang_name_localized": "Українська" + } ] diff --git a/src/static/locale/fa.json b/src/static/locale/fa.json new file mode 100644 index 0000000..90a4423 --- /dev/null +++ b/src/static/locale/fa.json @@ -0,0 +1,312 @@ +{ + "Welcome to": "خوش آمدید", + "Username": "نام کاربری", + "Password": "رمز عبور", + "OTP from your authenticator": "رمز یکبارمصرف از برنامه احراز هویت شما", + "Sign In": "ورود", + "Signing In\\.\\.\\.": "ورود به سیستم...", + "Access Remote Server": "دسترسی به سرور از راه دور", + "Server": "سرور", + "Click": "کلیک", + "Pinging...": "در حال پینگ کردن...", + "to add your server": "برای افزودن سرور شما", + "Server List": "لیست سرور ها", + "Sorry, your username or password is incorrect.": "متأسفیم، نام کاربری یا رمز عبور شما نادرست است.", + "Home": "خانه", + "Settings": "تنظیمات", + "Tools": "ابزار ها", + "Sign Out": "خروج", + "Checking for update...": "در حال بررسی بهروزرسانی...", + "You're on the latest version": "شما از آخرین نسخه استفاده میکنید", + "WireGuard Configurations": "پیکربندیهای وایرگارد", + "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "شما هنوز هیچ پیکربندی وایرگاردی ندارید. لطفاً پوشه پیکربندی را بررسی کنید یا آن را در تنظیمات تغییر دهید. بهطور پیشفرض، پوشه /etc/wireguard است.", + "Configuration": "پیکربندی", + "Configurations": "تنظیمات", + "Peers Default Settings": "تنظیمات پیش فرض Peers", + "Dashboard Theme": "تم داشبورد", + "Light": "روشن", + "Dark": "تاریک", + "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "این تغییر بهصورت سراسری اعمال خواهد شد و برای کد QR و فایل پیکربندی همه Peer`s اعمال میشود.", + "WireGuard Configurations Settings": "تنظیمات پیکربندیهای وایرگارد", + "Configurations Directory": "پوشه پیکربندیها", + "Remember to remove / at the end of your path. e.g /etc/wireguard": "به یاد داشته باشید که / را در انتهای مسیر خود حذف کنید. به عنوان مثال: /etc/wireguard", + "WGDashboard Account Settings": "تنظیمات حساب WGDashboard", + "رمز عبور فعلی": "", + "رمز عبور جدید": "", + "تکرار رمز عبور جدید": "", + "بروزرسانی رمز عبور": "", + "Multi-Factor Authentication \\(MFA\\)": "احراز هویت چند عاملی (MFA)", + "Reset": "بازنشانی", + "Setup": "نصب", + "API Keys": "API Keys", + "API Key": "API Key", + "Key": "کلید", + "Enabled": "فعال شد", + "Disabled": "غیرفعال شد", + "No WGDashboard API Key": "کلید API WGDashboard وجود ندارد", + "Expire At": "انقضا در", + "Are you sure to delete this API key\\?": "آیا مطمئن هستید که این کلید API را حذف می کنید؟", + "Create API Key": "ایجاد کلید API", + "When should this API Key expire\\?": "چه زمانی باید این کلید API منقضی شود؟", + "Never Expire": "نامحدود", + "Don't think that's a good idea": "پیشنهاد نمی شود", + "Creating\\.\\.\\.": "در ساختن...", + "Create": "ایجاد", + "Status": "وضعیت", + "On": "روشن", + "Off": "خاموش", + "Turning On\\.\\.\\.": "در حال روشن شدن...", + "Turning Off\\.\\.\\.": "در حال خاموش شدن ...", + "Address": "آدرس", + "Listen Port": "پورت گوشدادن", + "Public Key": "کلید عمومی", + "Connected Peers": "Peer`s متصل", + "Total Usage": "مصرف کل", + "Total Received": "مجموع دریافت شده", + "Total Sent": "مجموع ارسال شده", + "Peers Data Usage": "داده های مصرفی Peer`s", + "Real Time Received Data Usage": "داده های مصرفی دریافت شده در زمان واقعی", + "Real Time Sent Data Usage": "داده های مصرفی ارسال شده در زمان واقعی", + "Peer": "Peer", + "Peers": "Peers", + "Peer Settings": "تنظیمات Peer", + "Download All": "دانلود همه", + "Search Peers\\.\\.\\.": "جستجو Peer", + "Display": "نمایش", + "Sort By": "مرتب سازی براساس", + "Refresh Interval": "فاصله بازخوانی", + "Name": "نام", + "Allowed IPs": "IP های مجاز", + "Restricted": "محدود شده", + "(.*) Seconds": "1$ ثانیه", + "(.*) Minutes": "$1 دقیقه", + "Configuration Settings": "تنظیمات پیکربندی", + "Peer Jobs": "جاب peer", + "Active Jobs": "جاب های فعال", + "All Active Jobs": "همه جاب های فعال", + "Logs": "گزارش ها", + "Private Key": "کلید خصوصی", + "\\(Required for QR Code and Download\\)": "(برای کد QR و دانلود لازم است)", + "\\(Required\\)": "(الزامی)", + "Endpoint Allowed IPs": "IP های مجاز نقطه پایانی", + "DNS": "DNS", + "Optional Settings": "تنظیمات اختیاری", + "Pre-Shared Key": "کلید از قبل به اشتراک گذاشته شده", + "MTU": "MTU", + "Persistent Keepalive": " نگهداری پایدار اتصال", + "Reset Data Usage": "بازنشانی مصرف داده", + "Total": "مجموع", + "Sent": "ارسال", + "Received": "دریافت", + "Revert": "برگرداندن تغییرات", + "Save Peer": "ذخیره peer", + "QR Code": "QR Code", + "Schedule Jobs": "برنامه ریزی جاب ها", + "Job": "جاب", + "Job ID": "شناسه جاب", + "Unsaved Job": "جاب ذخیره نشده", + "This peer does not have any job yet\\.": "این peer هیچ جاب فعالی ندارد", + "if": "اگر", + "is": "هست", + "then": "سپس", + "larger than": "بزرگتر از", + "Date": "تاریخ", + "Restrict Peer": "محدود کردن peer", + "Delete Peer": "حذف peer", + "Edit": "ویرایش", + "Delete": "حذف", + "Deleting...": "درحال حذف ...", + "Cancel": "لغو", + "Save": "ذخیره", + "No active job at the moment\\.": " در حال حاضر هیچ جابی فعال نیست .", + "Jobs Logs": "گزارش جاب ها", + "Updated at": "بروزرسانی شده در", + "Refresh": "تازه کردن", + "Filter": "فیلتر", + "Success": "موفق", + "Failed": "ناموفق", + "Log ID": "شناسه گزارش", + "Message": "پیام", + "Share Peer": "به اشتراک گذاشتن peer", + "Currently the peer is not sharing": "این peer را نمی توان به اشتراک گذاشت", + "Sharing\\.\\.\\.": "اشتراک گذاری...", + "Start Sharing": "شروع اشتراک گذاری", + "Stop Sharing\\.\\.\\.": "توقف اشتراک گذاری...", + "Stop Sharing": "توقف اشتراک گذاری", + "Access Restricted": "دسترسی محدود شده", + "Restrict Access": "محدود کردن دسترسی", + "Restricting\\.\\.\\.": "محدود کردن...", + "Allow Access": "اجازه دسترسی", + "Allowing Access\\.\\.\\.": "اجازه دسترسی...", + "Download \\& QR Code is not available due to no private key set for this peer": "دانلود و کد QR در دسترس نیست چون کلید خصوصی برای این peer تنظیم نشده است.", + "Add Peers": "اضافه کردن peers", + "Bulk Add": "افزودن انبوه", + "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "با افزودن گروهی Peers، نام هر peer بهصورت خودکار تولید میشود و IP مجاز (Allowed IP) به اولین IP آزاد بعدی اختصاص داده خواهد شد.", + "How many peers you want to add\\?": "چند peer می خواهید اضافه کنید؟", + "You can add up to (.*) peers": "شما میتوانید تا حداکثر $1 Peer اضافه کنید.", + "Use your own Private and Public Key": "از کلید خصوصی و عمومی خود استفاده کنید", + "Enter IP Address/CIDR": "نشانی IP یا محدوده CIDR را وارد کنید.", + "IP Address/CIDR": "IP Address/CIDR", + "or": "یا", + "Pick Available IP": "انتخاب IP موجود", + "No available IP containing": "هیچ IP قابل استفادهای شامل این مقدار یافت نشد.", + "Add": "اضافه کردن", + "Adding\\.\\.\\.": "درحال اضافه کردن...", + "Failed to check available update": "عدم موفقیت در بررسی آپدیتهای در دسترس.", + "Nice to meet you!": "!از آشنایی با شما خوشوقتم 😊", + "Please fill in the following fields to finish setup": "لطفاً فیلدهای زیر را برای تکمیل تنظیمات پر کنید.", + "Create an account": "ایجاد حساب کاربری", + "Enter an username you like": "یک نام کاربری دلخواه وارد کنید", + "Enter a password": "رمز عبور وارد کنید", + "\\(At least 8 characters and make sure is strong enough!\\)": "(حداقل ۸ کاراکتر و مطمئن شوید که رمز عبور بهاندازه کافی قوی باشد!)", + "Confirm password": "تأیید رمز عبور", + "Next": "بعدی", + "Saving\\.\\.\\.": "درحال ذخیره کردن...", + "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "۱. لطفاً کد QR زیر را اسکن کنید تا کد یکبار مصرف زماندار (TOTP) را با برنامه احراز هویت دلخواه خود تولید کنید.", + "Or you can click the link below:": "یا میتوانید روی لینک زیر کلیک کنید:", + "2\\. Enter the TOTP generated by your authenticator to verify": "۲. کد یکبار مصرف زماندار (TOTP) تولیدشده توسط برنامه احراز هویت خود را وارد کنید تا تأیید انجام شود.", + "TOTP verified!": "کد TOTP با موفقیت تأیید شد!", + "I don't need MFA": "من به احراز هویت چندمرحلهای (MFA) نیاز ندارم.", + "Complete": "تکمیل شد", + "(v[0-9.]{1,}) is now available for update!": "نسخه$1 اکنون برای بهروزرسانی در دسترس است!", + "Current Version:": "ورژن فعلی :", + "Oh no\\.\\.\\. This link is either expired or invalid\\.": "اوه نه... این لینک یا منقضی شده یا نامعتبر است.", + "Scan QR Code with the WireGuard App to add peer": "کد QR را با اپلیکیشن WireGuard اسکن کنید تا Peer اضافه شود.", + "or click the button below to download the ": "یا روی دکمه زیر کلیک کنید تا فایل را دانلود کنید", + " file": " فایل", + "FROM ": "از ", + "(.*) is on": "$1 فعال است", + "(.*) is off": "$1 غیرفعال است", + "Allowed IPs is invalid": "مقدار Allowed IPs نامعتبر است", + "Peer created successfully": "peer با موفقیت ساخته شد", + "Please fill in all required box": "لطفاً تمام فیلدهای الزامی را پر کنید.", + "Please specify amount of peers you want to add": "لطفاً تعداد Peers که میخواهید اضافه کنید را مشخص کنید.", + "No more available IP can assign": "IP آزادی برای اختصاص دادن باقی نمانده است.", + "The maximum number of peers can add is (.*)": "حداکثر تعداد peer که میتوان اضافه کرد عبارت است از: $1", + "Generating key pairs by bulk failed": "تولید گروهی کلیدهای جفتی (Key Pairs) با شکست مواجه شد.", + "Failed to add peers in bulk": "افزودن گروهی Peers با شکست مواجه شد.", + "This peer already exist": "این Peer از قبل وجود دارد.", + "This IP is not available: (.*)": " IP $1 در دسترس نیست:", + "Configuration does not exist": "پیکربندی وجود ندارد.", + "Peer does not exist": "peer وجود ندارد", + "Please provide a valid configuration name": "لطفاً یک نام پیکربندی معتبر وارد کنید.", + "Peer saved": "peer ذخیره شد", + "Allowed IPs already taken by another peer": "این IPها قبلاً به peer دیگری اختصاص داده شدهاند.", + "Endpoint Allowed IPs format is incorrect": "فرمت IPهای مجاز در Endpoint نادرست است.", + "DNS format is incorrect": "فرمت DNS نادرست است.", + "MTU format is not correct": "فرمت MTU نادرست است.", + "Persistent Keepalive format is not correct": "فرمت Persistent Keepalive نادرست است.", + "Private key does not match with the public key": "کلید خصوصی با کلید عمومی مطابقت ندارد.", + "Update peer failed when updating Pre-Shared Key": "بهروزرسانی کلید مشترک (Pre-Shared Key) برای peer با شکست مواجه شد.", + "Update peer failed when updating Allowed IPs": "بهروزرسانی IPهای مجاز برای peer با شکست مواجه شد.", + "Update peer failed when saving the configuration": "ذخیره پیکربندی پس از بهروزرسانی peer با شکست مواجه شد.", + "Peer data usage reset successfully": "میزان مصرف داده peer با موفقیت بازنشانی شد.", + "Peer download started": "دانلود peer آغاز شد.", + "Please specify one or more peers": "لطفاً یک یا چند peer را مشخص کنید.", + "Share link failed to create. Reason: (.*)": "ایجاد لینک اشتراکگذاری با شکست مواجه شد. دلیل: $1", + "Link expire date updated": "تاریخ انقضای لینک با موفقیت بهروزرسانی شد.", + "Link expire date failed to update. Reason: (.*)": "بهروزرسانی تاریخ انقضای لینک با شکست مواجه شد. دلیل: $1", + "Peer job saved": "جاب peer با موفقیت ذخیره شد.", + "Please specify job": "لطفاً یک جاب مشخص کنید.", + "Please specify peer and configuration": "لطفاً peer و پیکربندی را مشخص کنید.", + "Peer job deleted": "جاب peer حذف شد.", + "API Keys function is successfully enabled": "قابلیت کلیدهای API با موفقیت فعال شد.", + "API Keys function is successfully disabled": "قابلیت کلیدهای API با موفقیت غیرفعال شد.", + "API Keys function is failed to enable": "فعالسازی قابلیت کلیدهای API با شکست مواجه شد.", + "API Keys function is failed to disable": "غیرفعالسازی قابلیت کلیدهای API با شکست مواجه شد.", + "WGDashboard API Keys function is disabled": "قابلیت کلیدهای API در WGDashboard غیرفعال است.", + "WireGuard configuration path saved": "مسیر پیکربندی WireGuard ذخیره شد.", + "API Key deleted": "کلید API حذف شد.", + "API Key created": "کلید API ایجاد شد.", + "Sign in session ended, please sign in again": "نشست ورود به پایان رسیده است، لطفاً دوباره وارد شوید.", + "Please specify an IP Address (v4/v6)": "لطفاً یک آدرس IP نسخه ۴ یا ۶ مشخص کنید.", + "Please provide ipAddress and count": "لطفاً آدرس IP و تعداد را وارد کنید.", + "Please provide ipAddress": "لطفاً آدرس IP را وارد کنید.", + "Dashboard Language": "زبان داشبورد", + "Dashboard language update failed": "بهروزرسانی زبان داشبورد با شکست مواجه شد.", + "Peer Remote Endpoint": "نقطه پایانی راه دور peer", + "New Configuration": "پیکربندی جدید", + "Configuration Name": "نام پیکربندی", + "Configuration name is invalid. Possible reasons:": "نام پیکربندی نامعتبر است. دلایل احتمالی:", + "Configuration name already exist.": "این نام پیکربندی از قبل وجود دارد.", + "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen.": "نام پیکربندی فقط میتواند حداکثر شامل ۱۵ حرف کوچک/بزرگ، عدد، زیرخط، مساوی، علامت مثبت، نقطه و خط تیره باشد.", + "Invalid Port": "پورت نامعتبر است.", + "Save Configuration": "ذخیره پیکربندی", + "IP Address/CIDR is invalid": "آدرس IP یا CIDR نامعتبر است.", + "IP Address": "آدرس IP", + "Enter IP Address / Hostname": "آدرس IP یا نام میزبان را وارد کنید", + "IP Address / Hostname": "آدرس IP / نام میزبان", + "Dashboard IP Address & Listen Port": "آدرس IP و پورت شنود داشبورد", + "Count": "تعداد", + "Geolocation": "موقعیت جغرافیایی", + "Is Alive": "در دسترس است", + "Average / Min / Max Round Trip Time": "میانگین / کمترین / بیشترین زمان رفتوبرگشت", + "Sent / Received / Lost Package": "بستههای ارسالشده / دریافتشده / گمشده", + "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "برای اعمال تغییرات آدرس IP و پورت شنود، باید WGDashboard را دستی راهاندازی مجدد کنید.", + "Restore Configuration": "بازیابی پیکربندی", + "Step (.*)": "مرحله $1", + "Select a backup you want to restore": "یک نسخه پشتیبان برای بازیابی انتخاب کنید.", + "Click to change a backup": "برای تغییر نسخه پشتیبان کلیک کنید.", + "Selected Backup": "نسخه پشتیبان انتخاب شده", + "You don't have any configuration to restore": "هیچ پیکربندی برای بازیابی وجود ندارد.", + "Help": "راهنما", + "Backup": "پشتیبانگیری", + "([0-9].*) Backups?": "$1 نسخه پشتیبان", + "Yes": "بله", + "No": "خیر", + "Backup not selected": "نسخه پشتیبان انتخاب نشده است.", + "Confirm & edit restore information": "تأیید و ویرایش اطلاعات بازیابی", + "(.*) Available IP Address": "$1 آدرس IP در دسترس", + "Database File": "فایل پایگاه داده", + "Contain": "شامل", + "Restricted Peers?": "peerهای محدودشده؟", + "Restore": "بازیابی", + "Restoring": "در حال بازیابی", + "WGDashboard Settings": "تنظیمات WGDashboard", + "Peers Settings": "تنظیمات peerها", + "WireGuard Configuration Settings": "تنظیمات پیکربندی WireGuard", + "Appearance": "ظاهر", + "Theme": "قالب", + "Language": "زبان", + "Account Settings": "تنظیمات حساب کاربری", + "Peer Default Settings": "تنظیمات پیشفرض peer", + "Toggle When Start Up": "فعالسازی هنگام راهاندازی", + "Other Settings": "تنظیمات دیگر", + "Select Peers": "انتخاب peerها", + "Backup & Restore": "پشتیبانگیری و بازیابی", + "Delete Configuration": "حذف پیکربندی", + "Create Backup": "ایجاد نسخه پشتیبان", + "No backup yet, click the button above to create backup.": "هنوز نسخه پشتیبانی وجود ندارد، برای ایجاد نسخه پشتیبان روی دکمه بالا کلیک کنید.", + "Are you sure to delete this backup?": "آیا از حذف این نسخه پشتیبان مطمئن هستید؟", + "Are you sure to restore this backup?": "آیا از بازیابی این نسخه پشتیبان مطمئن هستید؟", + "Backup Date": "تاریخ پشتیبانگیری", + "File": "فایل", + "Are you sure to delete this configuration?": "آیا از حذف این پیکربندی مطمئن هستید؟", + "Once you deleted this configuration:": "پس از حذف این پیکربندی:", + "All connected peers will get disconnected": "تمام peerهای متصل قطع خواهند شد.", + "Both configuration file (.conf) and database table related to this configuration will get deleted": "هم فایل پیکربندی (.conf) و هم جدول پایگاه داده مرتبط با این پیکربندی حذف خواهند شد.", + "Checking backups...": "در حال بررسی نسخههای پشتیبان...", + "This configuration have ([0-9].*) backups": "این پیکربندی $1 نسخه پشتیبان دارد.", + "This configuration have no backup": "این پیکربندی هیچ نسخه پشتیبانی ندارد.", + "If you're sure, please type in the configuration name below and click Delete": "اگر مطمئن هستید، نام پیکربندی را در کادر زیر وارد کرده و روی حذف کلیک کنید.", + "Select All": "انتخاب همه", + "Clear Selection": "پاک کردن انتخاب", + "([0-9].*) Peers?": "$1 peer", + "Downloading": "در حال دانلود", + "Download Finished": "دانلود به پایان رسید", + "Done": "انجام شد", + "Are you sure to delete": "آیا از حذف مطمئن هستید؟", + "Are you sure to delete this peer?": "آیا از حذف این peer مطمئن هستید؟", + "Configuration deleted": "پیکربندی حذف شد.", + "Configuration saved": "پیکربندی ذخیره شد.", + "WGDashboard language update failed": "بهروزرسانی زبان WGDashboard با شکست مواجه شد.", + "Configuration restored": "پیکربندی بازیابی شد.", + "Allowed IP already taken by another peer": "IP مجاز قبلاً توسط peerی دیگری استفاده شده است.", + "Failed to allow access of peer (.*)": "اجازه دسترسی به peer ($1) با شکست مواجه شد.", + "Failed to save configuration through WireGuard": "ذخیره پیکربندی از طریق WireGuard با شکست مواجه شد.", + "Allow access successfully": "دسترسی با موفقیت فعال شد.", + "Deleted ([0-9]{1,}) peer(s)": "$1 peer حذف شد.", + "Deleted ([0-9]{1,}) peer(s) successfully. Failed to delete ([0-9]{1,}) peer(s)": "$1 peer با موفقیت حذف شد. حذف $2 peer با شکست مواجه شد.", + "Restricted ([0-9]{1,}) peer(s)": "$1 peer محدود شد.", + "Restricted ([0-9]{1,}) peer(s) successfully. Failed to restrict ([0-9]{1,}) peer(s)": "$1 peer با موفقیت محدود شد. محدودسازی $2 peer با شکست مواجه شد." +} \ No newline at end of file diff --git a/src/static/locale/ja-jp.json b/src/static/locale/ja-jp.json new file mode 100644 index 0000000..6b4aadc --- /dev/null +++ b/src/static/locale/ja-jp.json @@ -0,0 +1,312 @@ +{ + "Welcome to": "ようこそ", + "Username": "ユーザー名", + "Password": "パスワード", + "OTP from your authenticator": "認証アプリで生成されたワンタイムパスワード", + "Sign In": "サインイン", + "Signing In\\.\\.\\.": "サインイン...", + "Access Remote Server": "リモートサーバーにアクセス", + "Server": "サーバー", + "Click": "クリック", + "Pinging...": "応答待機中...", + "to add your server": "してサーバーを追加", + "Server List": "サーバーリスト", + "Sorry, your username or password is incorrect.": "ユーザー名またはパスワードが間違っています", + "Home": "ホーム", + "Settings": "設定", + "Tools": "ツール", + "Sign Out": "サインアウト", + "Checking for update...": "アップデートを確認中...", + "You're on the latest version": "最新版利用しています", + "WireGuard Configurations": "WireGuard 構成", + "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "WireGuardの構成が見つかりません 構成ファイルの保存場所を確認するか、設定タブから構成ファイルの保存場所を変更してください デフォルトの構成ファイルの保存場所は /etc/wireguard です", + "Configuration": "構成", + "Configurations": "構成", + "Peers Default Settings": "デフォルトピア設定", + "Dashboard Theme": "ダッシュボードテーマ", + "Light": "ライトモード", + "Dark": "ダークモード", + "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "これは全てのピアやQRコード、コンフィグファイルに変更が適用されます", + "WireGuard Configurations Settings": "WireGuard構成設定", + "Configurations Directory": "コンフィグ保存場所", + "Remember to remove / at the end of your path. e.g /etc/wireguard": "パスの最後の\"/\"は不要です。 例:/etc/wireguard", + "WGDashboard Account Settings": "WGDashboardアカウント設定", + "Current Password": "現在のパスワード", + "New Password": "新しいパスワード", + "Repeat New Password": "再度、新しいパスワードを入力してください", + "Update Password": "パスワードを更新", + "Multi-Factor Authentication \\(MFA\\)": "多要素認証", + "Reset": "リセット", + "Setup": "設定", + "API Keys": "APIキー", + "API Key": "APIキー", + "Key": "Key", + "Enabled": "有効", + "Disabled": "無効", + "No WGDashboard API Key": "APIキーがありません", + "Expire At": "有効期限", + "Are you sure to delete this API key\\?": "このAPIキーを削除してもよろしいですか?", + "Create API Key": "APIキーを作成", + "When should this API Key expire\\?": "APIキーの有効期限を設定してください", + "Never Expire": "無期限", + "Don't think that's a good idea": "あまりおすすめはしません...", + "Creating\\.\\.\\.": "作成中...", + "Create": "作成", + "Status": "ステータス", + "On": "ON", + "Off": "OFF", + "Turning On\\.\\.\\.": "ONにしています...", + "Turning Off\\.\\.\\.": "OFFにしています...", + "Address": "アドレス", + "Listen Port": "待ち受けポート", + "Public Key": "公開鍵", + "Connected Peers": "接続しているピア", + "Total Usage": "総通信量", + "Total Received": "総受信量", + "Total Sent": "総送信量", + "Peers Data Usage": "ピア別データ使用量", + "Real Time Received Data Usage": "リアルタイム受信量", + "Real Time Sent Data Usage": "リアルタイム送信量", + "Peer": "ピア", + "Peers": "ピア", + "Peer Settings": "ピア設定", + "Download All": "全てダウンロード", + "Search Peers\\.\\.\\.": "ピアを検索", + "Display": "表示設定", + "Sort By": "並び替え", + "Refresh Interval": "更新間隔", + "Name": "名前", + "Allowed IPs": "Allowed IPs", + "Restricted": "制限", + "(.*) Seconds": "$1 秒", + "(.*) Minutes": "$1 分", + "Configuration Settings": "構成設定", + "Peer Jobs": "ピアジョブ", + "Active Jobs": "有効なジョブ", + "All Active Jobs": "全ての有効なジョブ", + "Logs": "ログ", + "Private Key": "秘密鍵", + "\\(Required for QR Code and Download\\)": "(QRコードかダウンロードが必要です)", + "\\(Required\\)": "(必須)", + "Endpoint Allowed IPs": "Endpoint Allowed IPs", + "DNS": "DNS", + "Optional Settings": "追加設定", + "Pre-Shared Key": "事前共有鍵", + "MTU": "MTU", + "Persistent Keepalive": "Persistent Keepalive", + "Reset Data Usage": "データ使用量をリセット", + "Total": "合計", + "Sent": "送信", + "Received": "受信", + "Revert": "反転", + "Save Peer": "ピアを保存", + "QR Code": "QRコード", + "Schedule Jobs": "スケジュールジョブ", + "Job": "ジョブ", + "Job ID": "ジョブID", + "Unsaved Job": "保存されていないジョブ", + "This peer does not have any job yet\\.": "このピアにはジョブがありません", + "if": "もし", + "is": "が", + "then": "だったら", + "larger than": "右記以降", + "Date": "日付", + "Restrict Peer": "ピアを制限", + "Delete Peer": "ピアを削除", + "Edit": "編集", + "Delete": "削除", + "Deleting...": "削除中...", + "Cancel": "キャンセル", + "Save": "保存", + "No active job at the moment\\.": "有効なジョブがありません", + "Jobs Logs": "ジョブログ", + "Updated at": "更新日", + "Refresh": "更新", + "Filter": "フィルター", + "Success": "成功", + "Failed": "失敗", + "Log ID": "ログID", + "Message": "メッセージ", + "Share Peer": "ピアを共有", + "Currently the peer is not sharing": "このピアは現在共有されていません", + "Sharing\\.\\.\\.": "共有中...", + "Start Sharing": "共有を開始", + "Stop Sharing\\.\\.\\.": "共有を停止中...", + "Stop Sharing": "共有を停止", + "Access Restricted": "アクセスを制限しました", + "Restrict Access": "アクセスを制限", + "Restricting\\.\\.\\.": "制限中...", + "Allow Access": "アクセス許可", + "Allowing Access\\.\\.\\.": "アクセスを許可しています...", + "Download \\& QR Code is not available due to no private key set for this peer": "このピアは秘密鍵が設定されていないため、ダウンロード・QRコードの利用が出来ません", + "Add Peers": "ピアを追加", + "Bulk Add": "複数追加", + "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "一括でピアを追加すると、各ピアの名前は自動生成され、Allowed IPは利用可能なIPが割り当てられます", + "How many peers you want to add\\?": "いくつピアを追加しますか?", + "You can add up to (.*) peers": "最大で $1 個追加できます", + "Use your own Private and Public Key": "既存の秘密鍵・公開鍵を利用する", + "Enter IP Address/CIDR": "IPアドレス/CIDRを入力してください", + "IP Address/CIDR": "IPアドレス/CIDR", + "or": "または", + "Pick Available IP": "利用可能なIPアドレスを選択する", + "No available IP containing": "利用可能なIPアドレスがありません", + "Add": "追加", + "Adding\\.\\.\\.": "追加中...", + "Failed to check available update": "アップデートの確認に失敗しました", + "Nice to meet you!": "はじめまして!", + "Please fill in the following fields to finish setup": "以下のフィールドを入力して、セットアップを完了してください", + "Create an account": "アカウントの作成", + "Enter an username you like": "ユーザー名を入力してください", + "Enter a password": "パスワードを入力してください", + "\\(At least 8 characters and make sure is strong enough!\\)": "(最低8文字以上の強力なものになってることを確認してください!)", + "Confirm password": "再度パスワードを入力してください", + "Next": "次へ", + "Saving\\.\\.\\.": "保存中...", + "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1.QRコードを認証アプリでスキャンして、ワンタイムパスワードを生成してください", + "Or you can click the link below:": "または、以下のリンクをクリックしてください", + "2\\. Enter the TOTP generated by your authenticator to verify": "2.認証アプリで生成されたワンタイムパスワードを入力してください", + "TOTP verified!": "ワンタイムパスワードが認証出来ました!", + "I don't need MFA": "多要素認証は不要です", + "Complete": "完了", + "(v[0-9.]{1,}) is now available for update!": "$1 が利用可能です!", + "Current Version:": "現在のバージョン:", + "Oh no\\.\\.\\. This link is either expired or invalid\\.": "おっと...このリンクは有効期限が切れているか無効です", + "Scan QR Code with the WireGuard App to add peer": "WireGuardアプリでQRコードをスキャンしてピアを追加", + "or click the button below to download the ": "または、ボタンをクリックしてファイルをダウンロード", + " file": " ファイル", + "FROM ": "FROM", + "(.*) is on": "$1 がONになりました", + "(.*) is off": "$1 がOFFになりました", + "Allowed IPs is invalid": "無効なAllowed IPsです", + "Peer created successfully": "ピアの作成に成功しました", + "Please fill in all required box": "必須項目を全て入力してください", + "Please specify amount of peers you want to add": "追加したいピアの数を入力してください", + "No more available IP can assign": "割り当て可能なIPがありません", + "The maximum number of peers can add is (.*)": "最大で $1 個のピアを追加出来ます", + "Generating key pairs by bulk failed": "キーペアの一括生成に失敗しました", + "Failed to add peers in bulk": "ピアの一括作成に失敗しました", + "This peer already exist": "このピアは既に存在します", + "This IP is not available: (.*)": "このIPは利用できません: $1", + "Configuration does not exist": "構成が存在しません", + "Peer does not exist": "ピアが存在しません", + "Please provide a valid configuration name": "有効な構成名を入力してください", + "Peer saved": "ピアを保存しました", + "Allowed IPs already taken by another peer": "このAllowed IPsは他のピアで使用されています", + "Endpoint Allowed IPs format is incorrect": "Endpoint Allowed IPsの形式が正しくありません", + "DNS format is incorrect": "DNSの形式が正しくありません", + "MTU format is not correct": "MTUの形式が正しくありません", + "Persistent Keepalive format is not correct": "Persistent Keepaliveの形式が正しくありません", + "Private key does not match with the public key": "秘密鍵が公開鍵と合致しません", + "Update peer failed when updating Pre-Shared Key": "ピアの更新が事前共有鍵の更新中に失敗しました", + "Update peer failed when updating Allowed IPs": "ピアの更新がAllowed IPsの更新中に失敗しました", + "Update peer failed when saving the configuration": "ピアの更新が構成の保存中に失敗しました", + "Peer data usage reset successfully": "ピアのデータ使用量をリセットしました", + "Peer download started": "ピアのダウンロードを開始しました", + "Please specify one or more peers": "1つまたは複数のピアを指定してください", + "Share link failed to create. Reason: (.*)": "共有リンクの作成に失敗しました 理由: $1", + "Link expire date updated": "リンクの有効期限を更新しました", + "Link expire date failed to update. Reason: (.*)": "リンクの有効期限の更新に失敗しました 理由: $1", + "Peer job saved": "ピアジョブを保存しました", + "Please specify job": "ジョブを指定してください", + "Please specify peer and configuration": "ピアまたは構成を指定してください", + "Peer job deleted": "ピアジョブを削除しました", + "API Keys function is successfully enabled": "APIキー機能を有効にしました", + "API Keys function is successfully disabled": "APIキー機能を無効にしました", + "API Keys function is failed to enable": "APIキー機能の有効化に失敗しました", + "API Keys function is failed to disable": "APIキー機能の無効化に失敗しました", + "WGDashboard API Keys function is disabled": "WGDashboard APIキー機能は無効になっています", + "WireGuard configuration path saved": "WireGuard構成の場所を保存しました", + "API Key deleted": "APIキーを削除しました", + "API Key created": "APIキーを作成しました", + "Sign in session ended, please sign in again": "セッションが終了しました 再度サインインしてください", + "Please specify an IP Address (v4/v6)": "IPアドレスを指定してください (v4/v6)", + "Please provide ipAddress and count": "IPアドレスと回数を入力してください", + "Please provide ipAddress": "IPアドレスを入力してください", + "Dashboard Language": "ダッシュボードの言語", + "Dashboard language update failed": "ダッシュボードの言語の更新に失敗しました", + "Peer Remote Endpoint": "Endpoint", + "New Configuration": "新規構成", + "Configuration Name": "構成名", + "Configuration name is invalid. Possible reasons:": "構成名が無効です 考えられる原因:", + "Configuration name already exist\\.": "構成名が既に存在します", + "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "構成名には、小文字/大文字のアルファベット15文字、数字、アンダースコア、イコール、プラス、ピリオド、ハイフンのみを使用できます", + "Invalid Port": "無効なポート", + "Save Configuration": "構成を保存", + "IP Address/CIDR is invalid": "無効なIPアドレス/CIDR", + "IP Address": "IPアドレス", + "Enter IP Address / Hostname": "IPアドレス / ホスト名 を入力してください", + "IP Address / Hostname": "IPアドレス / ホスト名", + "Dashboard IP Address \\& Listen Port": "ダッシュボードIPアドレス & 待ち受けポート", + "Count": "回数", + "Geolocation": "場所", + "Is Alive": "ステータス", + "Average / Min / Max Round Trip Time": "平均 / 最小 / 最大 往復時間", + "Sent / Received / Lost Package": "送信 / 受信 / 損失 パッケージ", + "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "IPアドレスと待ち受けポートの変更を反映するにはWGDashboardを手動で再起動する必要があります", + "Restore Configuration": "構成を復元", + "Step (.*)": "ステップ $1", + "Select a backup you want to restore": "復元したいバックアップを選択してください", + "Click to change a backup": "クリックしてバックアップを変更する", + "Selected Backup": "選択したバックアップ", + "You don't have any configuration to restore": "復元可能な構成がありません", + "Help": "ヘルプ", + "Backup": "バックアップ", + "([0-9].*) Backups?": "$1 バックアップ?", + "Yes": "はい", + "No": "いいえ", + "Backup not selected": "バックアップが選択されていません", + "Confirm \\& edit restore information": "確定 & 復元情報を編集", + "(.*) Available IP Address": "$1 有効なIPアドレス", + "Database File": "データベースファイル", + "Contain": "含まれる", + "Restricted Peers?": "ピアを制限しますか?", + "Restore": "復元", + "Restoring": "復元中", + "WGDashboard Settings": "WGDashboard設定", + "Peers Settings": "ピア設定", + "WireGuard Configuration Settings": "WireGuard構成設定", + "Appearance": "外観", + "Theme": "テーマ", + "Language": "言語", + "Account Settings": "アカウント設定", + "Peer Default Settings": "ピアデフォルト設定", + "Toggle When Start Up": "起動時に有効化", + "Other Settings": "その他の設定", + "Select Peers": "ピアを選択", + "Backup & Restore": "バックアップ & 復元", + "Delete Configuration": "構成を削除", + "Create Backup": "バックアップを作成", + "No backup yet, click the button above to create backup\\.": "バックアップがありません ボタンをクリックしてバックアップを作成", + "Are you sure to delete this backup\\?": "バックアップを削除しますか?", + "Are you sure to restore this backup?\\": "バックアップから復元しますか?", + "Backup Date": "バックアップ日時", + "File": "ファイル", + "Are you sure to delete this configuration\\?": "この構成を本当に削除しますか?", + "Once you deleted this configuration\\:": "この構成を削除すると:", + "All connected peers will get disconnected": "全てのピアとの接続を失います", + "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "この構成に関連する構成ファイル(.conf)とデータベーステーブルが削除されます", + "Checking backups...": "バックアップを確認中...", + "This configuration have ([0-9].*) backups": "この構成には $1 のバックアップがあります", + "This configuration have no backup": "この構成にはバックアップがありません", + "If you're sure, please type in the configuration name below and click Delete": "本当に削除して良いのであれば、以下に構成名を入力し、「削除」をクリックしてください", + "Select All": "全て選択", + "Clear Selection": "選択を解除", + "([0-9].*) Peers?": "$1 ピア?", + "Downloading": "ダウンロード中...", + "Download Finished": "ダウンロード完了", + "Done": "完了", + "Are you sure to delete": "本当に削除しますか", + "Are you sure to delete this peer\\?": "このピアを本当に削除してもよろしいですか?", + "Configuration deleted": "構成を削除しました", + "Configuration saved": "構成を保存しました", + "WGDashboard language update failed": "WGDashboardの言語の更新に失敗しました", + "Configuration restored": "構成を復元しました", + "Allowed IP already taken by another peer": "このAllowed IPは他のピアで使用されています", + "Failed to allow access of peer (.*)": "ピアのアクセス許可に失敗しました $1", + "Failed to save configuration through WireGuard": "WireGuardによる設定の保存に失敗しました。", + "Allow access successfully": "アクセス許可に成功しました", + "Deleted ([0-9]{1,}) peer\\(s\\)": "$1 個のピアを削除しました ", + "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 個のピアの削除に成功し、 $2 個のピアの削除に失敗しました", + "Restricted ([0-9]{1,}) peer\\(s\\)": "$1 個のピアを制限しました", + "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 個のピアの制限に成功し、 $2 個のピアの制限に失敗しました" +} \ No newline at end of file