feat: Final global expansion to 14 languages including Portuguese, Chinese, Farsi, and Turkish

This commit is contained in:
thePR0M3TH3AN committed 2026-03-13 16:27:53 -04:00
1 parent 768b615317
commit 4e0bc20f88
35 files changed
+2103 -3

No files matched your search

+41
View File
@@ -0,0 +1,41 @@
# AI Agent Instructions for VoxVera
This guide is for AI agents (like Gemini, Claude, or GPT) contributing to the VoxVera project. Follow these protocols to maintain the architectural integrity and multi-language support.
## Core Mandates
1. **Security-First**: VoxVera is a Tor-based tool. Never suggest features that leak IP addresses or use non-Tor external resources (CDNs, etc.).
2. **Local-First**: All assets (fonts, dependencies, binaries) must be self-contained within the `voxvera/` package to support the Universal Mirroring model.
3. **Tokenized UI**: Never hardcode user-facing strings. Always add them to `voxvera/locales/en.json` and use the `t('cli.token')` helper.
4. **Markdown Redaction**: Use `~~text~~` in locale JSONs for strike-through effects. Both the build system and the JS engine handle the conversion to `<span class="redacted">` automatically.
## Localization Protocol
When adding a new language or updating an existing one:
- **CLI/Flyers**: Update `voxvera/locales/{lang}.json`. Include `meta`, `cli`, `web`, and `landing` categories.
- **Landing Page**:
- Directly update the `const locales` object in `site/index.html`.
- **Crucial**: Run `voxvera build-site` to generate the latest portable bundle and refresh the pre-rendered HTML.
- **Documentation**:
- Master templates live in `docs/templates/`.
- Localized overrides live in `voxvera/locales/{lang}/docs/`.
- **Crucial**: After any change to locales or templates, you MUST run `voxvera build-docs` to synchronize the output in `docs/{en,es,de}/`.
## Universal Mirroring
VoxVera propagates through its own flyers.
- Every `voxvera build` and `voxvera build-site` generates `voxvera-portable.zip`.
- If you modify the core source code, ensure the `bundle_portable` function in `voxvera/cli.py` still correctly captures all necessary directories (especially `vendor/`, `locales/`, and `resources/`).
## Verification Checklist
Before finishing a task, ensure you have:
1. Run unit tests: `pytest tests/test_cli.py`.
2. Verified the localization: `voxvera --lang {lang} check`.
3. Rebuilt the documentation: `voxvera build-docs`.
4. Synchronized the public site: `voxvera build-site`.
5. Verified the portable bundle exists: `ls -l voxvera/host/*/download/voxvera-portable.zip` and `ls -l site/download/voxvera-portable.zip`.
---
Follow these rules to ensure VoxVera remains a robust, viral, and decentralized tool for truth.
+42
View File
@@ -0,0 +1,42 @@
# Contributing to VoxVera
Thank you for your interest in contributing to VoxVera! This project aims to be a global, censorship-resistant tool, and your help—especially with translations—is vital.
## Adding a New Language
VoxVera uses a centralized token system for the CLI and Web components, and a template-based system for Documentation. To add a new language (e.g., French/`fr`), follow this checklist:
### 1. The Token File
Create a new JSON file in `voxvera/locales/{lang_code}.json`.
- Use `en.json` as your master template.
- **`meta`**: Include the native language name and a flag emoji.
- **`cli`**: Translate all strings used in the terminal interface.
- **`web`**: Translate strings used on the generated landing pages and flyers.
- **`landing`**: Translate the specific content for the official VoxVera website.
- **Formatting**: You can use Markdown-style strike-throughs (`~~redacted text~~`) in any of these strings; they will be automatically converted to the stylized "redacted" effect on the flyers.
### 2. The Landing Page
The main landing page (`site/index.html`) must be synchronized to include your new language.
- Open `site/index.html` and add your language to the `const locales` object in the `<script>` tag.
- Run `voxvera build-site` to refresh the public assets and ensure the pre-rendered HTML matches your new locale.
### 3. Documentation
VoxVera uses the **Doc-Sync Engine** to keep manuals in sync.
- Create localized Markdown files in `voxvera/locales/{lang_code}/docs/`.
- Use the templates in `docs/templates/` as your guide.
- You can use `cli.token_name` to reference terminal commands automatically.
### 4. Build and Verify
Run the following commands to verify your changes:
- `voxvera --lang {lang_code} check` (Verify CLI translation)
- `voxvera build-docs` (Generate localized manuals)
- Open `site/index.html` in a browser and test the language switcher.
## Code Contributions
- Ensure all tests pass: `pytest tests/test_cli.py`.
- Follow the existing coding style (PEP 8 for Python).
- If adding a new feature, update the master templates in `docs/templates/` and run `voxvera build-docs`.
---
Together, we can ensure that truth remains accessible to everyone, everywhere.
+16
View File
@@ -0,0 +1,16 @@
# Docker Usage
A prebuilt image containing Tor, OnionShare and the `voxvera` CLI is published to
`ghcr.io/voxvera/voxvera`.
```bash
# pull the image
docker pull ghcr.io/voxvera/voxvera:latest
# run voxvera quickstart with flyers stored in ./flyers
mkdir -p flyers
docker run -it --rm -v "$(pwd)/flyers:/flyers" ghcr.io/voxvera/voxvera
```
The container uses `/flyers` as the working directory and runs `voxvera quickstart`
by default. All generated flyer files will appear in the mounted `flyers` folder.
+14
View File
@@ -0,0 +1,14 @@
# Flyer Templates
Pre-built flyer templates live in the `templates/` directory. Use the CLI to copy one with:
```bash
voxvera init --template <name>
```
This will create a new folder under `dist/` named `<name>-<YYYYMMDD>` containing the template files.
Available templates:
- **blank** – minimal placeholder files, also used when extracting fields from a PDF.
- **voxvera** – example flyer showcasing the VoxVera project.
+60
View File
@@ -0,0 +1,60 @@
# Troubleshooting
This page collects common issues encountered when hosting or accessing flyers.
## Tor connectivity
- Ensure Tor is allowed through your firewall. On systems using `ufw` you may need to run `sudo ufw allow tor`.
- Some networks block Tor entirely. If you cannot reach onion services, try connecting over a different network or use a Tor bridge.
## Tor port detection
`voxvera serve` auto-detects Tor by probing common ports (9050/9150 for SOCKS, 9051/9151 for control). If detection fails -- for example when Tor runs on non-standard ports -- you can override with environment variables:
```bash
TOR_SOCKS_PORT=19050 TOR_CONTROL_PORT=19051 voxvera serve
```
If no running Tor is found, the defaults (9050/9051) are used and OnionShare will attempt to connect on those ports.
## Firewall rules
- If `voxvera serve` fails to start OnionShare, verify that outbound connections on ports 9001 and 80 are permitted.
- Corporate or university firewalls can block the hidden service ports required by Tor.
## SELinux
- On SELinux-enabled distributions you may see `permission denied` errors when OnionShare writes to the `host` directory.
- Run `sudo chcon -Rt svirt_sandbox_file_t host` or disable SELinux enforcement for the folder.
## OnionShare crashes
If `voxvera serve` prints "OnionShare exited unexpectedly", check the log file
`host/<folder_name>/onionshare.log` for details. Common causes:
- Tor is not running (`sudo systemctl start tor`)
- A port conflict with another service
- Missing `onionshare-cli` (run `voxvera check`)
## Onion URL changed unexpectedly
The onion URL is tied to the Ed25519 keypair stored in
`host/<folder_name>/.onionshare-session`. If this file is deleted, a new
keypair (and URL) will be generated on the next `voxvera serve`. The
`voxvera import` command preserves this file automatically, but manual
deletion of the `host/` directory will destroy it.
## QR codes not generated
If `voxvera build` reports "No URLs configured yet", this is expected before the first `voxvera serve`. QR codes for tear-off links are generated automatically once the .onion address is known. QR codes for the content link are generated if you provided a URL during `voxvera init`.
## Electron GUI
If `npm start` fails with `spawn voxvera ENOENT`, the `voxvera` command is not in your `PATH`. Install it with `pipx install git+https://github.com/PR0M3TH3AN/VoxVera.git` or run `./install.sh` from the repository.
## Missing dependencies
Run `voxvera check` to verify your setup. The command checks for required
Python packages (`qrcode`, `Pillow`, `jsmin`, `htmlmin`, `pypdf`) and
external tools (`onionshare-cli`), then prints a summary of anything
missing. To install everything:
```bash
# Recommended: use the install script (handles Tor + OnionShare too)
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
# Or reinstall just the Python package
pipx install --force 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
```
+130
View File
@@ -0,0 +1,130 @@
# راهنمای استفاده تفصیلی
این راهنما جریان‌های کاری معمول رابط سطر فرمان (CLI) را پوشش می‌دهد. برای دستورالعمل‌های داکر به `docs/docker.md` و برای قالب‌های اعلامیه موجود به `docs/templates.md` مراجعه کنید.
## پیش‌نیازها
ووکس‌ورا (VoxVera) به گونه‌ای طراحی شده است که بسیار قابل حمل باشد و به حداقل وابستگی‌های سیستم نیاز داشته باشد.
### ۱. فایل‌های اجرایی مستقل (توصیه شده)
می‌توانید فایل‌های اجرایی (Binary) مستقل و بدون نیاز به وابستگی را برای سیستم‌عامل خود دانلود کنید:
- **لینوکس:** `voxvera-linux`
- **ویندوز:** `voxvera-windows.exe`
- **مک:** `voxvera-macos`
این فایل‌ها شامل تمام موارد لازم برای اجرای ووکس‌ورا هستند (به جز `onionshare-cli`).
### ۲. نصب‌کننده تک‌خطی
همچنین می‌توانید از طریق اسکریپت خودکار ما نصب را انجام دهید:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### ۳. نصب دستی پایتون
اگر ترجیح می‌دهید از سورس کد استفاده کنید:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # دبیان/اوبونتو
```
## گام به گام
۱. **راه‌اندازی:** دستور `voxvera init` را اجرا کرده و مراحل را دنبال کنید. در ابتدا از شما خواسته می‌شود زبان خود را انتخاب کنید.
۲. **ساخت:** دارایی‌های اعلامیه را ایجاد کنید. هر بار که عملیات ساخت انجام می‌شود، یک فایل `voxvera-portable.zip` به طور خودکار در پوشه اعلامیه ساخته می‌شود که به دیگران اجازه می‌دهد ابزار کامل را مستقیماً از اعلامیه شما دانلود کنند.
```bash
voxvera build
```
۳. **میزبانی:** اعلامیه را روی شبکه تور منتشر کنید:
```bash
voxvera serve
```
این دستور به طور خودکار تور شما را شناسایی کرده، OnionShare را راه‌اندازی می‌کند و آدرس .onion تولید شده را در پیوندهای جداشونده اعلامیه می‌نویسد.
## پشتیبانی از زبان‌ها
ووکس‌ورا کاملاً بومی‌سازی شده است. می‌توانید اولویت زبان خود را به طور دائم با استفاده از انتخاب‌گر تعاملی یا میان‌بر مستقیم تغییر دهید:
- **انتخاب‌گر تعاملی:** `voxvera lang`
- **میان‌بر مستقیم:** `voxvera --lang fa` (تنظیم اولویت روی فارسی)
### زبان‌های پشتیبانی شده:
- **انگلیسی:** `en`
- **اسپانیایی:** `es` (نام مستعار: `--idioma`)
- **آلمانی:** `de` (نام مستعار: `--sprache`)
- **فارسی:** `fa`
همچنین می‌توانید بدون تغییر اولویت دائمی، یک زبان خاص را برای یک دستور واحد اجبار کنید:
- **انگلیسی:** `voxvera --lang en check`
- **فارسی:** `voxvera --lang fa check`
اعلامیه‌های تولید شده به طور خودکار زبان مرورگر بازدیدکننده را تشخیص داده و متن رابط کاربری را بر اساس آن تغییر می‌دهند.
## مدیریت سرورها
چندین اعلامیه و هویت‌های تور آن‌ها را از یک منوی تعاملی واحد مدیریت کنید:
```bash
voxvera manage
```
ویژگی‌ها:
- **--- ایجاد سایت/اعلامیه جدید ---**: شروع توالی کامل تنظیمات.
- **--- اجرای همه سایت‌ها ---**: راه‌اندازی یا توقف همزمان تمام اعلامیه‌های شما.
- **وضعیت لحظه‌ای**: مشاهده آدرس‌های .onion فعال و نشانگرهای پیشرفت تور.
- **کنترل فردی**: صدور به صورت زیپ سایت‌های خاص به فرمت ZIP یا حذف آن‌ها.
## آینه‌سازی همگانی (توزیع ویروسی)
برای اطمینان از اینکه ووکس‌ورا حتی در صورت سانسور مخازن مرکزی در دسترس باقی می‌ماند، هر اعلامیه به عنوان یک آینه برای این ابزار عمل می‌کند.
وقتی اعلامیه‌ای را میزبانی می‌کنید، دکمه **"دانلود ابزار و کد منبع"** در صفحه فرود، یک فایل `voxvera-portable.zip` شامل موارد زیر ارائه می‌دهد:
- سورس کد کامل و تمامی زبان‌های پشتیبانی شده.
- تمامی وابستگی‌های پایتون (از پیش بسته‌بندی شده).
- فایل‌های اجرایی تور برای تمامی پلتفرم‌ها.
این کار به هر کسی که اعلامیه شما را اسکن می‌کند اجازه می‌دهد تا به توزیع‌کننده جدیدی برای ابزار ووکس‌ورا تبدیل شود.
## صدور و پشتیبان‌گیری
از هویت‌های تور منحصر به فرد خود پشتیبان بگیرید (تا آدرس .onion شما هرگز تغییر نکند) یا اعلامیه‌های خود را به سیستم دیگری منتقل کنید.
- **صدور یک سایت واحد:** `voxvera export <folder_name>`
- **صدور تمامی سایت‌ها:** `voxvera export-all`
**محل ذخیره‌سازی:** تمامی موارد صادر شده به صورت فایل ZIP در پوشه‌ای به نام `voxvera-exports` در پوشه خانگی کاربر (`~/voxvera-exports/`) در تمامی پلتفرم‌ها ذخیره می‌شوند.
## وارد کردن و بازیابی
با انتقال فایل‌های ZIP خود به پوشه `~/voxvera-exports/` و اجرای دستور زیر، کل تنظیمات خود را در یک سیستم جدید بازیابی کنید:
```bash
voxvera import-multiple
```
## قابلیت حمل و استفاده آفلاین
اگر نیاز دارید ووکس‌ورا را روی سیستمی بدون دسترسی به اینترنت اجرا کنید، می‌توانید ابتدا وابستگی‌ها را به صورت محلی ذخیره کنید:
```bash
voxvera vendorize
```
این دستور تمامی کتابخانه‌های پایتون مورد نیاز را در پوشه `voxvera/vendor/` دانلود می‌کند. ابزار سپس این فایل‌های محلی را در اولویت قرار می‌دهد و اجازه می‌دهد بدون نیاز به `pip install` اجرا شود.
## وارد کردن گروهی (JSON)
برای تولید انبوه اعلامیه‌ها از چندین فایل تنظیمات JSON، آن‌ها را در پوشه `imports/` قرار داده و اجرا کنید:
```bash
voxvera batch-import
```
## آدرس‌های URL چگونه کار می‌کنند
هر اعلامیه دارای دو آدرس URL جداگانه است:
- **پیوند جداشونده** (تولید خودکار): آدرس .onion که اعلامیه در آن میزبانی می‌شود.
- **پیوند محتوا** (تنظیم توسط کاربر): یک آدرس URL خارجی که به یک وب‌سایت، ویدیو یا فایل دانلود اشاره می‌کند.
نیازی نیست آدرس .onion را به صورت دستی وارد کنید؛ ووکس‌ورا در مرحله میزبانی (`serve`) این کار را به طور خودکار انجام می‌دهد.
+41
View File
@@ -0,0 +1,41 @@
# AI Agent Instructions for VoxVera
This guide is for AI agents (like Gemini, Claude, or GPT) contributing to the VoxVera project. Follow these protocols to maintain the architectural integrity and multi-language support.
## Core Mandates
1. **Security-First**: VoxVera is a Tor-based tool. Never suggest features that leak IP addresses or use non-Tor external resources (CDNs, etc.).
2. **Local-First**: All assets (fonts, dependencies, binaries) must be self-contained within the `voxvera/` package to support the Universal Mirroring model.
3. **Tokenized UI**: Never hardcode user-facing strings. Always add them to `voxvera/locales/en.json` and use the `t('cli.token')` helper.
4. **Markdown Redaction**: Use `~~text~~` in locale JSONs for strike-through effects. Both the build system and the JS engine handle the conversion to `<span class="redacted">` automatically.
## Localization Protocol
When adding a new language or updating an existing one:
- **CLI/Flyers**: Update `voxvera/locales/{lang}.json`. Include `meta`, `cli`, `web`, and `landing` categories.
- **Landing Page**:
- Directly update the `const locales` object in `site/index.html`.
- **Crucial**: Run `voxvera build-site` to generate the latest portable bundle and refresh the pre-rendered HTML.
- **Documentation**:
- Master templates live in `docs/templates/`.
- Localized overrides live in `voxvera/locales/{lang}/docs/`.
- **Crucial**: After any change to locales or templates, you MUST run `voxvera build-docs` to synchronize the output in `docs/{en,es,de}/`.
## Universal Mirroring
VoxVera propagates through its own flyers.
- Every `voxvera build` and `voxvera build-site` generates `voxvera-portable.zip`.
- If you modify the core source code, ensure the `bundle_portable` function in `voxvera/cli.py` still correctly captures all necessary directories (especially `vendor/`, `locales/`, and `resources/`).
## Verification Checklist
Before finishing a task, ensure you have:
1. Run unit tests: `pytest tests/test_cli.py`.
2. Verified the localization: `voxvera --lang {lang} check`.
3. Rebuilt the documentation: `voxvera build-docs`.
4. Synchronized the public site: `voxvera build-site`.
5. Verified the portable bundle exists: `ls -l voxvera/host/*/download/voxvera-portable.zip` and `ls -l site/download/voxvera-portable.zip`.
---
Follow these rules to ensure VoxVera remains a robust, viral, and decentralized tool for truth.
+42
View File
@@ -0,0 +1,42 @@
# Contributing to VoxVera
Thank you for your interest in contributing to VoxVera! This project aims to be a global, censorship-resistant tool, and your help—especially with translations—is vital.
## Adding a New Language
VoxVera uses a centralized token system for the CLI and Web components, and a template-based system for Documentation. To add a new language (e.g., French/`fr`), follow this checklist:
### 1. The Token File
Create a new JSON file in `voxvera/locales/{lang_code}.json`.
- Use `en.json` as your master template.
- **`meta`**: Include the native language name and a flag emoji.
- **`cli`**: Translate all strings used in the terminal interface.
- **`web`**: Translate strings used on the generated landing pages and flyers.
- **`landing`**: Translate the specific content for the official VoxVera website.
- **Formatting**: You can use Markdown-style strike-throughs (`~~redacted text~~`) in any of these strings; they will be automatically converted to the stylized "redacted" effect on the flyers.
### 2. The Landing Page
The main landing page (`site/index.html`) must be synchronized to include your new language.
- Open `site/index.html` and add your language to the `const locales` object in the `<script>` tag.
- Run `voxvera build-site` to refresh the public assets and ensure the pre-rendered HTML matches your new locale.
### 3. Documentation
VoxVera uses the **Doc-Sync Engine** to keep manuals in sync.
- Create localized Markdown files in `voxvera/locales/{lang_code}/docs/`.
- Use the templates in `docs/templates/` as your guide.
- You can use `cli.token_name` to reference terminal commands automatically.
### 4. Build and Verify
Run the following commands to verify your changes:
- `voxvera --lang {lang_code} check` (Verify CLI translation)
- `voxvera build-docs` (Generate localized manuals)
- Open `site/index.html` in a browser and test the language switcher.
## Code Contributions
- Ensure all tests pass: `pytest tests/test_cli.py`.
- Follow the existing coding style (PEP 8 for Python).
- If adding a new feature, update the master templates in `docs/templates/` and run `voxvera build-docs`.
---
Together, we can ensure that truth remains accessible to everyone, everywhere.
+16
View File
@@ -0,0 +1,16 @@
# Docker Usage
A prebuilt image containing Tor, OnionShare and the `voxvera` CLI is published to
`ghcr.io/voxvera/voxvera`.
```bash
# pull the image
docker pull ghcr.io/voxvera/voxvera:latest
# run voxvera quickstart with flyers stored in ./flyers
mkdir -p flyers
docker run -it --rm -v "$(pwd)/flyers:/flyers" ghcr.io/voxvera/voxvera
```
The container uses `/flyers` as the working directory and runs `voxvera quickstart`
by default. All generated flyer files will appear in the mounted `flyers` folder.
+14
View File
@@ -0,0 +1,14 @@
# Flyer Templates
Pre-built flyer templates live in the `templates/` directory. Use the CLI to copy one with:
```bash
voxvera init --template <name>
```
This will create a new folder under `dist/` named `<name>-<YYYYMMDD>` containing the template files.
Available templates:
- **blank** – minimal placeholder files, also used when extracting fields from a PDF.
- **voxvera** – example flyer showcasing the VoxVera project.
+60
View File
@@ -0,0 +1,60 @@
# Troubleshooting
This page collects common issues encountered when hosting or accessing flyers.
## Tor connectivity
- Ensure Tor is allowed through your firewall. On systems using `ufw` you may need to run `sudo ufw allow tor`.
- Some networks block Tor entirely. If you cannot reach onion services, try connecting over a different network or use a Tor bridge.
## Tor port detection
`voxvera serve` auto-detects Tor by probing common ports (9050/9150 for SOCKS, 9051/9151 for control). If detection fails -- for example when Tor runs on non-standard ports -- you can override with environment variables:
```bash
TOR_SOCKS_PORT=19050 TOR_CONTROL_PORT=19051 voxvera serve
```
If no running Tor is found, the defaults (9050/9051) are used and OnionShare will attempt to connect on those ports.
## Firewall rules
- If `voxvera serve` fails to start OnionShare, verify that outbound connections on ports 9001 and 80 are permitted.
- Corporate or university firewalls can block the hidden service ports required by Tor.
## SELinux
- On SELinux-enabled distributions you may see `permission denied` errors when OnionShare writes to the `host` directory.
- Run `sudo chcon -Rt svirt_sandbox_file_t host` or disable SELinux enforcement for the folder.
## OnionShare crashes
If `voxvera serve` prints "OnionShare exited unexpectedly", check the log file
`host/<folder_name>/onionshare.log` for details. Common causes:
- Tor is not running (`sudo systemctl start tor`)
- A port conflict with another service
- Missing `onionshare-cli` (run `voxvera check`)
## Onion URL changed unexpectedly
The onion URL is tied to the Ed25519 keypair stored in
`host/<folder_name>/.onionshare-session`. If this file is deleted, a new
keypair (and URL) will be generated on the next `voxvera serve`. The
`voxvera import` command preserves this file automatically, but manual
deletion of the `host/` directory will destroy it.
## QR codes not generated
If `voxvera build` reports "No URLs configured yet", this is expected before the first `voxvera serve`. QR codes for tear-off links are generated automatically once the .onion address is known. QR codes for the content link are generated if you provided a URL during `voxvera init`.
## Electron GUI
If `npm start` fails with `spawn voxvera ENOENT`, the `voxvera` command is not in your `PATH`. Install it with `pipx install git+https://github.com/PR0M3TH3AN/VoxVera.git` or run `./install.sh` from the repository.
## Missing dependencies
Run `voxvera check` to verify your setup. The command checks for required
Python packages (`qrcode`, `Pillow`, `jsmin`, `htmlmin`, `pypdf`) and
external tools (`onionshare-cli`), then prints a summary of anything
missing. To install everything:
```bash
# Recommended: use the install script (handles Tor + OnionShare too)
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
# Or reinstall just the Python package
pipx install --force 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
```
+130
View File
@@ -0,0 +1,130 @@
# Uso Detalhado
Este guia cobre os fluxos de trabalho comuns da CLI. Veja `docs/docker.md` para instruções do Docker e `docs/templates.md` para modelos de panfletos disponíveis.
## Pré-requisitos
O VoxVera foi projetado para ser altamente portátil e requer dependências mínimas do sistema.
### 1. Binários Independentes (Recomendado)
Você pode baixar binários independentes e sem dependências para o seu sistema operacional:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
Estes binários incluem tudo o que é necessário para executar o VoxVera (exceto o `onionshare-cli`).
### 2. Instalador de Linha Única
Alternativamente, instale através do nosso script automatizado:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. Instalação Manual via Python
Se preferir executar a partir do código-fonte:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## Passo a Passo
1. **Inicializar:** Execute `voxvera init` e siga as instruções. Você será solicitado a selecionar seu idioma primeiro.
2. **Construir:** Gere os arquivos do panfleto. Cada construção cria automaticamente um `voxvera-portable.zip` na pasta do panfleto, permitindo que outros baixem a ferramenta completa diretamente do seu panfleto.
```bash
voxvera build
```
3. **Servir:** Publique o panfleto via Tor:
```bash
voxvera serve
```
Isso detecta automaticamente sua instância do Tor, inicia o OnionShare e escreve o endereço .onion gerado nos links destacáveis do panfleto.
## Suporte a Idiomas
O VoxVera é totalmente localizado. Você pode alterar sua preferência de idioma permanentemente usando o seletor interativo ou um atalho direto:
- **Seletor Interativo:** `voxvera lang`
- **Atalho Direto:** `voxvera --lang pt` (define a preferência para português)
### Idiomas Suportados:
- **Inglês:** `en`
- **Espanhol:** `es` (alias: `--idioma`)
- **Alemão:** `de` (alias: `--sprache`)
- **Português:** `pt`
Você também pode forçar um idioma específico para um único comando sem alterar sua preferência permanente:
- **Inglês:** `voxvera --lang en check`
- **Português:** `voxvera --lang pt check`
Os panfletos gerados detectam automaticamente o idioma do navegador do visitante e alteram o texto da interface adequadamente.
## Gerenciamento de Servidores
Gerencie vários panfletos e suas identidades Tor a partir de um único menu interativo:
```bash
voxvera manage
```
Recursos:
- **--- Criar Novo Site/Panfleto ---**: Inicia a sequência completa de configuração.
- **--- Iniciar Todos os Sites ---**: Inicia ou encerra todos os panfletos da sua frota de uma só vez.
- **Status em Tempo Real**: Visualize URLs .onion ativas e indicadores de progresso de inicialização do Tor.
- **Controle Individual**: Exportar para Zip sites específicos para ZIP ou exclua-os.
## Espelhamento Universal (Distribuição Viral)
Para garantir que o VoxVera permaneça acessível mesmo se os repositórios centrais forem censurados, cada panfleto atua como um espelho para a ferramenta.
Quando você hospeda um panfleto, o botão **"Baixar Ferramenta e Código"** na página inicial fornece um `voxvera-portable.zip` contendo:
- O código-fonte completo e todos os idiomas suportados.
- Todas as dependências Python (pré-vendidas).
- Binários Tor multiplataforma.
Isso permite que qualquer pessoa que escaneie seu panfleto se torne um novo distribuidor da ferramenta VoxVera.
## Exportação e Backup
Faça backup de suas identidades Tor exclusivas (para que sua URL .onion nunca mude) ou mova seus panfletos para outra máquina.
- **Exportar um único site**: `voxvera export <nome_da_pasta>`
- **Exportar todos os sites**: `voxvera export-all`
**Local de armazenamento:** Todas as exportações são salvas como arquivos ZIP em uma pasta chamada `voxvera-exports` no diretório inicial do usuário (`~/voxvera-exports/`) em todas as plataformas.
## Importação e Recuperação
Restaure toda a sua configuração em uma nova máquina movendo seus arquivos ZIP para `~/voxvera-exports/` e executando:
```bash
voxvera import-multiple
```
## Portabilidade e Uso Offline
Se precisar executar o VoxVera em uma máquina sem acesso à internet, você pode "venderizar" as dependências primeiro:
```bash
voxvera vendorize
```
Isso baixa todas as bibliotecas Python necessárias para `voxvera/vendor/`. A ferramenta priorizará esses arquivos locais, permitindo que ela funcione sem `pip install`.
## Importação em Lote (JSON)
Para gerar panfletos em massa a partir de vários arquivos de configuração JSON, coloque-os no diretório `imports/` e execute:
```bash
voxvera batch-import
```
## Como as URLs Funcionam
Cada panfleto tem duas URLs separadas:
- **Link destacável** (gerado automaticamente): O endereço .onion onde o panfleto está hospedado.
- **Link de conteúdo** (configurado pelo usuário): Uma URL externa apontando para um site, vídeo ou download.
Você não precisa inserir manualmente o endereço .onion; o VoxVera lida com isso automaticamente durante a fase de `serve`.
+41
View File
@@ -0,0 +1,41 @@
# AI Agent Instructions for VoxVera
This guide is for AI agents (like Gemini, Claude, or GPT) contributing to the VoxVera project. Follow these protocols to maintain the architectural integrity and multi-language support.
## Core Mandates
1. **Security-First**: VoxVera is a Tor-based tool. Never suggest features that leak IP addresses or use non-Tor external resources (CDNs, etc.).
2. **Local-First**: All assets (fonts, dependencies, binaries) must be self-contained within the `voxvera/` package to support the Universal Mirroring model.
3. **Tokenized UI**: Never hardcode user-facing strings. Always add them to `voxvera/locales/en.json` and use the `t('cli.token')` helper.
4. **Markdown Redaction**: Use `~~text~~` in locale JSONs for strike-through effects. Both the build system and the JS engine handle the conversion to `<span class="redacted">` automatically.
## Localization Protocol
When adding a new language or updating an existing one:
- **CLI/Flyers**: Update `voxvera/locales/{lang}.json`. Include `meta`, `cli`, `web`, and `landing` categories.
- **Landing Page**:
- Directly update the `const locales` object in `site/index.html`.
- **Crucial**: Run `voxvera build-site` to generate the latest portable bundle and refresh the pre-rendered HTML.
- **Documentation**:
- Master templates live in `docs/templates/`.
- Localized overrides live in `voxvera/locales/{lang}/docs/`.
- **Crucial**: After any change to locales or templates, you MUST run `voxvera build-docs` to synchronize the output in `docs/{en,es,de}/`.
## Universal Mirroring
VoxVera propagates through its own flyers.
- Every `voxvera build` and `voxvera build-site` generates `voxvera-portable.zip`.
- If you modify the core source code, ensure the `bundle_portable` function in `voxvera/cli.py` still correctly captures all necessary directories (especially `vendor/`, `locales/`, and `resources/`).
## Verification Checklist
Before finishing a task, ensure you have:
1. Run unit tests: `pytest tests/test_cli.py`.
2. Verified the localization: `voxvera --lang {lang} check`.
3. Rebuilt the documentation: `voxvera build-docs`.
4. Synchronized the public site: `voxvera build-site`.
5. Verified the portable bundle exists: `ls -l voxvera/host/*/download/voxvera-portable.zip` and `ls -l site/download/voxvera-portable.zip`.
---
Follow these rules to ensure VoxVera remains a robust, viral, and decentralized tool for truth.
+42
View File
@@ -0,0 +1,42 @@
# Contributing to VoxVera
Thank you for your interest in contributing to VoxVera! This project aims to be a global, censorship-resistant tool, and your help—especially with translations—is vital.
## Adding a New Language
VoxVera uses a centralized token system for the CLI and Web components, and a template-based system for Documentation. To add a new language (e.g., French/`fr`), follow this checklist:
### 1. The Token File
Create a new JSON file in `voxvera/locales/{lang_code}.json`.
- Use `en.json` as your master template.
- **`meta`**: Include the native language name and a flag emoji.
- **`cli`**: Translate all strings used in the terminal interface.
- **`web`**: Translate strings used on the generated landing pages and flyers.
- **`landing`**: Translate the specific content for the official VoxVera website.
- **Formatting**: You can use Markdown-style strike-throughs (`~~redacted text~~`) in any of these strings; they will be automatically converted to the stylized "redacted" effect on the flyers.
### 2. The Landing Page
The main landing page (`site/index.html`) must be synchronized to include your new language.
- Open `site/index.html` and add your language to the `const locales` object in the `<script>` tag.
- Run `voxvera build-site` to refresh the public assets and ensure the pre-rendered HTML matches your new locale.
### 3. Documentation
VoxVera uses the **Doc-Sync Engine** to keep manuals in sync.
- Create localized Markdown files in `voxvera/locales/{lang_code}/docs/`.
- Use the templates in `docs/templates/` as your guide.
- You can use `cli.token_name` to reference terminal commands automatically.
### 4. Build and Verify
Run the following commands to verify your changes:
- `voxvera --lang {lang_code} check` (Verify CLI translation)
- `voxvera build-docs` (Generate localized manuals)
- Open `site/index.html` in a browser and test the language switcher.
## Code Contributions
- Ensure all tests pass: `pytest tests/test_cli.py`.
- Follow the existing coding style (PEP 8 for Python).
- If adding a new feature, update the master templates in `docs/templates/` and run `voxvera build-docs`.
---
Together, we can ensure that truth remains accessible to everyone, everywhere.
+16
View File
@@ -0,0 +1,16 @@
# Docker Usage
A prebuilt image containing Tor, OnionShare and the `voxvera` CLI is published to
`ghcr.io/voxvera/voxvera`.
```bash
# pull the image
docker pull ghcr.io/voxvera/voxvera:latest
# run voxvera quickstart with flyers stored in ./flyers
mkdir -p flyers
docker run -it --rm -v "$(pwd)/flyers:/flyers" ghcr.io/voxvera/voxvera
```
The container uses `/flyers` as the working directory and runs `voxvera quickstart`
by default. All generated flyer files will appear in the mounted `flyers` folder.
+14
View File
@@ -0,0 +1,14 @@
# Flyer Templates
Pre-built flyer templates live in the `templates/` directory. Use the CLI to copy one with:
```bash
voxvera init --template <name>
```
This will create a new folder under `dist/` named `<name>-<YYYYMMDD>` containing the template files.
Available templates:
- **blank** – minimal placeholder files, also used when extracting fields from a PDF.
- **voxvera** – example flyer showcasing the VoxVera project.
+60
View File
@@ -0,0 +1,60 @@
# Troubleshooting
This page collects common issues encountered when hosting or accessing flyers.
## Tor connectivity
- Ensure Tor is allowed through your firewall. On systems using `ufw` you may need to run `sudo ufw allow tor`.
- Some networks block Tor entirely. If you cannot reach onion services, try connecting over a different network or use a Tor bridge.
## Tor port detection
`voxvera serve` auto-detects Tor by probing common ports (9050/9150 for SOCKS, 9051/9151 for control). If detection fails -- for example when Tor runs on non-standard ports -- you can override with environment variables:
```bash
TOR_SOCKS_PORT=19050 TOR_CONTROL_PORT=19051 voxvera serve
```
If no running Tor is found, the defaults (9050/9051) are used and OnionShare will attempt to connect on those ports.
## Firewall rules
- If `voxvera serve` fails to start OnionShare, verify that outbound connections on ports 9001 and 80 are permitted.
- Corporate or university firewalls can block the hidden service ports required by Tor.
## SELinux
- On SELinux-enabled distributions you may see `permission denied` errors when OnionShare writes to the `host` directory.
- Run `sudo chcon -Rt svirt_sandbox_file_t host` or disable SELinux enforcement for the folder.
## OnionShare crashes
If `voxvera serve` prints "OnionShare exited unexpectedly", check the log file
`host/<folder_name>/onionshare.log` for details. Common causes:
- Tor is not running (`sudo systemctl start tor`)
- A port conflict with another service
- Missing `onionshare-cli` (run `voxvera check`)
## Onion URL changed unexpectedly
The onion URL is tied to the Ed25519 keypair stored in
`host/<folder_name>/.onionshare-session`. If this file is deleted, a new
keypair (and URL) will be generated on the next `voxvera serve`. The
`voxvera import` command preserves this file automatically, but manual
deletion of the `host/` directory will destroy it.
## QR codes not generated
If `voxvera build` reports "No URLs configured yet", this is expected before the first `voxvera serve`. QR codes for tear-off links are generated automatically once the .onion address is known. QR codes for the content link are generated if you provided a URL during `voxvera init`.
## Electron GUI
If `npm start` fails with `spawn voxvera ENOENT`, the `voxvera` command is not in your `PATH`. Install it with `pipx install git+https://github.com/PR0M3TH3AN/VoxVera.git` or run `./install.sh` from the repository.
## Missing dependencies
Run `voxvera check` to verify your setup. The command checks for required
Python packages (`qrcode`, `Pillow`, `jsmin`, `htmlmin`, `pypdf`) and
external tools (`onionshare-cli`), then prints a summary of anything
missing. To install everything:
```bash
# Recommended: use the install script (handles Tor + OnionShare too)
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
# Or reinstall just the Python package
pipx install --force 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
```
+130
View File
@@ -0,0 +1,130 @@
# Detaylı Kullanım
Bu kılavuz, yaygın CLI iş akışlarını kapsar. Docker talimatları için `docs/docker.md` ve mevcut ilan şablonları için `docs/templates.md` dosyalarına bakın.
## Ön Koşullar
VoxVera, yüksek taşınabilirlik için tasarlanmıştır ve minimum sistem bağımlılığı gerektirir.
### 1. Bağımsız İkililer (Önerilen)
İşletim sisteminiz için bağımsız, bağımlılık gerektirmeyen ikili dosyaları (binaries) indirebilirsiniz:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
Bu dosyalar, VoxVera'yı çalıştırmak için gereken her şeyi içerir (`onionshare-cli` hariç).
### 2. Tek Satırlık Kurulum
Alternatif olarak, otomatik betiğimiz aracılığıyla kurulum yapın:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. Manuel Python Kurulumu
Kaynaktan çalıştırmayı tercih ederseniz:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## Adım Adım
1. **Başlatma:** `voxvera init` komutunu çalıştırın ve istemleri takip edin. Önce dilinizi seçmeniz istenecektir.
2. **Oluşturma:** İlan varlıklarını oluşturun. Her oluşturma işlemi, ilan klasöründe otomatik olarak bir `voxvera-portable.zip` oluşturur; bu sayede başkaları tam aracı doğrudan ilanınızdan indirebilir.
```bash
voxvera build
```
3. **Sunma:** İlanı Tor üzerinden yayınlayın:
```bash
voxvera serve
```
bu komut mevcut Tor örneğinizi otomatik olarak algılar, OnionShare'i başlatır ve oluşturulan .onion adresini ilandaki yırtılabilir bağlantılara yazar.
## Dil Desteği
VoxVera tamamen yerelleştirilmiştir. Dil tercihinizi etkileşimli seçiciyi veya doğrudan kısayolu kullanarak kalıcı olarak değiştirebilirsiniz:
- **Etkileşimli Seçici:** `voxvera lang`
- **Doğrudan Kısayol:** `voxvera --lang tr` (tercihi Türkçe olarak ayarlar)
### Desteklenen Diller:
- **İngilizce:** `en`
- **İspanyolca:** `es` (takma ad: `--idioma`)
- **Almanca:** `de` (takma ad: `--sprache`)
- **Türkçe:** `tr`
Kalıcı tercihinizi değiştirmeden tek bir komut için belirli bir dili de zorlayabilirsiniz:
- **İngilizce:** `voxvera --lang en check`
- **Türkçe:** `voxvera --lang tr check`
Oluşturulan ilanlar, ziyaretçinin tarayıcı dilini otomatik olarak algılar ve kullanıcı arayüzü metnini buna göre değiştirir.
## Sunucu Yönetimi
Tek bir etkileşimli menüden birden fazla ilanı ve Tor kimliklerini yönetin:
```bash
voxvera manage
```
Özellikler:
- **--- Yeni Site/İlan Oluştur ---**: Tam kurulum dizisini başlatın.
- **--- Tüm Siteleri Başlat ---**: Filonuzdaki tüm ilanları tek seferde başlatın veya kapatın.
- **Gerçek Zamanlı Durum**: Aktif .onion URL'lerini ve Tor başlatma ilerleme göstergelerini görüntüleyin.
- **Bireysel Kontrol**: Belirli siteleri ZIP olarak Zip Olarak Dışa Aktar veya silin.
## Evrensel Aynalama (Viral Dağıtım)
Merkezi depolar sansürlense bile VoxVera'nın erişilebilir kalmasını sağlamak için her ilan, araç için bir ayna görevi görür.
Bir ilanı barındırdığınızda, açılış sayfasındaki **"Aracı ve Kaynak Kodunu İndir"** düğmesi şunları içeren bir `voxvera-portable.zip` sunar:
- Tam kaynak kodu ve desteklenen tüm diller.
- Tüm Python bağımlılıkları (önceden paketlenmiş).
- Platformlar arası Tor ikilileri.
Bu, ilanınızı tarayan herkesin VoxVera aracının yeni bir dağıtıcısı olmasını sağlar.
## Dışa Aktarma ve Yedekleme
Benzersiz Tor kimliklerinizi yedekleyin (.onion URL'nizin hiç değişmemesi için) veya ilanlarınızı başka bir makineye taşıyın.
- **Tek bir siteyi dışa aktar**: `voxvera export <klasör_adı>`
- **Tüm siteleri dışa aktar**: `voxvera export-all`
**Depolama konumu:** Tüm dışa aktarmalar, tüm platformlarda kullanıcının ana dizinindeki `~/voxvera-exports/` klasörüne ZIP dosyası olarak kaydedilir.
## İçe Aktarma ve Kurtarma
ZIP dosyalarınızı `~/voxvera-exports/` dizinine taşıyıp şu komutu çalıştırarak tüm kurulumunuzu yeni bir makinede geri yükleyin:
```bash
voxvera import-multiple
```
## Taşınabilirlik ve Çevrimdışı Kullanım
VoxVera'yı internet erişimi olmayan bir makinede çalıştırmanız gerekirse, önce bağımlılıkları yerelleştirebilirsiniz:
```bash
voxvera vendorize
```
Bu, gerekli tüm Python kütüphanelerini `voxvera/vendor/` dizinine indirir. Araç daha sonra bu yerel dosyalara öncelik vererek `pip install` olmadan çalışmasına olanak tanır.
## Toplu İçe Aktarma (JSON)
Birden fazla JSON yapılandırma dosyasından toplu ilan oluşturmak için bunları `imports/` dizinine yerleştirin ve çalıştırın:
```bash
voxvera batch-import
```
## URL'ler Nasıl Çalışır?
Her ilanın iki ayrı URL'si vardır:
- **Yırtılabilir bağlantı** (otomatik oluşturulur): İlanın barındırıldığı .onion adresi.
- **İçerik bağlantısı** (kullanıcı tarafından yapılandırılır): Bir web sitesine, videoya veya indirmeye işaret eden harici bir URL.
.onion adresini manuel olarak girmenize gerek yoktur; VoxVera `serve` aşamasında bunu otomatik olarak halleder.
+41
View File
@@ -0,0 +1,41 @@
# AI Agent Instructions for VoxVera
This guide is for AI agents (like Gemini, Claude, or GPT) contributing to the VoxVera project. Follow these protocols to maintain the architectural integrity and multi-language support.
## Core Mandates
1. **Security-First**: VoxVera is a Tor-based tool. Never suggest features that leak IP addresses or use non-Tor external resources (CDNs, etc.).
2. **Local-First**: All assets (fonts, dependencies, binaries) must be self-contained within the `voxvera/` package to support the Universal Mirroring model.
3. **Tokenized UI**: Never hardcode user-facing strings. Always add them to `voxvera/locales/en.json` and use the `t('cli.token')` helper.
4. **Markdown Redaction**: Use `~~text~~` in locale JSONs for strike-through effects. Both the build system and the JS engine handle the conversion to `<span class="redacted">` automatically.
## Localization Protocol
When adding a new language or updating an existing one:
- **CLI/Flyers**: Update `voxvera/locales/{lang}.json`. Include `meta`, `cli`, `web`, and `landing` categories.
- **Landing Page**:
- Directly update the `const locales` object in `site/index.html`.
- **Crucial**: Run `voxvera build-site` to generate the latest portable bundle and refresh the pre-rendered HTML.
- **Documentation**:
- Master templates live in `docs/templates/`.
- Localized overrides live in `voxvera/locales/{lang}/docs/`.
- **Crucial**: After any change to locales or templates, you MUST run `voxvera build-docs` to synchronize the output in `docs/{en,es,de}/`.
## Universal Mirroring
VoxVera propagates through its own flyers.
- Every `voxvera build` and `voxvera build-site` generates `voxvera-portable.zip`.
- If you modify the core source code, ensure the `bundle_portable` function in `voxvera/cli.py` still correctly captures all necessary directories (especially `vendor/`, `locales/`, and `resources/`).
## Verification Checklist
Before finishing a task, ensure you have:
1. Run unit tests: `pytest tests/test_cli.py`.
2. Verified the localization: `voxvera --lang {lang} check`.
3. Rebuilt the documentation: `voxvera build-docs`.
4. Synchronized the public site: `voxvera build-site`.
5. Verified the portable bundle exists: `ls -l voxvera/host/*/download/voxvera-portable.zip` and `ls -l site/download/voxvera-portable.zip`.
---
Follow these rules to ensure VoxVera remains a robust, viral, and decentralized tool for truth.
+42
View File
@@ -0,0 +1,42 @@
# Contributing to VoxVera
Thank you for your interest in contributing to VoxVera! This project aims to be a global, censorship-resistant tool, and your help—especially with translations—is vital.
## Adding a New Language
VoxVera uses a centralized token system for the CLI and Web components, and a template-based system for Documentation. To add a new language (e.g., French/`fr`), follow this checklist:
### 1. The Token File
Create a new JSON file in `voxvera/locales/{lang_code}.json`.
- Use `en.json` as your master template.
- **`meta`**: Include the native language name and a flag emoji.
- **`cli`**: Translate all strings used in the terminal interface.
- **`web`**: Translate strings used on the generated landing pages and flyers.
- **`landing`**: Translate the specific content for the official VoxVera website.
- **Formatting**: You can use Markdown-style strike-throughs (`~~redacted text~~`) in any of these strings; they will be automatically converted to the stylized "redacted" effect on the flyers.
### 2. The Landing Page
The main landing page (`site/index.html`) must be synchronized to include your new language.
- Open `site/index.html` and add your language to the `const locales` object in the `<script>` tag.
- Run `voxvera build-site` to refresh the public assets and ensure the pre-rendered HTML matches your new locale.
### 3. Documentation
VoxVera uses the **Doc-Sync Engine** to keep manuals in sync.
- Create localized Markdown files in `voxvera/locales/{lang_code}/docs/`.
- Use the templates in `docs/templates/` as your guide.
- You can use `cli.token_name` to reference terminal commands automatically.
### 4. Build and Verify
Run the following commands to verify your changes:
- `voxvera --lang {lang_code} check` (Verify CLI translation)
- `voxvera build-docs` (Generate localized manuals)
- Open `site/index.html` in a browser and test the language switcher.
## Code Contributions
- Ensure all tests pass: `pytest tests/test_cli.py`.
- Follow the existing coding style (PEP 8 for Python).
- If adding a new feature, update the master templates in `docs/templates/` and run `voxvera build-docs`.
---
Together, we can ensure that truth remains accessible to everyone, everywhere.
+16
View File
@@ -0,0 +1,16 @@
# Docker Usage
A prebuilt image containing Tor, OnionShare and the `voxvera` CLI is published to
`ghcr.io/voxvera/voxvera`.
```bash
# pull the image
docker pull ghcr.io/voxvera/voxvera:latest
# run voxvera quickstart with flyers stored in ./flyers
mkdir -p flyers
docker run -it --rm -v "$(pwd)/flyers:/flyers" ghcr.io/voxvera/voxvera
```
The container uses `/flyers` as the working directory and runs `voxvera quickstart`
by default. All generated flyer files will appear in the mounted `flyers` folder.
+14
View File
@@ -0,0 +1,14 @@
# Flyer Templates
Pre-built flyer templates live in the `templates/` directory. Use the CLI to copy one with:
```bash
voxvera init --template <name>
```
This will create a new folder under `dist/` named `<name>-<YYYYMMDD>` containing the template files.
Available templates:
- **blank** – minimal placeholder files, also used when extracting fields from a PDF.
- **voxvera** – example flyer showcasing the VoxVera project.
+60
View File
@@ -0,0 +1,60 @@
# Troubleshooting
This page collects common issues encountered when hosting or accessing flyers.
## Tor connectivity
- Ensure Tor is allowed through your firewall. On systems using `ufw` you may need to run `sudo ufw allow tor`.
- Some networks block Tor entirely. If you cannot reach onion services, try connecting over a different network or use a Tor bridge.
## Tor port detection
`voxvera serve` auto-detects Tor by probing common ports (9050/9150 for SOCKS, 9051/9151 for control). If detection fails -- for example when Tor runs on non-standard ports -- you can override with environment variables:
```bash
TOR_SOCKS_PORT=19050 TOR_CONTROL_PORT=19051 voxvera serve
```
If no running Tor is found, the defaults (9050/9051) are used and OnionShare will attempt to connect on those ports.
## Firewall rules
- If `voxvera serve` fails to start OnionShare, verify that outbound connections on ports 9001 and 80 are permitted.
- Corporate or university firewalls can block the hidden service ports required by Tor.
## SELinux
- On SELinux-enabled distributions you may see `permission denied` errors when OnionShare writes to the `host` directory.
- Run `sudo chcon -Rt svirt_sandbox_file_t host` or disable SELinux enforcement for the folder.
## OnionShare crashes
If `voxvera serve` prints "OnionShare exited unexpectedly", check the log file
`host/<folder_name>/onionshare.log` for details. Common causes:
- Tor is not running (`sudo systemctl start tor`)
- A port conflict with another service
- Missing `onionshare-cli` (run `voxvera check`)
## Onion URL changed unexpectedly
The onion URL is tied to the Ed25519 keypair stored in
`host/<folder_name>/.onionshare-session`. If this file is deleted, a new
keypair (and URL) will be generated on the next `voxvera serve`. The
`voxvera import` command preserves this file automatically, but manual
deletion of the `host/` directory will destroy it.
## QR codes not generated
If `voxvera build` reports "No URLs configured yet", this is expected before the first `voxvera serve`. QR codes for tear-off links are generated automatically once the .onion address is known. QR codes for the content link are generated if you provided a URL during `voxvera init`.
## Electron GUI
If `npm start` fails with `spawn voxvera ENOENT`, the `voxvera` command is not in your `PATH`. Install it with `pipx install git+https://github.com/PR0M3TH3AN/VoxVera.git` or run `./install.sh` from the repository.
## Missing dependencies
Run `voxvera check` to verify your setup. The command checks for required
Python packages (`qrcode`, `Pillow`, `jsmin`, `htmlmin`, `pypdf`) and
external tools (`onionshare-cli`), then prints a summary of anything
missing. To install everything:
```bash
# Recommended: use the install script (handles Tor + OnionShare too)
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
# Or reinstall just the Python package
pipx install --force 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
```
+130
View File
@@ -0,0 +1,130 @@
# 详细用法
本指南涵盖了常用的 CLI 工作流程。有关 Docker 指令请参阅 `docs/docker.md`,有关可用传单模板请参阅 `docs/templates.md`。
## 先决条件
VoxVera 旨在实现高度便携,且仅需极少的系统依赖。
### 1. 独立二进制文件(推荐)
您可以为您的操作系统下载独立的、无依赖的二进制文件:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
这些二进制文件包含了运行 VoxVera 所需的一切(`onionshare-cli` 除外)。
### 2. 一键安装
或者,通过我们的自动化脚本进行安装:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. 手动 Python 安装
如果您更喜欢从源代码运行:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## 分步指南
1. **初始化:** 运行 `voxvera init` 并按照提示操作。系统会首先要求您选择语言。
2. **构建:** 生成传单资产。每次构建都会在传单文件夹中自动创建一个 `voxvera-portable.zip`,允许其他人直接从您的传单下载完整工具。
```bash
voxvera build
```
3. **发布:** 通过 Tor 发布传单:
```bash
voxvera serve
```
这会自动检测您的 Tor 实例,启动 OnionShare,并将生成的 .onion 地址写入传单的可撕下链接中。
## 语言支持
VoxVera 已完全本地化。您可以使用交互式选择器或直接快捷方式永久更改您的语言偏好:
- **交互式选择器:** `voxvera lang`
- **直接快捷方式:** `voxvera --lang zh`(将偏好设置为简体中文)
### 支持的语言:
- **英语:** `en`
- **西班牙语:** `es`(别名:`--idioma`)
- **德语:** `de`(别名:`--sprache`)
- **简体中文:** `zh`
您也可以在不更改永久偏好的情况下,为单个命令强制指定特定语言:
- **英语:** `voxvera --lang en check`
- **简体中文:** `voxvera --lang zh check`
生成的传单会自动检测访问者的浏览器语言并相应地切换 UI 文本。
## 服务器管理
通过单一的交互式菜单管理多个传单及其 Tor 身份:
```bash
voxvera manage
```
功能:
- **--- 创建新站点/传单 ---**:开始完整的设置序列。
- **--- 启动所有站点 ---**:一次性启动或关闭您旗下的所有传单。
- **实时状态**:查看活跃的 .onion URL 和 Tor 引导进度指示器。
- **个人控制**:将特定站点 导出为 Zip 到 ZIP 或删除它们。
## 通用镜像(病毒式传播)
为了确保即使中央仓库被审查,VoxVera 仍然可用,每张传单都充当该工具的镜像。
当您托管传单时,落地页上的 **“下载工具与源码”** 按钮会提供一个 `voxvera-portable.zip`,其中包含:
- 完整的源代码和所有支持的语言。
- 所有 Python 依赖项(预先打包)。
- 跨平台的 Tor 二进制文件。
这允许任何扫描您传单的人成为 VoxVera 工具的新分发者。
## 导出与备份
备份您独特的 Tor 身份(这样您的 .onion URL 就永远不会改变)或将您的传单移动到另一台机器。
- **导出单个站点**:`voxvera export <文件夹名称>`
- **导出所有站点**:`voxvera export-all`
**存储位置:** 在所有平台上,所有导出都会以 ZIP 文件的形式保存在用户主目录下的 `voxvera-exports` 文件夹中(`~/voxvera-exports/`)。
## 导入与恢复
通过将 ZIP 文件移动到 `~/voxvera-exports/` 并运行以下命令,在新机器上恢复您的整个设置:
```bash
voxvera import-multiple
```
## 便携性与离线使用
如果您需要在没有互联网访问的机器上运行 VoxVera,您可以先“本地化”依赖项:
```bash
voxvera vendorize
```
这将把所有所需的 Python 库下载到 `voxvera/vendor/` 中。该工具随后将优先使用这些本地文件,使其能够在没有 `pip install` 的情况下运行。
## 批量导入 (JSON)
要从多个 JSON 配置文件批量生成传单,请将它们放在 `imports/` 目录中并运行:
```bash
voxvera batch-import
```
## URL 如何工作
每张传单都有两个独立的 URL:
- **撕下链接**(自动生成):托管传单的 .onion 地址。
- **内容链接**(用户配置):指向网站、视频或下载的外部 URL。
您无需手动输入 .onion 地址;VoxVera 会在 `serve` 阶段自动处理。
Binary file not shown.
+2 -2
View File
@@ -7,7 +7,7 @@
<title id="site-title">Vox Vera Printable Flyers</title>
<style>
body {
font-family: 'Courier New', Courier, 'Nimbus Mono L', 'Liberation Mono', 'Noto Sans Arabic', 'Noto Sans Hebrew', 'Noto Sans Devanagari', 'Noto Sans JP', monospace;
font-family: 'Courier New', Courier, 'Nimbus Mono L', 'Liberation Mono', 'Noto Sans Arabic', 'Noto Sans Hebrew', 'Noto Sans Devanagari', 'Noto Sans JP', 'Noto Sans SC', 'Noto Sans Arabic UI', monospace;
margin: 0;
padding: 20px 0;
display: flex;
@@ -333,7 +333,7 @@
</style>
<script>
// VoxVera Multi-Language Engine
const locales = {"ar": {"meta": {"language_name": "\u0627\u0644\u0639\u0631\u0628\u064a\u0629", "flag": "\ud83c\uddf8\ud83c\udde6", "direction": "rtl"}, "web": {"tear_off_tor_browser": "\u0627\u0633\u062a\u062e\u062f\u0645 \u0645\u062a\u0635\u0641\u062d Tor", "tear_off_desc": "\u0644\u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a \u0646\u0634\u0631 \u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629\u060c \u0627\u0646\u062a\u0642\u0644 \u0625\u0644\u0649", "tear_off_footer": "\u0627\u0646\u0642\u0631 \u0641\u0648\u0642 \u0627\u0644\u0632\u0631 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0637\u0628\u0627\u0639\u0629", "built_with": "\u0628\u0646\u064a \u0628\u0648\u0627\u0633\u0637\u0629", "print_button": "\u0627\u0637\u0628\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631", "download_button": "\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u062f\u0627\u0629 \u0648\u0627\u0644\u0643\u0648\u062f"}, "landing": {"title": "\u0633\u0631\u064a \u0644\u0644\u063a\u0627\u064a\u0629", "subtitle": "~~\u0644\u0627~~ \u0644\u0644\u0646\u0634\u0631", "headline": "\u0639\u0645\u0644\u064a\u0629 VOX VERA", "content": "\u062a\u062d\u0631\u0631 \u0645\u0646 \u0627\u0644\u0631\u0642\u0627\u0628\u0629 \u0645\u0639 VoxVera. \u0623\u062f\u0627\u0629 \u062a\u0633\u0648\u064a\u0642 \u0639\u0635\u0627\u0628\u0627\u062a \u0645\u062c\u0647\u0648\u0644\u0629 \u0648\u0646\u0634\u0631 \u0631\u0633\u0627\u0626\u0644. \u0633\u0648\u0627\u0621 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0623\u0648 \u0641\u064a \u0627\u0644\u0639\u0627\u0644\u0645 \u0627\u0644\u0645\u0627\u062f\u064a\u060c \u064a\u0645\u0643\u0646\u0647\u0627 \u062a\u0645\u0643\u064a\u0646\u0643 \u0645\u0646 \u0646\u0634\u0631 \u0623\u0641\u0643\u0627\u0631\u0643 \u0628\u062c\u0631\u0623\u0629\u060c \u0645\u062d\u0645\u064a\u0629 \u0628\u0625\u062e\u0641\u0627\u0621 \u0627\u0644\u0647\u0648\u064a\u0629 \u0627\u0644\u0643\u0627\u0645\u0644 (\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u0636\u064a\u0641 \u0639\u0628\u0631 Tor). \u0642\u0645 \u0628\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0643\u0648\u062f\u060c \u0648\u0635\u0645\u0645 \u0645\u0648\u0642\u0639 \u0645\u0646\u0634\u0648\u0631\u060c \u0648\u0627\u0633\u062a\u0636\u064a\u0641\u0647 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0642\u0645 \u0628\u062a\u0636\u062e\u064a\u0645 \u0631\u0633\u0627\u0644\u062a\u0643.\n\n\u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0648\u0629 \u0627\u0644\u0645\u064a\u0645\u064a\u0629 \u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0623\u0641\u0643\u0627\u0631\u0643 \u0641\u064a \u0645\u062f\u0631\u0633\u062a\u0643\u060c \u0623\u0648 \u0645\u0643\u0627\u0646 \u0639\u0645\u0644\u0643\u060c \u0623\u0648 \u0645\u062c\u062a\u0645\u0639\u0627\u062a\u0643 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a\u060c \u0623\u0648 \u062d\u062a\u0649 \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0639\u0627\u0644\u0645. \u062a\u0636\u0645\u0646 VoxVera \u062a\u0631\u062f\u062f \u0635\u062f\u0649 \u0631\u0633\u0627\u0644\u062a\u0643 \u0628\u0639\u064a\u062f\u0627\u064b \u0648\u0639\u0644\u0649 \u0646\u0637\u0627\u0642 \u0648\u0627\u0633\u0639\u060c \u0645\u0639 \u0623\u0642\u0633\u0627\u0645 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0646\u0632\u0639 \u062a\u062a\u0645\u064a\u0632 \u0628\u0631\u0648\u0627\u0628\u0637 \u0641\u0631\u064a\u062f\u0629 \u0648\u0623\u0643\u0648\u0627\u062f QR \u0644\u0633\u0647\u0648\u0644\u0629 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0637\u0628\u0627\u0639\u0629.\n\n\u064a\u0645\u0643\u0646 \u0627\u0644\u062d\u0641\u0627\u0638 \u0639\u0644\u0649 \u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629. \u064a\u0645\u0643\u0646 \u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062a \u0639\u0628\u0631 \u0634\u0628\u0643\u0629 Tor\u060c \u0645\u0645\u0627 \u064a\u062d\u0645\u064a \u0627\u0644\u0645\u0636\u064a\u0641 \u0648\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0645\u0646 \u0627\u0644\u0631\u0642\u0627\u0628\u0629.\n\n\u0627\u0646\u0636\u0645 \u0625\u0644\u064a\u0646\u0627 \u0641\u064a \u062b\u0648\u0631\u0629 \u062a\u0642\u062f\u0631 \u0627\u0644\u062d\u0642\u064a\u0642\u0629 \u0648\u0627\u0644\u0634\u0641\u0627\u0641\u064a\u0629. \u0645\u0639\u0627\u064b\u060c \u064a\u0645\u0643\u0646\u0646\u0627 \u0628\u0646\u0627\u0621 \u0634\u0628\u0643\u0629 \u0645\u0646 \u0627\u0644\u0645\u0648\u0627\u0637\u0646\u064a\u0646 \u0627\u0644\u0645\u0633\u062a\u0646\u064a\u0631\u064a\u0646 \u0627\u0644\u0630\u064a\u0646 \u0644\u0627 \u064a\u062e\u0634\u0648\u0646 \u0627\u0644\u062a\u062d\u062f\u062b.", "url_message": "\u0627\u062d\u0635\u0644 \u0639\u0644\u0649 VoxVera \u0648\u0627\u0628\u062f\u0623 \u0628\u0646\u0634\u0631 \u0631\u0633\u0627\u0644\u062a\u0643."}}, "de": {"meta": {"language_name": "Deutsch", "flag": "\ud83c\udde9\ud83c\uddea"}, "web": {"tear_off_tor_browser": "Tor-Browser verLine truncated
const locales = {"ar": {"meta": {"language_name": "\u0627\u0644\u0639\u0631\u0628\u064a\u0629", "flag": "\ud83c\uddf8\ud83c\udde6", "direction": "rtl"}, "web": {"tear_off_tor_browser": "\u0627\u0633\u062a\u062e\u062f\u0645 \u0645\u062a\u0635\u0641\u062d Tor", "tear_off_desc": "\u0644\u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a \u0646\u0634\u0631 \u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629\u060c \u0627\u0646\u062a\u0642\u0644 \u0625\u0644\u0649", "tear_off_footer": "\u0627\u0646\u0642\u0631 \u0641\u0648\u0642 \u0627\u0644\u0632\u0631 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0637\u0628\u0627\u0639\u0629", "built_with": "\u0628\u0646\u064a \u0628\u0648\u0627\u0633\u0637\u0629", "print_button": "\u0627\u0637\u0628\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631", "download_button": "\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u062f\u0627\u0629 \u0648\u0627\u0644\u0643\u0648\u062f"}, "landing": {"title": "\u0633\u0631\u064a \u0644\u0644\u063a\u0627\u064a\u0629", "subtitle": "~~\u0644\u0627~~ \u0644\u0644\u0646\u0634\u0631", "headline": "\u0639\u0645\u0644\u064a\u0629 VOX VERA", "content": "\u062a\u062d\u0631\u0631 \u0645\u0646 \u0627\u0644\u0631\u0642\u0627\u0628\u0629 \u0645\u0639 VoxVera. \u0623\u062f\u0627\u0629 \u062a\u0633\u0648\u064a\u0642 \u0639\u0635\u0627\u0628\u0627\u062a \u0645\u062c\u0647\u0648\u0644\u0629 \u0648\u0646\u0634\u0631 \u0631\u0633\u0627\u0626\u0644. \u0633\u0648\u0627\u0621 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0623\u0648 \u0641\u064a \u0627\u0644\u0639\u0627\u0644\u0645 \u0627\u0644\u0645\u0627\u062f\u064a\u060c \u064a\u0645\u0643\u0646\u0647\u0627 \u062a\u0645\u0643\u064a\u0646\u0643 \u0645\u0646 \u0646\u0634\u0631 \u0623\u0641\u0643\u0627\u0631\u0643 \u0628\u062c\u0631\u0623\u0629\u060c \u0645\u062d\u0645\u064a\u0629 \u0628\u0625\u062e\u0641\u0627\u0621 \u0627\u0644\u0647\u0648\u064a\u0629 \u0627\u0644\u0643\u0627\u0645\u0644 (\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u0636\u064a\u0641 \u0639\u0628\u0631 Tor). \u0642\u0645 \u0628\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0643\u0648\u062f\u060c \u0648\u0635\u0645\u0645 \u0645\u0648\u0642\u0639 \u0645\u0646\u0634\u0648\u0631\u060c \u0648\u0627\u0633\u062a\u0636\u064a\u0641\u0647 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0642\u0645 \u0628\u062a\u0636\u062e\u064a\u0645 \u0631\u0633\u0627\u0644\u062a\u0643.\n\n\u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0648\u0629 \u0627\u0644\u0645\u064a\u0645\u064a\u0629 \u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0623\u0641\u0643\u0627\u0631\u0643 \u0641\u064a \u0645\u062f\u0631\u0633\u062a\u0643\u060c \u0623\u0648 \u0645\u0643\u0627\u0646 \u0639\u0645\u0644\u0643\u060c \u0623\u0648 \u0645\u062c\u062a\u0645\u0639\u0627\u062a\u0643 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a\u060c \u0623\u0648 \u062d\u062a\u0649 \u0639\u0644\u0649 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0639\u0627\u0644\u0645. \u062a\u0636\u0645\u0646 VoxVera \u062a\u0631\u062f\u062f \u0635\u062f\u0649 \u0631\u0633\u0627\u0644\u062a\u0643 \u0628\u0639\u064a\u062f\u0627\u064b \u0648\u0639\u0644\u0649 \u0646\u0637\u0627\u0642 \u0648\u0627\u0633\u0639\u060c \u0645\u0639 \u0623\u0642\u0633\u0627\u0645 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0646\u0632\u0639 \u062a\u062a\u0645\u064a\u0632 \u0628\u0631\u0648\u0627\u0628\u0637 \u0641\u0631\u064a\u062f\u0629 \u0648\u0623\u0643\u0648\u0627\u062f QR \u0644\u0633\u0647\u0648\u0644\u0629 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0637\u0628\u0627\u0639\u0629.\n\n\u064a\u0645\u0643\u0646 \u0627\u0644\u062d\u0641\u0627\u0638 \u0639\u0644\u0649 \u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629. \u064a\u0645\u0643\u0646 \u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062a \u0639\u0628\u0631 \u0634\u0628\u0643\u0629 Tor\u060c \u0645\u0645\u0627 \u064a\u062d\u0645\u064a \u0627\u0644\u0645\u0636\u064a\u0641 \u0648\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0645\u0646 \u0627\u0644\u0631\u0642\u0627\u0628\u0629.\n\n\u0627\u0646\u0636\u0645 \u0625\u0644\u064a\u0646\u0627 \u0641\u064a \u062b\u0648\u0631\u0629 \u062a\u0642\u062f\u0631 \u0627\u0644\u062d\u0642\u064a\u0642\u0629 \u0648\u0627\u0644\u0634\u0641\u0627\u0641\u064a\u0629. \u0645\u0639\u0627\u064b\u060c \u064a\u0645\u0643\u0646\u0646\u0627 \u0628\u0646\u0627\u0621 \u0634\u0628\u0643\u0629 \u0645\u0646 \u0627\u0644\u0645\u0648\u0627\u0637\u0646\u064a\u0646 \u0627\u0644\u0645\u0633\u062a\u0646\u064a\u0631\u064a\u0646 \u0627\u0644\u0630\u064a\u0646 \u0644\u0627 \u064a\u062e\u0634\u0648\u0646 \u0627\u0644\u062a\u062d\u062f\u062b.", "url_message": "\u0627\u062d\u0635\u0644 \u0639\u0644\u0649 VoxVera \u0648\u0627\u0628\u062f\u0623 \u0628\u0646\u0634\u0631 \u0631\u0633\u0627\u0644\u062a\u0643."}}, "de": {"meta": {"language_name": "Deutsch", "flag": "\ud83c\udde9\ud83c\uddea"}, "web": {"tear_off_tor_browser": "Tor-Browser verLine truncated
function t(path, lang) {
const parts = path.split('.');
+92
View File
@@ -0,0 +1,92 @@
{
"meta": {
"language_name": "فارسی",
"flag": "🇮🇷",
"direction": "rtl"
},
"cli": {
"dep_check_header": "بررسی وابستگی‌ها",
"dep_found": "پیدا شد",
"dep_missing": "یافت نشد",
"all_deps_installed": "تمامی وابستگی‌ها نصب شده‌اند.",
"missing_deps_error": "برخی وابستگی‌ها وجود ندارند. اجرا کنید: pip install 'voxvera[all]'",
"init_name": "نام",
"init_folder": "نام پوشه",
"init_title": "عنوان",
"init_subtitle": "زیرعنوان",
"init_headline": "سرخط خبر",
"init_body": "متن پیام",
"init_links": "پیوندها",
"edit_again": "ویرایش دوباره؟",
"body_length": "طول متن",
"body_limit_exceeded": "بیش از حد مجاز",
"url_label": "URL (پیوند محتوا - منبع خارجی)",
"url_message_label": "پیام URL",
"binary_message_label": "پیام دودویی (Binary)",
"template_not_found": "قالب {name} یافت نشد",
"template_copied": "قالب به {dest} کپی شد",
"flyer_created": "فایل‌های اعلامیه در {dest} ایجاد شدند",
"dir_not_found": "پوشه {dir_path} یافت نشد",
"onionshare_error": "OnionShare برای {folder_name} به طور غیرمنتظره‌ای متوقف شد.",
"onionshare_causes": "دلایل رایج: مسدود بودن شبکه، نادرست بودن ساعت سیستم، یا در حال اجرا بودن OnionShare.",
"onionshare_logs_tip": "برای مشاهده گزارش‌های کامل به {logfile} مراجعه کنید.",
"onion_url_msg": "[{folder_name}] آدرس Onion: {onion_url}",
"onionshare_running_pid": "[{folder_name}] OnionShare در حال اجرا است (PID {pid}).",
"export_not_found": "خطا: پوشه سایت '{folder_name}' در {host_root} یافت نشد",
"export_success": "صادر شد '{folder_name}' به {output_path}",
"export_all_none": "هیچ سایتی برای صدور یافت نشد.",
"export_all_starting": "در حال صدور {count} سایت به {dir}...",
"export_all_complete": "صدور کلی کامل شد.",
"import_zip_not_found": "خطا: فایل زیپ '{path}' یافت نشد.",
"import_invalid_config": "خطا: فایل صدور نامعتبر است. 'config.json' یافت نشد.",
"import_invalid_folder": "خطا: config.json نامعتبر است. 'folder_name' یافت نشد.",
"import_overwrite_confirm": "سایت '{folder_name}' از قبل وجود دارد. جایگزین شود؟",
"import_cancelled": "وارد کردن لغو شد.",
"import_success": "با موفقیت وارد شد '{folder_name}' به {dest_dir}",
"import_dir_not_found": "خطا: پوشه '{dir}' یافت نشد.",
"import_multiple_none": "هیچ فایل زیپی در {dir} یافت نشد",
"import_multiple_found": "تعداد {count} سایت برای وارد کردن از {dir} یافت شد...",
"importing_file": "در حال وارد کردن {name}...",
"import_multiple_complete": "وارد کردن گروهی کامل شد.",
"batch_import_none": "هیچ فایل JSON در واردات یافت نشد",
"batch_import_processing": "در حال پردازش {file}",
"stop_server_not_running": "سرور {folder_name} در حال اجرا نیست.",
"stop_server_success": "متوقف شد {folder_name} (PID {pid})",
"delete_server_success": "سرور {folder_name} حذف شد",
"manage_select_server": "یک سرور را برای مدیریت انتخاب کنید (یا خروج):",
"manage_create_new": "--- ایجاد سایت/اعلامیه جدید ---",
"manage_start_all": "--- اجرای همه سایت‌ها ---",
"manage_stop_all": "--- توقف همه سایت‌ها ---",
"manage_export_all": "--- صدور همه سایت‌ها ---",
"manage_import_multiple": "--- وارد کردن چندین سایت ---",
"manage_exit": "خروج",
"manage_startup_summary": "خلاصه راه‌اندازی",
"manage_press_enter": "برای ادامه اینتر را بزنید",
"manage_action_menu": "مدیریت {name}:",
"manage_action_toggle_stop": "توقف",
"manage_action_toggle_start": "شروع",
"manage_action_export": "صدور به صورت زیپ",
"manage_action_delete": "حذف",
"manage_action_back": "بازگشت",
"manage_delete_confirm": "آیا از حذف {name} اطمینان دارید؟",
"bootstrapping_msg": "[{name}] در حال اتصال به رله‌های Tor و راه‌اندازی سرویس مخفی...",
"bootstrapping_progress": "[{name}] راه‌اندازی Tor: {progress}% ...",
"no_urls_qr_skip": "هنوز آدرسی پیکربندی نشده است. کدهای QR پس از 'voxvera serve' ایجاد می‌شوند",
"input_file_not_found": "فایل ورودی {path} وجود ندارد."
},
"web": {
"tear_off_tor_browser": "از مرورگر Tor استفاده کنید",
"tear_off_desc": "برای کمک به گسترش این پیام به این آدرس بروید",
"tear_off_footer": "برای چاپ روی دکمه زیر کلیک کنید",
"built_with": "ساخته شده با",
"print_button": "چاپ اعلامیه",
"download_button": "دانلود ابزار و کد منبع"
},
"landing": {
"title": "به‌کلی محرمانه",
"subtitle": "~~عدم~~ انتشار",
"headline": "عملیات VOX VERA",
"content": "با VoxVera از بند سانسور رها شوید. ابزاری ناشناس برای بازاریابی چریکی و گسترش پیام. چه در فضای مجازی و چه در دنیای فیزیکی، این ابزار می‌تواند شما را برای گسترش جسورانه ایده‌هایتان توانمند کند، در حالی که توسط ناشناسی کامل محافظت می‌شوید (اگر از طریق Tor میزبانی کنید). کد را دانلود کنید، یک سایت اعلامیه طراحی کنید، آن را آنلاین میزبانی کنید و صدای خود را تقویت کنید.\n\nاز قدرت میم‌ها برای به اشتراک گذاشتن ایده‌های خود در مدرسه، محل کار، انجمن‌های آنلاین یا حتی در سطح جهانی استفاده کنید. VoxVera تضمین می‌کند که پیام شما در دوردست‌ها طنین‌انداز شود، با بخش‌های جداشونده دارای URLهای منحصر به فرد و کدهای QR برای چاپ مجدد آسان.\n\nحریم خصوصی می‌تواند حفظ شود. اعلامیه‌ها را می‌توان از طریق شبکه Tor به اشتراک گذاشت و از میزبان و کاربران در برابر سانسور محافظت کرد.\n\nدر انقلابی که برای حقیقت و شفافیت ارزش قائل است به ما بپیوندید. با هم، می‌توانیم شبکه‌ای از شهروندان آگاه بسازیم که از سخن گفتن نمی‌هراسند.",
"url_message": "VoxVera را دریافت کنید و گسترش پیام خود را آغاز کنید."
}
}
+130
View File
@@ -0,0 +1,130 @@
# راهنمای استفاده تفصیلی
این راهنما جریان‌های کاری معمول رابط سطر فرمان (CLI) را پوشش می‌دهد. برای دستورالعمل‌های داکر به `docs/docker.md` و برای قالب‌های اعلامیه موجود به `docs/templates.md` مراجعه کنید.
## پیش‌نیازها
ووکس‌ورا (VoxVera) به گونه‌ای طراحی شده است که بسیار قابل حمل باشد و به حداقل وابستگی‌های سیستم نیاز داشته باشد.
### ۱. فایل‌های اجرایی مستقل (توصیه شده)
می‌توانید فایل‌های اجرایی (Binary) مستقل و بدون نیاز به وابستگی را برای سیستم‌عامل خود دانلود کنید:
- **لینوکس:** `voxvera-linux`
- **ویندوز:** `voxvera-windows.exe`
- **مک:** `voxvera-macos`
این فایل‌ها شامل تمام موارد لازم برای اجرای ووکس‌ورا هستند (به جز `onionshare-cli`).
### ۲. نصب‌کننده تک‌خطی
همچنین می‌توانید از طریق اسکریپت خودکار ما نصب را انجام دهید:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### ۳. نصب دستی پایتون
اگر ترجیح می‌دهید از سورس کد استفاده کنید:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # دبیان/اوبونتو
```
## گام به گام
۱. **راه‌اندازی:** دستور `voxvera init` را اجرا کرده و مراحل را دنبال کنید. در ابتدا از شما خواسته می‌شود زبان خود را انتخاب کنید.
۲. **ساخت:** دارایی‌های اعلامیه را ایجاد کنید. هر بار که عملیات ساخت انجام می‌شود، یک فایل `voxvera-portable.zip` به طور خودکار در پوشه اعلامیه ساخته می‌شود که به دیگران اجازه می‌دهد ابزار کامل را مستقیماً از اعلامیه شما دانلود کنند.
```bash
voxvera build
```
۳. **میزبانی:** اعلامیه را روی شبکه تور منتشر کنید:
```bash
voxvera serve
```
این دستور به طور خودکار تور شما را شناسایی کرده، OnionShare را راه‌اندازی می‌کند و آدرس .onion تولید شده را در پیوندهای جداشونده اعلامیه می‌نویسد.
## پشتیبانی از زبان‌ها
ووکس‌ورا کاملاً بومی‌سازی شده است. می‌توانید اولویت زبان خود را به طور دائم با استفاده از انتخاب‌گر تعاملی یا میان‌بر مستقیم تغییر دهید:
- **انتخاب‌گر تعاملی:** `voxvera lang`
- **میان‌بر مستقیم:** `voxvera --lang fa` (تنظیم اولویت روی فارسی)
### زبان‌های پشتیبانی شده:
- **انگلیسی:** `en`
- **اسپانیایی:** `es` (نام مستعار: `--idioma`)
- **آلمانی:** `de` (نام مستعار: `--sprache`)
- **فارسی:** `fa`
همچنین می‌توانید بدون تغییر اولویت دائمی، یک زبان خاص را برای یک دستور واحد اجبار کنید:
- **انگلیسی:** `voxvera --lang en check`
- **فارسی:** `voxvera --lang fa check`
اعلامیه‌های تولید شده به طور خودکار زبان مرورگر بازدیدکننده را تشخیص داده و متن رابط کاربری را بر اساس آن تغییر می‌دهند.
## مدیریت سرورها
چندین اعلامیه و هویت‌های تور آن‌ها را از یک منوی تعاملی واحد مدیریت کنید:
```bash
voxvera manage
```
ویژگی‌ها:
- **{{t('cli.manage_create_new')}}**: شروع توالی کامل تنظیمات.
- **{{t('cli.manage_start_all')}}**: راه‌اندازی یا توقف همزمان تمام اعلامیه‌های شما.
- **وضعیت لحظه‌ای**: مشاهده آدرس‌های .onion فعال و نشانگرهای پیشرفت تور.
- **کنترل فردی**: {{t('cli.manage_action_export')}} سایت‌های خاص به فرمت ZIP یا حذف آن‌ها.
## آینه‌سازی همگانی (توزیع ویروسی)
برای اطمینان از اینکه ووکس‌ورا حتی در صورت سانسور مخازن مرکزی در دسترس باقی می‌ماند، هر اعلامیه به عنوان یک آینه برای این ابزار عمل می‌کند.
وقتی اعلامیه‌ای را میزبانی می‌کنید، دکمه **"{{t('web.download_button')}}"** در صفحه فرود، یک فایل `voxvera-portable.zip` شامل موارد زیر ارائه می‌دهد:
- سورس کد کامل و تمامی زبان‌های پشتیبانی شده.
- تمامی وابستگی‌های پایتون (از پیش بسته‌بندی شده).
- فایل‌های اجرایی تور برای تمامی پلتفرم‌ها.
این کار به هر کسی که اعلامیه شما را اسکن می‌کند اجازه می‌دهد تا به توزیع‌کننده جدیدی برای ابزار ووکس‌ورا تبدیل شود.
## صدور و پشتیبان‌گیری
از هویت‌های تور منحصر به فرد خود پشتیبان بگیرید (تا آدرس .onion شما هرگز تغییر نکند) یا اعلامیه‌های خود را به سیستم دیگری منتقل کنید.
- **صدور یک سایت واحد:** `voxvera export <folder_name>`
- **صدور تمامی سایت‌ها:** `voxvera export-all`
**محل ذخیره‌سازی:** تمامی موارد صادر شده به صورت فایل ZIP در پوشه‌ای به نام `voxvera-exports` در پوشه خانگی کاربر (`~/voxvera-exports/`) در تمامی پلتفرم‌ها ذخیره می‌شوند.
## وارد کردن و بازیابی
با انتقال فایل‌های ZIP خود به پوشه `~/voxvera-exports/` و اجرای دستور زیر، کل تنظیمات خود را در یک سیستم جدید بازیابی کنید:
```bash
voxvera import-multiple
```
## قابلیت حمل و استفاده آفلاین
اگر نیاز دارید ووکس‌ورا را روی سیستمی بدون دسترسی به اینترنت اجرا کنید، می‌توانید ابتدا وابستگی‌ها را به صورت محلی ذخیره کنید:
```bash
voxvera vendorize
```
این دستور تمامی کتابخانه‌های پایتون مورد نیاز را در پوشه `voxvera/vendor/` دانلود می‌کند. ابزار سپس این فایل‌های محلی را در اولویت قرار می‌دهد و اجازه می‌دهد بدون نیاز به `pip install` اجرا شود.
## وارد کردن گروهی (JSON)
برای تولید انبوه اعلامیه‌ها از چندین فایل تنظیمات JSON، آن‌ها را در پوشه `imports/` قرار داده و اجرا کنید:
```bash
voxvera batch-import
```
## آدرس‌های URL چگونه کار می‌کنند
هر اعلامیه دارای دو آدرس URL جداگانه است:
- **پیوند جداشونده** (تولید خودکار): آدرس .onion که اعلامیه در آن میزبانی می‌شود.
- **پیوند محتوا** (تنظیم توسط کاربر): یک آدرس URL خارجی که به یک وب‌سایت، ویدیو یا فایل دانلود اشاره می‌کند.
نیازی نیست آدرس .onion را به صورت دستی وارد کنید؛ ووکس‌ورا در مرحله میزبانی (`serve`) این کار را به طور خودکار انجام می‌دهد.
+92
View File
@@ -0,0 +1,92 @@
{
"meta": {
"language_name": "Português",
"flag": "🇧🇷",
"direction": "ltr"
},
"cli": {
"dep_check_header": "Verificação de Dependências",
"dep_found": "encontrado",
"dep_missing": "ausente",
"all_deps_installed": "Todas as dependências estão instaladas.",
"missing_deps_error": "Algumas dependências estão ausentes. Execute: pip install 'voxvera[all]'",
"init_name": "Nome",
"init_folder": "Nome da pasta",
"init_title": "Título",
"init_subtitle": "Subtítulo",
"init_headline": "Manchete",
"init_body": "Texto da mensagem",
"init_links": "Links",
"edit_again": "Editar novamente?",
"body_length": "Comprimento do corpo",
"body_limit_exceeded": "excede o limite",
"url_label": "URL (link de conteúdo - recurso externo)",
"url_message_label": "Mensagem da URL",
"binary_message_label": "Mensagem binária",
"template_not_found": "Modelo {name} não encontrado",
"template_copied": "Modelo copiado para {dest}",
"flyer_created": "Arquivos do panfleto criados em {dest}",
"dir_not_found": "Diretório {dir_path} não encontrado",
"onionshare_error": "OnionShare para {folder_name} saiu inesperadamente.",
"onionshare_causes": "Causas comuns: Rede bloqueada, relógio do sistema impreciso ou OnionShare já em execução.",
"onionshare_logs_tip": "Veja {logfile} para logs completos.",
"onion_url_msg": "[{folder_name}] URL Onion: {onion_url}",
"onionshare_running_pid": "[{folder_name}] OnionShare em execução (PID {pid}).",
"export_not_found": "Erro: Pasta do site '{folder_name}' não encontrada em {host_root}",
"export_success": "Exportado '{folder_name}' para {output_path}",
"export_all_none": "Nenhum site encontrado para exportar.",
"export_all_starting": "Exportando {count} sites para {dir}...",
"export_all_complete": "Exportação total concluída.",
"import_zip_not_found": "Erro: Arquivo Zip '{path}' não encontrado.",
"import_invalid_config": "Erro: Arquivo de exportação inválido. 'config.json' ausente.",
"import_invalid_folder": "Erro: config.json inválido. 'folder_name' ausente.",
"import_overwrite_confirm": "O site '{folder_name}' já existe. Sobrescrever?",
"import_cancelled": "Importação cancelada.",
"import_success": "Importado com sucesso '{folder_name}' para {dest_dir}",
"import_dir_not_found": "Erro: Diretório '{dir}' não encontrado.",
"import_multiple_none": "Nenhum arquivo zip encontrado em {dir}",
"import_multiple_found": "Encontrado {count} site(s) para importar de {dir}...",
"importing_file": "Importando {name}...",
"import_multiple_complete": "Importação múltipla concluída.",
"batch_import_none": "Nenhum arquivo JSON encontrado em imports",
"batch_import_processing": "Processando {file}",
"stop_server_not_running": "O servidor {folder_name} não está em execução.",
"stop_server_success": "Parado {folder_name} (PID {pid})",
"delete_server_success": "Servidor {folder_name} excluído",
"manage_select_server": "Selecione um servidor para gerenciar (ou Sair):",
"manage_create_new": "--- Criar Novo Site/Panfleto ---",
"manage_start_all": "--- Iniciar Todos os Sites ---",
"manage_stop_all": "--- Parar Todos os Sites ---",
"manage_export_all": "--- Exportar Todos os Sites ---",
"manage_import_multiple": "--- Importar Múltiplos Sites ---",
"manage_exit": "Sair",
"manage_startup_summary": "Resumo de Inicialização",
"manage_press_enter": "Pressione Enter para continuar",
"manage_action_menu": "Gerenciar {name}:",
"manage_action_toggle_stop": "Parar",
"manage_action_toggle_start": "Iniciar",
"manage_action_export": "Exportar para Zip",
"manage_action_delete": "Excluir",
"manage_action_back": "Voltar",
"manage_delete_confirm": "Tem certeza que deseja excluir {name}?",
"bootstrapping_msg": "[{name}] Conectando aos repetidores Tor e configurando serviço oculto...",
"bootstrapping_progress": "[{name}] Inicialização do Tor: {progress}% ...",
"no_urls_qr_skip": "Nenhuma URL configurada ainda. Os códigos QR serão gerados após 'voxvera serve'",
"input_file_not_found": "Arquivo de entrada {path} não existe."
},
"web": {
"tear_off_tor_browser": "Use o Tor Browser",
"tear_off_desc": "para ajudar a espalhar esta mensagem vá para",
"tear_off_footer": "clique no botão abaixo para imprimir",
"built_with": "construído com",
"print_button": "Imprimir Panfleto",
"download_button": "Baixar Ferramenta e Código"
},
"landing": {
"title": "ALTO SECRETO",
"subtitle": "~~NÃO~~ DISTRIBUIR",
"headline": "OPERAÇÃO VOX VERA",
"content": "Liberte-se da censura com o VoxVera. Uma ferramenta anônima de marketing de guerrilha e propagação de mensagens. Seja online ou no mundo físico, ela pode capacitá-lo a espalhar suas ideias com audácia, protegido por anonimato completo (se você hospedar via Tor). Baixe o código, projete um site de panfleto, hospede-o online e amplifique sua mensagem.\n\nUse o poder memético para compartilhar suas ideias em sua escola, local de trabalho, comunidades online ou até mesmo globalmente. O VoxVera garante que sua mensagem ressoe longe e amplamente, com seções destacáveis apresentando URLs e códigos QR exclusivos para fácil reimpressão.\n\nA privacidade pode ser mantida. Panfletos podem ser compartilhados via rede Tor, protegendo quem hospeda e quem usa contra censura.\n\nJunte-se a nós em uma revolução que valoriza a verdade e a transparência. Juntos, podemos construir uma rede de cidadãos informados que não têm medo de falar.",
"url_message": "Obtenha o VoxVera e comece a espalhar sua mensagem."
}
}
+130
View File
@@ -0,0 +1,130 @@
# Uso Detalhado
Este guia cobre os fluxos de trabalho comuns da CLI. Veja `docs/docker.md` para instruções do Docker e `docs/templates.md` para modelos de panfletos disponíveis.
## Pré-requisitos
O VoxVera foi projetado para ser altamente portátil e requer dependências mínimas do sistema.
### 1. Binários Independentes (Recomendado)
Você pode baixar binários independentes e sem dependências para o seu sistema operacional:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
Estes binários incluem tudo o que é necessário para executar o VoxVera (exceto o `onionshare-cli`).
### 2. Instalador de Linha Única
Alternativamente, instale através do nosso script automatizado:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. Instalação Manual via Python
Se preferir executar a partir do código-fonte:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## Passo a Passo
1. **Inicializar:** Execute `voxvera init` e siga as instruções. Você será solicitado a selecionar seu idioma primeiro.
2. **Construir:** Gere os arquivos do panfleto. Cada construção cria automaticamente um `voxvera-portable.zip` na pasta do panfleto, permitindo que outros baixem a ferramenta completa diretamente do seu panfleto.
```bash
voxvera build
```
3. **Servir:** Publique o panfleto via Tor:
```bash
voxvera serve
```
Isso detecta automaticamente sua instância do Tor, inicia o OnionShare e escreve o endereço .onion gerado nos links destacáveis do panfleto.
## Suporte a Idiomas
O VoxVera é totalmente localizado. Você pode alterar sua preferência de idioma permanentemente usando o seletor interativo ou um atalho direto:
- **Seletor Interativo:** `voxvera lang`
- **Atalho Direto:** `voxvera --lang pt` (define a preferência para português)
### Idiomas Suportados:
- **Inglês:** `en`
- **Espanhol:** `es` (alias: `--idioma`)
- **Alemão:** `de` (alias: `--sprache`)
- **Português:** `pt`
Você também pode forçar um idioma específico para um único comando sem alterar sua preferência permanente:
- **Inglês:** `voxvera --lang en check`
- **Português:** `voxvera --lang pt check`
Os panfletos gerados detectam automaticamente o idioma do navegador do visitante e alteram o texto da interface adequadamente.
## Gerenciamento de Servidores
Gerencie vários panfletos e suas identidades Tor a partir de um único menu interativo:
```bash
voxvera manage
```
Recursos:
- **{{t('cli.manage_create_new')}}**: Inicia a sequência completa de configuração.
- **{{t('cli.manage_start_all')}}**: Inicia ou encerra todos os panfletos da sua frota de uma só vez.
- **Status em Tempo Real**: Visualize URLs .onion ativas e indicadores de progresso de inicialização do Tor.
- **Controle Individual**: {{t('cli.manage_action_export')}} sites específicos para ZIP ou exclua-os.
## Espelhamento Universal (Distribuição Viral)
Para garantir que o VoxVera permaneça acessível mesmo se os repositórios centrais forem censurados, cada panfleto atua como um espelho para a ferramenta.
Quando você hospeda um panfleto, o botão **"{{t('web.download_button')}}"** na página inicial fornece um `voxvera-portable.zip` contendo:
- O código-fonte completo e todos os idiomas suportados.
- Todas as dependências Python (pré-vendidas).
- Binários Tor multiplataforma.
Isso permite que qualquer pessoa que escaneie seu panfleto se torne um novo distribuidor da ferramenta VoxVera.
## Exportação e Backup
Faça backup de suas identidades Tor exclusivas (para que sua URL .onion nunca mude) ou mova seus panfletos para outra máquina.
- **Exportar um único site**: `voxvera export <nome_da_pasta>`
- **Exportar todos os sites**: `voxvera export-all`
**Local de armazenamento:** Todas as exportações são salvas como arquivos ZIP em uma pasta chamada `voxvera-exports` no diretório inicial do usuário (`~/voxvera-exports/`) em todas as plataformas.
## Importação e Recuperação
Restaure toda a sua configuração em uma nova máquina movendo seus arquivos ZIP para `~/voxvera-exports/` e executando:
```bash
voxvera import-multiple
```
## Portabilidade e Uso Offline
Se precisar executar o VoxVera em uma máquina sem acesso à internet, você pode "venderizar" as dependências primeiro:
```bash
voxvera vendorize
```
Isso baixa todas as bibliotecas Python necessárias para `voxvera/vendor/`. A ferramenta priorizará esses arquivos locais, permitindo que ela funcione sem `pip install`.
## Importação em Lote (JSON)
Para gerar panfletos em massa a partir de vários arquivos de configuração JSON, coloque-os no diretório `imports/` e execute:
```bash
voxvera batch-import
```
## Como as URLs Funcionam
Cada panfleto tem duas URLs separadas:
- **Link destacável** (gerado automaticamente): O endereço .onion onde o panfleto está hospedado.
- **Link de conteúdo** (configurado pelo usuário): Uma URL externa apontando para um site, vídeo ou download.
Você não precisa inserir manualmente o endereço .onion; o VoxVera lida com isso automaticamente durante a fase de `serve`.
+92
View File
@@ -0,0 +1,92 @@
{
"meta": {
"language_name": "Türkçe",
"flag": "🇹🇷",
"direction": "ltr"
},
"cli": {
"dep_check_header": "Bağımlılık Kontrolü",
"dep_found": "bulundu",
"dep_missing": "eksik",
"all_deps_installed": "Tüm bağımlılıklar yüklendi.",
"missing_deps_error": "Bazı bağımlılıklar eksik. Şunu çalıştırın: pip install 'voxvera[all]'",
"init_name": "İsim",
"init_folder": "Klasör Adı",
"init_title": "Başlık",
"init_subtitle": "Alt Başlık",
"init_headline": "Ana Başlık",
"init_body": "Mesaj Metni",
"init_links": "Bağlantılar",
"edit_again": "Tekrar düzenle?",
"body_length": "Metin uzunluğu",
"body_limit_exceeded": "sınırı aşıyor",
"url_label": "URL (içerik bağlantısı - harici kaynak)",
"url_message_label": "URL mesajı",
"binary_message_label": "İkili (Binary) mesaj",
"template_not_found": "Şablon {name} bulunamadı",
"template_copied": "Şablon {dest} konumuna kopyalandı",
"flyer_created": "İlan dosyaları {dest} altında oluşturuldu",
"dir_not_found": "Dizin {dir_path} bulunamadı",
"onionshare_error": "{folder_name} için OnionShare beklenmedik bir şekilde kapandı.",
"onionshare_causes": "Yaygın nedenler: Ağ engellenmiş, sistem saati yanlış veya OnionShare zaten çalışıyor olabilir.",
"onionshare_logs_tip": "Tam günlükler için {logfile} dosyasına bakın.",
"onion_url_msg": "[{folder_name}] Onion URL: {onion_url}",
"onionshare_running_pid": "[{folder_name}] OnionShare çalışıyor (PID {pid}).",
"export_not_found": "Hata: '{folder_name}' site klasörü {host_root} içinde bulunamadı",
"export_success": "'{folder_name}' şuraya dışa aktarıldı: {output_path}",
"export_all_none": "Dışa aktarılacak site bulunamadı.",
"export_all_starting": "{count} site {dir} konumuna dışa aktarılıyor...",
"export_all_complete": "Tüm dışa aktarma işlemleri tamamlandı.",
"import_zip_not_found": "Hata: '{path}' Zip dosyası bulunamadı.",
"import_invalid_config": "Hata: Geçersiz dışa aktarma dosyası. 'config.json' eksik.",
"import_invalid_folder": "Hata: Geçersiz config.json. 'folder_name' eksik.",
"import_overwrite_confirm": "'{folder_name}' sitesi zaten mevcut. Üzerine yazılsın mı?",
"import_cancelled": "İçe aktarma iptal edildi.",
"import_success": "'{folder_name}' başarıyla {dest_dir} konumuna içe aktarıldı",
"import_dir_not_found": "Hata: '{dir}' dizini bulunamadı.",
"import_multiple_none": "{dir} içinde Zip dosyası bulunamadı",
"import_multiple_found": "{dir} konumundan içe aktarılacak {count} site bulundu...",
"importing_file": "{name} içe aktarılıyor...",
"import_multiple_complete": "Toplu içe aktarma tamamlandı.",
"batch_import_none": "İçe aktarmalarda JSON dosyası bulunamadı",
"batch_import_processing": "{file} işleniyor",
"stop_server_not_running": "{folder_name} sunucusu çalışmıyor.",
"stop_server_success": "{folder_name} durduruldu (PID {pid})",
"delete_server_success": "{folder_name} sunucusu silindi",
"manage_select_server": "Yöneteceğiniz sunucuyu seçin (veya Çıkış):",
"manage_create_new": "--- Yeni Site/İlan Oluştur ---",
"manage_start_all": "--- Tüm Siteleri Başlat ---",
"manage_stop_all": "--- Tüm Siteleri Durdur ---",
"manage_export_all": "--- Tüm Siteleri Dışa Aktar ---",
"manage_import_multiple": "--- Çoklu Site İçe Aktar ---",
"manage_exit": "Çıkış",
"manage_startup_summary": "Başlatma Özeti",
"manage_press_enter": "Devam etmek için Enter'a basın",
"manage_action_menu": "{name} yönetimi:",
"manage_action_toggle_stop": "Durdur",
"manage_action_toggle_start": "Başlat",
"manage_action_export": "Zip Olarak Dışa Aktar",
"manage_action_delete": "Sil",
"manage_action_back": "Geri",
"manage_delete_confirm": "{name} silinecek, emin misiniz?",
"bootstrapping_msg": "[{name}] Tor rölelerine bağlanılıyor ve gizli servis kuruluyor...",
"bootstrapping_progress": "[{name}] Tor Başlatılıyor: %{progress} ...",
"no_urls_qr_skip": "Henüz URL yapılandırılmadı. QR kodları 'voxvera serve' komutundan sonra oluşturulacak",
"input_file_not_found": "{path} giriş dosyası mevcut değil."
},
"web": {
"tear_off_tor_browser": "Tor Tarayıcı Kullanın",
"tear_off_desc": "bu mesajı yaymaya yardımcı olmak için şuraya gidin:",
"tear_off_footer": "yazdırmak için aşağıdaki düğmeye tıklayın",
"built_with": "ile yapıldı",
"print_button": "İlanı Yazdır",
"download_button": "Aracı ve Kaynak Kodunu İndir"
},
"landing": {
"title": "ÇOK GİZLİ",
"subtitle": "~~DAĞITMAYIN~~",
"headline": "VOX VERA OPERASYONU",
"content": "VoxVera ile sansürden kurtulun. Anonim bir gerilla pazarlama ve mesaj yayma aracı. İster çevrimiçi ister fiziksel dünyada olsun, Tor üzerinden barındırma yaparak tam anonimlik koruması altında fikirlerinizi cesurca yaymanızı sağlar. Kodu indirin, bir ilan sitesi tasarlayın, çevrimiçi barındırın ve mesajınızı güçlendirin.\n\nFikirlerinizi okulunuzda, iş yerinizde, çevrimiçi topluluklarda ve hatta küresel çapta paylaşmak için memetik gücü kullanın. VoxVera, benzersiz URL'ler ve kolayca yeniden yazdırma için QR kodları içeren yırtılabilir bölümleriyle mesajınızın geniş kitlelere ulaşmasını sağlar.\n\nGizlilik korunabilir. İlanlar Tor ağı üzerinden paylaşılabilir, böylece hem barındıran hem de kullanıcılar sansürden korunur.\n\nGerçeğe ve şeffaflığa değer veren bir devrime katılın. Birlikte, sesini yükseltmekten korkmayan bilinçli vatandaşlardan oluşan bir ağ kurabiliriz.",
"url_message": "VoxVera'yı edinin ve mesajınızı yaymaya başlayın."
}
}
+130
View File
@@ -0,0 +1,130 @@
# Detaylı Kullanım
Bu kılavuz, yaygın CLI iş akışlarını kapsar. Docker talimatları için `docs/docker.md` ve mevcut ilan şablonları için `docs/templates.md` dosyalarına bakın.
## Ön Koşullar
VoxVera, yüksek taşınabilirlik için tasarlanmıştır ve minimum sistem bağımlılığı gerektirir.
### 1. Bağımsız İkililer (Önerilen)
İşletim sisteminiz için bağımsız, bağımlılık gerektirmeyen ikili dosyaları (binaries) indirebilirsiniz:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
Bu dosyalar, VoxVera'yı çalıştırmak için gereken her şeyi içerir (`onionshare-cli` hariç).
### 2. Tek Satırlık Kurulum
Alternatif olarak, otomatik betiğimiz aracılığıyla kurulum yapın:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. Manuel Python Kurulumu
Kaynaktan çalıştırmayı tercih ederseniz:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## Adım Adım
1. **Başlatma:** `voxvera init` komutunu çalıştırın ve istemleri takip edin. Önce dilinizi seçmeniz istenecektir.
2. **Oluşturma:** İlan varlıklarını oluşturun. Her oluşturma işlemi, ilan klasöründe otomatik olarak bir `voxvera-portable.zip` oluşturur; bu sayede başkaları tam aracı doğrudan ilanınızdan indirebilir.
```bash
voxvera build
```
3. **Sunma:** İlanı Tor üzerinden yayınlayın:
```bash
voxvera serve
```
bu komut mevcut Tor örneğinizi otomatik olarak algılar, OnionShare'i başlatır ve oluşturulan .onion adresini ilandaki yırtılabilir bağlantılara yazar.
## Dil Desteği
VoxVera tamamen yerelleştirilmiştir. Dil tercihinizi etkileşimli seçiciyi veya doğrudan kısayolu kullanarak kalıcı olarak değiştirebilirsiniz:
- **Etkileşimli Seçici:** `voxvera lang`
- **Doğrudan Kısayol:** `voxvera --lang tr` (tercihi Türkçe olarak ayarlar)
### Desteklenen Diller:
- **İngilizce:** `en`
- **İspanyolca:** `es` (takma ad: `--idioma`)
- **Almanca:** `de` (takma ad: `--sprache`)
- **Türkçe:** `tr`
Kalıcı tercihinizi değiştirmeden tek bir komut için belirli bir dili de zorlayabilirsiniz:
- **İngilizce:** `voxvera --lang en check`
- **Türkçe:** `voxvera --lang tr check`
Oluşturulan ilanlar, ziyaretçinin tarayıcı dilini otomatik olarak algılar ve kullanıcı arayüzü metnini buna göre değiştirir.
## Sunucu Yönetimi
Tek bir etkileşimli menüden birden fazla ilanı ve Tor kimliklerini yönetin:
```bash
voxvera manage
```
Özellikler:
- **{{t('cli.manage_create_new')}}**: Tam kurulum dizisini başlatın.
- **{{t('cli.manage_start_all')}}**: Filonuzdaki tüm ilanları tek seferde başlatın veya kapatın.
- **Gerçek Zamanlı Durum**: Aktif .onion URL'lerini ve Tor başlatma ilerleme göstergelerini görüntüleyin.
- **Bireysel Kontrol**: Belirli siteleri ZIP olarak {{t('cli.manage_action_export')}} veya silin.
## Evrensel Aynalama (Viral Dağıtım)
Merkezi depolar sansürlense bile VoxVera'nın erişilebilir kalmasını sağlamak için her ilan, araç için bir ayna görevi görür.
Bir ilanı barındırdığınızda, açılış sayfasındaki **"{{t('web.download_button')}}"** düğmesi şunları içeren bir `voxvera-portable.zip` sunar:
- Tam kaynak kodu ve desteklenen tüm diller.
- Tüm Python bağımlılıkları (önceden paketlenmiş).
- Platformlar arası Tor ikilileri.
Bu, ilanınızı tarayan herkesin VoxVera aracının yeni bir dağıtıcısı olmasını sağlar.
## Dışa Aktarma ve Yedekleme
Benzersiz Tor kimliklerinizi yedekleyin (.onion URL'nizin hiç değişmemesi için) veya ilanlarınızı başka bir makineye taşıyın.
- **Tek bir siteyi dışa aktar**: `voxvera export <klasör_adı>`
- **Tüm siteleri dışa aktar**: `voxvera export-all`
**Depolama konumu:** Tüm dışa aktarmalar, tüm platformlarda kullanıcının ana dizinindeki `~/voxvera-exports/` klasörüne ZIP dosyası olarak kaydedilir.
## İçe Aktarma ve Kurtarma
ZIP dosyalarınızı `~/voxvera-exports/` dizinine taşıyıp şu komutu çalıştırarak tüm kurulumunuzu yeni bir makinede geri yükleyin:
```bash
voxvera import-multiple
```
## Taşınabilirlik ve Çevrimdışı Kullanım
VoxVera'yı internet erişimi olmayan bir makinede çalıştırmanız gerekirse, önce bağımlılıkları yerelleştirebilirsiniz:
```bash
voxvera vendorize
```
Bu, gerekli tüm Python kütüphanelerini `voxvera/vendor/` dizinine indirir. Araç daha sonra bu yerel dosyalara öncelik vererek `pip install` olmadan çalışmasına olanak tanır.
## Toplu İçe Aktarma (JSON)
Birden fazla JSON yapılandırma dosyasından toplu ilan oluşturmak için bunları `imports/` dizinine yerleştirin ve çalıştırın:
```bash
voxvera batch-import
```
## URL'ler Nasıl Çalışır?
Her ilanın iki ayrı URL'si vardır:
- **Yırtılabilir bağlantı** (otomatik oluşturulur): İlanın barındırıldığı .onion adresi.
- **İçerik bağlantısı** (kullanıcı tarafından yapılandırılır): Bir web sitesine, videoya veya indirmeye işaret eden harici bir URL.
.onion adresini manuel olarak girmenize gerek yoktur; VoxVera `serve` aşamasında bunu otomatik olarak halleder.
+92
View File
@@ -0,0 +1,92 @@
{
"meta": {
"language_name": "简体中文",
"flag": "🇨🇳",
"direction": "ltr"
},
"cli": {
"dep_check_header": "依赖检查",
"dep_found": "已找到",
"dep_missing": "缺失",
"all_deps_installed": "所有依赖已安装。",
"missing_deps_error": "部分依赖缺失。请运行: pip install 'voxvera[all]'",
"init_name": "名称",
"init_folder": "文件夹名称",
"init_title": "标题",
"init_subtitle": "副标题",
"init_headline": "大标题",
"init_body": "消息正文",
"init_links": "链接",
"edit_again": "再次编辑?",
"body_length": "正文长度",
"body_limit_exceeded": "超过限制",
"url_label": "URL (内容链接 - 外部资源)",
"url_message_label": "URL 消息",
"binary_message_label": "二进制消息",
"template_not_found": "模板 {name} 未找到",
"template_copied": "模板已复制到 {dest}",
"flyer_created": "传单文件已创建在 {dest}",
"dir_not_found": "目录 {dir_path} 未找到",
"onionshare_error": "{folder_name} 的 OnionShare 意外退出。",
"onionshare_causes": "常见原因:网络受阻、系统时间不准,或 OnionShare 已在运行。",
"onionshare_logs_tip": "查看 {logfile} 获取完整日志。",
"onion_url_msg": "[{folder_name}] Onion URL: {onion_url}",
"onionshare_running_pid": "[{folder_name}] OnionShare 正在运行 (PID {pid})。",
"export_not_found": "错误:在 {host_root} 中未找到站点文件夹 '{folder_name}'",
"export_success": "已将 '{folder_name}' 导出到 {output_path}",
"export_all_none": "未找到可导出的站点。",
"export_all_starting": "正在将 {count} 个站点导出到 {dir}...",
"export_all_complete": "全部导出完成。",
"import_zip_not_found": "错误:未找到 Zip 文件 '{path}'。",
"import_invalid_config": "错误:无效的导出文件。缺失 'config.json'。",
"import_invalid_folder": "错误:无效的 config.json。缺失 'folder_name'。",
"import_overwrite_confirm": "站点 '{folder_name}' 已存在。是否覆盖?",
"import_cancelled": "导入已取消。",
"import_success": "已成功将 '{folder_name}' 导入到 {dest_dir}",
"import_dir_not_found": "错误:目录 '{dir}' 未找到。",
"import_multiple_none": "在 {dir} 中未找到 Zip 文件",
"import_multiple_found": "找到 {count} 个站点可从 {dir} 导入...",
"importing_file": "正在导入 {name}...",
"import_multiple_complete": "批量导入完成。",
"batch_import_none": "在 imports 中未找到 JSON 文件",
"batch_import_processing": "正在处理 {file}",
"stop_server_not_running": "服务器 {folder_name} 未运行。",
"stop_server_success": "已停止 {folder_name} (PID {pid})",
"delete_server_success": "已删除服务器 {folder_name}",
"manage_select_server": "选择要管理的服务器(或退出):",
"manage_create_new": "--- 创建新站点/传单 ---",
"manage_start_all": "--- 启动所有站点 ---",
"manage_stop_all": "--- 停止所有站点 ---",
"manage_export_all": "--- 导出所有站点 ---",
"manage_import_multiple": "--- 导入多个站点 ---",
"manage_exit": "退出",
"manage_startup_summary": "启动摘要",
"manage_press_enter": "按回车键继续",
"manage_action_menu": "管理 {name}:",
"manage_action_toggle_stop": "停止",
"manage_action_toggle_start": "启动",
"manage_action_export": "导出为 Zip",
"manage_action_delete": "删除",
"manage_action_back": "返回",
"manage_delete_confirm": "确定要删除 {name} 吗?",
"bootstrapping_msg": "[{name}] 正在连接 Tor 中继并设置隐藏服务...",
"bootstrapping_progress": "[{name}] Tor 引导中: {progress}% ...",
"no_urls_qr_skip": "尚未配置 URL。QR 码将在 'voxvera serve' 后生成",
"input_file_not_found": "输入文件 {path} 不存在。"
},
"web": {
"tear_off_tor_browser": "使用 Tor 浏览器",
"tear_off_desc": "为了帮助传播此信息,请访问",
"tear_off_footer": "点击下方按钮进行打印",
"built_with": "构建自",
"print_button": "打印传单",
"download_button": "下载工具与源码"
},
"landing": {
"title": "绝密",
"subtitle": "~~切勿~~ 散布",
"headline": "VOX VERA 行动",
"content": "使用 VoxVera 摆脱审查。一个匿名的游击营销和消息传播工具。无论是线上还是在现实世界中,它都能赋予你大胆传播想法的力量,并受到完全匿名的保护(如果你通过 Tor 托管)。下载代码,设计传单站点,将其托管在网上并放大你的声音。\n\n利用模因的力量在你的学校、工作场所、在线社区甚至全球范围内分享你的想法。VoxVera 通过带有独特 URL 和 QR 码的可撕下部分确保你的消息产生深远共鸣,方便再次打印。\n\n隐私可以得到维护。传单可以通过 Tor 网络共享,保护托管者和用户免受审查。\n\n加入我们这场重视真相和透明度的革命。齐心协力,我们可以建立一个不惧怕发声的知情公民网络。",
"url_message": "获取 VoxVera 并开始传播你的消息。"
}
}
+130
View File
@@ -0,0 +1,130 @@
# 详细用法
本指南涵盖了常用的 CLI 工作流程。有关 Docker 指令请参阅 `docs/docker.md`,有关可用传单模板请参阅 `docs/templates.md`。
## 先决条件
VoxVera 旨在实现高度便携,且仅需极少的系统依赖。
### 1. 独立二进制文件(推荐)
您可以为您的操作系统下载独立的、无依赖的二进制文件:
- **Linux:** `voxvera-linux`
- **Windows:** `voxvera-windows.exe`
- **macOS:** `voxvera-macos`
这些二进制文件包含了运行 VoxVera 所需的一切(`onionshare-cli` 除外)。
### 2. 一键安装
或者,通过我们的自动化脚本进行安装:
```bash
curl -fsSL https://raw.githubusercontent.com/PR0M3TH3AN/VoxVera/main/install.sh | bash
```
### 3. 手动 Python 安装
如果您更喜欢从源代码运行:
```bash
pipx install 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'
sudo apt install tor onionshare-cli # Debian/Ubuntu
```
## 分步指南
1. **初始化:** 运行 `voxvera init` 并按照提示操作。系统会首先要求您选择语言。
2. **构建:** 生成传单资产。每次构建都会在传单文件夹中自动创建一个 `voxvera-portable.zip`,允许其他人直接从您的传单下载完整工具。
```bash
voxvera build
```
3. **发布:** 通过 Tor 发布传单:
```bash
voxvera serve
```
这会自动检测您的 Tor 实例,启动 OnionShare,并将生成的 .onion 地址写入传单的可撕下链接中。
## 语言支持
VoxVera 已完全本地化。您可以使用交互式选择器或直接快捷方式永久更改您的语言偏好:
- **交互式选择器:** `voxvera lang`
- **直接快捷方式:** `voxvera --lang zh`(将偏好设置为简体中文)
### 支持的语言:
- **英语:** `en`
- **西班牙语:** `es`(别名:`--idioma`)
- **德语:** `de`(别名:`--sprache`)
- **简体中文:** `zh`
您也可以在不更改永久偏好的情况下,为单个命令强制指定特定语言:
- **英语:** `voxvera --lang en check`
- **简体中文:** `voxvera --lang zh check`
生成的传单会自动检测访问者的浏览器语言并相应地切换 UI 文本。
## 服务器管理
通过单一的交互式菜单管理多个传单及其 Tor 身份:
```bash
voxvera manage
```
功能:
- **{{t('cli.manage_create_new')}}**:开始完整的设置序列。
- **{{t('cli.manage_start_all')}}**:一次性启动或关闭您旗下的所有传单。
- **实时状态**:查看活跃的 .onion URL 和 Tor 引导进度指示器。
- **个人控制**:将特定站点 {{t('cli.manage_action_export')}} 到 ZIP 或删除它们。
## 通用镜像(病毒式传播)
为了确保即使中央仓库被审查,VoxVera 仍然可用,每张传单都充当该工具的镜像。
当您托管传单时,落地页上的 **“{{t('web.download_button')}}”** 按钮会提供一个 `voxvera-portable.zip`,其中包含:
- 完整的源代码和所有支持的语言。
- 所有 Python 依赖项(预先打包)。
- 跨平台的 Tor 二进制文件。
这允许任何扫描您传单的人成为 VoxVera 工具的新分发者。
## 导出与备份
备份您独特的 Tor 身份(这样您的 .onion URL 就永远不会改变)或将您的传单移动到另一台机器。
- **导出单个站点**:`voxvera export <文件夹名称>`
- **导出所有站点**:`voxvera export-all`
**存储位置:** 在所有平台上,所有导出都会以 ZIP 文件的形式保存在用户主目录下的 `voxvera-exports` 文件夹中(`~/voxvera-exports/`)。
## 导入与恢复
通过将 ZIP 文件移动到 `~/voxvera-exports/` 并运行以下命令,在新机器上恢复您的整个设置:
```bash
voxvera import-multiple
```
## 便携性与离线使用
如果您需要在没有互联网访问的机器上运行 VoxVera,您可以先“本地化”依赖项:
```bash
voxvera vendorize
```
这将把所有所需的 Python 库下载到 `voxvera/vendor/` 中。该工具随后将优先使用这些本地文件,使其能够在没有 `pip install` 的情况下运行。
## 批量导入 (JSON)
要从多个 JSON 配置文件批量生成传单,请将它们放在 `imports/` 目录中并运行:
```bash
voxvera batch-import
```
## URL 如何工作
每张传单都有两个独立的 URL:
- **撕下链接**(自动生成):托管传单的 .onion 地址。
- **内容链接**(用户配置):指向网站、视频或下载的外部 URL。
您无需手动输入 .onion 地址;VoxVera 会在 `serve` 阶段自动处理。
+1 -1
View File
@@ -7,7 +7,7 @@
<title id="site-title">{{name}}</title>
<style>
body {
font-family: 'Courier New', Courier, 'Nimbus Mono L', 'Liberation Mono', 'Noto Sans Arabic', 'Noto Sans Hebrew', 'Noto Sans Devanagari', 'Noto Sans JP', monospace;
font-family: 'Courier New', Courier, 'Nimbus Mono L', 'Liberation Mono', 'Noto Sans Arabic', 'Noto Sans Hebrew', 'Noto Sans Devanagari', 'Noto Sans JP', 'Noto Sans SC', 'Noto Sans Arabic UI', monospace;
margin: 0;
padding: 20px 0;
display: flex;