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 @@

+

wakatime - +

+

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