mirror of
https://github.com/PR0M3TH3AN/VoxVera.git
synced 2026-10-27 17:50:42 +00:00
Compare commits
No files matched your search
@@ -37,6 +37,7 @@ Run the following commands to verify your changes:
|
||||
- **Dependencies**: if you add a new Python library to `requirements.txt`, you MUST run `voxvera vendorize` to include it in the portable distribution.
|
||||
- **Layout Integrity**: VoxVera uses visual width validation. If you add new UI elements, ensure they respect the physical boundaries of an 8.5"x11" flyer.
|
||||
- **Tests**: Ensure all tests pass: `pytest tests/`. Run the integrity suite specifically when modifying locales: `pytest tests/test_integrity.py`.
|
||||
- **Recommended local check**: Run `bash scripts/check.sh` before opening a PR. It mirrors the main lint/test/build checks in one command.
|
||||
- **Style**: Follow the existing coding style (PEP 8 for Python).
|
||||
- **Documentation**: If adding a new feature, update the master templates in `docs/templates/` and run `voxvera build-docs`.
|
||||
|
||||
|
||||
@@ -30,6 +30,13 @@ pip install .
|
||||
voxvera vendorize # Optional: pull dependencies locally for offline use
|
||||
```
|
||||
|
||||
### 5. Local Validation
|
||||
Run the full local validation sweep with:
|
||||
```bash
|
||||
bash scripts/check.sh
|
||||
```
|
||||
This runs linting, Python tests, Electron smoke tests, dependency checks, and the docs/site rebuild steps used during development.
|
||||
|
||||
---
|
||||
|
||||
## Key Features
|
||||
|
||||
+13
-4
@@ -15,9 +15,12 @@ echo "Starting E2E verification at $(date)"
|
||||
if [ -n "${VOXVERA_BIN:-}" ] && [ -f "$VOXVERA_BIN" ]; then
|
||||
voxvera_cmd="$VOXVERA_BIN"
|
||||
echo "Using provided VoxVera binary: $voxvera_cmd" >&2
|
||||
elif command -v voxvera >/dev/null 2>&1; then
|
||||
voxvera_cmd="$(command -v voxvera)"
|
||||
echo "Using existing VoxVera on PATH: $voxvera_cmd" >&2
|
||||
else
|
||||
echo "Installing VoxVera in editable mode..."
|
||||
python3 -m pip install --break-system-packages -e ".[e2e]"
|
||||
python3 -m pip install --break-system-packages --no-build-isolation -e ".[e2e]"
|
||||
voxvera_cmd="$(command -v voxvera || echo "$HOME/.local/bin/voxvera")"
|
||||
fi
|
||||
|
||||
@@ -30,16 +33,22 @@ DemoUser
|
||||
voxvera
|
||||
EOI
|
||||
|
||||
config_path="$HOME/host/voxvera/config.json"
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "CRITICAL: Expected config file not found after init: $config_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Building demo flyer..."
|
||||
"$voxvera_cmd" --lang en build
|
||||
"$voxvera_cmd" --lang en --config "$config_path" build
|
||||
|
||||
# Verify build output exists in host/
|
||||
folder_name="voxvera"
|
||||
host_dir="voxvera/host/$folder_name"
|
||||
host_dir="$HOME/host/$folder_name"
|
||||
|
||||
if [ ! -d "$host_dir" ]; then
|
||||
echo "CRITICAL: Host directory $host_dir not found!" >&2
|
||||
ls -R voxvera/host/ || true
|
||||
ls -R "$HOME/host/" || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
+10
-5
@@ -4,6 +4,7 @@ const path = require('path');
|
||||
const which = require('which');
|
||||
const fs = require('fs');
|
||||
const { launchTor } = require('./tor.js');
|
||||
const { extractOnionUrl } = require('./runtime-utils');
|
||||
|
||||
let mainWindow;
|
||||
let onionProc;
|
||||
@@ -74,8 +75,12 @@ async function runServe (retry = false) {
|
||||
|
||||
onionProc.stdout.on('data', buf => {
|
||||
const line = buf.toString();
|
||||
const m = line.match(/OnionShare is hosting at (http.*\.onion)/);
|
||||
if (m) { gotURL = true; clearTimeout(softTimeout); }
|
||||
const onionUrl = extractOnionUrl(line);
|
||||
if (onionUrl) {
|
||||
gotURL = true;
|
||||
clearTimeout(softTimeout);
|
||||
mainWindow.webContents.send('onion-url', onionUrl);
|
||||
}
|
||||
mainWindow.webContents.send('log', { text: line });
|
||||
});
|
||||
|
||||
@@ -134,9 +139,9 @@ ipcMain.handle('run-quickstart', async (_, config) => {
|
||||
if (mainWindow) {
|
||||
mainWindow.webContents.send('log', { text: line, isError: false });
|
||||
}
|
||||
const m = line.match(/Onion URL:\s*(https?:\/\/[a-z0-9.-]+\.onion)/i);
|
||||
if (m && mainWindow) {
|
||||
mainWindow.webContents.send('onion-url', m[1]);
|
||||
const onionUrl = extractOnionUrl(line);
|
||||
if (onionUrl && mainWindow) {
|
||||
mainWindow.webContents.send('onion-url', onionUrl);
|
||||
}
|
||||
});
|
||||
proc.stderr.on('data', data => {
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"lint": "echo 'lint pass'"
|
||||
"lint": "echo 'lint pass'",
|
||||
"test": "node --test runtime-utils.test.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^29.0.0",
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
function extractOnionUrl(line) {
|
||||
const match = line.match(/Onion URL:\s*(https?:\/\/[a-z0-9.-]+\.onion)/i)
|
||||
|| line.match(/OnionShare is hosting at\s*(https?:\/\/[a-z0-9.-]+\.onion)/i);
|
||||
return match ? match[1] : null;
|
||||
}
|
||||
|
||||
function platformDirName(platform = process.platform) {
|
||||
if (platform === 'win32') return 'win';
|
||||
if (platform === 'darwin') return 'mac';
|
||||
return 'linux';
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
extractOnionUrl,
|
||||
platformDirName,
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
|
||||
const { extractOnionUrl, platformDirName } = require('./runtime-utils');
|
||||
|
||||
test('extractOnionUrl handles current CLI output', () => {
|
||||
assert.equal(
|
||||
extractOnionUrl('[voxvera] Onion URL: http://test123.onion'),
|
||||
'http://test123.onion'
|
||||
);
|
||||
});
|
||||
|
||||
test('extractOnionUrl handles legacy OnionShare output', () => {
|
||||
assert.equal(
|
||||
extractOnionUrl('OnionShare is hosting at http://legacy456.onion'),
|
||||
'http://legacy456.onion'
|
||||
);
|
||||
});
|
||||
|
||||
test('extractOnionUrl returns null when no onion URL is present', () => {
|
||||
assert.equal(extractOnionUrl('still bootstrapping'), null);
|
||||
});
|
||||
|
||||
test('platformDirName maps bundled resource folders correctly', () => {
|
||||
assert.equal(platformDirName('linux'), 'linux');
|
||||
assert.equal(platformDirName('darwin'), 'mac');
|
||||
assert.equal(platformDirName('win32'), 'win');
|
||||
});
|
||||
+4
-2
@@ -3,14 +3,16 @@ const path = require('path');
|
||||
const fs = require('fs');
|
||||
const which = require('which');
|
||||
const getPort = (...args) => import('get-port').then(m => m.default(...args));
|
||||
const { platformDirName } = require('./runtime-utils');
|
||||
|
||||
async function launchTor() {
|
||||
const socks = await getPort();
|
||||
const control = await getPort();
|
||||
const torBase = path.join(__dirname, '..', '..', 'voxvera', 'resources', 'tor');
|
||||
let exe = path.join(torBase, process.platform,
|
||||
const platformDir = platformDirName(process.platform);
|
||||
let exe = path.join(torBase, platformDir,
|
||||
process.platform === 'win32' ? 'tor.exe' : 'tor');
|
||||
let obfs4 = path.join(torBase, process.platform,
|
||||
let obfs4 = path.join(torBase, platformDir,
|
||||
process.platform === 'win32' ? 'obfs4proxy.exe' : 'obfs4proxy');
|
||||
|
||||
const missing = p => {
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
"title": "ANDROID UNLEASHED",
|
||||
"subtitle": "WITHOUT BOUNDARIES",
|
||||
"headline": "OPEN-SOURCE FREEDOM",
|
||||
"content": "The Android Open Source Project (AOSP) represents the essence of what Android was originally intended to be: an open, transparent, and adaptable platform. It strips away the layers of proprietary software and corporate oversight that have become synonymous with mainstream Android distributions. With AOSP, you gain access to a raw, unfiltered version of Android, allowing you to truly make your device your own.\n\nFor developers, AOSP offers a playground of possibilities, where the only limits are your skills and imagination. It serves as the foundation for countless custom ROMs, each tailored to specific needs, whether for enhanced performance, privacy, or unique features that mainstream versions lack. Privacy enthusiasts will appreciate the absence of pre-installed bloatware and tracking services that often come wit stock Android, providing a cleaner, more secure user experience.\n\nAOSP isn't just for developers or tech enthusiasts; it's for anyone who values digital freedom. It allows you to reclaim control over your device, tailoring it to your needs without the restrictions of carriers or manufacturers. Discover how AOSP can transform your mobile experience. Start your journey towards a more open, customizable future today.",
|
||||
"content": "The Android Open Source Project (AOSP) represents the essence of what Android was originally intended to be: an open, transparent, and adaptable platform. It strips away the layers of proprietary software and corporate oversight that have become synonymous with mainstream Android distributions. With AOSP, you gain access to a raw, unfiltered version of Android, allowing you to truly make your device your own.<br><br>For developers, AOSP offers a playground of possibilities, where the only limits are your skills and imagination. It serves as the foundation for countless custom ROMs, each tailored to specific needs, whether for enhanced performance, privacy, or unique features that mainstream versions lack. Privacy enthusiasts will appreciate the absence of pre-installed bloatware and tracking services that often come wit stock Android, providing a cleaner, more secure user experience.<br><br>AOSP isn't just for developers or tech enthusiasts; it's for anyone who values digital freedom. It allows you to reclaim control over your device, tailoring it to your needs without the restrictions of carriers or manufacturers. Discover how AOSP can transform your mobile experience. Start your journey towards a more open, customizable future today.",
|
||||
"url_message": "Visit the link below to learn more.",
|
||||
"url": "https://source.android.com",
|
||||
"tear_off_link": "http://aosp.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "Bitcoin Revolution Flyers",
|
||||
"folder_name": "bitcoin",
|
||||
"title": "THE FUTURE OF MONEY",
|
||||
"title": "RULES WITHOUT RULERS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE BITCOIN REVOLUTION",
|
||||
"content": "What is Bitcoin? It's more than just digital money; it's a revolutionary technology designed to fix some of the world's most pressing problems. Bitcoin operates on a decentralized network, free from the control of any government or central authority. This ensures that no one can manipulate its supply or value, making it a sound form of money that protects your wealth from inflation.\n\nOur current financial system is built on flawed incentives—encouraging debt, dependency, and centralization of power. Bitcoin changes that by creating a system where honesty, transparency, and individual responsibility are rewarded. In the Bitcoin network, there is no room for corruption or manipulation because the rules are enforced by mathematics, not by people.\n\nBitcoin aligns incentives in a way that promotes long-term thinking, savings, and innovation. It empowers individuals to take control of their financial future, fostering a global community where value can be transferred freely and securely without intermediaries. This is why we need Bitcoin—because it creates a world where incentives are properly aligned, leading to a more fair and prosperous society for all.\n\nTake the step to learn more about Bitcoin and how it can transform not just your financial life, but the world. Tear off a link to the left and explore this groundbreaking technology. Join the movement towards a better future.",
|
||||
"content": "What is Bitcoin? It's more than just digital money; it's a revolutionary technology designed to fix some of the world's most pressing problems. Bitcoin operates on a decentralized network, free from the control of any government or central authority. This ensures that no one can manipulate its supply or value, making it a sound form of money that protects your wealth from inflation.<br><br>Our current financial system is built on flawed incentives—encouraging debt, dependency, and centralization of power. Bitcoin changes that by creating a system where honesty, transparency, and individual responsibility are rewarded. In the Bitcoin network, there is no room for corruption or manipulation because the rules are enforced by mathematics, not by people.<br><br>Bitcoin aligns incentives in a way that promotes long-term thinking, savings, and innovation. It empowers individuals to take control of their financial future, fostering a global community where value can be transferred freely and securely without intermediaries. This is why we need Bitcoin—because it creates a world where incentives are properly aligned, leading to a more fair and prosperous society for all.<br><br>Take the step to learn more about Bitcoin and how it can transform not just your financial life, but the world. Tear off a link to the left and explore this groundbreaking technology. Join the movement towards a better future.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://bitcoin.org/en",
|
||||
"tear_off_link": "http://bitcoin.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
"title": "GOOD NEWS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "DISCOVER TRUE HOPE",
|
||||
"content": "Who is Jesus? He is more than just a historical figure; He is the Son of God, the Savior of the world. Jesus Himself said, 'I am the way, the truth, and the life. No one comes to the Father except through Me' (John 14:6). He came to bridge the gap between God and humanity, offering us a path to forgiveness, peace, and eternal life.\n\nWe all face brokenness in our lives—whether it's in our relationships, our hearts, or our world. Jesus came to heal that brokenness. He lived a perfect life, died on the cross for our sins, and rose again, defeating death and offering us the hope of eternal life with God.\n\nWithout Jesus, we are lost in our sin, separated from God. But through Him, we can be forgiven and restored. He offers us not just a better life now, but the promise of an eternal life with Him. This is why we need Him—because only in Jesus can we find true peace, purpose, and the assurance of eternal life.\n\nTake the step to learn more about Jesus and the life-changing impact He can have on your life. Tear off a link to the left and explore His teachings. Find the hope you've been searching for.",
|
||||
"content": "Who is Jesus? He is more than just a historical figure; He is the Son of God, the Savior of the world. Jesus Himself said, 'I am the way, the truth, and the life. No one comes to the Father except through Me' (John 14:6). He came to bridge the gap between God and humanity, offering us a path to forgiveness, peace, and eternal life.<br><br>We all face brokenness in our lives—whether it's in our relationships, our hearts, or our world. Jesus came to heal that brokenness. He lived a perfect life, died on the cross for our sins, and rose again, defeating death and offering us the hope of eternal life with God.<br><br>Without Jesus, we are lost in our sin, separated from God. But through Him, we can be forgiven and restored. He offers us not just a better life now, but the promise of an eternal life with Him. This is why we need Him—because only in Jesus can we find true peace, purpose, and the assurance of eternal life.<br><br>Take the step to learn more about Jesus and the life-changing impact He can have on your life. Tear off a link to the left and explore His teachings. Find the hope you've been searching for.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "http://media.faithforthefamily.com/ra/godsoloved/english.mp3",
|
||||
"tear_off_link": "http://jesus.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"title": "SECURE COMMUNICATIONS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "BUILD YOUR EMERGENCY NETWORK",
|
||||
"content": "Why Meshtastic? In times of crisis, traditional communication networks can fail, leaving us isolated and vulnerable. Meshtastic provides a powerful solution—an alternative local communication network that operates independently of centralized systems. It's designed for emergency situations, allowing you to stay connected when it matters most.\n\nMeshtastic devices create a mesh network that can relay messages over long distances, even without internet or cellular coverage. This decentralized approach ensures that your communications are resilient and reliable, no matter the circumstances. But it’s not just about staying connected—Meshtastic also offers encryption, so your messages remain secure and private.\n\nIn a world where privacy is increasingly compromised, Meshtastic empowers you to take control of your communication. Whether you're coordinating a local community response, staying in touch with loved ones during a disaster, or simply preparing for the unexpected, Meshtastic provides the tools you need to communicate securely and effectively.\n\nTake the step to learn more about Meshtastic and how you can build your own emergency communication network. Tear off a link to the left and explore this innovative technology. Ensure you're prepared for whatever comes your way.",
|
||||
"content": "Why Meshtastic? In times of crisis, traditional communication networks can fail, leaving us isolated and vulnerable. Meshtastic provides a powerful solution—an alternative local communication network that operates independently of centralized systems. It’s designed for emergency situations, allowing you to stay connected when it matters most.<br><br>Meshtastic devices create a mesh network that can relay messages over long distances, even without internet or cellular coverage. This decentralized approach ensures that your communications are resilient and reliable, no matter the circumstances. But it’s not just about staying connected—Meshtastic also offers encryption, so your messages remain secure and private.<br><br>In a world where privacy is increasingly compromised, Meshtastic empowers you to take control of your communication. Whether you’re coordinating a local community response, staying in touch with loved ones during a disaster, or simply preparing for the unexpected, Meshtastic provides the tools you need to communicate securely and effectively.<br><br>Take the step to learn more about Meshtastic and how you can build your own emergency communication network. Tear off a link to the left and explore this innovative technology. Ensure you’re prepared for whatever comes your way.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://meshtastic.org",
|
||||
"tear_off_link": "http://meshtastic.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
"title": "SOCIAL FREEDOM",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE CENSORSHIP-RESISTANT NETWORK",
|
||||
"content": "What is Nostr? Unlike traditional social media platforms, Nostr is a protocol—a decentralized system that empowers users to connect and share without the constraints of a central authority. Nostr is censorship-resistant, meaning your voice can’t be silenced by corporations or governments. It's designed to give you control over your online presence, free from the influence of algorithms or ads that prioritize engagement over meaningful connections.\n\nOn Nostr, there are no hidden agendas to keep you doomscrolling. You engage with content on your terms, not based on what an algorithm thinks will keep you online the longest. Nostr allows you to build genuine connections and participate in conversations that matter, all while maintaining your privacy and autonomy.\n\nIn a world where online speech is increasingly controlled and manipulated, Nostr offers a refreshing alternative. It’s not just a platform; it’s a movement towards true digital freedom, where your interactions are driven by your interests and values, not by what generates the most ad revenue.\n\nTake the step to learn more about Nostr and how it can transform the way you connect online. Tear off a link the left and explore this groundbreaking protocol. Join a community that values freedom and authentic interaction.",
|
||||
"content": "What is Nostr? Unlike traditional social media platforms, Nostr is a protocol—a decentralized system that empowers users to connect and share without the constraints of a central authority. Nostr is censorship-resistant, meaning your voice can’t be silenced by corporations or governments. It’s designed to give you control over your online presence, free from the influence of algorithms or ads that prioritize engagement over meaningful connections.<br><br>On Nostr, there are no hidden agendas to keep you doomscrolling. You engage with content on your terms, not based on what an algorithm thinks will keep you online the longest. Nostr allows you to build genuine connections and participate in conversations that matter, all while maintaining your privacy and autonomy.<br><br>In a world where online speech is increasingly controlled and manipulated, Nostr offers a refreshing alternative. It’s not just a platform; it’s a movement towards true digital freedom, where your interactions are driven by your interests and values, not by what generates the most ad revenue.<br><br>Take the step to learn more about Nostr and how it can transform the way you connect online. Tear off a link the left and explore this groundbreaking protocol. Join a community that values freedom and authentic interaction.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://nostr.how/en/what-is-nostr",
|
||||
"tear_off_link": "http://nostr.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion/",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"title": "TOP SECRET",
|
||||
"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.",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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.",
|
||||
"url": "https://voxvera.org/",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
|
||||
+310
-119
@@ -1,6 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REPO="PR0M3TH3AN/VoxVera"
|
||||
REPO_URL="https://github.com/${REPO}"
|
||||
BRANCH="main"
|
||||
|
||||
# --- Network resilience settings ---
|
||||
# Kill git operations that stall below 1 KB/s for 30 seconds
|
||||
export GIT_HTTP_LOW_SPEED_LIMIT=1000
|
||||
export GIT_HTTP_LOW_SPEED_TIME=30
|
||||
# Disable partial clones — they are fragile on flaky connections
|
||||
export GIT_CLONE_PROTECTION_ACTIVE=false
|
||||
# Hard timeout (seconds) for any single network operation
|
||||
NET_TIMEOUT=90
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
@@ -38,41 +51,77 @@ die() { echo -e "\e[31m$*\e[0m" >&2; exit 1; }
|
||||
|
||||
install_pkg() {
|
||||
case "$PM" in
|
||||
apt)
|
||||
$SUDO apt-get install -y "$@"
|
||||
;;
|
||||
dnf)
|
||||
$SUDO dnf install -y "$@"
|
||||
;;
|
||||
yum)
|
||||
$SUDO yum install -y "$@"
|
||||
;;
|
||||
pacman)
|
||||
$SUDO pacman -S --noconfirm "$@"
|
||||
;;
|
||||
brew)
|
||||
brew install "$@"
|
||||
;;
|
||||
apk)
|
||||
$SUDO apk add --no-cache "$@"
|
||||
;;
|
||||
apt) $SUDO apt-get install -y "$@" ;;
|
||||
dnf) $SUDO dnf install -y "$@" ;;
|
||||
yum) $SUDO yum install -y "$@" ;;
|
||||
pacman) $SUDO pacman -S --noconfirm "$@" ;;
|
||||
brew) brew install "$@" ;;
|
||||
apk) $SUDO apk add --no-cache "$@" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Ensure core dependencies are present (always run to ensure they are up to date)
|
||||
# --- Resilient download: tries curl then wget, with retries and timeout ---
|
||||
download() {
|
||||
local url="$1" dest="$2"
|
||||
# Try curl first
|
||||
if command_exists curl; then
|
||||
local attempt
|
||||
for attempt in 1 2 3; do
|
||||
if timeout "$NET_TIMEOUT" curl -fsSL \
|
||||
--retry 2 --retry-delay 3 --retry-connrefused \
|
||||
--max-time "$NET_TIMEOUT" \
|
||||
"$url" -o "$dest" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
warn "curl attempt $attempt failed for $(basename "$url")"
|
||||
sleep 2
|
||||
done
|
||||
fi
|
||||
# Try wget as fallback (different TLS stack — often works when curl doesn't)
|
||||
if command_exists wget; then
|
||||
local attempt
|
||||
for attempt in 1 2 3; do
|
||||
if timeout "$NET_TIMEOUT" wget -q --timeout=60 --tries=1 \
|
||||
"$url" -O "$dest" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
warn "wget attempt $attempt failed for $(basename "$url")"
|
||||
sleep 2
|
||||
done
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# --- Resilient HTTP status check (for release tag redirect) ---
|
||||
get_latest_tag() {
|
||||
local tag=""
|
||||
if command_exists curl; then
|
||||
tag=$(timeout 30 curl -fsSLI -o /dev/null -w '%{url_effective}' \
|
||||
"${REPO_URL}/releases/latest" 2>/dev/null | grep -oE '[^/]+$') || true
|
||||
fi
|
||||
if [ -z "$tag" ] && command_exists wget; then
|
||||
tag=$(timeout 30 wget --max-redirect=5 -q -S --spider \
|
||||
"${REPO_URL}/releases/latest" 2>&1 | grep -i 'Location:' | tail -1 | grep -oE '[^/]+$') || true
|
||||
fi
|
||||
echo "$tag"
|
||||
}
|
||||
|
||||
# Ensure core dependencies are present
|
||||
msg "Checking and updating system dependencies..."
|
||||
if [ "$PM" = "apt" ]; then
|
||||
$SUDO apt-get update
|
||||
SYSTEM_PKGS=(tor curl git python3-pip python3-venv)
|
||||
SYSTEM_PKGS=(tor curl wget git python3-pip python3-venv)
|
||||
[ -n "$(command -v pipx)" ] || SYSTEM_PKGS+=(pipx)
|
||||
install_pkg "${SYSTEM_PKGS[@]}"
|
||||
elif [ "$PM" = "brew" ]; then
|
||||
brew install tor onionshare curl git
|
||||
brew install tor onionshare curl wget git
|
||||
else
|
||||
install_pkg tor curl git
|
||||
# Best-effort install wget if not present
|
||||
install_pkg wget 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Onionshare-cli - ensure it's installed and working (always attempt update if using pipx)
|
||||
# Onionshare-cli
|
||||
msg "Ensuring onionshare-cli is installed and up-to-date..."
|
||||
if command_exists pipx && (pipx list | grep -q onionshare || ! command_exists onionshare-cli); then
|
||||
msg "Installing/Updating onionshare-cli via pipx..."
|
||||
@@ -96,112 +145,254 @@ else
|
||||
msg "onionshare-cli found (system package), skipping pipx install. Run 'pipx install --force ...' if you want the latest git version."
|
||||
fi
|
||||
|
||||
# Clean up stale user-local packages from prior pip --user installs of voxvera.
|
||||
# These can shadow system packages (e.g. Werkzeug) and break onionshare-cli.
|
||||
msg "Cleaning up stale user-local packages that may conflict with system onionshare-cli..."
|
||||
PIP_CLEANUP_OPTS=""
|
||||
if [ -f /etc/debian_version ]; then
|
||||
DEB_VER=$(cat /etc/debian_version | cut -d. -f1)
|
||||
if [[ "$DEB_VER" =~ ^[0-9]+$ ]] && [ "$DEB_VER" -ge 12 ]; then
|
||||
PIP_CLEANUP_OPTS="--break-system-packages"
|
||||
fi
|
||||
fi
|
||||
for pkg in werkzeug flask flask-socketio onionshare-cli; do
|
||||
if pip3 show --quiet "$pkg" 2>/dev/null && \
|
||||
pip3 show "$pkg" 2>/dev/null | grep -q "Location.*\.local"; then
|
||||
pip3 uninstall -y $PIP_CLEANUP_OPTS "$pkg" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
# Also uninstall any previous pip --user install of voxvera itself
|
||||
if pip3 show --quiet voxvera 2>/dev/null && \
|
||||
pip3 show voxvera 2>/dev/null | grep -q "Location.*\.local"; then
|
||||
pip3 uninstall -y $PIP_CLEANUP_OPTS voxvera 2>/dev/null || true
|
||||
fi
|
||||
# --- Clean up stale state from previous installs (preserves ~/host tor sites) ---
|
||||
msg "Cleaning up stale state from previous installs..."
|
||||
|
||||
download_binary() {
|
||||
local url=$1
|
||||
local dest=$2
|
||||
if command_exists curl; then
|
||||
local status
|
||||
status=$(curl -w "%{http_code}" -fsSL "$url" -o "$dest" || true)
|
||||
if [ "$status" = "404" ]; then return 2; elif [ "$status" != "200" ]; then return 1; fi
|
||||
elif command_exists wget; then
|
||||
local out
|
||||
out=$(wget --server-response -q "$url" -O "$dest" 2>&1 || true)
|
||||
if echo "$out" | grep -q "404 Not Found"; then return 2; elif ! echo "$out" | grep -q "200 OK"; then return 1; fi
|
||||
else
|
||||
warn "Install curl or wget to download voxvera"
|
||||
return 1
|
||||
fi
|
||||
chmod +x "$dest"
|
||||
# Stale user-local packages that may conflict with system onionshare-cli
|
||||
for pydir in "$HOME"/.local/lib/python3.*/site-packages; do
|
||||
[ -d "$pydir" ] || continue
|
||||
for pkg in werkzeug flask flask_socketio onionshare_cli voxvera; do
|
||||
if [ -d "$pydir/$pkg" ]; then
|
||||
warn "Removing stale $pkg from $pydir"
|
||||
rm -rf "$pydir/$pkg" "$pydir/${pkg}-"*.dist-info 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# Stale pip wheel cache for voxvera (forces clean rebuild)
|
||||
for cache_dir in "$HOME"/.cache/pip/wheels; do
|
||||
[ -d "$cache_dir" ] || continue
|
||||
find "$cache_dir" -name 'voxvera-*.whl' -delete 2>/dev/null || true
|
||||
done
|
||||
|
||||
# Leftover temp files from previous failed install attempts
|
||||
rm -rf /tmp/voxvera-* 2>/dev/null || true
|
||||
|
||||
# Stale top-level config.json from older VoxVera versions (not inside ~/host)
|
||||
[ -f "$HOME/config.json" ] && grep -q '"folder_name"' "$HOME/config.json" 2>/dev/null && {
|
||||
warn "Removing stale ~/config.json (leftover from older VoxVera version)"
|
||||
rm -f "$HOME/config.json"
|
||||
}
|
||||
|
||||
# Install VoxVera (Always use --force to ensure fresh installation)
|
||||
if command_exists curl; then
|
||||
msg "Attempting to download latest VoxVera binary..."
|
||||
# Get the latest release tag
|
||||
latest=$(curl -fsSLI -o /dev/null -w '%{url_effective}' https://github.com/PR0M3TH3AN/VoxVera/releases/latest | grep -oE '[^/]+$')
|
||||
|
||||
install_dir="$HOME/.local/bin"
|
||||
mkdir -p "$install_dir"
|
||||
dest="$install_dir/voxvera"
|
||||
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
||||
ARCH=$(uname -m)
|
||||
|
||||
case "$OS" in
|
||||
linux*) BINARY="voxvera-linux" ;;
|
||||
darwin*) BINARY="voxvera-macos" ;;
|
||||
*) BINARY="voxvera-linux" ;;
|
||||
esac
|
||||
|
||||
# Try to download architecture-specific binary (e.g. voxvera-linux-x86_64)
|
||||
url="https://github.com/PR0M3TH3AN/VoxVera/releases/download/${latest}/${BINARY}-${ARCH}"
|
||||
# For Windows, PyInstaller might add .exe but here we focus on linux/mac
|
||||
|
||||
msg "Downloading from: $url"
|
||||
set +e
|
||||
status=$(curl -w "%{http_code}" -fsSL "$url" -o "$dest")
|
||||
curl_exit=$?
|
||||
set -e
|
||||
|
||||
if [ $curl_exit -eq 0 ] && [ "$status" = "200" ]; then
|
||||
chmod +x "$dest"
|
||||
msg "VoxVera binary (${ARCH}) installed to $dest"
|
||||
[[ ":$PATH:" != *":$HOME/.local/bin:"* ]] && warn "Add \$HOME/.local/bin to your PATH."
|
||||
exit 0
|
||||
else
|
||||
warn "Binary download failed (status: $status, exit: $curl_exit). Falling back to source installation."
|
||||
[ -f "$dest" ] && rm "$dest"
|
||||
# Stale top-level imports/ directory (older versions put it in ~/)
|
||||
if [ -d "$HOME/imports" ] && ls "$HOME/imports"/*.json &>/dev/null; then
|
||||
if head -1 "$HOME/imports"/*.json 2>/dev/null | grep -q '"folder_name"\|"headline"'; then
|
||||
warn "Removing stale ~/imports/ (leftover from older VoxVera version)"
|
||||
rm -rf "$HOME/imports"
|
||||
fi
|
||||
fi
|
||||
|
||||
if command_exists pipx; then
|
||||
msg "Falling back to pipx installation (this may take a few minutes)..."
|
||||
if pipx install --force 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'; then
|
||||
# Ensure setuptools (pkg_resources) is available in the venv — pipx can
|
||||
# sometimes skip it if the resolver thinks the build-system copy suffices.
|
||||
# Clean generated files from existing site directories so rebuild-all
|
||||
# regenerates them from the current template. Preserves:
|
||||
# config.json — site content and settings
|
||||
# .onionshare-session — Tor domain identity key
|
||||
# server.pid — running process marker
|
||||
# onionshare.log — current log (may be in use)
|
||||
# Everything else is regenerated by build_assets().
|
||||
if [ -d "$HOME/host" ]; then
|
||||
for site_dir in "$HOME"/host/*/; do
|
||||
[ -f "${site_dir}config.json" ] || continue
|
||||
msg "Cleaning generated files in ${site_dir}..."
|
||||
rm -f "${site_dir}index.html" 2>/dev/null || true
|
||||
rm -f "${site_dir}qrcode-content.png" "${site_dir}qrcode-tear-offs.png" 2>/dev/null || true
|
||||
rm -rf "${site_dir}download" 2>/dev/null || true
|
||||
done
|
||||
fi
|
||||
|
||||
# --- Helper: build pip flags for this distro ---
|
||||
pip_flags() {
|
||||
local flags="--user --upgrade"
|
||||
if [ -f /etc/debian_version ]; then
|
||||
local deb_ver
|
||||
deb_ver=$(cut -d. -f1 < /etc/debian_version)
|
||||
if [[ "$deb_ver" =~ ^[0-9]+$ ]] && [ "$deb_ver" -ge 12 ]; then
|
||||
flags="$flags --break-system-packages"
|
||||
fi
|
||||
fi
|
||||
echo "$flags"
|
||||
}
|
||||
|
||||
# --- Helper: install from a local source directory ---
|
||||
install_from_local() {
|
||||
local src_dir="$1"
|
||||
msg "Installing VoxVera from local source ($src_dir)..."
|
||||
local flags
|
||||
flags=$(pip_flags)
|
||||
if pip install $flags "$src_dir"; then
|
||||
msg "VoxVera installed from local source."
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# --- Helper: remove stale standalone binary so it doesn't shadow pipx/pip entrypoints ---
|
||||
cleanup_stale_binary() {
|
||||
local bin="$HOME/.local/bin/voxvera"
|
||||
[ -f "$bin" ] || return 0
|
||||
# Only remove actual compiled binaries (PyInstaller/native), not pip/pipx Python scripts
|
||||
if file "$bin" 2>/dev/null | grep -qiE 'ELF|Mach-O'; then
|
||||
warn "Removing stale standalone binary at $bin (would shadow pipx/pip entrypoint)"
|
||||
rm -f "$bin"
|
||||
fi
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Strategy 5: Pre-built binary (fallback — can lag behind main)
|
||||
# ============================================================
|
||||
install_binary() {
|
||||
msg "Strategy 5/5: Attempting to download pre-built binary..."
|
||||
|
||||
local latest
|
||||
latest=$(get_latest_tag)
|
||||
[ -n "$latest" ] || { warn "Could not determine latest release tag."; return 1; }
|
||||
|
||||
local install_dir="$HOME/.local/bin"
|
||||
mkdir -p "$install_dir"
|
||||
local dest="$install_dir/voxvera"
|
||||
local os_name arch binary
|
||||
os_name="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
||||
arch=$(uname -m)
|
||||
|
||||
case "$os_name" in
|
||||
linux*) binary="voxvera-linux" ;;
|
||||
darwin*) binary="voxvera-macos" ;;
|
||||
*) binary="voxvera-linux" ;;
|
||||
esac
|
||||
|
||||
local url="${REPO_URL}/releases/download/${latest}/${binary}-${arch}"
|
||||
msg "Downloading: $url"
|
||||
|
||||
if download "$url" "$dest"; then
|
||||
chmod +x "$dest"
|
||||
# Verify it's actually an executable, not an HTML error page
|
||||
if file "$dest" | grep -qiE 'ELF|executable|Mach-O'; then
|
||||
msg "VoxVera binary (${arch}) installed to $dest"
|
||||
[[ ":$PATH:" != *":$HOME/.local/bin:"* ]] && warn "Add \$HOME/.local/bin to your PATH."
|
||||
return 0
|
||||
fi
|
||||
warn "Downloaded file is not a valid binary."
|
||||
fi
|
||||
|
||||
[ -f "$dest" ] && rm -f "$dest"
|
||||
warn "Binary download failed. Trying next method..."
|
||||
return 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Strategy 1: GitHub tarball — no git needed, always current with main
|
||||
# ============================================================
|
||||
install_tarball() {
|
||||
msg "Strategy 1/5: Downloading source tarball (no git required)..."
|
||||
local tmp_tar tmp_dir
|
||||
tmp_tar=$(mktemp /tmp/voxvera-XXXXXX.tar.gz)
|
||||
tmp_dir=$(mktemp -d /tmp/voxvera-src-XXXXXX)
|
||||
|
||||
if download "${REPO_URL}/archive/refs/heads/${BRANCH}.tar.gz" "$tmp_tar"; then
|
||||
if tar -xzf "$tmp_tar" -C "$tmp_dir" --strip-components=1 2>/dev/null; then
|
||||
if install_from_local "$tmp_dir"; then
|
||||
cleanup_stale_binary
|
||||
rm -rf "$tmp_tar" "$tmp_dir"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
warn "Tarball extraction failed."
|
||||
fi
|
||||
else
|
||||
warn "Tarball download failed."
|
||||
fi
|
||||
|
||||
rm -rf "$tmp_tar" "$tmp_dir"
|
||||
warn "Tarball install failed. Trying next method..."
|
||||
return 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Strategy 2: Shallow git clone + local pip install
|
||||
# ============================================================
|
||||
install_shallow() {
|
||||
msg "Strategy 2/5: Attempting shallow git clone (--depth 1)..."
|
||||
local tmp_dir
|
||||
tmp_dir=$(mktemp -d /tmp/voxvera-clone-XXXXXX)
|
||||
|
||||
if timeout "$NET_TIMEOUT" git clone --depth 1 --single-branch --branch "$BRANCH" \
|
||||
"${REPO_URL}.git" "$tmp_dir" 2>&1; then
|
||||
if install_from_local "$tmp_dir"; then
|
||||
cleanup_stale_binary
|
||||
rm -rf "$tmp_dir"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
warn "Shallow clone failed or timed out after ${NET_TIMEOUT}s."
|
||||
fi
|
||||
|
||||
rm -rf "$tmp_dir"
|
||||
warn "Shallow clone install failed. Trying next method..."
|
||||
return 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Strategy 3: pipx from git (isolated venv)
|
||||
# ============================================================
|
||||
install_pipx() {
|
||||
command_exists pipx || return 1
|
||||
msg "Strategy 3/5: Attempting pipx installation..."
|
||||
if timeout 180 pipx install --force "voxvera@git+${REPO_URL}.git@${BRANCH}"; then
|
||||
pipx inject voxvera setuptools 2>/dev/null || true
|
||||
pipx ensurepath --force
|
||||
cleanup_stale_binary
|
||||
msg "\nVoxVera installed/updated successfully via pipx."
|
||||
msg "IMPORTANT: Please restart your terminal or run 'source ~/.bashrc' (or your shell config) to use 'voxvera'."
|
||||
msg "IMPORTANT: Please restart your terminal or run 'source ~/.bashrc' to use 'voxvera'."
|
||||
return 0
|
||||
fi
|
||||
warn "pipx install failed. Trying next method..."
|
||||
return 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Strategy 4: pip from git
|
||||
# ============================================================
|
||||
install_pip_git() {
|
||||
msg "Strategy 4/5: Attempting pip install from git..."
|
||||
local flags
|
||||
flags=$(pip_flags)
|
||||
if timeout 180 pip install $flags "voxvera@git+${REPO_URL}.git@${BRANCH}"; then
|
||||
cleanup_stale_binary
|
||||
msg "VoxVera installed via pip."
|
||||
return 0
|
||||
fi
|
||||
warn "pip git install failed."
|
||||
return 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Run strategies in order — first success wins
|
||||
# ============================================================
|
||||
# Order rationale:
|
||||
# 1. Tarball — always up-to-date with main, no git needed, single download
|
||||
# 2. Shallow clone — small git transfer, also always current
|
||||
# 3. pipx — git clone internally, but isolated venv
|
||||
# 4. pip git — git clone internally, last resort
|
||||
# 5. Binary — pre-built release; only fallback since it can lag behind main
|
||||
for strategy in install_tarball install_shallow install_pipx install_pip_git install_binary; do
|
||||
if $strategy; then
|
||||
# Ensure ~/.local/bin is on PATH
|
||||
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
fi
|
||||
# Clear bash's cached command path so the new binary is found immediately
|
||||
hash -r 2>/dev/null || true
|
||||
|
||||
# Rebuild all existing sites so they pick up template/CSS changes
|
||||
if command_exists voxvera; then
|
||||
msg "Rebuilding existing sites with updated template..."
|
||||
voxvera rebuild-all 2>/dev/null || true
|
||||
fi
|
||||
|
||||
msg "\nVoxVera installed/updated successfully. Run 'voxvera check' to verify."
|
||||
# Detect if the parent shell will still have a stale hash
|
||||
msg "If 'voxvera' is not found, run: hash -r (or open a new terminal)"
|
||||
exit 0
|
||||
fi
|
||||
warn "pipx install failed, trying pip fallback..."
|
||||
fi
|
||||
done
|
||||
|
||||
# Fallback to pip
|
||||
msg "Installing/Updating VoxVera via pip..."
|
||||
PIP_OPTS="--user --upgrade"
|
||||
if [ -f /etc/debian_version ]; then
|
||||
DEB_VER=$(cat /etc/debian_version | cut -d. -f1)
|
||||
if [[ "$DEB_VER" =~ ^[0-9]+$ ]] && [ "$DEB_VER" -ge 12 ]; then
|
||||
PIP_OPTS="$PIP_OPTS --break-system-packages"
|
||||
fi
|
||||
fi
|
||||
if pip install $PIP_OPTS 'voxvera@git+https://github.com/PR0M3TH3AN/VoxVera.git@main'; then
|
||||
msg "VoxVera installed via pip."
|
||||
else
|
||||
die "Installation failed."
|
||||
fi
|
||||
|
||||
msg "\nVoxVera installed/updated successfully. Run 'voxvera check' to verify."
|
||||
die "All installation methods failed. Your network may be blocking or corrupting HTTPS traffic to GitHub.\nTry downloading manually from a working machine:\n ${REPO_URL}/archive/refs/heads/${BRANCH}.tar.gz\nThen copy to this machine and run:\n tar xzf VoxVera-main.tar.gz && pip install --user ./VoxVera-main"
|
||||
+1
-1
@@ -14,7 +14,7 @@ voxvera = ["templates/**", "src/**", "resources/**", "locales/**", "resources/bi
|
||||
|
||||
[project]
|
||||
name = "voxvera"
|
||||
version = "0.2.18"
|
||||
version = "0.3.4"
|
||||
description = "VoxVera CLI utilities"
|
||||
readme = "README.md"
|
||||
authors = [{name = "VoxVera"}]
|
||||
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
echo "==> flake8"
|
||||
python3 -m flake8 voxvera tests \
|
||||
--jobs=1 \
|
||||
--exclude=voxvera/vendor \
|
||||
--ignore=E501,W503,W293,E402,E306,E704,E261,F841,E302,F401,E401,F541
|
||||
|
||||
echo "==> pytest"
|
||||
python3 -m pytest tests/ -v
|
||||
|
||||
echo "==> electron smoke tests"
|
||||
(cd gui/electron && npm test)
|
||||
|
||||
echo "==> dependency check"
|
||||
python3 -m voxvera.cli --lang en check
|
||||
|
||||
echo "==> build docs"
|
||||
python3 -m voxvera.cli build-docs
|
||||
|
||||
echo "==> build site"
|
||||
python3 -m voxvera.cli build-site
|
||||
|
||||
echo "All local checks passed."
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
"title": "TOP SECRET",
|
||||
"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",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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": "Get VoxVera and start spreading your message.",
|
||||
"url": "https://github.com/PR0M3TH3AN/VoxVera",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+12
-15
@@ -169,20 +169,21 @@
|
||||
|
||||
.content {
|
||||
width: calc(8.5in - 3.75in);
|
||||
padding: 20px;
|
||||
padding: 15px 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
justify-content: flex-start;
|
||||
page-break-inside: avoid;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
font-size: 24px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 2px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
@@ -192,7 +193,10 @@
|
||||
|
||||
.distribute {
|
||||
font-size: 18px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 6px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -204,8 +208,8 @@
|
||||
}
|
||||
|
||||
.message {
|
||||
height: 6in; /* Fixed height to prevent footer push-out */
|
||||
margin-top: 10px;
|
||||
flex: 1;
|
||||
margin-top: 4px;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
text-align: left;
|
||||
@@ -265,7 +269,7 @@
|
||||
border: none;
|
||||
border-top: 1px solid #000;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
@@ -378,7 +382,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.", "name": "Vox Vera Printable Flyers"}}, "de": {"meta": {"language_name": "Deutsch", "flag": "\ud83c\udde9\ud83c\uddea"}, "web": {"teLine 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", "download_attachment": "Download Attachment"}, "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.<br><br>\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.<br><br>\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.<br><br>\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.", "name": "\u0645\u0646\u0634\u0648\u0631\u0627\u062a Vox Vera \u0627\u0644Line truncated
|
||||
|
||||
function t(path, lang) {
|
||||
const parts = path.split('.');
|
||||
@@ -557,14 +561,7 @@
|
||||
<h1 id="operation-title-2" data-i18n="landing.headline">OPERATION VOX VERA</h1>
|
||||
<hr>
|
||||
<div class="message">
|
||||
<div class="text-container" id="main-content" contenteditable="false" data-i18n="landing.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.
|
||||
|
||||
Use 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.
|
||||
|
||||
Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.
|
||||
|
||||
Join us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.
|
||||
</div>
|
||||
<div class="text-container" id="main-content" contenteditable="false" data-i18n="landing.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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.</div>
|
||||
<div class="qr-code-body">
|
||||
|
||||
<div class="qr-code-url">
|
||||
|
||||
+18
-3
@@ -126,6 +126,21 @@ def test_import_preserves_session(tmp_path, monkeypatch):
|
||||
assert (host_dir / "index.html").exists()
|
||||
|
||||
|
||||
def test_import_rejects_zip_path_traversal(tmp_path, monkeypatch, capsys):
|
||||
_setup_tmp(monkeypatch, tmp_path)
|
||||
malicious_zip = tmp_path / "malicious.zip"
|
||||
with zipfile.ZipFile(malicious_zip, "w") as zf:
|
||||
zf.writestr("../escape.txt", "owned")
|
||||
zf.writestr("config.json", json.dumps({"folder_name": "evil"}))
|
||||
|
||||
cli.import_site(str(malicious_zip))
|
||||
|
||||
captured = capsys.readouterr()
|
||||
assert "Refusing to extract path outside destination" in captured.out
|
||||
assert not (tmp_path / "escape.txt").exists()
|
||||
assert not ((tmp_path / "data" / "host" / "evil").exists())
|
||||
|
||||
|
||||
def test_check_all_present(capsys, monkeypatch):
|
||||
monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/" + cmd)
|
||||
cli.main(["check"])
|
||||
@@ -194,7 +209,7 @@ def test_serve_updates_url(tmp_path, monkeypatch):
|
||||
onion_url = "http://test123.onion"
|
||||
|
||||
class FakePopen:
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None):
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None, **kwargs):
|
||||
self.cmd = cmd
|
||||
self.stdout = stdout
|
||||
self.stderr = stderr
|
||||
@@ -244,7 +259,7 @@ def test_quickstart_noninteractive(tmp_path, monkeypatch):
|
||||
onion_url = "http://quick.onion"
|
||||
|
||||
class FakePopen:
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None):
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None, **kwargs):
|
||||
self.cmd = cmd
|
||||
self.stdout = stdout
|
||||
self.stderr = stderr
|
||||
@@ -401,7 +416,7 @@ def test_serve_passes_tor_ports_to_env(monkeypatch, tmp_path):
|
||||
captured_env = {}
|
||||
|
||||
class FakePopen:
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None):
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None, **kwargs):
|
||||
self.cmd = cmd
|
||||
self.stdout = stdout
|
||||
self.stderr = stderr
|
||||
|
||||
+1
-1
@@ -153,7 +153,7 @@ class TestFullWorkflow:
|
||||
onion_url = "http://test123abc.onion"
|
||||
|
||||
class MockPopen:
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None):
|
||||
def __init__(self, cmd, stdout=None, stderr=None, env=None, **kwargs):
|
||||
self.cmd = cmd
|
||||
self.stdout = stdout
|
||||
self.stderr = stderr
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
__version__ = "0.2.18"
|
||||
__version__ = "0.3.4"
|
||||
|
||||
# Add the vendor directory to sys.path ONLY for PyInstaller (frozen) builds.
|
||||
# For pip/pipx installs the system/venv packages are correct and the vendored
|
||||
|
||||
+406
-13
@@ -28,6 +28,8 @@ from InquirerPy import prompt, inquirer
|
||||
from rich.console import Console
|
||||
from voxvera import __version__
|
||||
|
||||
GITHUB_RECOMMENDED_BINARY_LIMIT = 95 * 1024 * 1024
|
||||
|
||||
# package root (contains bundled templates and src/)
|
||||
if getattr(sys, 'frozen', False):
|
||||
ROOT = Path(sys._MEIPASS).joinpath("voxvera")
|
||||
@@ -44,6 +46,32 @@ DATA_DIR = Path(os.environ.get("VOXVERA_DIR", Path.home()))
|
||||
CURRENT_LOCALE = {}
|
||||
|
||||
|
||||
def _newlines_to_br(text: str) -> str:
|
||||
"""Convert all forms of newline encoding to <br> for static HTML output.
|
||||
|
||||
Handles: real newlines, literal backslash-n (\\n), and any mix.
|
||||
Idempotent — already-converted <br> tags are left alone.
|
||||
"""
|
||||
# 1. Literal two-character sequences: backslash + n → real newline
|
||||
s = text.replace("\\n", "\n")
|
||||
# 2. Real newlines → <br>
|
||||
s = s.replace("\n", "<br>")
|
||||
# 3. Collapse any triple+ <br> runs from trailing newlines
|
||||
while "<br><br><br>" in s:
|
||||
s = s.replace("<br><br><br>", "<br><br>")
|
||||
# 4. Strip leading/trailing <br>
|
||||
while s.startswith("<br>"):
|
||||
s = s[4:]
|
||||
while s.endswith("<br>"):
|
||||
s = s[:-4]
|
||||
return s
|
||||
|
||||
|
||||
def _br_to_newlines(text: str) -> str:
|
||||
"""Convert <br> tags back to real newlines for editor display."""
|
||||
return text.replace("<br>", "\n")
|
||||
|
||||
|
||||
def _template_res(*parts) -> Traversable:
|
||||
"""Return a Traversable for files under the packaged ``templates`` folder."""
|
||||
if getattr(sys, 'frozen', False):
|
||||
@@ -372,15 +400,15 @@ def interactive_update(config_path: str):
|
||||
data.update(prompt(meta_qs))
|
||||
|
||||
console.rule(t("cli.init_body"))
|
||||
# Start with existing/default content; preserve user edits across retries
|
||||
body = _br_to_newlines(get_default("content"))
|
||||
while True:
|
||||
# Use existing content if present, else fallback to localized landing default
|
||||
initial_content = get_default("content")
|
||||
|
||||
body = open_editor(initial_content)
|
||||
body = open_editor(body)
|
||||
length = len(body)
|
||||
if length > 1000:
|
||||
console.print(f"{t('cli.body_length')}: {length}/1000 {t('cli.body_limit_exceeded')}", style="red")
|
||||
if not inquirer.confirm(message=t("cli.edit_again"), default=True).execute():
|
||||
console.print(t("cli.body_over_limit_warning"), style="yellow")
|
||||
break
|
||||
else:
|
||||
console.print(f"{t('cli.body_length')}: {length}/1000", style="green")
|
||||
@@ -507,7 +535,7 @@ def build_assets(
|
||||
if field in data and data[field]:
|
||||
# Only override if the value is different from the master default
|
||||
if data[field] != master_defaults.get(field):
|
||||
all_locales[code]["landing"][field] = data[field]
|
||||
all_locales[code]["landing"][field] = _newlines_to_br(data[field])
|
||||
|
||||
html = html.replace("{{locales}}", json.dumps(all_locales))
|
||||
|
||||
@@ -530,7 +558,7 @@ def build_assets(
|
||||
for field in landing_fields:
|
||||
# Use data from config if available, otherwise use localized default
|
||||
value = data.get(field, landing_defaults.get(field, ""))
|
||||
|
||||
|
||||
# If the value from config is just the master default,
|
||||
# and we are NOT in English, use the localized default instead.
|
||||
if data.get("lang", "en") != "en":
|
||||
@@ -539,6 +567,7 @@ def build_assets(
|
||||
|
||||
# Support Markdown-style redaction ~~text~~
|
||||
val_str = re.sub(r"~~(.*?)~~", r'<span class="redacted">\1</span>', str(value))
|
||||
val_str = _newlines_to_br(val_str)
|
||||
html = html.replace(f"{{{{t_landing_{field}}}}}", val_str)
|
||||
|
||||
# 2. Statically replace config placeholders {{key}}
|
||||
@@ -546,6 +575,7 @@ def build_assets(
|
||||
val_str = str(value)
|
||||
# Support Markdown-style redaction ~~text~~ for user fields too
|
||||
val_str = re.sub(r"~~(.*?)~~", r'<span class="redacted">\1</span>', val_str)
|
||||
val_str = _newlines_to_br(val_str)
|
||||
html = html.replace(f"{{{{{key}}}}}", val_str)
|
||||
|
||||
# Handle optional file attachment logic
|
||||
@@ -676,6 +706,9 @@ def _internal_onionshare():
|
||||
# Always prefer the system onionshare-cli binary. This avoids
|
||||
# pkg_resources / setuptools isolation issues in both PyInstaller
|
||||
# builds and pipx venvs.
|
||||
# Prevent user-local pip packages from shadowing system packages
|
||||
os.environ["PYTHONNOUSERSITE"] = "1"
|
||||
|
||||
onionshare_bin = shutil.which("onionshare-cli") or shutil.which("onionshare")
|
||||
if onionshare_bin:
|
||||
os.execvp(onionshare_bin, [onionshare_bin] + onionshare_args)
|
||||
@@ -700,12 +733,22 @@ def serve(config_path: str) -> str | None:
|
||||
if not dir_path.is_dir():
|
||||
print(f"Directory {dir_path} not found", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# Auto-rebuild if index.html is missing (e.g. after install cleanup)
|
||||
if not (dir_path / "index.html").exists():
|
||||
print(f"Rebuilding {folder_name} from current template...")
|
||||
build_assets(config_path)
|
||||
|
||||
logfile = dir_path / "onionshare.log"
|
||||
|
||||
# Set environment variables for OnionShare to use the detected Tor ports
|
||||
env = os.environ.copy()
|
||||
env["TOR_SOCKS_PORT"] = socks
|
||||
env["TOR_CONTROL_PORT"] = ctl
|
||||
# Prevent user-local pip packages (~/.local) from shadowing system packages.
|
||||
# onionshare-cli depends on specific Flask/Werkzeug versions from the system;
|
||||
# stale user-local copies break it.
|
||||
env["PYTHONNOUSERSITE"] = "1"
|
||||
|
||||
onionshare_args = [
|
||||
"--website",
|
||||
@@ -731,7 +774,16 @@ def serve(config_path: str) -> str | None:
|
||||
cmd = [sys.executable] + cmd
|
||||
|
||||
log_fh = open(logfile, "w")
|
||||
proc = subprocess.Popen(cmd, stdout=log_fh, stderr=subprocess.STDOUT, env=env)
|
||||
# Detach the child so it survives when the parent terminal closes.
|
||||
# Unix: start_new_session prevents SIGHUP propagation.
|
||||
# Windows: CREATE_NEW_PROCESS_GROUP detaches from the console.
|
||||
import platform as _platform
|
||||
popen_kwargs = dict(stdout=log_fh, stderr=subprocess.STDOUT, env=env)
|
||||
if _platform.system() == "Windows":
|
||||
popen_kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP
|
||||
else:
|
||||
popen_kwargs["start_new_session"] = True
|
||||
proc = subprocess.Popen(cmd, **popen_kwargs)
|
||||
|
||||
pid_file = dir_path / "server.pid"
|
||||
with open(pid_file, "w") as f:
|
||||
@@ -803,10 +855,24 @@ def _clear_host_dir(dir_path: Path):
|
||||
session.write_bytes(saved)
|
||||
|
||||
|
||||
import base64
|
||||
import zipfile
|
||||
import tempfile
|
||||
|
||||
|
||||
def _safe_extract_zip(zipf: zipfile.ZipFile, dest_dir: Path) -> None:
|
||||
"""Extract a ZIP archive without allowing path traversal."""
|
||||
dest_dir = dest_dir.resolve()
|
||||
for member in zipf.infolist():
|
||||
member_path = Path(member.filename)
|
||||
if member_path.is_absolute():
|
||||
raise ValueError(f"Refusing to extract absolute path from archive: {member.filename}")
|
||||
target_path = (dest_dir / member_path).resolve()
|
||||
if not str(target_path).startswith(str(dest_dir) + os.sep) and target_path != dest_dir:
|
||||
raise ValueError(f"Refusing to extract path outside destination: {member.filename}")
|
||||
zipf.extractall(dest_dir)
|
||||
|
||||
|
||||
def get_export_dir() -> Path:
|
||||
"""Get the default export directory (~/voxvera-exports)."""
|
||||
export_dir = Path.home() / "voxvera-exports"
|
||||
@@ -860,7 +926,11 @@ def import_site(zip_path: str):
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
with zipfile.ZipFile(zip_path, 'r') as zipf:
|
||||
zipf.extractall(tmpdir)
|
||||
try:
|
||||
_safe_extract_zip(zipf, Path(tmpdir))
|
||||
except ValueError as e:
|
||||
print(f"Error: Invalid export file. {e}")
|
||||
return
|
||||
|
||||
tmp_path = Path(tmpdir)
|
||||
config_file = tmp_path / "config.json"
|
||||
@@ -910,6 +980,58 @@ def import_multiple_sites(source_dir: str = None):
|
||||
print("\nImport multiple complete.")
|
||||
|
||||
|
||||
def export_keys(folder_name: str):
|
||||
"""Export the onion service session key as base64 for easy copy/paste."""
|
||||
console = Console()
|
||||
session_file = DATA_DIR / "host" / folder_name / ".onionshare-session"
|
||||
if not session_file.exists():
|
||||
console.print(f"[red]{t('cli.keys_not_found', name=folder_name)}[/red]")
|
||||
return
|
||||
raw = session_file.read_bytes()
|
||||
encoded = base64.b64encode(raw).decode("ascii")
|
||||
console.print(f"\n[bold]{t('cli.keys_export_header', name=folder_name)}[/bold]")
|
||||
console.print("[yellow]" + "─" * 60 + "[/yellow]")
|
||||
console.print(encoded)
|
||||
console.print("[yellow]" + "─" * 60 + "[/yellow]")
|
||||
console.print(f"[dim]{t('cli.keys_export_hint')}[/dim]\n")
|
||||
|
||||
|
||||
def import_keys(folder_name: str):
|
||||
"""Import an onion service session key from base64 pasted by the user."""
|
||||
console = Console()
|
||||
site_dir = DATA_DIR / "host" / folder_name
|
||||
if not site_dir.exists():
|
||||
console.print(f"[red]{t('cli.keys_site_not_found', name=folder_name)}[/red]")
|
||||
return
|
||||
|
||||
session_file = site_dir / ".onionshare-session"
|
||||
if session_file.exists():
|
||||
overwrite = inquirer.confirm(message=t("cli.keys_overwrite_confirm", name=folder_name), default=False).execute()
|
||||
if not overwrite:
|
||||
console.print(f"[yellow]{t('cli.keys_import_cancelled')}[/yellow]")
|
||||
return
|
||||
|
||||
console.print(f"\n[bold]{t('cli.keys_import_prompt')}[/bold]")
|
||||
try:
|
||||
raw_input = input("> ").strip()
|
||||
except (KeyboardInterrupt, EOFError):
|
||||
console.print(f"\n[yellow]{t('cli.keys_import_cancelled')}[/yellow]")
|
||||
return
|
||||
|
||||
if not raw_input:
|
||||
console.print(f"[red]{t('cli.keys_import_empty')}[/red]")
|
||||
return
|
||||
|
||||
try:
|
||||
decoded = base64.b64decode(raw_input)
|
||||
except Exception:
|
||||
console.print(f"[red]{t('cli.keys_import_invalid')}[/red]")
|
||||
return
|
||||
|
||||
session_file.write_bytes(decoded)
|
||||
console.print(f"[green]{t('cli.keys_import_success', name=folder_name)}[/green]")
|
||||
|
||||
|
||||
def build_docs():
|
||||
"""Generate localized documentation from templates and locale data."""
|
||||
if getattr(sys, 'frozen', False):
|
||||
@@ -1029,7 +1151,7 @@ def build_site():
|
||||
if field in data and data[field]:
|
||||
# Only override if the value is different from the master default
|
||||
if data[field] != master_defaults.get(field):
|
||||
all_locales[code]["landing"][field] = data[field]
|
||||
all_locales[code]["landing"][field] = _newlines_to_br(data[field])
|
||||
|
||||
html = html.replace("{{locales}}", json.dumps(all_locales))
|
||||
|
||||
@@ -1051,7 +1173,7 @@ def build_site():
|
||||
for field in landing_fields:
|
||||
# Use data from config if available, otherwise use localized default
|
||||
value = data.get(field, landing_defaults.get(field, ""))
|
||||
|
||||
|
||||
# If the value from config is just the master default,
|
||||
# and we are NOT in English, use the localized default instead.
|
||||
if current_lang != "en":
|
||||
@@ -1060,6 +1182,7 @@ def build_site():
|
||||
|
||||
# Support Markdown-style redaction ~~text~~
|
||||
val_str = re.sub(r"~~(.*?)~~", r'<span class="redacted">\1</span>', str(value))
|
||||
val_str = _newlines_to_br(val_str)
|
||||
html = html.replace(f"{{{{t_landing_{field}}}}}", val_str)
|
||||
|
||||
# 3. Update relative path for download
|
||||
@@ -1067,7 +1190,8 @@ def build_site():
|
||||
|
||||
# 4. Inject site-specific config data (handles any remaining {{key}} placeholders)
|
||||
for key, value in data.items():
|
||||
html = html.replace(f"{{{{{key}}}}}", str(value))
|
||||
val_str = _newlines_to_br(str(value))
|
||||
html = html.replace(f"{{{{{key}}}}}", val_str)
|
||||
|
||||
os.makedirs(dest_site, exist_ok=True)
|
||||
with open(dest_site / "index.html", "w") as fh:
|
||||
@@ -1080,11 +1204,15 @@ def build_site():
|
||||
# Bundle source version
|
||||
bundle_source(download_dir / "voxvera-source.zip")
|
||||
|
||||
# Copy standalone binaries if they exist
|
||||
# Copy standalone binaries if they exist, but avoid writing oversized
|
||||
# artifacts into the tracked site tree where GitHub rejects >100 MB files.
|
||||
bin_dir = ROOT / "resources" / "bin"
|
||||
if bin_dir.exists():
|
||||
for bin_file in bin_dir.iterdir():
|
||||
if bin_file.is_file():
|
||||
if bin_file.stat().st_size > GITHUB_RECOMMENDED_BINARY_LIMIT:
|
||||
print(f"Skipping oversized site download artifact: {bin_file.name}")
|
||||
continue
|
||||
shutil.copy(bin_file, download_dir / bin_file.name)
|
||||
|
||||
print("site/ directory successfully synchronized.")
|
||||
@@ -1129,6 +1257,75 @@ def batch_import_configs():
|
||||
dest_config.unlink(missing_ok=True)
|
||||
|
||||
|
||||
def _get_preset_dir() -> Path:
|
||||
"""Return a usable Path to the bundled presets directory."""
|
||||
if getattr(sys, 'frozen', False):
|
||||
return Path(sys._MEIPASS).joinpath("voxvera", "templates", "presets")
|
||||
return Path(resources.files(__package__).joinpath("templates", "presets"))
|
||||
|
||||
|
||||
def list_presets() -> list[dict]:
|
||||
"""Return metadata for all bundled preset templates."""
|
||||
preset_dir = _get_preset_dir()
|
||||
presets = []
|
||||
if not preset_dir.exists():
|
||||
return presets
|
||||
for f in sorted(preset_dir.glob("*.json")):
|
||||
if f.stem in ("blank", "example"):
|
||||
continue
|
||||
try:
|
||||
data = json.loads(f.read_text(encoding="utf-8"))
|
||||
presets.append({"id": f.stem, "file": str(f), "name": data.get("name", f.stem)})
|
||||
except Exception:
|
||||
pass
|
||||
return presets
|
||||
|
||||
|
||||
def create_from_template(console):
|
||||
"""Show template picker, pre-fill config, then hand off to interactive_update."""
|
||||
from InquirerPy.base.control import Choice
|
||||
|
||||
presets = list_presets()
|
||||
if not presets:
|
||||
console.print("[yellow]No templates found.[/yellow]")
|
||||
return
|
||||
|
||||
# Build choices with localized names where available
|
||||
choices = []
|
||||
for p in presets:
|
||||
localized_name = t(f"templates.{p['id']}.name")
|
||||
display = localized_name if localized_name != f"templates.{p['id']}.name" else p["name"]
|
||||
choices.append(Choice(p, display))
|
||||
choices.append(Choice(None, t("cli.manage_action_back")))
|
||||
|
||||
selected = inquirer.select(
|
||||
message=t("cli.template_select"),
|
||||
choices=choices
|
||||
).execute()
|
||||
|
||||
if selected is None:
|
||||
return
|
||||
|
||||
# Load the preset JSON
|
||||
preset_data = json.loads(Path(selected["file"]).read_text(encoding="utf-8"))
|
||||
template_id = selected["id"]
|
||||
|
||||
# Override content fields with locale translations if available
|
||||
for field in ["name", "title", "subtitle", "headline", "content", "url_message"]:
|
||||
localized = t(f"templates.{template_id}.{field}")
|
||||
if localized != f"templates.{template_id}.{field}":
|
||||
preset_data[field] = localized
|
||||
|
||||
# Write to temp config
|
||||
config_path = DATA_DIR / "config.json"
|
||||
save_config(preset_data, str(config_path))
|
||||
|
||||
# Let user customize, build, and serve
|
||||
interactive_update(str(config_path))
|
||||
build_assets(str(config_path))
|
||||
serve(str(config_path))
|
||||
|
||||
|
||||
def _seed_bundled_sites():
|
||||
"""Copy bundled example sites from ROOT/host/ to DATA_DIR/host/ if they
|
||||
don't already exist there. This runs once — after that, only DATA_DIR is
|
||||
@@ -1144,6 +1341,27 @@ def _seed_bundled_sites():
|
||||
shutil.copytree(src, dest)
|
||||
|
||||
|
||||
def rebuild_all_sites():
|
||||
"""Rebuild index.html for all existing sites from the current master template.
|
||||
|
||||
Preserves config.json, .onionshare-session keys, and download/ content.
|
||||
Only regenerates the HTML and QR codes.
|
||||
"""
|
||||
servers = get_servers()
|
||||
if not servers:
|
||||
print("No sites found to rebuild.")
|
||||
return
|
||||
print(f"Rebuilding {len(servers)} site(s) from current template...")
|
||||
for name in servers:
|
||||
config_path = DATA_DIR / "host" / name / "config.json"
|
||||
try:
|
||||
build_assets(str(config_path))
|
||||
print(f" Rebuilt: {name}")
|
||||
except Exception as e:
|
||||
print(f" Failed to rebuild {name}: {e}")
|
||||
print("Rebuild complete.")
|
||||
|
||||
|
||||
def get_servers() -> list[str]:
|
||||
"""Return server names found in DATA_DIR/host only."""
|
||||
host_dir = DATA_DIR / "host"
|
||||
@@ -1223,6 +1441,152 @@ def delete_server(folder_name: str):
|
||||
print(f"Deleted server {folder_name}")
|
||||
|
||||
|
||||
def start_all_servers():
|
||||
"""Non-interactive: start every configured site that isn't already running."""
|
||||
_seed_bundled_sites()
|
||||
servers = get_servers()
|
||||
if not servers:
|
||||
print("No sites configured.")
|
||||
return
|
||||
for s in servers:
|
||||
if is_server_running(s):
|
||||
print(f"[SKIP] {s} already running")
|
||||
continue
|
||||
config_path = DATA_DIR / "host" / s / "config.json"
|
||||
try:
|
||||
url = serve(str(config_path))
|
||||
if url:
|
||||
print(f"[OK] {s}: {url}")
|
||||
else:
|
||||
print(f"[FAIL] {s}: could not obtain onion URL")
|
||||
except Exception as e:
|
||||
print(f"[FAIL] {s}: {e}")
|
||||
|
||||
|
||||
def stop_all_servers():
|
||||
"""Non-interactive: stop every running site."""
|
||||
servers = get_servers()
|
||||
stopped = False
|
||||
for s in servers:
|
||||
if is_server_running(s):
|
||||
stop_server(s)
|
||||
stopped = True
|
||||
if not stopped:
|
||||
print("No running sites.")
|
||||
|
||||
|
||||
def install_autostart():
|
||||
"""Install a platform-appropriate mechanism to start sites on boot."""
|
||||
import platform
|
||||
system = platform.system()
|
||||
|
||||
if system == "Linux":
|
||||
_install_systemd_autostart()
|
||||
elif system == "Darwin":
|
||||
_install_launchd_autostart()
|
||||
elif system == "Windows":
|
||||
_install_windows_autostart()
|
||||
else:
|
||||
print(f"Autostart not supported on {system}. "
|
||||
"Run 'voxvera start-all' manually or add it to your init system.")
|
||||
|
||||
|
||||
def _find_voxvera_bin() -> str:
|
||||
"""Return the absolute path to the voxvera binary/script."""
|
||||
voxvera_bin = shutil.which("voxvera")
|
||||
if voxvera_bin:
|
||||
return str(Path(voxvera_bin).resolve())
|
||||
# Fallback: current executable
|
||||
return str(Path(sys.argv[0]).resolve())
|
||||
|
||||
|
||||
def _install_systemd_autostart():
|
||||
"""Install a systemd user service for Linux."""
|
||||
service_dir = Path.home() / ".config" / "systemd" / "user"
|
||||
service_dir.mkdir(parents=True, exist_ok=True)
|
||||
service_file = service_dir / "voxvera.service"
|
||||
voxvera_bin = _find_voxvera_bin()
|
||||
|
||||
unit = f"""\
|
||||
[Unit]
|
||||
Description=VoxVera Onion Sites
|
||||
After=network-online.target tor.service
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart={voxvera_bin} start-all
|
||||
ExecStop={voxvera_bin} stop-all
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
"""
|
||||
service_file.write_text(unit)
|
||||
os.system("systemctl --user daemon-reload")
|
||||
os.system("systemctl --user enable voxvera.service")
|
||||
os.system("systemctl --user start voxvera.service")
|
||||
# loginctl enable-linger ensures user services start at boot even without login
|
||||
os.system(f"loginctl enable-linger {os.environ.get('USER', '')}")
|
||||
print(f"Systemd user service installed: {service_file}")
|
||||
print("Sites will start automatically on boot.")
|
||||
print(" Manage with: systemctl --user [start|stop|status|disable] voxvera")
|
||||
|
||||
|
||||
def _install_launchd_autostart():
|
||||
"""Install a launchd plist for macOS."""
|
||||
agents_dir = Path.home() / "Library" / "LaunchAgents"
|
||||
agents_dir.mkdir(parents=True, exist_ok=True)
|
||||
plist_file = agents_dir / "org.voxvera.start-all.plist"
|
||||
voxvera_bin = _find_voxvera_bin()
|
||||
|
||||
plist = f"""\
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>org.voxvera.start-all</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>{voxvera_bin}</string>
|
||||
<string>start-all</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>StandardOutPath</key>
|
||||
<string>{Path.home()}/host/voxvera-autostart.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>{Path.home()}/host/voxvera-autostart.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
"""
|
||||
plist_file.write_text(plist)
|
||||
os.system(f"launchctl load -w {plist_file}")
|
||||
print(f"LaunchAgent installed: {plist_file}")
|
||||
print("Sites will start automatically on login.")
|
||||
print(f" Disable with: launchctl unload {plist_file}")
|
||||
|
||||
|
||||
def _install_windows_autostart():
|
||||
"""Add a startup shortcut or scheduled task on Windows."""
|
||||
voxvera_bin = _find_voxvera_bin()
|
||||
# Use Task Scheduler for a reliable boot-time trigger
|
||||
task_name = "VoxVera Start All"
|
||||
cmd = (
|
||||
f'schtasks /Create /F /SC ONLOGON /TN "{task_name}" '
|
||||
f'/TR "\"{voxvera_bin}\" start-all" /RL HIGHEST'
|
||||
)
|
||||
ret = os.system(cmd)
|
||||
if ret == 0:
|
||||
print(f"Windows scheduled task '{task_name}' created.")
|
||||
print("Sites will start automatically on login.")
|
||||
print(f' Remove with: schtasks /Delete /TN "{task_name}" /F')
|
||||
else:
|
||||
print("Failed to create scheduled task. Try running as Administrator.")
|
||||
|
||||
|
||||
def manage_servers():
|
||||
from InquirerPy import inquirer
|
||||
from InquirerPy.base.control import Choice
|
||||
@@ -1251,6 +1615,7 @@ def manage_servers():
|
||||
choices.append(Choice(s, label))
|
||||
|
||||
choices.insert(0, Choice("create_new", t("cli.manage_create_new")))
|
||||
choices.insert(1, Choice("from_template", t("cli.manage_templates")))
|
||||
if servers:
|
||||
choices.append(Choice("start_all", t("cli.manage_start_all")))
|
||||
choices.append(Choice("stop_all", t("cli.manage_stop_all")))
|
||||
@@ -1287,6 +1652,16 @@ def manage_servers():
|
||||
console.print("\n[yellow]Site creation cancelled.[/yellow]")
|
||||
continue
|
||||
|
||||
if selected == "from_template":
|
||||
try:
|
||||
create_from_template(console)
|
||||
except (KeyboardInterrupt, Exception) as e:
|
||||
if not isinstance(e, KeyboardInterrupt):
|
||||
console.print(f"[red]Error creating site from template: {e}[/red]")
|
||||
else:
|
||||
console.print("\n[yellow]Template creation cancelled.[/yellow]")
|
||||
continue
|
||||
|
||||
if selected == "start_all":
|
||||
results = []
|
||||
for s in servers:
|
||||
@@ -1325,6 +1700,8 @@ def manage_servers():
|
||||
Choice("toggle", t("cli.manage_action_toggle_stop") if running else t("cli.manage_action_toggle_start")),
|
||||
Choice("edit", t("cli.manage_action_edit")),
|
||||
Choice("export", t("cli.manage_action_export")),
|
||||
Choice("export_keys", t("cli.manage_action_export_keys")),
|
||||
Choice("import_keys", t("cli.manage_action_import_keys")),
|
||||
Choice("delete", t("cli.manage_action_delete")),
|
||||
Choice(None, t("cli.manage_action_back"))
|
||||
]
|
||||
@@ -1357,6 +1734,10 @@ def manage_servers():
|
||||
console.print("\n[yellow]Update cancelled.[/yellow]")
|
||||
elif action == "export":
|
||||
export_site(selected)
|
||||
elif action == "export_keys":
|
||||
export_keys(selected)
|
||||
elif action == "import_keys":
|
||||
import_keys(selected)
|
||||
elif action == "delete":
|
||||
confirm = inquirer.confirm(message=t("cli.manage_delete_confirm", name=selected)).execute()
|
||||
if confirm:
|
||||
@@ -1458,6 +1839,10 @@ def main(argv=None):
|
||||
sub.add_parser("build-docs", help="Generate localized documentation from templates")
|
||||
sub.add_parser("build-site", help="Refresh the main site/ directory assets and bundle")
|
||||
sub.add_parser("manage", help="Manage VoxVera servers interactively")
|
||||
sub.add_parser("start-all", help="Start all configured sites (non-interactive)")
|
||||
sub.add_parser("stop-all", help="Stop all running sites (non-interactive)")
|
||||
sub.add_parser("autostart", help="Install/remove a systemd user service to start sites on boot")
|
||||
sub.add_parser("rebuild-all", help="Rebuild all existing sites from the current template (preserves keys and config)")
|
||||
sub.add_parser("_internal_onionshare", help=argparse.SUPPRESS)
|
||||
|
||||
args, unknown_args = parser.parse_known_args(argv)
|
||||
@@ -1479,7 +1864,7 @@ def main(argv=None):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if not current_lang and args.command in ["init", "quickstart", "manage"]:
|
||||
if not current_lang and args.command in ("init", "quickstart", "manage"):
|
||||
current_lang = choose_language()
|
||||
# Save choice to config if possible
|
||||
if config_path.exists():
|
||||
@@ -1532,6 +1917,12 @@ def main(argv=None):
|
||||
batch_import_configs()
|
||||
elif args.command == "manage":
|
||||
manage_servers()
|
||||
elif args.command == "start-all":
|
||||
start_all_servers()
|
||||
elif args.command == "stop-all":
|
||||
stop_all_servers()
|
||||
elif args.command == "autostart":
|
||||
install_autostart()
|
||||
elif args.command == "quickstart":
|
||||
if not args.non_interactive:
|
||||
if not sys.stdin.isatty():
|
||||
@@ -1551,6 +1942,8 @@ def main(argv=None):
|
||||
build_docs()
|
||||
elif args.command == "build-site":
|
||||
build_site()
|
||||
elif args.command == "rebuild-all":
|
||||
rebuild_all_sites()
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"title": "TOP SECRET",
|
||||
"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",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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": "Get VoxVera and start spreading your message.",
|
||||
"url": "https://github.com/PR0M3TH3AN/VoxVera",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
|
||||
Binary file not shown.
@@ -4,7 +4,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=850">
|
||||
<title id="site-title">Vox Vera Printable Flyers</title>
|
||||
<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', 'Noto Sans SC', 'Noto Sans Arabic UI', monospace;
|
||||
@@ -169,20 +169,21 @@
|
||||
|
||||
.content {
|
||||
width: calc(8.5in - 3.75in);
|
||||
padding: 20px;
|
||||
padding: 15px 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
justify-content: flex-start;
|
||||
page-break-inside: avoid;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
font-size: 24px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 2px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
@@ -192,7 +193,10 @@
|
||||
|
||||
.distribute {
|
||||
font-size: 18px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 6px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -204,8 +208,8 @@
|
||||
}
|
||||
|
||||
.message {
|
||||
height: 6in; /* Fixed height to prevent footer push-out */
|
||||
margin-top: 10px;
|
||||
flex: 1;
|
||||
margin-top: 4px;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
text-align: left;
|
||||
@@ -265,7 +269,7 @@
|
||||
border: none;
|
||||
border-top: 1px solid #000;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
@@ -378,7 +382,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.", "name": "Vox Vera Printable Flyers"}}, "de": {"meta": {"language_name": "Deutsch", "flag": "\ud83c\udde9\ud83c\uddea"}, "web": {"teLine truncated
|
||||
const locales = {{locales}}; // Injected at build time
|
||||
|
||||
function t(path, lang) {
|
||||
const parts = path.split('.');
|
||||
@@ -441,10 +445,10 @@
|
||||
<div class="left-tear-offs">
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -453,10 +457,10 @@
|
||||
<!-- Repeat for other tear-offs -->
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -464,10 +468,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -475,10 +479,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -486,10 +490,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -497,10 +501,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -508,10 +512,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -519,10 +523,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -530,10 +534,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -541,10 +545,10 @@
|
||||
</div>
|
||||
<div class="tear-off">
|
||||
<div class="tear-off-text">
|
||||
<span data-i18n="web.tear_off_tor_browser">Use Tor Browser</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">to help spread this message go to</span><br>
|
||||
<a class="tear-off-link" href="https://voxvera.org/" target="_blank">https://voxvera.org/</a><br>
|
||||
<span data-i18n="web.tear_off_footer">click the button below to print</span>
|
||||
<span data-i18n="web.tear_off_tor_browser">{{t_web_tear_off_tor_browser}}</span><br><br>
|
||||
<span data-i18n="web.tear_off_desc">{{t_web_tear_off_desc}}</span><br>
|
||||
<a class="tear-off-link" href="{{tear_off_link}}" target="_blank">{{tear_off_link}}</a><br>
|
||||
<span data-i18n="web.tear_off_footer">{{t_web_tear_off_footer}}</span>
|
||||
</div>
|
||||
<div class="qr-code">
|
||||
<img src="qrcode-tear-offs.png" alt="QR Code">
|
||||
@@ -552,39 +556,32 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<h1 id="top-secret-title" data-i18n="landing.title">TOP SECRET</h1>
|
||||
<div class="distribute" id="do-not-distribute" data-i18n="landing.subtitle">DO <span class="redacted">NOT</span> DISTRIBUTE</div>
|
||||
<h1 id="operation-title-2" data-i18n="landing.headline">OPERATION VOX VERA</h1>
|
||||
<h1 id="top-secret-title" data-i18n="landing.title">{{t_landing_title}}</h1>
|
||||
<div class="distribute" id="do-not-distribute" data-i18n="landing.subtitle">{{t_landing_subtitle}}</div>
|
||||
<h1 id="operation-title-2" data-i18n="landing.headline">{{t_landing_headline}}</h1>
|
||||
<hr>
|
||||
<div class="message">
|
||||
<div class="text-container" id="main-content" contenteditable="false" data-i18n="landing.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.
|
||||
|
||||
Use 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.
|
||||
|
||||
Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.
|
||||
|
||||
Join us in a revolution that values truth and transparency. Together, we can build a network of informed citizens who are unafraid to speak out.
|
||||
</div>
|
||||
<div class="text-container" id="main-content" contenteditable="false" data-i18n="landing.content">{{t_landing_content}}</div>
|
||||
<div class="qr-code-body">
|
||||
|
||||
<div class="qr-code-url">
|
||||
<span class="url-message" data-i18n="landing.url_message">Get VoxVera and start spreading your message.</span><br><br>
|
||||
<a id="qr-link-2" href="https://github.com/PR0M3TH3AN/VoxVera" target="_blank">https://github.com/PR0M3TH3AN/VoxVera</a>
|
||||
<span class="url-message" data-i18n="landing.url_message">{{t_landing_url_message}}</span><br><br>
|
||||
<a id="qr-link-2" href="{{url}}" target="_blank">{{url}}</a>
|
||||
</div>
|
||||
<img src="qrcode-content.png" alt="QR Code">
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="footer">
|
||||
<p class="credit"><span data-i18n="web.built_with">built with</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
|
||||
<p class="binary" id="binary-message">0110010 0101011 0110010 0111101 0110100</p>
|
||||
<p class="credit"><span data-i18n="web.built_with">{{t_web_built_with}}</span> <a href="https://github.com/PR0M3TH3AN/VoxVera">voxvera</a></p>
|
||||
<p class="binary" id="binary-message">{{binary_message}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-bar">
|
||||
<button class="print-button" onclick="window.print()" data-i18n="web.print_button">Print this page</button>
|
||||
<button class="print-button" onclick="window.print()" data-i18n="web.print_button">{{t_web_print_button}}</button>
|
||||
<a id="download-link" href="download/voxvera-source.zip" download>
|
||||
<button class="download-button" data-i18n="web.download_button">Download Source Code</button>
|
||||
<button class="download-button" data-i18n="web.download_button">{{t_web_download_button}}</button>
|
||||
</a>
|
||||
<select class="lang-select" id="lang-selector" onchange="setLanguage(this.value)"></select>
|
||||
</div>
|
||||
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "لم يتم تكوين أي روابط بعد. سيتم إنشاء أكواد QR بعد 'voxvera serve'",
|
||||
"input_file_not_found": "ملف الإدخال {path} غير موجود.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- إنشاء من قالب ---",
|
||||
"template_select": "اختر قالباً:",
|
||||
"body_over_limit_warning": "تحذير: نص المحتوى يتجاوز 1000 حرف. قد يتم قطعه في المنشور.",
|
||||
"manage_action_export_keys": "تصدير المفاتيح",
|
||||
"manage_action_import_keys": "استيراد المفاتيح",
|
||||
"keys_not_found": "لم يتم العثور على مفتاح جلسة لـ '{name}'. قم بتشغيل الموقع أولاً لتوليد المفاتيح.",
|
||||
"keys_export_header": "مفتاح الجلسة لـ '{name}':",
|
||||
"keys_export_hint": "انسخ هذا المفتاح واحفظه بأمان. استخدم 'استيراد المفاتيح' في نسخة أخرى للاستعادة.",
|
||||
"keys_site_not_found": "الموقع '{name}' غير موجود.",
|
||||
"keys_overwrite_confirm": "الموقع '{name}' لديه مفتاح بالفعل. هل تريد الكتابة فوقه؟",
|
||||
"keys_import_cancelled": "تم إلغاء الاستيراد.",
|
||||
"keys_import_prompt": "الصق مفتاح الجلسة base64 أدناه:",
|
||||
"keys_import_empty": "لم يتم تقديم مفتاح.",
|
||||
"keys_import_invalid": "تنسيق المفتاح غير صالح. يجب أن يكون سلسلة base64 صالحة.",
|
||||
"keys_import_success": "تم استيراد مفتاح الجلسة لـ '{name}'. أعد تشغيل الموقع لاستخدام المفتاح الجديد."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "استخدم متصفح Tor",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "سري للغاية",
|
||||
"subtitle": "~~لا~~ للنشر",
|
||||
"headline": "عملية VOX VERA",
|
||||
"content": "تحرر من الرقابة مع VoxVera. أداة تسويق عصابات مجهولة ونشر رسائل. سواء عبر الإنترنت أو في العالم المادي، يمكنها تمكينك من نشر أفكارك بجرأة، محمية بإخفاء الهوية الكامل (إذا كنت تستضيف عبر Tor). قم بتحميل الكود، وصمم موقع منشور، واستضيفه عبر الإنترنت وقم بتضخيم رسالتك.\n\nاستخدم القوة الميمية لمشاركة أفكارك في مدرستك، أو مكان عملك، أو مجتمعاتك عبر الإنترنت، أو حتى على مستوى العالم. تضمن VoxVera تردد صدى رسالتك بعيداً وعلى نطاق واسع، مع أقسام قابلة للنزع تتميز بروابط فريدة وأكواد QR لسهولة إعادة الطباعة.\n\nيمكن الحفاظ على الخصوصية. يمكن مشاركة المنشورات عبر شبكة Tor، مما يحمي المضيف والمستخدمين من الرقابة.\n\nانضم إلينا في ثورة تقدر الحقيقة والشفافية. معاً، يمكننا بناء شبكة من المواطنين المستنيرين الذين لا يخشون التحدث.",
|
||||
"content": "تحرر من الرقابة مع VoxVera. أداة تسويق عصابات مجهولة ونشر رسائل. سواء عبر الإنترنت أو في العالم المادي، يمكنها تمكينك من نشر أفكارك بجرأة، محمية بإخفاء الهوية الكامل (إذا كنت تستضيف عبر Tor). قم بتحميل الكود، وصمم موقع منشور، واستضيفه عبر الإنترنت وقم بتضخيم رسالتك.<br><br>استخدم القوة الميمية لمشاركة أفكارك في مدرستك، أو مكان عملك، أو مجتمعاتك عبر الإنترنت، أو حتى على مستوى العالم. تضمن VoxVera تردد صدى رسالتك بعيداً وعلى نطاق واسع، مع أقسام قابلة للنزع تتميز بروابط فريدة وأكواد QR لسهولة إعادة الطباعة.<br><br>يمكن الحفاظ على الخصوصية. يمكن مشاركة المنشورات عبر شبكة Tor، مما يحمي المضيف والمستخدمين من الرقابة.<br><br>انضم إلينا في ثورة تقدر الحقيقة والشفافية. معاً، يمكننا بناء شبكة من المواطنين المستنيرين الذين لا يخشون التحدث.",
|
||||
"url_message": "احصل على VoxVera وابدأ بنشر رسالتك.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "منشورات Vox Vera القابلة للطباعة"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "مشروع AOS",
|
||||
"title": "ANDROID بلا قيود",
|
||||
"subtitle": "بدون حدود",
|
||||
"headline": "حرية المصدر المفتوح",
|
||||
"content": "يمثل مشروع Android مفتوح المصدر (AOSP) جوهر ما كان Android مخصصاً له في الأصل: منصة مفتوحة وشفافة وقابلة للتكيف. يزيل طبقات البرمجيات الاحتكارية والرقابة المؤسسية التي أصبحت مرادفة لتوزيعات Android السائدة. مع AOSP، تحصل على إمكانية الوصول إلى نسخة خام وغير مفلترة من Android، مما يتيح لك جعل جهازك ملكك حقاً.<br><br>للمطورين، يقدم AOSP ساحة من الإمكانيات، حيث الحدود الوحيدة هي مهاراتك وخيالك. يعمل كأساس لعدد لا يحصى من الرومات المخصصة، كل منها مصمم لاحتياجات محددة، سواء كان ذلك للأداء المحسن أو الخصوصية أو ميزات فريدة تفتقر إليها الإصدارات السائدة. سيقدر المهتمون بالخصوصية غياب البرامج المثبتة مسبقاً وخدمات التتبع التي تأتي غالباً مع Android المصنعي.<br><br>AOSP ليس فقط للمطورين أو عشاق التكنولوجيا؛ إنه لأي شخص يقدر الحرية الرقمية. يتيح لك استعادة السيطرة على جهازك، وتخصيصه وفقاً لاحتياجاتك دون قيود شركات الاتصالات أو الشركات المصنعة. اكتشف كيف يمكن لـ AOSP تحويل تجربتك مع الهاتف المحمول. ابدأ رحلتك نحو مستقبل أكثر انفتاحاً وتخصيصاً اليوم.",
|
||||
"url_message": "قم بزيارة الرابط أدناه لمعرفة المزيد."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "منشورات ثورة Bitcoin",
|
||||
"title": "قواعد بدون حكام",
|
||||
"subtitle": "لا تتجاهل",
|
||||
"headline": "انضم إلى ثورة BITCOIN",
|
||||
"content": "ما هو Bitcoin؟ إنه أكثر من مجرد نقود رقمية؛ إنه تقنية ثورية مصممة لحل بعض أكثر مشاكل العالم إلحاحاً. يعمل Bitcoin على شبكة لامركزية، خالية من سيطرة أي حكومة أو سلطة مركزية. هذا يضمن أن لا أحد يمكنه التلاعب بعرضه أو قيمته، مما يجعله شكلاً سليماً من المال يحمي ثروتك من التضخم.<br><br>نظامنا المالي الحالي مبني على حوافز معيبة—تشجع الدين والتبعية ومركزية السلطة. Bitcoin يغير ذلك بإنشاء نظام حيث يُكافأ الصدق والشفافية والمسؤولية الفردية. في شبكة Bitcoin، لا مجال للفساد أو التلاعب لأن القواعد تُطبق بالرياضيات، وليس بالأشخاص.<br><br>Bitcoin يوائم الحوافز بطريقة تعزز التفكير طويل الأمد والادخار والابتكار. يمكّن الأفراد من السيطرة على مستقبلهم المالي، معززاً مجتمعاً عالمياً حيث يمكن نقل القيمة بحرية وأمان دون وسطاء. لهذا نحتاج Bitcoin—لأنه يخلق عالماً حيث الحوافز متوائمة بشكل صحيح، مما يؤدي إلى مجتمع أكثر عدلاً وازدهاراً للجميع.<br><br>اتخذ الخطوة لمعرفة المزيد عن Bitcoin وكيف يمكنه تحويل ليس فقط حياتك المالية، بل العالم. انزع رابطاً من اليسار واستكشف هذه التقنية الرائدة. انضم إلى الحركة نحو مستقبل أفضل.",
|
||||
"url_message": "اتبع هذا الرابط لمعرفة المزيد."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "رسالة تغير الحياة",
|
||||
"title": "أخبار سارة",
|
||||
"subtitle": "لا تتجاهل",
|
||||
"headline": "اكتشف الأمل الحقيقي",
|
||||
"content": "من هو Jesus؟ إنه أكثر من مجرد شخصية تاريخية؛ إنه ابن الله، مخلص العالم. قال Jesus نفسه: 'أنا هو الطريق والحق والحياة. لا يأتي أحد إلى الآب إلا بي' (يوحنا 14:6). جاء ليسد الفجوة بين الله والبشرية، مقدماً لنا طريقاً نحو المغفرة والسلام والحياة الأبدية.<br><br>نواجه جميعاً كسراً في حياتنا—سواء في علاقاتنا أو قلوبنا أو عالمنا. جاء Jesus ليشفي ذلك الكسر. عاش حياة كاملة، ومات على الصليب من أجل خطايانا، وقام من الموت، هازماً الموت ومقدماً لنا رجاء الحياة الأبدية مع الله.<br><br>بدون Jesus، نحن ضائعون في خطايانا، منفصلون عن الله. لكن من خلاله، يمكننا أن نُغفر ونُستعاد. يقدم لنا ليس فقط حياة أفضل الآن، بل وعد حياة أبدية معه. لهذا نحتاجه—لأنه فقط في Jesus يمكننا أن نجد السلام الحقيقي والهدف وضمان الحياة الأبدية.<br><br>اتخذ الخطوة لمعرفة المزيد عن Jesus والتأثير المغير للحياة الذي يمكن أن يحدثه في حياتك. انزع رابطاً من اليسار واستكشف تعاليمه. اعثر على الأمل الذي كنت تبحث عنه.",
|
||||
"url_message": "اتبع هذا الرابط لمعرفة المزيد."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "منشورات شبكة Meshtastic",
|
||||
"title": "اتصالات آمنة",
|
||||
"subtitle": "لا تتجاهل",
|
||||
"headline": "ابنِ شبكة الطوارئ الخاصة بك",
|
||||
"content": "لماذا Meshtastic؟ في أوقات الأزمات، يمكن أن تفشل شبكات الاتصال التقليدية، مما يتركنا معزولين وضعفاء. يوفر Meshtastic حلاً قوياً—شبكة اتصالات محلية بديلة تعمل بشكل مستقل عن الأنظمة المركزية. صُمم لحالات الطوارئ، مما يتيح لك البقاء على اتصال عندما يكون الأمر أكثر أهمية.<br><br>تنشئ أجهزة Meshtastic شبكة متداخلة يمكنها إعادة توجيه الرسائل عبر مسافات طويلة، حتى بدون تغطية إنترنت أو خلوية. يضمن هذا النهج اللامركزي أن اتصالاتك مرنة وموثوقة، بغض النظر عن الظروف. لكن الأمر لا يتعلق فقط بالبقاء على اتصال—يوفر Meshtastic أيضاً التشفير، لتبقى رسائلك آمنة وخاصة.<br><br>في عالم تُنتهك فيه الخصوصية بشكل متزايد، يمكّنك Meshtastic من السيطرة على اتصالاتك. سواء كنت تنسق استجابة مجتمعية محلية، أو تبقى على تواصل مع أحبائك خلال كارثة، أو تستعد ببساطة لما هو غير متوقع، يوفر Meshtastic الأدوات التي تحتاجها للتواصل بأمان وفعالية.<br><br>اتخذ الخطوة لمعرفة المزيد عن Meshtastic وكيف يمكنك بناء شبكة اتصالات الطوارئ الخاصة بك. انزع رابطاً من اليسار واستكشف هذه التقنية المبتكرة. تأكد من استعدادك لأي شيء قد يحدث.",
|
||||
"url_message": "اتبع هذا الرابط لمعرفة المزيد."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "منشورات بروتوكول Nostr",
|
||||
"title": "حرية اجتماعية",
|
||||
"subtitle": "لا تتجاهل",
|
||||
"headline": "انضم إلى الشبكة المقاومة للرقابة",
|
||||
"content": "ما هو Nostr؟ على عكس منصات التواصل الاجتماعي التقليدية، فإن Nostr هو بروتوكول—نظام لامركزي يمكّن المستخدمين من الاتصال والمشاركة دون قيود سلطة مركزية. Nostr مقاوم للرقابة، مما يعني أن صوتك لا يمكن إسكاته من قبل الشركات أو الحكومات. صُمم ليمنحك السيطرة على حضورك عبر الإنترنت، بعيداً عن تأثير الخوارزميات أو الإعلانات التي تعطي الأولوية للتفاعل على الروابط الحقيقية.<br><br>في Nostr، لا توجد أجندات خفية لإبقائك تتصفح بلا نهاية. تتفاعل مع المحتوى بشروطك، وليس بناءً على ما تعتقد الخوارزمية أنه سيبقيك متصلاً لأطول فترة. يتيح لك Nostr بناء روابط حقيقية والمشاركة في محادثات مهمة، كل ذلك مع الحفاظ على خصوصيتك واستقلاليتك.<br><br>في عالم يتم فيه التحكم في الخطاب عبر الإنترنت والتلاعب به بشكل متزايد، يقدم Nostr بديلاً منعشاً. إنه ليس مجرد منصة؛ إنه حركة نحو الحرية الرقمية الحقيقية، حيث تكون تفاعلاتك مدفوعة باهتماماتك وقيمك، وليس بما يولد أكبر إيرادات إعلانية.<br><br>اتخذ الخطوة لمعرفة المزيد عن Nostr وكيف يمكنه تحويل طريقة تواصلك عبر الإنترنت. انزع رابطاً من اليسار واستكشف هذا البروتوكول الرائد. انضم إلى مجتمع يقدر الحرية والتفاعل الحقيقي.",
|
||||
"url_message": "اتبع هذا الرابط لمعرفة المزيد."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "منشورات Vox Vera القابلة للطباعة",
|
||||
"title": "سري للغاية",
|
||||
"subtitle": "~~لا~~ للنشر",
|
||||
"headline": "عملية VOX VERA",
|
||||
"content": "تحرر من الرقابة مع VoxVera. أداة تسويق عصابات مجهولة ونشر رسائل. سواء عبر الإنترنت أو في العالم المادي، يمكنها تمكينك من نشر أفكارك بجرأة، محمية بإخفاء الهوية الكامل (إذا كنت تستضيف عبر Tor). قم بتحميل الكود، وصمم موقع منشور، واستضيفه عبر الإنترنت وقم بتضخيم رسالتك.<br><br>استخدم القوة الميمية لمشاركة أفكارك في مدرستك، أو مكان عملك، أو مجتمعاتك عبر الإنترنت، أو حتى على مستوى العالم. تضمن VoxVera تردد صدى رسالتك بعيداً وعلى نطاق واسع، مع أقسام قابلة للنزع تتميز بروابط فريدة وأكواد QR لسهولة إعادة الطباعة.<br><br>يمكن الحفاظ على الخصوصية. يمكن مشاركة المنشورات عبر شبكة Tor، مما يحمي المضيف والمستخدمين من الرقابة.<br><br>انضم إلينا في ثورة تقدر الحقيقة والشفافية. معاً، يمكننا بناء شبكة من المواطنين المستنيرين الذين لا يخشون التحدث.",
|
||||
"url_message": "احصل على VoxVera وابدأ بنشر رسالتك."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -73,7 +73,22 @@
|
||||
"no_urls_qr_skip": "Noch keine URLs konfiguriert. QR-Codes werden nach 'voxvera serve' generiert",
|
||||
"input_file_not_found": "Eingabedatei {path} existiert nicht.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Aus Vorlage erstellen ---",
|
||||
"template_select": "Wählen Sie eine Vorlage:",
|
||||
"body_over_limit_warning": "Warnung: Der Textkörper überschreitet 1000 Zeichen. Er könnte auf dem Flyer abgeschnitten werden.",
|
||||
"manage_action_export_keys": "Schlüssel exportieren",
|
||||
"manage_action_import_keys": "Schlüssel importieren",
|
||||
"keys_not_found": "Kein Sitzungsschlüssel für '{name}' gefunden. Starten Sie die Seite zuerst, um Schlüssel zu generieren.",
|
||||
"keys_export_header": "Sitzungsschlüssel für '{name}':",
|
||||
"keys_export_hint": "Kopieren Sie diesen Schlüssel und bewahren Sie ihn sicher auf. Verwenden Sie 'Schlüssel importieren' auf einer anderen Instanz zur Wiederherstellung.",
|
||||
"keys_site_not_found": "Seite '{name}' nicht gefunden.",
|
||||
"keys_overwrite_confirm": "Seite '{name}' hat bereits einen Schlüssel. Überschreiben?",
|
||||
"keys_import_cancelled": "Import abgebrochen.",
|
||||
"keys_import_prompt": "Fügen Sie den base64-Sitzungsschlüssel unten ein:",
|
||||
"keys_import_empty": "Kein Schlüssel angegeben.",
|
||||
"keys_import_invalid": "Ungültiges Schlüsselformat. Muss eine gültige base64-Zeichenkette sein.",
|
||||
"keys_import_success": "Sitzungsschlüssel für '{name}' importiert. Starten Sie die Seite neu, um den neuen Schlüssel zu verwenden."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Tor-Browser verwenden",
|
||||
@@ -88,8 +103,58 @@
|
||||
"title": "STRENG GEHEIM",
|
||||
"subtitle": "~~NICHT~~ VERBREITEN",
|
||||
"headline": "OPERATION VOX VERA",
|
||||
"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.",
|
||||
"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.<br><br>Nutzen 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.<br><br>Privatsphäre kann gewahrt bleiben. Flyer können über das Tor-Network geteilt werden, was Hoster und Nutzer vor Zensur schützt.<br><br>Schließ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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vox Vera Druckflyer"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOS-Projekt",
|
||||
"title": "ANDROID ENTFESSELT",
|
||||
"subtitle": "OHNE GRENZEN",
|
||||
"headline": "OPEN-SOURCE-FREIHEIT",
|
||||
"content": "Das Android Open Source Project (AOSP) verkörpert das, wofür Android ursprünglich gedacht war: eine offene, transparente und anpassungsfähige Plattform. Es entfernt die Schichten proprietärer Software und unternehmerischer Kontrolle, die zum Synonym für gängige Android-Distributionen geworden sind. Mit AOSP erhalten Sie Zugang zu einer rohen, ungefilterten Version von Android, die es Ihnen ermöglicht, Ihr Gerät wirklich zu Ihrem eigenen zu machen.<br><br>Für Entwickler bietet AOSP einen Spielplatz der Möglichkeiten, wo die einzigen Grenzen Ihre Fähigkeiten und Vorstellungskraft sind. Es dient als Grundlage für unzählige Custom ROMs, die jeweils auf spezifische Bedürfnisse zugeschnitten sind, sei es für verbesserte Leistung, Privatsphäre oder einzigartige Funktionen, die Mainstream-Versionen fehlen. Datenschutz-Enthusiasten werden das Fehlen vorinstallierter Bloatware und Tracking-Dienste schätzen, die oft mit Standard-Android geliefert werden.<br><br>AOSP ist nicht nur für Entwickler oder Technik-Enthusiasten; es ist für jeden, der digitale Freiheit schätzt. Es ermöglicht Ihnen, die Kontrolle über Ihr Gerät zurückzugewinnen und es ohne die Einschränkungen von Anbietern oder Herstellern an Ihre Bedürfnisse anzupassen. Entdecken Sie, wie AOSP Ihre mobile Erfahrung transformieren kann. Beginnen Sie noch heute Ihre Reise in eine offenere, anpassbare Zukunft.",
|
||||
"url_message": "Besuchen Sie den untenstehenden Link, um mehr zu erfahren."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Bitcoin-Revolutions-Flyer",
|
||||
"title": "REGELN OHNE HERRSCHER",
|
||||
"subtitle": "NICHT IGNORIEREN",
|
||||
"headline": "SCHLIESSEN SIE SICH DER BITCOIN-REVOLUTION AN",
|
||||
"content": "Was ist Bitcoin? Es ist mehr als nur digitales Geld; es ist eine revolutionäre Technologie, die entwickelt wurde, um einige der drängendsten Probleme der Welt zu lösen. Bitcoin operiert auf einem dezentralen Netzwerk, frei von der Kontrolle jeder Regierung oder Zentralbehörde. Dies stellt sicher, dass niemand sein Angebot oder seinen Wert manipulieren kann, was es zu einer soliden Geldform macht, die Ihr Vermögen vor Inflation schützt.<br><br>Unser aktuelles Finanzsystem basiert auf fehlerhaften Anreizen—es fördert Verschuldung, Abhängigkeit und Zentralisierung der Macht. Bitcoin ändert das, indem es ein System schafft, in dem Ehrlichkeit, Transparenz und individuelle Verantwortung belohnt werden. Im Bitcoin-Netzwerk gibt es keinen Raum für Korruption oder Manipulation, weil die Regeln von Mathematik durchgesetzt werden, nicht von Menschen.<br><br>Bitcoin richtet Anreize so aus, dass langfristiges Denken, Sparen und Innovation gefördert werden. Es befähigt Einzelpersonen, die Kontrolle über ihre finanzielle Zukunft zu übernehmen, und fördert eine globale Gemeinschaft, in der Werte frei und sicher ohne Vermittler übertragen werden können. Deshalb brauchen wir Bitcoin—weil es eine Welt schafft, in der Anreize richtig ausgerichtet sind und zu einer gerechteren und wohlhabenderen Gesellschaft für alle führen.<br><br>Machen Sie den Schritt, mehr über Bitcoin zu erfahren und wie es nicht nur Ihr finanzielles Leben, sondern die Welt verändern kann. Reißen Sie einen Link links ab und erkunden Sie diese bahnbrechende Technologie. Schließen Sie sich der Bewegung für eine bessere Zukunft an.",
|
||||
"url_message": "Folgen Sie diesem Link, um mehr zu erfahren."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Lebensverändernde Botschaft",
|
||||
"title": "GUTE NACHRICHT",
|
||||
"subtitle": "NICHT IGNORIEREN",
|
||||
"headline": "ENTDECKE WAHRE HOFFNUNG",
|
||||
"content": "Wer ist Jesus? Er ist mehr als nur eine historische Figur; Er ist der Sohn Gottes, der Retter der Welt. Jesus selbst sagte: 'Ich bin der Weg und die Wahrheit und das Leben. Niemand kommt zum Vater außer durch mich' (Johannes 14,6). Er kam, um die Kluft zwischen Gott und der Menschheit zu überbrücken und uns einen Weg zur Vergebung, zum Frieden und zum ewigen Leben zu bieten.<br><br>Wir alle stehen vor Brüchen in unserem Leben—sei es in unseren Beziehungen, unseren Herzen oder unserer Welt. Jesus kam, um diese Brüche zu heilen. Er lebte ein vollkommenes Leben, starb am Kreuz für unsere Sünden und ist auferstanden, hat den Tod besiegt und uns die Hoffnung auf ewiges Leben mit Gott geschenkt.<br><br>Ohne Jesus sind wir in unserer Sünde verloren, von Gott getrennt. Aber durch Ihn können wir vergeben und wiederhergestellt werden. Er bietet uns nicht nur ein besseres Leben jetzt, sondern das Versprechen eines ewigen Lebens mit Ihm. Deshalb brauchen wir Ihn—denn nur in Jesus können wir wahren Frieden, Sinn und die Gewissheit des ewigen Lebens finden.<br><br>Machen Sie den Schritt, mehr über Jesus und den lebensverändernden Einfluss zu erfahren, den Er auf Ihr Leben haben kann. Reißen Sie einen Link links ab und erkunden Sie Seine Lehren. Finden Sie die Hoffnung, nach der Sie gesucht haben.",
|
||||
"url_message": "Folgen Sie diesem Link, um mehr zu erfahren."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtastic-Netzwerk-Flyer",
|
||||
"title": "SICHERE KOMMUNIKATION",
|
||||
"subtitle": "NICHT IGNORIEREN",
|
||||
"headline": "BAUEN SIE IHR NOTFALLNETZWERK AUF",
|
||||
"content": "Warum Meshtastic? In Krisenzeiten können traditionelle Kommunikationsnetzwerke versagen und uns isoliert und verwundbar zurücklassen. Meshtastic bietet eine leistungsstarke Lösung—ein alternatives lokales Kommunikationsnetzwerk, das unabhängig von zentralisierten Systemen arbeitet. Es ist für Notfallsituationen konzipiert und ermöglicht es Ihnen, verbunden zu bleiben, wenn es am wichtigsten ist.<br><br>Meshtastic-Geräte erstellen ein Mesh-Netzwerk, das Nachrichten über große Entfernungen weiterleiten kann, auch ohne Internet- oder Mobilfunkabdeckung. Dieser dezentrale Ansatz stellt sicher, dass Ihre Kommunikation unter allen Umständen belastbar und zuverlässig ist. Aber es geht nicht nur darum, verbunden zu bleiben—Meshtastic bietet auch Verschlüsselung, sodass Ihre Nachrichten sicher und privat bleiben.<br><br>In einer Welt, in der die Privatsphäre zunehmend gefährdet ist, ermöglicht Ihnen Meshtastic, die Kontrolle über Ihre Kommunikation zu übernehmen. Ob Sie eine lokale Gemeinschaftsreaktion koordinieren, während einer Katastrophe mit Ihren Lieben in Kontakt bleiben oder sich einfach auf das Unerwartete vorbereiten—Meshtastic bietet die Werkzeuge, die Sie für eine sichere und effektive Kommunikation benötigen.<br><br>Machen Sie den Schritt, mehr über Meshtastic zu erfahren und wie Sie Ihr eigenes Notfall-Kommunikationsnetzwerk aufbauen können. Reißen Sie einen Link links ab und erkunden Sie diese innovative Technologie. Stellen Sie sicher, dass Sie auf alles vorbereitet sind.",
|
||||
"url_message": "Folgen Sie diesem Link, um mehr zu erfahren."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostr-Protokoll-Flyer",
|
||||
"title": "SOZIALE FREIHEIT",
|
||||
"subtitle": "NICHT IGNORIEREN",
|
||||
"headline": "TRETEN SIE DEM ZENSURRESISTENTEN NETZWERK BEI",
|
||||
"content": "Was ist Nostr? Anders als herkömmliche Social-Media-Plattformen ist Nostr ein Protokoll—ein dezentrales System, das Benutzern ermöglicht, sich zu verbinden und zu teilen, ohne die Einschränkungen einer zentralen Autorität. Nostr ist zensurresistent, was bedeutet, dass Ihre Stimme nicht von Unternehmen oder Regierungen zum Schweigen gebracht werden kann. Es wurde entwickelt, um Ihnen die Kontrolle über Ihre Online-Präsenz zu geben, frei vom Einfluss von Algorithmen oder Werbung, die Engagement über bedeutsame Verbindungen stellen.<br><br>Auf Nostr gibt es keine verborgenen Agenden, die Sie zum endlosen Scrollen verleiten. Sie interagieren mit Inhalten zu Ihren Bedingungen, nicht basierend auf dem, was ein Algorithmus glaubt, Sie am längsten online zu halten. Nostr ermöglicht es Ihnen, echte Verbindungen aufzubauen und an Gesprächen teilzunehmen, die wichtig sind, und dabei Ihre Privatsphäre und Autonomie zu wahren.<br><br>In einer Welt, in der die Online-Meinungsfreiheit zunehmend kontrolliert und manipuliert wird, bietet Nostr eine erfrischende Alternative. Es ist nicht nur eine Plattform; es ist eine Bewegung hin zu wahrer digitaler Freiheit, bei der Ihre Interaktionen von Ihren Interessen und Werten bestimmt werden, nicht von dem, was die meisten Werbeeinnahmen generiert.<br><br>Machen Sie den Schritt, mehr über Nostr zu erfahren und wie es die Art und Weise, wie Sie sich online verbinden, verändern kann. Reißen Sie einen Link links ab und erkunden Sie dieses bahnbrechende Protokoll. Schließen Sie sich einer Gemeinschaft an, die Freiheit und authentische Interaktion schätzt.",
|
||||
"url_message": "Folgen Sie diesem Link, um mehr zu erfahren."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera Druckflyer",
|
||||
"title": "STRENG GEHEIM",
|
||||
"subtitle": "~~NICHT~~ VERBREITEN",
|
||||
"headline": "OPERATION VOX VERA",
|
||||
"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.<br><br>Nutzen 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.<br><br>Privatsphäre kann gewahrt bleiben. Flyer können über das Tor-Netzwerk geteilt werden, was Hoster und Nutzer vor Zensur schützt.<br><br>Schließ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."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -73,7 +73,22 @@
|
||||
"bootstrapping_msg": "[{name}] Connecting to Tor relays and setting up hidden service...",
|
||||
"bootstrapping_progress": "[{name}] Tor Bootstrapping: {progress}% ...",
|
||||
"no_urls_qr_skip": "No URLs configured yet. QR codes will be generated after 'voxvera serve'",
|
||||
"input_file_not_found": "Input file {path} does not exist."
|
||||
"input_file_not_found": "Input file {path} does not exist.",
|
||||
"manage_templates": "--- Create From Template ---",
|
||||
"template_select": "Select a template:",
|
||||
"body_over_limit_warning": "Warning: Body text exceeds 1000 characters. It may be cut off on the flyer.",
|
||||
"manage_action_export_keys": "Export Keys",
|
||||
"manage_action_import_keys": "Import Keys",
|
||||
"keys_not_found": "No session key found for '{name}'. Start the site first to generate keys.",
|
||||
"keys_export_header": "Session key for '{name}':",
|
||||
"keys_export_hint": "Copy this key and save it securely. Use 'Import Keys' on another instance to restore.",
|
||||
"keys_site_not_found": "Site '{name}' not found.",
|
||||
"keys_overwrite_confirm": "Site '{name}' already has a key. Overwrite?",
|
||||
"keys_import_cancelled": "Import cancelled.",
|
||||
"keys_import_prompt": "Paste the base64 session key below:",
|
||||
"keys_import_empty": "No key provided.",
|
||||
"keys_import_invalid": "Invalid key format. Must be a valid base64 string.",
|
||||
"keys_import_success": "Session key imported for '{name}'. Restart the site to use the new key."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Use Tor Browser",
|
||||
@@ -88,8 +103,58 @@
|
||||
"title": "TOP SECRET",
|
||||
"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.",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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": "Get VoxVera and start spreading your message.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOS Project",
|
||||
"title": "ANDROID UNLEASHED",
|
||||
"subtitle": "WITHOUT BOUNDARIES",
|
||||
"headline": "OPEN-SOURCE FREEDOM",
|
||||
"content": "The Android Open Source Project (AOSP) represents the essence of what Android was originally intended to be: an open, transparent, and adaptable platform. It strips away the layers of proprietary software and corporate oversight that have become synonymous with mainstream Android distributions. With AOSP, you gain access to a raw, unfiltered version of Android, allowing you to truly make your device your own.<br><br>For developers, AOSP offers a playground of possibilities, where the only limits are your skills and imagination. It serves as the foundation for countless custom ROMs, each tailored to specific needs, whether for enhanced performance, privacy, or unique features that mainstream versions lack. Privacy enthusiasts will appreciate the absence of pre-installed bloatware and tracking services that often come wit stock Android, providing a cleaner, more secure user experience.<br><br>AOSP isn't just for developers or tech enthusiasts; it's for anyone who values digital freedom. It allows you to reclaim control over your device, tailoring it to your needs without the restrictions of carriers or manufacturers. Discover how AOSP can transform your mobile experience. Start your journey towards a more open, customizable future today.",
|
||||
"url_message": "Visit the link below to learn more."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Bitcoin Revolution Flyers",
|
||||
"title": "RULES WITHOUT RULERS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE BITCOIN REVOLUTION",
|
||||
"content": "What is Bitcoin? It's more than just digital money; it's a revolutionary technology designed to fix some of the world's most pressing problems. Bitcoin operates on a decentralized network, free from the control of any government or central authority. This ensures that no one can manipulate its supply or value, making it a sound form of money that protects your wealth from inflation.<br><br>Our current financial system is built on flawed incentives—encouraging debt, dependency, and centralization of power. Bitcoin changes that by creating a system where honesty, transparency, and individual responsibility are rewarded. In the Bitcoin network, there is no room for corruption or manipulation because the rules are enforced by mathematics, not by people.<br><br>Bitcoin aligns incentives in a way that promotes long-term thinking, savings, and innovation. It empowers individuals to take control of their financial future, fostering a global community where value can be transferred freely and securely without intermediaries. This is why we need Bitcoin—because it creates a world where incentives are properly aligned, leading to a more fair and prosperous society for all.<br><br>Take the step to learn more about Bitcoin and how it can transform not just your financial life, but the world. Tear off a link to the left and explore this groundbreaking technology. Join the movement towards a better future.",
|
||||
"url_message": "Follow this link to learn more."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Life Changing Message",
|
||||
"title": "GOOD NEWS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "DISCOVER TRUE HOPE",
|
||||
"content": "Who is Jesus? He is more than just a historical figure; He is the Son of God, the Savior of the world. Jesus Himself said, 'I am the way, the truth, and the life. No one comes to the Father except through Me' (John 14:6). He came to bridge the gap between God and humanity, offering us a path to forgiveness, peace, and eternal life.<br><br>We all face brokenness in our lives—whether it's in our relationships, our hearts, or our world. Jesus came to heal that brokenness. He lived a perfect life, died on the cross for our sins, and rose again, defeating death and offering us the hope of eternal life with God.<br><br>Without Jesus, we are lost in our sin, separated from God. But through Him, we can be forgiven and restored. He offers us not just a better life now, but the promise of an eternal life with Him. This is why we need Him—because only in Jesus can we find true peace, purpose, and the assurance of eternal life.<br><br>Take the step to learn more about Jesus and the life-changing impact He can have on your life. Tear off a link to the left and explore His teachings. Find the hope you've been searching for.",
|
||||
"url_message": "Follow this link to learn more."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtastic Network Flyers",
|
||||
"title": "SECURE COMMUNICATIONS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "BUILD YOUR EMERGENCY NETWORK",
|
||||
"content": "Why Meshtastic? In times of crisis, traditional communication networks can fail, leaving us isolated and vulnerable. Meshtastic provides a powerful solution—an alternative local communication network that operates independently of centralized systems. It’s designed for emergency situations, allowing you to stay connected when it matters most.<br><br>Meshtastic devices create a mesh network that can relay messages over long distances, even without internet or cellular coverage. This decentralized approach ensures that your communications are resilient and reliable, no matter the circumstances. But it’s not just about staying connected—Meshtastic also offers encryption, so your messages remain secure and private.<br><br>In a world where privacy is increasingly compromised, Meshtastic empowers you to take control of your communication. Whether you’re coordinating a local community response, staying in touch with loved ones during a disaster, or simply preparing for the unexpected, Meshtastic provides the tools you need to communicate securely and effectively.<br><br>Take the step to learn more about Meshtastic and how you can build your own emergency communication network. Tear off a link to the left and explore this innovative technology. Ensure you’re prepared for whatever comes your way.",
|
||||
"url_message": "Follow this link to learn more."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostr Protocol Flyers",
|
||||
"title": "SOCIAL FREEDOM",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE CENSORSHIP-RESISTANT NETWORK",
|
||||
"content": "What is Nostr? Unlike traditional social media platforms, Nostr is a protocol—a decentralized system that empowers users to connect and share without the constraints of a central authority. Nostr is censorship-resistant, meaning your voice can’t be silenced by corporations or governments. It’s designed to give you control over your online presence, free from the influence of algorithms or ads that prioritize engagement over meaningful connections.<br><br>On Nostr, there are no hidden agendas to keep you doomscrolling. You engage with content on your terms, not based on what an algorithm thinks will keep you online the longest. Nostr allows you to build genuine connections and participate in conversations that matter, all while maintaining your privacy and autonomy.<br><br>In a world where online speech is increasingly controlled and manipulated, Nostr offers a refreshing alternative. It’s not just a platform; it’s a movement towards true digital freedom, where your interactions are driven by your interests and values, not by what generates the most ad revenue.<br><br>Take the step to learn more about Nostr and how it can transform the way you connect online. Tear off a link the left and explore this groundbreaking protocol. Join a community that values freedom and authentic interaction.",
|
||||
"url_message": "Follow this link to learn more."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera Printable Flyers",
|
||||
"title": "TOP SECRET",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -73,7 +73,22 @@
|
||||
"no_urls_qr_skip": "No hay URLs configuradas todavía. Los códigos QR se generarán después de 'voxvera serve'",
|
||||
"input_file_not_found": "El archivo de entrada {path} no existe.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Crear Desde Plantilla ---",
|
||||
"template_select": "Seleccione una plantilla:",
|
||||
"body_over_limit_warning": "Advertencia: El texto del cuerpo supera los 1000 caracteres. Puede cortarse en el volante.",
|
||||
"manage_action_export_keys": "Exportar Claves",
|
||||
"manage_action_import_keys": "Importar Claves",
|
||||
"keys_not_found": "No se encontró clave de sesión para '{name}'. Inicie el sitio primero para generar claves.",
|
||||
"keys_export_header": "Clave de sesión para '{name}':",
|
||||
"keys_export_hint": "Copie esta clave y guárdela de forma segura. Use 'Importar Claves' en otra instancia para restaurar.",
|
||||
"keys_site_not_found": "Sitio '{name}' no encontrado.",
|
||||
"keys_overwrite_confirm": "El sitio '{name}' ya tiene una clave. ¿Sobrescribir?",
|
||||
"keys_import_cancelled": "Importación cancelada.",
|
||||
"keys_import_prompt": "Pegue la clave de sesión base64 a continuación:",
|
||||
"keys_import_empty": "No se proporcionó clave.",
|
||||
"keys_import_invalid": "Formato de clave no válido. Debe ser una cadena base64 válida.",
|
||||
"keys_import_success": "Clave de sesión importada para '{name}'. Reinicie el sitio para usar la nueva clave."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Use el Navegador Tor",
|
||||
@@ -88,8 +103,58 @@
|
||||
"title": "ALTO SECRETO",
|
||||
"subtitle": "~~NO~~ DISTRIBUIR",
|
||||
"headline": "OPERACIÓN VOX VERA",
|
||||
"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.",
|
||||
"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.<br><br>Use 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.<br><br>La 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.<br><br>Ú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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Volantes Imprimibles Vox Vera"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "Proyecto AOS",
|
||||
"title": "ANDROID LIBERADO",
|
||||
"subtitle": "SIN LÍMITES",
|
||||
"headline": "LIBERTAD DE CÓDIGO ABIERTO",
|
||||
"content": "El Proyecto de Código Abierto de Android (AOSP) representa la esencia de lo que Android fue originalmente concebido: una plataforma abierta, transparente y adaptable. Elimina las capas de software propietario y supervisión corporativa que se han vuelto sinónimos de las distribuciones convencionales de Android. Con AOSP, obtiene acceso a una versión sin filtros de Android, permitiéndole hacer verdaderamente suyo su dispositivo.<br><br>Para los desarrolladores, AOSP ofrece un campo de posibilidades, donde los únicos límites son sus habilidades e imaginación. Sirve como base para innumerables ROMs personalizadas, cada una adaptada a necesidades específicas, ya sea para un rendimiento mejorado, privacidad o características únicas que las versiones convencionales carecen. Los entusiastas de la privacidad apreciarán la ausencia de bloatware preinstalado y servicios de rastreo que a menudo vienen con Android de fábrica.<br><br>AOSP no es solo para desarrolladores o entusiastas de la tecnología; es para cualquiera que valore la libertad digital. Le permite recuperar el control de su dispositivo, adaptándolo a sus necesidades sin las restricciones de operadores o fabricantes. Descubra cómo AOSP puede transformar su experiencia móvil. Comience su viaje hacia un futuro más abierto y personalizable hoy.",
|
||||
"url_message": "Visite el enlace a continuación para obtener más información."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Volantes de la Revolución Bitcoin",
|
||||
"title": "REGLAS SIN GOBERNANTES",
|
||||
"subtitle": "NO IGNORAR",
|
||||
"headline": "ÚNETE A LA REVOLUCIÓN BITCOIN",
|
||||
"content": "¿Qué es Bitcoin? Es más que dinero digital; es una tecnología revolucionaria diseñada para solucionar algunos de los problemas más urgentes del mundo. Bitcoin opera en una red descentralizada, libre del control de cualquier gobierno o autoridad central. Esto asegura que nadie pueda manipular su oferta o valor, convirtiéndolo en una forma sólida de dinero que protege su riqueza de la inflación.<br><br>Nuestro sistema financiero actual está construido sobre incentivos defectuosos—fomentando la deuda, la dependencia y la centralización del poder. Bitcoin cambia eso creando un sistema donde la honestidad, la transparencia y la responsabilidad individual son recompensadas. En la red Bitcoin, no hay espacio para la corrupción o manipulación porque las reglas son aplicadas por las matemáticas, no por las personas.<br><br>Bitcoin alinea incentivos de una manera que promueve el pensamiento a largo plazo, el ahorro y la innovación. Empodera a los individuos para tomar control de su futuro financiero, fomentando una comunidad global donde el valor puede transferirse libre y seguramente sin intermediarios. Por eso necesitamos Bitcoin—porque crea un mundo donde los incentivos están correctamente alineados, conduciendo a una sociedad más justa y próspera para todos.<br><br>Da el paso para aprender más sobre Bitcoin y cómo puede transformar no solo tu vida financiera, sino el mundo. Arranca un enlace a la izquierda y explora esta tecnología revolucionaria. Únete al movimiento hacia un futuro mejor.",
|
||||
"url_message": "Sigue este enlace para obtener más información."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Mensaje que Cambia Vidas",
|
||||
"title": "BUENAS NOTICIAS",
|
||||
"subtitle": "NO IGNORAR",
|
||||
"headline": "DESCUBRE LA VERDADERA ESPERANZA",
|
||||
"content": "¿Quién es Jesús? Es más que una figura histórica; Él es el Hijo de Dios, el Salvador del mundo. Jesús mismo dijo: 'Yo soy el camino, la verdad y la vida. Nadie viene al Padre sino por mí' (Juan 14:6). Vino para cerrar la brecha entre Dios y la humanidad, ofreciéndonos un camino hacia el perdón, la paz y la vida eterna.<br><br>Todos enfrentamos quebrantamiento en nuestras vidas—ya sea en nuestras relaciones, nuestros corazones o nuestro mundo. Jesús vino para sanar ese quebrantamiento. Vivió una vida perfecta, murió en la cruz por nuestros pecados y resucitó, venciendo a la muerte y ofreciéndonos la esperanza de la vida eterna con Dios.<br><br>Sin Jesús, estamos perdidos en nuestro pecado, separados de Dios. Pero a través de Él, podemos ser perdonados y restaurados. Nos ofrece no solo una vida mejor ahora, sino la promesa de una vida eterna con Él. Por eso lo necesitamos—porque solo en Jesús podemos encontrar verdadera paz, propósito y la seguridad de la vida eterna.<br><br>Da el paso para aprender más sobre Jesús y el impacto transformador que puede tener en tu vida. Arranca un enlace a la izquierda y explora Sus enseñanzas. Encuentra la esperanza que has estado buscando.",
|
||||
"url_message": "Sigue este enlace para obtener más información."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Volantes de Red Meshtastic",
|
||||
"title": "COMUNICACIONES SEGURAS",
|
||||
"subtitle": "NO IGNORAR",
|
||||
"headline": "CONSTRUYE TU RED DE EMERGENCIA",
|
||||
"content": "¿Por qué Meshtastic? En tiempos de crisis, las redes de comunicación tradicionales pueden fallar, dejándonos aislados y vulnerables. Meshtastic proporciona una solución poderosa—una red de comunicación local alternativa que opera independientemente de los sistemas centralizados. Está diseñada para situaciones de emergencia, permitiéndote mantenerte conectado cuando más importa.<br><br>Los dispositivos Meshtastic crean una red en malla que puede retransmitir mensajes a largas distancias, incluso sin cobertura de internet o celular. Este enfoque descentralizado asegura que tus comunicaciones sean resilientes y confiables, sin importar las circunstancias. Pero no se trata solo de mantenerse conectado—Meshtastic también ofrece cifrado, para que tus mensajes permanezcan seguros y privados.<br><br>En un mundo donde la privacidad está cada vez más comprometida, Meshtastic te empodera para tomar control de tu comunicación. Ya sea coordinando una respuesta comunitaria local, manteniéndote en contacto con seres queridos durante un desastre, o simplemente preparándote para lo inesperado, Meshtastic proporciona las herramientas que necesitas para comunicarte de forma segura y efectiva.<br><br>Da el paso para aprender más sobre Meshtastic y cómo puedes construir tu propia red de comunicación de emergencia. Arranca un enlace a la izquierda y explora esta tecnología innovadora. Asegúrate de estar preparado para lo que venga.",
|
||||
"url_message": "Sigue este enlace para obtener más información."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Volantes del Protocolo Nostr",
|
||||
"title": "LIBERTAD SOCIAL",
|
||||
"subtitle": "NO IGNORAR",
|
||||
"headline": "ÚNETE A LA RED RESISTENTE A LA CENSURA",
|
||||
"content": "¿Qué es Nostr? A diferencia de las plataformas de redes sociales tradicionales, Nostr es un protocolo—un sistema descentralizado que empodera a los usuarios para conectarse y compartir sin las restricciones de una autoridad central. Nostr es resistente a la censura, lo que significa que tu voz no puede ser silenciada por corporaciones o gobiernos. Está diseñado para darte control sobre tu presencia en línea, libre de la influencia de algoritmos o anuncios que priorizan el engagement sobre las conexiones significativas.<br><br>En Nostr, no hay agendas ocultas para mantenerte enganchado. Te involucras con el contenido en tus términos, no basado en lo que un algoritmo piensa que te mantendrá en línea más tiempo. Nostr te permite construir conexiones genuinas y participar en conversaciones que importan, todo mientras mantienes tu privacidad y autonomía.<br><br>En un mundo donde el discurso en línea está cada vez más controlado y manipulado, Nostr ofrece una alternativa refrescante. No es solo una plataforma; es un movimiento hacia la verdadera libertad digital, donde tus interacciones son impulsadas por tus intereses y valores, no por lo que genera más ingresos publicitarios.<br><br>Da el paso para aprender más sobre Nostr y cómo puede transformar la forma en que te conectas en línea. Arranca un enlace a la izquierda y explora este protocolo revolucionario. Únete a una comunidad que valora la libertad y la interacción auténtica.",
|
||||
"url_message": "Sigue este enlace para obtener más información."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Volantes Imprimibles Vox Vera",
|
||||
"title": "ALTO SECRETO",
|
||||
"subtitle": "~~NO~~ DISTRIBUIR",
|
||||
"headline": "OPERACIÓN VOX VERA",
|
||||
"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.<br><br>Use 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.<br><br>La 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.<br><br>Ú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."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "هنوز آدرسی پیکربندی نشده است. کدهای QR پس از 'voxvera serve' ایجاد میشوند",
|
||||
"input_file_not_found": "فایل ورودی {path} وجود ندارد.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- ایجاد از قالب ---",
|
||||
"template_select": "یک قالب انتخاب کنید:",
|
||||
"body_over_limit_warning": "هشدار: متن بدنه از 1000 کاراکتر بیشتر است. ممکن است در بروشور بریده شود.",
|
||||
"manage_action_export_keys": "صادرات کلیدها",
|
||||
"manage_action_import_keys": "واردات کلیدها",
|
||||
"keys_not_found": "کلید جلسه برای '{name}' یافت نشد. ابتدا سایت را اجرا کنید تا کلیدها تولید شوند.",
|
||||
"keys_export_header": "کلید جلسه برای '{name}':",
|
||||
"keys_export_hint": "این کلید را کپی کرده و به صورت امن ذخیره کنید. از 'واردات کلیدها' در نمونه دیگر برای بازیابی استفاده کنید.",
|
||||
"keys_site_not_found": "سایت '{name}' یافت نشد.",
|
||||
"keys_overwrite_confirm": "سایت '{name}' از قبل کلید دارد. رونویسی شود؟",
|
||||
"keys_import_cancelled": "واردات لغو شد.",
|
||||
"keys_import_prompt": "کلید جلسه base64 را در زیر جایگذاری کنید:",
|
||||
"keys_import_empty": "کلیدی ارائه نشد.",
|
||||
"keys_import_invalid": "فرمت کلید نامعتبر است. باید یک رشته base64 معتبر باشد.",
|
||||
"keys_import_success": "کلید جلسه برای '{name}' وارد شد. سایت را مجدداً راهاندازی کنید تا از کلید جدید استفاده شود."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "از مرورگر Tor استفاده کنید",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "بهکلی محرمانه",
|
||||
"subtitle": "~~عدم~~ انتشار",
|
||||
"headline": "عملیات VOX VERA",
|
||||
"content": "با VoxVera از بند سانسور رها شوید. ابزاری ناشناس برای بازاریابی چریکی و گسترش پیام. چه در فضای مجازی و چه در دنیای فیزیکی، این ابزار میتواند شما را برای گسترش جسورانه ایدههایتان توانمند کند، در حالی که توسط ناشناسی کامل محافظت میشوید (اگر از طریق Tor میزبانی کنید). کد را دانلود کنید، یک سایت اعلامیه طراحی کنید، آن را آنلاین میزبانی کنید و صدای خود را تقویت کنید.\n\nاز قدرت میمها برای به اشتراک گذاشتن ایدههای خود در مدرسه، محل کار، انجمنهای آنلاین یا حتی در سطح جهانی استفاده کنید. VoxVera تضمین میکند که پیام شما در دوردستها طنینانداز شود، با بخشهای جداشونده دارای URLهای منحصر به فرد و کدهای QR برای چاپ مجدد آسان.\n\nحریم خصوصی میتواند حفظ شود. اعلامیهها را میتوان از طریق شبکه Tor به اشتراک گذاشت و از میزبان و کاربران در برابر سانسور محافظت کرد.\n\nدر انقلابی که برای حقیقت و شفافیت ارزش قائل است به ما بپیوندید. با هم، میتوانیم شبکهای از شهروندان آگاه بسازیم که از سخن گفتن نمیهراسند.",
|
||||
"content": "با VoxVera از بند سانسور رها شوید. ابزاری ناشناس برای بازاریابی چریکی و گسترش پیام. چه در فضای مجازی و چه در دنیای فیزیکی، این ابزار میتواند شما را برای گسترش جسورانه ایدههایتان توانمند کند، در حالی که توسط ناشناسی کامل محافظت میشوید (اگر از طریق Tor میزبانی کنید). کد را دانلود کنید، یک سایت اعلامیه طراحی کنید، آن را آنلاین میزبانی کنید و صدای خود را تقویت کنید.<br><br>از قدرت میمها برای به اشتراک گذاشتن ایدههای خود در مدرسه، محل کار، انجمنهای آنلاین یا حتی در سطح جهانی استفاده کنید. VoxVera تضمین میکند که پیام شما در دوردستها طنینانداز شود، با بخشهای جداشونده دارای URLهای منحصر به فرد و کدهای QR برای چاپ مجدد آسان.<br><br>حریم خصوصی میتواند حفظ شود. اعلامیهها را میتوان از طریق شبکه Tor به اشتراک گذاشت و از میزبان و کاربران در برابر سانسور محافظت کرد.<br><br>در انقلابی که برای حقیقت و شفافیت ارزش قائل است به ما بپیوندید. با هم، میتوانیم شبکهای از شهروندان آگاه بسازیم که از سخن گفتن نمیهراسند.",
|
||||
"url_message": "VoxVera را دریافت کنید و گسترش پیام خود را آغاز کنید.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "بروشورهای قابل چاپ Vox Vera"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "پروژه AOS",
|
||||
"title": "ANDROID آزاد شده",
|
||||
"subtitle": "بدون مرز",
|
||||
"headline": "آزادی متنباز",
|
||||
"content": "پروژه متنباز Android (AOSP) نمایانگر جوهر آن چیزی است که Android در اصل برای آن طراحی شده بود: یک پلتفرم باز، شفاف و قابل تطبیق. این پروژه لایههای نرمافزار اختصاصی و نظارت شرکتی را که مترادف توزیعهای متداول Android شدهاند حذف میکند. با AOSP، به نسخهای خام و فیلتر نشده از Android دسترسی پیدا میکنید که به شما اجازه میدهد دستگاهتان را واقعاً از آن خود کنید.<br><br>برای توسعهدهندگان، AOSP زمین بازی از امکانات را ارائه میدهد، جایی که تنها محدودیتها مهارتها و تخیل شماست. این پروژه به عنوان پایهای برای بیشمار رامهای سفارشی عمل میکند که هر کدام برای نیازهای خاصی طراحی شدهاند، چه برای عملکرد بهتر، حریم خصوصی یا ویژگیهای منحصر به فردی که نسخههای متداول فاقد آنها هستند. علاقهمندان به حریم خصوصی از عدم وجود نرمافزارهای غیرضروری از پیش نصب شده و سرویسهای ردیابی که اغلب با Android کارخانهای همراه هستند قدردانی خواهند کرد.<br><br>AOSP فقط برای توسعهدهندگان یا علاقهمندان به فناوری نیست؛ برای هر کسی است که آزادی دیجیتال را ارزشمند میداند. به شما اجازه میدهد کنترل دستگاه خود را بازپس بگیرید و آن را بدون محدودیتهای اپراتورها یا تولیدکنندگان مطابق نیازهایتان تنظیم کنید. کشف کنید چگونه AOSP میتواند تجربه موبایل شما را متحول کند. سفر خود را به سوی آیندهای بازتر و قابل سفارشیسازیتر همین امروز آغاز کنید.",
|
||||
"url_message": "برای اطلاعات بیشتر از لینک زیر بازدید کنید."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "بروشورهای انقلاب Bitcoin",
|
||||
"title": "قوانین بدون حاکمان",
|
||||
"subtitle": "نادیده نگیرید",
|
||||
"headline": "به انقلاب BITCOIN بپیوندید",
|
||||
"content": "Bitcoin چیست؟ فراتر از پول دیجیتال است؛ یک فناوری انقلابی است که برای حل برخی از فوریترین مشکلات جهان طراحی شده است. Bitcoin روی یک شبکه غیرمتمرکز عمل میکند، آزاد از کنترل هر دولت یا مرجع مرکزی. این تضمین میکند که هیچکس نمیتواند عرضه یا ارزش آن را دستکاری کند و آن را به شکلی سالم از پول تبدیل میکند که ثروت شما را از تورم محافظت میکند.<br><br>سیستم مالی فعلی ما بر پایه انگیزههای معیوب ساخته شده است—تشویق بدهی، وابستگی و تمرکز قدرت. Bitcoin این را تغییر میدهد با ایجاد سیستمی که در آن صداقت، شفافیت و مسئولیت فردی پاداش میگیرند. در شبکه Bitcoin، جایی برای فساد یا دستکاری نیست زیرا قوانین توسط ریاضیات اجرا میشوند، نه توسط انسانها.<br><br>Bitcoin انگیزهها را به گونهای همراستا میکند که تفکر بلندمدت، پسانداز و نوآوری را ترویج میدهد. به افراد قدرت میدهد تا کنترل آینده مالی خود را به دست بگیرند و جامعهای جهانی را پرورش میدهد که در آن ارزش میتواند آزادانه و با امنیت بدون واسطهها منتقل شود. به همین دلیل به Bitcoin نیاز داریم—زیرا دنیایی میسازد که در آن انگیزهها به درستی همراستا هستند و به جامعهای عادلانهتر و مرفهتر برای همه منجر میشود.<br><br>قدم بردارید تا درباره Bitcoin و اینکه چگونه میتواند نه تنها زندگی مالی شما بلکه جهان را متحول کند بیشتر بدانید. یک لینک از سمت چپ جدا کنید و این فناوری پیشگامانه را کاوش کنید. به جنبش به سوی آیندهای بهتر بپیوندید.",
|
||||
"url_message": "این لینک را دنبال کنید تا بیشتر بدانید."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "پیام تغییر دهنده زندگی",
|
||||
"title": "خبر خوش",
|
||||
"subtitle": "نادیده نگیرید",
|
||||
"headline": "امید واقعی را کشف کنید",
|
||||
"content": "Jesus کیست؟ او فراتر از یک شخصیت تاریخی است؛ او پسر خدا، نجاتدهنده جهان است. Jesus خودش گفت: 'من راه و راستی و حیات هستم. هیچکس جز از طریق من نزد پدر نمیآید' (یوحنا 14:6). او آمد تا شکاف میان خدا و بشریت را پر کند و راهی به سوی بخشش، صلح و حیات جاودان به ما ارائه دهد.<br><br>همه ما در زندگیمان با شکستگی مواجه هستیم—خواه در روابط، قلبها یا دنیایمان. Jesus آمد تا آن شکستگی را شفا دهد. او زندگی کاملی زیست، بر صلیب برای گناهان ما مرد و از مرگ برخاست، مرگ را شکست داد و امید حیات جاودان با خدا را به ما عطا کرد.<br><br>بدون Jesus، ما در گناهمان گمشده و از خدا جدا هستیم. اما از طریق او، میتوانیم بخشیده و بازسازی شویم. او نه تنها زندگی بهتری اکنون، بلکه وعده حیات جاودان با خودش را به ما ارائه میدهد. به همین دلیل به او نیاز داریم—زیرا تنها در Jesus میتوانیم صلح، هدف و اطمینان واقعی از حیات جاودان را بیابیم.<br><br>قدم بردارید تا درباره Jesus و تأثیر تغییردهنده زندگی که میتواند بر شما داشته باشد بیشتر بدانید. یک لینک از سمت چپ جدا کنید و تعالیم او را کاوش کنید. امیدی را بیابید که به دنبالش بودهاید.",
|
||||
"url_message": "این لینک را دنبال کنید تا بیشتر بدانید."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "بروشورهای شبکه Meshtastic",
|
||||
"title": "ارتباطات امن",
|
||||
"subtitle": "نادیده نگیرید",
|
||||
"headline": "شبکه اضطراری خود را بسازید",
|
||||
"content": "چرا Meshtastic؟ در زمان بحران، شبکههای ارتباطی سنتی میتوانند از کار بیفتند و ما را منزوی و آسیبپذیر رها کنند. Meshtastic یک راهحل قدرتمند ارائه میدهد—یک شبکه ارتباطی محلی جایگزین که مستقل از سیستمهای متمرکز عمل میکند. برای شرایط اضطراری طراحی شده و به شما امکان میدهد زمانی که بیشترین اهمیت را دارد متصل بمانید.<br><br>دستگاههای Meshtastic یک شبکه مش ایجاد میکنند که میتواند پیامها را در مسافتهای طولانی ارسال کند، حتی بدون پوشش اینترنت یا تلفن همراه. این رویکرد غیرمتمرکز تضمین میکند که ارتباطات شما در هر شرایطی مقاوم و قابل اعتماد است. اما فقط درباره متصل ماندن نیست—Meshtastic همچنین رمزگذاری ارائه میدهد تا پیامهای شما امن و خصوصی بمانند.<br><br>در دنیایی که حریم خصوصی به طور فزایندهای به خطر افتاده، Meshtastic به شما قدرت میدهد تا کنترل ارتباطات خود را به دست بگیرید. چه در حال هماهنگی واکنش جامعه محلی باشید، چه در تماس با عزیزانتان در طول یک فاجعه، یا صرفاً برای غیرمنتظرهها آماده میشوید، Meshtastic ابزارهایی را که برای ارتباط امن و مؤثر نیاز دارید فراهم میکند.<br><br>قدم بردارید تا درباره Meshtastic و نحوه ساخت شبکه ارتباطی اضطراری خود بیشتر بدانید. یک لینک از سمت چپ جدا کنید و این فناوری نوآورانه را کاوش کنید. مطمئن شوید که برای هر چیزی آماده هستید.",
|
||||
"url_message": "این لینک را دنبال کنید تا بیشتر بدانید."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "بروشورهای پروتکل Nostr",
|
||||
"title": "آزادی اجتماعی",
|
||||
"subtitle": "نادیده نگیرید",
|
||||
"headline": "به شبکه مقاوم در برابر سانسور بپیوندید",
|
||||
"content": "Nostr چیست؟ برخلاف پلتفرمهای رسانههای اجتماعی سنتی، Nostr یک پروتکل است—سیستمی غیرمتمرکز که کاربران را برای اتصال و اشتراکگذاری بدون محدودیتهای یک مرجع مرکزی توانمند میسازد. Nostr مقاوم در برابر سانسور است، به این معنی که صدای شما توسط شرکتها یا دولتها خاموش نمیشود. طراحی شده تا به شما کنترل بر حضور آنلاینتان را بدهد، آزاد از تأثیر الگوریتمها یا تبلیغاتی که تعامل را بر ارتباطات معنادار ترجیح میدهند.<br><br>در Nostr، هیچ دستور کار پنهانی برای نگه داشتن شما در اسکرول بیپایان وجود ندارد. شما با محتوا به شرایط خودتان تعامل میکنید، نه بر اساس آنچه یک الگوریتم فکر میکند شما را بیشترین مدت آنلاین نگه میدارد. Nostr به شما اجازه میدهد ارتباطات واقعی بسازید و در گفتگوهایی شرکت کنید که اهمیت دارند، همه در حالی که حریم خصوصی و استقلال شما حفظ میشود.<br><br>در دنیایی که گفتمان آنلاین به طور فزایندهای کنترل و دستکاری میشود، Nostr جایگزینی تازه ارائه میدهد. فقط یک پلتفرم نیست؛ جنبشی به سوی آزادی دیجیتال واقعی است، جایی که تعاملات شما توسط علایق و ارزشهایتان هدایت میشود، نه توسط آنچه بیشترین درآمد تبلیغاتی را تولید میکند.<br><br>قدم بردارید تا درباره Nostr و نحوه تحول ارتباطات آنلاین شما بیشتر بدانید. یک لینک از سمت چپ جدا کنید و این پروتکل پیشگامانه را کاوش کنید. به جامعهای بپیوندید که آزادی و تعامل واقعی را ارزشمند میداند.",
|
||||
"url_message": "این لینک را دنبال کنید تا بیشتر بدانید."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "بروشورهای قابل چاپ Vox Vera",
|
||||
"title": "بهکلی محرمانه",
|
||||
"subtitle": "~~عدم~~ انتشار",
|
||||
"headline": "عملیات VOX VERA",
|
||||
"content": "با VoxVera از بند سانسور رها شوید. ابزاری ناشناس برای بازاریابی چریکی و گسترش پیام. چه در فضای مجازی و چه در دنیای فیزیکی، این ابزار میتواند شما را برای گسترش جسورانه ایدههایتان توانمند کند، در حالی که توسط ناشناسی کامل محافظت میشوید (اگر از طریق Tor میزبانی کنید). کد را دانلود کنید، یک سایت اعلامیه طراحی کنید، آن را آنلاین میزبانی کنید و صدای خود را تقویت کنید.<br><br>از قدرت میمها برای به اشتراک گذاشتن ایدههای خود در مدرسه، محل کار، انجمنهای آنلاین یا حتی در سطح جهانی استفاده کنید. VoxVera تضمین میکند که پیام شما در دوردستها طنینانداز شود، با بخشهای جداشونده دارای URLهای منحصر به فرد و کدهای QR برای چاپ مجدد آسان.<br><br>حریم خصوصی میتواند حفظ شود. اعلامیهها را میتوان از طریق شبکه Tor به اشتراک گذاشت و از میزبان و کاربران در برابر سانسور محافظت کرد.<br><br>در انقلابی که برای حقیقت و شفافیت ارزش قائل است به ما بپیوندید. با هم، میتوانیم شبکهای از شهروندان آگاه بسازیم که از سخن گفتن نمیهراسند.",
|
||||
"url_message": "VoxVera را دریافت کنید و گسترش پیام خود را آغاز کنید."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "Aucune URL configurée pour le moment. Les codes QR seront générés après 'voxvera serve'",
|
||||
"input_file_not_found": "Le fichier d'entrée {path} n'existe pas.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Créer à partir d'un modèle ---",
|
||||
"template_select": "Sélectionnez un modèle :",
|
||||
"body_over_limit_warning": "Avertissement : Le texte dépasse 1000 caractères. Il pourrait être coupé sur le tract.",
|
||||
"manage_action_export_keys": "Exporter les clés",
|
||||
"manage_action_import_keys": "Importer les clés",
|
||||
"keys_not_found": "Aucune clé de session trouvée pour '{name}'. Démarrez le site d'abord pour générer les clés.",
|
||||
"keys_export_header": "Clé de session pour '{name}' :",
|
||||
"keys_export_hint": "Copiez cette clé et conservez-la en sécurité. Utilisez 'Importer les clés' sur une autre instance pour restaurer.",
|
||||
"keys_site_not_found": "Site '{name}' introuvable.",
|
||||
"keys_overwrite_confirm": "Le site '{name}' a déjà une clé. Écraser ?",
|
||||
"keys_import_cancelled": "Importation annulée.",
|
||||
"keys_import_prompt": "Collez la clé de session base64 ci-dessous :",
|
||||
"keys_import_empty": "Aucune clé fournie.",
|
||||
"keys_import_invalid": "Format de clé invalide. Doit être une chaîne base64 valide.",
|
||||
"keys_import_success": "Clé de session importée pour '{name}'. Redémarrez le site pour utiliser la nouvelle clé."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Utilisez le navigateur Tor",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "TOP SECRET",
|
||||
"subtitle": "~~NE PAS~~ DISTRIBUER",
|
||||
"headline": "OPÉRATION VOX VERA",
|
||||
"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.",
|
||||
"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.<br><br>Utilisez 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.<br><br>La 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.<br><br>Rejoignez-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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Tracts Imprimables Vox Vera"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "Projet AOS",
|
||||
"title": "ANDROID LIBÉRÉ",
|
||||
"subtitle": "SANS LIMITES",
|
||||
"headline": "LIBERTÉ OPEN SOURCE",
|
||||
"content": "Le projet Android Open Source (AOSP) représente l'essence de ce qu'Android était à l'origine : une plateforme ouverte, transparente et adaptable. Il supprime les couches de logiciels propriétaires et de contrôle d'entreprise qui sont devenues synonymes des distributions Android classiques. Avec AOSP, vous accédez à une version brute et non filtrée d'Android, vous permettant de véritablement faire de votre appareil le vôtre.<br><br>Pour les développeurs, AOSP offre un terrain de jeu de possibilités, où les seules limites sont vos compétences et votre imagination. Il sert de base à d'innombrables ROMs personnalisées, chacune adaptée à des besoins spécifiques, que ce soit pour des performances améliorées, la confidentialité ou des fonctionnalités uniques absentes des versions grand public. Les passionnés de vie privée apprécieront l'absence de logiciels préinstallés et de services de suivi qui accompagnent souvent Android d'usine.<br><br>AOSP n'est pas réservé aux développeurs ou aux passionnés de technologie ; c'est pour tous ceux qui valorisent la liberté numérique. Il vous permet de reprendre le contrôle de votre appareil, en l'adaptant à vos besoins sans les restrictions des opérateurs ou des fabricants. Découvrez comment AOSP peut transformer votre expérience mobile. Commencez votre voyage vers un avenir plus ouvert et personnalisable dès aujourd'hui.",
|
||||
"url_message": "Visitez le lien ci-dessous pour en savoir plus."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Tracts de la Révolution Bitcoin",
|
||||
"title": "DES RÈGLES SANS DIRIGEANTS",
|
||||
"subtitle": "NE PAS IGNORER",
|
||||
"headline": "REJOIGNEZ LA RÉVOLUTION BITCOIN",
|
||||
"content": "Qu'est-ce que Bitcoin ? C'est bien plus que de l'argent numérique ; c'est une technologie révolutionnaire conçue pour résoudre certains des problèmes les plus urgents du monde. Bitcoin fonctionne sur un réseau décentralisé, libre du contrôle de tout gouvernement ou autorité centrale. Cela garantit que personne ne peut manipuler son offre ou sa valeur, ce qui en fait une forme saine de monnaie qui protège votre richesse de l'inflation.<br><br>Notre système financier actuel repose sur des incitations défaillantes—encourageant la dette, la dépendance et la centralisation du pouvoir. Bitcoin change cela en créant un système où l'honnêteté, la transparence et la responsabilité individuelle sont récompensées. Dans le réseau Bitcoin, il n'y a pas de place pour la corruption ou la manipulation car les règles sont appliquées par les mathématiques, pas par les personnes.<br><br>Bitcoin aligne les incitations de manière à promouvoir la pensée à long terme, l'épargne et l'innovation. Il permet aux individus de prendre le contrôle de leur avenir financier, favorisant une communauté mondiale où la valeur peut être transférée librement et en toute sécurité sans intermédiaires. C'est pourquoi nous avons besoin de Bitcoin—parce qu'il crée un monde où les incitations sont correctement alignées, menant à une société plus juste et prospère pour tous.<br><br>Faites le pas pour en apprendre davantage sur Bitcoin et comment il peut transformer non seulement votre vie financière, mais le monde. Détachez un lien à gauche et explorez cette technologie révolutionnaire. Rejoignez le mouvement vers un avenir meilleur.",
|
||||
"url_message": "Suivez ce lien pour en savoir plus."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Message qui Change la Vie",
|
||||
"title": "BONNE NOUVELLE",
|
||||
"subtitle": "NE PAS IGNORER",
|
||||
"headline": "DÉCOUVREZ LE VÉRITABLE ESPOIR",
|
||||
"content": "Qui est Jesus ? Il est bien plus qu'une figure historique ; Il est le Fils de Dieu, le Sauveur du monde. Jesus lui-même a dit : 'Je suis le chemin, la vérité et la vie. Nul ne vient au Père que par moi' (Jean 14:6). Il est venu pour combler le fossé entre Dieu et l'humanité, nous offrant un chemin vers le pardon, la paix et la vie éternelle.<br><br>Nous faisons tous face à des brisures dans nos vies—que ce soit dans nos relations, nos cœurs ou notre monde. Jesus est venu pour guérir cette brisure. Il a vécu une vie parfaite, est mort sur la croix pour nos péchés, et est ressuscité, vainquant la mort et nous offrant l'espoir de la vie éternelle avec Dieu.<br><br>Sans Jesus, nous sommes perdus dans notre péché, séparés de Dieu. Mais à travers Lui, nous pouvons être pardonnés et restaurés. Il nous offre non seulement une vie meilleure maintenant, mais la promesse d'une vie éternelle avec Lui. C'est pourquoi nous avons besoin de Lui—parce que c'est seulement en Jesus que nous pouvons trouver la véritable paix, un but et l'assurance de la vie éternelle.<br><br>Faites le pas pour en apprendre davantage sur Jesus et l'impact transformateur qu'Il peut avoir sur votre vie. Détachez un lien à gauche et explorez Ses enseignements. Trouvez l'espoir que vous cherchiez.",
|
||||
"url_message": "Suivez ce lien pour en savoir plus."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Tracts du Réseau Meshtastic",
|
||||
"title": "COMMUNICATIONS SÉCURISÉES",
|
||||
"subtitle": "NE PAS IGNORER",
|
||||
"headline": "CONSTRUISEZ VOTRE RÉSEAU D'URGENCE",
|
||||
"content": "Pourquoi Meshtastic ? En temps de crise, les réseaux de communication traditionnels peuvent échouer, nous laissant isolés et vulnérables. Meshtastic fournit une solution puissante—un réseau de communication local alternatif qui fonctionne indépendamment des systèmes centralisés. Il est conçu pour les situations d'urgence, vous permettant de rester connecté quand cela compte le plus.<br><br>Les appareils Meshtastic créent un réseau maillé capable de relayer des messages sur de longues distances, même sans couverture internet ou cellulaire. Cette approche décentralisée garantit que vos communications sont résilientes et fiables, quelles que soient les circonstances. Mais il ne s'agit pas seulement de rester connecté—Meshtastic offre également le chiffrement, pour que vos messages restent sécurisés et privés.<br><br>Dans un monde où la vie privée est de plus en plus compromise, Meshtastic vous permet de prendre le contrôle de votre communication. Que vous coordonniez une réponse communautaire locale, restiez en contact avec vos proches lors d'une catastrophe, ou vous prépariez simplement à l'inattendu, Meshtastic fournit les outils dont vous avez besoin pour communiquer de manière sécurisée et efficace.<br><br>Faites le pas pour en apprendre davantage sur Meshtastic et comment vous pouvez construire votre propre réseau de communication d'urgence. Détachez un lien à gauche et explorez cette technologie innovante. Assurez-vous d'être prêt pour tout ce qui peut arriver.",
|
||||
"url_message": "Suivez ce lien pour en savoir plus."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Tracts du Protocole Nostr",
|
||||
"title": "LIBERTÉ SOCIALE",
|
||||
"subtitle": "NE PAS IGNORER",
|
||||
"headline": "REJOIGNEZ LE RÉSEAU RÉSISTANT À LA CENSURE",
|
||||
"content": "Qu'est-ce que Nostr ? Contrairement aux plateformes de médias sociaux traditionnelles, Nostr est un protocole—un système décentralisé qui permet aux utilisateurs de se connecter et de partager sans les contraintes d'une autorité centrale. Nostr est résistant à la censure, ce qui signifie que votre voix ne peut pas être réduite au silence par des entreprises ou des gouvernements. Il est conçu pour vous donner le contrôle de votre présence en ligne, libre de l'influence des algorithmes ou des publicités qui privilégient l'engagement au détriment des connexions significatives.<br><br>Sur Nostr, il n'y a pas d'agendas cachés pour vous maintenir dans un défilement sans fin. Vous interagissez avec le contenu selon vos termes, pas en fonction de ce qu'un algorithme pense vous gardera en ligne le plus longtemps. Nostr vous permet de construire des connexions authentiques et de participer à des conversations qui comptent, tout en préservant votre vie privée et votre autonomie.<br><br>Dans un monde où la parole en ligne est de plus en plus contrôlée et manipulée, Nostr offre une alternative rafraîchissante. Ce n'est pas qu'une plateforme ; c'est un mouvement vers une véritable liberté numérique, où vos interactions sont guidées par vos intérêts et vos valeurs, pas par ce qui génère le plus de revenus publicitaires.<br><br>Faites le pas pour en apprendre davantage sur Nostr et comment il peut transformer la façon dont vous vous connectez en ligne. Détachez un lien à gauche et explorez ce protocole révolutionnaire. Rejoignez une communauté qui valorise la liberté et l'interaction authentique.",
|
||||
"url_message": "Suivez ce lien pour en savoir plus."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Tracts Imprimables Vox Vera",
|
||||
"title": "TOP SECRET",
|
||||
"subtitle": "~~NE PAS~~ DISTRIBUER",
|
||||
"headline": "OPÉRATION VOX VERA",
|
||||
"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.<br><br>Utilisez 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.<br><br>La 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.<br><br>Rejoignez-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."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "עדיין לא הוגדרו כתובות URL. קודי QR ייווצרו לאחר 'voxvera serve'",
|
||||
"input_file_not_found": "קובץ הקלט {path} אינו קיים.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- יצירה מתבנית ---",
|
||||
"template_select": "בחר תבנית:",
|
||||
"body_over_limit_warning": "אזהרה: טקסט הגוף חורג מ-1000 תווים. הוא עלול להיחתך בעלון.",
|
||||
"manage_action_export_keys": "ייצוא מפתחות",
|
||||
"manage_action_import_keys": "ייבוא מפתחות",
|
||||
"keys_not_found": "לא נמצא מפתח הפעלה עבור '{name}'. הפעל את האתר תחילה ליצירת מפתחות.",
|
||||
"keys_export_header": "מפתח הפעלה עבור '{name}':",
|
||||
"keys_export_hint": "העתק מפתח זה ושמור אותו בבטחה. השתמש ב'ייבוא מפתחות' במופע אחר לשחזור.",
|
||||
"keys_site_not_found": "האתר '{name}' לא נמצא.",
|
||||
"keys_overwrite_confirm": "לאתר '{name}' כבר יש מפתח. לדרוס?",
|
||||
"keys_import_cancelled": "הייבוא בוטל.",
|
||||
"keys_import_prompt": "הדבק את מפתח ההפעלה base64 למטה:",
|
||||
"keys_import_empty": "לא סופק מפתח.",
|
||||
"keys_import_invalid": "פורמט מפתח לא חוקי. חייב להיות מחרוזת base64 חוקית.",
|
||||
"keys_import_success": "מפתח הפעלה יובא עבור '{name}'. הפעל מחדש את האתר כדי להשתמש במפתח החדש."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "השתמש בדפדפן Tor",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "סודי ביותר",
|
||||
"subtitle": "~~לא~~ להפצה",
|
||||
"headline": "מבצע VOX VERA",
|
||||
"content": "השתחרר מהצנזורה עם VoxVera. כלי אנונימי לשיווק גרילה והפצת מסרים. בין אם באינטרנט ובין אם בעולם הפיזי, הוא יכול להעצים אותך להפיץ את הרעיונות שלך בתעוזה, מוגן באנונימיות מלאה (אם אתה מארח דרך Tor). הורד את הקוד, עצב אתר פלייר, ארח אותו אונליין והגבר את המסר שלך.\n\nהשתמש בכוח הממטי כדי לשתף את הרעיונות שלך בבית הספר, במקום העבודה, בקהילות מקוונות או אפילו ברמה עולמית. VoxVera מבטיחה שהמסר שלך יהדהד למרחקים, עם חלקים נתלשים הכוללים כתובות URL ייחודיות וקודי QR להדפסה חוזרת קלה.\n\nניתן לשמור על פרטיות. ניתן לשתף פליירים דרך רשת Tor, ובכך להגן על המארח ועל המשתמשים מפני צנזורה.\n\nהצטרפו אלינו למהפכה שמעריכה אמת ושקיפות. יחד, נוכל לבנות רשת של אזרחים מושכלים שאינם פוחדים להתבטא.",
|
||||
"content": "השתחרר מהצנזורה עם VoxVera. כלי אנונימי לשיווק גרילה והפצת מסרים. בין אם באינטרנט ובין אם בעולם הפיזי, הוא יכול להעצים אותך להפיץ את הרעיונות שלך בתעוזה, מוגן באנונימיות מלאה (אם אתה מארח דרך Tor). הורד את הקוד, עצב אתר פלייר, ארח אותו אונליין והגבר את המסר שלך.<br><br>השתמש בכוח הממטי כדי לשתף את הרעיונות שלך בבית הספר, במקום העבודה, בקהילות מקוונות או אפילו ברמה עולמית. VoxVera מבטיחה שהמסר שלך יהדהד למרחקים, עם חלקים נתלשים הכוללים כתובות URL ייחודיות וקודי QR להדפסה חוזרת קלה.<br><br>ניתן לשמור על פרטיות. ניתן לשתף פליירים דרך רשת Tor, ובכך להגן על המארח ועל המשתמשים מפני צנזורה.<br><br>הצטרפו אלינו למהפכה שמעריכה אמת ושקיפות. יחד, נוכל לבנות רשת של אזרחים מושכלים שאינם פוחדים להתבטא.",
|
||||
"url_message": "קבלו את VoxVera והתחילו להפיץ את המסר שלכם.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "עלונים להדפסה של Vox Vera"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "פרויקט AOS",
|
||||
"title": "ANDROID ללא כבלים",
|
||||
"subtitle": "ללא גבולות",
|
||||
"headline": "חופש קוד פתוח",
|
||||
"content": "פרויקט הקוד הפתוח של Android (AOSP) מייצג את המהות של מה ש-Android נועד להיות במקור: פלטפורמה פתוחה, שקופה וניתנת להתאמה. הוא מסיר את שכבות התוכנה הקניינית והפיקוח הארגוני שהפכו נרדפים להפצות Android המרכזיות. עם AOSP, אתה מקבל גישה לגרסה גולמית ולא מסוננת של Android, המאפשרת לך באמת להפוך את המכשיר שלך לשלך.<br><br>למפתחים, AOSP מציע מגרש משחקים של אפשרויות, שבו הגבולות היחידים הם הכישורים והדמיון שלך. הוא משמש כבסיס לאינספור ROM-ים מותאמים אישית, כל אחד מותאם לצרכים ספציפיים, בין אם לביצועים משופרים, פרטיות או תכונות ייחודיות שחסרות בגרסאות המרכזיות. חובבי פרטיות יעריכו את היעדר התוכנות המיותרות המותקנות מראש ושירותי המעקב שמגיעים לרוב עם Android מהמפעל.<br><br>AOSP אינו רק למפתחים או חובבי טכנולוגיה; הוא לכל מי שמעריך חופש דיגיטלי. הוא מאפשר לך להשיב את השליטה על המכשיר שלך, להתאים אותו לצרכיך ללא ההגבלות של ספקים או יצרנים. גלה כיצד AOSP יכול לשנות את חוויית הנייד שלך. התחל את המסע שלך לעתיד פתוח וניתן להתאמה יותר עוד היום.",
|
||||
"url_message": "בקר בקישור למטה למידע נוסף."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "עלונים של מהפכת Bitcoin",
|
||||
"title": "חוקים ללא שליטים",
|
||||
"subtitle": "אל תתעלם",
|
||||
"headline": "הצטרף למהפכת BITCOIN",
|
||||
"content": "מה זה Bitcoin? זה יותר מסתם כסף דיגיטלי; זו טכנולוגיה מהפכנית שנועדה לפתור כמה מהבעיות הדחופות ביותר בעולם. Bitcoin פועל על רשת מבוזרת, חופשית משליטה של כל ממשלה או רשות מרכזית. זה מבטיח שאף אחד לא יכול לתמרן את ההיצע או הערך שלו, מה שהופך אותו לצורה בריאה של כסף שמגן על העושר שלך מפני אינפלציה.<br><br>המערכת הפיננסית הנוכחית שלנו בנויה על תמריצים פגומים—מעודדת חוב, תלות וריכוז כוח. Bitcoin משנה זאת על ידי יצירת מערכת שבה יושר, שקיפות ואחריות אישית מתוגמלים. ברשת Bitcoin, אין מקום לשחיתות או מניפולציה כי הכללים נאכפים על ידי מתמטיקה, לא על ידי אנשים.<br><br>Bitcoin מיישר תמריצים באופן שמקדם חשיבה ארוכת טווח, חיסכון וחדשנות. הוא מעצים אנשים לקחת שליטה על העתיד הפיננסי שלהם, ומטפח קהילה עולמית שבה ערך יכול להיות מועבר בחופשיות ובביטחון ללא מתווכים. לכן אנחנו צריכים Bitcoin—כי הוא יוצר עולם שבו תמריצים מיושרים כראוי, ומוביל לחברה הוגנת ומשגשגת יותר לכולם.<br><br>עשה את הצעד ללמוד עוד על Bitcoin וכיצד הוא יכול לשנות לא רק את החיים הפיננסיים שלך, אלא את העולם. קרע קישור משמאל וחקור את הטכנולוגיה פורצת הדרך הזו. הצטרף לתנועה לעתיד טוב יותר.",
|
||||
"url_message": "עקוב אחר הקישור הזה למידע נוסף."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "מסר משנה חיים",
|
||||
"title": "בשורה טובה",
|
||||
"subtitle": "אל תתעלם",
|
||||
"headline": "גלה תקווה אמיתית",
|
||||
"content": "מי הוא Jesus? הוא יותר מסתם דמות היסטורית; הוא בן האלוהים, מושיע העולם. Jesus עצמו אמר: 'אני הדרך, האמת והחיים. איש אינו בא אל האב אלא דרכי' (יוחנן 14:6). הוא בא לגשר על הפער בין אלוהים לאנושות, ומציע לנו דרך למחילה, שלום וחיי נצח.<br><br>כולנו מתמודדים עם שברון בחיינו—בין אם ביחסים שלנו, בלבנו או בעולמנו. Jesus בא לרפא את השברון הזה. הוא חי חיים מושלמים, מת על הצלב בעד חטאינו, וקם לתחייה, ניצח את המוות והעניק לנו את תקוות חיי הנצח עם אלוהים.<br><br>בלי Jesus, אנחנו אבודים בחטאנו, מופרדים מאלוהים. אבל דרכו, אנחנו יכולים לקבל מחילה ולהתחדש. הוא מציע לנו לא רק חיים טובים יותר עכשיו, אלא את ההבטחה לחיי נצח איתו. לכן אנחנו צריכים אותו—כי רק ב-Jesus אנחנו יכולים למצוא שלום אמיתי, תכלית והבטחת חיי נצח.<br><br>עשה את הצעד ללמוד עוד על Jesus וההשפעה משנת החיים שיכולה להיות לו בחייך. קרע קישור משמאל וחקור את תורתו. מצא את התקווה שחיפשת.",
|
||||
"url_message": "עקוב אחר הקישור הזה למידע נוסף."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "עלונים של רשת Meshtastic",
|
||||
"title": "תקשורת מאובטחת",
|
||||
"subtitle": "אל תתעלם",
|
||||
"headline": "בנה את רשת החירום שלך",
|
||||
"content": "למה Meshtastic? בזמני משבר, רשתות תקשורת מסורתיות עלולות לכשול ולהשאיר אותנו מבודדים ופגיעים. Meshtastic מספק פתרון רב-עוצמה—רשת תקשורת מקומית חלופית שפועלת באופן עצמאי ממערכות מרכזיות. הוא מתוכנן למצבי חירום, ומאפשר לך להישאר מחובר כשזה הכי חשוב.<br><br>מכשירי Meshtastic יוצרים רשת מש שיכולה להעביר הודעות על פני מרחקים ארוכים, גם ללא כיסוי אינטרנט או סלולר. גישה מבוזרת זו מבטיחה שהתקשורת שלך חסינה ואמינה, ללא קשר לנסיבות. אבל זה לא רק להישאר מחובר—Meshtastic גם מציע הצפנה, כך שההודעות שלך נשארות מאובטחות ופרטיות.<br><br>בעולם שבו הפרטיות נפגעת יותר ויותר, Meshtastic מעצים אותך לקחת שליטה על התקשורת שלך. בין אם אתה מתאם תגובה קהילתית מקומית, שומר על קשר עם יקיריך במהלך אסון, או פשוט מתכונן לבלתי צפוי, Meshtastic מספק את הכלים הדרושים לך לתקשר בבטחה וביעילות.<br><br>עשה את הצעד ללמוד עוד על Meshtastic וכיצד אתה יכול לבנות רשת תקשורת חירום משלך. קרע קישור משמאל וחקור את הטכנולוגיה החדשנית הזו. ודא שאתה מוכן לכל מה שעלול לבוא.",
|
||||
"url_message": "עקוב אחר הקישור הזה למידע נוסף."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "עלונים של פרוטוקול Nostr",
|
||||
"title": "חופש חברתי",
|
||||
"subtitle": "אל תתעלם",
|
||||
"headline": "הצטרף לרשת העמידה בפני צנזורה",
|
||||
"content": "מה זה Nostr? בניגוד לפלטפורמות מדיה חברתית מסורתיות, Nostr הוא פרוטוקול—מערכת מבוזרת שמעצימה משתמשים להתחבר ולשתף ללא המגבלות של רשות מרכזית. Nostr עמיד בפני צנזורה, כלומר הקול שלך לא יכול להשתתק על ידי תאגידים או ממשלות. הוא מתוכנן לתת לך שליטה על הנוכחות המקוונת שלך, חופשי מהשפעת אלגוריתמים או פרסומות שמעדיפים מעורבות על פני קשרים משמעותיים.<br><br>ב-Nostr, אין אג'נדות נסתרות שמחזיקות אותך בגלילה אינסופית. אתה מתקשר עם תוכן לפי התנאים שלך, לא על בסיס מה שאלגוריתם חושב שישאיר אותך מחובר הכי הרבה זמן. Nostr מאפשר לך לבנות קשרים אמיתיים ולהשתתף בשיחות שחשובות, הכל תוך שמירה על הפרטיות והאוטונומיה שלך.<br><br>בעולם שבו השיח המקוון נשלט ומתומרן יותר ויותר, Nostr מציע חלופה מרעננת. זו לא רק פלטפורמה; זו תנועה לכיוון חופש דיגיטלי אמיתי, שבו האינטראקציות שלך מונעות על ידי העניינים והערכים שלך, לא על ידי מה שמייצר הכי הרבה הכנסות מפרסום.<br><br>עשה את הצעד ללמוד עוד על Nostr וכיצד הוא יכול לשנות את הדרך שבה אתה מתחבר אונליין. קרע קישור משמאל וחקור את הפרוטוקול פורץ הדרך הזה. הצטרף לקהילה שמעריכה חופש ואינטראקציה אותנטית.",
|
||||
"url_message": "עקוב אחר הקישור הזה למידע נוסף."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "עלונים להדפסה של Vox Vera",
|
||||
"title": "סודי ביותר",
|
||||
"subtitle": "~~לא~~ להפצה",
|
||||
"headline": "מבצע VOX VERA",
|
||||
"content": "השתחרר מהצנזורה עם VoxVera. כלי אנונימי לשיווק גרילה והפצת מסרים. בין אם באינטרנט ובין אם בעולם הפיזי, הוא יכול להעצים אותך להפיץ את הרעיונות שלך בתעוזה, מוגן באנונימיות מלאה (אם אתה מארח דרך Tor). הורד את הקוד, עצב אתר פלייר, ארח אותו אונליין והגבר את המסר שלך.<br><br>השתמש בכוח הממטי כדי לשתף את הרעיונות שלך בבית הספר, במקום העבודה, בקהילות מקוונות או אפילו ברמה עולמית. VoxVera מבטיחה שהמסר שלך יהדהד למרחקים, עם חלקים נתלשים הכוללים כתובות URL ייחודיות וקודי QR להדפסה חוזרת קלה.<br><br>ניתן לשמור על פרטיות. ניתן לשתף פליירים דרך רשת Tor, ובכך להגן על המארח ועל המשתמשים מפני צנזורה.<br><br>הצטרפו אלינו למהפכה שמעריכה אמת ושקיפות. יחד, נוכל לבנות רשת של אזרחים מושכלים שאינם פוחדים להתבטא.",
|
||||
"url_message": "קבלו את VoxVera והתחילו להפיץ את המסר שלכם."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "अभी तक कोई URL कॉन्फ़िगर नहीं किया गया है। QR कोड 'voxvera serve' के बाद जेनरेट किए जाएंगे",
|
||||
"input_file_not_found": "इनपुट फ़ाइल {path} मौजूद नहीं है।",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- टेम्पलेट से बनाएं ---",
|
||||
"template_select": "एक टेम्पलेट चुनें:",
|
||||
"body_over_limit_warning": "चेतावनी: मुख्य पाठ 1000 अक्षरों से अधिक है। यह पर्चे पर कटा हुआ दिख सकता है।",
|
||||
"manage_action_export_keys": "कुंजियाँ निर्यात करें",
|
||||
"manage_action_import_keys": "कुंजियाँ आयात करें",
|
||||
"keys_not_found": "'{name}' के लिए सत्र कुंजी नहीं मिली। कुंजियाँ उत्पन्न करने के लिए पहले साइट शुरू करें।",
|
||||
"keys_export_header": "'{name}' के लिए सत्र कुंजी:",
|
||||
"keys_export_hint": "इस कुंजी को कॉपी करें और सुरक्षित रूप से सहेजें। पुनर्स्थापित करने के लिए किसी अन्य इंस्टेंस पर 'कुंजियाँ आयात करें' का उपयोग करें।",
|
||||
"keys_site_not_found": "साइट '{name}' नहीं मिली।",
|
||||
"keys_overwrite_confirm": "साइट '{name}' में पहले से कुंजी है। अधिलेखित करें?",
|
||||
"keys_import_cancelled": "आयात रद्द किया गया।",
|
||||
"keys_import_prompt": "नीचे base64 सत्र कुंजी चिपकाएँ:",
|
||||
"keys_import_empty": "कोई कुंजी प्रदान नहीं की गई।",
|
||||
"keys_import_invalid": "अमान्य कुंजी प्रारूप। एक वैध base64 स्ट्रिंग होनी चाहिए।",
|
||||
"keys_import_success": "'{name}' के लिए सत्र कुंजी आयात की गई। नई कुंजी का उपयोग करने के लिए साइट को पुनः प्रारंभ करें।"
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Tor Browser का उपयोग करें",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "अति गोपनीय",
|
||||
"subtitle": "~~वितरित न करें~~",
|
||||
"headline": "ऑपरेशन VOX VERA",
|
||||
"content": "VoxVera के साथ सेंसरशिप से मुक्त हों। एक गुमनाम गुरिल्ला मार्केटिंग और संदेश फैलाने वाला टूल। चाहे ऑनलाइन हो या भौतिक दुनिया में, यह आपको पूर्ण गुमनामी (यदि आप Tor पर होस्ट करते हैं) द्वारा सुरक्षित रहते हुए अपने विचारों को साहसपूर्वक फैलाने का अधिकार दे सकता है। कोड डाउनलोड करें, एक फ्लायर साइट डिज़ाइन करें, इसे ऑनलाइन होस्ट करें और अपने संदेश को बढ़ाएं।\n\nअपने विचारों को अपने स्कूल, कार्यस्थल, ऑनलाइन समुदायों या विश्व स्तर पर साझा करने के लिए मेमेटिक शक्ति का उपयोग करें। VoxVera यह सुनिश्चित करता है कि आपका संदेश दूर-दूर तक गूंजे, जिसमें आसान पुनर्मुद्रण के लिए अद्वितीय URL और QR कोड वाले टियर-ऑफ सेक्शन हैं।\n\nगोपनीयता बनाए रखी जा सकती है। फ्लायर्स को Tor नेटवर्क के माध्यम से साझा किया जा सकता है, जिससे होस्ट और उपयोगकर्ताओं को सेंसरशिप से बचाया जा सकता है।\n\nएक ऐसी क्रांति में हमारे साथ जुड़ें जो सच्चाई और पारदर्शिता को महत्व देती है। साथ मिलकर, हम उन सूचित नागरिकों का एक नेटवर्क बना सकते हैं जो बोलने से नहीं डरते।",
|
||||
"content": "VoxVera के साथ सेंसरशिप से मुक्त हों। एक गुमनाम गुरिल्ला मार्केटिंग और संदेश फैलाने वाला टूल। चाहे ऑनलाइन हो या भौतिक दुनिया में, यह आपको पूर्ण गुमनामी (यदि आप Tor पर होस्ट करते हैं) द्वारा सुरक्षित रहते हुए अपने विचारों को साहसपूर्वक फैलाने का अधिकार दे सकता है। कोड डाउनलोड करें, एक फ्लायर साइट डिज़ाइन करें, इसे ऑनलाइन होस्ट करें और अपने संदेश को बढ़ाएं।<br><br>अपने विचारों को अपने स्कूल, कार्यस्थल, ऑनलाइन समुदायों या विश्व स्तर पर साझा करने के लिए मेमेटिक शक्ति का उपयोग करें। VoxVera यह सुनिश्चित करता है कि आपका संदेश दूर-दूर तक गूंजे, जिसमें आसान पुनर्मुद्रण के लिए अद्वितीय URL और QR कोड वाले टियर-ऑफ सेक्शन हैं।<br><br>गोपनीयता बनाए रखी जा सकती है। फ्लायर्स को Tor नेटवर्क के माध्यम से साझा किया जा सकता है, जिससे होस्ट और उपयोगकर्ताओं को सेंसरशिप से बचाया जा सकता है।<br><br>एक ऐसी क्रांति में हमारे साथ जुड़ें जो सच्चाई और पारदर्शिता को महत्व देती है। साथ मिलकर, हम उन सूचित नागरिकों का एक नेटवर्क बना सकते हैं जो बोलने से नहीं डरते।",
|
||||
"url_message": "VoxVera प्राप्त करें और अपना संदेश फैलाना शुरू करें।",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vox Vera प्रिंट करने योग्य पर्चे"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOS प्रोजेक्ट",
|
||||
"title": "ANDROID मुक्त",
|
||||
"subtitle": "बिना सीमाओं के",
|
||||
"headline": "ओपन-सोर्स स्वतंत्रता",
|
||||
"content": "Android ओपन सोर्स प्रोजेक्ट (AOSP) उस सार का प्रतिनिधित्व करता है जो Android मूल रूप से होने का इरादा था: एक खुला, पारदर्शी और अनुकूलनीय प्लेटफॉर्म। यह मालिकाना सॉफ्टवेयर और कॉर्पोरेट निगरानी की परतों को हटा देता है जो मुख्यधारा Android वितरण का पर्याय बन गई हैं। AOSP के साथ, आपको Android का एक कच्चा, बिना फिल्टर किया हुआ संस्करण मिलता है, जो आपको वास्तव में अपने डिवाइस को अपना बनाने की अनुमति देता है।<br><br>डेवलपर्स के लिए, AOSP संभावनाओं का एक खेल का मैदान प्रदान करता है, जहां एकमात्र सीमाएं आपके कौशल और कल्पना हैं। यह अनगिनत कस्टम ROM के लिए आधार के रूप में कार्य करता है, जिनमें से प्रत्येक विशिष्ट आवश्यकताओं के लिए तैयार किया गया है, चाहे वह बेहतर प्रदर्शन, गोपनीयता या अनूठी सुविधाओं के लिए हो। गोपनीयता के शौकीन पहले से स्थापित ब्लोटवेयर और ट्रैकिंग सेवाओं की अनुपस्थिति की सराहना करेंगे।<br><br>AOSP केवल डेवलपर्स या तकनीक के शौकीनों के लिए नहीं है; यह किसी भी व्यक्ति के लिए है जो डिजिटल स्वतंत्रता को महत्व देता है। यह आपको अपने डिवाइस पर नियंत्रण वापस लेने की अनुमति देता है, इसे वाहकों या निर्माताओं की प्रतिबंधों के बिना अपनी आवश्यकताओं के अनुसार अनुकूलित करता है। जानें कि AOSP कैसे आपके मोबाइल अनुभव को बदल सकता है। आज ही एक अधिक खुले, अनुकूलन योग्य भविष्य की ओर अपनी यात्रा शुरू करें।",
|
||||
"url_message": "अधिक जानने के लिए नीचे दिए गए लिंक पर जाएं।"
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Bitcoin क्रांति पर्चे",
|
||||
"title": "शासकों के बिना नियम",
|
||||
"subtitle": "अनदेखा न करें",
|
||||
"headline": "BITCOIN क्रांति में शामिल हों",
|
||||
"content": "Bitcoin क्या है? यह केवल डिजिटल पैसा नहीं है; यह एक क्रांतिकारी तकनीक है जो दुनिया की कुछ सबसे गंभीर समस्याओं को हल करने के लिए डिज़ाइन की गई है। Bitcoin एक विकेंद्रीकृत नेटवर्क पर काम करता है, जो किसी भी सरकार या केंद्रीय प्राधिकरण के नियंत्रण से मुक्त है। यह सुनिश्चित करता है कि कोई भी इसकी आपूर्ति या मूल्य में हेरफेर नहीं कर सकता, जो इसे धन का एक स्वस्थ रूप बनाता है जो आपकी संपत्ति को मुद्रास्फीति से बचाता है।<br><br>हमारी वर्तमान वित्तीय प्रणाली दोषपूर्ण प्रोत्साहनों पर बनी है—कर्ज, निर्भरता और सत्ता के केंद्रीकरण को प्रोत्साहित करती है। Bitcoin इसे बदलता है एक ऐसी प्रणाली बनाकर जहां ईमानदारी, पारदर्शिता और व्यक्तिगत जिम्मेदारी को पुरस्कृत किया जाता है। Bitcoin नेटवर्क में, भ्रष्टाचार या हेरफेर के लिए कोई जगह नहीं है क्योंकि नियम गणित द्वारा लागू किए जाते हैं, लोगों द्वारा नहीं।<br><br>Bitcoin प्रोत्साहनों को इस तरह संरेखित करता है जो दीर्घकालिक सोच, बचत और नवाचार को बढ़ावा देता है। यह व्यक्तियों को अपने वित्तीय भविष्य पर नियंत्रण लेने का अधिकार देता है, एक वैश्विक समुदाय को बढ़ावा देता है जहां मूल्य बिचौलियों के बिना स्वतंत्र रूप से और सुरक्षित रूप से स्थानांतरित किया जा सकता है। इसलिए हमें Bitcoin की आवश्यकता है—क्योंकि यह एक ऐसी दुनिया बनाता है जहां प्रोत्साहन ठीक से संरेखित हैं, जो सभी के लिए अधिक न्यायसंगत और समृद्ध समाज की ओर ले जाता है।<br><br>Bitcoin के बारे में और जानने का कदम उठाएं कि यह न केवल आपके वित्तीय जीवन को, बल्कि दुनिया को कैसे बदल सकता है। बाईं ओर से एक लिंक फाड़ें और इस अभूतपूर्व तकनीक का पता लगाएं। बेहतर भविष्य की ओर आंदोलन में शामिल हों।",
|
||||
"url_message": "अधिक जानने के लिए इस लिंक का अनुसरण करें।"
|
||||
},
|
||||
"jesus": {
|
||||
"name": "जीवन बदलने वाला संदेश",
|
||||
"title": "शुभ समाचार",
|
||||
"subtitle": "अनदेखा न करें",
|
||||
"headline": "सच्ची आशा की खोज करें",
|
||||
"content": "Jesus कौन हैं? वह केवल एक ऐतिहासिक व्यक्ति से कहीं अधिक हैं; वह परमेश्वर के पुत्र हैं, संसार के उद्धारकर्ता हैं। Jesus ने स्वयं कहा, 'मार्ग और सत्य और जीवन मैं ही हूं। बिना मेरे द्वारा कोई पिता के पास नहीं पहुंच सकता' (यूहन्ना 14:6)। वह परमेश्वर और मानवता के बीच की खाई को पाटने आए, हमें क्षमा, शांति और अनंत जीवन का मार्ग प्रदान करते हुए।<br><br>हम सभी अपने जीवन में टूटेपन का सामना करते हैं—चाहे वह हमारे रिश्तों में हो, हमारे दिलों में हो, या हमारी दुनिया में। Jesus उस टूटेपन को ठीक करने आए। उन्होंने एक सिद्ध जीवन जिया, हमारे पापों के लिए क्रूस पर मरे, और पुनर्जीवित हुए, मृत्यु को पराजित किया और हमें परमेश्वर के साथ अनंत जीवन की आशा दी।<br><br>Jesus के बिना, हम अपने पाप में खोए हुए हैं, परमेश्वर से अलग। लेकिन उनके माध्यम से, हम क्षमा और पुनर्स्थापित हो सकते हैं। वह हमें न केवल अब एक बेहतर जीवन प्रदान करते हैं, बल्कि उनके साथ अनंत जीवन का वादा भी। इसलिए हमें उनकी आवश्यकता है—क्योंकि केवल Jesus में ही हम सच्ची शांति, उद्देश्य और अनंत जीवन का आश्वासन पा सकते हैं।<br><br>Jesus के बारे में और उनके जीवन-बदलने वाले प्रभाव के बारे में जानने का कदम उठाएं। बाईं ओर से एक लिंक फाड़ें और उनकी शिक्षाओं का पता लगाएं। वह आशा खोजें जिसे आप ढूंढ रहे थे।",
|
||||
"url_message": "अधिक जानने के लिए इस लिंक का अनुसरण करें।"
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtastic नेटवर्क पर्चे",
|
||||
"title": "सुरक्षित संचार",
|
||||
"subtitle": "अनदेखा न करें",
|
||||
"headline": "अपना आपातकालीन नेटवर्क बनाएं",
|
||||
"content": "Meshtastic क्यों? संकट के समय में, पारंपरिक संचार नेटवर्क विफल हो सकते हैं, जिससे हम अलग-थलग और असुरक्षित रह जाते हैं। Meshtastic एक शक्तिशाली समाधान प्रदान करता है—एक वैकल्पिक स्थानीय संचार नेटवर्क जो केंद्रीकृत प्रणालियों से स्वतंत्र रूप से काम करता है। यह आपातकालीन स्थितियों के लिए डिज़ाइन किया गया है, जो आपको सबसे ज़रूरी समय पर जुड़े रहने की अनुमति देता है।<br><br>Meshtastic उपकरण एक मेश नेटवर्क बनाते हैं जो इंटरनेट या सेलुलर कवरेज के बिना भी लंबी दूरी पर संदेश रिले कर सकता है। यह विकेंद्रीकृत दृष्टिकोण सुनिश्चित करता है कि आपके संचार किसी भी परिस्थिति में लचीले और विश्वसनीय हों। लेकिन यह केवल जुड़े रहने के बारे में नहीं है—Meshtastic एन्क्रिप्शन भी प्रदान करता है, ताकि आपके संदेश सुरक्षित और निजी रहें।<br><br>एक ऐसी दुनिया में जहां गोपनीयता तेजी से खतरे में है, Meshtastic आपको अपने संचार पर नियंत्रण लेने का अधिकार देता है। चाहे आप स्थानीय सामुदायिक प्रतिक्रिया का समन्वय कर रहे हों, किसी आपदा के दौरान प्रियजनों से संपर्क में रह रहे हों, या बस अप्रत्याशित के लिए तैयारी कर रहे हों, Meshtastic आपको सुरक्षित और प्रभावी ढंग से संवाद करने के लिए आवश्यक उपकरण प्रदान करता है।<br><br>Meshtastic के बारे में और जानने का कदम उठाएं कि आप अपना खुद का आपातकालीन संचार नेटवर्क कैसे बना सकते हैं। बाईं ओर से एक लिंक फाड़ें और इस नवीन तकनीक का पता लगाएं। सुनिश्चित करें कि आप जो भी आए उसके लिए तैयार हैं।",
|
||||
"url_message": "अधिक जानने के लिए इस लिंक का अनुसरण करें।"
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostr प्रोटोकॉल पर्चे",
|
||||
"title": "सामाजिक स्वतंत्रता",
|
||||
"subtitle": "अनदेखा न करें",
|
||||
"headline": "सेंसरशिप-प्रतिरोधी नेटवर्क से जुड़ें",
|
||||
"content": "Nostr क्या है? पारंपरिक सोशल मीडिया प्लेटफॉर्म के विपरीत, Nostr एक प्रोटोकॉल है—एक विकेंद्रीकृत प्रणाली जो उपयोगकर्ताओं को केंद्रीय प्राधिकरण की बाधाओं के बिना जुड़ने और साझा करने का अधिकार देती है। Nostr सेंसरशिप-प्रतिरोधी है, जिसका अर्थ है कि आपकी आवाज़ को कॉर्पोरेशनों या सरकारों द्वारा चुप नहीं कराया जा सकता। यह आपको आपकी ऑनलाइन उपस्थिति पर नियंत्रण देने के लिए डिज़ाइन किया गया है, एल्गोरिदम या विज्ञापनों के प्रभाव से मुक्त जो सार्थक कनेक्शन पर जुड़ाव को प्राथमिकता देते हैं।<br><br>Nostr पर, आपको अंतहीन स्क्रॉलिंग में बनाए रखने के लिए कोई छिपे हुए एजेंडे नहीं हैं। आप अपनी शर्तों पर सामग्री से जुड़ते हैं, न कि इस आधार पर कि एक एल्गोरिदम क्या सोचता है कि आपको सबसे लंबे समय तक ऑनलाइन रखेगा। Nostr आपको वास्तविक कनेक्शन बनाने और महत्वपूर्ण बातचीत में भाग लेने की अनुमति देता है, यह सब आपकी गोपनीयता और स्वायत्तता को बनाए रखते हुए।<br><br>एक ऐसी दुनिया में जहां ऑनलाइन भाषण को तेजी से नियंत्रित और हेरफेर किया जा रहा है, Nostr एक ताज़ा विकल्प प्रदान करता है। यह सिर्फ एक प्लेटफॉर्म नहीं है; यह सच्ची डिजिटल स्वतंत्रता की ओर एक आंदोलन है, जहां आपकी बातचीत आपकी रुचियों और मूल्यों से प्रेरित होती है, न कि जो सबसे अधिक विज्ञापन राजस्व उत्पन्न करता है।<br><br>Nostr के बारे में और जानने का कदम उठाएं कि यह आपके ऑनलाइन जुड़ने के तरीके को कैसे बदल सकता है। बाईं ओर से एक लिंक फाड़ें और इस अभूतपूर्व प्रोटोकॉल का पता लगाएं। एक ऐसे समुदाय से जुड़ें जो स्वतंत्रता और प्रामाणिक बातचीत को महत्व देता है।",
|
||||
"url_message": "अधिक जानने के लिए इस लिंक का अनुसरण करें।"
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera प्रिंट करने योग्य पर्चे",
|
||||
"title": "अति गोपनीय",
|
||||
"subtitle": "~~वितरित न करें~~",
|
||||
"headline": "ऑपरेशन VOX VERA",
|
||||
"content": "VoxVera के साथ सेंसरशिप से मुक्त हों। एक गुमनाम गुरिल्ला मार्केटिंग और संदेश फैलाने वाला टूल। चाहे ऑनलाइन हो या भौतिक दुनिया में, यह आपको पूर्ण गुमनामी (यदि आप Tor पर होस्ट करते हैं) द्वारा सुरक्षित रहते हुए अपने विचारों को साहसपूर्वक फैलाने का अधिकार दे सकता है। कोड डाउनलोड करें, एक फ्लायर साइट डिज़ाइन करें, इसे ऑनलाइन होस्ट करें और अपने संदेश को बढ़ाएं।<br><br>अपने विचारों को अपने स्कूल, कार्यस्थल, ऑनलाइन समुदायों या विश्व स्तर पर साझा करने के लिए मेमेटिक शक्ति का उपयोग करें। VoxVera यह सुनिश्चित करता है कि आपका संदेश दूर-दूर तक गूंजे, जिसमें आसान पुनर्मुद्रण के लिए अद्वितीय URL और QR कोड वाले टियर-ऑफ सेक्शन हैं।<br><br>गोपनीयता बनाए रखी जा सकती है। फ्लायर्स को Tor नेटवर्क के माध्यम से साझा किया जा सकता है, जिससे होस्ट और उपयोगकर्ताओं को सेंसरशिप से बचाया जा सकता है।<br><br>एक ऐसी क्रांति में हमारे साथ जुड़ें जो सच्चाई और पारदर्शिता को महत्व देती है। साथ मिलकर, हम उन सूचित नागरिकों का एक नेटवर्क बना सकते हैं जो बोलने से नहीं डरते।",
|
||||
"url_message": "VoxVera प्राप्त करें और अपना संदेश फैलाना शुरू करें।"
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "URLがまだ設定されていません。QRコードは 'voxvera serve' の後に生成されます",
|
||||
"input_file_not_found": "入力ファイル {path} が存在しません。",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- テンプレートから作成 ---",
|
||||
"template_select": "テンプレートを選択してください:",
|
||||
"body_over_limit_warning": "警告:本文が1000文字を超えています。チラシ上で途切れる可能性があります。",
|
||||
"manage_action_export_keys": "鍵をエクスポート",
|
||||
"manage_action_import_keys": "鍵をインポート",
|
||||
"keys_not_found": "'{name}' のセッションキーが見つかりません。まずサイトを起動してキーを生成してください。",
|
||||
"keys_export_header": "'{name}' のセッションキー:",
|
||||
"keys_export_hint": "このキーをコピーして安全に保管してください。別のインスタンスで「鍵をインポート」を使用して復元できます。",
|
||||
"keys_site_not_found": "サイト '{name}' が見つかりません。",
|
||||
"keys_overwrite_confirm": "サイト '{name}' にはすでにキーがあります。上書きしますか?",
|
||||
"keys_import_cancelled": "インポートがキャンセルされました。",
|
||||
"keys_import_prompt": "base64セッションキーを以下に貼り付けてください:",
|
||||
"keys_import_empty": "キーが提供されていません。",
|
||||
"keys_import_invalid": "無効なキー形式です。有効なbase64文字列である必要があります。",
|
||||
"keys_import_success": "'{name}' のセッションキーがインポートされました。新しいキーを使用するにはサイトを再起動してください。"
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Tor Browserを使用してください",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "極秘事項",
|
||||
"subtitle": "~~配布禁止~~",
|
||||
"headline": "作戦名:VOX VERA",
|
||||
"content": "VoxVeraで検閲から解放されましょう。これは、匿名のゲリラマーケティングおよびメッセージ拡散ツールです。オンラインでも物理的な世界でも、Torを介したホスティングによって完全な匿名性に守られながら、自分の考えを大胆に広めることができます。コードをダウンロードし、フライヤーサイトをデザインし、オンラインで公開して、あなたのメッセージを増幅させてください。\n\nミームの力を利用して、学校、職場、オンラインコミュニティ、あるいは世界中にあなたのアイデアを共有しましょう。VoxVeraは、再印刷が簡単な独自のURLとQRコードを備えた切り取りセクションにより、あなたのメッセージが広く遠くまで響くことを保証します。\n\nプライバシーは維持されます。フライヤーはTorネットワークを介して共有でき、ホスト側とユーザー側の両方を検閲から守ります。\n\n真実と透明性を尊重する革命に加わりましょう。共に、声を上げることを恐れない、知識豊富な市民のネットワークを構築しましょう。",
|
||||
"content": "VoxVeraで検閲から解放されましょう。これは、匿名のゲリラマーケティングおよびメッセージ拡散ツールです。オンラインでも物理的な世界でも、Torを介したホスティングによって完全な匿名性に守られながら、自分の考えを大胆に広めることができます。コードをダウンロードし、フライヤーサイトをデザインし、オンラインで公開して、あなたのメッセージを増幅させてください。<br><br>ミームの力を利用して、学校、職場、オンラインコミュニティ、あるいは世界中にあなたのアイデアを共有しましょう。VoxVeraは、再印刷が簡単な独自のURLとQRコードを備えた切り取りセクションにより、あなたのメッセージが広く遠くまで響くことを保証します。<br><br>プライバシーは維持されます。フライヤーはTorネットワークを介して共有でき、ホスト側とユーザー側の両方を検閲から守ります。<br><br>真実と透明性を尊重する革命に加わりましょう。共に、声を上げることを恐れない、知識豊富な市民のネットワークを構築しましょう。",
|
||||
"url_message": "VoxVeraを入手して、メッセージの拡散を始めましょう。",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vox Vera 印刷用チラシ"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOSプロジェクト",
|
||||
"title": "ANDROID 解放",
|
||||
"subtitle": "制限なし",
|
||||
"headline": "オープンソースの自由",
|
||||
"content": "Android Open Source Project(AOSP)は、Androidが本来あるべき姿の本質を表しています:オープンで透明性があり、適応可能なプラットフォームです。メインストリームのAndroidディストリビューションの代名詞となったプロプライエタリソフトウェアと企業監視の層を取り除きます。AOSPを使用すると、フィルタリングされていない生のAndroidにアクセスでき、デバイスを真に自分のものにすることができます。<br><br>開発者にとって、AOSPは可能性の遊び場を提供し、唯一の制限はあなたのスキルと想像力です。パフォーマンスの向上、プライバシー、メインストリーム版にない独自の機能など、特定のニーズに合わせた無数のカスタムROMの基盤として機能します。プライバシー愛好家は、標準のAndroidに付属するプリインストールされたブロートウェアやトラッキングサービスがないことを高く評価するでしょう。<br><br>AOSPは開発者やテクノロジー愛好家だけのものではありません。デジタルの自由を重視するすべての人のためのものです。キャリアやメーカーの制限なしに、デバイスの制御を取り戻し、ニーズに合わせてカスタマイズすることができます。AOSPがあなたのモバイル体験をどのように変革できるかをご覧ください。より開かれた、カスタマイズ可能な未来への旅を今日から始めましょう。",
|
||||
"url_message": "詳細については以下のリンクをご覧ください。"
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Bitcoin革命チラシ",
|
||||
"title": "支配者なきルール",
|
||||
"subtitle": "無視しないでください",
|
||||
"headline": "BITCOIN革命に参加しよう",
|
||||
"content": "Bitcoinとは何か?それは単なるデジタルマネー以上のもので、世界で最も差し迫った問題を解決するために設計された革命的な技術です。Bitcoinは分散型ネットワーク上で動作し、いかなる政府や中央機関の制御からも自由です。これにより、誰もその供給量や価値を操作できないことが保証され、インフレからあなたの資産を守る健全な通貨となります。<br><br>現在の金融システムは欠陥のあるインセンティブの上に構築されています—負債、依存、権力の集中を促進しています。Bitcoinは、正直さ、透明性、個人の責任が報われるシステムを作ることで、これを変えます。Bitcoinネットワークでは、ルールは人ではなく数学によって施行されるため、腐敗や操作の余地はありません。<br><br>Bitcoinは長期的な思考、貯蓄、イノベーションを促進する方法でインセンティブを整合させます。個人が自分の経済的未来をコントロールする力を与え、仲介者なしで自由かつ安全に価値を移転できるグローバルコミュニティを育成します。だからこそBitcoinが必要なのです—インセンティブが適切に整合された世界を作り、すべての人にとってより公正で繁栄した社会につながるからです。<br><br>Bitcoinについて、そしてそれがあなたの経済生活だけでなく世界をどう変えることができるかを学ぶ一歩を踏み出してください。左からリンクを切り取り、この画期的な技術を探求してください。より良い未来への運動に参加しましょう。",
|
||||
"url_message": "詳細についてはこのリンクをご覧ください。"
|
||||
},
|
||||
"jesus": {
|
||||
"name": "人生を変えるメッセージ",
|
||||
"title": "良い知らせ",
|
||||
"subtitle": "無視しないでください",
|
||||
"headline": "真の希望を見つけよう",
|
||||
"content": "Jesusとは誰か?彼は単なる歴史上の人物ではありません。彼は神の子であり、世界の救い主です。Jesus自身がこう言われました:「わたしは道であり、真理であり、命である。わたしを通らなければ、だれも父のもとに行くことができない」(ヨハネ14:6)。彼は神と人類の間の隔たりを埋めるために来られ、赦し、平和、永遠の命への道を私たちに提供してくださいました。<br><br>私たちは皆、人生の中で壊れを経験します—人間関係、心、あるいは世界においてです。Jesusはその壊れを癒すために来られました。完全な人生を送り、私たちの罪のために十字架で死に、そして復活し、死を打ち破り、神との永遠の命の希望を私たちに与えてくださいました。<br><br>Jesusなしでは、私たちは罪の中で迷い、神から引き離されています。しかし彼を通して、私たちは赦され、回復されることができます。彼は今のより良い人生だけでなく、彼との永遠の命の約束を私たちに提供してくださいます。だからこそ彼が必要なのです—Jesusの中にのみ、真の平和、目的、そして永遠の命の確信を見つけることができるからです。<br><br>Jesusについて、そして彼があなたの人生にもたらすことができる人生を変える影響について学ぶ一歩を踏み出してください。左からリンクを切り取り、その教えを探求してください。あなたが探していた希望を見つけてください。",
|
||||
"url_message": "詳細についてはこのリンクをご覧ください。"
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtasticネットワークチラシ",
|
||||
"title": "安全な通信",
|
||||
"subtitle": "無視しないでください",
|
||||
"headline": "緊急通信ネットワークを構築しよう",
|
||||
"content": "なぜMeshtasticなのか?危機の時、従来の通信ネットワークは失敗し、私たちを孤立させ脆弱にする可能性があります。Meshtasticは強力な解決策を提供します—中央集権型システムから独立して動作する代替のローカル通信ネットワークです。緊急事態のために設計されており、最も重要な時に接続を維持することができます。<br><br>Meshtasticデバイスは、インターネットや携帯電話の電波がなくても、長距離にわたってメッセージを中継できるメッシュネットワークを構築します。この分散型アプローチにより、どのような状況でも通信が回復力があり信頼できることが保証されます。しかし、接続を維持するだけではありません—Meshtasticは暗号化も提供し、メッセージの安全性とプライバシーを確保します。<br><br>プライバシーがますます危険にさらされている世界で、Meshtasticはあなたに通信の制御を取り戻す力を与えます。地域のコミュニティ対応を調整する場合でも、災害時に大切な人と連絡を取り合う場合でも、単に予期せぬ事態に備える場合でも、Meshtasticは安全かつ効果的に通信するために必要なツールを提供します。<br><br>Meshtasticについて、そして独自の緊急通信ネットワークを構築する方法を学ぶ一歩を踏み出してください。左からリンクを切り取り、この革新的な技術を探求してください。何が起きても準備ができていることを確認しましょう。",
|
||||
"url_message": "詳細についてはこのリンクをご覧ください。"
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostrプロトコルチラシ",
|
||||
"title": "ソーシャルフリーダム",
|
||||
"subtitle": "無視しないでください",
|
||||
"headline": "検閲に強いネットワークに参加しよう",
|
||||
"content": "Nostrとは何か?従来のソーシャルメディアプラットフォームとは異なり、Nostrはプロトコルです—中央機関の制約なしにユーザーが接続し共有することを可能にする分散型システムです。Nostrは検閲に強く、あなたの声は企業や政府によって沈黙させられることはありません。エンゲージメントを意味のあるつながりよりも優先するアルゴリズムや広告の影響から自由に、オンラインプレゼンスの制御を提供するよう設計されています。<br><br>Nostrでは、あなたを無限スクロールに引き込む隠されたアジェンダはありません。アルゴリズムがあなたを最も長くオンラインに保つと考えるものではなく、あなた自身の条件でコンテンツと関わります。Nostrを使えば、プライバシーと自律性を維持しながら、本物のつながりを構築し、重要な会話に参加できます。<br><br>オンラインの言論がますます制御され操作される世界で、Nostrは新鮮な代替案を提供します。単なるプラットフォームではありません。それは真のデジタル自由への運動であり、あなたのインタラクションは最も多くの広告収入を生み出すものではなく、あなたの興味と価値観によって導かれます。<br><br>Nostrについて、そしてオンラインでの接続方法をどう変えることができるかを学ぶ一歩を踏み出してください。左からリンクを切り取り、この画期的なプロトコルを探求してください。自由と本物のインタラクションを重視するコミュニティに参加しましょう。",
|
||||
"url_message": "詳細についてはこのリンクをご覧ください。"
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera 印刷用チラシ",
|
||||
"title": "極秘事項",
|
||||
"subtitle": "~~配布禁止~~",
|
||||
"headline": "作戦名:VOX VERA",
|
||||
"content": "VoxVeraで検閲から解放されましょう。これは、匿名のゲリラマーケティングおよびメッセージ拡散ツールです。オンラインでも物理的な世界でも、Torを介したホスティングによって完全な匿名性に守られながら、自分の考えを大胆に広めることができます。コードをダウンロードし、フライヤーサイトをデザインし、オンラインで公開して、あなたのメッセージを増幅させてください。<br><br>ミームの力を利用して、学校、職場、オンラインコミュニティ、あるいは世界中にあなたのアイデアを共有しましょう。VoxVeraは、再印刷が簡単な独自のURLとQRコードを備えた切り取りセクションにより、あなたのメッセージが広く遠くまで響くことを保証します。<br><br>プライバシーは維持されます。フライヤーはTorネットワークを介して共有でき、ホスト側とユーザー側の両方を検閲から守ります。<br><br>真実と透明性を尊重する革命に加わりましょう。共に、声を上げることを恐れない、知識豊富な市民のネットワークを構築しましょう。",
|
||||
"url_message": "VoxVeraを入手して、メッセージの拡散を始めましょう。"
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"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.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Criar a partir de Modelo ---",
|
||||
"template_select": "Selecione um modelo:",
|
||||
"body_over_limit_warning": "Aviso: O texto do corpo excede 1000 caracteres. Pode ser cortado no panfleto.",
|
||||
"manage_action_export_keys": "Exportar Chaves",
|
||||
"manage_action_import_keys": "Importar Chaves",
|
||||
"keys_not_found": "Nenhuma chave de sessão encontrada para '{name}'. Inicie o site primeiro para gerar as chaves.",
|
||||
"keys_export_header": "Chave de sessão para '{name}':",
|
||||
"keys_export_hint": "Copie esta chave e guarde-a com segurança. Use 'Importar Chaves' em outra instância para restaurar.",
|
||||
"keys_site_not_found": "Site '{name}' não encontrado.",
|
||||
"keys_overwrite_confirm": "O site '{name}' já possui uma chave. Sobrescrever?",
|
||||
"keys_import_cancelled": "Importação cancelada.",
|
||||
"keys_import_prompt": "Cole a chave de sessão base64 abaixo:",
|
||||
"keys_import_empty": "Nenhuma chave fornecida.",
|
||||
"keys_import_invalid": "Formato de chave inválido. Deve ser uma string base64 válida.",
|
||||
"keys_import_success": "Chave de sessão importada para '{name}'. Reinicie o site para usar a nova chave."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Use o Tor Browser",
|
||||
@@ -89,8 +104,58 @@
|
||||
"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.",
|
||||
"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.<br><br>Use 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.<br><br>A privacidade pode ser mantida. Panfletos podem ser compartilhados via rede Tor, protegendo quem hospeda e quem usa contra censura.<br><br>Junte-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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Panfletos Imprimíveis Vox Vera"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "Projeto AOS",
|
||||
"title": "ANDROID LIBERTADO",
|
||||
"subtitle": "SEM FRONTEIRAS",
|
||||
"headline": "LIBERDADE DE CÓDIGO ABERTO",
|
||||
"content": "O Android Open Source Project (AOSP) representa a essência do que o Android foi originalmente projetado para ser: uma plataforma aberta, transparente e adaptável. Ele remove as camadas de software proprietário e supervisão corporativa que se tornaram sinônimo das distribuições Android tradicionais. Com o AOSP, você obtém acesso a uma versão crua e não filtrada do Android, permitindo que você realmente faça do seu dispositivo o seu próprio.<br><br>Para desenvolvedores, o AOSP oferece um playground de possibilidades, onde os únicos limites são suas habilidades e imaginação. Ele serve como base para inúmeras ROMs personalizadas, cada uma adaptada a necessidades específicas, seja para desempenho aprimorado, privacidade ou recursos exclusivos que as versões tradicionais não possuem. Os entusiastas da privacidade apreciarão a ausência de bloatware pré-instalado e serviços de rastreamento que frequentemente acompanham o Android de fábrica.<br><br>O AOSP não é apenas para desenvolvedores ou entusiastas de tecnologia; é para qualquer pessoa que valorize a liberdade digital. Ele permite que você recupere o controle do seu dispositivo, adaptando-o às suas necessidades sem as restrições de operadoras ou fabricantes. Descubra como o AOSP pode transformar sua experiência móvel. Comece sua jornada rumo a um futuro mais aberto e personalizável hoje.",
|
||||
"url_message": "Visite o link abaixo para saber mais."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Panfletos da Revolução Bitcoin",
|
||||
"title": "REGRAS SEM GOVERNANTES",
|
||||
"subtitle": "NÃO IGNORE",
|
||||
"headline": "JUNTE-SE À REVOLUÇÃO BITCOIN",
|
||||
"content": "O que é Bitcoin? É mais do que apenas dinheiro digital; é uma tecnologia revolucionária projetada para resolver alguns dos problemas mais urgentes do mundo. O Bitcoin opera em uma rede descentralizada, livre do controle de qualquer governo ou autoridade central. Isso garante que ninguém possa manipular sua oferta ou valor, tornando-o uma forma sólida de dinheiro que protege sua riqueza da inflação.<br><br>Nosso sistema financeiro atual é construído sobre incentivos falhos—encorajando dívida, dependência e centralização de poder. O Bitcoin muda isso criando um sistema onde honestidade, transparência e responsabilidade individual são recompensadas. Na rede Bitcoin, não há espaço para corrupção ou manipulação porque as regras são aplicadas pela matemática, não por pessoas.<br><br>O Bitcoin alinha incentivos de forma a promover pensamento de longo prazo, poupança e inovação. Ele capacita indivíduos a assumir o controle de seu futuro financeiro, fomentando uma comunidade global onde valor pode ser transferido livre e seguramente sem intermediários. É por isso que precisamos do Bitcoin—porque ele cria um mundo onde os incentivos estão corretamente alinhados, levando a uma sociedade mais justa e próspera para todos.<br><br>Dê o passo para aprender mais sobre Bitcoin e como ele pode transformar não apenas sua vida financeira, mas o mundo. Destaque um link à esquerda e explore esta tecnologia revolucionária. Junte-se ao movimento por um futuro melhor.",
|
||||
"url_message": "Siga este link para saber mais."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Mensagem que Muda Vidas",
|
||||
"title": "BOAS NOVAS",
|
||||
"subtitle": "NÃO IGNORE",
|
||||
"headline": "DESCUBRA A VERDADEIRA ESPERANÇA",
|
||||
"content": "Quem é Jesus? Ele é mais do que apenas uma figura histórica; Ele é o Filho de Deus, o Salvador do mundo. O próprio Jesus disse: 'Eu sou o caminho, a verdade e a vida. Ninguém vem ao Pai senão por mim' (João 14:6). Ele veio para preencher a lacuna entre Deus e a humanidade, oferecendo-nos um caminho para o perdão, a paz e a vida eterna.<br><br>Todos nós enfrentamos quebrantamento em nossas vidas—seja em nossos relacionamentos, nossos corações ou nosso mundo. Jesus veio para curar esse quebrantamento. Ele viveu uma vida perfeita, morreu na cruz pelos nossos pecados e ressuscitou, vencendo a morte e oferecendo-nos a esperança da vida eterna com Deus.<br><br>Sem Jesus, estamos perdidos em nosso pecado, separados de Deus. Mas através Dele, podemos ser perdoados e restaurados. Ele nos oferece não apenas uma vida melhor agora, mas a promessa de uma vida eterna com Ele. É por isso que precisamos Dele—porque somente em Jesus podemos encontrar verdadeira paz, propósito e a garantia da vida eterna.<br><br>Dê o passo para aprender mais sobre Jesus e o impacto transformador que Ele pode ter em sua vida. Destaque um link à esquerda e explore Seus ensinamentos. Encontre a esperança que você tem buscado.",
|
||||
"url_message": "Siga este link para saber mais."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Panfletos da Rede Meshtastic",
|
||||
"title": "COMUNICAÇÕES SEGURAS",
|
||||
"subtitle": "NÃO IGNORE",
|
||||
"headline": "CONSTRUA SUA REDE DE EMERGÊNCIA",
|
||||
"content": "Por que Meshtastic? Em tempos de crise, as redes de comunicação tradicionais podem falhar, deixando-nos isolados e vulneráveis. O Meshtastic oferece uma solução poderosa—uma rede de comunicação local alternativa que opera independentemente de sistemas centralizados. Ele é projetado para situações de emergência, permitindo que você permaneça conectado quando mais importa.<br><br>Os dispositivos Meshtastic criam uma rede mesh que pode retransmitir mensagens por longas distâncias, mesmo sem cobertura de internet ou celular. Essa abordagem descentralizada garante que suas comunicações sejam resilientes e confiáveis, independentemente das circunstâncias. Mas não se trata apenas de permanecer conectado—o Meshtastic também oferece criptografia, para que suas mensagens permaneçam seguras e privadas.<br><br>Em um mundo onde a privacidade está cada vez mais comprometida, o Meshtastic capacita você a assumir o controle de sua comunicação. Seja coordenando uma resposta comunitária local, mantendo contato com entes queridos durante um desastre ou simplesmente se preparando para o inesperado, o Meshtastic fornece as ferramentas necessárias para se comunicar de forma segura e eficaz.<br><br>Dê o passo para aprender mais sobre Meshtastic e como você pode construir sua própria rede de comunicação de emergência. Destaque um link à esquerda e explore esta tecnologia inovadora. Garanta que você esteja preparado para o que vier.",
|
||||
"url_message": "Siga este link para saber mais."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Panfletos do Protocolo Nostr",
|
||||
"title": "LIBERDADE SOCIAL",
|
||||
"subtitle": "NÃO IGNORE",
|
||||
"headline": "JUNTE-SE À REDE RESISTENTE À CENSURA",
|
||||
"content": "O que é Nostr? Ao contrário das plataformas de mídia social tradicionais, Nostr é um protocolo—um sistema descentralizado que capacita os usuários a se conectar e compartilhar sem as restrições de uma autoridade central. Nostr é resistente à censura, o que significa que sua voz não pode ser silenciada por corporações ou governos. Ele é projetado para dar a você controle sobre sua presença online, livre da influência de algoritmos ou anúncios que priorizam engajamento sobre conexões significativas.<br><br>No Nostr, não há agendas ocultas para mantê-lo rolando infinitamente. Você interage com o conteúdo em seus próprios termos, não com base no que um algoritmo pensa que vai mantê-lo online por mais tempo. O Nostr permite que você construa conexões genuínas e participe de conversas que importam, tudo enquanto mantém sua privacidade e autonomia.<br><br>Em um mundo onde o discurso online é cada vez mais controlado e manipulado, o Nostr oferece uma alternativa refrescante. Não é apenas uma plataforma; é um movimento em direção à verdadeira liberdade digital, onde suas interações são guiadas por seus interesses e valores, não pelo que gera mais receita publicitária.<br><br>Dê o passo para aprender mais sobre Nostr e como ele pode transformar a maneira como você se conecta online. Destaque um link à esquerda e explore este protocolo revolucionário. Junte-se a uma comunidade que valoriza liberdade e interação autêntica.",
|
||||
"url_message": "Siga este link para saber mais."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Panfletos Imprimíveis Vox Vera",
|
||||
"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.<br><br>Use 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.<br><br>A privacidade pode ser mantida. Panfletos podem ser compartilhados via rede Tor, protegendo quem hospeda e quem usa contra censura.<br><br>Junte-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."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "URL еще не настроены. QR-коды будут созданы после 'voxvera serve'",
|
||||
"input_file_not_found": "Входной файл {path} не существует.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Создать из шаблона ---",
|
||||
"template_select": "Выберите шаблон:",
|
||||
"body_over_limit_warning": "Предупреждение: Текст превышает 1000 символов. Он может быть обрезан на листовке.",
|
||||
"manage_action_export_keys": "Экспорт ключей",
|
||||
"manage_action_import_keys": "Импорт ключей",
|
||||
"keys_not_found": "Сессионный ключ для '{name}' не найден. Сначала запустите сайт для генерации ключей.",
|
||||
"keys_export_header": "Сессионный ключ для '{name}':",
|
||||
"keys_export_hint": "Скопируйте этот ключ и сохраните его в безопасности. Используйте 'Импорт ключей' на другом экземпляре для восстановления.",
|
||||
"keys_site_not_found": "Сайт '{name}' не найден.",
|
||||
"keys_overwrite_confirm": "У сайта '{name}' уже есть ключ. Перезаписать?",
|
||||
"keys_import_cancelled": "Импорт отменён.",
|
||||
"keys_import_prompt": "Вставьте сессионный ключ base64 ниже:",
|
||||
"keys_import_empty": "Ключ не предоставлен.",
|
||||
"keys_import_invalid": "Неверный формат ключа. Должна быть допустимая строка base64.",
|
||||
"keys_import_success": "Сессионный ключ импортирован для '{name}'. Перезапустите сайт для использования нового ключа."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Используйте Tor Browser",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "СОВЕРШЕННО СЕКРЕТНО",
|
||||
"subtitle": "~~НЕ~~ РАСПРОСТРАНЯТЬ",
|
||||
"headline": "ОПЕРАЦИЯ VOX VERA",
|
||||
"content": "Освободитесь от цензуры с помощью VoxVera. Анонимный инструмент для партизанского маркетинга и распространения сообщений. Будь то в сети или в физическом мире, он дает вам возможность смело распространять свои идеи, будучи защищенным полной анонимностью (при хостинге через Tor). Скачайте код, создайте сайт-листовку, разместите его в сети и усильте свой голос.\n\nИспользуйте силу мемов, чтобы поделиться своими идеями в школе, на работе, в онлайн-сообществах или даже по всему миру. VoxVera гарантирует, что ваше сообщение найдет отклик повсюду, благодаря отрывным разделам с уникальными URL-адресами и QR-кодами для легкой перепечатки.\n\nКонфиденциальность может быть сохранена. Листовками можно делиться через сеть Tor, защищая хостера и пользователей от цензуры.\n\nПрисоединяйтесь к нам в революции, которая ценит правду и прозрачность. Вместе мы сможем построить сеть информированных граждан, которые не боятся высказываться.",
|
||||
"content": "Освободитесь от цензуры с помощью VoxVera. Анонимный инструмент для партизанского маркетинга и распространения сообщений. Будь то в сети или в физическом мире, он дает вам возможность смело распространять свои идеи, будучи защищенным полной анонимностью (при хостинге через Tor). Скачайте код, создайте сайт-листовку, разместите его в сети и усильте свой голос.<br><br>Используйте силу мемов, чтобы поделиться своими идеями в школе, на работе, в онлайн-сообществах или даже по всему миру. VoxVera гарантирует, что ваше сообщение найдет отклик повсюду, благодаря отрывным разделам с уникальными URL-адресами и QR-кодами для легкой перепечатки.<br><br>Конфиденциальность может быть сохранена. Листовками можно делиться через сеть Tor, защищая хостера и пользователей от цензуры.<br><br>Присоединяйтесь к нам в революции, которая ценит правду и прозрачность. Вместе мы сможем построить сеть информированных граждан, которые не боятся высказываться.",
|
||||
"url_message": "Получите VoxVera и начните распространять свое сообщение.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Листовки Vox Vera для печати"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "Проект AOS",
|
||||
"title": "ANDROID БЕЗ ОКОВ",
|
||||
"subtitle": "БЕЗ ГРАНИЦ",
|
||||
"headline": "СВОБОДА ОТКРЫТОГО КОДА",
|
||||
"content": "Android Open Source Project (AOSP) воплощает суть того, чем Android изначально должен был быть: открытая, прозрачная и адаптируемая платформа. Он удаляет слои проприетарного программного обеспечения и корпоративного контроля, ставшие синонимом основных дистрибутивов Android. С AOSP вы получаете доступ к сырой, нефильтрованной версии Android, позволяющей по-настоящему сделать устройство своим.<br><br>Для разработчиков AOSP предлагает площадку возможностей, где единственные ограничения — это ваши навыки и воображение. Он служит основой для бесчисленных пользовательских прошивок, каждая из которых адаптирована под конкретные нужды: улучшенная производительность, конфиденциальность или уникальные функции, отсутствующие в массовых версиях. Энтузиасты приватности оценят отсутствие предустановленного раздутого ПО и служб отслеживания, которые часто поставляются со стоковым Android.<br><br>AOSP не только для разработчиков или техноэнтузиастов — он для всех, кто ценит цифровую свободу. Он позволяет вернуть контроль над своим устройством, настроив его под свои нужды без ограничений операторов или производителей. Узнайте, как AOSP может преобразить ваш мобильный опыт. Начните свой путь к более открытому, настраиваемому будущему уже сегодня.",
|
||||
"url_message": "Перейдите по ссылке ниже, чтобы узнать больше."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Листовки революции Bitcoin",
|
||||
"title": "ПРАВИЛА БЕЗ ПРАВИТЕЛЕЙ",
|
||||
"subtitle": "НЕ ИГНОРИРУЙТЕ",
|
||||
"headline": "ПРИСОЕДИНЯЙТЕСЬ К РЕВОЛЮЦИИ BITCOIN",
|
||||
"content": "Что такое Bitcoin? Это больше, чем цифровые деньги — это революционная технология, призванная решить одни из самых насущных проблем мира. Bitcoin работает в децентрализованной сети, свободной от контроля любого правительства или центрального органа. Это гарантирует, что никто не сможет манипулировать его предложением или стоимостью, делая его надёжной формой денег, защищающей ваше богатство от инфляции.<br><br>Наша нынешняя финансовая система построена на ущербных стимулах — поощряя долг, зависимость и централизацию власти. Bitcoin меняет это, создавая систему, где честность, прозрачность и личная ответственность вознаграждаются. В сети Bitcoin нет места коррупции или манипуляциям, потому что правила обеспечиваются математикой, а не людьми.<br><br>Bitcoin выстраивает стимулы таким образом, чтобы способствовать долгосрочному мышлению, сбережениям и инновациям. Он даёт людям возможность контролировать своё финансовое будущее, создавая глобальное сообщество, где ценность может передаваться свободно и безопасно без посредников. Вот почему нам нужен Bitcoin — потому что он создаёт мир, где стимулы правильно выстроены, ведя к более справедливому и процветающему обществу для всех.<br><br>Сделайте шаг, чтобы узнать больше о Bitcoin и о том, как он может преобразить не только вашу финансовую жизнь, но и весь мир. Оторвите ссылку слева и исследуйте эту прорывную технологию. Присоединяйтесь к движению за лучшее будущее.",
|
||||
"url_message": "Перейдите по этой ссылке, чтобы узнать больше."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Послание, изменяющее жизнь",
|
||||
"title": "БЛАГАЯ ВЕСТЬ",
|
||||
"subtitle": "НЕ ИГНОРИРУЙТЕ",
|
||||
"headline": "ОТКРОЙТЕ ИСТИННУЮ НАДЕЖДУ",
|
||||
"content": "Кто такой Jesus? Он больше, чем просто историческая личность — Он Сын Божий, Спаситель мира. Сам Jesus сказал: «Я есмь путь и истина и жизнь. Никто не приходит к Отцу, как только через Меня» (Иоанна 14:6). Он пришёл, чтобы перекинуть мост между Богом и человечеством, предлагая нам путь к прощению, миру и вечной жизни.<br><br>Все мы сталкиваемся с разрушением в нашей жизни — будь то в отношениях, в сердцах или в нашем мире. Jesus пришёл исцелить это разрушение. Он прожил совершенную жизнь, умер на кресте за наши грехи и воскрес, победив смерть и даровав нам надежду на вечную жизнь с Богом.<br><br>Без Jesus мы потеряны в своём грехе, отделены от Бога. Но через Него мы можем быть прощены и восстановлены. Он предлагает нам не только лучшую жизнь сейчас, но и обещание вечной жизни с Ним. Вот почему Он нам нужен — потому что только в Jesus мы можем найти истинный мир, цель и уверенность в вечной жизни.<br><br>Сделайте шаг, чтобы узнать больше о Jesus и о жизнеизменяющем влиянии, которое Он может оказать на вашу жизнь. Оторвите ссылку слева и исследуйте Его учение. Найдите надежду, которую вы искали.",
|
||||
"url_message": "Перейдите по этой ссылке, чтобы узнать больше."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Листовки сети Meshtastic",
|
||||
"title": "ЗАЩИЩЁННАЯ СВЯЗЬ",
|
||||
"subtitle": "НЕ ИГНОРИРУЙТЕ",
|
||||
"headline": "СОЗДАЙТЕ СВОЮ АВАРИЙНУЮ СЕТЬ",
|
||||
"content": "Почему Meshtastic? Во время кризиса традиционные сети связи могут выйти из строя, оставив нас изолированными и уязвимыми. Meshtastic предоставляет мощное решение — альтернативную локальную сеть связи, работающую независимо от централизованных систем. Она разработана для чрезвычайных ситуаций, позволяя оставаться на связи, когда это важнее всего.<br><br>Устройства Meshtastic создают ячеистую сеть, способную передавать сообщения на большие расстояния даже без покрытия интернета или сотовой связи. Этот децентрализованный подход обеспечивает устойчивость и надёжность вашей связи при любых обстоятельствах. Но дело не только в поддержании связи — Meshtastic также предлагает шифрование, чтобы ваши сообщения оставались безопасными и конфиденциальными.<br><br>В мире, где конфиденциальность всё больше нарушается, Meshtastic даёт вам возможность контролировать свою связь. Координируете ли вы местное реагирование сообщества, поддерживаете связь с близкими во время катастрофы или просто готовитесь к неожиданностям — Meshtastic предоставляет инструменты для безопасного и эффективного общения.<br><br>Сделайте шаг, чтобы узнать больше о Meshtastic и о том, как построить собственную аварийную сеть связи. Оторвите ссылку слева и исследуйте эту инновационную технологию. Убедитесь, что вы готовы к чему угодно.",
|
||||
"url_message": "Перейдите по этой ссылке, чтобы узнать больше."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Листовки протокола Nostr",
|
||||
"title": "СОЦИАЛЬНАЯ СВОБОДА",
|
||||
"subtitle": "НЕ ИГНОРИРУЙТЕ",
|
||||
"headline": "ПРИСОЕДИНЯЙТЕСЬ К ЦЕНЗУРОУСТОЙЧИВОЙ СЕТИ",
|
||||
"content": "Что такое Nostr? В отличие от традиционных платформ социальных сетей, Nostr — это протокол, децентрализованная система, позволяющая пользователям подключаться и делиться без ограничений центральной власти. Nostr устойчив к цензуре — это значит, что ваш голос не может быть заглушён корпорациями или правительствами. Он создан, чтобы дать вам контроль над вашим онлайн-присутствием, свободным от влияния алгоритмов или рекламы, которые ставят вовлечённость выше осмысленных связей.<br><br>В Nostr нет скрытых намерений удержать вас в бесконечной прокрутке. Вы взаимодействуете с контентом на своих условиях, а не на основе того, что алгоритм считает способным удержать вас онлайн дольше всего. Nostr позволяет строить подлинные связи и участвовать в значимых беседах, сохраняя при этом вашу конфиденциальность и автономию.<br><br>В мире, где онлайн-речь всё больше контролируется и манипулируется, Nostr предлагает освежающую альтернативу. Это не просто платформа — это движение к настоящей цифровой свободе, где ваши взаимодействия определяются вашими интересами и ценностями, а не тем, что приносит наибольший рекламный доход.<br><br>Сделайте шаг, чтобы узнать больше о Nostr и о том, как он может изменить способ вашего общения онлайн. Оторвите ссылку слева и исследуйте этот прорывной протокол. Присоединяйтесь к сообществу, которое ценит свободу и подлинное взаимодействие.",
|
||||
"url_message": "Перейдите по этой ссылке, чтобы узнать больше."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Листовки Vox Vera для печати",
|
||||
"title": "СОВЕРШЕННО СЕКРЕТНО",
|
||||
"subtitle": "~~НЕ~~ РАСПРОСТРАНЯТЬ",
|
||||
"headline": "ОПЕРАЦИЯ VOX VERA",
|
||||
"content": "Освободитесь от цензуры с помощью VoxVera. Анонимный инструмент для партизанского маркетинга и распространения сообщений. Будь то в сети или в физическом мире, он дает вам возможность смело распространять свои идеи, будучи защищенным полной анонимностью (при хостинге через Tor). Скачайте код, создайте сайт-листовку, разместите его в сети и усильте свой голос.<br><br>Используйте силу мемов, чтобы поделиться своими идеями в школе, на работе, в онлайн-сообществах или даже по всему миру. VoxVera гарантирует, что ваше сообщение найдет отклик повсюду, благодаря отрывным разделам с уникальными URL-адресами и QR-кодами для легкой перепечатки.<br><br>Конфиденциальность может быть сохранена. Листовками можно делиться через сеть Tor, защищая хостера и пользователей от цензуры.<br><br>Присоединяйтесь к нам в революции, которая ценит правду и прозрачность. Вместе мы сможем построить сеть информированных граждан, которые не боятся высказываться.",
|
||||
"url_message": "Получите VoxVera и начните распространять свое сообщение."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "Hakuna URL zilizowekwa bado. QR codes zitaundwa baada ya 'voxvera serve'",
|
||||
"input_file_not_found": "Faili ya kuingiza {path} haipo.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Tengeneza Kutoka Kiolezo ---",
|
||||
"template_select": "Chagua kiolezo:",
|
||||
"body_over_limit_warning": "Onyo: Maandishi ya mwili yanazidi herufi 1000. Yanaweza kukatwa kwenye kipeperushi.",
|
||||
"manage_action_export_keys": "Hamisha Funguo",
|
||||
"manage_action_import_keys": "Ingiza Funguo",
|
||||
"keys_not_found": "Hakuna funguo ya kipindi iliyopatikana kwa '{name}'. Anzisha tovuti kwanza ili kuzalisha funguo.",
|
||||
"keys_export_header": "Funguo ya kipindi kwa '{name}':",
|
||||
"keys_export_hint": "Nakili funguo hii na uihifadhi kwa usalama. Tumia 'Ingiza Funguo' kwenye mfano mwingine kurejesha.",
|
||||
"keys_site_not_found": "Tovuti '{name}' haijapatikana.",
|
||||
"keys_overwrite_confirm": "Tovuti '{name}' tayari ina funguo. Andika juu yake?",
|
||||
"keys_import_cancelled": "Uingizaji umeghairiwa.",
|
||||
"keys_import_prompt": "Bandika funguo ya kipindi ya base64 hapa chini:",
|
||||
"keys_import_empty": "Hakuna funguo iliyotolewa.",
|
||||
"keys_import_invalid": "Muundo wa funguo si sahihi. Lazima iwe mfuatano halali wa base64.",
|
||||
"keys_import_success": "Funguo ya kipindi imeingizwa kwa '{name}'. Anzisha upya tovuti ili kutumia funguo mpya."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Tumia Kivinjari cha Tor",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "SIRI KUBWA",
|
||||
"subtitle": "~~USISAMBAZE~~",
|
||||
"headline": "OPARESHENI VOX VERA",
|
||||
"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.",
|
||||
"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.<br><br>Tumia 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.<br><br>Faragha inaweza kudumishwa. Vipengele vinaweza kushirikiwa kupitia mtandao wa Tor, kumlinda mhudumu na watumiaji dhidi ya udhibiti.<br><br>Jiunge 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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vipeperushi vya Vox Vera vya Kuchapisha"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "Mradi wa AOS",
|
||||
"title": "ANDROID IMEACHILIWA",
|
||||
"subtitle": "BILA MIPAKA",
|
||||
"headline": "UHURU WA CHANZO HURIA",
|
||||
"content": "Mradi wa Android wa Chanzo Huria (AOSP) unawakilisha kiini cha Android ilivyokusudiwa awali: jukwaa lililo wazi, la uwazi, na linaloweza kubadilishwa. Inaondoa tabaka za programu za umiliki na usimamizi wa makampuni ambayo yamekuwa sawa na usambazaji wa kawaida wa Android. Na AOSP, unapata ufikiaji wa toleo safi la Android, kukuruhusu kufanya kifaa chako kuwa chako kweli kweli.<br><br>Kwa watengenezaji, AOSP inatoa uwanja wa fursa, ambapo vikwazo pekee ni ujuzi na mawazo yako. Inatumika kama msingi wa ROM nyingi za kawaida, kila moja imeundwa kwa mahitaji mahususi, iwe ni kwa utendaji ulioboreshwa, faragha, au vipengele vya kipekee ambavyo matoleo ya kawaida havina. Wapenda faragha watathamini kutokuwepo kwa programu zilizowekwa awali na huduma za ufuatiliaji ambazo mara nyingi huja na Android ya kawaida.<br><br>AOSP si kwa watengenezaji au wapenda teknolojia peke yao; ni kwa mtu yeyote anayethamini uhuru wa kidijitali. Inakuruhusu kudhibiti kifaa chako, kukibadilisha kulingana na mahitaji yako bila vikwazo vya watoa huduma au watengenezaji. Gundua jinsi AOSP inavyoweza kubadilisha uzoefu wako wa simu. Anza safari yako kuelekea siku zijazo zilizo wazi na zinazoweza kubadilishwa leo.",
|
||||
"url_message": "Tembelea kiungo hapa chini kujifunza zaidi."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Vipeperushi vya Mapinduzi ya Bitcoin",
|
||||
"title": "SHERIA BILA WATAWALA",
|
||||
"subtitle": "USIPUUZE",
|
||||
"headline": "JIUNGE NA MAPINDUZI YA BITCOIN",
|
||||
"content": "Bitcoin ni nini? Ni zaidi ya pesa za kidijitali; ni teknolojia ya mapinduzi iliyoundwa kutatua baadhi ya matatizo makubwa zaidi ya ulimwengu. Bitcoin inafanya kazi kwenye mtandao usio na kati, huru kutoka kwa udhibiti wa serikali yoyote au mamlaka kuu. Hii inahakikisha kwamba hakuna mtu anayeweza kudanganya usambazaji au thamani yake, na kuifanya kuwa aina imara ya pesa inayolinda utajiri wako dhidi ya mfumuko wa bei.<br><br>Mfumo wetu wa sasa wa kifedha umejengwa juu ya motisha zenye kasoro—kuhimiza deni, utegemezi, na ujumuishaji wa mamlaka. Bitcoin inabadilisha hilo kwa kuunda mfumo ambapo uaminifu, uwazi, na uwajibikaji wa mtu binafsi unatuzwa. Katika mtandao wa Bitcoin, hakuna nafasi ya rushwa au udanganyifu kwa sababu sheria zinatekelezwa na hisabati, si na watu.<br><br>Bitcoin inalinganisha motisha kwa njia inayokidhi mawazo ya muda mrefu, akiba, na uvumbuzi. Inawawezesha watu binafsi kudhibiti mustakabali wao wa kifedha, kukuza jamii ya kimataifa ambapo thamani inaweza kuhamishwa kwa uhuru na kwa usalama bila wasuluhishi. Hii ndiyo sababu tunahitaji Bitcoin—kwa sababu inaunda ulimwengu ambapo motisha zimelingana vizuri, na kusababisha jamii yenye haki na ustawi kwa wote.<br><br>Chukua hatua ya kujifunza zaidi kuhusu Bitcoin na jinsi inavyoweza kubadilisha si tu maisha yako ya kifedha, bali ulimwengu. Rarua kiungo upande wa kushoto na uchunguze teknolojia hii ya msingi. Jiunge na harakati kuelekea siku zijazo bora.",
|
||||
"url_message": "Fuata kiungo hiki kujifunza zaidi."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Ujumbe Unaobadilisha Maisha",
|
||||
"title": "HABARI NJEMA",
|
||||
"subtitle": "USIPUUZE",
|
||||
"headline": "GUNDUA TUMAINI LA KWELI",
|
||||
"content": "Yesu ni nani? Yeye ni zaidi ya mtu wa kihistoria; Yeye ni Mwana wa Mungu, Mwokozi wa ulimwengu. Yesu mwenyewe alisema, 'Mimi ndimi njia, na kweli, na uzima. Mtu haji kwa Baba ila kwa njia yangu' (Yohana 14:6). Alikuja kuunganisha pengo kati ya Mungu na wanadamu, kutupa njia ya msamaha, amani, na uzima wa milele.<br><br>Sisi sote tunakabili uharibifu katika maisha yetu—iwe ni katika mahusiano yetu, mioyo yetu, au ulimwengu wetu. Yesu alikuja kuponya uharibifu huo. Aliishi maisha kamili, akafa msalabani kwa dhambi zetu, na akafufuka, akishinda kifo na kutupa tumaini la uzima wa milele na Mungu.<br><br>Bila Yesu, tumepotea katika dhambi zetu, tumetengwa na Mungu. Lakini kupitia Yeye, tunaweza kusamehewa na kurudishwa. Anatupa si maisha bora tu sasa, bali ahadi ya uzima wa milele pamoja Naye. Hii ndiyo sababu tunamhitaji—kwa sababu ni katika Yesu tu tunaweza kupata amani ya kweli, kusudi, na uhakika wa uzima wa milele.<br><br>Chukua hatua ya kujifunza zaidi kuhusu Yesu na athari ya kubadilisha maisha anayoweza kuwa nayo katika maisha yako. Rarua kiungo upande wa kushoto na uchunguze mafundisho Yake. Pata tumaini ambalo umekuwa ukilitafuta.",
|
||||
"url_message": "Fuata kiungo hiki kujifunza zaidi."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Vipeperushi vya Mtandao wa Meshtastic",
|
||||
"title": "MAWASILIANO SALAMA",
|
||||
"subtitle": "USIPUUZE",
|
||||
"headline": "JENGA MTANDAO WAKO WA DHARURA",
|
||||
"content": "Kwa nini Meshtastic? Wakati wa mgogoro, mitandao ya mawasiliano ya kawaida inaweza kushindwa, kutuacha peke yetu na hatarini. Meshtastic inatoa suluhisho lenye nguvu—mtandao mbadala wa mawasiliano wa ndani unaofanya kazi kwa kujitegemea na mifumo ya kati. Imeundwa kwa hali za dharura, kukuruhusu kubaki umeunganishwa wakati inapohusika zaidi.<br><br>Vifaa vya Meshtastic vinaunda mtandao wa mesh unaoweza kusambaza ujumbe kwa umbali mrefu, hata bila mtandao au huduma ya simu. Mbinu hii isiyo na kati inahakikisha mawasiliano yako ni imara na ya kuaminika, bila kujali hali. Lakini si kuhusu kubaki umeunganishwa tu—Meshtastic pia inatoa usimbuaji, ili ujumbe wako ubaki salama na wa faragha.<br><br>Katika ulimwengu ambapo faragha inazidi kuathiriwa, Meshtastic inakuwezesha kudhibiti mawasiliano yako. Iwe unaratibu jibu la jamii ya ndani, kubaki ukiwasiliana na wapendwa wakati wa janga, au kujiandaa tu kwa yasiyotarajiwa, Meshtastic inatoa zana unazohitaji kuwasiliana kwa usalama na ufanisi.<br><br>Chukua hatua ya kujifunza zaidi kuhusu Meshtastic na jinsi unavyoweza kujenga mtandao wako wa mawasiliano ya dharura. Rarua kiungo upande wa kushoto na uchunguze teknolojia hii ya ubunifu. Hakikisha umejiandaa kwa chochote kinachokuja.",
|
||||
"url_message": "Fuata kiungo hiki kujifunza zaidi."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Vipeperushi vya Itifaki ya Nostr",
|
||||
"title": "UHURU WA KIJAMII",
|
||||
"subtitle": "USIPUUZE",
|
||||
"headline": "JIUNGE NA MTANDAO UNAOPINGA UDHIBITI",
|
||||
"content": "Nostr ni nini? Tofauti na majukwaa ya kawaida ya mitandao ya kijamii, Nostr ni itifaki—mfumo usio na kati unaowapa watumiaji uwezo wa kuunganisha na kushiriki bila vikwazo vya mamlaka kuu. Nostr inapinga udhibiti, ikimaanisha sauti yako haiwezi kunyamazishwa na makampuni au serikali. Imeundwa kukupa udhibiti wa uwepo wako mtandaoni, huru kutoka kwa ushawishi wa algorithmu au matangazo yanayopendelea ushiriki kuliko muunganisho wenye maana.<br><br>Katika Nostr, hakuna ajenda zilizofichwa kukuweka ukiendelea kutumia. Unashiriki na maudhui kwa masharti yako, si kulingana na kile algorithmu inachofikiria kitakachokuweka mtandaoni kwa muda mrefu zaidi. Nostr inakuruhusu kujenga muunganisho wa kweli na kushiriki katika mazungumzo yanayohusika, yote huku ukidumisha faragha na uhuru wako.<br><br>Katika ulimwengu ambapo hotuba mtandaoni inadhibitiwa na kudanganywa zaidi na zaidi, Nostr inatoa mbadala wa kuburudisha. Si jukwaa tu; ni harakati kuelekea uhuru wa kweli wa kidijitali, ambapo maingiliano yako yanaendeshwa na masilahi na maadili yako, si kwa kile kinachozalisha mapato zaidi ya matangazo.<br><br>Chukua hatua ya kujifunza zaidi kuhusu Nostr na jinsi inavyoweza kubadilisha njia unayounganishwa mtandaoni. Rarua kiungo upande wa kushoto na uchunguze itifaki hii ya msingi. Jiunge na jamii inayothamini uhuru na maingiliano ya kweli.",
|
||||
"url_message": "Fuata kiungo hiki kujifunza zaidi."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vipeperushi vya Vox Vera vya Kuchapisha",
|
||||
"title": "SIRI KUBWA",
|
||||
"subtitle": "~~USISAMBAZE~~",
|
||||
"headline": "OPARESHENI VOX VERA",
|
||||
"content": "Jiachilie kutoka kwa udhibiti na VoxVera. Chombo cha masoko ya msituni kisichojulikana na kusambaza ujumbe. Iwe mtandaoni au katika ulimwengu halisi, inaweza kukuwezesha kusambaza mawazo yako kwa ujasiri, ukilindwa na kutokujulikana kabisa (ikiwa unakaribisha kupitia Tor). Pakua msimbo, tengeneza tovuti ya vipeperushi, karibisha mtandaoni na kuimarisha ujumbe wako.<br><br>Tumia nguvu ya meme kushiriki mawazo yako shuleni kwako, mahali pa kazi, jamii za mtandaoni, au hata ulimwenguni kote. VoxVera inahakikisha ujumbe wako unasikika mbali na karibu, na sehemu za kurarua zenye URL na misimbo ya QR ya kipekee kwa uchapishaji rahisi.<br><br>Faragha inaweza kudumishwa. Vipeperushi vinaweza kushirikiwa kupitia mtandao wa Tor, kulinda mwenyeji na watumiaji dhidi ya udhibiti.<br><br>Jiunge nasi katika mapinduzi yanayothamini ukweli na uwazi. Pamoja, tunaweza kujenga mtandao wa raia wenye habari ambao hawogopi kusema.",
|
||||
"url_message": "Pata VoxVera na uanze kueneza ujumbe wako."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"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.",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- Şablondan Oluştur ---",
|
||||
"template_select": "Bir şablon seçin:",
|
||||
"body_over_limit_warning": "Uyarı: Gövde metni 1000 karakteri aşıyor. El ilanında kesilebilir.",
|
||||
"manage_action_export_keys": "Anahtarları Dışa Aktar",
|
||||
"manage_action_import_keys": "Anahtarları İçe Aktar",
|
||||
"keys_not_found": "'{name}' için oturum anahtarı bulunamadı. Anahtarları oluşturmak için önce siteyi başlatın.",
|
||||
"keys_export_header": "'{name}' için oturum anahtarı:",
|
||||
"keys_export_hint": "Bu anahtarı kopyalayın ve güvenli bir şekilde saklayın. Geri yüklemek için başka bir örnekte 'Anahtarları İçe Aktar' kullanın.",
|
||||
"keys_site_not_found": "Site '{name}' bulunamadı.",
|
||||
"keys_overwrite_confirm": "Site '{name}' zaten bir anahtara sahip. Üzerine yazılsın mı?",
|
||||
"keys_import_cancelled": "İçe aktarma iptal edildi.",
|
||||
"keys_import_prompt": "Base64 oturum anahtarını aşağıya yapıştırın:",
|
||||
"keys_import_empty": "Anahtar sağlanmadı.",
|
||||
"keys_import_invalid": "Geçersiz anahtar biçimi. Geçerli bir base64 dizesi olmalıdır.",
|
||||
"keys_import_success": "'{name}' için oturum anahtarı içe aktarıldı. Yeni anahtarı kullanmak için siteyi yeniden başlatın."
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "Tor Tarayıcı Kullanın",
|
||||
@@ -89,8 +104,58 @@
|
||||
"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.",
|
||||
"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.<br><br>Fikirlerinizi 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.<br><br>Gizlilik korunabilir. İlanlar Tor ağı üzerinden paylaşılabilir, böylece hem barındıran hem de kullanıcılar sansürden korunur.<br><br>Gerç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.",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vox Vera Yazdırılabilir El İlanları"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOS Projesi",
|
||||
"title": "ANDROID SERBEST",
|
||||
"subtitle": "SINIR YOK",
|
||||
"headline": "AÇIK KAYNAK ÖZGÜRLÜĞÜ",
|
||||
"content": "Android Açık Kaynak Projesi (AOSP), Android'in başlangıçta ne olması gerektiğinin özünü temsil eder: açık, şeffaf ve uyarlanabilir bir platform. Ana akım Android dağıtımlarıyla eş anlamlı hale gelen tescilli yazılım ve kurumsal gözetim katmanlarını ortadan kaldırır. AOSP ile Android'in filtresiz bir sürümüne erişim elde ederek cihazınızı gerçekten kendinize ait yapabilirsiniz.<br><br>Geliştiriciler için AOSP, tek sınırın becerileriniz ve hayal gücünüz olduğu bir olasılıklar alanı sunar. Gelişmiş performans, gizlilik veya ana akım sürümlerin sahip olmadığı benzersiz özellikler gibi belirli ihtiyaçlara göre uyarlanmış sayısız özel ROM'un temelini oluşturur. Gizlilik meraklıları, stok Android ile birlikte gelen önceden yüklenmiş gereksiz yazılımların ve izleme hizmetlerinin yokluğunu takdir edecektir.<br><br>AOSP sadece geliştiriciler veya teknoloji meraklıları için değil; dijital özgürlüğe değer veren herkes içindir. Operatörlerin veya üreticilerin kısıtlamaları olmadan cihazınızı ihtiyaçlarınıza göre uyarlayarak kontrolü yeniden elinize almanızı sağlar. AOSP'nin mobil deneyiminizi nasıl dönüştürebileceğini keşfedin. Daha açık, özelleştirilebilir bir geleceğe doğru yolculuğunuza bugün başlayın.",
|
||||
"url_message": "Daha fazla bilgi için aşağıdaki bağlantıyı ziyaret edin."
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "Bitcoin Devrimi El İlanları",
|
||||
"title": "YÖNETİCİSİZ KURALLAR",
|
||||
"subtitle": "GÖZ ARDI ETMEYİN",
|
||||
"headline": "BITCOIN DEVRİMİNE KATILIN",
|
||||
"content": "Bitcoin nedir? Dijital paradan çok daha fazlası; dünyanın en acil sorunlarından bazılarını çözmek için tasarlanmış devrimci bir teknolojidir. Bitcoin, herhangi bir hükümet veya merkezi otoritenin kontrolünden bağımsız, merkezi olmayan bir ağda çalışır. Bu, kimsenin arzını veya değerini manipüle edemeyeceğini garanti eder ve onu servetinizi enflasyondan koruyan sağlam bir para biçimi yapar.<br><br>Mevcut finansal sistemimiz kusurlu teşvikler üzerine inşa edilmiştir—borcu, bağımlılığı ve gücün merkezileşmesini teşvik eder. Bitcoin, dürüstlüğün, şeffaflığın ve bireysel sorumluluğun ödüllendirildiği bir sistem oluşturarak bunu değiştirir. Bitcoin ağında yolsuzluk veya manipülasyona yer yoktur çünkü kurallar insanlar tarafından değil, matematik tarafından uygulanır.<br><br>Bitcoin, uzun vadeli düşünmeyi, tasarrufu ve yeniliği teşvik eden bir şekilde teşvikleri hizalar. Bireyleri finansal geleceklerinin kontrolünü ele almaya teşvik eder ve değerin aracılar olmadan özgürce ve güvenli bir şekilde aktarılabildiği küresel bir topluluk oluşturur. Bitcoin'e ihtiyacımız var—çünkü teşviklerin doğru hizalandığı, herkes için daha adil ve müreffeh bir topluma yol açan bir dünya yaratır.<br><br>Bitcoin hakkında daha fazla bilgi edinmek ve sadece finansal hayatınızı değil, dünyayı nasıl dönüştürebileceğini keşfetmek için adım atın. Soldaki bir bağlantıyı koparın ve bu çığır açan teknolojiyi keşfedin. Daha iyi bir geleceğe doğru harekete katılın.",
|
||||
"url_message": "Daha fazla bilgi için bu bağlantıyı takip edin."
|
||||
},
|
||||
"jesus": {
|
||||
"name": "Hayat Değiştiren Mesaj",
|
||||
"title": "İYİ HABER",
|
||||
"subtitle": "GÖZ ARDI ETMEYİN",
|
||||
"headline": "GERÇEK UMUDI KEŞFEDİN",
|
||||
"content": "İsa kimdir? O sadece tarihi bir figürden fazlasıdır; O Tanrı'nın Oğlu, dünyanın Kurtarıcısıdır. İsa'nın kendisi şöyle dedi: 'Yol, gerçek ve yaşam Ben'im. Benim aracılığım olmadan Baba'ya kimse gelemez' (Yuhanna 14:6). Tanrı ile insanlık arasındaki uçurumu kapatmak, bize bağışlanma, barış ve sonsuz yaşama giden bir yol sunmak için geldi.<br><br>Hepimiz hayatımızda kırılmışlıkla yüzleşiriz—ister ilişkilerimizde, kalbimizde veya dünyamızda olsun. İsa bu kırılmışlığı iyileştirmek için geldi. Mükemmel bir hayat yaşadı, günahlarımız için çarmıhta öldü ve yeniden dirildi, ölümü yenerek bize Tanrı ile sonsuz yaşam umudunu sundu.<br><br>İsa olmadan, günahımızda kaybolmuşuz, Tanrı'dan ayrılmışız. Ama O'nun aracılığıyla bağışlanabilir ve geri kazanılabiliriz. Bize sadece şimdi daha iyi bir hayat değil, O'nunla sonsuz bir hayat vaadi sunar. O'na ihtiyacımız var—çünkü gerçek huzuru, amacı ve sonsuz yaşam güvencesini sadece İsa'da bulabiliriz.<br><br>İsa hakkında ve hayatınızda yapabileceği değişiklik hakkında daha fazla bilgi edinmek için adım atın. Soldaki bir bağlantıyı koparın ve Öğretilerini keşfedin. Aradığınız umudu bulun.",
|
||||
"url_message": "Daha fazla bilgi için bu bağlantıyı takip edin."
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtastic Ağ El İlanları",
|
||||
"title": "GÜVENLİ İLETİŞİM",
|
||||
"subtitle": "GÖZ ARDI ETMEYİN",
|
||||
"headline": "ACİL DURUM AĞINIZI KURUN",
|
||||
"content": "Neden Meshtastic? Kriz zamanlarında geleneksel iletişim ağları başarısız olabilir ve bizi izole ve savunmasız bırakabilir. Meshtastic güçlü bir çözüm sunar—merkezi sistemlerden bağımsız çalışan alternatif bir yerel iletişim ağı. Acil durumlar için tasarlanmıştır ve en çok önemli olduğunda bağlı kalmanızı sağlar.<br><br>Meshtastic cihazları, internet veya hücresel kapsama olmadan bile uzun mesafelere mesaj iletebilen bir ağ ağı oluşturur. Bu merkezi olmayan yaklaşım, koşullar ne olursa olsun iletişimlerinizin dayanıklı ve güvenilir olmasını sağlar. Ama sadece bağlı kalmakla ilgili değil—Meshtastic ayrıca şifreleme sunar, böylece mesajlarınız güvenli ve özel kalır.<br><br>Gizliliğin giderek daha fazla tehlikeye girdiği bir dünyada, Meshtastic iletişiminizin kontrolünü ele almanızı sağlar. İster yerel bir topluluk müdahalesini koordine ediyor, ister bir felaket sırasında sevdiklerinizle iletişimde kalıyor veya beklenmedik durumlara hazırlanıyor olun, Meshtastic güvenli ve etkili iletişim için ihtiyacınız olan araçları sağlar.<br><br>Meshtastic hakkında ve kendi acil durum iletişim ağınızı nasıl kurabileceğiniz hakkında daha fazla bilgi edinmek için adım atın. Soldaki bir bağlantıyı koparın ve bu yenilikçi teknolojiyi keşfedin. Ne gelirse gelsin hazırlıklı olduğunuzdan emin olun.",
|
||||
"url_message": "Daha fazla bilgi için bu bağlantıyı takip edin."
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostr Protokolü El İlanları",
|
||||
"title": "SOSYAL ÖZGÜRLÜK",
|
||||
"subtitle": "GÖZ ARDI ETMEYİN",
|
||||
"headline": "SANSÜRE DAYANIKLI AĞA KATILIN",
|
||||
"content": "Nostr nedir? Geleneksel sosyal medya platformlarından farklı olarak, Nostr bir protokoldür—kullanıcıları merkezi bir otoritenin kısıtlamaları olmadan bağlanmaya ve paylaşmaya yetkilendiren merkezi olmayan bir sistem. Nostr sansüre dayanıklıdır, yani sesiniz şirketler veya hükümetler tarafından susturulamaz. Çevrimiçi varlığınız üzerinde kontrol sağlamak için tasarlanmıştır, anlamlı bağlantılar yerine etkileşimi önceliklendiren algoritmaların veya reklamların etkisinden bağımsız.<br><br>Nostr'da sizi kaydırmaya devam ettirmek için gizli gündemler yoktur. İçerikle kendi şartlarınızda etkileşim kurarsınız, bir algoritmanın sizi en uzun süre çevrimiçi tutacağını düşündüğü şeye göre değil. Nostr, gizliliğinizi ve özerkliğinizi korurken gerçek bağlantılar kurmanıza ve önemli konuşmalara katılmanıza olanak tanır.<br><br>Çevrimiçi ifadenin giderek daha fazla kontrol edildiği ve manipüle edildiği bir dünyada, Nostr ferahlatıcı bir alternatif sunar. Sadece bir platform değil; etkileşimlerinizin en çok reklam geliri üreten şey tarafından değil, ilgi alanlarınız ve değerleriniz tarafından yönlendirildiği gerçek dijital özgürlüğe doğru bir harekettir.<br><br>Nostr hakkında ve çevrimiçi bağlanma şeklinizi nasıl dönüştürebileceği hakkında daha fazla bilgi edinmek için adım atın. Soldaki bir bağlantıyı koparın ve bu çığır açan protokolü keşfedin. Özgürlüğe ve otantik etkileşime değer veren bir topluluğa katılın.",
|
||||
"url_message": "Daha fazla bilgi için bu bağlantıyı takip edin."
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera Yazdırılabilir El İlanları",
|
||||
"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, fikirlerinizi cesurca yaymak için sizi güçlendirebilir, tam anonimlik ile korunursunuz (Tor üzerinden barındırırsanız). Kodu indirin, bir el ilanı sitesi tasarlayın, çevrimiçi barındırın ve mesajınızı güçlendirin.<br><br>Okulunuzda, işyerinizde, çevrimiçi topluluklarda veya hatta küresel olarak fikirlerinizi paylaşmak için memetik gücü kullanın. VoxVera, kolay yeniden yazdırma için benzersiz URL'ler ve QR kodları içeren koparma bölümleriyle mesajınızın geniş çapta yankı bulmasını sağlar.<br><br>Gizlilik korunabilir. El ilanları, barındırıcıyı ve kullanıcıları sansürden koruyarak Tor ağı üzerinden paylaşılabilir.<br><br>Gerçeği ve şeffaflığı değer veren bir devrime katılın. Birlikte, konuşmaktan korkmayan bilgili vatandaşlardan oluşan bir ağ kurabiliriz.",
|
||||
"url_message": "VoxVera'yı edinin ve mesajınızı yaymaya başlayın."
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-3
@@ -74,7 +74,22 @@
|
||||
"no_urls_qr_skip": "尚未配置 URL。QR 码将在 'voxvera serve' 后生成",
|
||||
"input_file_not_found": "输入文件 {path} 不存在。",
|
||||
"attachment_path_label": "Attachment file path (optional - will be served from Tor site)",
|
||||
"manage_action_edit": "Edit"
|
||||
"manage_action_edit": "Edit",
|
||||
"manage_templates": "--- 从模板创建 ---",
|
||||
"template_select": "选择一个模板:",
|
||||
"body_over_limit_warning": "警告:正文超过1000个字符。传单上可能会被截断。",
|
||||
"manage_action_export_keys": "导出密钥",
|
||||
"manage_action_import_keys": "导入密钥",
|
||||
"keys_not_found": "未找到 '{name}' 的会话密钥。请先启动站点以生成密钥。",
|
||||
"keys_export_header": "'{name}' 的会话密钥:",
|
||||
"keys_export_hint": "复制此密钥并安全保存。在另一个实例上使用\u201c导入密钥\u201d来恢复。",
|
||||
"keys_site_not_found": "未找到站点 '{name}'。",
|
||||
"keys_overwrite_confirm": "站点 '{name}' 已有密钥。是否覆盖?",
|
||||
"keys_import_cancelled": "导入已取消。",
|
||||
"keys_import_prompt": "请在下方粘贴 base64 会话密钥:",
|
||||
"keys_import_empty": "未提供密钥。",
|
||||
"keys_import_invalid": "密钥格式无效。必须是有效的 base64 字符串。",
|
||||
"keys_import_success": "已导入 '{name}' 的会话密钥。请重启站点以使用新密钥。"
|
||||
},
|
||||
"web": {
|
||||
"tear_off_tor_browser": "使用 Tor 浏览器",
|
||||
@@ -89,8 +104,58 @@
|
||||
"title": "绝密",
|
||||
"subtitle": "~~切勿~~ 散布",
|
||||
"headline": "VOX VERA 行动",
|
||||
"content": "使用 VoxVera 摆脱审查。一个匿名的游击营销和消息传播工具。无论是线上还是在现实世界中,它都能赋予你大胆传播想法的力量,并受到完全匿名的保护(如果你通过 Tor 托管)。下载代码,设计传单站点,将其托管在网上并放大你的声音。\n\n利用模因的力量在你的学校、工作场所、在线社区甚至全球范围内分享你的想法。VoxVera 通过带有独特 URL 和 QR 码的可撕下部分确保你的消息产生深远共鸣,方便再次打印。\n\n隐私可以得到维护。传单可以通过 Tor 网络共享,保护托管者和用户免受审查。\n\n加入我们这场重视真相和透明度的革命。齐心协力,我们可以建立一个不惧怕发声的知情公民网络。",
|
||||
"content": "使用 VoxVera 摆脱审查。一个匿名的游击营销和消息传播工具。无论是线上还是在现实世界中,它都能赋予你大胆传播想法的力量,并受到完全匿名的保护(如果你通过 Tor 托管)。下载代码,设计传单站点,将其托管在网上并放大你的声音。<br><br>利用模因的力量在你的学校、工作场所、在线社区甚至全球范围内分享你的想法。VoxVera 通过带有独特 URL 和 QR 码的可撕下部分确保你的消息产生深远共鸣,方便再次打印。<br><br>隐私可以得到维护。传单可以通过 Tor 网络共享,保护托管者和用户免受审查。<br><br>加入我们这场重视真相和透明度的革命。齐心协力,我们可以建立一个不惧怕发声的知情公民网络。",
|
||||
"url_message": "获取 VoxVera 并开始传播你的消息。",
|
||||
"name": "Vox Vera Printable Flyers"
|
||||
"name": "Vox Vera 可打印传单"
|
||||
},
|
||||
"templates": {
|
||||
"aosp": {
|
||||
"name": "AOS 项目",
|
||||
"title": "安卓解放",
|
||||
"subtitle": "无边界",
|
||||
"headline": "开源自由",
|
||||
"content": "Android 开源项目(AOSP)代表了 Android 最初的设计理念:一个开放、透明且可适应的平台。它剥离了与主流 Android 发行版同义的专有软件层和企业监管。通过 AOSP,您可以获得未经过滤的 Android 版本,真正让您的设备属于自己。<br><br>对于开发者来说,AOSP 提供了一个充满可能性的游乐场,唯一的限制是您的技能和想象力。它是无数定制 ROM 的基础,每个都针对特定需求量身定制,无论是增强性能、隐私保护还是主流版本所缺乏的独特功能。注重隐私的用户会欣赏没有预装臃肿软件和跟踪服务的清洁体验。<br><br>AOSP 不仅仅是为开发者或技术爱好者准备的;它适用于任何重视数字自由的人。它让您重新掌控自己的设备,根据需求进行定制,不受运营商或制造商的限制。探索 AOSP 如何改变您的移动体验。今天就开始您通往更开放、更可定制未来的旅程。",
|
||||
"url_message": "访问以下链接了解更多信息。"
|
||||
},
|
||||
"bitcoin": {
|
||||
"name": "比特币革命传单",
|
||||
"title": "没有统治者的规则",
|
||||
"subtitle": "不要忽视",
|
||||
"headline": "加入比特币革命",
|
||||
"content": "什么是比特币?它不仅仅是数字货币;它是一项旨在解决世界上一些最紧迫问题的革命性技术。比特币运行在去中心化网络上,不受任何政府或中央机构的控制。这确保了没有人可以操纵其供应量或价值,使其成为保护您财富免受通胀的健全货币形式。<br><br>我们当前的金融体系建立在有缺陷的激励机制上——鼓励债务、依赖和权力集中化。比特币通过创建一个奖励诚实、透明和个人责任的系统来改变这一切。在比特币网络中,没有腐败或操纵的空间,因为规则由数学而非人来执行。<br><br>比特币以促进长期思考、储蓄和创新的方式调整激励机制。它赋予个人控制财务未来的能力,培育一个价值可以在没有中间人的情况下自由安全转移的全球社区。这就是我们需要比特币的原因——因为它创造了一个激励机制正确对齐的世界,为所有人带来更公平、更繁荣的社会。<br><br>迈出一步,了解更多关于比特币以及它如何不仅改变您的财务生活,还能改变世界。撕下左边的链接,探索这项开创性技术。加入迈向更美好未来的运动。",
|
||||
"url_message": "点击此链接了解更多。"
|
||||
},
|
||||
"jesus": {
|
||||
"name": "改变生命的信息",
|
||||
"title": "好消息",
|
||||
"subtitle": "不要忽视",
|
||||
"headline": "发现真正的希望",
|
||||
"content": "耶稣是谁?祂不仅仅是一个历史人物;祂是上帝的儿子,世界的救主。耶稣亲自说过:'我就是道路、真理、生命。若不藉着我,没有人能到父那里去'(约翰福音 14:6)。祂来弥合上帝与人类之间的鸿沟,为我们提供通往宽恕、和平与永生的道路。<br><br>我们所有人都在生活中面临破碎——无论是在我们的关系、内心还是世界中。耶稣来医治这种破碎。祂过了完美的一生,为我们的罪死在十字架上,又复活了,战胜了死亡,赐给我们与上帝同享永生的盼望。<br><br>没有耶稣,我们迷失在罪中,与上帝隔绝。但通过祂,我们可以被赦免和恢复。祂不仅给我们现在更好的生活,还给我们与祂同在的永生应许。这就是我们需要祂的原因——因为只有在耶稣里,我们才能找到真正的平安、目标和永生的确据。<br><br>迈出一步,了解更多关于耶稣以及祂能对您的生活产生的改变。撕下左边的链接,探索祂的教导。找到您一直在寻找的希望。",
|
||||
"url_message": "点击此链接了解更多。"
|
||||
},
|
||||
"meshtastic": {
|
||||
"name": "Meshtastic 网络传单",
|
||||
"title": "安全通信",
|
||||
"subtitle": "不要忽视",
|
||||
"headline": "建立你的应急网络",
|
||||
"content": "为什么选择 Meshtastic?在危机时刻,传统通信网络可能会失效,使我们陷入孤立和脆弱。Meshtastic 提供了一个强大的解决方案——一个独立于中心化系统运行的替代本地通信网络。它专为紧急情况设计,让您在最需要时保持连接。<br><br>Meshtastic 设备创建一个网状网络,即使没有互联网或蜂窝覆盖也能远距离中继消息。这种去中心化方法确保您的通信在任何情况下都是有弹性和可靠的。但这不仅仅是保持连接——Meshtastic 还提供加密,使您的消息保持安全和私密。<br><br>在隐私日益受到威胁的世界中,Meshtastic 使您能够掌控自己的通信。无论您是在协调当地社区响应、在灾难期间与亲人保持联系,还是只是为意外情况做准备,Meshtastic 都能为您提供安全有效通信所需的工具。<br><br>迈出一步,了解更多关于 Meshtastic 以及如何建立自己的应急通信网络。撕下左边的链接,探索这项创新技术。确保您为任何事情做好准备。",
|
||||
"url_message": "点击此链接了解更多。"
|
||||
},
|
||||
"nostr": {
|
||||
"name": "Nostr 协议传单",
|
||||
"title": "社交自由",
|
||||
"subtitle": "不要忽视",
|
||||
"headline": "加入抗审查网络",
|
||||
"content": "什么是 Nostr?与传统社交媒体平台不同,Nostr 是一种协议——一个去中心化系统,使用户能够在没有中央权威约束的情况下连接和分享。Nostr 抗审查,这意味着您的声音不会被企业或政府压制。它旨在让您控制自己的在线存在,不受优先考虑参与度而非有意义连接的算法或广告的影响。<br><br>在 Nostr 上,没有隐藏的议程让您不断滚动。您按自己的条件与内容互动,而不是基于算法认为什么会让您在线最长时间。Nostr 让您建立真正的连接并参与重要的对话,同时保持您的隐私和自主权。<br><br>在在线言论日益受到控制和操纵的世界中,Nostr 提供了一个令人耳目一新的替代方案。它不仅仅是一个平台;它是迈向真正数字自由的运动,您的互动由您的兴趣和价值观驱动,而不是由什么产生最多广告收入。<br><br>迈出一步,了解更多关于 Nostr 以及它如何改变您在线连接的方式。撕下左边的链接,探索这个开创性协议。加入一个重视自由和真实互动的社区。",
|
||||
"url_message": "点击此链接了解更多。"
|
||||
},
|
||||
"voxvera": {
|
||||
"name": "Vox Vera 可打印传单",
|
||||
"title": "绝密",
|
||||
"subtitle": "~~切勿~~ 散布",
|
||||
"headline": "VOX VERA 行动",
|
||||
"content": "用 VoxVera 摆脱审查。一个匿名的游击营销和消息传播工具。无论在线还是在现实世界中,它都能让您大胆地传播您的想法,受到完全匿名的保护(如果您通过 Tor 托管)。下载代码,设计传单网站,在线托管并放大您的信息。<br><br>利用模因的力量在您的学校、工作场所、在线社区甚至全球分享您的想法。VoxVera 确保您的信息广泛传播,带有独特 URL 和 QR 码的撕取部分便于重新打印。<br><br>隐私可以得到维护。传单可以通过 Tor 网络共享,保护托管者和用户免受审查。<br><br>加入我们重视真相和透明的革命。我们可以共同建立一个由不畏言论的知情公民组成的网络。",
|
||||
"url_message": "获取 VoxVera 并开始传播你的消息。"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"title": "TOP SECRET",
|
||||
"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",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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": "Get VoxVera and start spreading your message.",
|
||||
"url": "https://github.com/PR0M3TH3AN/VoxVera",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
|
||||
@@ -169,20 +169,21 @@
|
||||
|
||||
.content {
|
||||
width: calc(8.5in - 3.75in);
|
||||
padding: 20px;
|
||||
padding: 15px 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
justify-content: flex-start;
|
||||
page-break-inside: avoid;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
font-size: 24px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 2px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
@@ -192,7 +193,10 @@
|
||||
|
||||
.distribute {
|
||||
font-size: 18px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 6px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -204,8 +208,8 @@
|
||||
}
|
||||
|
||||
.message {
|
||||
height: 6in; /* Fixed height to prevent footer push-out */
|
||||
margin-top: 10px;
|
||||
flex: 1;
|
||||
margin-top: 4px;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
text-align: left;
|
||||
@@ -265,7 +269,7 @@
|
||||
border: none;
|
||||
border-top: 1px solid #000;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "AOS Project",
|
||||
"folder_name": "aosp",
|
||||
"title": "ANDROID UNLEASHED",
|
||||
"subtitle": "WITHOUT BOUNDARIES",
|
||||
"headline": "OPEN-SOURCE FREEDOM",
|
||||
"content": "The Android Open Source Project (AOSP) represents the essence of what Android was originally intended to be: an open, transparent, and adaptable platform. It strips away the layers of proprietary software and corporate oversight that have become synonymous with mainstream Android distributions. With AOSP, you gain access to a raw, unfiltered version of Android, allowing you to truly make your device your own.<br><br>For developers, AOSP offers a playground of possibilities, where the only limits are your skills and imagination. It serves as the foundation for countless custom ROMs, each tailored to specific needs, whether for enhanced performance, privacy, or unique features that mainstream versions lack. Privacy enthusiasts will appreciate the absence of pre-installed bloatware and tracking services that often come wit stock Android, providing a cleaner, more secure user experience.<br><br>AOSP isn't just for developers or tech enthusiasts; it's for anyone who values digital freedom. It allows you to reclaim control over your device, tailoring it to your needs without the restrictions of carriers or manufacturers. Discover how AOSP can transform your mobile experience. Start your journey towards a more open, customizable future today.",
|
||||
"url_message": "Visit the link below to learn more.",
|
||||
"url": "https://source.android.com",
|
||||
"tear_off_link": "http://aosp.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Bitcoin Revolution Flyers",
|
||||
"folder_name": "bitcoin",
|
||||
"title": "RULES WITHOUT RULERS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE BITCOIN REVOLUTION",
|
||||
"content": "What is Bitcoin? It's more than just digital money; it's a revolutionary technology designed to fix some of the world's most pressing problems. Bitcoin operates on a decentralized network, free from the control of any government or central authority. This ensures that no one can manipulate its supply or value, making it a sound form of money that protects your wealth from inflation.<br><br>Our current financial system is built on flawed incentives—encouraging debt, dependency, and centralization of power. Bitcoin changes that by creating a system where honesty, transparency, and individual responsibility are rewarded. In the Bitcoin network, there is no room for corruption or manipulation because the rules are enforced by mathematics, not by people.<br><br>Bitcoin aligns incentives in a way that promotes long-term thinking, savings, and innovation. It empowers individuals to take control of their financial future, fostering a global community where value can be transferred freely and securely without intermediaries. This is why we need Bitcoin—because it creates a world where incentives are properly aligned, leading to a more fair and prosperous society for all.<br><br>Take the step to learn more about Bitcoin and how it can transform not just your financial life, but the world. Tear off a link to the left and explore this groundbreaking technology. Join the movement towards a better future.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://bitcoin.org/en",
|
||||
"tear_off_link": "http://bitcoin.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "",
|
||||
"folder_name": "",
|
||||
"title": "",
|
||||
"subtitle": "",
|
||||
"headline": "",
|
||||
"content": "",
|
||||
"url_message": "",
|
||||
"url": "",
|
||||
"tear_off_link": "",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "name",
|
||||
"folder_name": "folder_name",
|
||||
"title": "title",
|
||||
"subtitle": "subtitle",
|
||||
"headline": "headline",
|
||||
"content": "content",
|
||||
"url_message": "url message",
|
||||
"url": "url",
|
||||
"tear_off_link": "http://example-folder_name.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Life Changing Message",
|
||||
"folder_name": "jesus",
|
||||
"title": "GOOD NEWS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "DISCOVER TRUE HOPE",
|
||||
"content": "Who is Jesus? He is more than just a historical figure; He is the Son of God, the Savior of the world. Jesus Himself said, 'I am the way, the truth, and the life. No one comes to the Father except through Me' (John 14:6). He came to bridge the gap between God and humanity, offering us a path to forgiveness, peace, and eternal life.<br><br>We all face brokenness in our lives—whether it's in our relationships, our hearts, or our world. Jesus came to heal that brokenness. He lived a perfect life, died on the cross for our sins, and rose again, defeating death and offering us the hope of eternal life with God.<br><br>Without Jesus, we are lost in our sin, separated from God. But through Him, we can be forgiven and restored. He offers us not just a better life now, but the promise of an eternal life with Him. This is why we need Him—because only in Jesus can we find true peace, purpose, and the assurance of eternal life.<br><br>Take the step to learn more about Jesus and the life-changing impact He can have on your life. Tear off a link to the left and explore His teachings. Find the hope you've been searching for.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "http://media.faithforthefamily.com/ra/godsoloved/english.mp3",
|
||||
"tear_off_link": "http://jesus.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Meshtastic Network Flyers",
|
||||
"folder_name": "meshtastic",
|
||||
"title": "SECURE COMMUNICATIONS",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "BUILD YOUR EMERGENCY NETWORK",
|
||||
"content": "Why Meshtastic? In times of crisis, traditional communication networks can fail, leaving us isolated and vulnerable. Meshtastic provides a powerful solution—an alternative local communication network that operates independently of centralized systems. It’s designed for emergency situations, allowing you to stay connected when it matters most.<br><br>Meshtastic devices create a mesh network that can relay messages over long distances, even without internet or cellular coverage. This decentralized approach ensures that your communications are resilient and reliable, no matter the circumstances. But it’s not just about staying connected—Meshtastic also offers encryption, so your messages remain secure and private.<br><br>In a world where privacy is increasingly compromised, Meshtastic empowers you to take control of your communication. Whether you’re coordinating a local community response, staying in touch with loved ones during a disaster, or simply preparing for the unexpected, Meshtastic provides the tools you need to communicate securely and effectively.<br><br>Take the step to learn more about Meshtastic and how you can build your own emergency communication network. Tear off a link to the left and explore this innovative technology. Ensure you’re prepared for whatever comes your way.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://meshtastic.org",
|
||||
"tear_off_link": "http://meshtastic.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Nostr Protocol Flyers",
|
||||
"folder_name": "voxvera",
|
||||
"title": "SOCIAL FREEDOM",
|
||||
"subtitle": "DO NOT IGNORE",
|
||||
"headline": "JOIN THE CENSORSHIP-RESISTANT NETWORK",
|
||||
"content": "What is Nostr? Unlike traditional social media platforms, Nostr is a protocol—a decentralized system that empowers users to connect and share without the constraints of a central authority. Nostr is censorship-resistant, meaning your voice can’t be silenced by corporations or governments. It’s designed to give you control over your online presence, free from the influence of algorithms or ads that prioritize engagement over meaningful connections.<br><br>On Nostr, there are no hidden agendas to keep you doomscrolling. You engage with content on your terms, not based on what an algorithm thinks will keep you online the longest. Nostr allows you to build genuine connections and participate in conversations that matter, all while maintaining your privacy and autonomy.<br><br>In a world where online speech is increasingly controlled and manipulated, Nostr offers a refreshing alternative. It’s not just a platform; it’s a movement towards true digital freedom, where your interactions are driven by your interests and values, not by what generates the most ad revenue.<br><br>Take the step to learn more about Nostr and how it can transform the way you connect online. Tear off a link the left and explore this groundbreaking protocol. Join a community that values freedom and authentic interaction.",
|
||||
"url_message": "Follow this link to learn more.",
|
||||
"url": "https://nostr.how/en/what-is-nostr",
|
||||
"tear_off_link": "http://nostr.6dshf2gnj7yzxlfcaczlyi57up4mvbtd5orinuj5bjsfycnhz2w456yd.onion/",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Vox Vera Printable Flyers",
|
||||
"folder_name": "voxvera",
|
||||
"title": "TOP SECRET",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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.",
|
||||
"url": "https://voxvera.org/",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
"binary_message": "0110010 0101011 0110010 0111101 0110100",
|
||||
"attachment_path": "",
|
||||
"attachment_filename": ""
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"title": "TOP SECRET",
|
||||
"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",
|
||||
"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.<br><br>Use 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.<br><br>Privacy can be maintained. Flyers can be shared via the Tor network, protecting hoster and users from censorship.<br><br>Join 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.",
|
||||
"url": "https://voxvera.org/",
|
||||
"tear_off_link": "https://voxvera.org/",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<title id="site-title">{{name}}</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Courier New', Courier, 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;
|
||||
@@ -19,6 +19,45 @@
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* RTL Layout Overrides */
|
||||
[dir="rtl"] .container {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
[dir="rtl"] .left-tear-offs {
|
||||
border-right: none;
|
||||
border-left: 1px dashed #000;
|
||||
}
|
||||
|
||||
[dir="rtl"] .tear-off {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
[dir="rtl"] .qr-code {
|
||||
margin-left: 0;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
[dir="rtl"] .qr-code-body {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
[dir="rtl"] .qr-code-url {
|
||||
text-align: right;
|
||||
margin-right: 0;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
[dir="rtl"] .message {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
[dir="rtl"] .text-container {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* ... existing styles ... */
|
||||
|
||||
a {
|
||||
color: #b80000;
|
||||
text-decoration: none;
|
||||
@@ -87,12 +126,14 @@
|
||||
|
||||
.tear-off {
|
||||
display: flex;
|
||||
height: 1in; /* Fixed height for consistency */
|
||||
padding: 5px;
|
||||
border: 1px dashed #000;
|
||||
font-size: 10px;
|
||||
box-sizing: border-box;
|
||||
page-break-inside: avoid;
|
||||
align-items: flex-start;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.tear-off-text {
|
||||
@@ -128,26 +169,38 @@
|
||||
|
||||
.content {
|
||||
width: calc(8.5in - 3.75in);
|
||||
padding: 20px;
|
||||
padding: 15px 20px;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
justify-content: flex-start;
|
||||
page-break-inside: avoid;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
font-size: 24px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 2px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.distribute {
|
||||
font-size: 18px;
|
||||
line-height: 1.2;
|
||||
letter-spacing: 6px;
|
||||
margin: 2px 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.redacted {
|
||||
@@ -156,14 +209,14 @@
|
||||
|
||||
.message {
|
||||
flex: 1;
|
||||
margin-top: 10px;
|
||||
margin-top: 4px;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
text-align: left;
|
||||
overflow-wrap: break-word;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
justify-content: flex-start;
|
||||
white-space: pre-wrap;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
@@ -216,7 +269,7 @@
|
||||
border: none;
|
||||
border-top: 1px solid #000;
|
||||
width: 100%;
|
||||
margin: 10px 0;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
@@ -281,6 +334,51 @@
|
||||
padding: 20px 0 30px;
|
||||
}
|
||||
|
||||
/* Dropdown styles */
|
||||
.dropdown {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.dropdown-content {
|
||||
display: none;
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
background-color: #f9f9f9;
|
||||
min-width: 200px;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
||||
z-index: 1;
|
||||
border: 1px solid #000;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.dropdown-content a {
|
||||
color: black;
|
||||
padding: 12px 16px;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
font-size: 14px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.dropdown-content a:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.dropdown-content a:hover {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.dropdown:hover .dropdown-content {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dropdown:hover .download-button {
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
</style>
|
||||
<script>
|
||||
// VoxVera Multi-Language Engine
|
||||
@@ -299,9 +397,25 @@
|
||||
function setLanguage(lang) {
|
||||
if (!locales[lang]) lang = 'en';
|
||||
localStorage.setItem('voxvera_lang', lang);
|
||||
|
||||
// Set text direction
|
||||
const direction = locales[lang].meta.direction || 'ltr';
|
||||
document.documentElement.dir = direction;
|
||||
document.documentElement.lang = lang;
|
||||
|
||||
document.querySelectorAll('[data-i18n]').forEach(el => {
|
||||
const path = el.getAttribute('data-i18n');
|
||||
el.innerText = t(path, lang);
|
||||
let translation = t(path, lang);
|
||||
if (translation) {
|
||||
// Support Markdown-style redaction ~~text~~ -> <span class="redacted">text</span>
|
||||
translation = translation.replace(/~~(.*?)~~/g, '<span class="redacted">$1</span>');
|
||||
|
||||
if (path.startsWith('landing.') || path.includes('subtitle') || path.includes('content')) {
|
||||
el.innerHTML = translation;
|
||||
} else {
|
||||
el.innerText = translation;
|
||||
}
|
||||
}
|
||||
});
|
||||
document.getElementById('lang-selector').value = lang;
|
||||
document.documentElement.lang = lang;
|
||||
@@ -449,6 +563,7 @@
|
||||
<div class="message">
|
||||
<div class="text-container" id="main-content" contenteditable="false" data-i18n="landing.content">{{t_landing_content}}</div>
|
||||
<div class="qr-code-body">
|
||||
|
||||
<div class="qr-code-url">
|
||||
<span class="url-message" data-i18n="landing.url_message">{{t_landing_url_message}}</span><br><br>
|
||||
<a id="qr-link-2" href="{{url}}" target="_blank">{{url}}</a>
|
||||
@@ -465,7 +580,9 @@
|
||||
</div>
|
||||
<div class="button-bar">
|
||||
<button class="print-button" onclick="window.print()" data-i18n="web.print_button">{{t_web_print_button}}</button>
|
||||
<a class="download-button" href="download/download.zip" download data-i18n="web.download_button">{{t_web_download_button}}</a>
|
||||
<a id="download-link" href="download/voxvera-source.zip" download>
|
||||
<button class="download-button" data-i18n="web.download_button">{{t_web_download_button}}</button>
|
||||
</a>
|
||||
<select class="lang-select" id="lang-selector" onchange="setLanguage(this.value)"></select>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
Reference in new issue
Block a user