diff --git a/imports/voxvera.json b/imports/voxvera.json index 52f87c6..2ff0ca5 100644 --- a/imports/voxvera.json +++ b/imports/voxvera.json @@ -2,7 +2,7 @@ "name": "Vox Vera Printable Flyers", "folder_name": "voxvera", "title": "TOP SECRET", - "subtitle": "DO NOT DISTRIBUTE", + "subtitle": "DO ~~NOT~~ DISTRIBUTE", "headline": "OPERATION VOX VERA", "content": "Break free from censorship with VoxVera. An anonymous guerrilla marketing and message-spreading tool. Whether online or in the physical world, it can empower you to spread your ideas boldly, shielded by complete anonymity (if you host over Tor). Download the code, design a flyer site, host it online and amplify your message.\n\nUse memetic power to share your ideas in your school, workplace, online communities, or even globally. VoxVera ensures your message resonates far and wide, with tear-off sections featuring unique URLs and QR codes for easy reprinting.\n\nPrivacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.\n\nJoin us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.", "url_message": "Follow this link to learn more. Use Tor Browser.", diff --git a/site/config.json b/site/config.json index 3907f73..c05d634 100644 --- a/site/config.json +++ b/site/config.json @@ -2,7 +2,7 @@ "name": "Vox Vera Printable Flyers", "folder_name": "voxvera", "title": "TOP SECRET", - "subtitle": "DO NOT DISTRIBUTE", + "subtitle": "DO ~~NOT~~ DISTRIBUTE", "headline": "OPERATION VOX VERA", "content": "Break free from censorship with VoxVera. An anonymous guerrilla marketing and message-spreading tool. Whether online or in the physical world, it can empower you to spread your ideas boldly, shielded by complete anonymity (if you host over Tor). Download the code, design a flyer site, host it online and amplify your message. \n\nUse memetic power to share your ideas in your school, workplace, online communities, or even globally. VoxVera ensures your message resonates far and wide, with tear-off sections featuring unique URLs and QR codes for easy reprinting. \n\nPrivacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.\n\nJoin us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.\n", "url_message": "Get VoxVera and start spreading your message.", diff --git a/voxvera/cli.py b/voxvera/cli.py index 89e23b3..1088fb8 100644 --- a/voxvera/cli.py +++ b/voxvera/cli.py @@ -130,6 +130,17 @@ def _open_editor_terminal(initial: str) -> str: import tempfile editor = os.environ.get("EDITOR", "nano") + if not shutil.which(editor): + editor = "nano" + if not shutil.which("nano"): + # Extreme fallback + print("\n--- EDIT CONTENT BELOW (End with Ctrl+D) ---") + print("(This is a fallback because neither $EDITOR nor nano were found)") + print("--- Current content ---") + print(initial or "") + print("---") + return sys.stdin.read() + fd, path = tempfile.mkstemp(suffix=".txt") try: with os.fdopen(fd, "w", encoding="utf-8") as fh: @@ -137,23 +148,32 @@ def _open_editor_terminal(initial: str) -> str: subprocess.call([editor, path]) with open(path, "r", encoding="utf-8") as fh: return fh.read() + except Exception as e: + print(f"Error opening terminal editor: {e}") + return initial finally: os.unlink(path) -# 🔧 merged conflicting changes from codex/populate-gui-text-fields-for-editing vs main def open_editor(initial: str) -> str: """Open a simple GUI text editor with pre-populated content if possible. Existing text is pre-filled in the editor. If tkinter or a display server is unavailable, falls back to the user's $EDITOR in the terminal. """ + # If no display found (on Linux/Unix), immediately use terminal + if os.name != "nt" and not os.environ.get("DISPLAY") and not os.environ.get("WAYLAND_DISPLAY"): + return _open_editor_terminal(initial) + try: import tkinter as tk from tkinter import scrolledtext root = tk.Tk() root.title("Edit text") + # Bring to front + root.attributes("-topmost", True) + root.after_idle(root.attributes, "-topmost", False) except Exception: return _open_editor_terminal(initial) @@ -168,10 +188,21 @@ def open_editor(initial: str) -> str: result["text"] = text.get("1.0", "end-1c") root.destroy() - save_btn = tk.Button(root, text="Save", command=save_and_close) + save_btn = tk.Button(root, text="Save (or close window)", command=save_and_close) save_btn.pack() root.protocol("WM_DELETE_WINDOW", save_and_close) - root.mainloop() + + try: + root.mainloop() + except KeyboardInterrupt: + # If user hits Ctrl+C in terminal while GUI is open, fallback to terminal editor + try: + root.destroy() + except Exception: + pass + print("\nGUI editor interrupted. Falling back to terminal editor...") + return _open_editor_terminal(initial) + return result["text"] @@ -264,7 +295,12 @@ def interactive_update(config_path: str): console.rule(t("cli.init_body")) while True: - body = open_editor(data.get("content", "")) + # Use existing content if present, else fallback to localized landing default + initial_content = data.get("content") + if not initial_content or initial_content.strip() == "": + initial_content = t("landing.content") + + body = open_editor(initial_content) length = len(body) if length > 1000: console.print(f"{t('cli.body_length')}: {length}/1000 {t('cli.body_limit_exceeded')}", style="red") @@ -331,7 +367,7 @@ def bundle_source(dest_zip: Path): file_path = Path(root) / file arcname = file_path.relative_to(ROOT.parent) zipf.write(file_path, arcname) - + # 2. Include the run scripts and root files root_files = [ "voxvera-run.sh", "voxvera-install.sh", "README.md", @@ -366,7 +402,7 @@ def bundle_portable(dest_zip: Path): file_path = Path(root) / file arcname = file_path.relative_to(ROOT.parent) zipf.write(file_path, arcname) - + # 3. Include the run scripts and root files root_files = [ "voxvera-run.sh", "voxvera-install.sh", "README.md", @@ -394,11 +430,11 @@ def build_assets( config_path = Path(config_path) # generate QR codes (pure Python) generate_qr(config_path, src_dir) - + data = load_config(config_path) with open(src_dir / "index-master.html", "r") as fh: html = fh.read() - + # Bundle locales for the web engine all_locales = {} locale_files = sorted(glob.glob(str(ROOT / "locales" / "*.json"))) @@ -410,13 +446,13 @@ def build_assets( "meta": l_data.get("meta", {}), "web": l_data.get("web", {}) } - + html = html.replace("{{locales}}", json.dumps(all_locales)) # 1. Statically replace localization tokens {{t_web_...}} # This ensures the flyer is translated even with JS disabled. lang_data = all_locales.get(data.get("lang", "en"), all_locales.get("en", {})) - + # Web tokens (labels, buttons) web_tokens = lang_data.get("web", {}) for token, translation in web_tokens.items(): @@ -428,7 +464,7 @@ def build_assets( landing_tokens = lang_data.get("landing", {}) for token in landing_tokens.keys(): html = html.replace(f"{{{{t_landing_{token}}}}}", "") - + # Explicitly handle content and url_message if they were t_landing'd # We want the user's custom content to win html = html.replace("{{t_landing_content}}", "{{content}}") @@ -436,18 +472,21 @@ def build_assets( # 2. Statically replace config placeholders {{key}} for key, value in data.items(): - html = html.replace(f"{{{{{key}}}}}", str(value)) + val_str = str(value) + # Support Markdown-style redaction ~~text~~ for user fields too + val_str = re.sub(r"~~(.*?)~~", r'\1', val_str) + html = html.replace(f"{{{{{key}}}}}", val_str) folder_name = data["folder_name"] dest = ROOT / "host" / folder_name os.makedirs(dest, exist_ok=True) - + # Update download link to point to our viral portable bundle html = html.replace("download/download.zip", "download/voxvera-portable.zip") with open(dest / "index.html", "w") as fh: fh.write(html) - + # Create the viral portable bundle download_dir = dest / "download" os.makedirs(download_dir, exist_ok=True) @@ -455,17 +494,17 @@ def build_assets( if download_path: shutil.copy(download_path, download_dir / "extra-content.zip") - + # Copy config if it's not already there if Path(config_path) != dest / "config.json": shutil.copy(config_path, dest / "config.json") - + # Copy QR codes if they exist for qr_file in ["qrcode-content.png", "qrcode-tear-offs.png"]: qr_src = Path(src_dir) / qr_file if qr_src.exists(): shutil.copy(qr_src, dest / qr_file) - + print(f"Flyer files created under {dest}") @@ -547,7 +586,7 @@ def serve(config_path: str) -> str | None: ] log_fh = open(logfile, "w") proc = subprocess.Popen(cmd, stdout=log_fh, stderr=subprocess.STDOUT, env=env) - + pid_file = dir_path / "server.pid" with open(pid_file, "w") as f: f.write(str(proc.pid)) @@ -573,11 +612,11 @@ def serve(config_path: str) -> str | None: sys.stderr.write(line) pid_file.unlink(missing_ok=True) return None - + if os.path.exists(logfile): with open(logfile) as fh: content = fh.read() - + # Look for Tor bootstrap progress in logs to give feedback m_progress = _re.findall(r"Bootstrapped (\d+)%", content) if m_progress: @@ -589,16 +628,16 @@ def serve(config_path: str) -> str | None: m = _re.search(r"https?://[a-z0-9]+\.onion", content) if m: onion_url = m.group(0) - + # update config with the onion URL in the host directory config_file = dir_path / "config.json" data = load_config(config_file) data["tear_off_link"] = onion_url save_config(data, config_file) - + # regenerate assets with the new URL using the host-local config build_assets(str(config_file)) - + print(f"[{folder_name}] Onion URL: {onion_url}") print(f"[{folder_name}] OnionShare running (PID {proc.pid}).") return onion_url @@ -647,7 +686,7 @@ def export_site(folder_name: str, output_path: str = None): file_path = Path(root) / file arcname = file_path.relative_to(source_dir) zipf.write(file_path, arcname) - + print(f"Exported '{folder_name}' to {output_path}") @@ -657,7 +696,7 @@ def export_all_sites(): if not servers: print("No sites found to export.") return - + export_dir = get_export_dir() print(f"Exporting {len(servers)} sites to {export_dir}...") for server in servers: @@ -675,19 +714,19 @@ def import_site(zip_path: str): with tempfile.TemporaryDirectory() as tmpdir: with zipfile.ZipFile(zip_path, 'r') as zipf: zipf.extractall(tmpdir) - + tmp_path = Path(tmpdir) config_file = tmp_path / "config.json" if not config_file.exists(): print("Error: Invalid export file. Missing 'config.json'.") return - + data = load_config(config_file) folder_name = data.get("folder_name") if not folder_name: print("Error: Invalid config.json. Missing 'folder_name'.") return - + dest_dir = ROOT / "host" / folder_name if dest_dir.exists(): confirm = inquirer.confirm(message=f"Site '{folder_name}' already exists. Overwrite?").execute() @@ -695,28 +734,28 @@ def import_site(zip_path: str): print("Import cancelled.") return shutil.rmtree(dest_dir) - + shutil.copytree(tmp_path, dest_dir) print(f"Successfully imported '{folder_name}' to {dest_dir}") def import_multiple_sites(source_dir: str = None): """Import all zip files from a directory (defaults to ~/voxvera-exports).""" - + if not source_dir: source_dir = get_export_dir() else: source_dir = Path(source_dir) - + if not source_dir.exists(): print(f"Error: Directory '{source_dir}' not found.") return - + zip_files = sorted(glob.glob(str(source_dir / "*.zip"))) if not zip_files: print(f"No zip files found in {source_dir}") return - + print(f"Found {len(zip_files)} site(s) to import from {source_dir}...") for zip_path in zip_files: print(f"\nImporting {Path(zip_path).name}...") @@ -750,7 +789,7 @@ def build_docs(): # Replace tokens: {{t('path.to.token')}} # This regex looks for {{t('...')}} and {{t("...")}} import re as _re - + def replace_token(match): token_path = match.group(1) return t(token_path) @@ -784,7 +823,7 @@ def build_site(): return print("Refreshing site/ assets...") - + # 1. Refresh QR codes using site/config.json from voxvera.build import generate_qr generate_qr(config_path, site_dir) @@ -807,14 +846,14 @@ def build_site(): "web": l_data.get("web", {}), "landing": l_data.get("landing", {}) } - + html = html.replace("{{locales}}", json.dumps(all_locales)) # 1. Statically replace localization tokens # Get the language from config if available, else default to en current_lang = data.get("lang", "en") lang_data = all_locales.get(current_lang, all_locales.get("en", {})) - + for category in ["web", "landing"]: tokens = lang_data.get(category, {}) for token, translation in tokens.items(): @@ -835,13 +874,13 @@ def build_site(): # 3. Create the download assets in site/download/ download_dir = site_dir / "download" os.makedirs(download_dir, exist_ok=True) - + # Bundle portable version (source + vendor + binaries) bundle_portable(download_dir / "voxvera-portable.zip") - + # Bundle source version (source only) bundle_source(download_dir / "voxvera-source.zip") - + # Copy standalone binaries if they exist bin_dir = ROOT / "resources" / "bin" if bin_dir.exists(): @@ -859,10 +898,10 @@ def vendorize(): if not req_file.exists(): print("Error: requirements.txt not found.") return - + os.makedirs(vendor_dir, exist_ok=True) print(f"Vendorizing dependencies into {vendor_dir}...") - + try: subprocess.check_call([ sys.executable, "-m", "pip", "install", @@ -915,7 +954,7 @@ def is_server_running(folder_name: str) -> bool: import subprocess if platform.system() == "Windows": try: - output = subprocess.check_output(f'tasklist /FI "PID eq {pid}" /NH', shell=True, stderr=subprocess.STDOUT).decode() + output = subprocess.check_output(f"tasklist /FI \"PID eq {pid}\" /NH", shell=True, stderr=subprocess.STDOUT).decode() if "No tasks are running" in output: pid_file.unlink(missing_ok=True) return False @@ -929,7 +968,7 @@ def is_server_running(folder_name: str) -> bool: except OSError: pid_file.unlink(missing_ok=True) return False - + try: output = subprocess.check_output(["ps", "-p", str(pid), "-o", "command="], stderr=subprocess.STDOUT).decode().lower() if "onionshare" in output or "python" in output or "tor" in output: @@ -972,15 +1011,15 @@ def manage_servers(): from InquirerPy import inquirer from InquirerPy.base.control import Choice console = Console() - + while True: servers = get_servers() - + choices = [] for s in servers: running = is_server_running(s) status_text = "[ON] " if running else "[OFF]" - + label = f"{status_text} {s}" if running: try: @@ -991,7 +1030,7 @@ def manage_servers(): except Exception: pass choices.append(Choice(s, label)) - + choices.insert(0, Choice("create_new", t("cli.manage_create_new"))) if servers: choices.append(Choice("start_all", t("cli.manage_start_all"))) @@ -999,23 +1038,34 @@ def manage_servers(): choices.append(Choice("export_all", t("cli.manage_export_all"))) choices.append(Choice("import_multiple", t("cli.manage_import_multiple"))) choices.append(Choice(None, t("cli.manage_exit"))) - + selected = inquirer.select( message=t("cli.manage_select_server"), choices=choices ).execute() - + if selected is None: break - + if selected == "create_new": config_path = ROOT / "src" / "config.json" - interactive_update(str(config_path)) - build_assets(str(config_path)) + # Reset config from template for a fresh start try: + template_config = _template_res("voxvera", "config.json") + with resources.as_file(template_config) as tc: + shutil.copy(tc, config_path) + except Exception as e: + console.print(f"[yellow]Warning: Could not reset config from template: {e}[/yellow]") + + try: + interactive_update(str(config_path)) + build_assets(str(config_path)) serve(str(config_path)) - except SystemExit: - pass + except (KeyboardInterrupt, Exception) as e: + if not isinstance(e, KeyboardInterrupt): + console.print(f"[red]Error creating site: {e}[/red]") + else: + console.print("\n[yellow]Site creation cancelled.[/yellow]") continue if selected == "start_all": @@ -1029,7 +1079,7 @@ def manage_servers(): results.append((s, url)) except Exception as e: console.print(f"[red]{t('cli.manage_startup_summary')}: {e}[/red]") - + if results: console.rule(t("cli.manage_startup_summary")) for s, url in results: @@ -1042,15 +1092,15 @@ def manage_servers(): if is_server_running(s): stop_server(s) continue - + if selected == "export_all": export_all_sites() continue - + if selected == "import_multiple": import_multiple_sites() continue - + running = is_server_running(selected) action_choices = [ Choice("toggle", t("cli.manage_action_toggle_stop") if running else t("cli.manage_action_toggle_start")), @@ -1058,12 +1108,12 @@ def manage_servers(): Choice("delete", t("cli.manage_action_delete")), Choice(None, t("cli.manage_action_back")) ] - + action = inquirer.select( message=t("cli.manage_action_menu", name=selected), choices=action_choices ).execute() - + if action == "toggle": if running: stop_server(selected) @@ -1086,7 +1136,7 @@ def choose_language(current_lang: str = None) -> str: # List available locales locale_files = sorted(glob.glob(str(ROOT / "locales" / "*.json"))) choices = [] - + # Use fallback if no locales folder (e.g. first run/dev) if not locale_files: return "en" @@ -1148,7 +1198,7 @@ def main(argv=None): p_export.add_argument("--output", help="Custom output path for the zip") sub.add_parser("export-all", help="Export all sites and their keys to ~/voxvera-exports") - + p_import = sub.add_parser("import", help="Import a site and its keys from a zip archive") p_import.add_argument("zip_path", help="Path to the exported zip file") @@ -1191,7 +1241,7 @@ def main(argv=None): if config_path.exists(): config_data["lang"] = current_lang save_config(config_data, str(config_path)) - + # Load the locale load_locale(current_lang or "en") diff --git a/voxvera/host/voxvera/config.json b/voxvera/host/voxvera/config.json index 9d93b4a..e6f1f8a 100644 --- a/voxvera/host/voxvera/config.json +++ b/voxvera/host/voxvera/config.json @@ -2,7 +2,7 @@ "name": "Vox Vera Printable Flyers", "folder_name": "voxvera", "title": "TOP SECRET", - "subtitle": "DO NOT DISTRIBUTE", + "subtitle": "DO ~~NOT~~ DISTRIBUTE", "headline": "OPERATION VOX VERA", "content": "Break free from censorship with VoxVera. An anonymous guerrilla marketing and message-spreading tool. Whether online or in the physical world, it can empower you to spread your ideas boldly, shielded by complete anonymity (if you host over Tor). Download the code, design a flyer site, host it online and amplify your message. \n\nUse memetic power to share your ideas in your school, workplace, online communities, or even globally. VoxVera ensures your message resonates far and wide, with tear-off sections featuring unique URLs and QR codes for easy reprinting. \n\nPrivacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.\n\nJoin us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.\n", "url_message": "Follow this link to learn more. Use Tor Browser.", diff --git a/voxvera/locales/ar.json b/voxvera/locales/ar.json index c747316..dea2d72 100644 --- a/voxvera/locales/ar.json +++ b/voxvera/locales/ar.json @@ -80,7 +80,12 @@ "tear_off_footer": "انقر فوق الزر أدناه للطباعة", "built_with": "بني بواسطة", "print_button": "اطبع المنشور", - "download_button": "تحميل الأداة والكود" + "download_button": "تحميل الأداة والكود", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "سري للغاية", @@ -89,4 +94,4 @@ "content": "تحرر من الرقابة مع VoxVera. أداة تسويق عصابات مجهولة ونشر رسائل. سواء عبر الإنترنت أو في العالم المادي، يمكنها تمكينك من نشر أفكارك بجرأة، محمية بإخفاء الهوية الكامل (إذا كنت تستضيف عبر Tor). قم بتحميل الكود، وصمم موقع منشور، واستضيفه عبر الإنترنت وقم بتضخيم رسالتك.\n\nاستخدم القوة الميمية لمشاركة أفكارك في مدرستك، أو مكان عملك، أو مجتمعاتك عبر الإنترنت، أو حتى على مستوى العالم. تضمن VoxVera تردد صدى رسالتك بعيداً وعلى نطاق واسع، مع أقسام قابلة للنزع تتميز بروابط فريدة وأكواد QR لسهولة إعادة الطباعة.\n\nيمكن الحفاظ على الخصوصية. يمكن مشاركة المنشورات عبر شبكة Tor، مما يحمي المضيف والمستخدمين من الرقابة.\n\nانضم إلينا في ثورة تقدر الحقيقة والشفافية. معاً، يمكننا بناء شبكة من المواطنين المستنيرين الذين لا يخشون التحدث.", "url_message": "احصل على VoxVera وابدأ بنشر رسالتك." } -} +} \ No newline at end of file diff --git a/voxvera/locales/de.json b/voxvera/locales/de.json index 90223a4..5aed980 100644 --- a/voxvera/locales/de.json +++ b/voxvera/locales/de.json @@ -79,7 +79,12 @@ "tear_off_footer": "Klicken Sie auf die Schaltfläche unten zum Drucken", "built_with": "erstellt mit", "print_button": "Flyer drucken", - "download_button": "Tool & Quellcode herunterladen" + "download_button": "Tool & Quellcode herunterladen", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "STRENG GEHEIM", @@ -88,4 +93,4 @@ "content": "Befreien Sie sich von Zensur mit VoxVera. Ein anonymes Guerilla-Marketing- und Nachrichtenverbreitungs-Tool. Ob online oder in der physischen Welt, es befähigt Sie, Ihre Ideen mutig zu verbreiten, geschützt durch vollständige Anonymität (wenn Sie über Tor hosten). Laden Sie den Code herunter, entwerfen Sie eine Flyer-Website, hosten Sie diese online und verstärken Sie Ihre Botschaft.\n\nNutzen Sie memetische Kraft, um Ihre Ideen in Ihrer Schule, an Ihrem Arbeitsplatz, in Online-Communities oder sogar weltweit zu teilen. VoxVera stellt sicher, dass Ihre Botschaft weit und breit Resonanz findet, mit Abreißabschnitten, die über einzigartige URLs und QR-Codes für einen einfachen Nachdruck verfügen.\n\nPrivatsphäre kann gewahrt bleiben. Flyer können über das Tor-Network geteilt werden, was Hoster und Nutzer vor Zensur schützt.\n\nSchließen Sie sich uns in einer Revolution an, die Wahrheit und Transparenz schätzt. Gemeinsam können wir ein Netzwerk informierter Bürger aufbauen, die keine Angst haben, ihre Meinung zu sagen.", "url_message": "Holen Sie sich VoxVera und beginnen Sie, Ihre Nachricht zu verbreiten." } -} +} \ No newline at end of file diff --git a/voxvera/locales/es.json b/voxvera/locales/es.json index 050a5bf..e8b8bd6 100644 --- a/voxvera/locales/es.json +++ b/voxvera/locales/es.json @@ -79,7 +79,12 @@ "tear_off_footer": "haga clic en el botón de abajo para imprimir", "built_with": "construido con", "print_button": "Imprimir volante", - "download_button": "Descargar Herramienta y Código" + "download_button": "Descargar Herramienta y Código", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "ALTO SECRETO", @@ -88,4 +93,4 @@ "content": "Libérese de la censura con VoxVera. Una herramienta anónima de marketing de guerrilla y difusión de mensajes. Ya sea en línea o en el mundo físico, puede empoderarlo para difundir sus ideas con audacia, protegido por un anonimato completo (si hospeda a través de Tor). Descargue el código, diseñe un sitio de volantes, hospédelo en línea y amplifique su mensaje.\n\nUse el poder memético para compartir sus ideas en su escuela, lugar de trabajo, comunidades en línea o incluso globalmente. VoxVera asegura que su mensaje resuene a lo largo und ancho, con secciones desprendibles que cuentan con URLs y códigos QR únicos para una fácil reimpresión.\n\nLa privacidad puede mantenerse. Los volantes se pueden compartir a través de la red Tor, protegiendo al anfitrión y a los usuarios de la censura.\n\nÚnase a nosotros en una revolución que valora la verdad y la transparencia. Juntos, podemos construir una red de ciudadanos informados que no temen hablar.", "url_message": "Obtenga VoxVera y comience a difundir su mensaje." } -} +} \ No newline at end of file diff --git a/voxvera/locales/fa.json b/voxvera/locales/fa.json index 01b379d..efec98a 100644 --- a/voxvera/locales/fa.json +++ b/voxvera/locales/fa.json @@ -80,7 +80,12 @@ "tear_off_footer": "برای چاپ روی دکمه زیر کلیک کنید", "built_with": "ساخته شده با", "print_button": "چاپ اعلامیه", - "download_button": "دانلود ابزار و کد منبع" + "download_button": "دانلود ابزار و کد منبع", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "به‌کلی محرمانه", @@ -89,4 +94,4 @@ "content": "با VoxVera از بند سانسور رها شوید. ابزاری ناشناس برای بازاریابی چریکی و گسترش پیام. چه در فضای مجازی و چه در دنیای فیزیکی، این ابزار می‌تواند شما را برای گسترش جسورانه ایده‌هایتان توانمند کند، در حالی که توسط ناشناسی کامل محافظت می‌شوید (اگر از طریق Tor میزبانی کنید). کد را دانلود کنید، یک سایت اعلامیه طراحی کنید، آن را آنلاین میزبانی کنید و صدای خود را تقویت کنید.\n\nاز قدرت میم‌ها برای به اشتراک گذاشتن ایده‌های خود در مدرسه، محل کار، انجمن‌های آنلاین یا حتی در سطح جهانی استفاده کنید. VoxVera تضمین می‌کند که پیام شما در دوردست‌ها طنین‌انداز شود، با بخش‌های جداشونده دارای URLهای منحصر به فرد و کدهای QR برای چاپ مجدد آسان.\n\nحریم خصوصی می‌تواند حفظ شود. اعلامیه‌ها را می‌توان از طریق شبکه Tor به اشتراک گذاشت و از میزبان و کاربران در برابر سانسور محافظت کرد.\n\nدر انقلابی که برای حقیقت و شفافیت ارزش قائل است به ما بپیوندید. با هم، می‌توانیم شبکه‌ای از شهروندان آگاه بسازیم که از سخن گفتن نمی‌هراسند.", "url_message": "VoxVera را دریافت کنید و گسترش پیام خود را آغاز کنید." } -} +} \ No newline at end of file diff --git a/voxvera/locales/fr.json b/voxvera/locales/fr.json index f0c5df8..7e54a51 100644 --- a/voxvera/locales/fr.json +++ b/voxvera/locales/fr.json @@ -80,7 +80,12 @@ "tear_off_footer": "cliquez sur le bouton ci-dessous pour imprimer", "built_with": "créé avec", "print_button": "Imprimer le flyer", - "download_button": "Télécharger l'outil et le code" + "download_button": "Télécharger l'outil et le code", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "TOP SECRET", @@ -89,4 +94,4 @@ "content": "Libérez-vous de la censure avec VoxVera. Un outil de marketing de guérilla anonyme et de diffusion de messages. Que ce soit en ligne ou dans le monde physique, il peut vous donner le pouvoir de diffuser vos idées avec audace, à l'abri d'un anonymat complet (si vous hébergez via Tor). Téléchargez le code, concevez un site de flyers, hébergez-le en ligne et amplifiez votre message.\n\nUtilisez le pouvoir mémétique pour partager vos idées à l'école, au travail, dans les communautés en ligne ou même à l'échelle mondiale. VoxVera garantit que votre message résonne partout, avec des sections détachables comportant des URL uniques et des codes QR pour une réimpression facile.\n\nLa vie privée peut être préservée. Les flyers peuvent être partagés via le réseau Tor, protégeant l'hébergeur et les utilisateurs de la censure.\n\nRejoignez-nous dans une révolution qui valorise la vérité et la transparence. Ensemble, nous pouvons construire un réseau de citoyens informés qui n'ont pas peur de s'exprimer.", "url_message": "Obtenez VoxVera et commencez à diffuser votre message." } -} +} \ No newline at end of file diff --git a/voxvera/locales/he.json b/voxvera/locales/he.json index 17bc2a5..dfdba73 100644 --- a/voxvera/locales/he.json +++ b/voxvera/locales/he.json @@ -80,7 +80,12 @@ "tear_off_footer": "לחץ על הכפתור למטה להדפסה", "built_with": "נבנה עם", "print_button": "הדפס פלייר", - "download_button": "הורד כלי וקוד מקור" + "download_button": "הורד כלי וקוד מקור", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "סודי ביותר", @@ -89,4 +94,4 @@ "content": "השתחרר מהצנזורה עם VoxVera. כלי אנונימי לשיווק גרילה והפצת מסרים. בין אם באינטרנט ובין אם בעולם הפיזי, הוא יכול להעצים אותך להפיץ את הרעיונות שלך בתעוזה, מוגן באנונימיות מלאה (אם אתה מארח דרך Tor). הורד את הקוד, עצב אתר פלייר, ארח אותו אונליין והגבר את המסר שלך.\n\nהשתמש בכוח הממטי כדי לשתף את הרעיונות שלך בבית הספר, במקום העבודה, בקהילות מקוונות או אפילו ברמה עולמית. VoxVera מבטיחה שהמסר שלך יהדהד למרחקים, עם חלקים נתלשים הכוללים כתובות URL ייחודיות וקודי QR להדפסה חוזרת קלה.\n\nניתן לשמור על פרטיות. ניתן לשתף פליירים דרך רשת Tor, ובכך להגן על המארח ועל המשתמשים מפני צנזורה.\n\nהצטרפו אלינו למהפכה שמעריכה אמת ושקיפות. יחד, נוכל לבנות רשת של אזרחים מושכלים שאינם פוחדים להתבטא.", "url_message": "קבלו את VoxVera והתחילו להפיץ את המסר שלכם." } -} +} \ No newline at end of file diff --git a/voxvera/locales/hi.json b/voxvera/locales/hi.json index c63a3d5..9a77918 100644 --- a/voxvera/locales/hi.json +++ b/voxvera/locales/hi.json @@ -80,7 +80,12 @@ "tear_off_footer": "प्रिंट करने के लिए नीचे दिए गए बटन पर क्लिक करें", "built_with": "बनाया गया", "print_button": "फ्लायर प्रिंट करें", - "download_button": "टूल और कोड डाउनलोड करें" + "download_button": "टूल और कोड डाउनलोड करें", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "अति गोपनीय", @@ -89,4 +94,4 @@ "content": "VoxVera के साथ सेंसरशिप से मुक्त हों। एक गुमनाम गुरिल्ला मार्केटिंग और संदेश फैलाने वाला टूल। चाहे ऑनलाइन हो या भौतिक दुनिया में, यह आपको पूर्ण गुमनामी (यदि आप Tor पर होस्ट करते हैं) द्वारा सुरक्षित रहते हुए अपने विचारों को साहसपूर्वक फैलाने का अधिकार दे सकता है। कोड डाउनलोड करें, एक फ्लायर साइट डिज़ाइन करें, इसे ऑनलाइन होस्ट करें और अपने संदेश को बढ़ाएं।\n\nअपने विचारों को अपने स्कूल, कार्यस्थल, ऑनलाइन समुदायों या विश्व स्तर पर साझा करने के लिए मेमेटिक शक्ति का उपयोग करें। VoxVera यह सुनिश्चित करता है कि आपका संदेश दूर-दूर तक गूंजे, जिसमें आसान पुनर्मुद्रण के लिए अद्वितीय URL और QR कोड वाले टियर-ऑफ सेक्शन हैं।\n\nगोपनीयता बनाए रखी जा सकती है। फ्लायर्स को Tor नेटवर्क के माध्यम से साझा किया जा सकता है, जिससे होस्ट और उपयोगकर्ताओं को सेंसरशिप से बचाया जा सकता है।\n\nएक ऐसी क्रांति में हमारे साथ जुड़ें जो सच्चाई और पारदर्शिता को महत्व देती है। साथ मिलकर, हम उन सूचित नागरिकों का एक नेटवर्क बना सकते हैं जो बोलने से नहीं डरते।", "url_message": "VoxVera प्राप्त करें और अपना संदेश फैलाना शुरू करें।" } -} +} \ No newline at end of file diff --git a/voxvera/locales/ja.json b/voxvera/locales/ja.json index a26ac1a..5ce7df7 100644 --- a/voxvera/locales/ja.json +++ b/voxvera/locales/ja.json @@ -80,7 +80,12 @@ "tear_off_footer": "下のボタンをクリックして印刷してください", "built_with": "built with", "print_button": "フライヤーを印刷", - "download_button": "ツールとソースをダウンロード" + "download_button": "ツールとソースをダウンロード", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "極秘事項", @@ -89,4 +94,4 @@ "content": "VoxVeraで検閲から解放されましょう。これは、匿名のゲリラマーケティングおよびメッセージ拡散ツールです。オンラインでも物理的な世界でも、Torを介したホスティングによって完全な匿名性に守られながら、自分の考えを大胆に広めることができます。コードをダウンロードし、フライヤーサイトをデザインし、オンラインで公開して、あなたのメッセージを増幅させてください。\n\nミームの力を利用して、学校、職場、オンラインコミュニティ、あるいは世界中にあなたのアイデアを共有しましょう。VoxVeraは、再印刷が簡単な独自のURLとQRコードを備えた切り取りセクションにより、あなたのメッセージが広く遠くまで響くことを保証します。\n\nプライバシーは維持されます。フライヤーはTorネットワークを介して共有でき、ホスト側とユーザー側の両方を検閲から守ります。\n\n真実と透明性を尊重する革命に加わりましょう。共に、声を上げることを恐れない、知識豊富な市民のネットワークを構築しましょう。", "url_message": "VoxVeraを入手して、メッセージの拡散を始めましょう。" } -} +} \ No newline at end of file diff --git a/voxvera/locales/pt.json b/voxvera/locales/pt.json index b081597..1ba1cc0 100644 --- a/voxvera/locales/pt.json +++ b/voxvera/locales/pt.json @@ -80,7 +80,12 @@ "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" + "download_button": "Baixar Ferramenta e Código", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "ALTO SECRETO", @@ -89,4 +94,4 @@ "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." } -} +} \ No newline at end of file diff --git a/voxvera/locales/ru.json b/voxvera/locales/ru.json index 3ab42a1..a7eccd8 100644 --- a/voxvera/locales/ru.json +++ b/voxvera/locales/ru.json @@ -80,7 +80,12 @@ "tear_off_footer": "нажмите кнопку ниже, чтобы распечатать", "built_with": "создано с помощью", "print_button": "Печать листовки", - "download_button": "Скачать инструмент и код" + "download_button": "Скачать инструмент и код", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "СОВЕРШЕННО СЕКРЕТНО", @@ -89,4 +94,4 @@ "content": "Освободитесь от цензуры с помощью VoxVera. Анонимный инструмент для партизанского маркетинга и распространения сообщений. Будь то в сети или в физическом мире, он дает вам возможность смело распространять свои идеи, будучи защищенным полной анонимностью (при хостинге через Tor). Скачайте код, создайте сайт-листовку, разместите его в сети и усильте свой голос.\n\nИспользуйте силу мемов, чтобы поделиться своими идеями в школе, на работе, в онлайн-сообществах или даже по всему миру. VoxVera гарантирует, что ваше сообщение найдет отклик повсюду, благодаря отрывным разделам с уникальными URL-адресами и QR-кодами для легкой перепечатки.\n\nКонфиденциальность может быть сохранена. Листовками можно делиться через сеть Tor, защищая хостера и пользователей от цензуры.\n\nПрисоединяйтесь к нам в революции, которая ценит правду и прозрачность. Вместе мы сможем построить сеть информированных граждан, которые не боятся высказываться.", "url_message": "Получите VoxVera и начните распространять свое сообщение." } -} +} \ No newline at end of file diff --git a/voxvera/locales/sw.json b/voxvera/locales/sw.json index 2812698..c95babf 100644 --- a/voxvera/locales/sw.json +++ b/voxvera/locales/sw.json @@ -80,7 +80,12 @@ "tear_off_footer": "bonyeza kitufe hapa chini ili kuchapisha", "built_with": "imejengwa na", "print_button": "Chapa Kipeperushi", - "download_button": "Pakua Zana na Chanzo" + "download_button": "Pakua Zana na Chanzo", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "SIRI KUBWA", @@ -89,4 +94,4 @@ "content": "Jikomboe kutoka kwa udhibiti ukitumia VoxVera. Zana isiyojulikana ya uuzaji wa mshituko na kueneza ujumbe. Iwe mtandaoni au katika ulimwengu wa kimwili, inaweza kukuwezesha kueneza mawazo yako kwa ujasiri, ukilindwa na kutokujulikana kabisa (ikiwa unahifadhi kupitia Tor). Pakua nambari ya siri, tengeneza tovuti ya kipeperushi, ihifadhi mtandaoni na uimarishe ujumbe wako.\n\nTumia nguvu ya meme kushiriki mawazo yako katika shule yako, mahali pa kazi, jumuiya za mtandaoni, au hata duniani kote. VoxVera inahakikisha ujumbe wako unavuma mbali na kote, kukiwa na sehemu zinazoweza kutolewa zenye URL za kipekee na QR codes kwa uchapishaji rahisi.\n\nFaragha inaweza kudumishwa. Vipengele vinaweza kushirikiwa kupitia mtandao wa Tor, kumlinda mhudumu na watumiaji dhidi ya udhibiti.\n\nJiunge nasi katika mapinduzi yanayothamini ukweli na uwazi. Kwa pamoja, tunaweza kujenga mtandao wa raia wenye ufahamu ambao hawaogopi kuzungumza.", "url_message": "Pata VoxVera na uanze kueneza ujumbe wako." } -} +} \ No newline at end of file diff --git a/voxvera/locales/tr.json b/voxvera/locales/tr.json index ec86528..63c71e0 100644 --- a/voxvera/locales/tr.json +++ b/voxvera/locales/tr.json @@ -80,7 +80,12 @@ "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" + "download_button": "Aracı ve Kaynak Kodunu İndir", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "ÇOK GİZLİ", @@ -89,4 +94,4 @@ "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." } -} +} \ No newline at end of file diff --git a/voxvera/locales/zh.json b/voxvera/locales/zh.json index 793ec9d..6baf0ec 100644 --- a/voxvera/locales/zh.json +++ b/voxvera/locales/zh.json @@ -80,7 +80,12 @@ "tear_off_footer": "点击下方按钮进行打印", "built_with": "构建自", "print_button": "打印传单", - "download_button": "下载工具与源码" + "download_button": "下载工具与源码", + "dl_portable": "Portable (Source + Dependencies)", + "dl_linux": "Linux Standalone", + "dl_windows": "Windows Standalone (.exe)", + "dl_macos": "macOS Standalone", + "dl_source": "Source Code Only (.zip)" }, "landing": { "title": "绝密", @@ -89,4 +94,4 @@ "content": "使用 VoxVera 摆脱审查。一个匿名的游击营销和消息传播工具。无论是线上还是在现实世界中,它都能赋予你大胆传播想法的力量,并受到完全匿名的保护(如果你通过 Tor 托管)。下载代码,设计传单站点,将其托管在网上并放大你的声音。\n\n利用模因的力量在你的学校、工作场所、在线社区甚至全球范围内分享你的想法。VoxVera 通过带有独特 URL 和 QR 码的可撕下部分确保你的消息产生深远共鸣,方便再次打印。\n\n隐私可以得到维护。传单可以通过 Tor 网络共享,保护托管者和用户免受审查。\n\n加入我们这场重视真相和透明度的革命。齐心协力,我们可以建立一个不惧怕发声的知情公民网络。", "url_message": "获取 VoxVera 并开始传播你的消息。" } -} +} \ No newline at end of file diff --git a/voxvera/templates/voxvera/config.json b/voxvera/templates/voxvera/config.json index 27b9a47..3267fa2 100644 --- a/voxvera/templates/voxvera/config.json +++ b/voxvera/templates/voxvera/config.json @@ -2,7 +2,7 @@ "name": "Vox Vera Printable Flyers", "folder_name": "voxvera", "title": "TOP SECRET", - "subtitle": "DO NOT DISTRIBUTE", + "subtitle": "DO ~~NOT~~ DISTRIBUTE", "headline": "OPERATION VOX VERA", "content": "Break free from censorship with VoxVera. An anonymous guerrilla marketing and message-spreading tool. Whether online or in the physical world, it can empower you to spread your ideas boldly, shielded by complete anonymity (if you host over Tor). Download the code, design a flyer site, host it online and amplify your message.\\n\\nUse memetic power to share your ideas in your school, workplace, online communities, or even globally. VoxVera ensures your message resonates far and wide, with tear-off sections featuring unique URLs and QR codes for easy reprinting.\\n\\nPrivacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.\\n\\nJoin us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.\n", "url_message": "Follow this link to learn more. Use Tor Browser.",